From 6b54cd29a435cd859e42cb38dbce8fcf283b6029 Mon Sep 17 00:00:00 2001 From: Marek Rusinowski Date: Wed, 27 Sep 2023 23:16:20 +0200 Subject: [PATCH 01/58] Add RmlUi to build system Not all is ready and there will be more work needed on build system, but the basic integration of RmlUi Core is done. - I've not created and linked any of the provided GL3 or SDL backends, that needs separate work - Lua bindings are blocked on https://github.com/mikke89/RmlUi/issues/302 we need to find some workaround for that - Tracy integration is blocked on https://github.com/mikke89/RmlUi/issues/516 --- .gitmodules | 3 +++ CMakeLists.txt | 3 +++ rts/System/SpringApp.cpp | 17 +++++++++++++++++ rts/builds/headless/CMakeLists.txt | 1 + rts/builds/legacy/CMakeLists.txt | 2 ++ rts/lib/CMakeLists.txt | 17 +++++++++++++++++ rts/lib/RmlUi | 1 + 7 files changed, 44 insertions(+) create mode 160000 rts/lib/RmlUi diff --git a/.gitmodules b/.gitmodules index d3e69d8daa..32c4e8429a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -30,3 +30,6 @@ [submodule "rts/lib/cereal"] path = rts/lib/cereal url = https://github.com/USCiLab/cereal.git +[submodule "rts/lib/RmlUi"] + path = rts/lib/RmlUi + url = https://github.com/mikke89/RmlUi.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 23b0c65493..29bc436c02 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,6 +70,9 @@ else() set(JAVA_COMPILE_FLAG_CONDITIONAL "-g:lines,source") endif() +# By default, the libraries that don't explicily specify SHARED/STATIC are build statically. +# See https://cmake.org/cmake/help/latest/variable/BUILD_SHARED_LIBS.html +option(BUILD_SHARED_LIBS "Build shared (dynamic) libraries" OFF) # Tell windows to pass arguments around in @response files # (32k arg limit workaround) diff --git a/rts/System/SpringApp.cpp b/rts/System/SpringApp.cpp index 956fe6dfab..ecf1035bbf 100644 --- a/rts/System/SpringApp.cpp +++ b/rts/System/SpringApp.cpp @@ -6,6 +6,9 @@ #include #include +// Include before other headers that define a bunch of macros that break stuff. +#include + #include #include @@ -217,6 +220,17 @@ SpringApp::~SpringApp() spring_clock::PopTickRate(); } +class DummyRmlUiSpringSystemInterface : public Rml::SystemInterface { +public: + double GetElapsedTime() override { + return 0.0; + } + +private: + std::chrono::steady_clock::time_point start; +}; + +static DummyRmlUiSpringSystemInterface dummyRmlUiSpringSystemInterface; /** * @brief Initializes the SpringApp instance @@ -242,6 +256,9 @@ bool SpringApp::Init() Watchdog::Install(); Watchdog::RegisterThread(WDT_MAIN, true); + // A dummy call to basic RmlUi function to verify that all is linking correctly. + Rml::SetSystemInterface(&dummyRmlUiSpringSystemInterface); + // Create Window if (!InitWindow(("Spring " + SpringVersion::GetSync()).c_str())) { SDL_Quit(); diff --git a/rts/builds/headless/CMakeLists.txt b/rts/builds/headless/CMakeLists.txt index 4cfeb536ca..41cfe619de 100644 --- a/rts/builds/headless/CMakeLists.txt +++ b/rts/builds/headless/CMakeLists.txt @@ -27,6 +27,7 @@ list(APPEND engineHeadlessLibraries ${engineCommonLibraries}) list(APPEND engineHeadlessLibraries no-sound) list(APPEND engineHeadlessLibraries engineSim) list(APPEND engineHeadlessLibraries pr-downloader) +list(APPEND engineHeadlessLibraries RmlCore) include_directories(${ENGINE_SRC_ROOT_DIR}/lib/assimp/include) include_directories(${ENGINE_SRC_ROOT_DIR}/lib/asio/include) diff --git a/rts/builds/legacy/CMakeLists.txt b/rts/builds/legacy/CMakeLists.txt index ba43e7f522..edf8c68767 100644 --- a/rts/builds/legacy/CMakeLists.txt +++ b/rts/builds/legacy/CMakeLists.txt @@ -36,6 +36,7 @@ if (FONTCONFIG_FOUND) endif (PREFER_STATIC_LIBS) endif (FONTCONFIG_FOUND) +# !!! If you change freetype resolution here, change it also in rts/lib find_freetype_hack() # hack to find different named freetype.dll find_package_static(Freetype REQUIRED) foreach(f ${FREETYPE_INCLUDE_DIRS}) @@ -64,6 +65,7 @@ list(APPEND engineLibraries ${engineCommonLibraries}) list(APPEND engineLibraries ${SPRING_SIM_LIBRARIES}) list(APPEND engineLibraries engineSim) list(APPEND engineLibraries pr-downloader) +list(APPEND engineLibraries RmlCore) ### Assemble external incude dirs list(APPEND engineIncludes ${OPENAL_INCLUDE_DIR}) diff --git a/rts/lib/CMakeLists.txt b/rts/lib/CMakeLists.txt index e64914ace7..3eb7137c52 100644 --- a/rts/lib/CMakeLists.txt +++ b/rts/lib/CMakeLists.txt @@ -85,3 +85,20 @@ option(TRACY_ON_DEMAND "Enable tracy profiling" ON) option(TRACY_PROFILE_MEMORY "Profile memory allocations" OFF) add_subdirectory(tracy) + +# TODO(p2004): Enabling tracy for RmlUi is at the momemnt broken and waits for +# resolution upstream https://github.com/mikke89/RmlUi/issues/516. +# if (TRACY_ENABLE) +# set(ENABLE_TRACY_PROFILING ON CACHE BOOL "Enable RmlUi tracy profiling") +# # Place the include directories for tracy in TRACY_INCLUDE_DIR as that's +# # what RmlUi expects to be set in their FindTracy.cmake +# get_target_property(TRACY_INCLUDE_DIR TracyClient INCLUDE_DIRECTORIES) +# endif() + +# We resolve freetype here to make sure RmlUi find_package picks the same +# correct version as picked by the engine. +# !!! If you change freetype resolution here, change it also in rts/builds/legacy +find_freetype_hack() # hack to find different named freetype.dll +find_package_static(Freetype REQUIRED) + +add_subdirectory(RmlUi) diff --git a/rts/lib/RmlUi b/rts/lib/RmlUi new file mode 160000 index 0000000000..a602da2440 --- /dev/null +++ b/rts/lib/RmlUi @@ -0,0 +1 @@ +Subproject commit a602da244048f99fa1730194c8479b377227f7c6 From d7ad6183638d5c21f802c9e9655827eeb5aa8e4d Mon Sep 17 00:00:00 2001 From: loveridge Date: Sat, 30 Sep 2023 00:15:45 -0700 Subject: [PATCH 02/58] render first light --- CMakeLists.txt | 1 + rts/CMakeLists.txt | 2 + rts/Rml/Backends/RmlUi_Backend.h | 73 + rts/Rml/Backends/RmlUi_Backend_SDL_GL3.cpp | 327 ++ rts/Rml/Backends/RmlUi_Include_GL3.h | 3582 ++++++++++++++++++++ rts/Rml/Backends/RmlUi_Platform_SDL.cpp | 308 ++ rts/Rml/Backends/RmlUi_Platform_SDL.h | 83 + rts/Rml/Backends/RmlUi_Renderer_GL3.cpp | 793 +++++ rts/Rml/Backends/RmlUi_Renderer_GL3.h | 142 + rts/Rml/CMakeLists.txt | 6 + rts/Rml/assets/LICENSE.txt | 212 ++ rts/Rml/assets/LatoLatin-Bold.ttf | Bin 0 -> 146156 bytes rts/Rml/assets/LatoLatin-BoldItalic.ttf | Bin 0 -> 149756 bytes rts/Rml/assets/LatoLatin-Italic.ttf | Bin 0 -> 153688 bytes rts/Rml/assets/LatoLatin-Regular.ttf | Bin 0 -> 148540 bytes rts/Rml/assets/NotoEmoji-Regular.ttf | Bin 0 -> 418804 bytes rts/Rml/assets/alien_small.tga | Bin 0 -> 4140 bytes rts/Rml/assets/demo.rml | 28 + rts/Rml/assets/hello_world.png | Bin 0 -> 10463 bytes rts/Rml/assets/high_scores_alien_1.tga | Bin 0 -> 16402 bytes rts/Rml/assets/high_scores_alien_2.tga | Bin 0 -> 16402 bytes rts/Rml/assets/high_scores_alien_3.tga | Bin 0 -> 16402 bytes rts/Rml/assets/high_scores_defender.tga | Bin 0 -> 32786 bytes rts/Rml/assets/invader.rcss | 701 ++++ rts/Rml/assets/invader.tga | Bin 0 -> 1049115 bytes rts/Rml/assets/present.tga | Bin 0 -> 40539 bytes rts/Rml/assets/rml.rcss | 61 + rts/Rml/assets/test.rml | 27 + rts/Rml/assets/window.rml | 19 + rts/System/SpringApp.cpp | 28 +- rts/builds/legacy/CMakeLists.txt | 5 +- 31 files changed, 6393 insertions(+), 5 deletions(-) create mode 100644 rts/Rml/Backends/RmlUi_Backend.h create mode 100644 rts/Rml/Backends/RmlUi_Backend_SDL_GL3.cpp create mode 100644 rts/Rml/Backends/RmlUi_Include_GL3.h create mode 100644 rts/Rml/Backends/RmlUi_Platform_SDL.cpp create mode 100644 rts/Rml/Backends/RmlUi_Platform_SDL.h create mode 100644 rts/Rml/Backends/RmlUi_Renderer_GL3.cpp create mode 100644 rts/Rml/Backends/RmlUi_Renderer_GL3.h create mode 100644 rts/Rml/CMakeLists.txt create mode 100644 rts/Rml/assets/LICENSE.txt create mode 100644 rts/Rml/assets/LatoLatin-Bold.ttf create mode 100644 rts/Rml/assets/LatoLatin-BoldItalic.ttf create mode 100644 rts/Rml/assets/LatoLatin-Italic.ttf create mode 100644 rts/Rml/assets/LatoLatin-Regular.ttf create mode 100644 rts/Rml/assets/NotoEmoji-Regular.ttf create mode 100644 rts/Rml/assets/alien_small.tga create mode 100644 rts/Rml/assets/demo.rml create mode 100644 rts/Rml/assets/hello_world.png create mode 100644 rts/Rml/assets/high_scores_alien_1.tga create mode 100644 rts/Rml/assets/high_scores_alien_2.tga create mode 100644 rts/Rml/assets/high_scores_alien_3.tga create mode 100644 rts/Rml/assets/high_scores_defender.tga create mode 100644 rts/Rml/assets/invader.rcss create mode 100644 rts/Rml/assets/invader.tga create mode 100644 rts/Rml/assets/present.tga create mode 100644 rts/Rml/assets/rml.rcss create mode 100644 rts/Rml/assets/test.rml create mode 100644 rts/Rml/assets/window.rml diff --git a/CMakeLists.txt b/CMakeLists.txt index 29bc436c02..348494475e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -278,6 +278,7 @@ endif (USE_ASAN) # Note the missing REQUIRED, as headless & dedi may not depend on those. # So req. checks are done in the build target's CMakeLists.txt. find_package(SDL2) +find_package(SDL2_image) find_package_static(DevIL) if (PREFER_STATIC_LIBS) diff --git a/rts/CMakeLists.txt b/rts/CMakeLists.txt index cfaaf87740..4fe14bf9b3 100644 --- a/rts/CMakeLists.txt +++ b/rts/CMakeLists.txt @@ -133,6 +133,7 @@ add_subdirectory(Lua) add_subdirectory(ExternalAI) add_subdirectory(Rendering) add_subdirectory(aGui) +add_subdirectory(Rml) add_subdirectory(Menu) add_subdirectory(Map) add_subdirectory(Net) @@ -146,6 +147,7 @@ make_global_var(engineSources ${sources_engine_Map} ${sources_engine_Rendering} ${sources_engine_aGui} + ${sources_engine_Rml} ${sources_engine_Menu} ${sources_engine_System} ${sources_engine_ExternalAI} diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h new file mode 100644 index 0000000000..f21309a561 --- /dev/null +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -0,0 +1,73 @@ +/* + * This source file is part of RmlUi, the HTML/CSS Interface Middleware + * + * For the latest information, see http://github.com/mikke89/RmlUi + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * Copyright (c) 2019-2023 The RmlUi Team, and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef RMLUI_BACKENDS_BACKEND_H +#define RMLUI_BACKENDS_BACKEND_H + +#include +#include +#include +#include +#include + +using KeyDownCallback = bool (*)(Rml::Context* context, Rml::Input::KeyIdentifier key, int key_modifier, float native_dp_ratio, bool priority); + +/** + This interface serves as a basic abstraction over the various backends included with RmlUi. It is mainly intended as an example to get something + simple up and running, and provides just enough functionality for the included samples. + + This interface may be used directly for simple applications and testing. However, for anything more advanced we recommend to use the backend as a + starting point and copy relevant parts into the main loop of your application. On the other hand, the underlying platform and renderer used by the + backend are intended to be re-usable as is. + */ +namespace Backend { + +// Initializes the backend, including the custom system and render interfaces, and opens a window for rendering the RmlUi context. +bool Initialize(SDL_Window* target_window, SDL_GLContext target_glcontext); +// Closes the window and release all resources owned by the backend, including the system and render interfaces. +void Shutdown(); + +// Returns a pointer to the custom system interface which should be provided to RmlUi. +Rml::SystemInterface* GetSystemInterface(); +// Returns a pointer to the custom render interface which should be provided to RmlUi. +Rml::RenderInterface* GetRenderInterface(); + +// Polls and processes events from the current platform, and applies any relevant events to the provided RmlUi context and the key down callback. +// @return False to indicate that the application should be closed. +bool ProcessEvents(Rml::Context* context, KeyDownCallback key_down_callback = nullptr, bool power_save = false); +// Request application closure during the next event processing call. +void RequestExit(); + +// Prepares the render state to accept rendering commands from RmlUi, call before rendering the RmlUi context. +void BeginFrame(); +// Presents the rendered frame to the screen, call after rendering the RmlUi context. +void PresentFrame(); + +} // namespace Backend + +#endif diff --git a/rts/Rml/Backends/RmlUi_Backend_SDL_GL3.cpp b/rts/Rml/Backends/RmlUi_Backend_SDL_GL3.cpp new file mode 100644 index 0000000000..eb386e09a1 --- /dev/null +++ b/rts/Rml/Backends/RmlUi_Backend_SDL_GL3.cpp @@ -0,0 +1,327 @@ +/* + * This source file is part of RmlUi, the HTML/CSS Interface Middleware + * + * For the latest information, see http://github.com/mikke89/RmlUi + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * Copyright (c) 2019-2023 The RmlUi Team, and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "RmlUi_Backend.h" +#include "RmlUi_Platform_SDL.h" +#include "RmlUi_Renderer_GL3.h" +#include +#include +#include +#include +#include +#include + +#if defined RMLUI_PLATFORM_EMSCRIPTEN + #include +#else + #if !(SDL_VIDEO_RENDER_OGL) + #error "Only the OpenGL SDL backend is supported." + #endif +#endif + +/** + Custom render interface example for the SDL/GL3 backend. + + Overloads the OpenGL3 render interface to load textures through SDL_image's built-in texture loading functionality. + */ +class RenderInterface_GL3_SDL : public RenderInterface_GL3 { +public: + RenderInterface_GL3_SDL() {} + + bool LoadTexture(Rml::TextureHandle& texture_handle, Rml::Vector2i& texture_dimensions, const Rml::String& source) override + { + Rml::FileInterface* file_interface = Rml::GetFileInterface(); + Rml::FileHandle file_handle = file_interface->Open(source); + if (!file_handle) + return false; + + file_interface->Seek(file_handle, 0, SEEK_END); + const size_t buffer_size = file_interface->Tell(file_handle); + file_interface->Seek(file_handle, 0, SEEK_SET); + + using Rml::byte; + Rml::UniquePtr buffer(new byte[buffer_size]); + file_interface->Read(buffer.get(), buffer_size, file_handle); + file_interface->Close(file_handle); + + const size_t i = source.rfind('.'); + Rml::String extension = (i == Rml::String::npos ? Rml::String() : source.substr(i + 1)); + + SDL_Surface* surface = IMG_LoadTyped_RW(SDL_RWFromMem(buffer.get(), int(buffer_size)), 1, extension.c_str()); + + bool success = false; + if (surface) + { + texture_dimensions.x = surface->w; + texture_dimensions.y = surface->h; + + if (surface->format->format != SDL_PIXELFORMAT_RGBA32) + { + SDL_SetSurfaceAlphaMod(surface, SDL_ALPHA_OPAQUE); + SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE); + + SDL_Surface* new_surface = SDL_CreateRGBSurfaceWithFormat(0, surface->w, surface->h, 32, SDL_PIXELFORMAT_RGBA32); + if (!new_surface) + return false; + + if (SDL_BlitSurface(surface, 0, new_surface, 0) != 0) + return false; + + SDL_FreeSurface(surface); + surface = new_surface; + } + + success = RenderInterface_GL3::GenerateTexture(texture_handle, (const Rml::byte*)surface->pixels, texture_dimensions); + SDL_FreeSurface(surface); + } + + return success; + } +}; + +/** + Global data used by this backend. + + Lifetime governed by the calls to Backend::Initialize() and Backend::Shutdown(). + */ +struct BackendData { + SystemInterface_SDL system_interface; + RenderInterface_GL3_SDL render_interface; + + SDL_Window* window = nullptr; + SDL_GLContext glcontext = nullptr; + + bool running = true; +}; +static Rml::UniquePtr data; + +bool Backend::Initialize(SDL_Window* target_window, SDL_GLContext target_glcontext) { + RMLUI_ASSERT(!data); + +// if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS | SDL_INIT_TIMER) != 0) +// return false; + + // Submit click events when focusing the window. + // SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1"); + +#if defined RMLUI_PLATFORM_EMSCRIPTEN + // GLES 3.0 (WebGL 2.0) + SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); +#else + // GL 3.3 Core + // SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); + // SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); + // SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + // SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); +#endif + + // Request stencil buffer of at least 8-bit size to supporting clipping on transformed elements. + // SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); + // SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + +// // Enable linear filtering and MSAA for better-looking visuals, especially when transforms are applied. + // SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); + // SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); + // SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2); + +// const Uint32 window_flags = (SDL_WINDOW_OPENGL | (allow_resize ? SDL_WINDOW_RESIZABLE : 0)); + + // SDL_Window* window = SDL_CreateWindow(window_name, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, window_flags); +// if (!window) +// { +// // Try again on low-quality settings. +// SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "nearest"); +// SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); +// SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); +// window = SDL_CreateWindow(window_name, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, window_flags); +// if (!window) +// { +// fprintf(stderr, "SDL error on create window: %s\n", SDL_GetError()); +// return false; +// } +// } + + // SDL_GLContext glcontext = SDL_GL_CreateContext(target_window); + // SDL_GL_MakeCurrent(target_window, glcontext); +// SDL_GL_SetSwapInterval(1); + +// if (!RmlGL3::Initialize()) +// { +// fprintf(stderr, "Could not initialize OpenGL"); +// return false; +// } + + data = Rml::MakeUnique(); + + if (!data->render_interface) + { + data.reset(); + fprintf(stderr, "Could not initialize OpenGL3 render interface."); + return false; + } + + data->window = target_window; + data->glcontext = target_glcontext; + + data->system_interface.SetWindow(target_window); + data->render_interface.SetViewport(1500,1500); + + return true; +} + +void Backend::Shutdown() +{ + RMLUI_ASSERT(data); + + // SDL_GL_DeleteContext(data->glcontext); + // SDL_DestroyWindow(data->window); + + // data.reset(); + + // SDL_Quit(); +} + +Rml::SystemInterface* Backend::GetSystemInterface() +{ + RMLUI_ASSERT(data); + return &data->system_interface; +} + +Rml::RenderInterface* Backend::GetRenderInterface() +{ + RMLUI_ASSERT(data); + return &data->render_interface; +} + +bool Backend::ProcessEvents(Rml::Context* context, KeyDownCallback key_down_callback, bool power_save) +{ + RMLUI_ASSERT(data && context); + +#if defined RMLUI_PLATFORM_EMSCRIPTEN + + // Ideally we would hand over control of the main loop to emscripten: + // + // // Hand over control of the main loop to the WebAssembly runtime. + // emscripten_set_main_loop_arg(EventLoopIteration, (void*)user_data_handle, 0, true); + // + // The above is the recommended approach. However, as we don't control the main loop here we have to make due with another approach. Instead, use + // Asyncify to yield by sleeping. + // Important: Must be linked with option -sASYNCIFY + emscripten_sleep(1); + +#endif + + bool result = data->running; + data->running = true; + + SDL_Event ev; + int has_event = 0; + if (power_save) + has_event = SDL_WaitEventTimeout(&ev, static_cast(Rml::Math::Min(context->GetNextUpdateDelay(), (double)10.0) * 1000)); + else + has_event = SDL_PollEvent(&ev); + while (has_event) + { + switch (ev.type) + { + case SDL_QUIT: + { + result = false; + } + break; + case SDL_KEYDOWN: + { + const Rml::Input::KeyIdentifier key = RmlSDL::ConvertKey(ev.key.keysym.sym); + const int key_modifier = RmlSDL::GetKeyModifierState(); + const float native_dp_ratio = 1.f; + + // See if we have any global shortcuts that take priority over the context. + if (key_down_callback && !key_down_callback(context, key, key_modifier, native_dp_ratio, true)) + break; + // Otherwise, hand the event over to the context by calling the input handler as normal. + if (!RmlSDL::InputEventHandler(context, ev)) + break; + // The key was not consumed by the context either, try keyboard shortcuts of lower priority. + if (key_down_callback && !key_down_callback(context, key, key_modifier, native_dp_ratio, false)) + break; + } + break; + case SDL_WINDOWEVENT: + { + switch (ev.window.event) + { + case SDL_WINDOWEVENT_SIZE_CHANGED: + { + Rml::Vector2i dimensions(ev.window.data1, ev.window.data2); + data->render_interface.SetViewport(dimensions.x, dimensions.y); + } + break; + } + RmlSDL::InputEventHandler(context, ev); + } + break; + default: + { + RmlSDL::InputEventHandler(context, ev); + } + break; + } + has_event = SDL_PollEvent(&ev); + } + + return result; +} + +void Backend::RequestExit() +{ + RMLUI_ASSERT(data); + + data->running = false; +} + +void Backend::BeginFrame() +{ + RMLUI_ASSERT(data); + + // data->render_interface.Clear(); + data->render_interface.BeginFrame(); +} + +void Backend::PresentFrame() +{ + RMLUI_ASSERT(data); + + data->render_interface.EndFrame(); + // SDL_GL_SwapWindow(data->window); + + // Optional, used to mark frames during performance profiling. + RMLUI_FrameMark; +} diff --git a/rts/Rml/Backends/RmlUi_Include_GL3.h b/rts/Rml/Backends/RmlUi_Include_GL3.h new file mode 100644 index 0000000000..0b270f5d8a --- /dev/null +++ b/rts/Rml/Backends/RmlUi_Include_GL3.h @@ -0,0 +1,3582 @@ +/** + * Loader generated by glad 2.0.0-beta on Fri Mar 11 10:53:06 2022 + * + * Generator: C/C++ + * Specification: gl + * Extensions: 0 + * + * APIs: + * - gl:core=3.3 + * + * Options: + * - ALIAS = False + * - DEBUG = False + * - HEADER_ONLY = True + * - LOADER = True + * - MX = False + * - MX_GLOBAL = False + * - ON_DEMAND = False + * + * Commandline: + * --api='gl:core=3.3' --extensions='' c --header-only --loader + * + * Online: + * http://glad.sh/#api=gl%3Acore%3D3.3&extensions=&generator=c&options=HEADER_ONLY%2CLOADER + * + */ + +#ifndef GLAD_GL_H_ +#define GLAD_GL_H_ + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-id-macro" +#endif +#ifdef __gl_h_ + #error OpenGL (gl.h) header already included (API: gl), remove previous include! +#endif +#define __gl_h_ 1 +#ifdef __gl3_h_ + #error OpenGL (gl3.h) header already included (API: gl), remove previous include! +#endif +#define __gl3_h_ 1 +#ifdef __glext_h_ + #error OpenGL (glext.h) header already included (API: gl), remove previous include! +#endif +#define __glext_h_ 1 +#ifdef __gl3ext_h_ + #error OpenGL (gl3ext.h) header already included (API: gl), remove previous include! +#endif +#define __gl3ext_h_ 1 +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +#define GLAD_GL +#define GLAD_OPTION_GL_HEADER_ONLY +#define GLAD_OPTION_GL_LOADER + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef GLAD_PLATFORM_H_ +#define GLAD_PLATFORM_H_ + +#ifndef GLAD_PLATFORM_WIN32 + #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) + #define GLAD_PLATFORM_WIN32 1 + #else + #define GLAD_PLATFORM_WIN32 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_APPLE + #ifdef __APPLE__ + #define GLAD_PLATFORM_APPLE 1 + #else + #define GLAD_PLATFORM_APPLE 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_EMSCRIPTEN + #ifdef __EMSCRIPTEN__ + #define GLAD_PLATFORM_EMSCRIPTEN 1 + #else + #define GLAD_PLATFORM_EMSCRIPTEN 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_UWP + #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) + #ifdef __has_include + #if __has_include() + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #endif + + #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY + #include + #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) + #define GLAD_PLATFORM_UWP 1 + #endif + #endif + + #ifndef GLAD_PLATFORM_UWP + #define GLAD_PLATFORM_UWP 0 + #endif +#endif + +#ifdef __GNUC__ + #define GLAD_GNUC_EXTENSION __extension__ +#else + #define GLAD_GNUC_EXTENSION +#endif + +#ifndef GLAD_API_CALL + #if defined(GLAD_API_CALL_EXPORT) + #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) + #if defined(GLAD_API_CALL_EXPORT_BUILD) + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllexport)) extern + #else + #define GLAD_API_CALL __declspec(dllexport) extern + #endif + #else + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllimport)) extern + #else + #define GLAD_API_CALL __declspec(dllimport) extern + #endif + #endif + #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) + #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern + #else + #define GLAD_API_CALL extern + #endif + #else + #define GLAD_API_CALL extern + #endif +#endif + +#ifdef APIENTRY + #define GLAD_API_PTR APIENTRY +#elif GLAD_PLATFORM_WIN32 + #define GLAD_API_PTR __stdcall +#else + #define GLAD_API_PTR +#endif + +#ifndef GLAPI +#define GLAPI GLAD_API_CALL +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY GLAD_API_PTR +#endif + +#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor) +#define GLAD_VERSION_MAJOR(version) (version / 10000) +#define GLAD_VERSION_MINOR(version) (version % 10000) + +#define GLAD_GENERATOR_VERSION "2.0.0-beta" + +typedef void (*GLADapiproc)(void); + +typedef GLADapiproc (*GLADloadfunc)(const char *name); +typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name); + +typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); +typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); + +#endif /* GLAD_PLATFORM_H_ */ + +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_ALPHA 0x1906 +#define GL_ALREADY_SIGNALED 0x911A +#define GL_ALWAYS 0x0207 +#define GL_AND 0x1501 +#define GL_AND_INVERTED 0x1504 +#define GL_AND_REVERSE 0x1502 +#define GL_ANY_SAMPLES_PASSED 0x8C2F +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_BACK 0x0405 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_RIGHT 0x0403 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_BGRA_INTEGER 0x8D9B +#define GL_BGR_INTEGER 0x8D9A +#define GL_BLEND 0x0BE2 +#define GL_BLEND_COLOR 0x8005 +#define GL_BLEND_DST 0x0BE0 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_EQUATION 0x8009 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLUE 0x1905 +#define GL_BLUE_INTEGER 0x8D96 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_BYTE 0x1400 +#define GL_CCW 0x0901 +#define GL_CLAMP_READ_COLOR 0x891C +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_CLEAR 0x1500 +#define GL_CLIP_DISTANCE0 0x3000 +#define GL_CLIP_DISTANCE1 0x3001 +#define GL_CLIP_DISTANCE2 0x3002 +#define GL_CLIP_DISTANCE3 0x3003 +#define GL_CLIP_DISTANCE4 0x3004 +#define GL_CLIP_DISTANCE5 0x3005 +#define GL_CLIP_DISTANCE6 0x3006 +#define GL_CLIP_DISTANCE7 0x3007 +#define GL_COLOR 0x1800 +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT10 0x8CEA +#define GL_COLOR_ATTACHMENT11 0x8CEB +#define GL_COLOR_ATTACHMENT12 0x8CEC +#define GL_COLOR_ATTACHMENT13 0x8CED +#define GL_COLOR_ATTACHMENT14 0x8CEE +#define GL_COLOR_ATTACHMENT15 0x8CEF +#define GL_COLOR_ATTACHMENT16 0x8CF0 +#define GL_COLOR_ATTACHMENT17 0x8CF1 +#define GL_COLOR_ATTACHMENT18 0x8CF2 +#define GL_COLOR_ATTACHMENT19 0x8CF3 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT20 0x8CF4 +#define GL_COLOR_ATTACHMENT21 0x8CF5 +#define GL_COLOR_ATTACHMENT22 0x8CF6 +#define GL_COLOR_ATTACHMENT23 0x8CF7 +#define GL_COLOR_ATTACHMENT24 0x8CF8 +#define GL_COLOR_ATTACHMENT25 0x8CF9 +#define GL_COLOR_ATTACHMENT26 0x8CFA +#define GL_COLOR_ATTACHMENT27 0x8CFB +#define GL_COLOR_ATTACHMENT28 0x8CFC +#define GL_COLOR_ATTACHMENT29 0x8CFD +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT30 0x8CFE +#define GL_COLOR_ATTACHMENT31 0x8CFF +#define GL_COLOR_ATTACHMENT4 0x8CE4 +#define GL_COLOR_ATTACHMENT5 0x8CE5 +#define GL_COLOR_ATTACHMENT6 0x8CE6 +#define GL_COLOR_ATTACHMENT7 0x8CE7 +#define GL_COLOR_ATTACHMENT8 0x8CE8 +#define GL_COLOR_ATTACHMENT9 0x8CE9 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_COMPARE_REF_TO_TEXTURE 0x884E +#define GL_COMPILE_STATUS 0x8B81 +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RED_RGTC1 0x8DBB +#define GL_COMPRESSED_RG 0x8226 +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_CONDITION_SATISFIED 0x911C +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_CONSTANT_COLOR 0x8001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_FLAGS 0x821E +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 +#define GL_CONTEXT_PROFILE_MASK 0x9126 +#define GL_COPY 0x1503 +#define GL_COPY_INVERTED 0x150C +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_CURRENT_QUERY 0x8865 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_CW 0x0900 +#define GL_DECR 0x1E03 +#define GL_DECR_WRAP 0x8508 +#define GL_DELETE_STATUS 0x8B80 +#define GL_DEPTH 0x1801 +#define GL_DEPTH24_STENCIL8 0x88F0 +#define GL_DEPTH32F_STENCIL8 0x8CAD +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_DEPTH_CLAMP 0x864F +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH_FUNC 0x0B74 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_STENCIL 0x84F9 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DITHER 0x0BD0 +#define GL_DONT_CARE 0x1100 +#define GL_DOUBLE 0x140A +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_DST_ALPHA 0x0304 +#define GL_DST_COLOR 0x0306 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_EQUAL 0x0202 +#define GL_EQUIV 0x1509 +#define GL_EXTENSIONS 0x1F03 +#define GL_FALSE 0 +#define GL_FASTEST 0x1101 +#define GL_FILL 0x1B02 +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_FIXED_ONLY 0x891D +#define GL_FLOAT 0x1406 +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4 0x8B5C +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_FRAMEBUFFER 0x8D40 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_SRGB 0x8DB9 +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_FRONT 0x0404 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_FRONT_FACE 0x0B46 +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_FUNC_SUBTRACT 0x800A +#define GL_GEOMETRY_INPUT_TYPE 0x8917 +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT 0x8916 +#define GL_GEQUAL 0x0206 +#define GL_GREATER 0x0204 +#define GL_GREEN 0x1904 +#define GL_GREEN_INTEGER 0x8D95 +#define GL_HALF_FLOAT 0x140B +#define GL_INCR 0x1E02 +#define GL_INCR_WRAP 0x8507 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_INT 0x1404 +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_INT_2_10_10_10_REV 0x8D9F +#define GL_INT_SAMPLER_1D 0x8DC9 +#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_INVALID_INDEX 0xFFFFFFFF +#define GL_INVALID_OPERATION 0x0502 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVERT 0x150A +#define GL_KEEP 0x1E00 +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_LEFT 0x0406 +#define GL_LEQUAL 0x0203 +#define GL_LESS 0x0201 +#define GL_LINE 0x1B01 +#define GL_LINEAR 0x2601 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_LINES 0x0001 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_LINE_STRIP 0x0003 +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_LINE_WIDTH_RANGE 0x0B22 +#define GL_LINK_STATUS 0x8B82 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_MAJOR_VERSION 0x821B +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAX 0x8008 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MAX_CLIP_DISTANCES 0x0D32 +#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_INTEGER_SAMPLES 0x9110 +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_MAX_SAMPLES 0x8D57 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_VARYING_COMPONENTS 0x8B4B +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MIN 0x8007 +#define GL_MINOR_VERSION 0x821C +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_MULTISAMPLE 0x809D +#define GL_NAND 0x150E +#define GL_NEAREST 0x2600 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_NEVER 0x0200 +#define GL_NICEST 0x1102 +#define GL_NONE 0 +#define GL_NOOP 0x1505 +#define GL_NOR 0x1508 +#define GL_NOTEQUAL 0x0205 +#define GL_NO_ERROR 0 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_NUM_EXTENSIONS 0x821D +#define GL_OBJECT_TYPE 0x9112 +#define GL_ONE 1 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB +#define GL_ONE_MINUS_SRC1_COLOR 0x88FA +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_OR 0x1507 +#define GL_OR_INVERTED 0x150D +#define GL_OR_REVERSE 0x150B +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_POINT 0x1B00 +#define GL_POINTS 0x0000 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_POINT_SIZE_RANGE 0x0B12 +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_PRIMITIVES_GENERATED 0x8C87 +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +#define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_PROVOKING_VERTEX 0x8E4F +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C +#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 +#define GL_QUERY_BY_REGION_WAIT 0x8E15 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_QUERY_NO_WAIT 0x8E14 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_QUERY_WAIT 0x8E13 +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_R16 0x822A +#define GL_R16F 0x822D +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R16_SNORM 0x8F98 +#define GL_R32F 0x822E +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_R3_G3_B2 0x2A10 +#define GL_R8 0x8229 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R8_SNORM 0x8F94 +#define GL_RASTERIZER_DISCARD 0x8C89 +#define GL_READ_BUFFER 0x0C02 +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA +#define GL_READ_ONLY 0x88B8 +#define GL_READ_WRITE 0x88BA +#define GL_RED 0x1903 +#define GL_RED_INTEGER 0x8D94 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_SAMPLES 0x8CAB +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERER 0x1F01 +#define GL_REPEAT 0x2901 +#define GL_REPLACE 0x1E01 +#define GL_RG 0x8227 +#define GL_RG16 0x822C +#define GL_RG16F 0x822F +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG16_SNORM 0x8F99 +#define GL_RG32F 0x8230 +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C +#define GL_RG8 0x822B +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB 0x1907 +#define GL_RGB10 0x8052 +#define GL_RGB10_A2 0x8059 +#define GL_RGB10_A2UI 0x906F +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGB16F 0x881B +#define GL_RGB16I 0x8D89 +#define GL_RGB16UI 0x8D77 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGB32F 0x8815 +#define GL_RGB32I 0x8D83 +#define GL_RGB32UI 0x8D71 +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB5_A1 0x8057 +#define GL_RGB8 0x8051 +#define GL_RGB8I 0x8D8F +#define GL_RGB8UI 0x8D7D +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGB9_E5 0x8C3D +#define GL_RGBA 0x1908 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_RGBA16F 0x881A +#define GL_RGBA16I 0x8D88 +#define GL_RGBA16UI 0x8D76 +#define GL_RGBA16_SNORM 0x8F9B +#define GL_RGBA2 0x8055 +#define GL_RGBA32F 0x8814 +#define GL_RGBA32I 0x8D82 +#define GL_RGBA32UI 0x8D70 +#define GL_RGBA4 0x8056 +#define GL_RGBA8 0x8058 +#define GL_RGBA8I 0x8D8E +#define GL_RGBA8UI 0x8D7C +#define GL_RGBA8_SNORM 0x8F97 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RG_INTEGER 0x8228 +#define GL_RIGHT 0x0407 +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_1D_ARRAY 0x8DC0 +#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_SAMPLER_2D_RECT 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_BINDING 0x8919 +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLES_PASSED 0x8914 +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_SET 0x150F +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_SHADER_TYPE 0x8B4F +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_SHORT 0x1402 +#define GL_SIGNALED 0x9119 +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SRC1_ALPHA 0x8589 +#define GL_SRC1_COLOR 0x88F9 +#define GL_SRC_ALPHA 0x0302 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_SRC_COLOR 0x0300 +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_STATIC_COPY 0x88E6 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STENCIL 0x1802 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_INDEX 0x1901 +#define GL_STENCIL_INDEX1 0x8D46 +#define GL_STENCIL_INDEX16 0x8D49 +#define GL_STENCIL_INDEX4 0x8D47 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_STEREO 0x0C33 +#define GL_STREAM_COPY 0x88E2 +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_SYNC_STATUS 0x9114 +#define GL_TEXTURE 0x1702 +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_TEXTURE_3D 0x806F +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_RECTANGLE 0x84F5 +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_SHARED_SIZE 0x8C3F +#define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF +#define GL_TIMESTAMP 0x8E28 +#define GL_TIME_ELAPSED 0x88BF +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLE_FAN 0x0006 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_TRUE 1 +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_UNSIGNALED 0x9118 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_INT 0x1405 +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_UNSIGNED_INT_24_8 0x84FA +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_VENDOR 0x1F00 +#define GL_VERSION 0x1F02 +#define GL_VERTEX_ARRAY_BINDING 0x85B5 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_VIEWPORT 0x0BA2 +#define GL_WAIT_FAILED 0x911D +#define GL_WRITE_ONLY 0x88B9 +#define GL_XOR 0x1506 +#define GL_ZERO 0 + + +#ifndef __khrplatform_h_ +#define __khrplatform_h_ + +/* +** Copyright (c) 2008-2018 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +/* Khronos platform-specific types and definitions. + * + * The master copy of khrplatform.h is maintained in the Khronos EGL + * Registry repository at https://github.com/KhronosGroup/EGL-Registry + * The last semantic modification to khrplatform.h was at commit ID: + * 67a3e0864c2d75ea5287b9f3d2eb74a745936692 + * + * Adopters may modify this file to suit their platform. Adopters are + * encouraged to submit platform specific modifications to the Khronos + * group so that they can be included in future versions of this file. + * Please submit changes by filing pull requests or issues on + * the EGL Registry repository linked above. + * + * + * See the Implementer's Guidelines for information about where this file + * should be located on your system and for more details of its use: + * http://www.khronos.org/registry/implementers_guide.pdf + * + * This file should be included as + * #include + * by Khronos client API header files that use its types and defines. + * + * The types in khrplatform.h should only be used to define API-specific types. + * + * Types defined in khrplatform.h: + * khronos_int8_t signed 8 bit + * khronos_uint8_t unsigned 8 bit + * khronos_int16_t signed 16 bit + * khronos_uint16_t unsigned 16 bit + * khronos_int32_t signed 32 bit + * khronos_uint32_t unsigned 32 bit + * khronos_int64_t signed 64 bit + * khronos_uint64_t unsigned 64 bit + * khronos_intptr_t signed same number of bits as a pointer + * khronos_uintptr_t unsigned same number of bits as a pointer + * khronos_ssize_t signed size + * khronos_usize_t unsigned size + * khronos_float_t signed 32 bit floating point + * khronos_time_ns_t unsigned 64 bit time in nanoseconds + * khronos_utime_nanoseconds_t unsigned time interval or absolute time in + * nanoseconds + * khronos_stime_nanoseconds_t signed time interval in nanoseconds + * khronos_boolean_enum_t enumerated boolean type. This should + * only be used as a base type when a client API's boolean type is + * an enum. Client APIs which use an integer or other type for + * booleans cannot use this as the base type for their boolean. + * + * Tokens defined in khrplatform.h: + * + * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. + * + * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. + * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. + * + * Calling convention macros defined in this file: + * KHRONOS_APICALL + * KHRONOS_GLAD_API_PTR + * KHRONOS_APIATTRIBUTES + * + * These may be used in function prototypes as: + * + * KHRONOS_APICALL void KHRONOS_GLAD_API_PTR funcname( + * int arg1, + * int arg2) KHRONOS_APIATTRIBUTES; + */ + +#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC) +# define KHRONOS_STATIC 1 +#endif + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APICALL + *------------------------------------------------------------------------- + * This precedes the return type of the function in the function prototype. + */ +#if defined(KHRONOS_STATIC) + /* If the preprocessor constant KHRONOS_STATIC is defined, make the + * header compatible with static linking. */ +# define KHRONOS_APICALL +#elif defined(_WIN32) +# define KHRONOS_APICALL __declspec(dllimport) +#elif defined (__SYMBIAN32__) +# define KHRONOS_APICALL IMPORT_C +#elif defined(__ANDROID__) +# define KHRONOS_APICALL __attribute__((visibility("default"))) +#else +# define KHRONOS_APICALL +#endif + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_GLAD_API_PTR + *------------------------------------------------------------------------- + * This follows the return type of the function and precedes the function + * name in the function prototype. + */ +#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) + /* Win32 but not WinCE */ +# define KHRONOS_GLAD_API_PTR __stdcall +#else +# define KHRONOS_GLAD_API_PTR +#endif + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APIATTRIBUTES + *------------------------------------------------------------------------- + * This follows the closing parenthesis of the function prototype arguments. + */ +#if defined (__ARMCC_2__) +#define KHRONOS_APIATTRIBUTES __softfp +#else +#define KHRONOS_APIATTRIBUTES +#endif + +/*------------------------------------------------------------------------- + * basic type definitions + *-----------------------------------------------------------------------*/ +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) + + +/* + * Using + */ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 +/* + * To support platform where unsigned long cannot be used interchangeably with + * inptr_t (e.g. CHERI-extended ISAs), we can use the stdint.h intptr_t. + * Ideally, we could just use (u)intptr_t everywhere, but this could result in + * ABI breakage if khronos_uintptr_t is changed from unsigned long to + * unsigned long long or similar (this results in different C++ name mangling). + * To avoid changes for existing platforms, we restrict usage of intptr_t to + * platforms where the size of a pointer is larger than the size of long. + */ +#if defined(__SIZEOF_LONG__) && defined(__SIZEOF_POINTER__) +#if __SIZEOF_POINTER__ > __SIZEOF_LONG__ +#define KHRONOS_USE_INTPTR_T +#endif +#endif + +#elif defined(__VMS ) || defined(__sgi) + +/* + * Using + */ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(_WIN32) && !defined(__SCITECH_SNAP__) + +/* + * Win32 + */ +typedef __int32 khronos_int32_t; +typedef unsigned __int32 khronos_uint32_t; +typedef __int64 khronos_int64_t; +typedef unsigned __int64 khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(__sun__) || defined(__digital__) + +/* + * Sun or Digital + */ +typedef int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +#if defined(__arch64__) || defined(_LP64) +typedef long int khronos_int64_t; +typedef unsigned long int khronos_uint64_t; +#else +typedef long long int khronos_int64_t; +typedef unsigned long long int khronos_uint64_t; +#endif /* __arch64__ */ +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif 0 + +/* + * Hypothetical platform with no float or int64 support + */ +typedef int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +#define KHRONOS_SUPPORT_INT64 0 +#define KHRONOS_SUPPORT_FLOAT 0 + +#else + +/* + * Generic fallback + */ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#endif + + +/* + * Types that are (so far) the same on all platforms + */ +typedef signed char khronos_int8_t; +typedef unsigned char khronos_uint8_t; +typedef signed short int khronos_int16_t; +typedef unsigned short int khronos_uint16_t; + +/* + * Types that differ between LLP64 and LP64 architectures - in LLP64, + * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears + * to be the only LLP64 architecture in current use. + */ +#ifdef KHRONOS_USE_INTPTR_T +typedef intptr_t khronos_intptr_t; +typedef uintptr_t khronos_uintptr_t; +#elif defined(_WIN64) +typedef signed long long int khronos_intptr_t; +typedef unsigned long long int khronos_uintptr_t; +#else +typedef signed long int khronos_intptr_t; +typedef unsigned long int khronos_uintptr_t; +#endif + +#if defined(_WIN64) +typedef signed long long int khronos_ssize_t; +typedef unsigned long long int khronos_usize_t; +#else +typedef signed long int khronos_ssize_t; +typedef unsigned long int khronos_usize_t; +#endif + +#if KHRONOS_SUPPORT_FLOAT +/* + * Float type + */ +typedef float khronos_float_t; +#endif + +#if KHRONOS_SUPPORT_INT64 +/* Time types + * + * These types can be used to represent a time interval in nanoseconds or + * an absolute Unadjusted System Time. Unadjusted System Time is the number + * of nanoseconds since some arbitrary system event (e.g. since the last + * time the system booted). The Unadjusted System Time is an unsigned + * 64 bit value that wraps back to 0 every 584 years. Time intervals + * may be either signed or unsigned. + */ +typedef khronos_uint64_t khronos_utime_nanoseconds_t; +typedef khronos_int64_t khronos_stime_nanoseconds_t; +#endif + +/* + * Dummy value used to pad enum types to 32 bits. + */ +#ifndef KHRONOS_MAX_ENUM +#define KHRONOS_MAX_ENUM 0x7FFFFFFF +#endif + +/* + * Enumerated boolean type + * + * Values other than zero should be considered to be true. Therefore + * comparisons should not be made against KHRONOS_TRUE. + */ +typedef enum { + KHRONOS_FALSE = 0, + KHRONOS_TRUE = 1, + KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM +} khronos_boolean_enum_t; + +#endif /* __khrplatform_h_ */ +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef void GLvoid; +typedef khronos_int8_t GLbyte; +typedef khronos_uint8_t GLubyte; +typedef khronos_int16_t GLshort; +typedef khronos_uint16_t GLushort; +typedef int GLint; +typedef unsigned int GLuint; +typedef khronos_int32_t GLclampx; +typedef int GLsizei; +typedef khronos_float_t GLfloat; +typedef khronos_float_t GLclampf; +typedef double GLdouble; +typedef double GLclampd; +typedef void *GLeglClientBufferEXT; +typedef void *GLeglImageOES; +typedef char GLchar; +typedef char GLcharARB; +#ifdef __APPLE__ +typedef void *GLhandleARB; +#else +typedef unsigned int GLhandleARB; +#endif +typedef khronos_uint16_t GLhalf; +typedef khronos_uint16_t GLhalfARB; +typedef khronos_int32_t GLfixed; +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_intptr_t GLintptr; +#else +typedef khronos_intptr_t GLintptr; +#endif +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_intptr_t GLintptrARB; +#else +typedef khronos_intptr_t GLintptrARB; +#endif +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_ssize_t GLsizeiptr; +#else +typedef khronos_ssize_t GLsizeiptr; +#endif +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_ssize_t GLsizeiptrARB; +#else +typedef khronos_ssize_t GLsizeiptrARB; +#endif +typedef khronos_int64_t GLint64; +typedef khronos_int64_t GLint64EXT; +typedef khronos_uint64_t GLuint64; +typedef khronos_uint64_t GLuint64EXT; +typedef struct __GLsync *GLsync; +struct _cl_context; +struct _cl_event; +typedef void (GLAD_API_PTR *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (GLAD_API_PTR *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (GLAD_API_PTR *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (GLAD_API_PTR *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); +typedef unsigned short GLhalfNV; +typedef GLintptr GLvdpauSurfaceNV; +typedef void (GLAD_API_PTR *GLVULKANPROCNV)(void); + + +#define GL_VERSION_1_0 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_0; +#define GL_VERSION_1_1 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_1; +#define GL_VERSION_1_2 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_2; +#define GL_VERSION_1_3 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_3; +#define GL_VERSION_1_4 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_4; +#define GL_VERSION_1_5 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_5; +#define GL_VERSION_2_0 1 +GLAD_API_CALL int GLAD_GL_VERSION_2_0; +#define GL_VERSION_2_1 1 +GLAD_API_CALL int GLAD_GL_VERSION_2_1; +#define GL_VERSION_3_0 1 +GLAD_API_CALL int GLAD_GL_VERSION_3_0; +#define GL_VERSION_3_1 1 +GLAD_API_CALL int GLAD_GL_VERSION_3_1; +#define GL_VERSION_3_2 1 +GLAD_API_CALL int GLAD_GL_VERSION_3_2; +#define GL_VERSION_3_3 1 +GLAD_API_CALL int GLAD_GL_VERSION_3_3; + + +typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREPROC)(GLenum texture); +typedef void (GLAD_API_PTR *PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader); +typedef void (GLAD_API_PTR *PFNGLBEGINCONDITIONALRENDERPROC)(GLuint id, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBEGINQUERYPROC)(GLenum target, GLuint id); +typedef void (GLAD_API_PTR *PFNGLBEGINTRANSFORMFEEDBACKPROC)(GLenum primitiveMode); +typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERBASEPROC)(GLenum target, GLuint index, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERRANGEPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONPROC)(GLuint program, GLuint color, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)(GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer); +typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLBINDSAMPLERPROC)(GLuint unit, GLuint sampler); +typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture); +typedef void (GLAD_API_PTR *PFNGLBINDVERTEXARRAYPROC)(GLuint array); +typedef void (GLAD_API_PTR *PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (GLAD_API_PTR *PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void * data, GLenum usage); +typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void * data); +typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLCLAMPCOLORPROC)(GLenum target, GLenum clamp); +typedef void (GLAD_API_PTR *PFNGLCLEARPROC)(GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFIPROC)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFVPROC)(GLenum buffer, GLint drawbuffer, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERIVPROC)(GLenum buffer, GLint drawbuffer, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERUIVPROC)(GLenum buffer, GLint drawbuffer, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHPROC)(GLdouble depth); +typedef void (GLAD_API_PTR *PFNGLCLEARSTENCILPROC)(GLint s); +typedef GLenum (GLAD_API_PTR *PFNGLCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GLAD_API_PTR *PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +typedef void (GLAD_API_PTR *PFNGLCOLORMASKIPROC)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERPROC)(GLuint shader); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE3DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOPYBUFFERSUBDATAPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef GLuint (GLAD_API_PTR *PFNGLCREATEPROGRAMPROC)(void); +typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROC)(GLenum type); +typedef void (GLAD_API_PTR *PFNGLCULLFACEPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint * framebuffers); +typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLDELETEQUERIESPROC)(GLsizei n, const GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLDELETESAMPLERSPROC)(GLsizei count, const GLuint * samplers); +typedef void (GLAD_API_PTR *PFNGLDELETESHADERPROC)(GLuint shader); +typedef void (GLAD_API_PTR *PFNGLDELETESYNCPROC)(GLsync sync); +typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLDELETEVERTEXARRAYSPROC)(GLsizei n, const GLuint * arrays); +typedef void (GLAD_API_PTR *PFNGLDEPTHFUNCPROC)(GLenum func); +typedef void (GLAD_API_PTR *PFNGLDEPTHMASKPROC)(GLboolean flag); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEPROC)(GLdouble n, GLdouble f); +typedef void (GLAD_API_PTR *PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader); +typedef void (GLAD_API_PTR *PFNGLDISABLEPROC)(GLenum cap); +typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLEIPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERPROC)(GLenum buf); +typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERSPROC)(GLsizei n, const GLenum * bufs); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices); +typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLENABLEPROC)(GLenum cap); +typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLEIPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENDCONDITIONALRENDERPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDQUERYPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLENDTRANSFORMFEEDBACKPROC)(void); +typedef GLsync (GLAD_API_PTR *PFNGLFENCESYNCPROC)(GLenum condition, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLFINISHPROC)(void); +typedef void (GLAD_API_PTR *PFNGLFLUSHPROC)(void); +typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAD_API_PTR *PFNGLFRONTFACEPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLGENBUFFERSPROC)(GLsizei n, GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers); +typedef void (GLAD_API_PTR *PFNGLGENQUERIESPROC)(GLsizei n, GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLGENSAMPLERSPROC)(GLsizei count, GLuint * samplers); +typedef void (GLAD_API_PTR *PFNGLGENTEXTURESPROC)(GLsizei n, GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLGENVERTEXARRAYSPROC)(GLsizei n, GLuint * arrays); +typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformBlockName); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKIVPROC)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMNAMEPROC)(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformName); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMSIVPROC)(GLuint program, GLsizei uniformCount, const GLuint * uniformIndices, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei * count, GLuint * shaders); +typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONPROC)(GLuint program, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETBOOLEANI_VPROC)(GLenum target, GLuint index, GLboolean * data); +typedef void (GLAD_API_PTR *PFNGLGETBOOLEANVPROC)(GLenum pname, GLboolean * data); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERI64VPROC)(GLenum target, GLenum pname, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, void * data); +typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void * img); +typedef void (GLAD_API_PTR *PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble * data); +typedef GLenum (GLAD_API_PTR *PFNGLGETERRORPROC)(void); +typedef void (GLAD_API_PTR *PFNGLGETFLOATVPROC)(GLenum pname, GLfloat * data); +typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATAINDEXPROC)(GLuint program, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATALOCATIONPROC)(GLuint program, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETINTEGER64I_VPROC)(GLenum target, GLuint index, GLint64 * data); +typedef void (GLAD_API_PTR *PFNGLGETINTEGER64VPROC)(GLenum pname, GLint64 * data); +typedef void (GLAD_API_PTR *PFNGLGETINTEGERI_VPROC)(GLenum target, GLuint index, GLint * data); +typedef void (GLAD_API_PTR *PFNGLGETINTEGERVPROC)(GLenum pname, GLint * data); +typedef void (GLAD_API_PTR *PFNGLGETMULTISAMPLEFVPROC)(GLenum pname, GLuint index, GLfloat * val); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMINFOLOGPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTI64VPROC)(GLuint id, GLenum pname, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTIVPROC)(GLuint id, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUI64VPROC)(GLuint id, GLenum pname, GLuint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUIVPROC)(GLuint id, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source); +typedef void (GLAD_API_PTR *PFNGLGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint * params); +typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGPROC)(GLenum name); +typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGIPROC)(GLenum name, GLuint index); +typedef void (GLAD_API_PTR *PFNGLGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei count, GLsizei * length, GLint * values); +typedef void (GLAD_API_PTR *PFNGLGETTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum target, GLint level, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERIVPROC)(GLenum target, GLint level, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); +typedef GLuint (GLAD_API_PTR *PFNGLGETUNIFORMBLOCKINDEXPROC)(GLuint program, const GLchar * uniformBlockName); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMINDICESPROC)(GLuint program, GLsizei uniformCount, const GLchar *const* uniformNames, GLuint * uniformIndices); +typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMUIVPROC)(GLuint program, GLint location, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIIVPROC)(GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIUIVPROC)(GLuint index, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void ** pointer); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLHINTPROC)(GLenum target, GLenum mode); +typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERPROC)(GLuint buffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDPROC)(GLenum cap); +typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDIPROC)(GLenum target, GLuint index); +typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPROC)(GLuint program); +typedef GLboolean (GLAD_API_PTR *PFNGLISQUERYPROC)(GLuint id); +typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISSAMPLERPROC)(GLuint sampler); +typedef GLboolean (GLAD_API_PTR *PFNGLISSHADERPROC)(GLuint shader); +typedef GLboolean (GLAD_API_PTR *PFNGLISSYNCPROC)(GLsync sync); +typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREPROC)(GLuint texture); +typedef GLboolean (GLAD_API_PTR *PFNGLISVERTEXARRAYPROC)(GLuint array); +typedef void (GLAD_API_PTR *PFNGLLINEWIDTHPROC)(GLfloat width); +typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLLOGICOPPROC)(GLenum opcode); +typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERPROC)(GLenum target, GLenum access); +typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSPROC)(GLenum mode, const GLint * first, const GLsizei * count, GLsizei drawcount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount, const GLint * basevertex); +typedef void (GLAD_API_PTR *PFNGLPIXELSTOREFPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIVPROC)(GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLPOINTSIZEPROC)(GLfloat size); +typedef void (GLAD_API_PTR *PFNGLPOLYGONMODEPROC)(GLenum face, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units); +typedef void (GLAD_API_PTR *PFNGLPRIMITIVERESTARTINDEXPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLPROVOKINGVERTEXPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLQUERYCOUNTERPROC)(GLuint id, GLenum target); +typedef void (GLAD_API_PTR *PFNGLREADBUFFERPROC)(GLenum src); +typedef void (GLAD_API_PTR *PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void * pixels); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert); +typedef void (GLAD_API_PTR *PFNGLSAMPLEMASKIPROC)(GLuint maskNumber, GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, const GLint * param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, const GLuint * param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFPROC)(GLuint sampler, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, const GLfloat * param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIPROC)(GLuint sampler, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, const GLint * param); +typedef void (GLAD_API_PTR *PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar *const* string, const GLint * length); +typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCSEPARATEPROC)(GLenum face, GLenum func, GLint ref, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILMASKPROC)(GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass); +typedef void (GLAD_API_PTR *PFNGLSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GLAD_API_PTR *PFNGLTEXBUFFERPROC)(GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE1DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKVARYINGSPROC)(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1IPROC)(GLint location, GLint v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIPROC)(GLint location, GLuint v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIPROC)(GLint location, GLuint v0, GLuint v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMBLOCKBINDINGPROC)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DPROC)(GLuint index, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SPROC)(GLuint index, GLshort x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NIVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBDIVISORPROC)(GLuint index, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IPROC)(GLuint index, GLint x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIPROC)(GLuint index, GLuint x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IPROC)(GLuint index, GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIPROC)(GLuint index, GLuint x, GLuint y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IPROC)(GLuint index, GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4BVPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UBVPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4USVPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); + +GLAD_API_CALL PFNGLACTIVETEXTUREPROC glad_glActiveTexture; +#define glActiveTexture glad_glActiveTexture +GLAD_API_CALL PFNGLATTACHSHADERPROC glad_glAttachShader; +#define glAttachShader glad_glAttachShader +GLAD_API_CALL PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender; +#define glBeginConditionalRender glad_glBeginConditionalRender +GLAD_API_CALL PFNGLBEGINQUERYPROC glad_glBeginQuery; +#define glBeginQuery glad_glBeginQuery +GLAD_API_CALL PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback; +#define glBeginTransformFeedback glad_glBeginTransformFeedback +GLAD_API_CALL PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation; +#define glBindAttribLocation glad_glBindAttribLocation +GLAD_API_CALL PFNGLBINDBUFFERPROC glad_glBindBuffer; +#define glBindBuffer glad_glBindBuffer +GLAD_API_CALL PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase; +#define glBindBufferBase glad_glBindBufferBase +GLAD_API_CALL PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange; +#define glBindBufferRange glad_glBindBufferRange +GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation; +#define glBindFragDataLocation glad_glBindFragDataLocation +GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed; +#define glBindFragDataLocationIndexed glad_glBindFragDataLocationIndexed +GLAD_API_CALL PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer; +#define glBindFramebuffer glad_glBindFramebuffer +GLAD_API_CALL PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer; +#define glBindRenderbuffer glad_glBindRenderbuffer +GLAD_API_CALL PFNGLBINDSAMPLERPROC glad_glBindSampler; +#define glBindSampler glad_glBindSampler +GLAD_API_CALL PFNGLBINDTEXTUREPROC glad_glBindTexture; +#define glBindTexture glad_glBindTexture +GLAD_API_CALL PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray; +#define glBindVertexArray glad_glBindVertexArray +GLAD_API_CALL PFNGLBLENDCOLORPROC glad_glBlendColor; +#define glBlendColor glad_glBlendColor +GLAD_API_CALL PFNGLBLENDEQUATIONPROC glad_glBlendEquation; +#define glBlendEquation glad_glBlendEquation +GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate; +#define glBlendEquationSeparate glad_glBlendEquationSeparate +GLAD_API_CALL PFNGLBLENDFUNCPROC glad_glBlendFunc; +#define glBlendFunc glad_glBlendFunc +GLAD_API_CALL PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate; +#define glBlendFuncSeparate glad_glBlendFuncSeparate +GLAD_API_CALL PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer; +#define glBlitFramebuffer glad_glBlitFramebuffer +GLAD_API_CALL PFNGLBUFFERDATAPROC glad_glBufferData; +#define glBufferData glad_glBufferData +GLAD_API_CALL PFNGLBUFFERSUBDATAPROC glad_glBufferSubData; +#define glBufferSubData glad_glBufferSubData +GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus; +#define glCheckFramebufferStatus glad_glCheckFramebufferStatus +GLAD_API_CALL PFNGLCLAMPCOLORPROC glad_glClampColor; +#define glClampColor glad_glClampColor +GLAD_API_CALL PFNGLCLEARPROC glad_glClear; +#define glClear glad_glClear +GLAD_API_CALL PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi; +#define glClearBufferfi glad_glClearBufferfi +GLAD_API_CALL PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv; +#define glClearBufferfv glad_glClearBufferfv +GLAD_API_CALL PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv; +#define glClearBufferiv glad_glClearBufferiv +GLAD_API_CALL PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv; +#define glClearBufferuiv glad_glClearBufferuiv +GLAD_API_CALL PFNGLCLEARCOLORPROC glad_glClearColor; +#define glClearColor glad_glClearColor +GLAD_API_CALL PFNGLCLEARDEPTHPROC glad_glClearDepth; +#define glClearDepth glad_glClearDepth +GLAD_API_CALL PFNGLCLEARSTENCILPROC glad_glClearStencil; +#define glClearStencil glad_glClearStencil +GLAD_API_CALL PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync; +#define glClientWaitSync glad_glClientWaitSync +GLAD_API_CALL PFNGLCOLORMASKPROC glad_glColorMask; +#define glColorMask glad_glColorMask +GLAD_API_CALL PFNGLCOLORMASKIPROC glad_glColorMaski; +#define glColorMaski glad_glColorMaski +GLAD_API_CALL PFNGLCOMPILESHADERPROC glad_glCompileShader; +#define glCompileShader glad_glCompileShader +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D; +#define glCompressedTexImage1D glad_glCompressedTexImage1D +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D; +#define glCompressedTexImage2D glad_glCompressedTexImage2D +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D; +#define glCompressedTexImage3D glad_glCompressedTexImage3D +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D; +#define glCompressedTexSubImage1D glad_glCompressedTexSubImage1D +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D; +#define glCompressedTexSubImage2D glad_glCompressedTexSubImage2D +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D; +#define glCompressedTexSubImage3D glad_glCompressedTexSubImage3D +GLAD_API_CALL PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData; +#define glCopyBufferSubData glad_glCopyBufferSubData +GLAD_API_CALL PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D; +#define glCopyTexImage1D glad_glCopyTexImage1D +GLAD_API_CALL PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D; +#define glCopyTexImage2D glad_glCopyTexImage2D +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D; +#define glCopyTexSubImage1D glad_glCopyTexSubImage1D +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D; +#define glCopyTexSubImage2D glad_glCopyTexSubImage2D +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D; +#define glCopyTexSubImage3D glad_glCopyTexSubImage3D +GLAD_API_CALL PFNGLCREATEPROGRAMPROC glad_glCreateProgram; +#define glCreateProgram glad_glCreateProgram +GLAD_API_CALL PFNGLCREATESHADERPROC glad_glCreateShader; +#define glCreateShader glad_glCreateShader +GLAD_API_CALL PFNGLCULLFACEPROC glad_glCullFace; +#define glCullFace glad_glCullFace +GLAD_API_CALL PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers; +#define glDeleteBuffers glad_glDeleteBuffers +GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers; +#define glDeleteFramebuffers glad_glDeleteFramebuffers +GLAD_API_CALL PFNGLDELETEPROGRAMPROC glad_glDeleteProgram; +#define glDeleteProgram glad_glDeleteProgram +GLAD_API_CALL PFNGLDELETEQUERIESPROC glad_glDeleteQueries; +#define glDeleteQueries glad_glDeleteQueries +GLAD_API_CALL PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers; +#define glDeleteRenderbuffers glad_glDeleteRenderbuffers +GLAD_API_CALL PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers; +#define glDeleteSamplers glad_glDeleteSamplers +GLAD_API_CALL PFNGLDELETESHADERPROC glad_glDeleteShader; +#define glDeleteShader glad_glDeleteShader +GLAD_API_CALL PFNGLDELETESYNCPROC glad_glDeleteSync; +#define glDeleteSync glad_glDeleteSync +GLAD_API_CALL PFNGLDELETETEXTURESPROC glad_glDeleteTextures; +#define glDeleteTextures glad_glDeleteTextures +GLAD_API_CALL PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays; +#define glDeleteVertexArrays glad_glDeleteVertexArrays +GLAD_API_CALL PFNGLDEPTHFUNCPROC glad_glDepthFunc; +#define glDepthFunc glad_glDepthFunc +GLAD_API_CALL PFNGLDEPTHMASKPROC glad_glDepthMask; +#define glDepthMask glad_glDepthMask +GLAD_API_CALL PFNGLDEPTHRANGEPROC glad_glDepthRange; +#define glDepthRange glad_glDepthRange +GLAD_API_CALL PFNGLDETACHSHADERPROC glad_glDetachShader; +#define glDetachShader glad_glDetachShader +GLAD_API_CALL PFNGLDISABLEPROC glad_glDisable; +#define glDisable glad_glDisable +GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray; +#define glDisableVertexAttribArray glad_glDisableVertexAttribArray +GLAD_API_CALL PFNGLDISABLEIPROC glad_glDisablei; +#define glDisablei glad_glDisablei +GLAD_API_CALL PFNGLDRAWARRAYSPROC glad_glDrawArrays; +#define glDrawArrays glad_glDrawArrays +GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced; +#define glDrawArraysInstanced glad_glDrawArraysInstanced +GLAD_API_CALL PFNGLDRAWBUFFERPROC glad_glDrawBuffer; +#define glDrawBuffer glad_glDrawBuffer +GLAD_API_CALL PFNGLDRAWBUFFERSPROC glad_glDrawBuffers; +#define glDrawBuffers glad_glDrawBuffers +GLAD_API_CALL PFNGLDRAWELEMENTSPROC glad_glDrawElements; +#define glDrawElements glad_glDrawElements +GLAD_API_CALL PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex; +#define glDrawElementsBaseVertex glad_glDrawElementsBaseVertex +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced; +#define glDrawElementsInstanced glad_glDrawElementsInstanced +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex; +#define glDrawElementsInstancedBaseVertex glad_glDrawElementsInstancedBaseVertex +GLAD_API_CALL PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements; +#define glDrawRangeElements glad_glDrawRangeElements +GLAD_API_CALL PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex; +#define glDrawRangeElementsBaseVertex glad_glDrawRangeElementsBaseVertex +GLAD_API_CALL PFNGLENABLEPROC glad_glEnable; +#define glEnable glad_glEnable +GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray; +#define glEnableVertexAttribArray glad_glEnableVertexAttribArray +GLAD_API_CALL PFNGLENABLEIPROC glad_glEnablei; +#define glEnablei glad_glEnablei +GLAD_API_CALL PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender; +#define glEndConditionalRender glad_glEndConditionalRender +GLAD_API_CALL PFNGLENDQUERYPROC glad_glEndQuery; +#define glEndQuery glad_glEndQuery +GLAD_API_CALL PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback; +#define glEndTransformFeedback glad_glEndTransformFeedback +GLAD_API_CALL PFNGLFENCESYNCPROC glad_glFenceSync; +#define glFenceSync glad_glFenceSync +GLAD_API_CALL PFNGLFINISHPROC glad_glFinish; +#define glFinish glad_glFinish +GLAD_API_CALL PFNGLFLUSHPROC glad_glFlush; +#define glFlush glad_glFlush +GLAD_API_CALL PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange; +#define glFlushMappedBufferRange glad_glFlushMappedBufferRange +GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer; +#define glFramebufferRenderbuffer glad_glFramebufferRenderbuffer +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture; +#define glFramebufferTexture glad_glFramebufferTexture +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D; +#define glFramebufferTexture1D glad_glFramebufferTexture1D +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D; +#define glFramebufferTexture2D glad_glFramebufferTexture2D +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D; +#define glFramebufferTexture3D glad_glFramebufferTexture3D +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer; +#define glFramebufferTextureLayer glad_glFramebufferTextureLayer +GLAD_API_CALL PFNGLFRONTFACEPROC glad_glFrontFace; +#define glFrontFace glad_glFrontFace +GLAD_API_CALL PFNGLGENBUFFERSPROC glad_glGenBuffers; +#define glGenBuffers glad_glGenBuffers +GLAD_API_CALL PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers; +#define glGenFramebuffers glad_glGenFramebuffers +GLAD_API_CALL PFNGLGENQUERIESPROC glad_glGenQueries; +#define glGenQueries glad_glGenQueries +GLAD_API_CALL PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers; +#define glGenRenderbuffers glad_glGenRenderbuffers +GLAD_API_CALL PFNGLGENSAMPLERSPROC glad_glGenSamplers; +#define glGenSamplers glad_glGenSamplers +GLAD_API_CALL PFNGLGENTEXTURESPROC glad_glGenTextures; +#define glGenTextures glad_glGenTextures +GLAD_API_CALL PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays; +#define glGenVertexArrays glad_glGenVertexArrays +GLAD_API_CALL PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap; +#define glGenerateMipmap glad_glGenerateMipmap +GLAD_API_CALL PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib; +#define glGetActiveAttrib glad_glGetActiveAttrib +GLAD_API_CALL PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform; +#define glGetActiveUniform glad_glGetActiveUniform +GLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName; +#define glGetActiveUniformBlockName glad_glGetActiveUniformBlockName +GLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv; +#define glGetActiveUniformBlockiv glad_glGetActiveUniformBlockiv +GLAD_API_CALL PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName; +#define glGetActiveUniformName glad_glGetActiveUniformName +GLAD_API_CALL PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv; +#define glGetActiveUniformsiv glad_glGetActiveUniformsiv +GLAD_API_CALL PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders; +#define glGetAttachedShaders glad_glGetAttachedShaders +GLAD_API_CALL PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation; +#define glGetAttribLocation glad_glGetAttribLocation +GLAD_API_CALL PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v; +#define glGetBooleani_v glad_glGetBooleani_v +GLAD_API_CALL PFNGLGETBOOLEANVPROC glad_glGetBooleanv; +#define glGetBooleanv glad_glGetBooleanv +GLAD_API_CALL PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v; +#define glGetBufferParameteri64v glad_glGetBufferParameteri64v +GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv; +#define glGetBufferParameteriv glad_glGetBufferParameteriv +GLAD_API_CALL PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv; +#define glGetBufferPointerv glad_glGetBufferPointerv +GLAD_API_CALL PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData; +#define glGetBufferSubData glad_glGetBufferSubData +GLAD_API_CALL PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage; +#define glGetCompressedTexImage glad_glGetCompressedTexImage +GLAD_API_CALL PFNGLGETDOUBLEVPROC glad_glGetDoublev; +#define glGetDoublev glad_glGetDoublev +GLAD_API_CALL PFNGLGETERRORPROC glad_glGetError; +#define glGetError glad_glGetError +GLAD_API_CALL PFNGLGETFLOATVPROC glad_glGetFloatv; +#define glGetFloatv glad_glGetFloatv +GLAD_API_CALL PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex; +#define glGetFragDataIndex glad_glGetFragDataIndex +GLAD_API_CALL PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation; +#define glGetFragDataLocation glad_glGetFragDataLocation +GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv; +#define glGetFramebufferAttachmentParameteriv glad_glGetFramebufferAttachmentParameteriv +GLAD_API_CALL PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v; +#define glGetInteger64i_v glad_glGetInteger64i_v +GLAD_API_CALL PFNGLGETINTEGER64VPROC glad_glGetInteger64v; +#define glGetInteger64v glad_glGetInteger64v +GLAD_API_CALL PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v; +#define glGetIntegeri_v glad_glGetIntegeri_v +GLAD_API_CALL PFNGLGETINTEGERVPROC glad_glGetIntegerv; +#define glGetIntegerv glad_glGetIntegerv +GLAD_API_CALL PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv; +#define glGetMultisamplefv glad_glGetMultisamplefv +GLAD_API_CALL PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog; +#define glGetProgramInfoLog glad_glGetProgramInfoLog +GLAD_API_CALL PFNGLGETPROGRAMIVPROC glad_glGetProgramiv; +#define glGetProgramiv glad_glGetProgramiv +GLAD_API_CALL PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v; +#define glGetQueryObjecti64v glad_glGetQueryObjecti64v +GLAD_API_CALL PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv; +#define glGetQueryObjectiv glad_glGetQueryObjectiv +GLAD_API_CALL PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v; +#define glGetQueryObjectui64v glad_glGetQueryObjectui64v +GLAD_API_CALL PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv; +#define glGetQueryObjectuiv glad_glGetQueryObjectuiv +GLAD_API_CALL PFNGLGETQUERYIVPROC glad_glGetQueryiv; +#define glGetQueryiv glad_glGetQueryiv +GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv; +#define glGetRenderbufferParameteriv glad_glGetRenderbufferParameteriv +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv; +#define glGetSamplerParameterIiv glad_glGetSamplerParameterIiv +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv; +#define glGetSamplerParameterIuiv glad_glGetSamplerParameterIuiv +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv; +#define glGetSamplerParameterfv glad_glGetSamplerParameterfv +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv; +#define glGetSamplerParameteriv glad_glGetSamplerParameteriv +GLAD_API_CALL PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog; +#define glGetShaderInfoLog glad_glGetShaderInfoLog +GLAD_API_CALL PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource; +#define glGetShaderSource glad_glGetShaderSource +GLAD_API_CALL PFNGLGETSHADERIVPROC glad_glGetShaderiv; +#define glGetShaderiv glad_glGetShaderiv +GLAD_API_CALL PFNGLGETSTRINGPROC glad_glGetString; +#define glGetString glad_glGetString +GLAD_API_CALL PFNGLGETSTRINGIPROC glad_glGetStringi; +#define glGetStringi glad_glGetStringi +GLAD_API_CALL PFNGLGETSYNCIVPROC glad_glGetSynciv; +#define glGetSynciv glad_glGetSynciv +GLAD_API_CALL PFNGLGETTEXIMAGEPROC glad_glGetTexImage; +#define glGetTexImage glad_glGetTexImage +GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv; +#define glGetTexLevelParameterfv glad_glGetTexLevelParameterfv +GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv; +#define glGetTexLevelParameteriv glad_glGetTexLevelParameteriv +GLAD_API_CALL PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv; +#define glGetTexParameterIiv glad_glGetTexParameterIiv +GLAD_API_CALL PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv; +#define glGetTexParameterIuiv glad_glGetTexParameterIuiv +GLAD_API_CALL PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv; +#define glGetTexParameterfv glad_glGetTexParameterfv +GLAD_API_CALL PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv; +#define glGetTexParameteriv glad_glGetTexParameteriv +GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying; +#define glGetTransformFeedbackVarying glad_glGetTransformFeedbackVarying +GLAD_API_CALL PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex; +#define glGetUniformBlockIndex glad_glGetUniformBlockIndex +GLAD_API_CALL PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices; +#define glGetUniformIndices glad_glGetUniformIndices +GLAD_API_CALL PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation; +#define glGetUniformLocation glad_glGetUniformLocation +GLAD_API_CALL PFNGLGETUNIFORMFVPROC glad_glGetUniformfv; +#define glGetUniformfv glad_glGetUniformfv +GLAD_API_CALL PFNGLGETUNIFORMIVPROC glad_glGetUniformiv; +#define glGetUniformiv glad_glGetUniformiv +GLAD_API_CALL PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv; +#define glGetUniformuiv glad_glGetUniformuiv +GLAD_API_CALL PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv; +#define glGetVertexAttribIiv glad_glGetVertexAttribIiv +GLAD_API_CALL PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv; +#define glGetVertexAttribIuiv glad_glGetVertexAttribIuiv +GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv; +#define glGetVertexAttribPointerv glad_glGetVertexAttribPointerv +GLAD_API_CALL PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv; +#define glGetVertexAttribdv glad_glGetVertexAttribdv +GLAD_API_CALL PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv; +#define glGetVertexAttribfv glad_glGetVertexAttribfv +GLAD_API_CALL PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv; +#define glGetVertexAttribiv glad_glGetVertexAttribiv +GLAD_API_CALL PFNGLHINTPROC glad_glHint; +#define glHint glad_glHint +GLAD_API_CALL PFNGLISBUFFERPROC glad_glIsBuffer; +#define glIsBuffer glad_glIsBuffer +GLAD_API_CALL PFNGLISENABLEDPROC glad_glIsEnabled; +#define glIsEnabled glad_glIsEnabled +GLAD_API_CALL PFNGLISENABLEDIPROC glad_glIsEnabledi; +#define glIsEnabledi glad_glIsEnabledi +GLAD_API_CALL PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer; +#define glIsFramebuffer glad_glIsFramebuffer +GLAD_API_CALL PFNGLISPROGRAMPROC glad_glIsProgram; +#define glIsProgram glad_glIsProgram +GLAD_API_CALL PFNGLISQUERYPROC glad_glIsQuery; +#define glIsQuery glad_glIsQuery +GLAD_API_CALL PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer; +#define glIsRenderbuffer glad_glIsRenderbuffer +GLAD_API_CALL PFNGLISSAMPLERPROC glad_glIsSampler; +#define glIsSampler glad_glIsSampler +GLAD_API_CALL PFNGLISSHADERPROC glad_glIsShader; +#define glIsShader glad_glIsShader +GLAD_API_CALL PFNGLISSYNCPROC glad_glIsSync; +#define glIsSync glad_glIsSync +GLAD_API_CALL PFNGLISTEXTUREPROC glad_glIsTexture; +#define glIsTexture glad_glIsTexture +GLAD_API_CALL PFNGLISVERTEXARRAYPROC glad_glIsVertexArray; +#define glIsVertexArray glad_glIsVertexArray +GLAD_API_CALL PFNGLLINEWIDTHPROC glad_glLineWidth; +#define glLineWidth glad_glLineWidth +GLAD_API_CALL PFNGLLINKPROGRAMPROC glad_glLinkProgram; +#define glLinkProgram glad_glLinkProgram +GLAD_API_CALL PFNGLLOGICOPPROC glad_glLogicOp; +#define glLogicOp glad_glLogicOp +GLAD_API_CALL PFNGLMAPBUFFERPROC glad_glMapBuffer; +#define glMapBuffer glad_glMapBuffer +GLAD_API_CALL PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange; +#define glMapBufferRange glad_glMapBufferRange +GLAD_API_CALL PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays; +#define glMultiDrawArrays glad_glMultiDrawArrays +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements; +#define glMultiDrawElements glad_glMultiDrawElements +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex; +#define glMultiDrawElementsBaseVertex glad_glMultiDrawElementsBaseVertex +GLAD_API_CALL PFNGLPIXELSTOREFPROC glad_glPixelStoref; +#define glPixelStoref glad_glPixelStoref +GLAD_API_CALL PFNGLPIXELSTOREIPROC glad_glPixelStorei; +#define glPixelStorei glad_glPixelStorei +GLAD_API_CALL PFNGLPOINTPARAMETERFPROC glad_glPointParameterf; +#define glPointParameterf glad_glPointParameterf +GLAD_API_CALL PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv; +#define glPointParameterfv glad_glPointParameterfv +GLAD_API_CALL PFNGLPOINTPARAMETERIPROC glad_glPointParameteri; +#define glPointParameteri glad_glPointParameteri +GLAD_API_CALL PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv; +#define glPointParameteriv glad_glPointParameteriv +GLAD_API_CALL PFNGLPOINTSIZEPROC glad_glPointSize; +#define glPointSize glad_glPointSize +GLAD_API_CALL PFNGLPOLYGONMODEPROC glad_glPolygonMode; +#define glPolygonMode glad_glPolygonMode +GLAD_API_CALL PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset; +#define glPolygonOffset glad_glPolygonOffset +GLAD_API_CALL PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex; +#define glPrimitiveRestartIndex glad_glPrimitiveRestartIndex +GLAD_API_CALL PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex; +#define glProvokingVertex glad_glProvokingVertex +GLAD_API_CALL PFNGLQUERYCOUNTERPROC glad_glQueryCounter; +#define glQueryCounter glad_glQueryCounter +GLAD_API_CALL PFNGLREADBUFFERPROC glad_glReadBuffer; +#define glReadBuffer glad_glReadBuffer +GLAD_API_CALL PFNGLREADPIXELSPROC glad_glReadPixels; +#define glReadPixels glad_glReadPixels +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage; +#define glRenderbufferStorage glad_glRenderbufferStorage +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample; +#define glRenderbufferStorageMultisample glad_glRenderbufferStorageMultisample +GLAD_API_CALL PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage; +#define glSampleCoverage glad_glSampleCoverage +GLAD_API_CALL PFNGLSAMPLEMASKIPROC glad_glSampleMaski; +#define glSampleMaski glad_glSampleMaski +GLAD_API_CALL PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv; +#define glSamplerParameterIiv glad_glSamplerParameterIiv +GLAD_API_CALL PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv; +#define glSamplerParameterIuiv glad_glSamplerParameterIuiv +GLAD_API_CALL PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf; +#define glSamplerParameterf glad_glSamplerParameterf +GLAD_API_CALL PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv; +#define glSamplerParameterfv glad_glSamplerParameterfv +GLAD_API_CALL PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri; +#define glSamplerParameteri glad_glSamplerParameteri +GLAD_API_CALL PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv; +#define glSamplerParameteriv glad_glSamplerParameteriv +GLAD_API_CALL PFNGLSCISSORPROC glad_glScissor; +#define glScissor glad_glScissor +GLAD_API_CALL PFNGLSHADERSOURCEPROC glad_glShaderSource; +#define glShaderSource glad_glShaderSource +GLAD_API_CALL PFNGLSTENCILFUNCPROC glad_glStencilFunc; +#define glStencilFunc glad_glStencilFunc +GLAD_API_CALL PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate; +#define glStencilFuncSeparate glad_glStencilFuncSeparate +GLAD_API_CALL PFNGLSTENCILMASKPROC glad_glStencilMask; +#define glStencilMask glad_glStencilMask +GLAD_API_CALL PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate; +#define glStencilMaskSeparate glad_glStencilMaskSeparate +GLAD_API_CALL PFNGLSTENCILOPPROC glad_glStencilOp; +#define glStencilOp glad_glStencilOp +GLAD_API_CALL PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate; +#define glStencilOpSeparate glad_glStencilOpSeparate +GLAD_API_CALL PFNGLTEXBUFFERPROC glad_glTexBuffer; +#define glTexBuffer glad_glTexBuffer +GLAD_API_CALL PFNGLTEXIMAGE1DPROC glad_glTexImage1D; +#define glTexImage1D glad_glTexImage1D +GLAD_API_CALL PFNGLTEXIMAGE2DPROC glad_glTexImage2D; +#define glTexImage2D glad_glTexImage2D +GLAD_API_CALL PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample; +#define glTexImage2DMultisample glad_glTexImage2DMultisample +GLAD_API_CALL PFNGLTEXIMAGE3DPROC glad_glTexImage3D; +#define glTexImage3D glad_glTexImage3D +GLAD_API_CALL PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample; +#define glTexImage3DMultisample glad_glTexImage3DMultisample +GLAD_API_CALL PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv; +#define glTexParameterIiv glad_glTexParameterIiv +GLAD_API_CALL PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv; +#define glTexParameterIuiv glad_glTexParameterIuiv +GLAD_API_CALL PFNGLTEXPARAMETERFPROC glad_glTexParameterf; +#define glTexParameterf glad_glTexParameterf +GLAD_API_CALL PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv; +#define glTexParameterfv glad_glTexParameterfv +GLAD_API_CALL PFNGLTEXPARAMETERIPROC glad_glTexParameteri; +#define glTexParameteri glad_glTexParameteri +GLAD_API_CALL PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv; +#define glTexParameteriv glad_glTexParameteriv +GLAD_API_CALL PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D; +#define glTexSubImage1D glad_glTexSubImage1D +GLAD_API_CALL PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D; +#define glTexSubImage2D glad_glTexSubImage2D +GLAD_API_CALL PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D; +#define glTexSubImage3D glad_glTexSubImage3D +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings; +#define glTransformFeedbackVaryings glad_glTransformFeedbackVaryings +GLAD_API_CALL PFNGLUNIFORM1FPROC glad_glUniform1f; +#define glUniform1f glad_glUniform1f +GLAD_API_CALL PFNGLUNIFORM1FVPROC glad_glUniform1fv; +#define glUniform1fv glad_glUniform1fv +GLAD_API_CALL PFNGLUNIFORM1IPROC glad_glUniform1i; +#define glUniform1i glad_glUniform1i +GLAD_API_CALL PFNGLUNIFORM1IVPROC glad_glUniform1iv; +#define glUniform1iv glad_glUniform1iv +GLAD_API_CALL PFNGLUNIFORM1UIPROC glad_glUniform1ui; +#define glUniform1ui glad_glUniform1ui +GLAD_API_CALL PFNGLUNIFORM1UIVPROC glad_glUniform1uiv; +#define glUniform1uiv glad_glUniform1uiv +GLAD_API_CALL PFNGLUNIFORM2FPROC glad_glUniform2f; +#define glUniform2f glad_glUniform2f +GLAD_API_CALL PFNGLUNIFORM2FVPROC glad_glUniform2fv; +#define glUniform2fv glad_glUniform2fv +GLAD_API_CALL PFNGLUNIFORM2IPROC glad_glUniform2i; +#define glUniform2i glad_glUniform2i +GLAD_API_CALL PFNGLUNIFORM2IVPROC glad_glUniform2iv; +#define glUniform2iv glad_glUniform2iv +GLAD_API_CALL PFNGLUNIFORM2UIPROC glad_glUniform2ui; +#define glUniform2ui glad_glUniform2ui +GLAD_API_CALL PFNGLUNIFORM2UIVPROC glad_glUniform2uiv; +#define glUniform2uiv glad_glUniform2uiv +GLAD_API_CALL PFNGLUNIFORM3FPROC glad_glUniform3f; +#define glUniform3f glad_glUniform3f +GLAD_API_CALL PFNGLUNIFORM3FVPROC glad_glUniform3fv; +#define glUniform3fv glad_glUniform3fv +GLAD_API_CALL PFNGLUNIFORM3IPROC glad_glUniform3i; +#define glUniform3i glad_glUniform3i +GLAD_API_CALL PFNGLUNIFORM3IVPROC glad_glUniform3iv; +#define glUniform3iv glad_glUniform3iv +GLAD_API_CALL PFNGLUNIFORM3UIPROC glad_glUniform3ui; +#define glUniform3ui glad_glUniform3ui +GLAD_API_CALL PFNGLUNIFORM3UIVPROC glad_glUniform3uiv; +#define glUniform3uiv glad_glUniform3uiv +GLAD_API_CALL PFNGLUNIFORM4FPROC glad_glUniform4f; +#define glUniform4f glad_glUniform4f +GLAD_API_CALL PFNGLUNIFORM4FVPROC glad_glUniform4fv; +#define glUniform4fv glad_glUniform4fv +GLAD_API_CALL PFNGLUNIFORM4IPROC glad_glUniform4i; +#define glUniform4i glad_glUniform4i +GLAD_API_CALL PFNGLUNIFORM4IVPROC glad_glUniform4iv; +#define glUniform4iv glad_glUniform4iv +GLAD_API_CALL PFNGLUNIFORM4UIPROC glad_glUniform4ui; +#define glUniform4ui glad_glUniform4ui +GLAD_API_CALL PFNGLUNIFORM4UIVPROC glad_glUniform4uiv; +#define glUniform4uiv glad_glUniform4uiv +GLAD_API_CALL PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding; +#define glUniformBlockBinding glad_glUniformBlockBinding +GLAD_API_CALL PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv; +#define glUniformMatrix2fv glad_glUniformMatrix2fv +GLAD_API_CALL PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv; +#define glUniformMatrix2x3fv glad_glUniformMatrix2x3fv +GLAD_API_CALL PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv; +#define glUniformMatrix2x4fv glad_glUniformMatrix2x4fv +GLAD_API_CALL PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv; +#define glUniformMatrix3fv glad_glUniformMatrix3fv +GLAD_API_CALL PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv; +#define glUniformMatrix3x2fv glad_glUniformMatrix3x2fv +GLAD_API_CALL PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv; +#define glUniformMatrix3x4fv glad_glUniformMatrix3x4fv +GLAD_API_CALL PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv; +#define glUniformMatrix4fv glad_glUniformMatrix4fv +GLAD_API_CALL PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv; +#define glUniformMatrix4x2fv glad_glUniformMatrix4x2fv +GLAD_API_CALL PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv; +#define glUniformMatrix4x3fv glad_glUniformMatrix4x3fv +GLAD_API_CALL PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer; +#define glUnmapBuffer glad_glUnmapBuffer +GLAD_API_CALL PFNGLUSEPROGRAMPROC glad_glUseProgram; +#define glUseProgram glad_glUseProgram +GLAD_API_CALL PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram; +#define glValidateProgram glad_glValidateProgram +GLAD_API_CALL PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d; +#define glVertexAttrib1d glad_glVertexAttrib1d +GLAD_API_CALL PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv; +#define glVertexAttrib1dv glad_glVertexAttrib1dv +GLAD_API_CALL PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f; +#define glVertexAttrib1f glad_glVertexAttrib1f +GLAD_API_CALL PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv; +#define glVertexAttrib1fv glad_glVertexAttrib1fv +GLAD_API_CALL PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s; +#define glVertexAttrib1s glad_glVertexAttrib1s +GLAD_API_CALL PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv; +#define glVertexAttrib1sv glad_glVertexAttrib1sv +GLAD_API_CALL PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d; +#define glVertexAttrib2d glad_glVertexAttrib2d +GLAD_API_CALL PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv; +#define glVertexAttrib2dv glad_glVertexAttrib2dv +GLAD_API_CALL PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f; +#define glVertexAttrib2f glad_glVertexAttrib2f +GLAD_API_CALL PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv; +#define glVertexAttrib2fv glad_glVertexAttrib2fv +GLAD_API_CALL PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s; +#define glVertexAttrib2s glad_glVertexAttrib2s +GLAD_API_CALL PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv; +#define glVertexAttrib2sv glad_glVertexAttrib2sv +GLAD_API_CALL PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d; +#define glVertexAttrib3d glad_glVertexAttrib3d +GLAD_API_CALL PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv; +#define glVertexAttrib3dv glad_glVertexAttrib3dv +GLAD_API_CALL PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f; +#define glVertexAttrib3f glad_glVertexAttrib3f +GLAD_API_CALL PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv; +#define glVertexAttrib3fv glad_glVertexAttrib3fv +GLAD_API_CALL PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s; +#define glVertexAttrib3s glad_glVertexAttrib3s +GLAD_API_CALL PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv; +#define glVertexAttrib3sv glad_glVertexAttrib3sv +GLAD_API_CALL PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv; +#define glVertexAttrib4Nbv glad_glVertexAttrib4Nbv +GLAD_API_CALL PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv; +#define glVertexAttrib4Niv glad_glVertexAttrib4Niv +GLAD_API_CALL PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv; +#define glVertexAttrib4Nsv glad_glVertexAttrib4Nsv +GLAD_API_CALL PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub; +#define glVertexAttrib4Nub glad_glVertexAttrib4Nub +GLAD_API_CALL PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv; +#define glVertexAttrib4Nubv glad_glVertexAttrib4Nubv +GLAD_API_CALL PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv; +#define glVertexAttrib4Nuiv glad_glVertexAttrib4Nuiv +GLAD_API_CALL PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv; +#define glVertexAttrib4Nusv glad_glVertexAttrib4Nusv +GLAD_API_CALL PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv; +#define glVertexAttrib4bv glad_glVertexAttrib4bv +GLAD_API_CALL PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d; +#define glVertexAttrib4d glad_glVertexAttrib4d +GLAD_API_CALL PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv; +#define glVertexAttrib4dv glad_glVertexAttrib4dv +GLAD_API_CALL PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f; +#define glVertexAttrib4f glad_glVertexAttrib4f +GLAD_API_CALL PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv; +#define glVertexAttrib4fv glad_glVertexAttrib4fv +GLAD_API_CALL PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv; +#define glVertexAttrib4iv glad_glVertexAttrib4iv +GLAD_API_CALL PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s; +#define glVertexAttrib4s glad_glVertexAttrib4s +GLAD_API_CALL PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv; +#define glVertexAttrib4sv glad_glVertexAttrib4sv +GLAD_API_CALL PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv; +#define glVertexAttrib4ubv glad_glVertexAttrib4ubv +GLAD_API_CALL PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv; +#define glVertexAttrib4uiv glad_glVertexAttrib4uiv +GLAD_API_CALL PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv; +#define glVertexAttrib4usv glad_glVertexAttrib4usv +GLAD_API_CALL PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor; +#define glVertexAttribDivisor glad_glVertexAttribDivisor +GLAD_API_CALL PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i; +#define glVertexAttribI1i glad_glVertexAttribI1i +GLAD_API_CALL PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv; +#define glVertexAttribI1iv glad_glVertexAttribI1iv +GLAD_API_CALL PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui; +#define glVertexAttribI1ui glad_glVertexAttribI1ui +GLAD_API_CALL PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv; +#define glVertexAttribI1uiv glad_glVertexAttribI1uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i; +#define glVertexAttribI2i glad_glVertexAttribI2i +GLAD_API_CALL PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv; +#define glVertexAttribI2iv glad_glVertexAttribI2iv +GLAD_API_CALL PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui; +#define glVertexAttribI2ui glad_glVertexAttribI2ui +GLAD_API_CALL PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv; +#define glVertexAttribI2uiv glad_glVertexAttribI2uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i; +#define glVertexAttribI3i glad_glVertexAttribI3i +GLAD_API_CALL PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv; +#define glVertexAttribI3iv glad_glVertexAttribI3iv +GLAD_API_CALL PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui; +#define glVertexAttribI3ui glad_glVertexAttribI3ui +GLAD_API_CALL PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv; +#define glVertexAttribI3uiv glad_glVertexAttribI3uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv; +#define glVertexAttribI4bv glad_glVertexAttribI4bv +GLAD_API_CALL PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i; +#define glVertexAttribI4i glad_glVertexAttribI4i +GLAD_API_CALL PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv; +#define glVertexAttribI4iv glad_glVertexAttribI4iv +GLAD_API_CALL PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv; +#define glVertexAttribI4sv glad_glVertexAttribI4sv +GLAD_API_CALL PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv; +#define glVertexAttribI4ubv glad_glVertexAttribI4ubv +GLAD_API_CALL PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui; +#define glVertexAttribI4ui glad_glVertexAttribI4ui +GLAD_API_CALL PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv; +#define glVertexAttribI4uiv glad_glVertexAttribI4uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv; +#define glVertexAttribI4usv glad_glVertexAttribI4usv +GLAD_API_CALL PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer; +#define glVertexAttribIPointer glad_glVertexAttribIPointer +GLAD_API_CALL PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui; +#define glVertexAttribP1ui glad_glVertexAttribP1ui +GLAD_API_CALL PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv; +#define glVertexAttribP1uiv glad_glVertexAttribP1uiv +GLAD_API_CALL PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui; +#define glVertexAttribP2ui glad_glVertexAttribP2ui +GLAD_API_CALL PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv; +#define glVertexAttribP2uiv glad_glVertexAttribP2uiv +GLAD_API_CALL PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui; +#define glVertexAttribP3ui glad_glVertexAttribP3ui +GLAD_API_CALL PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv; +#define glVertexAttribP3uiv glad_glVertexAttribP3uiv +GLAD_API_CALL PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui; +#define glVertexAttribP4ui glad_glVertexAttribP4ui +GLAD_API_CALL PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv; +#define glVertexAttribP4uiv glad_glVertexAttribP4uiv +GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer; +#define glVertexAttribPointer glad_glVertexAttribPointer +GLAD_API_CALL PFNGLVIEWPORTPROC glad_glViewport; +#define glViewport glad_glViewport +GLAD_API_CALL PFNGLWAITSYNCPROC glad_glWaitSync; +#define glWaitSync glad_glWaitSync + + + + + +GLAD_API_CALL int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr); +GLAD_API_CALL int gladLoadGL( GLADloadfunc load); + + +#ifdef GLAD_GL + +GLAD_API_CALL int gladLoaderLoadGL(void); +GLAD_API_CALL void gladLoaderUnloadGL(void); + +#endif + +#ifdef __cplusplus +} +#endif +#endif + +/* Source */ +#ifdef GLAD_GL_IMPLEMENTATION +#include +#include +#include + +#ifndef GLAD_IMPL_UTIL_C_ +#define GLAD_IMPL_UTIL_C_ + +#ifdef _MSC_VER +#define GLAD_IMPL_UTIL_SSCANF sscanf_s +#else +#define GLAD_IMPL_UTIL_SSCANF sscanf +#endif + +#endif /* GLAD_IMPL_UTIL_C_ */ + +#ifdef __cplusplus +extern "C" { +#endif + + + +int GLAD_GL_VERSION_1_0 = 0; +int GLAD_GL_VERSION_1_1 = 0; +int GLAD_GL_VERSION_1_2 = 0; +int GLAD_GL_VERSION_1_3 = 0; +int GLAD_GL_VERSION_1_4 = 0; +int GLAD_GL_VERSION_1_5 = 0; +int GLAD_GL_VERSION_2_0 = 0; +int GLAD_GL_VERSION_2_1 = 0; +int GLAD_GL_VERSION_3_0 = 0; +int GLAD_GL_VERSION_3_1 = 0; +int GLAD_GL_VERSION_3_2 = 0; +int GLAD_GL_VERSION_3_3 = 0; + + + +PFNGLACTIVETEXTUREPROC glad_glActiveTexture = NULL; +PFNGLATTACHSHADERPROC glad_glAttachShader = NULL; +PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender = NULL; +PFNGLBEGINQUERYPROC glad_glBeginQuery = NULL; +PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback = NULL; +PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation = NULL; +PFNGLBINDBUFFERPROC glad_glBindBuffer = NULL; +PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase = NULL; +PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange = NULL; +PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation = NULL; +PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed = NULL; +PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer = NULL; +PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer = NULL; +PFNGLBINDSAMPLERPROC glad_glBindSampler = NULL; +PFNGLBINDTEXTUREPROC glad_glBindTexture = NULL; +PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray = NULL; +PFNGLBLENDCOLORPROC glad_glBlendColor = NULL; +PFNGLBLENDEQUATIONPROC glad_glBlendEquation = NULL; +PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate = NULL; +PFNGLBLENDFUNCPROC glad_glBlendFunc = NULL; +PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate = NULL; +PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer = NULL; +PFNGLBUFFERDATAPROC glad_glBufferData = NULL; +PFNGLBUFFERSUBDATAPROC glad_glBufferSubData = NULL; +PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus = NULL; +PFNGLCLAMPCOLORPROC glad_glClampColor = NULL; +PFNGLCLEARPROC glad_glClear = NULL; +PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi = NULL; +PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv = NULL; +PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv = NULL; +PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv = NULL; +PFNGLCLEARCOLORPROC glad_glClearColor = NULL; +PFNGLCLEARDEPTHPROC glad_glClearDepth = NULL; +PFNGLCLEARSTENCILPROC glad_glClearStencil = NULL; +PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync = NULL; +PFNGLCOLORMASKPROC glad_glColorMask = NULL; +PFNGLCOLORMASKIPROC glad_glColorMaski = NULL; +PFNGLCOMPILESHADERPROC glad_glCompileShader = NULL; +PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D = NULL; +PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D = NULL; +PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D = NULL; +PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData = NULL; +PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D = NULL; +PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D = NULL; +PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D = NULL; +PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D = NULL; +PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D = NULL; +PFNGLCREATEPROGRAMPROC glad_glCreateProgram = NULL; +PFNGLCREATESHADERPROC glad_glCreateShader = NULL; +PFNGLCULLFACEPROC glad_glCullFace = NULL; +PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers = NULL; +PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers = NULL; +PFNGLDELETEPROGRAMPROC glad_glDeleteProgram = NULL; +PFNGLDELETEQUERIESPROC glad_glDeleteQueries = NULL; +PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers = NULL; +PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers = NULL; +PFNGLDELETESHADERPROC glad_glDeleteShader = NULL; +PFNGLDELETESYNCPROC glad_glDeleteSync = NULL; +PFNGLDELETETEXTURESPROC glad_glDeleteTextures = NULL; +PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays = NULL; +PFNGLDEPTHFUNCPROC glad_glDepthFunc = NULL; +PFNGLDEPTHMASKPROC glad_glDepthMask = NULL; +PFNGLDEPTHRANGEPROC glad_glDepthRange = NULL; +PFNGLDETACHSHADERPROC glad_glDetachShader = NULL; +PFNGLDISABLEPROC glad_glDisable = NULL; +PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray = NULL; +PFNGLDISABLEIPROC glad_glDisablei = NULL; +PFNGLDRAWARRAYSPROC glad_glDrawArrays = NULL; +PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced = NULL; +PFNGLDRAWBUFFERPROC glad_glDrawBuffer = NULL; +PFNGLDRAWBUFFERSPROC glad_glDrawBuffers = NULL; +PFNGLDRAWELEMENTSPROC glad_glDrawElements = NULL; +PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex = NULL; +PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex = NULL; +PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements = NULL; +PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex = NULL; +PFNGLENABLEPROC glad_glEnable = NULL; +PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray = NULL; +PFNGLENABLEIPROC glad_glEnablei = NULL; +PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender = NULL; +PFNGLENDQUERYPROC glad_glEndQuery = NULL; +PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback = NULL; +PFNGLFENCESYNCPROC glad_glFenceSync = NULL; +PFNGLFINISHPROC glad_glFinish = NULL; +PFNGLFLUSHPROC glad_glFlush = NULL; +PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange = NULL; +PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer = NULL; +PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture = NULL; +PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D = NULL; +PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D = NULL; +PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D = NULL; +PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer = NULL; +PFNGLFRONTFACEPROC glad_glFrontFace = NULL; +PFNGLGENBUFFERSPROC glad_glGenBuffers = NULL; +PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers = NULL; +PFNGLGENQUERIESPROC glad_glGenQueries = NULL; +PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers = NULL; +PFNGLGENSAMPLERSPROC glad_glGenSamplers = NULL; +PFNGLGENTEXTURESPROC glad_glGenTextures = NULL; +PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays = NULL; +PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap = NULL; +PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib = NULL; +PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform = NULL; +PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName = NULL; +PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv = NULL; +PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName = NULL; +PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv = NULL; +PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders = NULL; +PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation = NULL; +PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v = NULL; +PFNGLGETBOOLEANVPROC glad_glGetBooleanv = NULL; +PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v = NULL; +PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv = NULL; +PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv = NULL; +PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData = NULL; +PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage = NULL; +PFNGLGETDOUBLEVPROC glad_glGetDoublev = NULL; +PFNGLGETERRORPROC glad_glGetError = NULL; +PFNGLGETFLOATVPROC glad_glGetFloatv = NULL; +PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex = NULL; +PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation = NULL; +PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv = NULL; +PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v = NULL; +PFNGLGETINTEGER64VPROC glad_glGetInteger64v = NULL; +PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v = NULL; +PFNGLGETINTEGERVPROC glad_glGetIntegerv = NULL; +PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv = NULL; +PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog = NULL; +PFNGLGETPROGRAMIVPROC glad_glGetProgramiv = NULL; +PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v = NULL; +PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv = NULL; +PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v = NULL; +PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv = NULL; +PFNGLGETQUERYIVPROC glad_glGetQueryiv = NULL; +PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv = NULL; +PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv = NULL; +PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv = NULL; +PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv = NULL; +PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv = NULL; +PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog = NULL; +PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource = NULL; +PFNGLGETSHADERIVPROC glad_glGetShaderiv = NULL; +PFNGLGETSTRINGPROC glad_glGetString = NULL; +PFNGLGETSTRINGIPROC glad_glGetStringi = NULL; +PFNGLGETSYNCIVPROC glad_glGetSynciv = NULL; +PFNGLGETTEXIMAGEPROC glad_glGetTexImage = NULL; +PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv = NULL; +PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv = NULL; +PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv = NULL; +PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv = NULL; +PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv = NULL; +PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv = NULL; +PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying = NULL; +PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex = NULL; +PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices = NULL; +PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation = NULL; +PFNGLGETUNIFORMFVPROC glad_glGetUniformfv = NULL; +PFNGLGETUNIFORMIVPROC glad_glGetUniformiv = NULL; +PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv = NULL; +PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv = NULL; +PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv = NULL; +PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv = NULL; +PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv = NULL; +PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv = NULL; +PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv = NULL; +PFNGLHINTPROC glad_glHint = NULL; +PFNGLISBUFFERPROC glad_glIsBuffer = NULL; +PFNGLISENABLEDPROC glad_glIsEnabled = NULL; +PFNGLISENABLEDIPROC glad_glIsEnabledi = NULL; +PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer = NULL; +PFNGLISPROGRAMPROC glad_glIsProgram = NULL; +PFNGLISQUERYPROC glad_glIsQuery = NULL; +PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer = NULL; +PFNGLISSAMPLERPROC glad_glIsSampler = NULL; +PFNGLISSHADERPROC glad_glIsShader = NULL; +PFNGLISSYNCPROC glad_glIsSync = NULL; +PFNGLISTEXTUREPROC glad_glIsTexture = NULL; +PFNGLISVERTEXARRAYPROC glad_glIsVertexArray = NULL; +PFNGLLINEWIDTHPROC glad_glLineWidth = NULL; +PFNGLLINKPROGRAMPROC glad_glLinkProgram = NULL; +PFNGLLOGICOPPROC glad_glLogicOp = NULL; +PFNGLMAPBUFFERPROC glad_glMapBuffer = NULL; +PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange = NULL; +PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays = NULL; +PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements = NULL; +PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex = NULL; +PFNGLPIXELSTOREFPROC glad_glPixelStoref = NULL; +PFNGLPIXELSTOREIPROC glad_glPixelStorei = NULL; +PFNGLPOINTPARAMETERFPROC glad_glPointParameterf = NULL; +PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv = NULL; +PFNGLPOINTPARAMETERIPROC glad_glPointParameteri = NULL; +PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv = NULL; +PFNGLPOINTSIZEPROC glad_glPointSize = NULL; +PFNGLPOLYGONMODEPROC glad_glPolygonMode = NULL; +PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset = NULL; +PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex = NULL; +PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex = NULL; +PFNGLQUERYCOUNTERPROC glad_glQueryCounter = NULL; +PFNGLREADBUFFERPROC glad_glReadBuffer = NULL; +PFNGLREADPIXELSPROC glad_glReadPixels = NULL; +PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage = NULL; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample = NULL; +PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage = NULL; +PFNGLSAMPLEMASKIPROC glad_glSampleMaski = NULL; +PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv = NULL; +PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv = NULL; +PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf = NULL; +PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv = NULL; +PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri = NULL; +PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv = NULL; +PFNGLSCISSORPROC glad_glScissor = NULL; +PFNGLSHADERSOURCEPROC glad_glShaderSource = NULL; +PFNGLSTENCILFUNCPROC glad_glStencilFunc = NULL; +PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate = NULL; +PFNGLSTENCILMASKPROC glad_glStencilMask = NULL; +PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate = NULL; +PFNGLSTENCILOPPROC glad_glStencilOp = NULL; +PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate = NULL; +PFNGLTEXBUFFERPROC glad_glTexBuffer = NULL; +PFNGLTEXIMAGE1DPROC glad_glTexImage1D = NULL; +PFNGLTEXIMAGE2DPROC glad_glTexImage2D = NULL; +PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample = NULL; +PFNGLTEXIMAGE3DPROC glad_glTexImage3D = NULL; +PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample = NULL; +PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv = NULL; +PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv = NULL; +PFNGLTEXPARAMETERFPROC glad_glTexParameterf = NULL; +PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv = NULL; +PFNGLTEXPARAMETERIPROC glad_glTexParameteri = NULL; +PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv = NULL; +PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D = NULL; +PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D = NULL; +PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D = NULL; +PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings = NULL; +PFNGLUNIFORM1FPROC glad_glUniform1f = NULL; +PFNGLUNIFORM1FVPROC glad_glUniform1fv = NULL; +PFNGLUNIFORM1IPROC glad_glUniform1i = NULL; +PFNGLUNIFORM1IVPROC glad_glUniform1iv = NULL; +PFNGLUNIFORM1UIPROC glad_glUniform1ui = NULL; +PFNGLUNIFORM1UIVPROC glad_glUniform1uiv = NULL; +PFNGLUNIFORM2FPROC glad_glUniform2f = NULL; +PFNGLUNIFORM2FVPROC glad_glUniform2fv = NULL; +PFNGLUNIFORM2IPROC glad_glUniform2i = NULL; +PFNGLUNIFORM2IVPROC glad_glUniform2iv = NULL; +PFNGLUNIFORM2UIPROC glad_glUniform2ui = NULL; +PFNGLUNIFORM2UIVPROC glad_glUniform2uiv = NULL; +PFNGLUNIFORM3FPROC glad_glUniform3f = NULL; +PFNGLUNIFORM3FVPROC glad_glUniform3fv = NULL; +PFNGLUNIFORM3IPROC glad_glUniform3i = NULL; +PFNGLUNIFORM3IVPROC glad_glUniform3iv = NULL; +PFNGLUNIFORM3UIPROC glad_glUniform3ui = NULL; +PFNGLUNIFORM3UIVPROC glad_glUniform3uiv = NULL; +PFNGLUNIFORM4FPROC glad_glUniform4f = NULL; +PFNGLUNIFORM4FVPROC glad_glUniform4fv = NULL; +PFNGLUNIFORM4IPROC glad_glUniform4i = NULL; +PFNGLUNIFORM4IVPROC glad_glUniform4iv = NULL; +PFNGLUNIFORM4UIPROC glad_glUniform4ui = NULL; +PFNGLUNIFORM4UIVPROC glad_glUniform4uiv = NULL; +PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding = NULL; +PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv = NULL; +PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv = NULL; +PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv = NULL; +PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv = NULL; +PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv = NULL; +PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv = NULL; +PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv = NULL; +PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv = NULL; +PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv = NULL; +PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer = NULL; +PFNGLUSEPROGRAMPROC glad_glUseProgram = NULL; +PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram = NULL; +PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d = NULL; +PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv = NULL; +PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f = NULL; +PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv = NULL; +PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s = NULL; +PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv = NULL; +PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d = NULL; +PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv = NULL; +PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f = NULL; +PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv = NULL; +PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s = NULL; +PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv = NULL; +PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d = NULL; +PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv = NULL; +PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f = NULL; +PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv = NULL; +PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s = NULL; +PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv = NULL; +PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv = NULL; +PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv = NULL; +PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv = NULL; +PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub = NULL; +PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv = NULL; +PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv = NULL; +PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv = NULL; +PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv = NULL; +PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d = NULL; +PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv = NULL; +PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f = NULL; +PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv = NULL; +PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv = NULL; +PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s = NULL; +PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv = NULL; +PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv = NULL; +PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv = NULL; +PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv = NULL; +PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor = NULL; +PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i = NULL; +PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv = NULL; +PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui = NULL; +PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv = NULL; +PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i = NULL; +PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv = NULL; +PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui = NULL; +PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv = NULL; +PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i = NULL; +PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv = NULL; +PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui = NULL; +PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv = NULL; +PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv = NULL; +PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i = NULL; +PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv = NULL; +PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv = NULL; +PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv = NULL; +PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui = NULL; +PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv = NULL; +PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv = NULL; +PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer = NULL; +PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui = NULL; +PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv = NULL; +PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui = NULL; +PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv = NULL; +PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui = NULL; +PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv = NULL; +PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui = NULL; +PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv = NULL; +PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer = NULL; +PFNGLVIEWPORTPROC glad_glViewport = NULL; +PFNGLWAITSYNCPROC glad_glWaitSync = NULL; + + +static void glad_gl_load_GL_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_0) return; + glad_glBlendFunc = (PFNGLBLENDFUNCPROC) load(userptr, "glBlendFunc"); + glad_glClear = (PFNGLCLEARPROC) load(userptr, "glClear"); + glad_glClearColor = (PFNGLCLEARCOLORPROC) load(userptr, "glClearColor"); + glad_glClearDepth = (PFNGLCLEARDEPTHPROC) load(userptr, "glClearDepth"); + glad_glClearStencil = (PFNGLCLEARSTENCILPROC) load(userptr, "glClearStencil"); + glad_glColorMask = (PFNGLCOLORMASKPROC) load(userptr, "glColorMask"); + glad_glCullFace = (PFNGLCULLFACEPROC) load(userptr, "glCullFace"); + glad_glDepthFunc = (PFNGLDEPTHFUNCPROC) load(userptr, "glDepthFunc"); + glad_glDepthMask = (PFNGLDEPTHMASKPROC) load(userptr, "glDepthMask"); + glad_glDepthRange = (PFNGLDEPTHRANGEPROC) load(userptr, "glDepthRange"); + glad_glDisable = (PFNGLDISABLEPROC) load(userptr, "glDisable"); + glad_glDrawBuffer = (PFNGLDRAWBUFFERPROC) load(userptr, "glDrawBuffer"); + glad_glEnable = (PFNGLENABLEPROC) load(userptr, "glEnable"); + glad_glFinish = (PFNGLFINISHPROC) load(userptr, "glFinish"); + glad_glFlush = (PFNGLFLUSHPROC) load(userptr, "glFlush"); + glad_glFrontFace = (PFNGLFRONTFACEPROC) load(userptr, "glFrontFace"); + glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(userptr, "glGetBooleanv"); + glad_glGetDoublev = (PFNGLGETDOUBLEVPROC) load(userptr, "glGetDoublev"); + glad_glGetError = (PFNGLGETERRORPROC) load(userptr, "glGetError"); + glad_glGetFloatv = (PFNGLGETFLOATVPROC) load(userptr, "glGetFloatv"); + glad_glGetIntegerv = (PFNGLGETINTEGERVPROC) load(userptr, "glGetIntegerv"); + glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); + glad_glGetTexImage = (PFNGLGETTEXIMAGEPROC) load(userptr, "glGetTexImage"); + glad_glGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC) load(userptr, "glGetTexLevelParameterfv"); + glad_glGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC) load(userptr, "glGetTexLevelParameteriv"); + glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(userptr, "glGetTexParameterfv"); + glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(userptr, "glGetTexParameteriv"); + glad_glHint = (PFNGLHINTPROC) load(userptr, "glHint"); + glad_glIsEnabled = (PFNGLISENABLEDPROC) load(userptr, "glIsEnabled"); + glad_glLineWidth = (PFNGLLINEWIDTHPROC) load(userptr, "glLineWidth"); + glad_glLogicOp = (PFNGLLOGICOPPROC) load(userptr, "glLogicOp"); + glad_glPixelStoref = (PFNGLPIXELSTOREFPROC) load(userptr, "glPixelStoref"); + glad_glPixelStorei = (PFNGLPIXELSTOREIPROC) load(userptr, "glPixelStorei"); + glad_glPointSize = (PFNGLPOINTSIZEPROC) load(userptr, "glPointSize"); + glad_glPolygonMode = (PFNGLPOLYGONMODEPROC) load(userptr, "glPolygonMode"); + glad_glReadBuffer = (PFNGLREADBUFFERPROC) load(userptr, "glReadBuffer"); + glad_glReadPixels = (PFNGLREADPIXELSPROC) load(userptr, "glReadPixels"); + glad_glScissor = (PFNGLSCISSORPROC) load(userptr, "glScissor"); + glad_glStencilFunc = (PFNGLSTENCILFUNCPROC) load(userptr, "glStencilFunc"); + glad_glStencilMask = (PFNGLSTENCILMASKPROC) load(userptr, "glStencilMask"); + glad_glStencilOp = (PFNGLSTENCILOPPROC) load(userptr, "glStencilOp"); + glad_glTexImage1D = (PFNGLTEXIMAGE1DPROC) load(userptr, "glTexImage1D"); + glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC) load(userptr, "glTexImage2D"); + glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC) load(userptr, "glTexParameterf"); + glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC) load(userptr, "glTexParameterfv"); + glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC) load(userptr, "glTexParameteri"); + glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC) load(userptr, "glTexParameteriv"); + glad_glViewport = (PFNGLVIEWPORTPROC) load(userptr, "glViewport"); +} +static void glad_gl_load_GL_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_1) return; + glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture"); + glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC) load(userptr, "glCopyTexImage1D"); + glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D"); + glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC) load(userptr, "glCopyTexSubImage1D"); + glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D"); + glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(userptr, "glDeleteTextures"); + glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays"); + glad_glDrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements"); + glad_glGenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures"); + glad_glIsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture"); + glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC) load(userptr, "glPolygonOffset"); + glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) load(userptr, "glTexSubImage1D"); + glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D"); +} +static void glad_gl_load_GL_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_2) return; + glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) load(userptr, "glCopyTexSubImage3D"); + glad_glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC) load(userptr, "glDrawRangeElements"); + glad_glTexImage3D = (PFNGLTEXIMAGE3DPROC) load(userptr, "glTexImage3D"); + glad_glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC) load(userptr, "glTexSubImage3D"); +} +static void glad_gl_load_GL_VERSION_1_3( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_3) return; + glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture"); + glad_glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC) load(userptr, "glCompressedTexImage1D"); + glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) load(userptr, "glCompressedTexImage2D"); + glad_glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC) load(userptr, "glCompressedTexImage3D"); + glad_glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) load(userptr, "glCompressedTexSubImage1D"); + glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) load(userptr, "glCompressedTexSubImage2D"); + glad_glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) load(userptr, "glCompressedTexSubImage3D"); + glad_glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC) load(userptr, "glGetCompressedTexImage"); + glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC) load(userptr, "glSampleCoverage"); +} +static void glad_gl_load_GL_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_4) return; + glad_glBlendColor = (PFNGLBLENDCOLORPROC) load(userptr, "glBlendColor"); + glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation"); + glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate"); + glad_glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC) load(userptr, "glMultiDrawArrays"); + glad_glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC) load(userptr, "glMultiDrawElements"); + glad_glPointParameterf = (PFNGLPOINTPARAMETERFPROC) load(userptr, "glPointParameterf"); + glad_glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC) load(userptr, "glPointParameterfv"); + glad_glPointParameteri = (PFNGLPOINTPARAMETERIPROC) load(userptr, "glPointParameteri"); + glad_glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC) load(userptr, "glPointParameteriv"); +} +static void glad_gl_load_GL_VERSION_1_5( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_5) return; + glad_glBeginQuery = (PFNGLBEGINQUERYPROC) load(userptr, "glBeginQuery"); + glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer"); + glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData"); + glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData"); + glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers"); + glad_glDeleteQueries = (PFNGLDELETEQUERIESPROC) load(userptr, "glDeleteQueries"); + glad_glEndQuery = (PFNGLENDQUERYPROC) load(userptr, "glEndQuery"); + glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers"); + glad_glGenQueries = (PFNGLGENQUERIESPROC) load(userptr, "glGenQueries"); + glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv"); + glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC) load(userptr, "glGetBufferPointerv"); + glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC) load(userptr, "glGetBufferSubData"); + glad_glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC) load(userptr, "glGetQueryObjectiv"); + glad_glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC) load(userptr, "glGetQueryObjectuiv"); + glad_glGetQueryiv = (PFNGLGETQUERYIVPROC) load(userptr, "glGetQueryiv"); + glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer"); + glad_glIsQuery = (PFNGLISQUERYPROC) load(userptr, "glIsQuery"); + glad_glMapBuffer = (PFNGLMAPBUFFERPROC) load(userptr, "glMapBuffer"); + glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC) load(userptr, "glUnmapBuffer"); +} +static void glad_gl_load_GL_VERSION_2_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_2_0) return; + glad_glAttachShader = (PFNGLATTACHSHADERPROC) load(userptr, "glAttachShader"); + glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) load(userptr, "glBindAttribLocation"); + glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) load(userptr, "glBlendEquationSeparate"); + glad_glCompileShader = (PFNGLCOMPILESHADERPROC) load(userptr, "glCompileShader"); + glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC) load(userptr, "glCreateProgram"); + glad_glCreateShader = (PFNGLCREATESHADERPROC) load(userptr, "glCreateShader"); + glad_glDeleteProgram = (PFNGLDELETEPROGRAMPROC) load(userptr, "glDeleteProgram"); + glad_glDeleteShader = (PFNGLDELETESHADERPROC) load(userptr, "glDeleteShader"); + glad_glDetachShader = (PFNGLDETACHSHADERPROC) load(userptr, "glDetachShader"); + glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray"); + glad_glDrawBuffers = (PFNGLDRAWBUFFERSPROC) load(userptr, "glDrawBuffers"); + glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray"); + glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) load(userptr, "glGetActiveAttrib"); + glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) load(userptr, "glGetActiveUniform"); + glad_glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC) load(userptr, "glGetAttachedShaders"); + glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) load(userptr, "glGetAttribLocation"); + glad_glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) load(userptr, "glGetProgramInfoLog"); + glad_glGetProgramiv = (PFNGLGETPROGRAMIVPROC) load(userptr, "glGetProgramiv"); + glad_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) load(userptr, "glGetShaderInfoLog"); + glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC) load(userptr, "glGetShaderSource"); + glad_glGetShaderiv = (PFNGLGETSHADERIVPROC) load(userptr, "glGetShaderiv"); + glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) load(userptr, "glGetUniformLocation"); + glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC) load(userptr, "glGetUniformfv"); + glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC) load(userptr, "glGetUniformiv"); + glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv"); + glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv"); + glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv"); + glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv"); + glad_glIsProgram = (PFNGLISPROGRAMPROC) load(userptr, "glIsProgram"); + glad_glIsShader = (PFNGLISSHADERPROC) load(userptr, "glIsShader"); + glad_glLinkProgram = (PFNGLLINKPROGRAMPROC) load(userptr, "glLinkProgram"); + glad_glShaderSource = (PFNGLSHADERSOURCEPROC) load(userptr, "glShaderSource"); + glad_glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC) load(userptr, "glStencilFuncSeparate"); + glad_glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC) load(userptr, "glStencilMaskSeparate"); + glad_glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC) load(userptr, "glStencilOpSeparate"); + glad_glUniform1f = (PFNGLUNIFORM1FPROC) load(userptr, "glUniform1f"); + glad_glUniform1fv = (PFNGLUNIFORM1FVPROC) load(userptr, "glUniform1fv"); + glad_glUniform1i = (PFNGLUNIFORM1IPROC) load(userptr, "glUniform1i"); + glad_glUniform1iv = (PFNGLUNIFORM1IVPROC) load(userptr, "glUniform1iv"); + glad_glUniform2f = (PFNGLUNIFORM2FPROC) load(userptr, "glUniform2f"); + glad_glUniform2fv = (PFNGLUNIFORM2FVPROC) load(userptr, "glUniform2fv"); + glad_glUniform2i = (PFNGLUNIFORM2IPROC) load(userptr, "glUniform2i"); + glad_glUniform2iv = (PFNGLUNIFORM2IVPROC) load(userptr, "glUniform2iv"); + glad_glUniform3f = (PFNGLUNIFORM3FPROC) load(userptr, "glUniform3f"); + glad_glUniform3fv = (PFNGLUNIFORM3FVPROC) load(userptr, "glUniform3fv"); + glad_glUniform3i = (PFNGLUNIFORM3IPROC) load(userptr, "glUniform3i"); + glad_glUniform3iv = (PFNGLUNIFORM3IVPROC) load(userptr, "glUniform3iv"); + glad_glUniform4f = (PFNGLUNIFORM4FPROC) load(userptr, "glUniform4f"); + glad_glUniform4fv = (PFNGLUNIFORM4FVPROC) load(userptr, "glUniform4fv"); + glad_glUniform4i = (PFNGLUNIFORM4IPROC) load(userptr, "glUniform4i"); + glad_glUniform4iv = (PFNGLUNIFORM4IVPROC) load(userptr, "glUniform4iv"); + glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) load(userptr, "glUniformMatrix2fv"); + glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) load(userptr, "glUniformMatrix3fv"); + glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) load(userptr, "glUniformMatrix4fv"); + glad_glUseProgram = (PFNGLUSEPROGRAMPROC) load(userptr, "glUseProgram"); + glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) load(userptr, "glValidateProgram"); + glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d"); + glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv"); + glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f"); + glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv"); + glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s"); + glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv"); + glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d"); + glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv"); + glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f"); + glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv"); + glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s"); + glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv"); + glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d"); + glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv"); + glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f"); + glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv"); + glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s"); + glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv"); + glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load(userptr, "glVertexAttrib4Nbv"); + glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load(userptr, "glVertexAttrib4Niv"); + glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load(userptr, "glVertexAttrib4Nsv"); + glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub"); + glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv"); + glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load(userptr, "glVertexAttrib4Nuiv"); + glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load(userptr, "glVertexAttrib4Nusv"); + glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load(userptr, "glVertexAttrib4bv"); + glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d"); + glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv"); + glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f"); + glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv"); + glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load(userptr, "glVertexAttrib4iv"); + glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s"); + glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv"); + glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load(userptr, "glVertexAttrib4ubv"); + glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load(userptr, "glVertexAttrib4uiv"); + glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load(userptr, "glVertexAttrib4usv"); + glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer"); +} +static void glad_gl_load_GL_VERSION_2_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_2_1) return; + glad_glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC) load(userptr, "glUniformMatrix2x3fv"); + glad_glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC) load(userptr, "glUniformMatrix2x4fv"); + glad_glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC) load(userptr, "glUniformMatrix3x2fv"); + glad_glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC) load(userptr, "glUniformMatrix3x4fv"); + glad_glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC) load(userptr, "glUniformMatrix4x2fv"); + glad_glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC) load(userptr, "glUniformMatrix4x3fv"); +} +static void glad_gl_load_GL_VERSION_3_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_3_0) return; + glad_glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC) load(userptr, "glBeginConditionalRender"); + glad_glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC) load(userptr, "glBeginTransformFeedback"); + glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase"); + glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange"); + glad_glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC) load(userptr, "glBindFragDataLocation"); + glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load(userptr, "glBindFramebuffer"); + glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) load(userptr, "glBindRenderbuffer"); + glad_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) load(userptr, "glBindVertexArray"); + glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer"); + glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus"); + glad_glClampColor = (PFNGLCLAMPCOLORPROC) load(userptr, "glClampColor"); + glad_glClearBufferfi = (PFNGLCLEARBUFFERFIPROC) load(userptr, "glClearBufferfi"); + glad_glClearBufferfv = (PFNGLCLEARBUFFERFVPROC) load(userptr, "glClearBufferfv"); + glad_glClearBufferiv = (PFNGLCLEARBUFFERIVPROC) load(userptr, "glClearBufferiv"); + glad_glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC) load(userptr, "glClearBufferuiv"); + glad_glColorMaski = (PFNGLCOLORMASKIPROC) load(userptr, "glColorMaski"); + glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers"); + glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers"); + glad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) load(userptr, "glDeleteVertexArrays"); + glad_glDisablei = (PFNGLDISABLEIPROC) load(userptr, "glDisablei"); + glad_glEnablei = (PFNGLENABLEIPROC) load(userptr, "glEnablei"); + glad_glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC) load(userptr, "glEndConditionalRender"); + glad_glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC) load(userptr, "glEndTransformFeedback"); + glad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) load(userptr, "glFlushMappedBufferRange"); + glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer"); + glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(userptr, "glFramebufferTexture1D"); + glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D"); + glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(userptr, "glFramebufferTexture3D"); + glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer"); + glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers"); + glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers"); + glad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) load(userptr, "glGenVertexArrays"); + glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap"); + glad_glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC) load(userptr, "glGetBooleani_v"); + glad_glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC) load(userptr, "glGetFragDataLocation"); + glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv"); + glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v"); + glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv"); + glad_glGetStringi = (PFNGLGETSTRINGIPROC) load(userptr, "glGetStringi"); + glad_glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC) load(userptr, "glGetTexParameterIiv"); + glad_glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC) load(userptr, "glGetTexParameterIuiv"); + glad_glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) load(userptr, "glGetTransformFeedbackVarying"); + glad_glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC) load(userptr, "glGetUniformuiv"); + glad_glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC) load(userptr, "glGetVertexAttribIiv"); + glad_glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC) load(userptr, "glGetVertexAttribIuiv"); + glad_glIsEnabledi = (PFNGLISENABLEDIPROC) load(userptr, "glIsEnabledi"); + glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer"); + glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer"); + glad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC) load(userptr, "glIsVertexArray"); + glad_glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) load(userptr, "glMapBufferRange"); + glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage"); + glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample"); + glad_glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC) load(userptr, "glTexParameterIiv"); + glad_glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC) load(userptr, "glTexParameterIuiv"); + glad_glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC) load(userptr, "glTransformFeedbackVaryings"); + glad_glUniform1ui = (PFNGLUNIFORM1UIPROC) load(userptr, "glUniform1ui"); + glad_glUniform1uiv = (PFNGLUNIFORM1UIVPROC) load(userptr, "glUniform1uiv"); + glad_glUniform2ui = (PFNGLUNIFORM2UIPROC) load(userptr, "glUniform2ui"); + glad_glUniform2uiv = (PFNGLUNIFORM2UIVPROC) load(userptr, "glUniform2uiv"); + glad_glUniform3ui = (PFNGLUNIFORM3UIPROC) load(userptr, "glUniform3ui"); + glad_glUniform3uiv = (PFNGLUNIFORM3UIVPROC) load(userptr, "glUniform3uiv"); + glad_glUniform4ui = (PFNGLUNIFORM4UIPROC) load(userptr, "glUniform4ui"); + glad_glUniform4uiv = (PFNGLUNIFORM4UIVPROC) load(userptr, "glUniform4uiv"); + glad_glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC) load(userptr, "glVertexAttribI1i"); + glad_glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC) load(userptr, "glVertexAttribI1iv"); + glad_glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC) load(userptr, "glVertexAttribI1ui"); + glad_glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC) load(userptr, "glVertexAttribI1uiv"); + glad_glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC) load(userptr, "glVertexAttribI2i"); + glad_glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC) load(userptr, "glVertexAttribI2iv"); + glad_glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC) load(userptr, "glVertexAttribI2ui"); + glad_glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC) load(userptr, "glVertexAttribI2uiv"); + glad_glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC) load(userptr, "glVertexAttribI3i"); + glad_glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC) load(userptr, "glVertexAttribI3iv"); + glad_glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC) load(userptr, "glVertexAttribI3ui"); + glad_glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC) load(userptr, "glVertexAttribI3uiv"); + glad_glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC) load(userptr, "glVertexAttribI4bv"); + glad_glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC) load(userptr, "glVertexAttribI4i"); + glad_glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC) load(userptr, "glVertexAttribI4iv"); + glad_glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC) load(userptr, "glVertexAttribI4sv"); + glad_glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC) load(userptr, "glVertexAttribI4ubv"); + glad_glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC) load(userptr, "glVertexAttribI4ui"); + glad_glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC) load(userptr, "glVertexAttribI4uiv"); + glad_glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC) load(userptr, "glVertexAttribI4usv"); + glad_glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC) load(userptr, "glVertexAttribIPointer"); +} +static void glad_gl_load_GL_VERSION_3_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_3_1) return; + glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase"); + glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange"); + glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) load(userptr, "glCopyBufferSubData"); + glad_glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC) load(userptr, "glDrawArraysInstanced"); + glad_glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC) load(userptr, "glDrawElementsInstanced"); + glad_glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) load(userptr, "glGetActiveUniformBlockName"); + glad_glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC) load(userptr, "glGetActiveUniformBlockiv"); + glad_glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC) load(userptr, "glGetActiveUniformName"); + glad_glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC) load(userptr, "glGetActiveUniformsiv"); + glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v"); + glad_glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC) load(userptr, "glGetUniformBlockIndex"); + glad_glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC) load(userptr, "glGetUniformIndices"); + glad_glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC) load(userptr, "glPrimitiveRestartIndex"); + glad_glTexBuffer = (PFNGLTEXBUFFERPROC) load(userptr, "glTexBuffer"); + glad_glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC) load(userptr, "glUniformBlockBinding"); +} +static void glad_gl_load_GL_VERSION_3_2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_3_2) return; + glad_glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) load(userptr, "glClientWaitSync"); + glad_glDeleteSync = (PFNGLDELETESYNCPROC) load(userptr, "glDeleteSync"); + glad_glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glDrawElementsBaseVertex"); + glad_glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) load(userptr, "glDrawElementsInstancedBaseVertex"); + glad_glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) load(userptr, "glDrawRangeElementsBaseVertex"); + glad_glFenceSync = (PFNGLFENCESYNCPROC) load(userptr, "glFenceSync"); + glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(userptr, "glFramebufferTexture"); + glad_glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC) load(userptr, "glGetBufferParameteri64v"); + glad_glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC) load(userptr, "glGetInteger64i_v"); + glad_glGetInteger64v = (PFNGLGETINTEGER64VPROC) load(userptr, "glGetInteger64v"); + glad_glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) load(userptr, "glGetMultisamplefv"); + glad_glGetSynciv = (PFNGLGETSYNCIVPROC) load(userptr, "glGetSynciv"); + glad_glIsSync = (PFNGLISSYNCPROC) load(userptr, "glIsSync"); + glad_glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glMultiDrawElementsBaseVertex"); + glad_glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC) load(userptr, "glProvokingVertex"); + glad_glSampleMaski = (PFNGLSAMPLEMASKIPROC) load(userptr, "glSampleMaski"); + glad_glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) load(userptr, "glTexImage2DMultisample"); + glad_glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) load(userptr, "glTexImage3DMultisample"); + glad_glWaitSync = (PFNGLWAITSYNCPROC) load(userptr, "glWaitSync"); +} +static void glad_gl_load_GL_VERSION_3_3( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_3_3) return; + glad_glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) load(userptr, "glBindFragDataLocationIndexed"); + glad_glBindSampler = (PFNGLBINDSAMPLERPROC) load(userptr, "glBindSampler"); + glad_glDeleteSamplers = (PFNGLDELETESAMPLERSPROC) load(userptr, "glDeleteSamplers"); + glad_glGenSamplers = (PFNGLGENSAMPLERSPROC) load(userptr, "glGenSamplers"); + glad_glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC) load(userptr, "glGetFragDataIndex"); + glad_glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC) load(userptr, "glGetQueryObjecti64v"); + glad_glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC) load(userptr, "glGetQueryObjectui64v"); + glad_glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC) load(userptr, "glGetSamplerParameterIiv"); + glad_glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC) load(userptr, "glGetSamplerParameterIuiv"); + glad_glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC) load(userptr, "glGetSamplerParameterfv"); + glad_glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC) load(userptr, "glGetSamplerParameteriv"); + glad_glIsSampler = (PFNGLISSAMPLERPROC) load(userptr, "glIsSampler"); + glad_glQueryCounter = (PFNGLQUERYCOUNTERPROC) load(userptr, "glQueryCounter"); + glad_glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC) load(userptr, "glSamplerParameterIiv"); + glad_glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC) load(userptr, "glSamplerParameterIuiv"); + glad_glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC) load(userptr, "glSamplerParameterf"); + glad_glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC) load(userptr, "glSamplerParameterfv"); + glad_glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC) load(userptr, "glSamplerParameteri"); + glad_glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC) load(userptr, "glSamplerParameteriv"); + glad_glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC) load(userptr, "glVertexAttribDivisor"); + glad_glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC) load(userptr, "glVertexAttribP1ui"); + glad_glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC) load(userptr, "glVertexAttribP1uiv"); + glad_glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC) load(userptr, "glVertexAttribP2ui"); + glad_glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC) load(userptr, "glVertexAttribP2uiv"); + glad_glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC) load(userptr, "glVertexAttribP3ui"); + glad_glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC) load(userptr, "glVertexAttribP3uiv"); + glad_glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC) load(userptr, "glVertexAttribP4ui"); + glad_glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC) load(userptr, "glVertexAttribP4uiv"); +} + + + +#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0) +#define GLAD_GL_IS_SOME_NEW_VERSION 1 +#else +#define GLAD_GL_IS_SOME_NEW_VERSION 0 +#endif + +static int glad_gl_get_extensions( int version, const char **out_exts, unsigned int *out_num_exts_i, char ***out_exts_i) { +#if GLAD_GL_IS_SOME_NEW_VERSION + if(GLAD_VERSION_MAJOR(version) < 3) { +#else + (void) version; + (void) out_num_exts_i; + (void) out_exts_i; +#endif + if (glad_glGetString == NULL) { + return 0; + } + *out_exts = (const char *)glad_glGetString(GL_EXTENSIONS); +#if GLAD_GL_IS_SOME_NEW_VERSION + } else { + unsigned int index = 0; + unsigned int num_exts_i = 0; + char **exts_i = NULL; + if (glad_glGetStringi == NULL || glad_glGetIntegerv == NULL) { + return 0; + } + glad_glGetIntegerv(GL_NUM_EXTENSIONS, (int*) &num_exts_i); + if (num_exts_i > 0) { + exts_i = (char **) malloc(num_exts_i * (sizeof *exts_i)); + } + if (exts_i == NULL) { + return 0; + } + for(index = 0; index < num_exts_i; index++) { + const char *gl_str_tmp = (const char*) glad_glGetStringi(GL_EXTENSIONS, index); + size_t len = strlen(gl_str_tmp) + 1; + + char *local_str = (char*) malloc(len * sizeof(char)); + if(local_str != NULL) { + memcpy(local_str, gl_str_tmp, len * sizeof(char)); + } + + exts_i[index] = local_str; + } + + *out_num_exts_i = num_exts_i; + *out_exts_i = exts_i; + } +#endif + return 1; +} +static void glad_gl_free_extensions(char **exts_i, unsigned int num_exts_i) { + if (exts_i != NULL) { + unsigned int index; + for(index = 0; index < num_exts_i; index++) { + free((void *) (exts_i[index])); + } + free((void *)exts_i); + exts_i = NULL; + } +} +static int glad_gl_has_extension(int version, const char *exts, unsigned int num_exts_i, char **exts_i, const char *ext) { + if(GLAD_VERSION_MAJOR(version) < 3 || !GLAD_GL_IS_SOME_NEW_VERSION) { + const char *extensions; + const char *loc; + const char *terminator; + extensions = exts; + if(extensions == NULL || ext == NULL) { + return 0; + } + while(1) { + loc = strstr(extensions, ext); + if(loc == NULL) { + return 0; + } + terminator = loc + strlen(ext); + if((loc == extensions || *(loc - 1) == ' ') && + (*terminator == ' ' || *terminator == '\0')) { + return 1; + } + extensions = terminator; + } + } else { + unsigned int index; + for(index = 0; index < num_exts_i; index++) { + const char *e = exts_i[index]; + if(strcmp(e, ext) == 0) { + return 1; + } + } + } + return 0; +} + +static GLADapiproc glad_gl_get_proc_from_userptr(void *userptr, const char* name) { + return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); +} + +static int glad_gl_find_extensions_gl( int version) { + const char *exts = NULL; + unsigned int num_exts_i = 0; + char **exts_i = NULL; + if (!glad_gl_get_extensions(version, &exts, &num_exts_i, &exts_i)) return 0; + + (void) glad_gl_has_extension; + + glad_gl_free_extensions(exts_i, num_exts_i); + + return 1; +} + +static int glad_gl_find_core_gl(void) { + int i; + const char* version; + const char* prefixes[] = { + "OpenGL ES-CM ", + "OpenGL ES-CL ", + "OpenGL ES ", + "OpenGL SC ", + NULL + }; + int major = 0; + int minor = 0; + version = (const char*) glad_glGetString(GL_VERSION); + if (!version) return 0; + for (i = 0; prefixes[i]; i++) { + const size_t length = strlen(prefixes[i]); + if (strncmp(version, prefixes[i], length) == 0) { + version += length; + break; + } + } + + GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor); + + GLAD_GL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; + GLAD_GL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1; + GLAD_GL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1; + GLAD_GL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1; + GLAD_GL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1; + GLAD_GL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1; + GLAD_GL_VERSION_2_0 = (major == 2 && minor >= 0) || major > 2; + GLAD_GL_VERSION_2_1 = (major == 2 && minor >= 1) || major > 2; + GLAD_GL_VERSION_3_0 = (major == 3 && minor >= 0) || major > 3; + GLAD_GL_VERSION_3_1 = (major == 3 && minor >= 1) || major > 3; + GLAD_GL_VERSION_3_2 = (major == 3 && minor >= 2) || major > 3; + GLAD_GL_VERSION_3_3 = (major == 3 && minor >= 3) || major > 3; + + return GLAD_MAKE_VERSION(major, minor); +} + +int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr) { + int version; + + glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); + if(glad_glGetString == NULL) return 0; + if(glad_glGetString(GL_VERSION) == NULL) return 0; + version = glad_gl_find_core_gl(); + + glad_gl_load_GL_VERSION_1_0(load, userptr); + glad_gl_load_GL_VERSION_1_1(load, userptr); + glad_gl_load_GL_VERSION_1_2(load, userptr); + glad_gl_load_GL_VERSION_1_3(load, userptr); + glad_gl_load_GL_VERSION_1_4(load, userptr); + glad_gl_load_GL_VERSION_1_5(load, userptr); + glad_gl_load_GL_VERSION_2_0(load, userptr); + glad_gl_load_GL_VERSION_2_1(load, userptr); + glad_gl_load_GL_VERSION_3_0(load, userptr); + glad_gl_load_GL_VERSION_3_1(load, userptr); + glad_gl_load_GL_VERSION_3_2(load, userptr); + glad_gl_load_GL_VERSION_3_3(load, userptr); + + if (!glad_gl_find_extensions_gl(version)) return 0; + + + + return version; +} + + +int gladLoadGL( GLADloadfunc load) { + return gladLoadGLUserPtr( glad_gl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); +} + + + + + +#ifdef GLAD_GL + +#ifndef GLAD_LOADER_LIBRARY_C_ +#define GLAD_LOADER_LIBRARY_C_ + +#include +#include + +#if GLAD_PLATFORM_WIN32 +#include +#else +#include +#endif + + +static void* glad_get_dlopen_handle(const char *lib_names[], int length) { + void *handle = NULL; + int i; + + for (i = 0; i < length; ++i) { +#if GLAD_PLATFORM_WIN32 + #if GLAD_PLATFORM_UWP + size_t buffer_size = (strlen(lib_names[i]) + 1) * sizeof(WCHAR); + LPWSTR buffer = (LPWSTR) malloc(buffer_size); + if (buffer != NULL) { + int ret = MultiByteToWideChar(CP_ACP, 0, lib_names[i], -1, buffer, buffer_size); + if (ret != 0) { + handle = (void*) LoadPackagedLibrary(buffer, 0); + } + free((void*) buffer); + } + #else + handle = (void*) LoadLibraryA(lib_names[i]); + #endif +#else + handle = dlopen(lib_names[i], RTLD_LAZY | RTLD_LOCAL); +#endif + if (handle != NULL) { + return handle; + } + } + + return NULL; +} + +static void glad_close_dlopen_handle(void* handle) { + if (handle != NULL) { +#if GLAD_PLATFORM_WIN32 + FreeLibrary((HMODULE) handle); +#else + dlclose(handle); +#endif + } +} + +static GLADapiproc glad_dlsym_handle(void* handle, const char *name) { + if (handle == NULL) { + return NULL; + } + +#if GLAD_PLATFORM_WIN32 + return (GLADapiproc) GetProcAddress((HMODULE) handle, name); +#else + return GLAD_GNUC_EXTENSION (GLADapiproc) dlsym(handle, name); +#endif +} + +#endif /* GLAD_LOADER_LIBRARY_C_ */ + +typedef void* (GLAD_API_PTR *GLADglprocaddrfunc)(const char*); +struct _glad_gl_userptr { + void *handle; + GLADglprocaddrfunc gl_get_proc_address_ptr; +}; + +static GLADapiproc glad_gl_get_proc(void *vuserptr, const char *name) { + struct _glad_gl_userptr userptr = *(struct _glad_gl_userptr*) vuserptr; + GLADapiproc result = NULL; + + if(userptr.gl_get_proc_address_ptr != NULL) { + result = GLAD_GNUC_EXTENSION (GLADapiproc) userptr.gl_get_proc_address_ptr(name); + } + if(result == NULL) { + result = glad_dlsym_handle(userptr.handle, name); + } + + return result; +} + +static void* _gl_handle = NULL; + +static void* glad_gl_dlopen_handle(void) { +#if GLAD_PLATFORM_APPLE + static const char *NAMES[] = { + "../Frameworks/OpenGL.framework/OpenGL", + "/Library/Frameworks/OpenGL.framework/OpenGL", + "/System/Library/Frameworks/OpenGL.framework/OpenGL", + "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL" + }; +#elif GLAD_PLATFORM_WIN32 + static const char *NAMES[] = {"opengl32.dll"}; +#else + static const char *NAMES[] = { + #if defined(__CYGWIN__) + "libGL-1.so", + #endif + "libGL.so.1", + "libGL.so" + }; +#endif + + if (_gl_handle == NULL) { + _gl_handle = glad_get_dlopen_handle(NAMES, sizeof(NAMES) / sizeof(NAMES[0])); + } + + return _gl_handle; +} + +static struct _glad_gl_userptr glad_gl_build_userptr(void *handle) { + struct _glad_gl_userptr userptr; + + userptr.handle = handle; +#if GLAD_PLATFORM_APPLE || defined(__HAIKU__) + userptr.gl_get_proc_address_ptr = NULL; +#elif GLAD_PLATFORM_WIN32 + userptr.gl_get_proc_address_ptr = + (GLADglprocaddrfunc) glad_dlsym_handle(handle, "wglGetProcAddress"); +#else + userptr.gl_get_proc_address_ptr = + (GLADglprocaddrfunc) glad_dlsym_handle(handle, "glXGetProcAddressARB"); +#endif + + return userptr; +} + +int gladLoaderLoadGL(void) { + int version = 0; + void *handle; + int did_load = 0; + struct _glad_gl_userptr userptr; + + did_load = _gl_handle == NULL; + handle = glad_gl_dlopen_handle(); + if (handle) { + userptr = glad_gl_build_userptr(handle); + + version = gladLoadGLUserPtr(glad_gl_get_proc, &userptr); + + if (did_load) { + gladLoaderUnloadGL(); + } + } + + return version; +} + + + +void gladLoaderUnloadGL(void) { + if (_gl_handle != NULL) { + glad_close_dlopen_handle(_gl_handle); + _gl_handle = NULL; + } +} + +#endif /* GLAD_GL */ + +#ifdef __cplusplus +} +#endif + +#endif /* GLAD_GL_IMPLEMENTATION */ + diff --git a/rts/Rml/Backends/RmlUi_Platform_SDL.cpp b/rts/Rml/Backends/RmlUi_Platform_SDL.cpp new file mode 100644 index 0000000000..8269dc21da --- /dev/null +++ b/rts/Rml/Backends/RmlUi_Platform_SDL.cpp @@ -0,0 +1,308 @@ +/* + * This source file is part of RmlUi, the HTML/CSS Interface Middleware + * + * For the latest information, see http://github.com/mikke89/RmlUi + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * Copyright (c) 2019-2023 The RmlUi Team, and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "RmlUi_Platform_SDL.h" +#include +#include +#include +#include +#include + +SystemInterface_SDL::SystemInterface_SDL() +{ + cursor_default = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW); + cursor_move = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEALL); + cursor_pointer = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND); + cursor_resize = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENWSE); + cursor_cross = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_CROSSHAIR); + cursor_text = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_IBEAM); + cursor_unavailable = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NO); +} + +SystemInterface_SDL::~SystemInterface_SDL() +{ + SDL_FreeCursor(cursor_default); + SDL_FreeCursor(cursor_move); + SDL_FreeCursor(cursor_pointer); + SDL_FreeCursor(cursor_resize); + SDL_FreeCursor(cursor_cross); + SDL_FreeCursor(cursor_text); + SDL_FreeCursor(cursor_unavailable); +} + +void SystemInterface_SDL::SetWindow(SDL_Window* in_window) +{ + window = in_window; +} + +double SystemInterface_SDL::GetElapsedTime() +{ + static const Uint64 start = SDL_GetPerformanceCounter(); + static const double frequency = double(SDL_GetPerformanceFrequency()); + return double(SDL_GetPerformanceCounter() - start) / frequency; +} + +void SystemInterface_SDL::SetMouseCursor(const Rml::String& cursor_name) +{ + SDL_Cursor* cursor = nullptr; + + if (cursor_name.empty() || cursor_name == "arrow") + cursor = cursor_default; + else if (cursor_name == "move") + cursor = cursor_move; + else if (cursor_name == "pointer") + cursor = cursor_pointer; + else if (cursor_name == "resize") + cursor = cursor_resize; + else if (cursor_name == "cross") + cursor = cursor_cross; + else if (cursor_name == "text") + cursor = cursor_text; + else if (cursor_name == "unavailable") + cursor = cursor_unavailable; + else if (Rml::StringUtilities::StartsWith(cursor_name, "rmlui-scroll")) + cursor = cursor_move; + + if (cursor) + SDL_SetCursor(cursor); +} + +void SystemInterface_SDL::SetClipboardText(const Rml::String& text_utf8) +{ + SDL_SetClipboardText(text_utf8.c_str()); +} + +void SystemInterface_SDL::GetClipboardText(Rml::String& text) +{ + char* raw_text = SDL_GetClipboardText(); + text = Rml::String(raw_text); + SDL_free(raw_text); +} + +bool RmlSDL::InputEventHandler(Rml::Context* context, SDL_Event& ev) +{ + bool result = true; + + switch (ev.type) + { + case SDL_MOUSEMOTION: result = context->ProcessMouseMove(ev.motion.x, ev.motion.y, GetKeyModifierState()); break; + case SDL_MOUSEBUTTONDOWN: + result = context->ProcessMouseButtonDown(ConvertMouseButton(ev.button.button), GetKeyModifierState()); + SDL_CaptureMouse(SDL_TRUE); + break; + case SDL_MOUSEBUTTONUP: + SDL_CaptureMouse(SDL_FALSE); + result = context->ProcessMouseButtonUp(ConvertMouseButton(ev.button.button), GetKeyModifierState()); + break; + case SDL_MOUSEWHEEL: result = context->ProcessMouseWheel(float(-ev.wheel.y), GetKeyModifierState()); break; + case SDL_KEYDOWN: + result = context->ProcessKeyDown(ConvertKey(ev.key.keysym.sym), GetKeyModifierState()); + if (ev.key.keysym.sym == SDLK_RETURN || ev.key.keysym.sym == SDLK_KP_ENTER) + result &= context->ProcessTextInput('\n'); + break; + case SDL_KEYUP: result = context->ProcessKeyUp(ConvertKey(ev.key.keysym.sym), GetKeyModifierState()); break; + case SDL_TEXTINPUT: result = context->ProcessTextInput(Rml::String(&ev.text.text[0])); break; + case SDL_WINDOWEVENT: + { + switch (ev.window.event) + { + case SDL_WINDOWEVENT_SIZE_CHANGED: + { + Rml::Vector2i dimensions(ev.window.data1, ev.window.data2); + context->SetDimensions(dimensions); + } + break; + case SDL_WINDOWEVENT_LEAVE: context->ProcessMouseLeave(); break; + } + } + break; + default: break; + } + + return result; +} + +Rml::Input::KeyIdentifier RmlSDL::ConvertKey(int sdlkey) +{ + // clang-format off + switch (sdlkey) + { + case SDLK_UNKNOWN: return Rml::Input::KI_UNKNOWN; + case SDLK_ESCAPE: return Rml::Input::KI_ESCAPE; + case SDLK_SPACE: return Rml::Input::KI_SPACE; + case SDLK_0: return Rml::Input::KI_0; + case SDLK_1: return Rml::Input::KI_1; + case SDLK_2: return Rml::Input::KI_2; + case SDLK_3: return Rml::Input::KI_3; + case SDLK_4: return Rml::Input::KI_4; + case SDLK_5: return Rml::Input::KI_5; + case SDLK_6: return Rml::Input::KI_6; + case SDLK_7: return Rml::Input::KI_7; + case SDLK_8: return Rml::Input::KI_8; + case SDLK_9: return Rml::Input::KI_9; + case SDLK_a: return Rml::Input::KI_A; + case SDLK_b: return Rml::Input::KI_B; + case SDLK_c: return Rml::Input::KI_C; + case SDLK_d: return Rml::Input::KI_D; + case SDLK_e: return Rml::Input::KI_E; + case SDLK_f: return Rml::Input::KI_F; + case SDLK_g: return Rml::Input::KI_G; + case SDLK_h: return Rml::Input::KI_H; + case SDLK_i: return Rml::Input::KI_I; + case SDLK_j: return Rml::Input::KI_J; + case SDLK_k: return Rml::Input::KI_K; + case SDLK_l: return Rml::Input::KI_L; + case SDLK_m: return Rml::Input::KI_M; + case SDLK_n: return Rml::Input::KI_N; + case SDLK_o: return Rml::Input::KI_O; + case SDLK_p: return Rml::Input::KI_P; + case SDLK_q: return Rml::Input::KI_Q; + case SDLK_r: return Rml::Input::KI_R; + case SDLK_s: return Rml::Input::KI_S; + case SDLK_t: return Rml::Input::KI_T; + case SDLK_u: return Rml::Input::KI_U; + case SDLK_v: return Rml::Input::KI_V; + case SDLK_w: return Rml::Input::KI_W; + case SDLK_x: return Rml::Input::KI_X; + case SDLK_y: return Rml::Input::KI_Y; + case SDLK_z: return Rml::Input::KI_Z; + case SDLK_SEMICOLON: return Rml::Input::KI_OEM_1; + case SDLK_PLUS: return Rml::Input::KI_OEM_PLUS; + case SDLK_COMMA: return Rml::Input::KI_OEM_COMMA; + case SDLK_MINUS: return Rml::Input::KI_OEM_MINUS; + case SDLK_PERIOD: return Rml::Input::KI_OEM_PERIOD; + case SDLK_SLASH: return Rml::Input::KI_OEM_2; + case SDLK_BACKQUOTE: return Rml::Input::KI_OEM_3; + case SDLK_LEFTBRACKET: return Rml::Input::KI_OEM_4; + case SDLK_BACKSLASH: return Rml::Input::KI_OEM_5; + case SDLK_RIGHTBRACKET: return Rml::Input::KI_OEM_6; + case SDLK_QUOTEDBL: return Rml::Input::KI_OEM_7; + case SDLK_KP_0: return Rml::Input::KI_NUMPAD0; + case SDLK_KP_1: return Rml::Input::KI_NUMPAD1; + case SDLK_KP_2: return Rml::Input::KI_NUMPAD2; + case SDLK_KP_3: return Rml::Input::KI_NUMPAD3; + case SDLK_KP_4: return Rml::Input::KI_NUMPAD4; + case SDLK_KP_5: return Rml::Input::KI_NUMPAD5; + case SDLK_KP_6: return Rml::Input::KI_NUMPAD6; + case SDLK_KP_7: return Rml::Input::KI_NUMPAD7; + case SDLK_KP_8: return Rml::Input::KI_NUMPAD8; + case SDLK_KP_9: return Rml::Input::KI_NUMPAD9; + case SDLK_KP_ENTER: return Rml::Input::KI_NUMPADENTER; + case SDLK_KP_MULTIPLY: return Rml::Input::KI_MULTIPLY; + case SDLK_KP_PLUS: return Rml::Input::KI_ADD; + case SDLK_KP_MINUS: return Rml::Input::KI_SUBTRACT; + case SDLK_KP_PERIOD: return Rml::Input::KI_DECIMAL; + case SDLK_KP_DIVIDE: return Rml::Input::KI_DIVIDE; + case SDLK_KP_EQUALS: return Rml::Input::KI_OEM_NEC_EQUAL; + case SDLK_BACKSPACE: return Rml::Input::KI_BACK; + case SDLK_TAB: return Rml::Input::KI_TAB; + case SDLK_CLEAR: return Rml::Input::KI_CLEAR; + case SDLK_RETURN: return Rml::Input::KI_RETURN; + case SDLK_PAUSE: return Rml::Input::KI_PAUSE; + case SDLK_CAPSLOCK: return Rml::Input::KI_CAPITAL; + case SDLK_PAGEUP: return Rml::Input::KI_PRIOR; + case SDLK_PAGEDOWN: return Rml::Input::KI_NEXT; + case SDLK_END: return Rml::Input::KI_END; + case SDLK_HOME: return Rml::Input::KI_HOME; + case SDLK_LEFT: return Rml::Input::KI_LEFT; + case SDLK_UP: return Rml::Input::KI_UP; + case SDLK_RIGHT: return Rml::Input::KI_RIGHT; + case SDLK_DOWN: return Rml::Input::KI_DOWN; + case SDLK_INSERT: return Rml::Input::KI_INSERT; + case SDLK_DELETE: return Rml::Input::KI_DELETE; + case SDLK_HELP: return Rml::Input::KI_HELP; + case SDLK_F1: return Rml::Input::KI_F1; + case SDLK_F2: return Rml::Input::KI_F2; + case SDLK_F3: return Rml::Input::KI_F3; + case SDLK_F4: return Rml::Input::KI_F4; + case SDLK_F5: return Rml::Input::KI_F5; + case SDLK_F6: return Rml::Input::KI_F6; + case SDLK_F7: return Rml::Input::KI_F7; + case SDLK_F8: return Rml::Input::KI_F8; + case SDLK_F9: return Rml::Input::KI_F9; + case SDLK_F10: return Rml::Input::KI_F10; + case SDLK_F11: return Rml::Input::KI_F11; + case SDLK_F12: return Rml::Input::KI_F12; + case SDLK_F13: return Rml::Input::KI_F13; + case SDLK_F14: return Rml::Input::KI_F14; + case SDLK_F15: return Rml::Input::KI_F15; + case SDLK_NUMLOCKCLEAR: return Rml::Input::KI_NUMLOCK; + case SDLK_SCROLLLOCK: return Rml::Input::KI_SCROLL; + case SDLK_LSHIFT: return Rml::Input::KI_LSHIFT; + case SDLK_RSHIFT: return Rml::Input::KI_RSHIFT; + case SDLK_LCTRL: return Rml::Input::KI_LCONTROL; + case SDLK_RCTRL: return Rml::Input::KI_RCONTROL; + case SDLK_LALT: return Rml::Input::KI_LMENU; + case SDLK_RALT: return Rml::Input::KI_RMENU; + case SDLK_LGUI: return Rml::Input::KI_LMETA; + case SDLK_RGUI: return Rml::Input::KI_RMETA; + /* + case SDLK_LSUPER: return Rml::Input::KI_LWIN; + case SDLK_RSUPER: return Rml::Input::KI_RWIN; + */ + default: break; + } + // clang-format on + + return Rml::Input::KI_UNKNOWN; +} + +int RmlSDL::ConvertMouseButton(int button) +{ + switch (button) + { + case SDL_BUTTON_LEFT: return 0; + case SDL_BUTTON_RIGHT: return 1; + case SDL_BUTTON_MIDDLE: return 2; + default: return 3; + } +} + +int RmlSDL::GetKeyModifierState() +{ + SDL_Keymod sdl_mods = SDL_GetModState(); + + int retval = 0; + + if (sdl_mods & KMOD_CTRL) + retval |= Rml::Input::KM_CTRL; + + if (sdl_mods & KMOD_SHIFT) + retval |= Rml::Input::KM_SHIFT; + + if (sdl_mods & KMOD_ALT) + retval |= Rml::Input::KM_ALT; + + if (sdl_mods & KMOD_NUM) + retval |= Rml::Input::KM_NUMLOCK; + + if (sdl_mods & KMOD_CAPS) + retval |= Rml::Input::KM_CAPSLOCK; + + return retval; +} diff --git a/rts/Rml/Backends/RmlUi_Platform_SDL.h b/rts/Rml/Backends/RmlUi_Platform_SDL.h new file mode 100644 index 0000000000..937a6b08ec --- /dev/null +++ b/rts/Rml/Backends/RmlUi_Platform_SDL.h @@ -0,0 +1,83 @@ +/* + * This source file is part of RmlUi, the HTML/CSS Interface Middleware + * + * For the latest information, see http://github.com/mikke89/RmlUi + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * Copyright (c) 2019-2023 The RmlUi Team, and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef RMLUI_BACKENDS_PLATFORM_SDL_H +#define RMLUI_BACKENDS_PLATFORM_SDL_H + +#include +#include +#include +#include + +class SystemInterface_SDL : public Rml::SystemInterface { +public: + SystemInterface_SDL(); + ~SystemInterface_SDL(); + + // Optionally, provide or change the window to be used for setting the mouse cursors. + void SetWindow(SDL_Window* window); + + // -- Inherited from Rml::SystemInterface -- + + double GetElapsedTime() override; + + void SetMouseCursor(const Rml::String& cursor_name) override; + + void SetClipboardText(const Rml::String& text) override; + void GetClipboardText(Rml::String& text) override; + +private: + SDL_Window* window = nullptr; + + SDL_Cursor* cursor_default = nullptr; + SDL_Cursor* cursor_move = nullptr; + SDL_Cursor* cursor_pointer = nullptr; + SDL_Cursor* cursor_resize = nullptr; + SDL_Cursor* cursor_cross = nullptr; + SDL_Cursor* cursor_text = nullptr; + SDL_Cursor* cursor_unavailable = nullptr; +}; + +namespace RmlSDL { + +// Applies input on the context based on the given SDL event. +// @return True if the event is still propagating, false if it was handled by the context. +bool InputEventHandler(Rml::Context* context, SDL_Event& ev); + +// Converts the SDL key to RmlUi key. +Rml::Input::KeyIdentifier ConvertKey(int sdl_key); + +// Converts the SDL mouse button to RmlUi mouse button. +int ConvertMouseButton(int sdl_mouse_button); + +// Returns the active RmlUi key modifier state. +int GetKeyModifierState(); + +} // namespace RmlSDL + +#endif diff --git a/rts/Rml/Backends/RmlUi_Renderer_GL3.cpp b/rts/Rml/Backends/RmlUi_Renderer_GL3.cpp new file mode 100644 index 0000000000..633c25042c --- /dev/null +++ b/rts/Rml/Backends/RmlUi_Renderer_GL3.cpp @@ -0,0 +1,793 @@ +/* + * This source file is part of RmlUi, the HTML/CSS Interface Middleware + * + * For the latest information, see http://github.com/mikke89/RmlUi + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * Copyright (c) 2019-2023 The RmlUi Team, and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "RmlUi_Renderer_GL3.h" +#include +#include +#include +#include +#include + +#if defined(RMLUI_PLATFORM_WIN32) && !defined(__MINGW32__) + // function call missing argument list + #pragma warning(disable : 4551) + // unreferenced local function has been removed + #pragma warning(disable : 4505) +#endif + +// #if defined RMLUI_PLATFORM_EMSCRIPTEN +// #define RMLUI_SHADER_HEADER "#version 300 es\nprecision highp float;\n" +// #include +// #elif defined RMLUI_GL3_CUSTOM_LOADER +// #define RMLUI_SHADER_HEADER "#version 300\n" +// #include RMLUI_GL3_CUSTOM_LOADER +// #else +// #define RMLUI_SHADER_HEADER "#version 130\n" +// #define GLAD_GL_IMPLEMENTATION +// #include "RmlUi_Include_GL3.h" +// #endif +#include "Rendering/GL/myGL.h" +#define RMLUI_SHADER_HEADER "#version 130\n" + +static const char* shader_main_vertex = RMLUI_SHADER_HEADER R"( +uniform vec2 _translate; +uniform mat4 _transform; + +in vec2 inPosition; +in vec4 inColor0; +in vec2 inTexCoord0; + +out vec2 fragTexCoord; +out vec4 fragColor; + +void main() { + fragTexCoord = inTexCoord0; + fragColor = inColor0; + + vec2 translatedPos = inPosition + _translate.xy; + vec4 outPos = _transform * vec4(translatedPos, 0, 1); + + gl_Position = outPos; +} +)"; + +static const char* shader_main_fragment_texture = RMLUI_SHADER_HEADER R"( +uniform sampler2D _tex; +in vec2 fragTexCoord; +in vec4 fragColor; + +out vec4 finalColor; + +void main() { + vec4 texColor = texture(_tex, fragTexCoord); + finalColor = fragColor * texColor; +} +)"; +static const char* shader_main_fragment_color = RMLUI_SHADER_HEADER R"( +in vec2 fragTexCoord; +in vec4 fragColor; + +out vec4 finalColor; + +void main() { + finalColor = fragColor; +} +)"; + +namespace Gfx { + +enum class ProgramUniform { Translate, Transform, Tex, Count }; +static const char* const program_uniform_names[(size_t)ProgramUniform::Count] = {"_translate", "_transform", "_tex"}; + +enum class VertexAttribute { Position, Color0, TexCoord0, Count }; +static const char* const vertex_attribute_names[(size_t)VertexAttribute::Count] = {"inPosition", "inColor0", "inTexCoord0"}; + +struct CompiledGeometryData { + Rml::TextureHandle texture; + GLuint vao; + GLuint vbo; + GLuint ibo; + GLsizei draw_count; +}; + +struct ProgramData { + GLuint id; + GLint uniform_locations[(size_t)ProgramUniform::Count]; +}; + +struct ShadersData { + ProgramData program_color; + ProgramData program_texture; + GLuint shader_main_vertex; + GLuint shader_main_fragment_color; + GLuint shader_main_fragment_texture; +}; + +static void CheckGLError(const char* operation_name) +{ +#ifdef RMLUI_DEBUG + GLenum error_code = glGetError(); + if (error_code != GL_NO_ERROR) + { + static const Rml::Pair error_names[] = {{GL_INVALID_ENUM, "GL_INVALID_ENUM"}, {GL_INVALID_VALUE, "GL_INVALID_VALUE"}, + {GL_INVALID_OPERATION, "GL_INVALID_OPERATION"}, {GL_OUT_OF_MEMORY, "GL_OUT_OF_MEMORY"}}; + const char* error_str = "''"; + for (auto& err : error_names) + { + if (err.first == error_code) + { + error_str = err.second; + break; + } + } + Rml::Log::Message(Rml::Log::LT_ERROR, "OpenGL error during %s. Error code 0x%x (%s).", operation_name, error_code, error_str); + } +#endif + (void)operation_name; +} + +// Create the shader, 'shader_type' is either GL_VERTEX_SHADER or GL_FRAGMENT_SHADER. +static GLuint CreateShader(GLenum shader_type, const char* code_string) +{ + GLuint id = glCreateShader(shader_type); + + glShaderSource(id, 1, (const GLchar**)&code_string, NULL); + glCompileShader(id); + + GLint status = 0; + glGetShaderiv(id, GL_COMPILE_STATUS, &status); + if (status == GL_FALSE) + { + GLint info_log_length = 0; + glGetShaderiv(id, GL_INFO_LOG_LENGTH, &info_log_length); + char* info_log_string = new char[info_log_length + 1]; + glGetShaderInfoLog(id, info_log_length, NULL, info_log_string); + + Rml::Log::Message(Rml::Log::LT_ERROR, "Compile failure in OpenGL shader: %s", info_log_string); + delete[] info_log_string; + glDeleteShader(id); + return 0; + } + + CheckGLError("CreateShader"); + + return id; +} + +static void BindAttribLocations(GLuint program) +{ + for (GLuint i = 0; i < (GLuint)VertexAttribute::Count; i++) + { + glBindAttribLocation(program, i, vertex_attribute_names[i]); + } + CheckGLError("BindAttribLocations"); +} + +static bool CreateProgram(GLuint vertex_shader, GLuint fragment_shader, ProgramData& out_program) +{ + GLuint id = glCreateProgram(); + RMLUI_ASSERT(id); + + BindAttribLocations(id); + + glAttachShader(id, vertex_shader); + glAttachShader(id, fragment_shader); + + glLinkProgram(id); + + glDetachShader(id, vertex_shader); + glDetachShader(id, fragment_shader); + + GLint status = 0; + glGetProgramiv(id, GL_LINK_STATUS, &status); + if (status == GL_FALSE) + { + GLint info_log_length = 0; + glGetProgramiv(id, GL_INFO_LOG_LENGTH, &info_log_length); + char* info_log_string = new char[info_log_length + 1]; + glGetProgramInfoLog(id, info_log_length, NULL, info_log_string); + + Rml::Log::Message(Rml::Log::LT_ERROR, "OpenGL program linking failure: %s", info_log_string); + delete[] info_log_string; + glDeleteProgram(id); + return false; + } + + out_program = {}; + out_program.id = id; + + // Make a lookup table for the uniform locations. + GLint num_active_uniforms = 0; + glGetProgramiv(id, GL_ACTIVE_UNIFORMS, &num_active_uniforms); + + constexpr size_t name_size = 64; + GLchar name_buf[name_size] = ""; + for (int unif = 0; unif < num_active_uniforms; ++unif) + { + GLint array_size = 0; + GLenum type = 0; + GLsizei actual_length = 0; + glGetActiveUniform(id, unif, name_size, &actual_length, &array_size, &type, name_buf); + GLint location = glGetUniformLocation(id, name_buf); + + // See if we have the name in our pre-defined name list. + ProgramUniform program_uniform = ProgramUniform::Count; + for (int i = 0; i < (int)ProgramUniform::Count; i++) + { + const char* uniform_name = program_uniform_names[i]; + if (strcmp(name_buf, uniform_name) == 0) + { + program_uniform = (ProgramUniform)i; + break; + } + } + + if ((size_t)program_uniform < (size_t)ProgramUniform::Count) + { + out_program.uniform_locations[(size_t)program_uniform] = location; + } + else + { + Rml::Log::Message(Rml::Log::LT_ERROR, "OpenGL program uses unknown uniform '%s'.", name_buf); + return false; + } + } + + CheckGLError("CreateProgram"); + + return true; +} + +static bool CreateShaders(ShadersData& out_shaders) +{ + out_shaders = {}; + GLuint& main_vertex = out_shaders.shader_main_vertex; + GLuint& main_fragment_color = out_shaders.shader_main_fragment_color; + GLuint& main_fragment_texture = out_shaders.shader_main_fragment_texture; + + main_vertex = CreateShader(GL_VERTEX_SHADER, shader_main_vertex); + if (!main_vertex) + { + Rml::Log::Message(Rml::Log::LT_ERROR, "Could not create OpenGL shader: 'shader_main_vertex'."); + return false; + } + main_fragment_color = CreateShader(GL_FRAGMENT_SHADER, shader_main_fragment_color); + if (!main_fragment_color) + { + Rml::Log::Message(Rml::Log::LT_ERROR, "Could not create OpenGL shader: 'shader_main_fragment_color'."); + return false; + } + main_fragment_texture = CreateShader(GL_FRAGMENT_SHADER, shader_main_fragment_texture); + if (!main_fragment_texture) + { + Rml::Log::Message(Rml::Log::LT_ERROR, "Could not create OpenGL shader: 'shader_main_fragment_texture'."); + return false; + } + + if (!CreateProgram(main_vertex, main_fragment_color, out_shaders.program_color)) + { + Rml::Log::Message(Rml::Log::LT_ERROR, "Could not create OpenGL program: 'program_color'."); + return false; + } + if (!CreateProgram(main_vertex, main_fragment_texture, out_shaders.program_texture)) + { + Rml::Log::Message(Rml::Log::LT_ERROR, "Could not create OpenGL program: 'program_texture'."); + return false; + } + + return true; +} + +static void DestroyShaders(ShadersData& shaders) +{ + glDeleteProgram(shaders.program_color.id); + glDeleteProgram(shaders.program_texture.id); + + glDeleteShader(shaders.shader_main_vertex); + glDeleteShader(shaders.shader_main_fragment_color); + glDeleteShader(shaders.shader_main_fragment_texture); + + shaders = {}; +} + +} // namespace Gfx + +RenderInterface_GL3::RenderInterface_GL3() +{ + shaders = Rml::MakeUnique(); + + if (!Gfx::CreateShaders(*shaders)) + shaders.reset(); +} + +RenderInterface_GL3::~RenderInterface_GL3() +{ + if (shaders) + Gfx::DestroyShaders(*shaders); +} + +void RenderInterface_GL3::SetViewport(int width, int height) +{ + viewport_width = width; + viewport_height = height; +} + +void RenderInterface_GL3::BeginFrame() +{ + RMLUI_ASSERT(viewport_width >= 0 && viewport_height >= 0); + + // Backup GL state. + glstate_backup.enable_cull_face = glIsEnabled(GL_CULL_FACE); + glstate_backup.enable_blend = glIsEnabled(GL_BLEND); + glstate_backup.enable_stencil_test = glIsEnabled(GL_STENCIL_TEST); + glstate_backup.enable_scissor_test = glIsEnabled(GL_SCISSOR_TEST); + + glGetIntegerv(GL_VIEWPORT, glstate_backup.viewport); + glGetIntegerv(GL_SCISSOR_BOX, glstate_backup.scissor); + + glGetIntegerv(GL_STENCIL_CLEAR_VALUE, &glstate_backup.stencil_clear_value); + glGetFloatv(GL_COLOR_CLEAR_VALUE, glstate_backup.color_clear_value); + + glGetIntegerv(GL_BLEND_EQUATION_RGB, &glstate_backup.blend_equation_rgb); + glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &glstate_backup.blend_equation_alpha); + glGetIntegerv(GL_BLEND_SRC_RGB, &glstate_backup.blend_src_rgb); + glGetIntegerv(GL_BLEND_DST_RGB, &glstate_backup.blend_dst_rgb); + glGetIntegerv(GL_BLEND_SRC_ALPHA, &glstate_backup.blend_src_alpha); + glGetIntegerv(GL_BLEND_DST_ALPHA, &glstate_backup.blend_dst_alpha); + + glGetIntegerv(GL_STENCIL_FUNC, &glstate_backup.stencil_front.func); + glGetIntegerv(GL_STENCIL_REF, &glstate_backup.stencil_front.ref); + glGetIntegerv(GL_STENCIL_VALUE_MASK, &glstate_backup.stencil_front.value_mask); + glGetIntegerv(GL_STENCIL_WRITEMASK, &glstate_backup.stencil_front.writemask); + glGetIntegerv(GL_STENCIL_FAIL, &glstate_backup.stencil_front.fail); + glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL, &glstate_backup.stencil_front.pass_depth_fail); + glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS, &glstate_backup.stencil_front.pass_depth_pass); + + glGetIntegerv(GL_STENCIL_BACK_FUNC, &glstate_backup.stencil_back.func); + glGetIntegerv(GL_STENCIL_BACK_REF, &glstate_backup.stencil_back.ref); + glGetIntegerv(GL_STENCIL_BACK_VALUE_MASK, &glstate_backup.stencil_back.value_mask); + glGetIntegerv(GL_STENCIL_BACK_WRITEMASK, &glstate_backup.stencil_back.writemask); + glGetIntegerv(GL_STENCIL_BACK_FAIL, &glstate_backup.stencil_back.fail); + glGetIntegerv(GL_STENCIL_BACK_PASS_DEPTH_FAIL, &glstate_backup.stencil_back.pass_depth_fail); + glGetIntegerv(GL_STENCIL_BACK_PASS_DEPTH_PASS, &glstate_backup.stencil_back.pass_depth_pass); + + // Setup expected GL state. + glViewport(0, 0, viewport_width, viewport_height); + + glClearStencil(0); + glClearColor(0, 0, 0, 1); + + glDisable(GL_CULL_FACE); + + glEnable(GL_BLEND); + glBlendEquation(GL_FUNC_ADD); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glEnable(GL_STENCIL_TEST); + glStencilFunc(GL_ALWAYS, 1, GLuint(-1)); + glStencilMask(GLuint(-1)); + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + + projection = Rml::Matrix4f::ProjectOrtho(0, (float)viewport_width, (float)viewport_height, 0, -10000, 10000); + SetTransform(nullptr); +} + +void RenderInterface_GL3::EndFrame() +{ + // Restore GL state. + if (glstate_backup.enable_cull_face) + glEnable(GL_CULL_FACE); + else + glDisable(GL_CULL_FACE); + + if (glstate_backup.enable_blend) + glEnable(GL_BLEND); + else + glDisable(GL_BLEND); + + if (glstate_backup.enable_stencil_test) + glEnable(GL_STENCIL_TEST); + else + glDisable(GL_STENCIL_TEST); + + if (glstate_backup.enable_scissor_test) + glEnable(GL_SCISSOR_TEST); + else + glDisable(GL_SCISSOR_TEST); + + glViewport(glstate_backup.viewport[0], glstate_backup.viewport[1], glstate_backup.viewport[2], glstate_backup.viewport[3]); + glScissor(glstate_backup.scissor[0], glstate_backup.scissor[1], glstate_backup.scissor[2], glstate_backup.scissor[3]); + + glClearStencil(glstate_backup.stencil_clear_value); + glClearColor(glstate_backup.color_clear_value[0], glstate_backup.color_clear_value[1], glstate_backup.color_clear_value[2], + glstate_backup.color_clear_value[3]); + + glBlendEquationSeparate(glstate_backup.blend_equation_rgb, glstate_backup.blend_equation_alpha); + glBlendFuncSeparate(glstate_backup.blend_src_rgb, glstate_backup.blend_dst_rgb, glstate_backup.blend_src_alpha, glstate_backup.blend_dst_alpha); + + glStencilFuncSeparate(GL_FRONT, glstate_backup.stencil_front.func, glstate_backup.stencil_front.ref, glstate_backup.stencil_front.value_mask); + glStencilMaskSeparate(GL_FRONT, glstate_backup.stencil_front.writemask); + glStencilOpSeparate(GL_FRONT, glstate_backup.stencil_front.fail, glstate_backup.stencil_front.pass_depth_fail, + glstate_backup.stencil_front.pass_depth_pass); + + glStencilFuncSeparate(GL_BACK, glstate_backup.stencil_back.func, glstate_backup.stencil_back.ref, glstate_backup.stencil_back.value_mask); + glStencilMaskSeparate(GL_BACK, glstate_backup.stencil_back.writemask); + glStencilOpSeparate(GL_BACK, glstate_backup.stencil_back.fail, glstate_backup.stencil_back.pass_depth_fail, + glstate_backup.stencil_back.pass_depth_pass); +} + +void RenderInterface_GL3::Clear() +{ + glClearStencil(0); + glClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); +} + +void RenderInterface_GL3::RenderGeometry(Rml::Vertex* vertices, int num_vertices, int* indices, int num_indices, const Rml::TextureHandle texture, + const Rml::Vector2f& translation) +{ + Rml::CompiledGeometryHandle geometry = CompileGeometry(vertices, num_vertices, indices, num_indices, texture); + + if (geometry) + { + RenderCompiledGeometry(geometry, translation); + ReleaseCompiledGeometry(geometry); + } +} + +Rml::CompiledGeometryHandle RenderInterface_GL3::CompileGeometry(Rml::Vertex* vertices, int num_vertices, int* indices, int num_indices, + Rml::TextureHandle texture) +{ + constexpr GLenum draw_usage = GL_STATIC_DRAW; + + GLuint vao = 0; + GLuint vbo = 0; + GLuint ibo = 0; + + glGenVertexArrays(1, &vao); + glGenBuffers(1, &vbo); + glGenBuffers(1, &ibo); + glBindVertexArray(vao); + + glBindBuffer(GL_ARRAY_BUFFER, vbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(Rml::Vertex) * num_vertices, (const void*)vertices, draw_usage); + + glEnableVertexAttribArray((GLuint)Gfx::VertexAttribute::Position); + glVertexAttribPointer((GLuint)Gfx::VertexAttribute::Position, 2, GL_FLOAT, GL_FALSE, sizeof(Rml::Vertex), + (const GLvoid*)(offsetof(Rml::Vertex, position))); + + glEnableVertexAttribArray((GLuint)Gfx::VertexAttribute::Color0); + glVertexAttribPointer((GLuint)Gfx::VertexAttribute::Color0, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Rml::Vertex), + (const GLvoid*)(offsetof(Rml::Vertex, colour))); + + glEnableVertexAttribArray((GLuint)Gfx::VertexAttribute::TexCoord0); + glVertexAttribPointer((GLuint)Gfx::VertexAttribute::TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(Rml::Vertex), + (const GLvoid*)(offsetof(Rml::Vertex, tex_coord))); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int) * num_indices, (const void*)indices, draw_usage); + + glBindVertexArray(0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + Gfx::CheckGLError("CompileGeometry"); + + Gfx::CompiledGeometryData* geometry = new Gfx::CompiledGeometryData; + geometry->texture = texture; + geometry->vao = vao; + geometry->vbo = vbo; + geometry->ibo = ibo; + geometry->draw_count = num_indices; + + return (Rml::CompiledGeometryHandle)geometry; +} + +void RenderInterface_GL3::RenderCompiledGeometry(Rml::CompiledGeometryHandle handle, const Rml::Vector2f& translation) +{ + Gfx::CompiledGeometryData* geometry = (Gfx::CompiledGeometryData*)handle; + + if (geometry->texture) + { + glUseProgram(shaders->program_texture.id); + if (geometry->texture != TextureEnableWithoutBinding) + glBindTexture(GL_TEXTURE_2D, (GLuint)geometry->texture); + SubmitTransformUniform(ProgramId::Texture, shaders->program_texture.uniform_locations[(size_t)Gfx::ProgramUniform::Transform]); + glUniform2fv(shaders->program_texture.uniform_locations[(size_t)Gfx::ProgramUniform::Translate], 1, &translation.x); + } + else + { + glUseProgram(shaders->program_color.id); + glBindTexture(GL_TEXTURE_2D, 0); + SubmitTransformUniform(ProgramId::Color, shaders->program_color.uniform_locations[(size_t)Gfx::ProgramUniform::Transform]); + glUniform2fv(shaders->program_color.uniform_locations[(size_t)Gfx::ProgramUniform::Translate], 1, &translation.x); + } + + glBindVertexArray(geometry->vao); + glDrawElements(GL_TRIANGLES, geometry->draw_count, GL_UNSIGNED_INT, (const GLvoid*)0); + + glBindVertexArray(0); + glUseProgram(0); + glBindTexture(GL_TEXTURE_2D, 0); + + Gfx::CheckGLError("RenderCompiledGeometry"); +} + +void RenderInterface_GL3::ReleaseCompiledGeometry(Rml::CompiledGeometryHandle handle) +{ + Gfx::CompiledGeometryData* geometry = (Gfx::CompiledGeometryData*)handle; + + glDeleteVertexArrays(1, &geometry->vao); + glDeleteBuffers(1, &geometry->vbo); + glDeleteBuffers(1, &geometry->ibo); + + delete geometry; +} + +void RenderInterface_GL3::EnableScissorRegion(bool enable) +{ + ScissoringState new_state = ScissoringState::Disable; + + if (enable) + new_state = (transform_active ? ScissoringState::Stencil : ScissoringState::Scissor); + + if (new_state != scissoring_state) + { + // Disable old + if (scissoring_state == ScissoringState::Scissor) + glDisable(GL_SCISSOR_TEST); + else if (scissoring_state == ScissoringState::Stencil) + glStencilFunc(GL_ALWAYS, 1, GLuint(-1)); + + // Enable new + if (new_state == ScissoringState::Scissor) + glEnable(GL_SCISSOR_TEST); + else if (new_state == ScissoringState::Stencil) + glStencilFunc(GL_EQUAL, 1, GLuint(-1)); + + scissoring_state = new_state; + } +} + +void RenderInterface_GL3::SetScissorRegion(int x, int y, int width, int height) +{ + if (transform_active) + { + const float left = float(x); + const float right = float(x + width); + const float top = float(y); + const float bottom = float(y + height); + + Rml::Vertex vertices[4]; + vertices[0].position = {left, top}; + vertices[1].position = {right, top}; + vertices[2].position = {right, bottom}; + vertices[3].position = {left, bottom}; + + int indices[6] = {0, 2, 1, 0, 3, 2}; + + glClear(GL_STENCIL_BUFFER_BIT); + glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + glStencilFunc(GL_ALWAYS, 1, GLuint(-1)); + glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); + + RenderGeometry(vertices, 4, indices, 6, 0, Rml::Vector2f(0, 0)); + + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + glStencilFunc(GL_EQUAL, 1, GLuint(-1)); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + } + else + { + glScissor(x, viewport_height - (y + height), width, height); + } +} + +// Set to byte packing, or the compiler will expand our struct, which means it won't read correctly from file +#pragma pack(1) +struct TGAHeader { + char idLength; + char colourMapType; + char dataType; + short int colourMapOrigin; + short int colourMapLength; + char colourMapDepth; + short int xOrigin; + short int yOrigin; + short int width; + short int height; + char bitsPerPixel; + char imageDescriptor; +}; +// Restore packing +#pragma pack() + +bool RenderInterface_GL3::LoadTexture(Rml::TextureHandle& texture_handle, Rml::Vector2i& texture_dimensions, const Rml::String& source) +{ + Rml::FileInterface* file_interface = Rml::GetFileInterface(); + Rml::FileHandle file_handle = file_interface->Open(source); + if (!file_handle) + { + return false; + } + + file_interface->Seek(file_handle, 0, SEEK_END); + size_t buffer_size = file_interface->Tell(file_handle); + file_interface->Seek(file_handle, 0, SEEK_SET); + + if (buffer_size <= sizeof(TGAHeader)) + { + Rml::Log::Message(Rml::Log::LT_ERROR, "Texture file size is smaller than TGAHeader, file is not a valid TGA image."); + file_interface->Close(file_handle); + return false; + } + + using Rml::byte; + byte* buffer = new byte[buffer_size]; + file_interface->Read(buffer, buffer_size, file_handle); + file_interface->Close(file_handle); + + TGAHeader header; + memcpy(&header, buffer, sizeof(TGAHeader)); + + int color_mode = header.bitsPerPixel / 8; + int image_size = header.width * header.height * 4; // We always make 32bit textures + + if (header.dataType != 2) + { + Rml::Log::Message(Rml::Log::LT_ERROR, "Only 24/32bit uncompressed TGAs are supported."); + delete[] buffer; + return false; + } + + // Ensure we have at least 3 colors + if (color_mode < 3) + { + Rml::Log::Message(Rml::Log::LT_ERROR, "Only 24 and 32bit textures are supported."); + delete[] buffer; + return false; + } + + const byte* image_src = buffer + sizeof(TGAHeader); + byte* image_dest = new byte[image_size]; + + // Targa is BGR, swap to RGB and flip Y axis + for (long y = 0; y < header.height; y++) + { + long read_index = y * header.width * color_mode; + long write_index = ((header.imageDescriptor & 32) != 0) ? read_index : (header.height - y - 1) * header.width * 4; + for (long x = 0; x < header.width; x++) + { + image_dest[write_index] = image_src[read_index + 2]; + image_dest[write_index + 1] = image_src[read_index + 1]; + image_dest[write_index + 2] = image_src[read_index]; + if (color_mode == 4) + { + const int alpha = image_src[read_index + 3]; +#ifdef RMLUI_SRGB_PREMULTIPLIED_ALPHA + image_dest[write_index + 0] = (image_dest[write_index + 0] * alpha) / 255; + image_dest[write_index + 1] = (image_dest[write_index + 1] * alpha) / 255; + image_dest[write_index + 2] = (image_dest[write_index + 2] * alpha) / 255; +#endif + image_dest[write_index + 3] = (byte)alpha; + } + else + { + image_dest[write_index + 3] = 255; + } + + write_index += 4; + read_index += color_mode; + } + } + + texture_dimensions.x = header.width; + texture_dimensions.y = header.height; + + bool success = GenerateTexture(texture_handle, image_dest, texture_dimensions); + + delete[] image_dest; + delete[] buffer; + + return success; +} + +bool RenderInterface_GL3::GenerateTexture(Rml::TextureHandle& texture_handle, const Rml::byte* source, const Rml::Vector2i& source_dimensions) +{ + GLuint texture_id = 0; + glGenTextures(1, &texture_id); + if (texture_id == 0) + { + Rml::Log::Message(Rml::Log::LT_ERROR, "Failed to generate texture."); + return false; + } + + glBindTexture(GL_TEXTURE_2D, texture_id); + + GLint internal_format = GL_RGBA8; + glTexImage2D(GL_TEXTURE_2D, 0, internal_format, source_dimensions.x, source_dimensions.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, source); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + + texture_handle = (Rml::TextureHandle)texture_id; + + glBindTexture(GL_TEXTURE_2D, 0); + + return true; +} + +void RenderInterface_GL3::ReleaseTexture(Rml::TextureHandle texture_handle) +{ + glDeleteTextures(1, (GLuint*)&texture_handle); +} + +void RenderInterface_GL3::SetTransform(const Rml::Matrix4f* new_transform) +{ + transform_active = (new_transform != nullptr); + transform = projection * (new_transform ? *new_transform : Rml::Matrix4f::Identity()); + transform_dirty_state = ProgramId::All; +} + +void RenderInterface_GL3::SubmitTransformUniform(ProgramId program_id, int uniform_location) +{ + if ((int)program_id & (int)transform_dirty_state) + { + glUniformMatrix4fv(uniform_location, 1, false, transform.data()); + transform_dirty_state = ProgramId((int)transform_dirty_state & ~(int)program_id); + } +} + +bool RmlGL3::Initialize(Rml::String* out_message) +{ +// #if defined RMLUI_PLATFORM_EMSCRIPTEN +// if (out_message) +// *out_message = "Started Emscripten WebGL renderer."; +// #elif !defined RMLUI_GL3_CUSTOM_LOADER +// const int gl_version = gladLoaderLoadGL(); +// if (gl_version == 0) +// { +// if (out_message) +// *out_message = "Failed to initialize OpenGL context."; +// return false; +// } + +// if (out_message) +// *out_message = Rml::CreateString(128, "Loaded OpenGL %d.%d.", GLAD_VERSION_MAJOR(gl_version), GLAD_VERSION_MINOR(gl_version)); +// #endif + + return true; +} + +void RmlGL3::Shutdown() +{ +#if !defined RMLUI_PLATFORM_EMSCRIPTEN && !defined RMLUI_GL3_CUSTOM_LOADER + // gladLoaderUnloadGL(); +#endif +} diff --git a/rts/Rml/Backends/RmlUi_Renderer_GL3.h b/rts/Rml/Backends/RmlUi_Renderer_GL3.h new file mode 100644 index 0000000000..537b61519a --- /dev/null +++ b/rts/Rml/Backends/RmlUi_Renderer_GL3.h @@ -0,0 +1,142 @@ +/* + * This source file is part of RmlUi, the HTML/CSS Interface Middleware + * + * For the latest information, see http://github.com/mikke89/RmlUi + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * Copyright (c) 2019-2023 The RmlUi Team, and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef RMLUI_BACKENDS_RENDERER_GL3_H +#define RMLUI_BACKENDS_RENDERER_GL3_H + +#include +#include + +namespace Gfx { +struct ShadersData; +} + +class RenderInterface_GL3 : public Rml::RenderInterface { +public: + RenderInterface_GL3(); + ~RenderInterface_GL3(); + + // Returns true if the renderer was successfully constructed. + explicit operator bool() const { return static_cast(shaders); } + + // The viewport should be updated whenever the window size changes. + void SetViewport(int viewport_width, int viewport_height); + + // Sets up OpenGL states for taking rendering commands from RmlUi. + void BeginFrame(); + void EndFrame(); + + // Optional, can be used to clear the framebuffer. + void Clear(); + + // -- Inherited from Rml::RenderInterface -- + + void RenderGeometry(Rml::Vertex* vertices, int num_vertices, int* indices, int num_indices, Rml::TextureHandle texture, + const Rml::Vector2f& translation) override; + + Rml::CompiledGeometryHandle CompileGeometry(Rml::Vertex* vertices, int num_vertices, int* indices, int num_indices, + Rml::TextureHandle texture) override; + void RenderCompiledGeometry(Rml::CompiledGeometryHandle geometry, const Rml::Vector2f& translation) override; + void ReleaseCompiledGeometry(Rml::CompiledGeometryHandle geometry) override; + + void EnableScissorRegion(bool enable) override; + void SetScissorRegion(int x, int y, int width, int height) override; + + bool LoadTexture(Rml::TextureHandle& texture_handle, Rml::Vector2i& texture_dimensions, const Rml::String& source) override; + bool GenerateTexture(Rml::TextureHandle& texture_handle, const Rml::byte* source, const Rml::Vector2i& source_dimensions) override; + void ReleaseTexture(Rml::TextureHandle texture_handle) override; + + void SetTransform(const Rml::Matrix4f* transform) override; + + // Can be passed to RenderGeometry() to enable texture rendering without changing the bound texture. + static const Rml::TextureHandle TextureEnableWithoutBinding = Rml::TextureHandle(-1); + +private: + enum class ProgramId { None, Texture = 1, Color = 2, All = (Texture | Color) }; + void SubmitTransformUniform(ProgramId program_id, int uniform_location); + + Rml::Matrix4f transform, projection; + ProgramId transform_dirty_state = ProgramId::All; + bool transform_active = false; + + enum class ScissoringState { Disable, Scissor, Stencil }; + ScissoringState scissoring_state = ScissoringState::Disable; + + int viewport_width = 0; + int viewport_height = 0; + + Rml::UniquePtr shaders; + + struct GLStateBackup { + bool enable_cull_face; + bool enable_blend; + bool enable_stencil_test; + bool enable_scissor_test; + + int viewport[4]; + int scissor[4]; + + int stencil_clear_value; + float color_clear_value[4]; + + int blend_equation_rgb; + int blend_equation_alpha; + int blend_src_rgb; + int blend_dst_rgb; + int blend_src_alpha; + int blend_dst_alpha; + + struct Stencil { + int func; + int ref; + int value_mask; + int writemask; + int fail; + int pass_depth_fail; + int pass_depth_pass; + }; + Stencil stencil_front; + Stencil stencil_back; + }; + GLStateBackup glstate_backup = {}; +}; + +/** + Helper functions for the OpenGL 3 renderer. + */ +namespace RmlGL3 { + +// Loads OpenGL functions. Optionally, the out message describes the loaded GL version or an error message on failure. +bool Initialize(Rml::String* out_message = nullptr); + +// Unloads OpenGL functions. +void Shutdown(); + +} // namespace RmlGL3 + +#endif diff --git a/rts/Rml/CMakeLists.txt b/rts/Rml/CMakeLists.txt new file mode 100644 index 0000000000..d05f7f084b --- /dev/null +++ b/rts/Rml/CMakeLists.txt @@ -0,0 +1,6 @@ +set(sources_engine_Rml + "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_Backend_SDL_GL3.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_Platform_SDL.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_Renderer_GL3.cpp" + PARENT_SCOPE +) diff --git a/rts/Rml/assets/LICENSE.txt b/rts/Rml/assets/LICENSE.txt new file mode 100644 index 0000000000..63ef813fa1 --- /dev/null +++ b/rts/Rml/assets/LICENSE.txt @@ -0,0 +1,212 @@ +The RmlUi samples include fonts that are separately licensed. They are listed +below along with their licenses. + +----------------------------------------------------------- +----------------------------------------------------------- +--- Lato --- +--- http://www.latofonts.com/ --- +--- --- +--- LatoLatin-Bold.ttf --- +--- LatoLatin-BoldItalic.ttf --- +--- LatoLatin-Italic.ttf --- +--- LatoLatin-Regular.ttf --- +----------------------------------------------------------- +----------------------------------------------------------- + +Copyright (c) 2010-2015, Łukasz Dziedzic (dziedzic@typoland.com), +with Reserved Font Name Lato. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + + +----------------------------------------------------------- +----------------------------------------------------------- +--- Noto Emoji --- +--- https://www.google.com/get/noto/ --- +--- --- +--- NotoEmoji-Regular.ttf --- +----------------------------------------------------------- +----------------------------------------------------------- + +This Font Software is licensed under the SIL Open Font License, +Version 1.1. + +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font +creation efforts of academic and linguistic communities, and to +provide a free and open framework in which fonts may be shared and +improved in partnership with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply to +any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software +components as distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, +deleting, or substituting -- in part or in whole -- any of the +components of the Original Version, by changing formats or by porting +the Font Software to a new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, +modify, redistribute, and sell modified and unmodified copies of the +Font Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, in +Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the +corresponding Copyright Holder. This restriction only applies to the +primary font name as presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created using +the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/rts/Rml/assets/LatoLatin-Bold.ttf b/rts/Rml/assets/LatoLatin-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c598c24a3d270def997e6c8b32bc2425e7cd8d18 GIT binary patch literal 146156 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≧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 Udks7C@tk@$-)rF;p=td80#C{dCIA2c literal 0 HcmV?d00001 diff --git a/rts/Rml/assets/LatoLatin-Regular.ttf b/rts/Rml/assets/LatoLatin-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..bcc57780d8f007bfc2106a89876f44cb56936e6b GIT binary patch literal 148540 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%0A9r7 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�p8T)6I% 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

3=AUYLi1zm#9`5f{OeSj(h#op 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 z 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%0AQG2*(c4piwpZ>}`(B$9Nbq8?(LeGt;(KF}V)dMT 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 literal 0 HcmV?d00001 diff --git a/rts/Rml/assets/demo.rml b/rts/Rml/assets/demo.rml new file mode 100644 index 0000000000..3e34c11c66 --- /dev/null +++ b/rts/Rml/assets/demo.rml @@ -0,0 +1,28 @@ + + + Demo + + + + + hello bar + + diff --git a/rts/Rml/assets/hello_world.png b/rts/Rml/assets/hello_world.png new file mode 100644 index 0000000000000000000000000000000000000000..bec0f8235b0305e8a56a088ea183436c3bd52e5d GIT binary patch literal 10463 zcmdsdXHZjN)Mf-x=^_Lq2&nYXR60m8^j=NqReF;y9TY^mbO9-$cL;<|=tX)By%*`d z_l@7|_hV;vc6N4VXZG97++^;Zn|sfB&v~EoocDc#Rg|O&@j!S00Dw?dMnVk$z8UiR8c(I8&d1(GY@dE&Wh{V4!!oi&5ewNX40sx5G{v8jx z?DIYW0L;#^5+5|a=gs6$(_^D(rZ|=5 zo`J(kBL4i*?5!%VDT$fv(Y9EX^XTAnyL$oU<@eCf%FJY5Ta|IO{a6)@{Jm|-W8KmN z`c#ee=|i=amU;6_Z4K}r^=K#GL{@zF^tp`6y}qf})Ox(wVl2;|=haB(iEYLU+ts{Z z&Q}?JNp8*KjHcw#FLb4b2gYED2THL|-PV^&?atr2bSasc5=OI&M9)FaHtgq^N-Q!h zbgzR}hxEtugdCDw&qay|R6@#BS~fYE>sKA8c9R9vyX0;;aoK5EFAHH1SrR2m2yQwV zBu|X;Rf&eAeT#j_jB?Y4Qc?*zFZj&|aNL)Bu(BesfR-Vp5xavtUgIguX=rcc8xK~j z)Ds{xYgiaEi5E7TR6V{ouCt%8HZ6ROU^xnNPF#?L-th-hTW#21>iFKe-lCH`%>F`H z#aIGV{NKr&|9JwZf7YG)9XA_m?Jph0v|UC;n*` z%aaM1{Ha&}Ti8tItY&G1wUPU4x8AMiS@WKjuxLNcwDQ%UgHdX_j)0Tdr_-Z!D#d=i zM$OcNXvHhBPsFs$@pA5?4ZjG}H9q8tB{D>Mzv}5RHtl#RCYu`dD$;{7@(XybTF5*k zVL4=#yQ7Q!DB-Y{m0X@v?`Nt&;_)1})*>OV0z7|Yw96?cJSLZ(HEpr&&wv_R+!156 zT!56H+7mdIX{;{eRJjtfwWVc!HARp6rxv%hVO8x@D$Db&(zVrA5Chd+j~?nPjXXPM zfC{G94jrO*lQk&;A$}_U<*!-QT}5Ra>U|_VEDQ$597gcXr^r(L#oMdmG__LpPWDgZ zi^iz=wCtx0wEJ~bL*H{iV-xe|iW5@Lt>zBZH}z*w)X7?B!v+Zi2XDpxMbeihh07^= znfH8VwvyE}5<*t2tu2WCXq$j4`}dk6x7Xpu>(~zCU8rr~yFit}J4o=~t;H6+qxOeA zRM1C$tuHmw`$h^DWPIB=QleIvxdL)pgZtS7p2e|hkjWJZ?=KxSC|dy1-(V7et{rIW zoa zEBxx|IT|DD?#V8?5l#Onf3YUlvH#S(@lK$0!m-@6+O9lf*_@+e5&$o15hOJI={ggk z%|554<m79Kq0q;enKPU}Qi7HqcrVDwdZtc7f zqx^=kRKac9O`C^WOJKr0?naUTW2v?sJ8&VA@{Oi$e#lT3eH8+|$))1EvUk%&iLGL` z=*vWK@PLKGA}3jwqr6PRdlpNDap~X1mS7h7f(f#Tyg&(mN38$X!JYP}1|zXg{Fgh| z)o!XK*jJNhqvZj(0Ml6hmoNS999&F40v1==PY)Dx_wPxc9)fjVbF&D{=n&e#%yrMN zfPDmkjDGK4y-{(9jKTw$pSO}~E6t5M?U5|h4{G%if1BIVs5CSM)!ZO=t%{eDedkEU zR-TVPQ8Badbax*Xjbp6<0~!)+*J)0YJh|VA^p|{HB@%x#!peNPnPr|kn zXJnwD7)!g7?<$sGBv|Wg|c$C-I0v|Jevf(8& zagK61S(X{wTMME}m!EJj(3wk^uk)x2Mr=b3VA2Rmnz|eM`_m34`+(6fxuw%_I1LnP~{!ToN z$$ECA!ZDy*j!J3n-e+a)vQ0aOI`yaH=NqI?NoK&)F0iBy!@%e2*j1y)?Av_!6 zBP>^(w&vSK2k>L?moz0EmbX95$5h)}RGZ0lDRK!9+)TU4bSZ0Q)}={T(JY|+Ra8Bm z$7u-dZ~xpvwujg&mV5fCJ%D3n4-zNeic(g7Tyb6YsClC$K=!MmyGeOlJI0f5WOO(O z-n_$^gnH6}Kljj;*#0O{{Fq-XP4|O5gvkP9Y5bAx~-smLZka zxgs^kPQ!KK$*f}*34om^7T)q|eg{)l6CHUvv~5;yZxLV66Hqi48Piaa0^yk390 z*(7=-^s?PYd!cg)k#8Nb0Nk=F_^5F+nGlj4+!C4vD<~DlpcKBVu2U&2TT4%8JYxV+ zur>>4XHz_Iz>fuCV*L%Q#q#JeCegUAY6}*wkQ`gA+rT~`_SeZQ*p_(kuXchc-A^W} zeVYDi{;4-Qv`v1}4iI&kQu~F_06o57m_mn$~8UQ(L zj7J}Mz=`O5E5vqd+s%4r$f9OPhAS}iTY|W$)k6C0K22;L|1GObHIHxC4X6vJB5&G5%V5cBtIyq=uWx8K` zU+A(llul6KoeXacfjc}f+eN5Q3tLeUR7AdY%ly*kxY2#1UM8OEV zDQQ%Be6g_v3xS8p%MA{6$3c;AybA3->2pli7Fl1I8Gi5!qLR_h&{WRe!jHRnPbBJ1eDFZk z@x=+Tu!Hao)WS=_Sjx3ztW|Sic%XGIyQjG-BHWsSlnIbc^dC)S%e^wDx8xW9uhU!F zvu||wVhVUb&wZo>Sbne%2o7Yu9PyzqEnIb^SF6JX(#TC_H#>a9jgUDYjvxWw>tIsK zP9%a9+#LCzbOwF2*K44BIp@itaiqmtrFhR9k3!DPm~ab8a5a>; zM5|lZ0xZ*=a7O2@$3Q}v_P26*Hc&`4-e@*DB5{29fv|KEikTV(;%C;u)qfKa}Hx_OZ39NDj|db%uD%JSx?B zVbd3IDT4JZUzbsRHo(LEoyX-=^H9ydY@B)%2Fv()G@C7Xe6hFqUHv=&Pb}&w*#7xM zapU=9)y_B^PF>lzvtM9k37v@VKYM#{O!E}s{b?6W4nfU+iDMV=6>>zHqcFq?TD?Yj zyjCS2dde>-%lv@sG5lz6%blCIU<;0ukj;f(jSk27`TBM%@Z>6k|=hKqaplYkHnHI@xbDr1*X0C zRRu#cvGHu7Z9)}09ac9Fb&Hk>v2{bu#i|-!IK=&al@ctF+>v z5Q-_h8Reau`}=(Q7$$iZ4cE|$Ym~h;#cF@GaZO_X2bx6 z;P|=zNf|?Krhd+*h4rR|Wk2n_Bc}ZJbXkIn3e7Q8XyqU!i0Zr0WKy|6aF^TTWwm$v zMR(CXl0`oQQN`dB#ygi2BAkMPwl?0#7d0FFrHW#=T)^q%$orKBt4L+yDgL%^b!&fD zYW~K!RY=8A-s-aO#nV2?3J;ur0{=+Ab(Yo^nHf!M^E{`xWB#*$XVu>&E9F;4d8L_G z3fX0Q*=c`{KIrOQQw; zX}8~mUQ*Wd$;hQK?`elY+VOY02LZ9)R&r0BsMow1FSK4K7Z|OGp0f~ix)dtcPbXY= z`b-_hVA`K2qw}4AM_Z6WIpIHB=}w0prfsHWQ#k**+)f3AbW<<5|5YYq6ntfZq4|yT z*emA|dcw7Iw)0%$de3r#C92z&Eemx7a|ng8ZDYpDxBgI1XL_T%6Yn^7DJ-G~^F2xL z_?2U>>Lzkfy9jILIAY-NAvHA;!)9{r0xHN0Muy+^cNQ>}1nr*_vX{xD`)O9I+~Xeu zHzHFtCzI`v2F#z|GJ+{G#l`DcP*mzfmkTgmW9RkYWrmwKlkC134aIb@)PN?L@Y%Op zdv&jn1ZkXtANIfAANeBzCUs-i$A40Mv0evgNoH{Q58gGN{L-gJ^;+k8$t}qVIauXl zTX`6ww#LVnHiMXGe$Ak)aQaD}iw*|k#f;Vq8bZyWWYDHs+yrBKgyWC8uV+U)0xVg4DbNOH zD}t#v3ND#0-$$%t%~8R^R93+qWO+MFs}9abo5>`k9=t;`WEqXcs`lqLTF0_|+Yg{5 z*6$9r9rjG+{*D&YrR{@Ak*+clHdZAXRU3uzHed^}yas%b^6$HBVrtsqB`|f2AheR- zS15XVQ!~yE(hL8MW|0gh=rr zp*89)7>qmZHaO=ICj}(KCgRQECVD zv$2=NndTz0*p?CUKnu_cme0H^B(?2Mt1dLLwv-TR4-_ipD>m5{u42E{6a0}WYv9gr zFGTf>Bta@gy*?xmtU;tplx-FC9Zhr$CC_Qf;3g;mv zYy~lQJvedG3aYr}Nl+APL*SsQe7C34a}Iu=kgG#fgoJU6-|t907JPgInNZl&>>Bt= z9t<_>Np0s|+L@hRakI<@4R;5A{K#F!qmAlvvrnHM57CdY{4W1tcuc_N)1@p=Z%Mz^ zP@Tkn<&9wU2 zS~MLjZN!A|lq|PZ#z;@QXd)EuY9kl=YEXy3&hQBEkxX_wf38~!e$i&vgQMk9E4YES>K8i&o!6Yz#~1i@50}Vzrc@{ zS*zz1$uLj<@coUV;_!?%!un`gbuZ{P%?q>6#IBzp5CnNmN)hP_8^FO4%RA8MmU}Da zT3($rJoxceN_xZQkxPzLkDlxNA7Rny$+Z&$hsm6y_e-bfcOdXD$`^O}U90oqKC_OJ zw-UYx3xLG=Wod=+gIyXx3JsLFWqYC zHR>u6$rhh0u|vlZdvF$XsO+yatVZii$$4KS zyGG{Y_wtpYN*4EC6Th%UU47#iHk%eT@7@@fzAZT@86O@8O--$}pMJK|^Q@6@`$nHe_NMeS7Fs^#oYi<^9gDh~FsA4IEnfyt5kIV@59n8+%0Pz}4(dHzhV0u$_(|UmSJ=(Q{& z`-)po(|06$XEv;qhZNHKtbs67`Qe{EIZeHRRuqC)<}@RV}Lg&MWrWRvK} z^E+FrsT|x;O^3z!ebfd*Z#y)ujTnvBT_Wqrx05e-0A+4KW6I?6s-?n~L5$!RUKhjl zQpd3pNs(3Bv#uo}>l|n2qJm5I*V>hNT)%|6DTs+`@gW0D(Fs9gJBm>NH&W% z=w7684%rxvZnBrB);R&*tUZMUa)BsB|0fFxJYD$wf;pMJ!+K=22TE7RSkxazrPdDT zKDcs(ZjLuRqUPw=UZ*-)UCa0TQN?v$?t~ArNWQnU2<;l~zWqy^xn4_~`o?|+{m7)+ zdPjO=a9EYbR{NIXg>PJO?ToQLy=j=f&)HQQ1yaL+UD$hF_Gafp|Av3-D&O#eo=C}V z=Emv+e5H#yPnrw18w=<5=Ucl8=WR6|yLK;vJ} zv{X4qJ#W6ODlBrz6)l;B1Q#Idukbr*dB+ew2& zF7WVtx5dDg+uk^<4V{&MOJv&+At>!O*69gw;D1*{;VUIcO9F3sI*v~`CTd{Ys5s8MJ*a+rL}p0gw1db&AC zr!$K6WE2l_%<99+@D6cX#G*U(Py1k70gNsfDV?=BAyN^ZTGvhEX z1x4x(?Rf)|&?VIUcz6(k%KXc(=U|S2?8C?5Fpfu(#R4Q*UKVh<`Adcmo(fl^)MmT( zBJStG+e_QI-nY zl^El}h5#O2CbO7~{IpLHvH4qCU*B zn^W9Ar4~kcAKQ~kB!ZeLwVr|0N5d|CS2=`Wa>))1teM7XK~Nje!yzJudo-tgpsRxH zrWW#jV7Tg$yh3k=e^hv&szdLE5o+C-K<{YK=)P=BoHXES#@UBNaLxNZ)`g8dwbOhB zITNDjVQOuem3!Qoi-Y5_KB0L8EEmf!b+nkUG%Dg8lV7C1dmTPGqQBN?8}zS#K1HPe zu+5x=i<691S7NR0&!bPN5DIAnK;)OT=Uh27oRd)+=5P8G>m2G;iVi1}^natSKN{qAW;XkVfjT?I6XWfs= zrPla-(rQ*y44xI492?k5YN-`xSjs*NY&f=NyTsFa$wh~%mLoeN@{Rg#XFs#FnOJKb zF-JYzojob>O48n%-uHY&M=HqLmzpr+ARQbof2QxD(6)fVu5VvFl%tqI7|};Y;b2;x#k#pV?VmY3Z)%X+bV7r>SyN?oD(djEdLh z;PjN|-MftPlCMqyN2bXQvSY;SPlXo zFEyYgB|X00Z&Ei}Y7L~Mq-=c{^{1L?p^!4?{Mq>LNVfLnzEDm19 zbX$$(y&6MHNJ))&pKhVG;)ZO=+<+>96uYv8t*n_UT}% zFzME7RV5`N)}iNtM|5m#VIO5JESLjTiZOJc!D)S99_4v`aZ#jK@47RI=v9fMsa-rUJ*J?CJ zF%JCEq98c9`|kGI_hKoCK|Wrk4kmy567B5lT0a4pX+K{T>at#) zP&Ci9Zk8SqV7AEteq8@6Wm!#Djjl-o8TLV-d`K^ot{MRV@Y^U0GfiI@{`>y@pHu1o yPi@-&Rq@>qY%HvR*BB+=b&Jfu?G}>YJACTGBBT@75*0?&2auIik|==~e*JF|6tk%S literal 0 HcmV?d00001 diff --git a/rts/Rml/assets/high_scores_alien_1.tga b/rts/Rml/assets/high_scores_alien_1.tga new file mode 100644 index 0000000000000000000000000000000000000000..722557738ec6db0728f9b7932098800726a8d939 GIT binary patch literal 16402 zcmeI2KZ_JW5XE=b-~=%c6pciT42_JGo5;iT0`VJ&iGqTGC>%zD9A*llk(wwd7#Q3I z`_abtTc(!2W_PN4d*`^j?Se-#k6JRfQ2h45QQi64H9frr9f!CNoTK^L1;|8Rj5 z+;Z0&ne+;|4Cgz!p2e;*mER}nJ`)}btOb(-rN7|aB zb)?h%sPdigRq)mebkM~nCw}9UyWXgoUSYm6X6d&BC)`###>2|L`t6JGgStd}bg{wK z{LIP(d-4lcIK#bEF3Z8TuqUMQ4>|vo-7jo2?Xkf&^p)EFp6uWZ_fjd1e--{mY!tx! zKB527-4nKjb;Msf{^#7qC$;~M*kET!h`)6F$Ip9v9zPL>Z^pw)k5620b}HKlvlwH2 z?>_KnIf5fxZNHJbABdm#_<1C}6g~^qPAT73zCx7xo7s09;Rvt$0Kf-iP@#71h__lV!vgH33a@i~KdcgjGJrZMrcjXwIw>}Ww2g+xO|ds~5Mso+msLj?k9buBs&)m2C|w1;RYuGycq zyzk^hjyJL6c(a?6#?n(9+nJd+_Dme_&Sp1fRawrKv!{2eJG+_(%md~D^MHB4JYXI$ z510qc1LlDY58Tk$Tf%MOzVJYJBs>A04Qt#v>Ei=s?%lr7fNxN-1cIU)D17`B_+R5`{6sZ->6) zk&O;?;e#-Lg!ZvchUSa5cs`aq&=$Yg^+C80`tqsQN5WkjWIEaCKo>a!KLG03gl&L& zX}-XBVLY$Y2HN76xw+!5>sb6NAE2u(f2`CFu&*><#NxRvezC1a&-u(<|FwMSiscXN zE6o?gIO_;sUWR_w&vUQ`}T%)p8erKJ?wAX573VfupJI?$t~=w+l3SwuLw!@b7g>B`{B8bi{agGG$$!!J z-_-J5XphT(CGWrJ{wLHowR^|EWd9T0|4xl>Xpi`p?tjDYpL(x>Z$o|I{d_*(_z3$` z_lw11<0CcR&9`r3>Gx0g{hRfD>vN}`TYT=+Q^n(dp*psfe*cE&AG}9V={8?lx6WepEK|I(w4Qj`x;{>tr_WqzzvFOByG*_Io8 z$)2D(-_FVhx%^V&Wk`&eIcpjbT#s+NJcj32(>Yc#vIE^#Ri2dx#ehQpT_@J#m z2a7z9f6;}`D%WGnzRM8)*!@X(Ct$k|+UR4<`Wo;bvi`q_+Z%zs3E!kXXrqrYDgLa1 zL$Ckn_YoWdq~6b2`wPh?R!)SW=lgoJsPJ3kv9J2h0QJ0rP-) I;QD#sKUNipPyhe` literal 0 HcmV?d00001 diff --git a/rts/Rml/assets/high_scores_alien_3.tga b/rts/Rml/assets/high_scores_alien_3.tga new file mode 100644 index 0000000000000000000000000000000000000000..9f832c3b74288da9c6c2bbb919df653f022166be GIT binary patch literal 16402 zcmeI2zm5|z5XSST2m(C<}GW6ykJ&t&6dGMP=HG?QlX3crUUT#0U?g$Tsr@~8N89q+19 zdG=EKZGIkUf;YmkaK163XT*SgKrT=ZJV6It#+;eyHhM;Ev4u@+r`8t@$r78N`0-Kr zC2Zr5ziVMBP!~Nx2i>)>Yd&mY6WgivMMJV=q0!xZXDu$c>$=O|wfg$xPfW3i?bQ0B zAz5Pc6JJ_v*{>z`e``;+Q|n6>c@5qtKfC_@(3tna3*m7X|3Fvv(4zp_JY#Nj&}9r` zyK`;ZU#aoclv%P*eny{v%hG3oJ^D(37qzVsUJK+epxp@cp@S}C7|R@SzHR*JTMJ8J zpZX%TEJ@}6MbGn`xG-Z}h|DFl&gztjqAN{Q1#X4I5?R}VUr@pnPdwjqbe8RWVa$5$D1oHNi zu+RQ%V`TZ-d(GGC(suf>jSu*OPxw|^{&)V@+5hdD+V!;eTD(@5w%0G6q4)ol_0RfS z`d<8p{`}`Xr4jhN`fGhk^R@HiL-3{172iq=?`piS@R>ap{`i7V_*PnYXQker3S;4q zFZhISr6q~~bUNLD*=%+JyMOKdd_LcFVf*d9$g=;3p|du$b9$s7p(_@|CsXKi$_*H2z+C%a~)g0 zd;GKNL5KfX^WEd0RSyFHG3UF-KdT-D{x>P#y?EGq;Qjt_)AHTpZ|lKI1NgprB5-a2 zX!DFde)~%Kzl_vJEw&zbzkd$>e}>Y*v-N=U1I{V<4#`;>pv^P-$d^OD&&zz38i5*t Y8i5*t8i5*t8i5*t8i5*te=!1o0Dv&GtN;K2 literal 0 HcmV?d00001 diff --git a/rts/Rml/assets/high_scores_defender.tga b/rts/Rml/assets/high_scores_defender.tga new file mode 100644 index 0000000000000000000000000000000000000000..e10f9463b76a37c9387878a77659913703eebc79 GIT binary patch literal 32786 zcmeI3y>1gh6onTkjD#qVK%qpbs1Ow`TR~6DJETcV5z!*V6YvUofKcq4Ih=1ZBkhiz zm|cfRGxuEU%3j;Ep7Y(EpS?5gy2o9%i>~k9Jk3XbHUSeb0TVC*6EFc2FaZ-V0TVC* z6EFc2FaZ-V0TVC*6EJ~$An-`%cp~4(pUYp!U&&A8uN!r=p%JZUMmr2(5zWy3Ob(N` z@(=P}{z?A1QAb-ZM=P4q4g*+3Gp>E~zn6cJpUJ<=f69L~>S#kFTG5Pl7{DT$(f`o~ z;P69!B_Dz~TG5Pl7{DT$F$U5P(iX0+7ut5ay~b-bG$-vafJHQ89@NX}4~JUgxVGMC zPTG4t!y=k7?lB)?OpF?Tw8H=v(TsaM=K0L^qQ)QXFn~ogbNp|veaGMJ-|c_xM5@wq z>g<{Sx&Qb0@BZKYzx)46`|-8acK<)#^Z5SH_kX_s_x=B{wjZsvocsSV=jr@!-2AWC ze{R;kdi4bn*ME*$|E;y(&-GT!qp$y#`#)xTKQgCQp3`_g)fj#M$3{%1`@g>F_%d^9 zCGOg#GCs1dq!F#r_kWf9Kgk80Cq6@?@#p$RBU+>H|19@^pC&G}jsG71+%6yLIzy8j zZNwg}jDPfjQTKmK`pnAtz`gDVE#rJB{;Jt@tUmU&_j}Glz4w5&Fr5#uFO@2LB;>x%YnZC9-?6!B;5 z@8uEm^SeardgrM11xbybpRX(0yR~J$HT{3->>j?H|LME4&vhI*(w84TpY|R?Y{=54=q7 s{Cw-tw>}dv0TVC*6EFc2FaZ-V0TVC*6EFc2FaZ-V0TVC*69`1$FASy}dH?_b literal 0 HcmV?d00001 diff --git a/rts/Rml/assets/invader.rcss b/rts/Rml/assets/invader.rcss new file mode 100644 index 0000000000..0509f27e54 --- /dev/null +++ b/rts/Rml/assets/invader.rcss @@ -0,0 +1,701 @@ +@spritesheet theme +{ + src: invader.tga; + + /* For high dpi screens, designates the scaling it is intended to be shown at. */ + resolution: 1x; + + /** + The following specifies a list of sprite names and associated rectangles into the image given above. + Any sprite given here can be specified in a decorator. Their names must be globally unique. + Rectangles are specified as: x y width height. With the origin assumed to be at the top left corner. + */ + title-bar-l: 147px 0px 82px 85px; + title-bar-c: 229px 0px 1px 85px; + title-bar-r: 231px 0px 15px 85px; + + /* huditems are vertically flipped titlebars */ + huditem-l: 147px 55px 82px -55px; + huditem-c: 229px 55px 1px -55px; + huditem-r: 231px 55px 15px -55px; + + icon-help: 128px 152px 51px 39px; + icon-invader: 179px 152px 51px 39px; + icon-game: 230px 152px 51px 39px; + icon-hiscore: 281px 152px 51px 39px; + icon-waves: 332px 152px 51px 39px; + icon-flag: 336px 191px 51px 39px; + icon-lives: 383px 152px 51px 39px; + icon-score: 434px 152px 51px 39px; + + window-tl: 0px 0px 133px 140px; + window-t: 134px 0px 1px 140px; + window-tr: 136px 0px 10px 140px; + window-l: 0px 139px 10px 1px; + window-c: 11px 139px 1px 1px; + window-r: 10px 139px -10px 1px; /* mirrored left */ + window-bl: 0px 140px 11px 11px; + window-b: 11px 140px 1px 11px; + window-br: 136px 140px 10px 11px; + + button: 247px 0px 159px 45px; + button-hover: 247px 45px 159px 45px; + button-active: 247px 90px 159px 45px; + + button-inner: 259px 19px 135px 1px; + button-inner-hover: 259px 64px 135px 1px; + button-inner-active: 259px 109px 135px 1px; + + text-l: 162px 192px 14px 31px; + text-c: 176px 192px 1px 31px; + textarea: 162px 193px 145px 31px; + textarea-inner: 173px 206px 127px 10px; + + selectbox-tl: 281px 275px 11px 9px; + selectbox-t: 292px 275px 1px 9px; + selectbox-tr: 294px 275px 11px 9px; + selectbox-l: 281px 283px 11px 1px; + selectbox-c: 292px 283px 1px 1px; + selectbox-bl: 281px 285px 11px 11px; + selectbox-b: 292px 285px 1px 11px; + selectbox-br: 294px 285px 11px 11px; + + selectvalue: 162px 192px 145px 37px; + selectvalue-hover: 162px 230px 145px 37px; + selectarrow: 307px 192px 30px 37px; + selectarrow-hover: 307px 230px 30px 37px; + selectarrow-active: 307px 268px 30px 37px; + + radio: 407px 0px 30px 30px; + radio-hover: 437px 0px 30px 30px; + radio-active: 467px 0px 30px 30px; + radio-checked: 407px 30px 30px 30px; + radio-checked-hover: 437px 30px 30px 30px; + radio-checked-active: 467px 30px 30px 30px; + + checkbox: 407px 60px 30px 30px; + checkbox-hover: 437px 60px 30px 30px; + checkbox-active: 467px 60px 30px 30px; + checkbox-checked: 407px 90px 30px 30px; + checkbox-checked-hover: 437px 90px 30px 30px; + checkbox-checked-active: 467px 90px 30px 30px; + + tableheader-l: 127px 192px 16px 31px; + tableheader-c: 143px 192px 2px 31px; + tableheader-r: 145px 192px 15px 31px; + + expand: 3px 232px 17px 17px; + expand-hover: 21px 232px 17px 17px; + expand-active: 39px 232px 17px 17px; + expand-collapsed: 3px 250px 17px 17px; + expand-collapsed-hover: 21px 250px 17px 17px; + expand-collapsed-active: 39px 250px 17px 17px; + + slidertrack-t: 70px 199px 27px 2px; + slidertrack-c: 70px 201px 27px 1px; + slidertrack-b: 70px 202px 27px 2px; + + sliderbar-t: 56px 152px 23px 23px; + sliderbar-c: 56px 175px 23px 1px; + sliderbar-b: 56px 176px 23px 22px; + sliderbar-hover-t: 80px 152px 23px 23px; + sliderbar-hover-c: 80px 175px 23px 1px; + sliderbar-hover-b: 80px 176px 23px 22px; + sliderbar-active-t: 104px 152px 23px 23px; + sliderbar-active-c: 104px 175px 23px 1px; + sliderbar-active-b: 104px 176px 23px 22px; + + sliderarrowdec: 0px 152px 27px 24px; + sliderarrowdec-hover: 0px 177px 27px 24px; + sliderarrowdec-active: 0px 202px 27px 24px; + + sliderarrowinc: 28px 152px 27px 24px; + sliderarrowinc-hover: 28px 177px 27px 24px; + sliderarrowinc-active: 28px 202px 27px 24px; + + range-track: 219px 194px 3px 32px; + range-track-inner: 220px 204px 1px 14px; + range-bar: 127px 191px 34px 32px; + range-dec: 3px 232px 17px 17px; + range-dec-hover: 21px 232px 17px 17px; + range-dec-active: 39px 232px 17px 17px; + range-inc: 3px 250px 17px 17px; + range-inc-hover: 21px 250px 17px 17px; + range-inc-active: 39px 250px 17px 17px; + + progress-l: 103px 267px 13px 34px; + progress-c: 116px 267px 54px 34px; + progress-r: 170px 267px 13px 34px; + progress-fill-l: 110px 302px 6px 34px; + progress-fill-c: 140px 302px 6px 34px; + progress-fill-r: 170px 302px 6px 34px; + gauge: 0px 271px 100px 86px; + gauge-fill: 0px 356px 100px 86px; +} + +body +{ + font-family: FreeSans; + font-weight: normal; + font-style: normal; + font-size: 15dp; + color: white; +} + +body.window +{ + padding-top: 43dp; + padding-bottom: 20dp; + + min-width: 250dp; + max-width: 800dp; + + min-height: 135dp; + max-height: 700dp; +} + +div#title_bar +{ + z-index: 1; + + position: absolute; + top: 7dp; + left: 0; + + text-align: left; + vertical-align: bottom; +} + +div#title_bar div#icon +{ + position: absolute; + left: 15dp; + top: -4dp; + + width: 51dp; + height: 39dp; +} + + +div#title_bar span +{ + padding-left: 85dp; + padding-right: 25dp; + padding-top: 18dp; + padding-bottom: 43dp; + + vertical-align: top; + + line-height: 24dp; + font-size: 20dp; + font-weight: bold; + + font-effect: glow(1dp black); + decorator: tiled-horizontal( title-bar-l, title-bar-c, title-bar-r ); +} + +div#window +{ + width: auto; + height: 100%; + padding: 10dp 15dp; + + decorator: tiled-box( + window-tl, window-t, window-tr, + window-l, window-c, window-r, + window-bl, window-b, window-br + ); +} + +div#content +{ + z-index: 2; + + width: auto; + height: 100%; + + overflow: hidden auto; + + text-align: center; +} + + + +p +{ + text-align: left; + margin-bottom: 1em; +} + +h1 +{ + margin-left: 0.4em; + margin-bottom: 0.4em; + + text-align: left; + font-size: 16dp; + font-weight: bold; + + font-effect: glow(1dp 1dp 1dp 1dp #1117); +} + + + +input, +select +{ + margin-left: 20dp; +} + +input.submit +{ + margin-left: 0; +} + + + +button, +input.submit +{ + display: inline-block; + + width: 159dp; + height: 33dp; + padding-top: 12dp; + + font-size: 16dp; + text-align: center; + tab-index: auto; + + decorator: image(button); +} + +button:focus, +input.submit:focus +{ + font-effect: blur(3dp #fff); +} + +button:hover, +input.submit:hover +{ + decorator: image(button-hover); +} + +button:active, +input.submit:active +{ + decorator: image(button-active); +} + +input.submit:disabled +{ + decorator: image(button); + image-color: rgba(50, 150, 150, 120); + cursor: unavailable; +} + +input.text, input.password +{ + box-sizing: border-box; + height: 31dp; + padding: 11dp 10dp 0; + decorator: tiled-horizontal( text-l, text-c, auto ); /* Right becomes mirrored left */ + cursor: text; +} + +textarea +{ + padding: 14dp 12dp 10dp; + decorator: ninepatch( textarea, textarea-inner, 1.0 ); + cursor: text; +} + +input.text, +input.password, +select, +textarea +{ + color: #333; + font-size: 13dp; +} + +table input.text +{ + box-sizing: border-box; + width: 100%; + height: 18dp; + margin: 0; + padding: 0 5dp; + line-height: 1.0; + + border-width: 1dp; + border-color: black; + background-color: white; + + font-size: 15dp; + + decorator: none; +} + + + +select +{ + width: 175dp; + height: 37dp; +} + +select selectvalue +{ + width: auto; + margin-right: 30dp; + + height: 25dp; + padding: 12dp 10dp 0dp 10dp; + + decorator: image( selectvalue ); +} + +select selectarrow +{ + width: 30dp; + height: 37dp; + + decorator: image( selectarrow ); +} + +select:hover selectarrow +{ + decorator: image( selectarrow-hover ); +} + +select:active selectarrow, +select selectarrow:checked +{ + decorator: image( selectarrow-active ); +} + +select selectbox +{ + margin-left: 1dp; + margin-top: -7dp; + margin-bottom: -10dp; + width: 162dp; + padding: 1dp 4dp 4dp 4dp; +} + +select selectbox, +tbody +{ + decorator: tiled-box( + selectbox-tl, selectbox-t, selectbox-tr, + selectbox-l, selectbox-c, auto, /* auto mirrors left */ + selectbox-bl, selectbox-b, selectbox-br + ); +} + +select selectbox option +{ + width: auto; + padding: 3dp 0 3dp 6dp; + background: #DDDD; +} + +select selectbox option:nth-child(even), +tr:nth-child(even) +{ + background: #FFFFFFA0; +} +select selectbox option:checked +{ + font-weight: bold; +} +select selectbox option:hover +{ + background: #FF5D5D; +} + + + +input.radio, +input.checkbox +{ + width: 30dp; + height: 30dp; + + vertical-align: -11dp; +} + +input.radio +{ + decorator: image(radio); +} + +input.radio:hover +{ + decorator: image(radio-hover); +} + +input.radio:active +{ + decorator: image(radio-active); +} + +input.radio:checked +{ + decorator: image(radio-checked); +} + +input.radio:checked:hover +{ + decorator: image(radio-checked-hover); +} + +input.radio:checked:active +{ + decorator: image(radio-checked-active); +} + +input.checkbox +{ + decorator: image(checkbox); +} + +input.checkbox:hover +{ + decorator: image(checkbox-hover); +} + +input.checkbox:active +{ + decorator: image(checkbox-active); +} + +input.checkbox:checked +{ + decorator: image(checkbox-checked); +} + +input.checkbox:checked:hover +{ + decorator: image(checkbox-checked-hover); +} + +input.checkbox:checked:active +{ + decorator: image(checkbox-checked-active); +} + +input.range { + width: 200dp; + height: 32dp; + vertical-align: -12dp; +} +input.range slidertrack { + margin-top: 3dp; + height: 22dp; + image-color: #ecc; + decorator: ninepatch( range-track, range-track-inner, 1.0 ); +} +input.range sliderbar { + margin-left: -8dp; + margin-right: -7dp; + margin-top: -3dp; + width: 34dp; + height: 23dp; + decorator: image( range-bar ); +} +input.range sliderbar:hover, input.range slidertrack:hover + sliderbar { + image-color: #cc0; +} +input.range sliderbar:active, input.range slidertrack:active + sliderbar { + image-color: #c80; +} +input.range sliderarrowdec, input.range sliderarrowinc { + width: 17dp; + height: 17dp; + margin-top: 6dp; +} +input.range sliderarrowdec { decorator: image( range-dec ); } +input.range sliderarrowinc { decorator: image( range-inc ); } +input.range sliderarrowdec:hover { decorator: image( range-dec-hover ); } +input.range sliderarrowinc:hover { decorator: image( range-inc-hover ); } +input.range sliderarrowdec:active { decorator: image( range-dec-active ); } +input.range sliderarrowinc:active { decorator: image( range-inc-active ); } + +thead tr { + height: 35dp; + decorator: tiled-horizontal( tableheader-l, tableheader-c, tableheader-r ); +} +thead td { + padding-top: 11dp; +} + +tbody { + /* Margin left/right only affects the background positioning for the decorator, not the cell placement */ + margin-left: 5dp; + margin-right: 4dp; + /* Padding top/bottom adds extra spacing between the header row and the body, and between the body and table bottom */ + padding-top: 4dp; + padding-bottom: 4dp; +} +tbody tr { + margin-left: 9dp; + margin-right: 8dp; + color: black; +} + + +expand +{ + display: block; + + margin: 1dp 0 1dp 5dp; + height: 17dp; + width: 17dp; + + decorator: image( expand ); +} + +expand:hover +{ + decorator: image( expand-hover ); +} + +expand:active +{ + decorator: image( expand-active ); +} + +expand.collapsed +{ + decorator: image( expand-collapsed ); +} + +expand.collapsed:hover +{ + decorator: image( expand-collapsed-hover ); +} + +expand.collapsed:active +{ + decorator: image( expand-collapsed-active ); +} + + +scrollbarvertical +{ + margin-top: -6dp; + margin-bottom: -6dp; + margin-right: -11dp; + width: 27dp; +} + +scrollbarvertical slidertrack +{ + decorator: tiled-vertical( slidertrack-t, slidertrack-c, slidertrack-b ); +} +scrollbarvertical slidertrack:active +{ + image-color: #aaa; +} + +scrollbarvertical sliderbar +{ + margin-left: 4dp; + width: 23dp; + min-height: 46dp; + + decorator: tiled-vertical( sliderbar-t, sliderbar-c, sliderbar-b ); +} +scrollbarvertical sliderbar:hover +{ + decorator: tiled-vertical( sliderbar-hover-t, sliderbar-hover-c, sliderbar-hover-b ); +} +scrollbarvertical sliderbar:active +{ + decorator: tiled-vertical( sliderbar-active-t, sliderbar-active-c, sliderbar-active-b ); +} + +scrollbarvertical sliderarrowdec, +scrollbarvertical sliderarrowinc +{ + width: 27dp; + height: 24dp; +} +scrollbarvertical sliderarrowdec +{ + decorator: image( sliderarrowdec ); +} +scrollbarvertical sliderarrowdec:hover +{ + decorator: image( sliderarrowdec-hover ); +} +scrollbarvertical sliderarrowdec:active +{ + decorator: image( sliderarrowdec-active ); +} + +scrollbarvertical sliderarrowinc +{ + decorator: image( sliderarrowinc ); +} +scrollbarvertical sliderarrowinc:hover +{ + decorator: image( sliderarrowinc-hover ); +} +scrollbarvertical sliderarrowinc:active +{ + decorator: image( sliderarrowinc-active ); +} + +scrollbarhorizontal +{ + width: 0; + height: 0; +} + +textarea scrollbarvertical +{ + cursor: arrow; + margin: 10dp 0 4dp 0; + width: 12dp; +} +textarea scrollbarvertical slidertrack +{ + decorator: none; +} +textarea scrollbarvertical sliderbar +{ + margin-left: 2dp; + width: 10dp; + min-height: 16dp; +} +textarea scrollbarvertical sliderarrowdec, +textarea scrollbarvertical sliderarrowinc +{ + width: 0; + height: 0; +} + +textarea scrollbarhorizontal +{ + cursor: arrow; + margin-left: 7dp; + height: 12dp; +} +textarea scrollbarhorizontal sliderbar +{ + background-color: #BC0000CC; + height: 8dp; + min-width: 10dp; +} +textarea scrollbarhorizontal sliderbar:hover +{ + background-color: #B82500CC; +} +textarea scrollbarhorizontal sliderbar:active +{ + background-color: #770000CC; +} diff --git a/rts/Rml/assets/invader.tga b/rts/Rml/assets/invader.tga new file mode 100644 index 0000000000000000000000000000000000000000..3223e72f34e33f988e0962a35422f8a24cd4d3a1 GIT binary patch literal 1049115 zcmeF42YggT7saC~yAj0-DkUT#lt4%bq4y4cC<1~C*hLgYuplCK5IbN6L^_zzLFv8s z-lW)QD!mg>(D}}J$;2fj)BwBTyx;G#%jUg#Z~puCojZ5#%=r0T>zA@!>vwIaJLP|R zBLX5I0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+ zA|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`H zAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+ zA|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`H zAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+ zA|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`H zAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+ zA|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`H zAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+ zA|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`H zAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F z0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+ zA|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`H zAOa#F0wN#+A|L`HAOa$A$q3}?5S0xU64Ey$;F6u>G8P=tA?l9YZ$;;>SFhf+m+`bZ zl?aG{2#A0P_ymF6?F-io?^$wXz7ge3zR?v-#Gul9^K>fu?(Hpa5A=x&q`JtEx1#HZ z_b#Y zz&8lwY#UW3Vrbc8)cdFncbOtT{V&Nj{m(?Lu4VFlU%}*RSEP||)W***SF?z0XzL%L z-ltWc0uw5kkdI>C@Rj=LIz>PPL_h>YAfpN7YMDPIqJQZfg_fY5?5X|9J^(+9oL9|+ zb}2S2qtAV*%FEq8>QQQZ)VkXL`7$0pP2p8F>C^n1`|TnPF4Z-tToDif5fA|p@KyrM z?+fcuVlnkSYQ0Ch-)bda5d&bKK-ibX=Xh&9QePMP{a-CGwelJ3#8^i}e3`>JUWkfF zeZ2lJ0wN#+A|L{pnLwToioR83OeIrkL=_XAM%$nL08aaVPE`~7acqBIVZpwN{K#8K zv;Cj!)07)u&6FBh*@Sm1J};_6l)takP1h*`A|L`HAOaUdAlEBVambJRJ8DHuQ{nrn zre?1SCU$wPQ{&~f{~zN4a=sW@ zrpk~irpT&VroiONCQqm6c9-+|bS@DP0TB=Z5x5crIQ}jCo02P>T>s>Df3YPsO{IPn zOo^%0OmuP^nPUJLN6+&~?3Y*KIxps&A?=IYg>irXu&>|x0L5oiGZh9_FmdzoS#lkn zT!10vj^})(VBU*4pNEjo;(R8*F|E4lGZ7F0 z5fA|pI1_>Jhr+X9Y~1gsjg4b_IN72X)-=(Gi|6fE`lnni^4)x<^1S_TVO`?}7D8R3 z5#O-&Oa03E4wA+=MwR#W`sn&ZKmDC*4AxSZSLZ!~VWbG*eA|L`H zAOhY`AorWmk22pqy|zF5!r3o?_VRBbZHl|SzeeYNg<)Na^=3Xpdh;CEJbYKm@#>0M_XY>A`fAkH)dzD(6S=Yv4 zpGLu%Rnm_EU=GBBGpd-74$-f8=eMY<5&;nq0TB>^^COVwqu36Svl0JJF9(kO{*%!5 ze>1xA`IYQDd*^&MGCS8f;+jTj<^iPmKqVLXPOWsMA|L`HAOa$gK7qV_OKo7^etNoB z81n!kH*nkSEpHD@zZBp9OITOr0dT#8^!y->1sqxa-&`*j3itimss{<|rfFrvo=5sVj!g_S2r==BM$O*Ov}v9LiG~? z5fA|p$lL@t-(O+m^;N_CzSS_#f0@yhO|f~^O?2`c0L%%p=-Jh{-rphAzA_k8GI7xVXyybY&ws=* z0-Pto;}E?S0TB=Z5fA~NBf!4@bm#n8k9qzP`w#6}tcTB4>;f-1*Xu>@Wv*iptNC^e zMDi=+A^Ff>q8xw=1gyhEKmHi`i0wN#+BH#-IFpjM`usAlIsC}U3_##o>OIsfCz|y2#CPtA`tR^(U%#^PIJB+ z&Uc47fx>&2oOQXb$6L;Wb&y|m<^oP@9w2hzT*y63O!JoO)pdw~2#A0Ph`{*}$n$>e zJL%5*OPxauoU!opDKj(d8}e@Sb6n>*J->+KCGz$yy*M+}Rdo;n5fA|pxcUg>`5^Wa zXWiR$+PRE#hjlAH^lBr6@eYriv0nu91BLf1_2bpXMfDW{5fA|p$Q%T)=G_NpYyXFR zU3^65sO`Def^#A|?f~>KtFe>`5Ajw z?=LOSM=@_iVh-Ra%zsD@r;LrX`F}l1O!WSm=n6$Z1VlgtMBsD+A#WCWJaSTHQ+j+g zQ+iAlQyOdklpI;f6vw>(u@kD8BGABy_%d5gKQeQF64oWIdm)UAC_1@{i5pwllo*C} zk%m+-6$Vx?mHJmOCBO)409|!?5t;j2SM5YV1VrHKArSIfRE@|n6-`O3Ya2Jeriocq z>y-AcGuQoy^8bcE6rSbkq2lKk-m~Nkj`2Hf{vWjcqu16lg}5fdN3or+CMK$@2#A0P zh(P8cko%bex$}L0hWUSy|CWDzMU%5lRME^+>$BG+Vo;es(w+a8Ya(E5V4e;!&Cgzv z_7DLP5CIVo0WTzg_3rZ}lsz1k-dcCbT8HuQPkG_hUy@78(Kafl;}c<>zf=1C?fQRY z0-q>XyQoT+D|7OvD{talyI>5fA|p5CIXm00Mcs#C>(9x$d1c0OHH+@I$QN z0*d#!L&Cm@>rbC2-MRlT_fOvbrGNFgis^zyKmnfJ?ZxSGaiDq|3bSI`!-VoP^Cmb1Vlgtt{MV49*epq z--z=6aIN1o`@5~?b&czl*`efmGdjr^g3psC3-UEuc2%t3V% z0TB=Z5x6=CB%s0A1x^WQt1Y8dh>mg0ftPE5y z5fA|p5P_?UK+b0)v*#OD{zQ6x08R`5Yu-lmFY_n*3xYEvov_b~e-}9qbN;5D@0T$U zw*77F|J~?^GGqN!ClL?<5fFi^lK|HF8_U@DY5IqDZw$r<#!RhZ3QVnJ@_Z2UVrCp|mxrcN8 zaeOk{RvkpSBMM?7_IP)OPscOPLiS6#gHPxkyfCz|y2#CPx1gL{OORkDqSi@Nhr~=lx zDGnWs_Q(lvbP(g;Fdxv6(+lv;Pq5bSV+AH){9~&5{!>i_tfj761VlgtL_h@6ClK;h^aF*z$9g~$p!@0dgChr?^8w_3H~P`^OY)7s^^CJ+|A<93zSIHll=YCoq zKyn^jN-p5gaz}E#998K2&fq+Wc)iyG}_guZML1kOJOYXYV-ACQv^&pCmRE10);>5cFKvSsWQT!zxn*Adz^ZlE*fF`c=7 zY|cOT(OSQk;XBbOL_h>YKm@KhfzZ#34UR;lTsJc+(ZX=<~RM z&`)ANb>=*#kApV;DY^d1aSqm<>mp&U|37YT8Fk}%6t7)HKmdbJ)B(s)#YKmG!rG&JMzAfzQ5)%qct!$#FRl)o|X|HwUXn%5ULwMg(>ofa$2j2EQ>3T#!1Vlgt zyn{eUJ>-e$f|@gRqVL z{2aUB+2&7a=X+dZ@!2&@Wz2INg?2yZJjm0rXxmG5eJWQ3L_h>YKm>f1K+ZOiB_alu z-cIIsh$w^?T8Ei+~7-fCz}dr6$06aP#&p z^{bN;$b7og@&B~6mVN-VHX3<^h38i@1*TOt`9_xiH@tVLRiRyqeU|Ip=!YZDA|L`HAOb#5AXm%CJHx*&KAU-d>^D!Vf8Dd4?Y!rD!ec9&A{&xp0`MK! zR;M4qcs=LjL41IEd^jSZ%#MgbWqyemSb8JgZ;KdOb|3r&XFeXDlezp(P9NszapDW` zEn=2nogVlAr=2&oKSE!G`3X30-hrk6$o)!GMW6pdQ~?nX0TB=Z5x7hQIG+y3`K9F7 zpC#rVJFf=xx%#R4oE#T$G@SheD1+MUYKm;-sfn2XgRS)l1dJALvXNm=s=6E~y z7o^hU^#0FSek{fqoTl?OHA%Zpzd?N|L|TV z*XDjLs_rGOzKRzC5fA|p5P_?jK#n$1MZ&riAHcbQIR{V0gi1;M`f2ssr=k7S@mT18 z>2r-4c;pe3`5yE8V~&5e_pvtd3XB(cgt-b=^%tVbi+~7-fCz}dWh9W}g#rzk`hbmhxfRh>!%L_h>YKm z4bms@$nlR|Qp;5BU-7@3fBFmjJNgs~A)kQ01n2wVynUFPcvt8bal>-I72Sln2&qo5 z|B8SJh=2%)fCzX20nGK26Km`|9NH!BtMHyBreI#-Eh*#s(O=JYe1S=5`;SR}kIxuC z$oD<8erVafd3%>yz&1YS>}#E?ZJ}sC<9Cf0R7;m20wN#+A|L`HaGnIh+l6Pz{d!Ek zJRM@Y zKmYKmYKmYKmYKmYKmYKmYKmYKm+e zT)s9D5CIVo0TIYB0=A7zJ$J#VkvGA(_Rbx!9I%|QJ7L*jH^b-?&<~)m;B7v@`P3&H zuHW11gGOXxM#xPRXCla5Xtv-xxc$-gyOVTC+A|L`HAOaaifI3I5r1n$K+1{t_QzJ{l%KQ75 zY~=4>rHP;4jn(k~(y$m9{Q$-V*mkx)0CkskB{!a*eHhgK8)5WQ!ePnv38?7rUk3Fl z-xy(zs`%WqK8$g&KI|uu4*&?-L_h>YKm;-+0ozWt+Ryktb-frgzrM@$$!NFxyMw{O zLrjtlKIwAxSQZ%g=!@8=IIIASJ^=j&>MeEmO6ot)O@D^k&Hf4YRnV6y3cYXSa&?)2 z`W*SMJ_&!j-Cr*Z47~q2>{9~9*g!7WEimiTu)Hf-C!AiJ2#A0Ph=2%W7y)XUXFHkg zerkVQVBo_qc_be>Ttm$D*IPee$iHs)M+w-MK0pMFI(t3rO7{b>PBxZtE8er8 zA|@!P#jC-=2}iB&-+udGlQZWKbKQ0S)h8&ZLvQTMSb+5b7zdzV#Pa9^XcGYu5CIVo z0beJORy&zG4(+e|RB&*7BDFFuF2Qu~G1knPKhMltu)vHSGtD$^GBm{xaJf2tgJX)o zm@B{-0CNYgR16?>ofyj~7#R5A6T!iQ|6+Ygmx(vM`b;o$=g)WQGkoL})8M|rDSm*< z)xH~!DaGSpJf8grjBC&bVENiaKm39voOwmSQ{nd2V{LySD8L2&SZ-PFoT zl@rX&Idjaq_3O>gzx`@{+5DT?@Y5!N$dxp-*hGFhSO>j0TB=Z5fFh3B0%l8{o~AQ z<5+jJZ$oPb2lwAaoqVv#5VLT}VzhbF=khJDu(I5VyO-yR27P^i{B4X|?~YPqSp{Qm0>|bJrhCmMrWG82nFQV3SrT zhy4H?N5GiEmCSFz>9vV~2#A0Ph`@Ohpg!81KlasAvrBM{KQ%Icfp{}>_FS{^=by}i zMGMWu$&;M^e;X&aI?4Wjjt7X2N$LOp80Cb(u5^r?_4Dl8xYOVNfxA$*e{Z^Juo*Ud zlGCTb_=RVkHvRmwnLK5RnKN&$liRR##d6cIksTM1T!~xBcS}2L_gAjGTS{S2{j!^`AbD?cd1jcK4b?|0b?@f|LKxzJB@uw57|Jp^lT# z-?28Oj{G}wA9LqU>IcA>z^_nVF<2OkF#yjP2mY%~1VlgtL_h?*mH@Spae4O7v+W-N zD}}l5=2IJM)J#Y-KaM#7a~I4rv*ylr+Qy9ge}sPj>#rZ|=zmbqJMB;oW8-Z5+t@hU z;8$w%^mEu&&k+!CZ*{jj-kHPjzJ^1bdeXOY!0QRvb}`%j?Du!Z`vnFzeU93HSPdkrEjsbjk80nJLP!{t5 zI2Pbaj&sE6wTXZTh=2%)z!?cp3vEsu`{x24O=O=x z{ey=dPRjQW4*qU;KtNo1l*9S;Qpf$TwD#kYQpO(82cTc#^aJ3vpxfPJ8hwDMs08FN zE^y{GJX5_H1Bi^Yc>u3}jxu6k%yncAg{RMh|7sHf5fA|p5CN|tVB5lWOdR{_i@98# zow{Xlf z0oV^<>mLym^!i(@`|Yd(*E?=fT69CPQLN%hCN$E{FSVHo2mp5qjeeADh>_67+{$dLCziHE6BUJQUf z&=+5ga~K2%584N}$Myl(`3~t{crycBo;DE>0TB>^tB8Qrf40-9Re2GzE{n17N2q;$ z`b~8D_S4fn&I34j*i?-5cjm%9>F-~w4$26HdA9w1LH8^N=IhyckBhk7{eC8g)-Q~7 z`uWov3&62}bLP)CxpF0q1q=*)yd}!9evlmp;0qjZ+1f-v1Vlgtt^xwoB-{7T`S}V4 z20r){H7_J29&`LJaP;4{_dQ>!g^Ue6{HUGdzxxavUkJv2f7|x=m3A*V*cbrw0GPX% zFDU5Ej$~07V*%1z8-Uusbop|#5c47b@9v~HNKnuReQ|sd7}rnW*aB~u_W+lnO$0j(v1T&e%HjlTsBY94pqvS>o0wN#+B9QR}Y@3(QS;o9MR==p*-OZWv z$1~)ncj?%!5z>?5Y;*+d})g2d-jFccnJGT{>uSq_y~^2Sjvo@2OzRl#eAi^ z)!SHo?4#y?^PVyHENf}%u4-lOUDMj!ySBBdx9$a>G+w)7t6Q6URy=R&ENJ2Q0u=__ zeM*k$`5GtSHYLcFrK1K1Vlgt zMBw5HcxoMU|MLX~Hh7p?$J{^m?Wd=8w(p<&asR-;CT#24zJELB-`CpyBx-#k#zfd} z&;E>9j_G4P`wyCu?p#33hvYl}_tdrX0Cf5W$1)!>!`1?beY;xcs^33s>MVrzqrFV6 zZ1~$NrqR|{O`~nr+Tp#g8tQ<$G~C?Q@n`D&_=356>2ppTp!ApbtbXU6cYM*O#4Vsr z1VlgtyovyyrEHUOj@sl{_e-x+=h%kjoPO!ed&``6#s`wd{SEmSse|QEMi`8J-Haz> zSYJ2Fx}2M*{xc_n>mWu42Y#l6&wD}uuY3peH{lC9v?*Ai`80)ef{tNs7#x&^Xu%Dyy zkjAD^i;@+p!_LCz9j#lE*}RK9+TD{>*SkHS7`BU@c0bzr)cyzlY@eyj@nzrx(7$0{0Q&)|jd|3>yiw&%@YE&( zA|L`HaNz_z^`G<8Fh(8ea&_uKovT+L>-{2@ou1Bdy`Roqljgf~yL=%8z8pp=K7(-wzfj-3rb1C#< zg?p=xe#nW3H-IKm8*RJ)fgRBQ%w+Iq=mW4%gMA!~cW{hDu}(F6fT1=K5CIVofeR;) zmi`xVyFcttoon1A{ds@c&ixT%0T~PDzHaw7OK=%QVH`h5oumF!LoX=KjpMH5=E=qC ze<8$0zGPkhS7)%Z&T)GB&+!spb(@gPrO!{O2)S7OzbL<`$V=rLRr}##CpVs&$oM!l z(rNo=ChbqIOOpP#b8;G)=U8*^OhCX>=h*&dI~V%jc_?-6 z@h65k>)xiPbBuGhf8EBpyUoS1nOgsYf?oTGT&h+Ze8zqe&WGH)@5JQxfB)@iaJk_2 zf00+9|6?98bul*1(SNj!Gqe8FuVEel$24$kW6fz#nv$R1CH==urA-7xKm;y=Kx+MW z;{R^xzxa%h|5>5NHZ^zaS^uvd-hJz z|IOgy8UMey_P_LB`hO8WcpWMNA|L|E1XAn2lm8bK^r6$weg6Z4&)U!3>4P!J?cAO# zP-bT9|7TylodXbaBEQp}`p>a_XUmKD>Q~#O&&+&f+T&|8^Q0MNxCw-mcm;mOveg5V6jX1VAEEL9h z1T$0qKXdn^-R=*Zyod)H4|V(^&VP`)Z^X%q0GCc5ruaq6aBLA+hUEVjZe6Z!)lpY* z{vYN%ihI9SH}KRZ0wN#+B5-j8*cP?p|DE;j-0rtOp#E2{j6&s@OJzk=l0_~KUc%}Kh6Qf+=uAbtF#A4Z6Y87A|L`6M}S&K{kL=7 z=5@JVe3?2ITkJctVDTdO08266eT}p3oo9QO?cdq+=9wFBOq%P?-@njZD5n67aRkN_ zST4)=waw~3V;G#vC=6D@?e4vvTt4}9j1&7{TiU#iQsa5HVVfU zgt2dhIhJ-#(1VlgtE{;HItqb+{uj|Zpf9IVE&YHIA&Hu|jfQ5(+L`2y6 ze;;`sm*Uyhy(q1_xN2S0(PZKo6UmSNmUp|qJ3{>*K5BZp^Z$|wa|3H(?j-K(a&`C| zW#xl0w!%3USuSHP7rYgHyILpq0o0k_!kPP@^8hdo;LHQaIe;^Pu`Zn3h+`bMmeJiy zo-;KjK5j~Mt+T`r>m6S(JRK+kA|L`HU&L;u_nTk)bl&;IJ-}@2e;I z&Tq&$f9hb3qgojEU#@q9qmj>*<{XpSL_h>YKm;zHfYm$pOQ+0r8ywt!EA_5hk8y_c z{H2a{(+6N*z}odcnpfK;^>qga_uv=+n*+eLglv1)m)dLAA7bpEd5n2ru`bu!-;hVO zYU$63OeTz#%$+~qWY3<|{`dF4>z?E?GBhVLqFHpV5?$_IUS)VwQww9_85_TQ@w3jn zfSf1SmyP}WtPA5C?B}TV!y~3_&-(icwJK8$EVYS%2#A0PWDEhT|7`EFf13T&1>NrM zQ>k|?TAX>V`%S<6Y(|crZWt>F4o>(Ba>*P3u6LI@-whx6#6})$qceZO$%n*i>EPgR zR+7g{ZALmik7pi)jfc=j;@m%j;*-`yaJ%CVBa9G(V^Ifc5Md>$f`R`O5Y#&lQ1>|AjWKVIcguqu zz`E4`TW(1(v*ykO@zSzqW(`H)L7F0f)H+xOp*zEA|rSNlS|`peSAiGT=*fCyYP0o(3n4gmF< z>)jT{n!Y>e1AN(ST$F@THCdqY{5 zaL=;H+x^vi9A6g3 zaqr9nU|u10)m!HSvi^_Ffnfdf!iu|GZM%{|SXhFYgS@`<;vn=1xE|tv^C1uX15^EQ zEF^uYi=OuvWoQ!t5fA|p5P?fUz{b8)^4|A9%a$#{%$POjjM~RFZ-$MWYO-c^ ze1Lxg1M4ydz_D6kFy_(Gub{qWSpFNz%BaoOow*8(S6~bz=j_d13vK_MWbjJcQR%LQ z$hJRyAjbYHS4ql)aJxU|SV+eHQ`a3IX%hhv$RGmz?b7&MNzd5sIFqG!oGshFq8M!= zkSPi99_Mewjss-7y%6+o3-#~aj!Cia)Oqi0_pU|G+x&$K%u?hD)~m;H07H!1-3#m9 z2UJEGQ84N$b(Q&r)(5~_uh?w8>Gv?_kM(BUqKwFUP5Gj2i6K8nLg;@Vyl)-s}75fJSZ6a`q2v}Wb|016)e12JD%<+889>;Q69*yN& z|3H2KU}(#f1bA=rKIc83G7iAy`nVhQykw~aXRbe+`$j*2bKp;#G2JX)y40B?h-2TF z2XOoCcJ8}&U!yGM0#Z*I2WM^}+t@q@&v&IatNnaNFh+VrRaa)MEkKy=LbFO87f4@a|_&P6=3k z81<0lvV8ug=xt zCSlzlYX8jHb4{*XNq$dIQ2W=C%VNyK`a4&$uDA?sB9JKwSly=1GuFm=HaXsgzh{mg zJy)ae&*NzP-SRobvgr%(dBvE3jRi>m0Yh7+Bf$HbI>mcEB@Ynm-VLD^R;U}z0F8A+==cE7Osr{k& ze>AM3%k}9*);D+V1T${pOvBuU^m6`x+_>H>gdfy8dCY%s@PI8qR|Ms-AA!#go`cVg zOHoIbNh3oV&y(5A-XE8OA8={&aRStNtM!aAvagY2ZbD(JQ4Pf!1;lhn(JlV=(B zn^Q-FgS)R{n;K;mgXM!!8(B7eYsS|ul|G{AQ#RI(dP2X0{s({Cw%t$dFYj`_)`Qoa zHR}-bRkyL}&hzb~GTMy|eW zwjQh#>*g7QW!<%jfF-~j8ybIee6|#X6^8Nmj98vC7g_8%ymEi$Dn-IrPAH7?fARUi zSb+5b_?zQ1ME4;eXv=g2cwbwMkuY9w{BSX{i*|DE1AIO-yOgLUiIn?C&~ zV(fq&6ZqLI$W>L8#W(=_0{GivoQ?f$e8ykO-<7QsHIrIGZKVG}AD_>S7+8hCz}8(* z$A8(^@iON5<(S9Raeo`<;Hxw45&PJ+elcIdc7!1L4DlTEmyx~=>tS`D+Q{#R&n9x@ z_rw_HxyC!aeLvQPb)p}|?~3;c{Q~+s8OapIY4c$M)Os5Ao9&B|u(GfUu*$G1Fg|zE zGyc6YtRk!&jK|YoV43s-ICnSi!>q8&-Cn^dwTZxGCt!7k8bf_S9zf}G!NKtd=mWIH zdOz&*PA>*vwUP4zcK>Fax%uX#wz1p&vjD9x#_SCrDn=1MHmv0mp*r<76V8f>||Kc;gZw;UJ_y6C+sA_f8u@sCk8uDd(j4=V; zm%KmuJ!`va2}Ep#Uc>H8gl0qgsrw~&qd5MvvS)MaRNP^8=4XAOOTiWL(a{X3gZ(g#?% zX0_?rYrMJR4x0}!V0S=3!!{_h5-bi@5Ecrfc3MAx&v)uJ^_$Om{^qPdz~5eK=%bu-3X0}Fr!!Gd8~U^l?B!frf^aUbr> zV|XmfU|Al&sa$BQ(?X6S`~~eVu?xEYho9eF+x-0Q-sYzh{%KEU9USXU=J6;F1 zmD--#_&N8XCh!>QFx!drDQt{98t+TPss;r$?}YyPeXPfAw+%KO-~R#g8LU9te~}Z{ z_w48Qd~b6bdiR-_vfhE){a#0u83tpV#8Z>V@M1UmG^`t+J*-DeU|`c{-0r@=Wm3IQ z*N<_#2OV;`+J6cL#bFUJ-Xr8~eJ#Az<}C!M)389;b+B7tIbq?jg0RA{=(8C2;l4bE z$FdBT#WItBTOkLb{jdnM{bSH>FaIaB9~xf&H$T7ofARBc^0S}cLqDCHHO0OSfA#aL zjpNH94iJg*oP2;tymDLsf8Tr-v3KwwXCU{>(Y^OykBw3}fv{`qlT(prFU!MY+{s^aF~)3d8t( zr{1yejj=bLn;J-6XB^Jc_!eTCOun1U5 zSasOFum@mG&tlw%`|=nb%Q9FN%cReTE%ZQ=6@(8^VmBTmzoV@W?Qa6@e+;_+)FwZ_ zr#D&)2xyV=-hOuK>!a`i>TO070e(bLl;=E?qVURR5uY#ojZ6OlLEBY9fI7x!EAM&U z`_$ry;NY)E^Lc#doe3sBVUm;YpV|jlvTO;~%$b|gkIuF;*9zo3`OFFUZ+sx<3;y=! zprEJUM^mmg%C7{YUeg!gZ?7PX{s5o%{2fvYJ&jr)3d;-252OD;%`XY70IMDtc-Ql8 z_h<8vmTipC0ba>-*!z4NfjU^_@Du>F1x#)alclISs83z`rHU`7_UyD{o^M z9P3|%{TK8%=z~y)_*|lHliS5?Jf3A`fzh{!bh%o*Vz1w7Va}Z0w>5qE{iPp#^!cXl z-}L(9n{Rvn(X&@y-?nf2{?P+<>C*M<-=2N`gXM*zI{#?vYhT^&Pltj@42*p)Sz+{1 zFP1rq(3VjIpwW!i-wewe6*Xr-P|&2Ketr|og&2=z87wQgOg@jW<%RCk3c*T2uWLj9 zANbAB?@{RgQ_%lsq5mzR`AIf#;Nk-T0j*O0Z$JOVT>Dw!5D9{ zK0bfr+C(6;6W}wI_d2zR`o^~Co%lIK2M70E&F3-K#`}Kk^i$>qSh{?*^HFbOVbpgT-_uXv z-?$HB2$f+q{QV0y!TNpQ!ngRzmVf>AgH7$bhM19~r#XH2?CVc!90RX!(v(R~On}-? zzh(Zyg{EdLo9`EYC@84Oy*Lm35XK&YVbq|E(0&x-Xc?bzH^agL0!q|&yW@}8dR%v1 z{K=*dcU;zQ;DCRA7(3QX#XQV2=gfvbGZ#MBJTrH}e4jO5|E#%lFt_v!%)d0jBn%y5 z-gxt)4L9H1XTPmKUxR{LzX~?=_t-Auy{Tt1Ab86Lop!@=z)DcR_wN0B3*P_cVZY%0 z2G}~-nq=d9e#XE3W{t0Sc_ZC3>W zPal9fM@`BZ7+AWL+daUUCpWSX=gOPm_y9|>PR`_MQ%=)<>jUtWnoI3vZs6o;v&}Ot zMqvKj_*Ajq0ejr;E;C)Om%0T6-2bY-fBpw?-rBI5uo}t6_wW<4HwX;;U+ciYXFqkh zJ{XIfvCYtkf305Je9K@{_ue7Uk||Cw~_Nf1hdb&Z?oqhB+F^Yh&&L zub2H89Ct}ugLRpF$?SEr4!kdxuVg;P634F@J?01V;U}H{xbepRhwXQYwW+qj9i=~* z6UKg7`luPjA4O@q7y^)5#_7Xg)m*Mgi5~h-ZKvKZfz5->f=y30zUOEB8~1Vi03ORS z@c(KsmdW27w*1h2TFfDY`k>eMLjNCw{6T!;_8g`5FJleYo#0JeFnPeO(yKO^*`cusgu`# zF1kwwbB>%v&UH8n4~gjrCxi=m#Wyf6EN}1N!vq`%m`l-@x}v@&{e6FUNop`v7i* z1;G@T1q5%{sL`-OutveblaD9sKil-w^$D;Muy|NMSRYvLNML+qRvu6UU@%-McT{$Inl-cNiyt z{y()DIfT%E#uL>3_lA2(*Wfh-=mW5=%V({J4^X9?+ueTypUa#d=wqyz%XS;vp=tH6 z+cvg+^Xaq?_4YV>sTUBXn;f8b=yzc9mKT-P8}3#j@A@xYjIQzT~u=etUlVO8({8TnnHIBgd~0AkDW`y9jfpoji5uFtkT z^?e|$C+ut37s=zojN@FSrA6{Y_UWBnrnrw~Z( z15l@OAWgOyasn6e+06NL8aEl5l3&l~_?gzH)zRfNjgN3>y0jsC&yW zrvTsEwy)if$D}?N|378=)YCrqJRgsv)+|}R%)I~M_l_Tvq%+^`4hnj#9_ncO`)v*| zwf|D+4a=mKF}{)?^CpkCdKVe_$%diBhdEkEABFyv^>I?y*|ToG_@4D)-S{0dACtKN zKa3q?nl^oRh2??1puJ!e1!JBBbHc1YhPT?TBms!+Df+)>&)+}cGxqI|g|UrKou}@9 z3i~M8_@1BfZ`_Cb&f~Gk?f+EzUl`g?qyE=|{yzl$e*yacI`qE-^?g(Q`lGj_jMKIk zUYNea&+ijxzO|3>{vGIl%gx9Eg#K5O{$I%(Nayxu0@eoz#6>b6fc>u+r*>Nbx4SFX z&~wJw#TH9ITYZw#Ry|WJVCsxh$J?Dvuh##x5qhxrjC!8Bj5)}SUyJ_a)Spvl=tHot zdGgd*PM+U?^Aq%0f*gnPs9P==W6amX*fzI1b1B-IR{wcE@a#Ur>RnvihigZS8s)?~ z7#F8DrseOXuA{I1pLL_pM}Log+4xBlP4ng*Q`-ONlQ{-PMPSU$=6z_t7rfPWB?&-q zQ|tdmd^QU<8rC1iwm$X#eOSk2<9mL_zi}V#I}7^1F>U>ig7(u&LjUiA{yz%+e;NA! zCiMS(=>I31CQsgS7-gKcZP>8yxSwBFXuh>Bc>f;s|Aoz%KLGk)S^9q^Zy=r9+X+zn zs8#d<*!E(7HQQmKfq^eQ5gh#8ZtB*JHx71U0n=vAbu^Y*>#13Mw$GR~^E6#PlV-7R zU_SER&$LhKzfs?rM`k~#?ptkP-@!ZYj=~rO8}A?d59SN#j%Ij%)aOpv&9E%6ORfDl zg~OCQnO}IS{ulpf?MUc9+rn%Ur)FvEmRVjsza#boO_(&vJpJ^0Y3VFlch^7v{EH&e-nw>OvA22i>3=5Kv_BttWc1GZ^}FvW zSMHVl`SaI@Poe&QueqUgA>K&9`T)#VXUv+hakg7AHsCJg1oWJ2+peLZ@#gJ!Mmc%@ z)MB<>8Q-0aaqEm_pO0p3*tE&aL00^F>!&|MzlLo~`Z>0Jc`4fcDBjuVQ>Cl_qehRu>hzy$EmHp{PEJ?<)&5Vu zdA#KXihCLL|9{Z`=7+0Se|P_V_x0Z0q{*;dk3BYS$JD7?j-;*pNuMrXzWZ47=Ch#x zw3*QVF+1jO|5**<1Fnf(ELCWm2d-A6G_?^o*wgonqQ zm)eYU=KtZC^_j?JJKuKf#-DyV=a>Q8kc>Cb*Wg%rjw@$-zk82yrfRjpPOd`IwGB>m zxjJ`c9|o=)`3z3~JLCQIYv|ulms!_Ksr@M4ISK7CY_# z%pU*uZ2vR2GoAK-6gWx$0l}NLH1t2i*i)v=EBo{1Q~TeW?k8P~ zR}-+hNFTuV2iRCZPRMCNm+Rw?&?m6V`T@Cf$D5`P55xSylN~){41jTc#^gP7+Nc4k z+xg7XG(08F_g3zrNzdVKC|B=eM8P~ z!2W;E2l!;OjvjLWBpd~!LNI=3jG5T@4Bl$Hk_6Jw{|wLngZ3Y#<;z#+Sn=XdAFfvI z-Tn98`^}#F?~mWrr_ahmskQ&`;iNeLJU^c>;kP4?KR$WKpYN^l?`#hF&oYU*xi7&!q3vu0QtN;6`2P$Y|L3XyadA%_u2SXg{nYOU4f^fgvgN=DtMkj3 z?>PS9hYR;NZ8~P>JMYZhH-G-`$4;L7*GUXGc<}f?=quROwCN8!8#avJU9)DFeZ`AE ze=u*}yQ%*bVbQQK7=28(Y3zN5x7tKN1X2<3j0M=d0QL!3KLGK7tZ3J^YmWQ?jBOiy z-0B-&@3R^T0A=fbKQ(JLxxT>c6>kk>)8&ZQ4jda&lnG%zi@#WJAS75;;ZrI zg_lN|d+H80dGjWCtTpKP8<-Qg@3Nqv58ez6EFOz%Vtb#u&$c#opKVCn&wr(~g#5^j z&zjsW*C$_EKA8XZ$hWVHJU|Bl7RHalFg;u{BQ*Y3Kv zUAxf-4C$?zu{a)&NYJ2j@k$Z;@U32unfn)!4>$dPv!-n7Ou3Pt;y;Z8b zw?8JP`JvFz+L$L;>;HMdt)xrvO#;+0K93ob_4ET6Lt}f5IooJ=$HoK&z26?bz@*^d z_`Ux<+wC)ch`H&eAtp3*uqhZh*u)kaYD$+GYRZ=%YKoT_in%<8nDD%uGx)##Pc0(> za|ZWW=yG-G5)ja^GS11oKKAd^pSSIO&-^~C`@H@uvGKfQ#@Na2K|#%%c-E)YiyhW~ zKW2;*C!sFV2VfhST1h`3GZ^b)V>z7rhyL9pti|xfmtP&snsp$)&!q1f`5N88h&~*B zCEjCK>N~@!wRsXq*8lt`PoBKj?VfmS_wM6c{`u#hUrwAjvFh)?|DFe%di?nDv9RwG z6B9?$_@1BfZ`_Cb@)#b=GFTSM&CjxVuADhbCelJfs~s;=r16oGC0iY=ROyWak3H7o zV4XUh57emf$^KfkI`2E1J^gh5gEeb@vaf2@clWc5f(08L$(5@@B2G~f7761$<~iTD z{7eARCIV+6z~?c|(+{xy0&H(nfBC!O7(4vN+~F?QlXcwgk2|?s-G`&CzBE0bz-qv$ zuL(zyzyBlS3RpAei=d#F9`f@GEr_xi->2qhhq0|sAA~W9wA%aLpdsXyoCDy(ddma< zwDru9%yE3_Hl5mBjX+4CB&QZ72jQB zIpFnQfB#4B1}A=}8v73j-n8x5u_Mc|W5>de963_M$$+dwvPt|wY<;Y|B1T-0`4w@eZydE-}6}hW*OUOtbu+8&%x&gwSwBp z_9ENa{4Lw-!&|S|cs;y6`bar~g5G<}L-$Nf%m*9#^zHLE=fmN8xztFGk7LdQHPe@k zF%6ErGn@Zud8nz=q#7?;Aan0l}NLZQHg5|Ni^$xuNT2 zf`Y~z-Mo3v*1dc8Zh>}h-M)SM*3FwYZ~6J>pMTkeZThg?SnnpCi1_cwYW4rT>7SO$5%9fYn*P@;7Ar2KfADUJZX= z)M)A++vwD7w%4iQjMvjQpz-%ev;XJc7)PN0z+-r2SdPiSueeb=_zi~d`vE#>?NmHj_y`t&PxCoAopmAO$Uod;Ue4PfHGJTpe z*B{sX`>K17y=BV1zs~ADU)}EbgUNk4{N8!b@IE3lZQeoPnxR972G5%}FZ<%fiwhSl zI3^(|XlSCJ-yq}X*B90k)(!S0>@!#wSm)&T{EUC&KHPVZ;jt`(WwA__&1#k``S2zh z@&M2;l;_0lw--5{BS+k^965?7TM4|Ls}(qoKVXf&H*3`M^vv$VS9`2ynSAeS8?TxAMt>(e`#6x_;MoU``3us^d(3>Fv)vyU z`068I!TupWlleU6ckPScEiPNzMG|2DAT1n5y)Fo&c1OdC!l>ovV%$Fp771fHp)j`l zsr`)m^Y_Pg1)n{--vB|I2wXw}e4b~7UBXMeEJa%e)(1czM|eKuHg<*<9=dw8e=ydQ z>M=4PpgwavvcuT!m-b(lThOadLVc#OFOc~@%+t>U3x&}q$a@aP{lZ{8j>p@)A@(QI z$F$nd-=J+<@OP>2h^!9URi5B^V>{D{On_ zut8fmwtacb6T;&`6KpJ(L_XhKXsN2>juz5mf zd!~cpkHtn0>!fGz z6}{EG`sAL!1KuZTndiNf*88-M@x15kIlLN#E=~kQ;HoBIpHrFT^{W0dRe2E*0TH;= z1YAKeF}L0N+0g8_bw8N>wjPP+Zru;^I3CYyZ1mtmO_yyrxOdL-oky2%+@HAS*8_<^ z{&pyFyw{Y{&&oNN37o4A5v zf4@FU!$a3+xj*sxERD{=xL?CVJdVe+9Bm>X0-2hCr=Oc%8=jx1)#ms7EWKkr%jbJ- zB9Q3_WV`i?;kRe&Wp2v)t#Jo+H?F|1&&h7c(!=mL9#1I!Cv4wd;o0e?#%qgAtv42% zI&UvBbvrCE_jOuk9{g~*Y5egD^8jA&>$KF|+hM7>`|ZWpZ;`3~>H<^g*%_w)_-)%* z4mJGNo8LCK-1N1{68ssisk3pr&SqWAjW>K@cpQ&sIod=(1Tq}~tI1Zgt&X#=%d`Lg zLUI7q|DWk@7ggwN1hU`S>)=h-_crzJ{n~u})kM>`&jQoC_xyCN5B@e_z&z8u*)Vg% zb>A8u&vP_>ZT_JwmB*L{FAOx@6K0x$V^^91V^%n?gT}2i-;GZ)zUSX)@#B`87Vl3o z!Bu}SODk`4=8;-gy5zbL`;nDCD1Wu#=|Wu*Jr&&`|ThOY@Ggoa?hR zK9=?R9;SBfR%YYIg(%~1*k5O{L#9Iq%nKj%1@ynMQx410=2HYbpYJwqYjYUcwoBc< zv+Xs#{+IWj8Clrx-t+tS)OgTSD^#%gjZtb6Vox7iD|Jrxv(4n2s+5ff< z9XpyJx7)G*K23VpyVpV!6u|g@|3uc~!KY^@`sW^EUVC@2IdtIM%jxyq662TaJM&({S1NB#c`?f=nE{=)TH9+Li_>zD5x`%(X?{cPWHt~F{tpY5FY zhx7k%E+EeF9tsPG<%LDaGCc!+&-}haVf_B>oL1C%&UeLEdv9>Rd@#-b4+z>s;9Lo0 zyCosOXXw`tLu`@OYl9@dL9G1F!w={LAUR$Xs*H0K?;1&h^(ll9)A1KU2Hb zt7iR%<>#pX$4!TKzc=o{o`%P>9Bn>9z*GA<=Nj91oYRocc0SYjJdcJIgO!AF9^kUD zaxVj%!@D1M9$|d^Kq}0rt{EErYk=CeALh8tM7j{-N*cDdXE3i^qR2Q^qI8T^qaKB z^q;)N44S&t44u8*jF|Vk8ME+DGkwJ_Gkf(OGh@|mGZQvz^={|?{LI>%wR_B5*t~Un z&4M5Inq@!jH>-a=Xx45%Xf|#;WPbkrh}pd3sM)eJFi}(AF{GFy9JbJ<$PCQ`_(eU1Rwg0!T{2X@R$cZ$|NUQ99hyPAF zzrBu~xHeuRZO6X<%zl>E>kb^leSZUwP1_HH&tdcHA4i%^ryobP7ntnDU##y0cablO%k5Z~PZSidP-OkaGb{9b!a+-$zZ_x#P+U(MG) z{NjA~yaztT{qWI%wdSL)3(N~`W*gow^A_&=<+rWJkL=uc;^dCqCr<3#bK=CVy(doY z!T)Ld_MbSp|G>$U`#jA4jjy|t_rozKcHr1QcH#K_Ct23txF_iYFvh@G6!Q#tpYnd? zeXC6be4aqITSh?tho|T^_1*UQr}z4w{tt!zk4V=4xzPV%7gWwQeuJU^bCdP|G3b9h z^#3)d{eN!PL;W9v_J2R<|6|gB-?=NV#ig>ppE3ViUwCnrDgEFN=8k)QFxhL2G}-SO zZ9?jeF%gZ%nSxCwm_iRvGBJ-&F>%eOnYd?Q7;jp(^(<4l%^Xwh)w!ltyLslGHy4=u zJ1sU3f3nOx`sp(BNatndiLT2{v(HzU=3lHd&wRPkw17Ped;Y6crd799=7k=sP5Zv< zOs9m6=Hp>MnXlnz(8r)A^@lbMoVL{rf?maY*kHV;4Vk&!G3wfgxxbrH^Zqas7Vj`q zp@CDOfqb1#A7srQGar7&;tl&wv*pRY2mO!qY}GFZ%*vk+n57%{o5kxy~U>P+Y3ycH|Cq#_^zt8 zonxxvyQ_%ry;RE?CidxRCc4>FQ{;&$ChE~irqDwZP5uWbnD9npO`iM4n%j9_)Es59 zR~=z;;vCkDGlL$`-G{r2b9-e&uMDf0hE7#>dujUQN$7;x>V z3o6IYZy5A{fm2SF>z+uwAUh2vK)+I0KXV&iZ!3ZrQ|w@qz2s1nz1%R9z0wGiy$XB-?q}^T=tAAGCVTyH zCP$<3CiH=cCU28TCjTRoP2^)!O`*r3DNju|(a%6*TFfvdTFx|OUzlymzX{ z%3M?R)p@2?duY>J3r&NLi%rA#mY7EGFE#gn2>W2EY5dVL#~$SC$IDF9PoZmFp>MEe zpRI&{0lkAg4SV*>Rp$AxS3?)qm>0fTV_t;4)N?Jga-C`0d!1?5=SS17Z<4jg>zn=8 zo3{sUFde?zXx<%!SJ->;8U>H9hmiD(Lb`^JLeR@QaeJpY?bI_E47lxYx%_aGy)@bwaS7(un0Rwr zHV4l8zZpW4{J*6Yi5@z|=bF5UT5*A06H zOxb+^_ayrQ7z4-wW3C}{QUhVqe?ZXY`vh*g`G>^dpfS+xq0s+7&#}Lq`oGKsLhpGz zDKvgyQDT7K_ZL)-pWjI6|Dt65Z3U7@7$Km`{Of} z@zwC>KV5-mdw{M;RmwVb;nrp25;qwu##>{H;0nSX>oJpGT{O{V>xND2D#y?72k8Hj zWc_ar{T~JWfBii3|Hc`Y{}AYZbLqeD+?I@`@|ns!|AH+sFJ!h``#3gu@L;oN&mK?r zPw%f%0{{H;59TKM%N#y@*eqPQFy$U;`P^*tVc%bOmut3gm%H+~ZT^+UZVjk9ersU$ z@mqsyPu!NJ&ZKQw@0q;q=K52%-`Zfx_B$F)+n(*dsoQUb-Gcw$RBy`m8}Rq*?wYtQ zu;zrVfz`%ubyXd|rPNc4{``30w%xcVnG+ZV%LB7H0MdWJ(3Uv}+;;Os=>H`1di&w{ zeVsaPzyE*%DY<~DA3c3~uY~@OhyG7Y*8gSD|A`k=j-TIH=>M{0{eK4f|AV=!_M2wY zPp6LmPyc%UHt%(u2>l-h{eMRK?>o09^`CiF%(04Y`6{3798=oQNdHs+;;!ERTm3(D z=#W{kU_r_~((<`E=7Vp3*$TW({0@%o^_TF*MravvQw*v}M!1>TAB| z=VtX?eN1cbR*x~MxzpQFbC-9`UZ(?oT;dmkI?4M2cyB>*i0cfnu5!Fe@BhOHdV2FM zkSEvvhnXx6qTjwof`YEV2MAKf0XP5nrnKS1o#{c(Y&HerA`hVR&y!gOO zIq*XHDDWG2JgsS!#qmMbEH2W#*-+WPe~q}iUq&3@LaMsyb`kO66EbA*V$A>B4*omp z>;Jtu)skbWoL9yByWe*n%C>!_DxLrDF7K26=f?a$b?Q_?9dZ8rq)eUb5mKki$v}&; zJH3@M+r5->J8vr$cX=t5p{l#Rlxi+sN(~q9s=Y9|5vk+w3&AFKuJ99Fyw&gceHHA- zV{oil`JK1zx}5f(w#Y9Sb+R$U`wmM$oCC=FQ+58s2zq)uERZMX!N_b`j!2uE6-0NNuwp84qMjj#au&$)lLke#zL`HwkXkk0?4 z6nuBzlm8DNKE(Q@Q4+`hxH{te`6-$DGx*=`RG@_o_+1R_x7p>X6yNQslyteRl!nT= z!XMbIe4`fQ`M`hcot{d8 z-5yFIsF;hVDjQeNT-6SG-H(0B2a?Fsr+-UX`{RB}i9PTWT)}*Z`xb=??)ES%-=ouv>HdFq>vB2r zqi$DXyMLIzxF7fDaXg;+m?#!K$#AR8j!{;bonx&sf1UwxKgTE@$K#ogp56!xX#D3| zuXUZBF#ex=y(*pmNh$d5zBlIo$&)7&>Im!0)Tti9b?co9u*i&lzva$bN_N*IPq^_-o~qHX7zQXBRDzcH}h@z=@uA6G|MUsV3rJriJIfquNQ z+g&krbyLh;-IdIH+?5>rZz;JC-16{>J5pu{V99Vz1whRCNvCUv|G2d-QD3{j*mi zL%V+1OYOItDCRvaEvf}%wdxv`)#}68tXADJAnw;SipTNz4FB``j{mj=lJNgL)|29z zQd@NXC(ufNk(B>h9dUL#5B_@w*R6XN{NE4$gX79Rw*;B)ck9&cvVTez{PJtJV8voT zn7`jmF?n{3!LT3vzX<-{(fR*xw+{OGU%LgY^ZdLyzx85_o&TynKhM&9F4oaYU)ih{ z2#@3OEaZwk{{9WH9&3wHXQbtrv(omvGgvF^oOGFVLAp=9h&9tL$w%0BnRH${;6Cqm z-<`#NXQcVa)6&T4h^%n+^J6|_c%EF}N$#9;#VYepDANqdWSO33V(#D1xEJ9&;qlBz zPj7?;lJNfm*pD@(AU*z{61CpV&yw>$u8uf6T>$@Yga7Bj|AXK^c&;1(|DS39{;=qj ztakI}ecZS7Y(MR_!EjLL{~OVC=!JY07Qk9skvZ|a-HsjR%G^17W!cixvSi7rRJ9b} ztz3Ch20CoQoWWnY7MD72zsIOkQC5w2N#`$D$^3OkW!3J>vU1lYb-UW-vaE596JPT? zYOTvfah$wQGB@2RJ-7d#7Qn|wcEOX~W5t9<|cIcQ@H{%B`t5!pBU;ppOgF|)E5_*yWqbs`0oz> zyMg`g2|9T2UQAjxym&GCf${#@>+$3L!2gJQsLne7pZ}WHk9dPDV4Y`0Y?e&R)pdKK zq7twFm)5njWbyA}VPO1!g}UBe_d&nKnibt3qsFh7sECZ`vv|!pQHrdQ?vBURe8BJ6 z>{%Cr|0Cq)&BW{frCy#VhyiQ^|9>I>_4WVWocfpe{(q-G(6+m%()<6Z*Y{d-amRL=$?!m=^dgSqix5J_XqzYb^gCO z?TB8|7qkG@S^@u8ga2#Q=l^B2ZCSGT4EWErT34&Q?eX!^SVQ);GHUF)=g0@o5n74< zfA-bVqtCH;{(lVqF9H9*mOuZzl)>UWLjQleI)5Rn)yF#jU$8Fx3x|>aIiR@p|D3LX z{d-jD{Lf(3e+PCW|GEDEGyccb5ogpF7nkse$&&-Xe-H4V?Dtf)W=&{BQq#o5#H|5f z{Q16p5z*Q)+IIZ-0FD2RQ8)GV|6l|?y`2`Y&b=-+i{-lK7{HP4^Vk~3mrvJ&h6$MZi+pV;hH%hfgg{=9k7_)<;dHJ|^t1M3zolB_uX?fj+Q z%Ks|y`u|Q>!Tx=!bpEGN-QTgVjQP*?|Ft^ejQSGC|3L8nHu!%V?DtX?5b!ABp1&(s zVjs+&9fYxdufQLExO4a1xtLh21N1k|7!~#OFDEDOAniDA$Bz%x_^+@3|5i3T`ah*v zz&iH^@P7li9oKIkHhg%(Gk==5Xp!P;5%T{m_>XnCa6I$s@zHPKKmCa3&&NbT{~yOQ zpR8H>g8wTM_@A-zX#8Ic{`b}SPeZ;LDbe%)K6ko?dpHiLTD5AGczSxO&j93e0Cl~) zHV6p`k-)$}@$vD&GeP*wk+?d-`r_)!{y+Ke1^$!$-hne_1cfp7fAC;b%;?eni0^x= zpBrz75BCe+wJRc;{9m!+ZiMl7(BptGujcolrLxj>)czw|IG>9Ci5*a zWlB@e_|J7Xw#4)Q1o*${h4L{`)`R~i;`!eX{9gUw)%nawu0`b|ZB|dk&&gV&}nlfdI&<9`~K-ar%gLUiH$(l85Wcl*tGI{dkggV0d zvUhJp#MG(5VUCVI=)?Pf^FD#!eRn6++1WSYz4m!(+X)lygc^T0etat;PwV}+&*LdZTA1qWBxzaYS|vo|I@Js(`_%5 zkD_b>|4*y=SY_!So6Twi_&-|Zf5yr~{_n=R1*`D>c9hRk<1>H?jT~{^ zD^JeDXy0||HZZOOhf=H)pF7@=0|%n+&6p7q?(FOrG-!}-;LFO<(HHmsg@n4esQl-% ze@d}#LR_bkzAERe==_Hf^z`OiAaAanv6(G)f!iC^=ly1EXp#KCAm-pbkEa!Sd~_z( zpzL^|d=zCX_R)GH*)Yf5yra&wsNu;J<^;|2L;vvK?iAiv6lQ$A7zXq+IEf zXzTf0NnN@Pv^qdvKzsdc`?=$v^84>GVe8l5i}>-!kh_y61&2x#a|G!oH{~71Mi&&a%0RIQ-{C{(*r3s44_B0d3XRBKu|1I#y$PqWZ z*tYA^ZID(S*s?iT4jl@+K_B4Ak(ijhd!r-w?1_rN_GJ`#`gCl}g$oZD|1Sv@h8X+L z2C<&9zOvrxNw>foZ-KnI_JaTWIjc(05yi1 zKuyySzi$k2o^2vWxZA|nG++(tzO%EO2LGH1?FjQ?{k?tXRszwRGid|;*=c%gjo+z#RKw5C-S z#|K%nxJdJ6LowHPjkvpCMjYTms=DcR5$gn=kRgK?WB%WE@ZV8i|L@JJmc~8+`&S$b z;Cuk~xe7q+e{p>PTZlfvdl36&y54RZ@OS3#Z42@D=NvqWzG1=mtyVXN{0{DN!H99i#r%eBXsL>Dbmt#82PMv?tCoF4hxTGK3OskiprU7 zue?`coHT3t6~+O+gZ`I>`29#JS7tJv0klVWJoC}h8)E^sr4;*BjIFYd#W{iOZ_yWE z+?8!GeS%!^%8jkAx7!BVZ_VGGzd!rn+-lxr7vV}BXk$yy4;(o;; z9;f*i%#Z#j&#AHB9IshNb^gN$dU`u7kUNLV=DfL%;#oe&(0_&uN3l&?mWE?s|1re= zj|z{cC1y_Zy_v=GpjhH~Gle>mu1v9yh1n6|aXg;+SeQ2m$eDc!p5?P2=h!D%GwscQ z_DPPc`|u3ICBoyGkDlH*3ut}-+gD2S2j~;9?WO1&=z6zop#Ap7zd!v$ju+8Kq<=_G z(_f%JKyGV30Xd!#<%>U#$I`E)kHLJIKl}YWx6XbTK~Ha&1uV?#Rmq*hbz`2KM5Kbue;&u;q^qBFz^_8XsVc;CZCQm6#8iZ_Iry=C8B= zpZl%#GwBw1)fO1npi+4m>d;@1@wiu=xt^bH0o?-sm<2RnfLm?MD5Wj^gS3>=F~+>t z&hx7NF^*I8hdzcFXJFard+5FejG!mo0tE*^>70)xQ7Dn>SS-pxOIXb^gD# zH9-Hz-T@0}{c>(o>%;T&wEF)1F12Hg^M6%bu7>kTw!&p4d!aH(+0XZbAU)|8&@J#1 z7N}CRklb=}OXLHv@9(mGyWF~UOZXbuk9&zz=!fbS&@J%KTR>y7#%zu49IH1T|JUXP z{@2F;KQ*(+EXC^g5Q{v;RQ~rVW+Gc_C{inDLM(u59_dN9fNp^ov;g^k|Ni|%K0uSI zmBrWBSI(U|BYgdWS?h=C7SJv5?^wW?{p7yJd@}w`nE&sLa!QuG#l-skj$)#iO0NQn z_%~NXdRxl4%9&Mv0Q+=+^rTzhwOIgb>gRweL%kGb59;0P6e_()W~c~Mi|49Yv&$tL zn;Q3W<}CK4aN(*CiWjdNQ?g{^n9`-2#gr*yA6>R=tLVao8%JR2uF!OJ7t3~qVHvbY zEb)PLf6CpV(a8UY4<9D-0XD5!EqCtRkq=w8;B_{R`|0UFWdY;%U5neYjn~@wr2RW> zzP7%7yVnEY@2*Mvt&N$_`}Y3p_x}&%c)z7pHpyG6rWC5vRT`8oCa3G7X&jhU4t27T zd{&kk|M|b@Nw>gjvj8}pi2tvf$2gxAR06Um|4Wpp8)$7^>Y zwR=a^tM_SSg9d{l8a8x{C||xexZWZ#Z8gXDje-@W2K<21;D0ebvrFawlP6CS`2gYJ z;Sv%OBAgqLRIkm@dd3;CfX02TPscW%?YqAI-`l;uUwZ2|a;_Ye*7|?ULtE?Tzqx?e2`3a=q)3wWRZed6WCuB`|3%zz-zTYQvSbg9^-u3 zpt4X$^1ncV^3g?#RC!4D+u3!GY}(Z6UaM9k!aw+6Ojw5wD+ag%bB@IQIYl`s*(-_5mUzBSrH87zfbC0_Y3y7(M-K79ju0e)jRW z<_gzfVVke7|NnNc?_UzXaawv0-1|?w`rn zb-zoSK@-IA>^^{2*jG=w1zx)alJfs`^Em!|6|wD3{ue4#Il4rN+7GH#YaiXXvBSL& zJ{T3&wd>^2o;_!T^zQvjaNoZ3f}1p%=#N`uZ>6nX9*WZSwxYCx4^R(rfbtzqLVM7(_%1O zjQ;xTukHKv=~Kzh&W_J(VO*1ZH$W@{lU5e8pJTY(M}Pj`+x=X>diaeqqPo~GqtE|i zANzfX&+p@L4WPzQ6R2q#;`fcAh7im2s-OSI=Ld?pWhSZBriXmJ_^^y#^}9^meoaQL zI4arm7Sv+?EU%t)3;ZJ%02&j;|6ezclb)||;c8K(N;QhLv->crMT;TfUAjyP?bT~` zaKC+;~^n zPxENZWsIGD?L0+`7PYBSqec~L>kZQ^Ef0BR&b-UV%4&ySwro2BvS;6UCr6H*f$53+ zaep3{IkT&erR6cNwr$%ss#~{ig|cPKvK{1_>SR1wZwfK7Ec6HH7i7s zCFP?LGo@~4Cvlp!Ste|~gt34&8vDDXnS=hNZh=>9fsF9@(@*Dzq{QRYIGjEE7q{ZR zOU~n@=PO#YdSvO+O&I%+vbP@!{!az}=Ys!B!2i|Y|2pu04*2ivwrbVc2!mk=u5IU3 zdE+@)CchL^mv!q&zhw1Uu7=d=d-l5v@KAeKvgTN#Xp*v?eH)+U*lx4c(`9D6*qo4mv<7?~rkJgWPCoGT=9{>FFz6dwB zphpW99KUDGjYWHpE}fI<-cSB{rGFJtR)y}tsLT1cK!wX{Azw?ZrQVsy7kppJA&Qa zLmu(_2M?b7oh#R9T!Z9uavo!sBcD)4_J_`e1GU+lYN z$+>&X|Hu)~7+fyMJ0%T4nR}fQXi@W*+QJB%@`_queDE{_s2GszCnq6c@~SN*|TTM8LZXdhIO2D zz1ueU^Upu!`t|E_`SNAix^-(p9bsKjlns{@Wfj_hh2Z}J)VY_{LgcX$+J=19`2gjx zEgD}(llrgtIL$;~R}7i6Nzu9=saw3C4AGZ(6^YjoV-sS6d4v`g7U~x7>%5B0^*r8A z3uKhX+qYkdCV#a=&hOvv9vv0+@GtE%Zda|k81anF$$5-jlJLJ4_|Lijy}|!)!2em` z{}S+j4fwwW{NEnfx$_$T`}ZHK=Xv_{FDX~;o6^GbPaeg29Pwq1@4#76H z094jG&r;E}e*Jp6d-tw!HPc_eqZVN7?$M)15*-~azyJPwLLFgUQIz!RtTnfCet~rYG zDlJkuf-L8C06$zkZ|(Tk%!9Eye$Re>CWzOr%6(H)Q^}k;v-IoNPo_+nA{cAqIVM7S z(k+mp1v1LxAw#x=JbwK2@AR6TTD9hTKjU(89w$FvZSdb7{O=3?j{^UH2LG3X|Lej3 zZQ%c|z(tELgd3lC{`~Xd7%szgX{>R0KN9>Ofb(|-|LZ5?zs~+-RUj$<*}jyA(B90P zfp!lzCBNARdQok}vHKu({xxH$yq7CA{Ibc*Bbw$qN3#V z>C*{ygmne6|0}4k;Quo4e<}E%di;OYDi6#hT7i0*`aW^rt;aqtR*<1X zhid)*cGyo(x&>0S04ht8{&?yQ#;4%g)HE5d$AJHi-ip!<{BM+q|2q3q z{P~Uf&wK4O{?}2IpJt-ngH6eA`T#GgEjacdq~3c){+EQ8O87 z-zWZzV_Ns03u}zmnJKC6(zWSnt1T$05?XLsvCEkAukbq&`4h@|-LmF=B*_ z963^k3>hL$PELaRXT-|NN;J>ps<^Y2KjT88SI3}g<6MwcHc^n}Bn?UqmUxfb!ahzD>EG#7&^pN3SI?LEGV~l+O&Wq(( z0@JFzdGo5V4gT7Jfq~-Z=O?#s-?c_IofEN{G2){w;@}KQrE{N@G9qT-6!T&hv{7>l$csD=O_|G*w@(xHun-Mc3fCQLBqGfddER z+_`gd?bS^L3H--DKQ2`RyxU)-!T-77Kl|y31yi7oF7ovI`?|fr1L+e zEAHL=%$WZtPo7MuBdjZmvg;b^D|o&g?Eu#RpzoSkUw?f)*w}LO=X-@G-6!#T*56|< z!+%TEXED!|Rf^QuQ)PDqO>;H92)3naI| z^YGZgVSk{L)6t;F$VZ9h{6BvD*WX2oEW@~)#^Tg@ocw(C5dV+kfAi)O?se(11Z)3p z!g@n4K?e`|#28T^<`V70ctPU*p1o%b?8M9PpL1O#TcI*iux3ZKU*4ic3zgOE zyR*;E{`-<8OVsiHufF<94j(=&K|w+4cf8l}{Q2{0tYgofJ+g7*M%4${xpSu+I&?@K z6JU(s=FOYxSOH@SJRj5z(vxn1G%bMZAW8o}bsjr790(dX@Mz%X&7P6k^~3Gft+$Oh zoHmb>pRayosZwpx|NktC{O{a(NobEAn?ex#54nH;Ng_YP_?&#r_??Z-8eH${{l2)~ zXTS&f#@m?x*v$YHhRVl_&mO21ue$Nu`qc_`d-BXTP28ALsACs2D>y z2R$GE^XA?nnsol7R_aN$KvMo|b%a~^so?(sv%66`0KrzlwrjzGHp^oSOC{U68@*m z<34>{g8TPBfHC=_fqnWM2_Sp5)VT33#No+cV=YLH$0?q#X3arS&6&Ni|UJqRRh`xfxe@{Gw(T!rojWfN_3?>FxaaTm z>3|2VTW`OEd(u4X*Wc*Baie=Q#~gV5hJ?gEwY2;N*ZeH>{U>=T$}m67{{#D*gwQhB zr5bb%;=K!DP$(1x1wy=G#xGv<0j5BCU(TX$)Y0ki|18=*@|%757u5+IdkIS5KgahO z6U`2BY*g!~X!HO0ecimdc8DgO|EQIEQZ0~-|3>v>;J_Px4i0W10|xvVJaFKjxOezw zg2s%wjk!dr8*$bw-!S9-wb%Xo-@4PU-)*!jFEsz3>jX&lA{C@ijrMB4+}he&e*5h= zb*?_yfAQi)HHLrm=uvfipIqmBe)6A8XZ)Z30p~h$?jOhhsqNdhtGuUg!2UmD1-u`C z=Y!fqdeSYBt_5&KWQfNfez+l|M~|%`y?X5mZq#UffW7@z^=4B?$HU<4Phf9SrOM+( z=PO*eUS!FVZDQYl|I_G(4aY>ZYBekDn{T#9Mn^yTd)KZ%V;voLgw?IP7~}aTQvjX;g!lC!mH(OWKQgx80qPjPwa1of0X2(P zeQXOt?`r&?agU;qy8cg#7JHWu9O#Yq(*tsU33=jJKm2|P?I-zeeE)P({+Gb_b@Jxg z1^&lL=Razto>U7M^Pf!A>Ik=BKKSnr{@(=u-4fN=g9q=WIhW|-#pnk~>p6Uhz<&Ka z?)2^JjkYDB{<3}=*Wc9I3;Nc=dH==gc9$&qN|MXcrcE2Q@6Yjia$Dp7kt0WhWBTMj zzvF#;8vnTuUa|d`1$QII*Zh>?yfQu@}v5?YcHp*N2a*8=1IKlxu6Dht(W(PH1SfdhTfhTewg1H7obaBKki-x$)? zPsxYZTK`{bKe_%-!u|hwbGe{xkCV=S9sZgHH2!P%|7&%GTQDE|_W=LhF;D4MLY;MX z_6)jzKds(Bp9v;dYsWjpxSl&W+yeh^ga1A+!hha(F9yu}FW%%6_yGoWe*fadizOl= zLXGQ_|BL}JhR^sv`}EYUTenpHGyc#1Klx8zN8>-||8qaa4EP=Q;l9nAH`n;D&-;h* z^_0E^$bYP-T`4v;wkPhNk(7Acq{+m4&6`iXmz2l(^M424rp)9tc$|p;`SMkZE?n5| zA?5(aR;tu9rh4^((KTy2McLUoN7bq|7#b2)y7XsYIb-^1sRzFA0zaW8_N^5Sj6o{@ zZSX(pgW)J8GlrG&qwoI80_v6&@e&NFH z!15;d(pSAmpac7se1K)TWBAYG|I^3+Q?CVVCm4Sx|HBNc!tJ0z z9^k(>`0ok+({GKdvjG8*64orcawYb`?AbvW>-P%$;fFhS&z*~j#aw1}E>Tp})4!aY zym4&YaSjf*!GCY?-_Hwmvmr$PwK$~tua!aLex3^+WbF_|7+H)!86uYsq+9i|BwCy?;~V> zHa0e7|Ivg}=r42&q+e=jutkK+=RGk^a4 z{`KqE|E+D?wtHTsDpjgzeC&w{1W!l8+qk z=KXM59pQG+AWxq-{@;#gxOd=;89`x;{U1CS6*GFYKjQnz>+$g6e!;tTMc`ScPybr6 z;%U&6_tT-22b}k>dbb|Nr>$r({r0#q0QvwgBKH0L1G{(k_#JsxgSfU2V+@QnFy=t! zvkXj(L(nH+8A{~Ic~CU*S*G*>7zfbxZrgzK-^jn^%a_aK$&(Z62)_x6{`-Od0bZz+^k2(CoFki3{0bi@B-U}s zXWA$VT#PWEbZ0LbZT zy?Wg~9~T4QJOHx%dF2;4V8ERK_!6HZzw(d`#Mmig4U9RE`5OOO4*DUS16U|`4%hQ} zavnzeu1mLpaUD36YMpR&^z{V)!TRT|r>XDXzrR2De~0|1|H`p3&XGweeua3)=CwD^d*}bQD z{S@mGsONj3@&BZDDPFv|d&iC)cQXd?D#bAcmh)dsY_Hf4XMdbrCZ8DtC|jn?h^~G5 zcwc+w1JDo1s5p1vPGGB6#}^{6%Fufd+fMozRuISjlk%URaSR|&&TLBu=gD~lZM`nt z2F7)OzJT%jXRikj_PLIDQ$WV+X!>=zfByj7{~tvDbMA^Q#4$4C_!X}o<3wLt%(G;Z z_gXrs8sn0CrbNskYpT>X2>>0o3+{aiFk7$0J=ar2A=gyrwm_7i<0bZpzui#&UHZ9`|@OZdcytEx4Lz^e#Fjh;b7!J_Osu_aeu~5>0@ZIf3}@k z|DRj>A=+F7>zvt^4bGioFX8}4(dO&YZNNG}-ltp_Mvc0)Z}4E>tE``&edh1`vKllf z!1t3+?)ZH2N#J$VOUA^sI?S;$)>GD3t^VSrn&{(7o>H|WXQ_IU$--RiyJLJ+Wjg1v zkpEoc&zS$5_s5t%WBHup!ubu__`ml2ALI4^cI?<8N3do9#}7D1fPO+e{}08NL*M8Y zNY?^M`Tq~_I2+Dc7V1d;pSl(kvGQPW%#WMABY)WF6*+B_SLBSX-cd8R`b5pz<`Xr0 zyHC{E)gBRDCjAlGZSo(XU9qJ)O}rf1e!`{DHvhXA(rV0wke1(G2xTG%^^5hB{$&}6ee^1jR!4Xo>ttidxV|>U`=rw9FzYt!6VJt% zKl5b%MIdeL%D4`*-fD@jMZvuPq78asz27X-v3)yv^!Twl?~gHk-qXkReYEj^vYq{Z z#`3wQ5BvO>i!Jx>-&fZO;Cw+o(~rk+Y=CP3azCyYz53^* zjCHczD-N*@WP8hYmu)QDMq{x}rk}v}l5H{jOY|SeZ>`_Yc9UcLY@c{eU+ie5>&iuV?A^!fHgGaG$6^!3%b%Xn{uF_v* zU8K**x@lZj(|XPQS;slokNMa_%$w|I+}{e)`u<7lFzd6JTji4cbv~93ZCj~h`H@jk z>Uh4dudjL^i}Cz_@?V?(&v-uL1LQi__#H7~g!JgqL)y1*FU^`YlbSVaO8N5Tr9y=Y z(zIz)89#o!x?TWd3G^BG3_+eBY6zsJ|SnX9j5Q&*o_1I`3aUlS0_e}4Y_z@rl(V z=gz17t*v)?WJLM$?eZv7=E&{Vt*_i>{x^LdhFtZIeQ*-v7bk8+K0I|Z`r#RjVVt`a zt&U+_z8#a!_(d4TFT&!-FG4YX5gfDa^u5?C@#7ce$~E&SP@wFCqD8A>ZGvxWFQ+e@~~Y%_B~TEAaoKhKl2?Zih4%R%vb z`UorwkD=ed^3X3~ndlQRUn;k*x84TYZ_VGGzd!2}x0?7l>nZD7(z$ragv=ryCzTf`^WTg{jZ;GammZvl+XmIKI!d z{1^xLZuwI6ym$k1qy&&qxN(Uwj3`tUVn))1=i>SJ1ax3`JiE^m{XJG~7x zcX`+Bbvj_$(tsfT^YiEX{r>H@SN%W#{B+=;K_@VFeH`1wYTI_NpNYw@ZW)oO>0&o) z>&+hZ>z`8jf97UP;D+BqF<#*v_2Z`77{9oU@e41!_rmyv7sfBVqQ(F8B-A)NbPAM9H{3 zTA6q(#j;UvbE2(uCAWe0+jFbgN2{mw5$PYMRaaS0(-Z44>#%V>X1>gy{eGT1wL1I> zzLNrWAIh9X%ZYw9ao#`U_>qy3sxQDe0LS+kyVutL;amXD|BJtek9~NGV;-d;%^%Tx z5-rxzBz`~DC!o&||DL|Oo^%VOYXMZyMEB$GPJzb@xB5i7`@}q6fH8Sv9vd2i!&E$v z+YCP!?0PEX{qTjfW;&32p9lCa7w! z+BN)FpjPZ*@7{54(@r(T!zt|U0 z@WVa+&AvJl{L_Yj2>y8Qy;m!=c=4LCRjam*Zq(?Lh<5FUhjr;PKD1}gA3}Qfo)z4; z@6W+4TYev)DBW(QBRmte1IpYCK0vKt!~oR%jVg#SbJ@OWtTk?5$#Sh9&UV&VY$GXt z&$g1xXM4$ZIw|*gEuu84FH?`tTIGLFO4@%WT{?A;Pe1K1 zojZ3HtnnpW`C;Dc?b@Y2w~yliyw`8iq)BQ&AOFW^5U;_EB>E%# zA8J74zs`ObK~EX8Kt^~xaQv0f@W{vN(=)kUy3;S(+Ww#~Ih>=(exG5pZiKnPKcKVw z;L%@y=W4LeCp8`?JKw?ZkjX!LhB8>@fODh{Lzg*sCGU9nJy-P+8a8N@^&78`r|6k2&d_nFn)0X;};h(esK}w7nd-8 zaT((me}r|Na2Deiu85WFQI)5QE5pouisJcM9*^d0c3(Ueoa$<~czQ4!^>mSsK`;%?y;k56Y9C zK7tR>#v4=k0x>j-7(j|CY1^v#0-8Ty-0xz0Yb@Pff2OIbjx zOIqDxJ=5wc>z`H^jq7JdUu(x|^;oOR+PSoIC;bQh&QrRsgh96}BVj3&iW2tHGTd zF9zO^eX5=ZYjsOm`{RB}i9Mc5aaS-OD(2#;6om@z_Ao2t;$dfh#&5{P!LYzdPkucZ^?LK&;{%#xKre z?Baqdhsp2iCP z0-1l2B2}VFm1+=cXV*2VMT^hF+4t|&YbN+V7yMt0|7TfX>(=CdUz9&Rbw`Y#tv9Cc zBkzic0i>I>c8*)E?K9r8y`hXh(_R}N%h!6+E%3T5U|iR<`j^sHtFNhTQ#yv98Rwr? zU7m|wHHJ^baU2`tID$3?W*k2&kI&V8Ilj;Jfh{d9wPQJ-K~K5`Ub_V{%HyxTzY+TQ zN!)WX$obTgU5Ar?Y4I4xCFcL0d%;tt-oESf`PIOIPJaXr7<@Hoz!%qo1`N9fUjQ0$ zJ$T_NzeLaPnzzz7LMgP*Lsda+^Y8Ug^6v3aa=6|y2E%D&NU?O*J-S{9+@0<;JE8fpv`huD5|A2LBtx&>0QKr?(;JEbpD_>6IdlF$%n1vCuO*$*S= z>7TK{^YHjA*565u`~3X$g@{-s9Udn?UqtYfDc*OToUVao@Bs!vj?m}V0tXDa9yH*~ z8$khq51$yH7i$FmmA%A~+e+>Ox0D?FZz)!L-4)9{?ux0ao59@GtyZnG-ZN(gs{Efa zh5Ww&{{M#j=>sHJt5z<4in0LwOkbv^3&H=59t|3tyvAS1_26BMU);p_#TmpbAZ|yU z!T1IIfN!C(nA->6L#YVHR|4xRL)`Lx1*q(Lj9;w7_{CbpGS*=HVlBom4rBbnOYQ#` zE&4wA-_VHv--G`@f&cTt|E2hUR$z_2St$RfD1UnD1^$2F4V)qGDnb8D4SS=`QUs+P z3Asa$AjXi^LG%H-LRBHogVd950o?*GZUOo|A4APwJPZBES7CwY;qla2USY-@PWrmv z=hp+%<8kuyMS}mn;Qyas+4aO4bR%%ieBbb-=i&P=zjg~&EcS!>``r|iePCal42J#S z|3&aWC<*_MBX9Zu$}qO)N~Q}zX|+5rSgC8z7ULGT*vsuX^dZ-Ld*i& z5fFWWcz?jY?~wqd#5zw^CBb@%?~6mW;C`_+7{7oDuEO}mDvVzo#Q24mI(|{KXm#+v z5%~WR`u|^qckMa}{GSc}F9iRWTr_l#i{ zd;>0vN+{#^&`F5*aD+m%^&Lp^nJH2|lOpx9C{hQi1{Jqd#M&J9b>lnu27jXgj={b@ z&>?6x)CZ~#@t%h_A>~COdqCTugx`_#(Ks(H{wv4NZXj z@TK~^0OKt__kuP+KR^ypD~QL@f8|&K^JBhmN@|FLYIRK8zUe;nn_~N9<$PWquUK&> z(OA63<4Kclqa97mV!ltxC4n~Dfqt?{QvzK|EGZePT)U%3;G$35d47wL*NH|`Fl`{ zu7?7Yd|-TjvOZqcc%OSU#xGW3{9*;hFP6b~T8icA^!jV%k=-*@0XFqa!85H2JIT=mMmQX z{TE{b?DKyB9YJgP*xEvoQeb--s6=K(ie)mvdlRXbO_5em+w6+8!?pvqA3!ajhE|Ha zk9}=%Y#xImj1idO*{;Yl0y+gvf!aarQ~%cz+t{wqCMe-I%atpaG;G*NzWCxxnLd4n zj2bl>_p4RbzF+oV`zPMO@|dE`?BC~unn7gvAu`?+b;kf%p&k`NohkvplPa!l;dd6p z>w=ahk{kY~1@>iq<8eG5`K*NK$2Ed7K|I%gInj5CuUiRzCf^VKFBkf4F5C0)m~3`( zatn%#Og!iR@#DY$E>h&Ar!j}M*GYMt{CrV}{|ChLpFY4d9Xxn1(LD!==`XTl$K5DJ zIR@@Mlfm#C_<0rl3|09#Wy)>z|1YEee;Ro+29R9#_WQukWymLenVK#K|F?txXX5#P z7v=vGFs;HyYZ855ydGBo}`yhJJdFGLfGvW|0}?Gs%RK zW-`piM0(~|q-7q&rBE-+;P|Ylck~~S_XB7$)B@sf{$KM27^854;_D#UUlA%9|6cvP z8ot-lKWu^L;jzZ%&6`8jd+{|MZ{5nZ>Yg#!_;peqCqG{__<0BX^Z?7A$=TU6=suqP ztDPgIE$;=iu{j67;{@0jCxhW6_<7xk|6bt#AK?G*$e)Z(E_?d};O7eDk-kh#SAhRJ z!2h#J_@9CNO_0Co$~f_L3glTrb_{=CKzFo z?$!ePYohI~j<^A10ac;0=%*E>AAok9eYE(#Ss2c_0%H4bfc~jui4!$}a4(wH-lC6b zWu>k^Gho0#`SHhTvT)%dFn^)S{9k^Vt8VAcov*Tg`SMlLv12E#ZT|i>6?_`t1u`tOxdXWHjAmC>a$$>Iv;vZjI}>!FPmv4z&+_1f}^Y^Y)`J6jYJ zmv$v(ORcQ3p^_q-D=V_KD)z;872eOmeqX?6XbxYsFk%FjI0ybQ&Q)0q@i*gm)W4l* z>$Z?qm$2m;g+(C;Xc}Y#C46u8Zx{GoJAX!bY|Q4qecc1dUM)3ga@9xUZ_;g29;a}= zpea)V!GBM%?3vcA2~9T65El02sdi3ni~Ic0&YlAM;$$$K20w3rpLgT?|K8yL74ZKI z@+YH{%N}bPp=m)L>C4n~75Kjk{6BBR|C=cP*%b5U`JN|#gJCtwe;DQWiRXV!@V}`M z|EGcf3&8*7;Qu|}7GGU8mLkPIlFOFk@SCGGQ> zNms-IJ_7$g1pldSc-;saE<}{ zKG|Ng9cm;0pCHZdxSu?eRIXe_`t|E4Q>IK+d9U^JfB9t&m_JuE=Fgu`f8ba61&d|H ziq$e`kfWB*ve!`V-dZ^;R;(yht5%iLrAv#gt*sh&$df0JFh)V2B~zwM>V5INM_yb1 z-e``3R>tSuI^+C(q0Ufqh-1>6>rfdg1KB`~-Ea+S`VFQ~Mibdjf5e}^e}2@9E~rOi zZNco)itK1yKn{1U1g>Y7m1V(laGzQUtpL;4)yO1!dexF6gWJjWmPJ+8uc`vS0PJ5| z4SoW&sk$QDpdB?8S%deJkWcTTij+g0#C%oF7W9?=twftOfwZ#3Z*yQ<3Tgz6fqbE# zA#+IG_ltk4!0+mLGsec&*Jw4-Z($`6Oocw$-;C~SK=>?WO zQ$WC@gn5Q%&cwvFY2)UnC}-RnG`QijX;WAv#~gV6(9kDOEG^HXpLquSJA?TKXTeW5 z@H5Pa|5w3(@|iwBa@pG-20z!}`1ECJx(58;4gOz<=YJUD7j7v3xfJu}`JN|#gJCVo ze+1?Cjpx4|_}>it?}h&VaPXzsDgUdTS%#NG+gc3c0tL;aQyvp(kC<&|@V_(s0efs~ zV@#kzmbm_ZZm>TaVzQhUp!xvM+P?^#e;iZ@dezAh8D4=@dvgu=^5rW?&z`;H`|l^p z{P_zKV*6zNv%Y@Z=S!9>lV!_RsN5&}7cX9p=g4f8Awv?@qFeil3(Rs*(6JrEU(&c$jF=)1O7M8XTQU^d|A|sk+xtu`|nf@ z3pv=oksKe1HUH{c%X0VwYryu^VEZcc>(^B^lY^hslMB#21$ zu+;?iZ-lnkDYC1MBHL?Y%m8`R&ZE|Yzfp#x5N-WWCdOIl`)JpG{5BJ|?DJQEYC-*= zP0&N=G1L`GIEL{8J^e!#$S9AE+1#?_O<#)qCAT&9rnF7U3Z;g5BPsEp8r_CaEd$1e<8)ZdA{e#-(c8) z@*hL_{nYXoEvoVVWAOiL@P7vQzX<$a1^#cuIkzDH#VG$sls`QU0snh@V~QH=Rr_W5 z&)A|=&tW0b8vIW|BTLZNSFdS~75v*N4+?Mq`m2k51KIu4aPeC_SY~}cLTXOmAdM!^ zmnowM$?3^GeE6P~bi&v{>s%(% z2JG*QF@X=DM%hfHJjMlhp8&@II7iDA|9^Z8fVOxF&4XU050KE`FIKFWeE8u> z#PH|GGk>o9{PQ#Bb6lVO|D{WpW1N4f8uS0=n{UC>7E+)|GE<*%$7k0K9z0ln_~8eY`CR{g^5n@FpZHOxO`9h41%CSJC)F>QGiMHB6^vKR z#s9DXF^UzkcHKHzv2rEmFL3U{9Cd%@_5JtXtIy7LbaYgor$@h`Lx&F1vSmwY)ToiV z27l$sm8DFXG8jL!!T(-B7<1rr_q3QpD)EMHX&8dBYqBpWGkn0h7%!RxzHb8C*F&oj z+uzhEublgFh+LXALN+zbBdg$Bu74j~M<1U3dza2-T3+Q`4<8sp1NqL-<|9ke_51KkP1pM>`%Y0OQ_uZXPXJ_9a?S0FZx4^dx z;9JV7TJ?sP_MO3S5&ZN>!vE{we_DJ#hWs}m|MX>Qx&i#(3;tg+;{UC5_@D9o4Tg;< z|8Gh7-yHq_-r)a8@P8KgzZm>q4gPP2y|#h>OHuw&D1UnT68!JujcM@Uf1Q`%KP!)V zy-Hi~KLt%Kn@hW%dEe51AvHoF?kI*FQmNYj**4KZMh$n8JnQ}t<)Dc9AjHGJ{zR_L z`%FBhcad>@nn{uGR!EVxC#1@xxzejwJ6ZBkF(;Gh)~wm;m_B3rKmW|W^fT@= zw$Fb4ym<>T$A2dJ(?bw*uO_*2;)?`slik$RsZ&!G{exNX3C4{bBg32=Wz?{t^8J|6^5dk5G7CP#+}X2b z5#kA}SFKXl)!(vhn{3~{UAAGncI{f&VTl@Vm^W{p>NCv7{`51L@7S?pW%%&nYP`Y0 z!9hO$_+$7~AF6SN_%VmWsThJW|8|gX7O=lve#H6_&)*ETlkaOG_VahNDI(W?ogkNH z4wX%HGRr!Awh}+HvI~u`ie;QvLil0HCk+1nonKR1J)>C4n~Gx&c1{Qtv<{~qA~r4;k#`JN|#gJBE! ze*)$AkMIB2Li}Ij|2OgcUjqKG0spt)oZFHAGL-*Yls`QU#qZV68_xj*|LeXi|Bu7G zGSDWQEUc18JewC0X%Al@UI*&%`d6>zgV_F8(rm@d;;~Yqj`SVWPtN}0EEDGaD6Kc1 zmsZoZiOc%M5_8!_mU@n6CZ26b9i32i_;>C-D^>Op} z;@0Ozv{R{fpUr5oS#njk1xy!M3#?a|Iuy5SHeS1|MJ9d;7En2A0 zpJ)EizLzbi(eV?RC&%{d*RQWWyPolV#{S9R^fZ0?boemyWCV_>VpmJvgAY>@_bQeu zQ&!59E+u74mXI>VZKOg8Td}WOTiQ2kEbUt~la8(I#i3U(nL2Tz%6#U-xB}VFb2E0p zd>L0@EP+14vSrI;C1MNf5Myw1a#H;)l>JYm|Hb$vS>9qitSSp5d{ z-`R(!AF!)kVY%|tFgY_8@qarL*@&3_7Vvx%zTeZahcp}A`H)tpu{A)9`Po3_A#%S~yqaS>5LyJ?gc$SJxNp2&iq8|>N0jq93Z57HPJ%cG z5@XWJ!z2pD`w5T*#Plh29^zcnr29tWvvp8Ih{*u)Smu#Z-ck6R{haI&Q(x#1#QJg) z+6poDHwO9yssnMXgbCe*e=mW@*}(sDP$%~PUpJ4F^8fVdhk+Y5M21hB7IJseq~Oqr z6O+r?**~a84R`O1sCI34@BaM*?rhu`L*F-^|9^u2m%&Q<0Lf)B z{~_@IiV^=k!T(p2zrnB#{67W$2N?0c1^WMe(f=O>{?A7Le;N3{4*cJS|7R!ozXIj| zAIhJehJ*k8y|L6C_+Rg3`Ck#{eG1{4jZ^iU7BaF_4zzdHa=vjP?Q>pZ|CPkpJNf%} z)k>x0?4pqpwResjm@!OTpwlZR%C#-CB=q0{**0smw3$3Z8f`f!1$W;T^Cdx2z3-Q@ zrb}Kq)VqMV^tF{^1E9~|lkNSA$#nZ1;!ws+T3ee)Gx!0m!2ec=32^KgY@I)vG71TD6jP z?b=D3Hf_|`jEftK-|>01%pcnOvIR9dp0*dp8yYldpz?p@$dM|0$>Q`xW^dZGNm@5) zB3W%qNv+AhNV65Yr24E?Qq1{#$^X${v2ORVx$K-K;>#uxMCHl zfqNdmANQTgc#Z$Y=j3O`;&=25IQM|h?nBx6+a*nw_+SWs--#x^?VM8%w*vQ}{m?SxHw>|d3K)MtxxAn$NelcE@2le2g%Ime0qsdj4}L%Wh~9jvZ&HlzV_>9;bMLJUnym+{54_NAAb$+ZP?NcW-iS z+7uZ!efr(Nj0p4of;Mc33UhUhjqm^aqyO&){{I11lF`X!Z+{B>+yQ>3FH_SU;QwLp z|5`l%@%*AGcz%)7l@#;l`JN|#gJCE5e;WLcdwx;TqP5Zgw>RSd&*1-Z@PB{{h~Z_6+{le_8&sQn9YDfNsZ2yS|LK9Hag(rAjCaq+P9Y(!P3OacugY%i>G7VKG|Fp`239805`I8k_y7egOmI(t z%8&q@yC3wjDW3n8Fc!WF^ZXWJ+Zo(($awbcn>A~e zrnn#H2m0b)cEcP$yV4#`uFHAo40IH=MkiL zF2(~G3m731P!zq^^KoOG@u*X9h7-v(5X-T2J4DPsBP&%3rjYyjG8Zz{+8mywJAYbWPMx0DmT z3(0S7;5UHz>#^?y#1cM6pZ|T_4~X(ShBzm5I8+6C6=?`E(dq=YW%-hZu@v74zcR#k_P*F)sySYgROy zSa+%@l~(l>6L1{)EilPuE|%r;O5rc-O5r7~q~N^fP&4^Id)EP8MbUO|Lg>A>P^33O z=}mgaf;8y@8U$%d5k;g4QUv@|J`47SQS#YB5rg!IG=ZQC2}$1noY|dw z_ue#0Q25<_o|D;~dFP#XCUf^p-_q}Ql+vS{O7$f@C4U`%%Fad$MEuI<6F=zjv+9Qa zEM@XYp|+Lf-Y@z~mh5UD!z(^G6D@1iLa~0O^Ek6sDYzYW1OrR_D&?P^IPU|9=Yp z{~G-NJw-ob}2p-_4)DXlL_gEw4FzjlD=*zc;XBbNPBgfBF3JhVt=)1>~FFMP+HP z60+>EVzOdDDf#K~va+#%L7DzoeW@{grc|D^SRNYER{~o3%fLFhrG2@a(lmb-X^nk? z&Cv$%&xY^6Lod?Z05k<|1#rAk%w;~$h#rAn)@eeyoJyK&>j(i;8bHf`ESt5&Vl zy0;cBS}2!m;L-!*RIFH0|1UX?nOWBtP~^e?)2B~YjB#epJHyG{rH}kw`kj{ zr4%bxOv;RUMT-2KEZKrYvVAL(4{JKAtcs8_j}DT8RclGXidCd`y#_MxmD%!TV4!Mq zP*-}OJ)8sJI>L1N{}q_0d(h5%7vuP=TN&f@UPvTIf^S=*U6&=|<9YZ?@p^?`lp(!jld=6&}0Iltc?cnEkBSPZNM{s7JZ zy<5_fywyu2mp>mM`5Gzyf6IY0vHdWvfd0Jj-YUy`|9Net%-(*Iv#{Fpr1(F3 zvr@6Xd9yhYz8we#-UX)TDqncmJ<(5gE!e3N`M)UmU(Xrf(Y`Xf1aP(x`2P_2-~7HH zzcJ{A4js0FKUaVsGlsA43h@6%@c%xu|L^tvLNDD+>qhkZ`FVc7uuK{9e@FEHhk*a5 zfdBss{{Ia89|ZmnMqXAye<19i1N+m%D+r$g{vY9VIC_EqTiz=FbIwyL;CFQ7A%DF4 z3d^ucd8J+)fijlq^z6vifC} z2fI8h3un!dFRP&0IqeNsUo*y&gHg zVZ(-MT%BX<9Ovi!{>^~#E#v>0$^W0x=F+80yZZlJ^UpbU^6d41>;69j{|5yHNf71& zRlhsc{4-zWD|$Jbwf zjq^jlSL*^fr$8GxwqUh^>Cm5h6w=}U?rbZzD`||;uWrl!Jh&cM34SKne^*EFdB9`x*6W?L*{!^zn&q*c%AHjli#uVvQf>7#e~1 zQJ!2=%D(;*U;x1JEngtBt_e_Navu4OYx=mBpJzntb$#T0?%^8_EC5yme*!0f3qTT( z5$Ah{bG)EApwo5~${<5WvsNys#{3;dAHO-|ivR_wqvUI?r1Xy7l0Cm#UohJzXBNrP zw3PVfS91dIo3fOjlBarcDSZm<#&)U={JHA?m&>Qd{(Z8lF}x0@d|{3!l$hN@O7H9? zIf^L$AMZdrKYODRu~~}bbV6<}z&?H+plQxB1p`W-7|^xQLsjeJxu_Wi=byR$?*2H^ zQ{xSA8?oO%ZQ7YH#*aU_W7x2x;Uh*Ib*6?+o%SDcIDW<4+jU_#np}|G^Ak%HXA7D9 z&u;Q!4Q{^$1#`Tb&kyC|h@`rU|rKffQ*|KEZBe}p;z zulau{`2QvF|6Aby&%yuy1OG2anm`xDK5k3|CKho)N^v(?aXYq2}Uyfky zl3@H><6Q5u64JIf-ifX`F^(PHNf+nc=3)PN68L8+=D+Ig3fnW}M(iw*R9G(a1mNEY=@I|Cag0<~|l zV1^-{>hp8$euD-LT=0IjhF#A+#}3M2UmW!VnaTg3P-m%9rCj{a_5T0Eczhsu`9?rq zru@c@8|Bfiouy*e-co1hRmuOoNP%FHikq%U%~8{&VXf-2Y2$iXv0{bddd4C5v)|7( z|J-ND^9Q&$fbD@bYu3omKmV+-e*Jp+_19nVj+&C}@tl{}eR+n3VBDVk?gIMrp+o#-+vr-dp=WMc2i{-b%^@4W^BcN@^8vb>dpcxC zABVh%b%iA{o&-biyLT)A8UW;%%)Yunp;-^|z^w_8`#I0gasKW=0PrI49fH${a?{g^P76p_IV>8IyKEHd6`FWo#s*g_FdF2A6_=`=%e_ucG%dPl+yifKl zlD$bu$x>L22Yjm}jXx7}S1c-}j}MeW4_0N`Un~B{*njp0Sm%&M@&6;Hd=4Kxml)qf zO6}>5H7P|X|1{SjWN%b5HcPQwPCT>!p9SDmH+zvh0i_T3d$9PEb;p4jpzt|7yg^7{0!%!T-O2|M&k+{i{}`^ZnwR(C_{I;xc8LqW|9s{r@LS z{(l?%{{{H}8}R=M(1Az5# z-k?9jE!c$nX+SgJpS-w^$%!@amw)^1x2G<|#&+MldDDVjyLL~Ej6Bor(C>RE%$hcB z`!jF6bhY2xBc;)k?WODd$7I<1Bjn|o&&lgEX3BqNzaq1-cJ0N%kIKka<)v%;x^n-R z=cUT<7oZ86H^fBxh4BX7c zK8xZ~_VGEVU!z71sZ*y;hTwU7L|U?S>(*6c^wbYzCjWn^ZPx4mx#mAOI9Rm-*bcZ6 za13DMrcKhVb4RKC&|}hg&s8bDN~FYUky=}>$^FmFl1BH}mW|+XayxZ%FW|a$>(u&3 z&XtrYQ%1FQ*xn(ypQ2{XnyM|u`4jH{<9Z0Q|Gyvhdtb*YV!y|?tsL@kn*x}N&#w01 zvG4vfc%6NA#q;RHTl@2h+rjUO=fU-%1MkUr-3`4H$70cnrwyZBQmX^UMsU18_`_+)vJb5FqDI2H4mC4B$BbQ6Lt$3|!AV z|Mj*3=0Tsf!{MJ!-gaP~KbahD_R)KovROH1U*fr@;=jM2WXsRJiH^}eSxx>gqWFKg zMQ=ck68WX{k^WNr$@-LC4M>*aImzkb18&FjV1QRP_Wz3yuP>$d_m%9$@-b|P17ifL z|6ek<6VK%TYyhu1*$UEpPw#^FH^}^M5R1F zvUXTq3H#qWvSslk33{lw8V4YcYo4deemr?Sl-%CKgy#3YSOYL1yKL#}D_g+zTl!+0 zzn??468#;r6WsqRaGx>ekKeDOS1Pt-rq`2DX6CyRT=M=Q48op z{(s_$y}ui0@@@o|ZAcXzIxGjjy#xNb9=r>=Pl4cVC~xrpX^j8>h5rAa(9JP`l<3gm zH|S6K?c&t@e0@XA{{I25{y)E4oKiRaZbZNL_mVyP|C;{;!T;Zb|9?c9YoPxd*#8>x zoE{b-d=~is87I!+!26?hX7vAA|D|1NOz8xG|1&^Hm*O(1PX5%|13y5|-_;H%hP1-4 z2R<2N$n&x9wE^m4GZQV~b^$71yb#ys!7g2PSE^A_`c54p{dPYk?Kk&Idi2#nF+;|U zjOjmO=(S1nCd$B}y`*q~f>;-nMRH>vxMfKn8Ph1gOlV$M#x}|;JzLh4W>}}zrA=)a zjkW;C1Dc^tl--!4ya-!Dft$H1B9fZ_=h=0A`t*@6zW73&X@_wQwbzgP{jA_#K=ye# zhU??g82j%EVJ^O;+9PO{<5~i)siS@%Gx?uw9d+KG-v2js>Qpt3&%XJOKmI72(4XJA zbEjZjM!CG-2977#PT=^wMo37A>;cuk@7uM^_y^ek zF9+TK=-Mb$S&#nz?dIc@>HQA==h^(5(?o|3tH5vX<81#A!C~)T2Y8PEN(=uV1^*v_ zezpNpqC|={I4> z#qOOt#NJn>a#9|&1M&gwsuz-p%?rw;`dOuM=Z7TgJA0+bf@RXR@jWuTQ5Jcuc0tMS z&Ub2K%GaC!nGjU{Q||SfF=K|>L(lVUy~njVw(aj<6ywo)LbV2FPX{zJOf4XKga*GXU}e|-NzU_&jjGuJI610E-&XND8uuK`t|Fl z*5GkH-j*#}Wb@|Ds-3|0z@bBjq)*T8QtOe&r00>VQhy8np}*otYK#Rm2md!~P*3*# z@rUa3vu(lnf8d$(CG6jGKEOKvz_tMWcrGEwCupyUQgBndPF2Qv59_KJuH%@xKl6k)1;w zvTFzccQ-hn*z=@A4v%oiDC{rD>E}p-5rcp%sTq?=e$}DJ%y$*IV}W;op8)RRC+D9B zxK95Ha5L-sZlo>nCem=dC+36R8=qjPszt)#%#e^yl#Hh ze4G{+=garWAi1M>fP zCzc6=|J!6n|DW}iV`uVpC#(S&g*Lzq;#@#knN-)K9k3PpYEkiRxbTx#=X71eSZ_#7 zOpM}v)XCPs{m!FDhb^4@TIhs%6EBYW;HBh2E0-k?UH*wY`5n&!8YusH>#ZNIp1WK( z@XIgf*6Y|XxyQHx(f?cV-I6V9*Df44>ghk*wrF;F@PNmoyS8o~+pRj*{x!`jLmL;9 zR^7Ww!~O&1(MIK^ZxuhOULuG18EcfHV9%}2uPaXFcYnzH?9aaN!VBt*J&v<$aLrwT z0y%*G*c-^P+qu9Xod25(V*sUGa+Eh@)mSEE9P2Xi|L`VssXjH&0AM@g!w)}HZ5HkW zpxtA}j8S9o9M9<5wX1aK&_T5a81KwK5fL)5&tp=j+ha2D#8qjr z6Mg?(B0Vq`(CWFDrFo+Ua`^Be*}i?dTFXZlb3N+pBYrQ4;{ZK-_Ec>Qp7X==f0?E^ z-_QILS%I{!_4&~!A5jfw^mfTEd*=6%_@jGJokY$b+b=ub7$F-bJRn==4U}C=CdyxH zzm`+GH_5N_hse*5qGPJTl;GT2}06?3ftod+0U?C4V zp8d~n=$U%g-->ZwaTil3=N5PdF}a?7ZH~F?ad`H>c~-xk58!+~*EKL+-@bjt>2#_# zz;}@O0BZ-9uUL-t|6Sz%M|#PK@T<}#44z>^4Pn=!qM<4I~cF3Q+2k-9#=l?kh7;U%*#yI5Ec$_5({YYy) zkY0NP!MA)(g$ATm7?=%g1XyRz0vzlAJNo=q{^xi@T|njk!!&ZYgk$tMnqiI}^Y4)P z)s$EFd25uAN--mFHYCS09E)=l&nNe6>o5MVwZ}KQ*v|2+3x2fD+KBjB|h>{~^~KX1}j!Y_=)|op|Q_KllH0f97<|`3F?^rpJT#tm;)C zZOn4;<2&geyHH8J_&+5d4Sp2?T;yL{TO1HRAq!3TfEQ2)Ahkry-mPTzOr za+CkhnEX$EP8}UOgn>UdAWp{c_1yse-vRzVV&VT&CjZ~Mem}pB;Qzhg|EP5MKM4H4 z0{s6o^0Wc`&-D>+!~XQZw!y3TpFQV9zYqN1_H-szI*!}x-->bz=J1tvWpm1;2KgnV zXK|5nXb)TmhShfQ&OzwRm5DY|RX*TP@LLkro6Ss2Ow?olZBeyqpFSM%$R{CRZhPUc znaPuWpCMh}m?hO-oGayrkC)mD-jn*1$Hd1^mw1R*w{{p*C07Lx%P?` zD_;!`Uj7dFX~YvxJh2YxaGW**5%tS_{CnY8=<*x%&JT zF28BV^Y)3nd2!}Rwze{8&>_qje2M?lYv|`zfJ{!84CNTlGWN~!oy@w%Ly=K=7IT&o%p8hsW~`2=>p>W|MCbR=Qky$pu^U@O!`c@=N`GLuGWtHR-uu zr1xP=MPV$U^YbrD%cf1_%$YN)&9HCZKILNEM|$<@rRpi{84gSX769)6Ujeg#(!ljx z*&*}=a12N)mctSYU(Y(^#6+z9E2Vy8Y#Z};;S2EMJU|72SKC;qN}zitC?4`FXW<$pcg)UNqHxwB$Ve@XGpmz}cj0)8eITw(Bu4-OxenCC0p%clC1{XKbTX%^Azgl+QKXa)qa7` z;Ky<&rsS$rL`t22?)DWa`z7OKt5z^Jd+nl5%=wf5{Q>^J3S+H7K*_+)T}v&0xV~?e zEal**_Xgnh@4rwpuZxd^gHOfjdQ6u*|I<$qcm-Zdvig7ane%)~es=RQWWCZm2>$2U zd})85r+fD;C*$K2RXT}@$ynFC`mglA)w3L2w{aUwbIu&{|1tFcQ|D&32|9Gx3;x{5 zI2pp%cO&?Jr-lFH(Elg@A4;cvasB%J{5FCAf4A^|bM*haV*GzN#{XY7`~Uv~|E~o9 zuSJ?0VgE|lzXZ0Y2d;};1pa^C>2M6rZ2o6amjrqP{{dL%`CITnJDi6%w*|%r24Q?) zBH9CKfO2MBwktC8;v8;7wQAMQV+?o*>LU5SCBXiF0D18B$K<|Y&1A&5(R)uGKlLc$+zT{{kB{%LW5}PA_%H@MLLL>D5!?6yKd$!mH zXeT*x_+YHSEk}9kpg!QaOf=XvugtM`o<*SdF7g{h9EayO_W}X})Ovh!KgTe*9)R); z<27{P0I7XP9ln(Q8s}zy(^aye{R_W3rhIw0qRtY; zd4lZA<9R&C6mpRN3%lM;dR%C1-l`>})RBHtsC#wFe$V(>tAhXUD|QV0za7uz0bcoh z{jvlUf1~w-{-HhVXUm(jEd1^;{!g8cCrk*7Oh`ydRuws&KaCo#b*AKIHyilrP4exxkDg2ato|Rtb-!5n|2X*nFw#gJ9XtLG{@jc>8N=6iGx+~E z@c&K|1J3cNAUl8eM5sQw@NY*Af!iU@V~e!LS35z4rZEdtdr}uFQ^_FHe1o zx!{o1^1#=@()q(d(*A!P!705WzX|+y#?|;MY%{3!1K|G$0qz@Uws7IXPt5&dZ)TR! zH=yS&$SUsUdH{lJ>@>1rp4!KU-`zcd{y*1o{Q^wFy#q4YFc*+jttG@5r7nBATq~8C z*8nK9>QDEc>lnFCpX(ck3>kv)^h8;XeSfv<)sr$+t4P%b4W;c9Pf5ThU(2+k;W8x_ zOHfXTOg?i>x=)=eZNUFmFlG=Q9>kCXfMrLB>$O*-P*MMUsayYI%RUK#i zJyk=ZHoPb7!CX4?mmK3?Aol-NDWb~m6!h!=3&)iu3)%%fMqf2Ee%D`9Cz=+(VLTt^UIZ8N`KZ_N{4h4 z->iQ0t7|GP#{N6_TdgAme={sVofp)&gy2jcJ`=vCd_XS$LgIg@uN3ZouMWeS!2GfJ z_7D628D6tNl)$x_r%=D90S~c?ThQz@8|bR2K@gq`2Rcb|7!3*_e+L?|5w9)?u|$fA0Ye< z@c)ZW?BmUB{;!3~%XNFK{}`K5`}!Y*YrS&dfqv|taBN@wR=)0zb%QUW4d8`g_q*l+ zra?BdE`KNr$GJD>u=am2>Qud?#H1#B!uE{Y^lRvpRo}0k^Zb9NAD*~ny1W!VSH^|E zB>guJlWxI%rOnR|NyGQs%IuF8EI)hZToc6Qyg%Cj1lJE%#FzrQv5#;)KYj<;WAyi5 zY%8g9<@z=D;XOf)xCh}UftA1lAOJApc)4s#==T|uaqGy<3a%mn5Ei-C6m zwFZyhH{@D<&Pi}@KH6C*YLPvd%YPng^}1lKUYU|5)S7}?E!)VnZM){-Y=TM_8N4v>^Q#tU2e=dOls?pdS#UV8Tb_iZsk&ANyb^f?Eee)W+dTTlgUyIC%06o zBB)n4(+0Q%T|I&BKqPRzZ3)VC0aX6JNh4z;xHn&&=~qw3bJ9R^pj@SA@4hM;-g&p^fh4NHh0&KN-WdcdWd zX9|^Z;=7Y0utvdXgNa{-d>63Z-w8SLKl?!~0rrmqN=$9m)qh{#`j`tShvz$t|I_B< zdGn4$s~=Aqe+CcU6P`LJyZIPVz4+e={^z>6)X(Qzy!g0B-(M&F%rpDZ&Rq>oOAYJc zzeDl=E3at&CqJi-jve=bKYu}-jN$A13;2H*`u|6D|Nk`37&7_)*7f`OZ2|x9L;pYe zB|nUO&i7k{0<-c|2VTrxhQwzN=}w_*xTO>-#_rLR7J*q@{vrz7(v@1 zPl`XjHNgHq*9}BRN2|DuG;rWRtE7tc!6o}c88clyhoX9~!X@eYYVU;p$B1CekeXJY&xI6KQBi+f-%yK(j} zdH!i2JfI=Y;KuyG!}qHE(7zgRE7zlljPfCmeg+7>A1PRmVE{`uu_p6o_@Czn@EuVJ zSOdfX*V6|03vz009bCurX=Lniay9q;`4-8k>>NIsEFp9<~b#VIFD65GgsX33dF+ z_5WoTcajR<^^n}93Q4x&d2oJTUddK0k8o{Zwo>@sU!B52-iLfobzUI$5oRf#+t3Z2 z)J1$+Nu{i+vm<|v+jJ9Gy__mXVI@=nW9G;cuZCmK9hA{GV;Of9ygnydge5dh}8PtFHGI6_s#}XV+%L$B5^Z-ZAh$=jJ&Ekn;STy?f)X zc&EkZ{rlsuq;@`!;m37+J5BzNM*sgL`v0kOGus3mJN^m&+=4h6!`F8U_^AAH@9s2+aS_0snuB{{Ii?|A(OezX@q>f&FV>|EI7&J#gRT zf5HD#o%lW%`u~~6|LoICy;9jkrk9r^WBp}ryMpSO{uXc!U<|;vFnPEJpu!o?8|NmK z)p5CoF0-zDP;?0U&SJ0@d|b@=m?6Jy**WdQ?>=9>=<9d49E&*7>&%geHt#I^@Q1N$ zUcA_QXTY^K+j}Io+tMq!_m@L2eZ1_`C9%=x$@`4}&HY?EcyBD$0-}Gq8T!fp(}92T znv2AB`FXjR({%I$UIw@akeCfT4{*HKHSbdYAIv~W+Rw2I_Ww2i4<9}pMUB2P=I>G7 zip%NZ+vUoiZr9G8q+;bNav$aeDx>Yt6>A8R(PqFoPbv=E0laYbBl4=s=yvfxi;ryp za`8&^*{{{d*?sSJ$tuqG`l1aG2`iH2>>q37ml;;_UkT%!{m@}(G@?niZ&szA_z*Bi;=lG)1uCn^yMIyb5z^z;*5ZNpr_SNGs zXC$&{QL^mVArcxY_y&_;UB>md0nikMp8uLUYry>g;5@+ftR-X}Rb%vU9j(*ISOd=0 zlb^ZQAAN7^`!|q{{q`CKrD(fqQnZO`M|{Ej6|P@Fs=v@l%7^xmlKUQ$QenNN_uswUO=XV=p54KT8_<`CGhE32%sxKlvp5Jbypl*X-GU zMO_acBc4}!$HD)cJLedH=idA&Q~o-Wq*ncTr)E5N?3mWRea_?WQv5%A_F0qvk3xUy z=-6>T_;V}bWDH;5t>FJK@V`^_|5vWOi2gtMKXu(q^G5Xh`E3LL9{~TKRsDZ|fA;?k z{%_ZAPE3y;pGNiT_x+i{gV%unc_zcJ(El^+x9+z{?VfFex4{3?oEU-v|93c@Nfqn| z=#jY{3W~f89=Bk}h*C1?f&8kEPnp!vt|HD3w8XLATjX(@DOWCN*@89hNmzHj2j7(=c7{K=eBJ8B^H=_N-JCUVuAlztyhHOAE&Bb`@o=v9 zuK|$r+3#l?fbD@ASg$?&wUA#Cr?IEXMAnM_j`h|M_>)k6y{g~FSZTX z2H^MsFRmqE8o=%3e_ek0aq}hi?kCkMjPC?Il2xL=9WP1O669K3r0o4*r0jYoo9f@6 zpYMXloV@i-~4m9N0SjAy2<(?mU zO6ku#i~r|c0IUfJ>>{<74V2s^!2il#^^FDf?Vqew3PLyb23mAyqwW&9#n(6|n*AG& z^T*yZu<5ai%X@FfI)h;7UIN|IpgW+(*ZsQYFI${4<$!;+ z|NZyj3D*+pqMnh<+XHM1)JllD++5Bj)!McBw-;u-I_FsEwqGWLKiEcS0ki@*_g@nn z(;59q-S?jc{d(O|X4-u#x?V?Ql;E_6uzYYw@Hc0eq!A8P~;d^$qn_AHY{{VPiWj0qqO%)z?Wrrn^49^wV@ zWR_7)xH|!SxCQh7_#C$4|4o|&XEorMkFgj4!%i4%)lghdw?YLhj>YQOd+rg;)dl+wso>Y`gKw3XBG*CpFz0;old~S3BIi2Ydl60$u74@qlbb!)&yN~)3}4^v=>PwY{{L~+|6j3! z{r^bx|5Mk^G;c(|pWhDj{|}=7A9Iowqf{x)|4+xZYd07D|Ig6>*ZjX3=Q3`E{`Ii` zOW2vY404Ugjd zxQY0_>pbwsOBhG)in>YuC%2Q=TLNqc)LgwO#$A&f^2%$F>6d{*BQd zsDp3VyvZ|jp!XM`PA1x#8LIf+f^7u=j=z2ldI`v@t=y@V|>G0pGx@eIF*AAVSUzi-f> zLGsj7PYJ&@!0!$6TS=5L^T>Dl-*u6n=3^W{nwECRs;B)We#>H1BayfhyX5z``pAyw z%gWAYbIC8G^2?E+DH4YD0?z5VE z!(22zzytj=Gchxrpvx?$HgFFCg0`5TJVieLTm+wBz*)>9Km8=~$tQxd90lK1Hp1}< zDkbl5EQebf@Bz5?q&+YlI0$GNZ}%|50sx)$?N|{|EU0goXdlfd7xB*}k|D{eFHs!T*Om_`h;x z_xOLeZXZYY>GR#0fdfM#hYsDyF@V$P|HJ;zv8Fyfe1`CM&{ksqpZwpEfe zyB8Lj2ma4Qw5zPv@bdSc*&M`o@HarxoH=v8+P{DQq?IdIzKy-%!>}H(8R`{!Evj$d z3U2eHgrrvA|FrzGQSVKTn)BIzcAh+Oiu}*@f0V0=bp%6kPCd$By?dX5d#7DFVGzo( z0`NazHLwBLVuJTS0ztq>z&pTGfO_xF_=hr6jp=j$BEL<@zCXVg_+NB9$=wSUED)X- zOg_grjygw>X9jRipWp7|*?v6#up{;ja_<1$Zr!@6HUrxc+z)9v-?z%&oX28F?|*0m zB-X(=z$&aWe9FeZ?&7=8Z*nExN= zkfT3LljyJ?%B1292gcAb?sXA?AyR?*17xNz~z4`{+}`9tjYi6 z=hV@u(;?{Ii8vX<*LNrQf1ic_o|1%G_uHVn^H}L=A6#UTdGhaG?e>e9dd3AA2c`5qq$z}36LoZU_`IB0Hc}2uD=3GtzJLGJJhK12K634xQ{s;Akpr)Hly3%Rm3rmW|LPiaa_swd zToa(wEVE*8hX7vzoD(Q*{I*k%QHS^;C)cM%T&s@(&u#R%wn!iA^La_oQ2 zn%IkzC!ai%+W2{i61xx2o*f=V{^!`f=h*#jaQOkn|I?=%{6Bnn=J2!Te{}iwu>_Yd zk3T(kZszmvkR3fb-h%t-czxyTFr>*+V!ook3RaDY6JA`8+@jJ|5cH# zT73iAx6!vx4{srS;ZdCTg0{{eaDQv8*Sw|6#s8Dq;Edm=aF)-)^0y4?f>j!vU$|Wt z*TyB{jJZFYPG?Wl%UVElfaCg_|Fzo~eszF`KnsBD{oCUF`qex$2YNUs*ywf{dW(8} z5g#^UPn6F$SVwml^XkX(e8vRt{{S`vKLBh4JOrr!!Ju1A`(~r7x@Fp+&L!e`#5r>0 zQ0E%*d_sM$F~1|(2*@`~x?aHLKGL!PIiB^UH_#Q}S^?L(Io!MARKmTN4p*2}PTzCx zoo6Z8*KI5Tyvy<@BqY?qS}6S1f52EyNr#p5$gg$H9ee?V7+jrD6JPiDQ(B%Jf`zKC} zh#WqgZ49;nQlewW!_dz*O2+W<`3?R5KMyx=ep2!OiWTwU^XErJj~tmf`h9(WJJ7J< zVJGTA^Rl%A6Y!3`CF6U-rTwoE}1Q~#` zj8mboYmX0g-cIgk*7^SB{6%t)9zAyAJb*q}BhEGe$M#zSn)~VMHUa1RtK$rruH=4> zBO^Y_RGno5=Z?M1G2ACGFCL5U-CvWp-@b-7?5U>^a8CU`o0o4DMW%N&7 zYy*r3f`IRV)xdgSE3gZ|?^S(Ifn(m719V^cmnad2^<-)DvOCPp$4n1!@&Dk#k-LWtJC!OgYp%W# zel|FKFWwD@wzK$V&5HT`x#vztju??PKX>kY1byONh?6mVe0CiuT6918e?RrFT6O8< z!iCY%qeq{NcJ9K$A#zW)|~@BpLjBTOaSkXLLXrO`u?5IVT;NI>d%C$8FWkoHUZY( zv%2S6f3^uy1H)2@Lp{{_cUlvXZ+6f&Y+c*}-(_N(gOupD>YY$8V)&P7rX+BBMCFe8F z-^Ke#%5{~+9p7DXSR0mvvjL+<06xx*^Rz0Wf76le z|J%*S-u(ak^XESuKR#;5uwmihBSwTfQ$yFT#|~kRa@X}?-);;ILe|Omvt#bu^FP1* za@6s$V^5ua`stJ4Xiw1pkw=c6EL!xB!`B0@{jXN-@L!!fhyO+WYu8@hw`^H#6xRSu zn|AulOD{!uV8)EoQ2_xbBI?&a=)4|q?f>Axr^3JbDvsRgC|9oQq2k4BUn)_e{*^Li zT3@>7p3avlR(vSFV#SB!D^+?pzDkvD@g+)h!MmU}fWM9Ez(C*yUqn{ z2e64h#{Zje-RAA)V{iU9_Iq&8$L#=Cye*7f_V(N7|C~KLI%@Xps8eVQoSHSujk$B9 z!bgpYIM%%R(f!v0ocn*UbLW$Xx_3XbgC)Lt_2tkVJFc8rw=VwT%9U|3%a_N+tXSd3 zs#S3@fq@sI7c7X5xE|o#|I>kiv1eDVyo9lOya1~A+g`S8vzWYj%Uvs4wASU~#p|Li zP><~ag_0#3TrN=H{)-qwjLiVx{i;BD^c~7w!V;*=nE$7V|6eY?ci9do1M~(y0X6`e zf$xA(0N=U!fV=rB4CAK&VF3G*1lyWF0G$E*vP-}&0lNh360l3aE&;m)>=Lj`z%GIR z$0dM1xetI3u?arnqQ(Popqu0cxK_`GT?V=iuuiaUaLkBxg>{DgX8W>Bz%Bv11nd&H z%SwRnZy+nc_j)0~AHeC&f|H)ro@lPsw_%q7_r|eKux_x9u&%JquZ<}kE zfL#K13E^Jl3E=Lj`;La@pyt_Gm%Q@W+Ui{B@KKcG2un*V^gxUC4l>z_f{NJ+$CHpIriW3D_lIm%yD{0(f_GZx`2g_p$Il z`+9ue?*Pd8>wz^uh>d?$8SsD3|2^vf>jLWp>qewmSGYcubtnIwTf=S3>=Lj`z%Bv1 z1X3#jzPka}_jqv6{vF4A+2`YXe=YDMup9`s@vkZa{?GZpXB}W&V4Yyyh%ot|dqY@v zZ2nK}$7TE3C196;T>^J-3Gm%*zQg;Q?{u#B;+!wXecAWp`~L^v8z9KWzp4!QKj;6R zb%1q&b%J#R-yKnFMQ#4SgMZt$X?6+NC1968dL@8&xi|lF%{SM5aqgGnzw85&2fhXZ zZTzdsfd6y;?^y>}7g#4)H;&o-pWd&^4zo+ZE&;m)?)(zKyWE@qoyo}(282qogd`^? z2LnMsAh1+SxbI~tbSQuNA>PttF!^*bUB!IyTY`+aCLevm+6`|yItDi&bzB@D64g=GGbhJe3xCq|2^kCl0y)VI+4sh zAWobA@BH7kZJ}KPb_v)ekX{MkU7ia6Cxic!Lz9z}LXwln|4Bh`!T(81;evPQ0+#0_ zJSX8fNpY-22J#FuILeGe8R}8G7!GJZ>Qp)mSrykMYx?Olv|g8Mq)R)jI*hc8xGwuW zWN3>ej%kdSx?%HwdOs;U%q{`D1nd&HD@wqd z|M7lD|KH$$@K*>B3~mg98>skNI4m@@_dD-<_^I z%rl!Y;>yGc1Nk$qeZFh$=%pH%ihE4R-{@V4Fb?dN( zyYps*TlILyPb(}feaH*{_pAeM{zo0L`~P>v&)YWAE&;m)>=H<`1XAVyq~tKX^Fsmf ze`0V_A~+y1F%VcvBogF)@}l{y!>q0$=a%KO3MW6B_l94R(&^IY6|VH?xL)ZcDp|u0 ztyAf-=y3ZRwj0knO@n{w=Sl~0UH4w;8vdT?(a)NO*5&fE*kai0RSwp0mo88Hj5G{C zot|NfnJ1SH_y5Ey$1+J&fV@kVc9?mApG%(qTgn)6LGTY|UBH+|DB1xW8* z4zNqWE&;m)?ursfjsNkk4+D3F0wH|&CnjDCO1zdB2zP1XH50topda~Dhg~!8UEy9~ zN|t_r*69)7)aME_(^B$`W5#u*hj3*BU9D5QW|)>`TxAz^P_OCga94bW>2Mv#qDzHc zTbkrbmtmCCFyreqR9={tsf(`1y{X$Or)0EVtxxMWXTk+f|0@*(Da1M_oXBfNesX|L=-lwr!+c0(J@5C6Imzq|g7?Lco#1iPsW>5)-ZkUP~a4BrG-D zYfGPrd-?QpSKOk8mZUbQp1|3wjNC6%Wt!Q}G$k9oMBx>xXN|GF`$Fu zd^2AzJ&dPiO7j{Yjlw8NBhmy6+V*lw}aEHCO(vWRD-tMypp>AZW# z=d&rt_%0o^Nz0nyDn0Gz&Wqblod&}wXF!*uVL$jEZ9uduZ2rHSf9Qto`n}C}x#o6$ zyP3!e@H>t~b{lpXm~}wc3DytR6J2j~`#{$z1liZ!Rs!kqKi~P_-C*!{P{P$Kf#mU2 zK|Z^B1zZNCkTLwOGF-uw)pFK2N{_*f9(r6drhYA_bihxCYk%!}r|0tb&WEAnsSIRN^crr9`U{6r52`bG{V^S zv-$sS`(b<9tKZR@_ch;>=lSi%TmZk}ln3Cq9P-()%fPG)tPiXgtRt)|IRLf^bX&kW zE&y-)x|>QMRsK&*3`3tUl>84K4!(NjN)QkTEKL>QKl&%66|Vd*ryiGKIzCAe!auhGv%z|yjNhp-Fa8~Tw!U%G4qdf!T(pm{|TH6;+hb9{{L?JfxE|S zHTSb0r+J_6b#i?{pfFGbC<+ueQ39@we`gu64ip1eA6PF60X*lM^@VLkwgpma2f*9D z?v@fr$^S`CzT?6D;Qs_S|6jfwcm*6nT)hkz(5}@_`I|E29Pc=;cv>b6T}roCT2?=O ze+4{7ojP5seyg9p*ETV}(qYC`cItbE(RTgpb?=JnVV`LSWi_bB)S==iJ=$KkywxU^ zrjj%Bq~e3eExJ@*Oubs(6|U2;=urP3^OS&1Y-;!gmuE;|0Jiq z{{L?Ig{wJR&Ha2|^Sw>p=ewMo&-Z*OpbStBxCf{JR5Vcuu8n_J8SsD4I>5S69$>vF z4U`1f9$U%7lG=*lJV|D{Xd z#7j#rUjjGr-o$0AAMPn*$Whjmqo2N~t7OP=hQE?C<7q#gp3BubEH2a5dR=K*(n%R^ zripl3Udw3Lnx2+P)h25?t~}A6%S*K`s;7pMtT1=tQ`TY&9FjtO|T0ocy;0qpB8DFJW(=ewQn zc)agJ@!k(XKM?$XIq34G_`u8Y@k>2$3C{%m6_*&#m(r92hsBe}tnqYw)75dUGD?5i zaa4L%dE6U*OwXcM%V;;PFxu#Cr>61WwXmRL(cd=nfD&)x$Qx_A&7MV^9muX6E^?fB|mJ#Oumb` zUW@%R&fBuz&v9Ii>GM5a1>pO=9?%$Q4zvJT18r>ltIL3OpcU`{&=hD0usy(bBF6_f z9$;+)aBPWnjcow?x=TtRCI2Tn(a#IRyuadqaDOm3F6h$5i-EvW7vgbG!0)o@8qefj zcbJw**H6VqJePj!J<~9BTGLVY-syPQVX=XF!F_K1W|((;oj&|8>o_W&k-jT07C8?; zt&ef^z1E{#uXHJ6)um-jSJ|M$b(l4d3NzD6P0nQl^X_GnmRI^L;ns8zhIU;L>j2w= ztP`voI0wLK_y6yTAGqd!zMDB`%YHw(zdV5Vcy4fgxz!j7h`>~DJYMOsm zzbZQ=>si)@9_Uc^nRe^{iz%nD1o1n>kj?x!bZpHB99W#^YIo_xYZ$f%p4;XB>|Dr_t3zd!Uhx ze|;IS9uW0VC+~Y;54gxY(r^V*%5Rx47ya&)TI7?-5VQD{i5@#ZSvv-HYTZ zoradD3qPxF9Y@JB%o2z9Ds3~qD@`R6=V61=Nq-X_@szwF4*<-Lw)-dpv!(>L?2(}%3m=@G|W_F5;}3qhE72u3@Q zYe7PBHUQ3syymp||1S7(8+|d(`{x4qj^?|XbGY~8J&yN!arF5s#u&WcEF44rCmfCr z#~hB%PKTq54Z93b2Ur(6qE4`GG)A3aJF!$8#)n>X7;^!fM`F7&AHX>#&H>o`k3zT` zuGIJ+Qx+IPalT z#i5*jR<2IRB10Wk8GUc{*Y`TirOQl5*+JcS);8<3J>uwa(+(Y`^n1rQWhtZK%9rV< zo^h}Jt*%PnOvl?kovzhJorba>@sx~d6ZNWa)88uV^7oQeaZEp@%d}I+MH>VBe=+z< ze0&JTgF;z1*haMZ|8Dqot9NmBSeh5$TrKir;9DQy4>&u`I>OddVhu%Q4wWY}Zi;kiqXu*sX&Zj-vM_9Omm#0cv{hUqed=Z$9nWwLIc1B=mstiX z&xWlkO=~>r)Zuh>8p<`FbvXR^zsL9w=70?TXWd{OvHSmb!>?QQ|Jf(Y50nJBW~(mv ze>Gm&n8&S&`Tu5^+wF23eLVE%27v#E;ywQ)-uD4E>@u*_fhTa!`tcCP0GgoAlqdf; z1-Lhma{wG);{Fn@0kHWWg>W}qsq+7oD`8mo4gQY{LEk?Z91(Or=3L-~b7z-cI0qgA z&MQ|x(*?j==S`RQ7h=wu&xRayC_h8ijHBee?v$c0{r|q=l)0JmkHng2-m}R5wQF4?qqUR(O|p1OE>I|388E`v~y=NWAw)*|5vNs}4Mg^#Hw{ zI35CZrYiZr6>uL=0pMA|oM*}o_yYEI7nDE>{!ak^Unc)w48=O~5X=V$qkk9#9t%7d z9krB*QHZwO(;vJEXgB7pA!j_}9-MPd`B9ExhHKTQ{TQxgjWiA2)_CrFGfeA7Ixaoh z&yt=IW~6QCaOa0MD|=Kt?eDf#*=5z`lGFM;%fw}eieo7|mtF37o_1OCV5WDDg z)~n0f<+|i_9*lJOzi{iY*pr4l^UMD|#(%g5G=z16bpv|>xGha4pZcT94KXuT(D`uI2x~r<-aa zq~)0!|KkkVFzo#f#TxJs^#6jIV43}DtSC>>P;;yWtq73y5-$|DbiKCb+~qo@^Q!aw$~!Z_+I%= zEuN>Jq2I%HQwRU|m^TP!U0|KSx)7WH)A}*pdH%Zp&vX7Y|2M%j0QmnN@P9qoM z18kRay#VJ7xIU!-z=mUte1rv3EOHfh&OPUSz+ zNSpbx=G&Fe6md*jwR}3^p5?3a70I!bAdCTE4e0q0)(O@PoDbo&`~NreGyA86)8PNA z;QtEX{|4ayj(C^%1^*8N|BnX$j|cxhhxh&@8+I9Z)q%0#|Htv$?}R#2)5`yqP{GsV ze{wMU@Z5_+{wAMuy&&V12Fe2EfeJuHfcgmD)2}>08Okya<5CB8Q73gX4RXG|c>ixo zSLgeNTyOrz{%$AcdBd>oKNRD>A?Kr`gE3|t1fC9z2LE^?Dl!6o8VEnld%Bdxz00-w z>o7B(OUCrKq!VSiH*`@q^_u#0xYptEOnoL)9BW){kG6q2E%GW)`dNpWvRbD#-?%r* zf^oE*)n(dR-)TeE^{n-~!;SngKI56LO2d5Cab2#KVYmqu7x&6uuW(lw{FOXi^WG&N z!LfuO)&bT9)(O@P))AZkZ|G`md;eRU!>oX`h7F7x$uX8;L*ALbO_ zVU(dP<1j9DP#4D>sN32G__w8t?BCp#lK-zbvGy+vbN`_j_YFb+FZgU!WKh)U(}7Xo z2Ls`7fd~!y8~11E>M+Qw=Lm!ojPHtL##OSWzmBJ6w7g2!qL<;WF!NqNtF*$AF4MEd z(P?NGVLBbHPsL$8Q%3pgv`l|(qn6b&N*D5*LYHZS)gIhyIqjyf#mt8*56UKO1LM2z zJ?vHSbeL(owiUMP|A(u5OnVJ~mI>mjycn_=7YJe{}&HB98>Y$pJu}@1Ft$T3H%>`-~L0WGqtam z|5*pwM<-7gEmUyo=%R&R-%+f{J8~xEI$pvfFG*xH5ao6w&RkMq3@1(k$4*_8eFtM?`|dMwM~}y#9Ih|jEWU;I z<;dRTbnaXa%B_Gps4IJRq}|9g=xL!2b@({BI7+ zD_iFZtn8tf9&rD|6dHld~Yb$euZG282CRT2z(HD`qas#ksdgKXASQ#%UkWR-e;VKX;Zk>7M+%Mtzn+`rPDXq4`Ll)U0|JH-C!ND`TypAZ+~;FH2A+3 z_`fRnzd88-QM}8a0RN8%|4#w`&jkO!g7^L$8+I9Z)q$zt|B?9ZcSoJM|9bg9JL-G^ zpj6Sqi_!0Y5B#5bpib&G(_mVf|6S=$e?Kgu>SI4j&A}m3J7BHU9kEUtjan~_M{kg( zV>e2Rahs&ogw4|Cxln04DO9<9e&E?nD!lQi4bpJrda3)=TDf<~8mZp*N0|wo8Ks*e zd(+c}3cP5xcWyP$@1h;?qEKfl>B8&guGIJ+=l+CY-(M)keM7LeEI2CSR1i2J@brn} zOHZE!rzx2CC-Cg@H~b<_(mlR3g8mG5#qqqSTm-{X)nWQ8UG8{>Zuhgx7Bd~C&rHwI zZ`i^#B0SQu>M-qf*=gFXbei$Ct=eAGE^WUxU2mIM7WDI!(R!_RSnsXjEGI*Ut1Qj@ zx}KHo);QGVepd0-|H-W<&Hs<(|B1PPAdCTU4Jh}5@=QpZ|8MT6_D{r0ga2!T|Eq!j z9{~UNz+iT$pX>E1 z6f69JXuSUV>#}w0RylCszzt)~nl&yx)JNTB8cd66dZasg&Q2-T`a3DsIaqEv-LA`} zSjS))J$Gk@>E_P$2sry?Woz5EZRMSJ-jU$o;2Xx|$&-~1>Y~n6@(Ztx< zo6d{N4wb$;4ccwBP0Jg3aqFk8N(bYc`VE~rk8~*ySEXUP-hM9Ikgh4K*0UazdQif>{lyV_(RbM3=EX$=xET- zjbCgtXgzeP+f0LLF-?zjpPs&53OD+n6m9m6+;Y0jzm+1;GjisR4AV9Ef0nX!=+L36 zopa;471dr~J_{9?rTO1GzsT~O-H>mBu z_y0WSobUUd`{oitNNp|mem+mm`mS@{llM9AF2Xn8@(%9Z8^QD7VcdTf+Of4H2p$QP z78m)q5nFUxic|r0rCSPhJ?lh9+9fshj-HXFJnLvz#CvEn6`*jIP8kvBbz2|Ef*;W$D?v(s!v-smO}1)gLEbRcFTE#Hz-_ z=z8N)dK?R5Q|yQw$4+E$ej&JfdufPsfpda$gL5Qt{=aJfZ{M=kari$K{C^?%|9bHM zz2N`H!2i#K|6c?DzXSe%AN&0e5=e}JXAZmp{{JKX_kW5xb7f`upU>={3tZAPWjMG{ z!^^{^TT7yS@A*;m$_v^=XHO4TNRyiXU0bwme9)KhzvK6@XBS3OE*=w2xiq63|DUYi z#+L<^oyVSEME(&^YF}f z1n2(4xb7dq@o#Y3mcqc+qC&rm&Himgn^7iM&oa_NDQj8QX*oC5vRYp0So%t~P|GS^ zWiQsI_No1Q^(7wKDesqdb*y58v1?f!uaw<>Y8@4eW7F6+vAH(IwzergVqpTjDef#KDd3Otkl_h+NZLQzEP&EWDD;7C=KB`0K5xgPXx~Z z^4m~F3I4Cz|J%2$RRRBZ1^@Q}|8rmdJMjOD;Qu$k|L=nTKf-?h;{+08;F$w&ga4nx z|Ni}$GuWE{HbikRDCxG$w}stKv7MGu9EX(|^DM@^FQI>(#vroc)IC zv(5h}>sRyt2xW^l5Y)qcn0f86gC!F~T>-0v2`abgg>9w;d+@Rw{Z08b$$_t|CC zt9I1sb}h@gt<>4P*=eUP?PzS_%*2$1MP`T%LaXGJ>!phs1qMrpRut& zx=qCg8_K`fRd!4t*cY*(>Ww{<7d_?M$SHYgS9RixW25y|oNAmHi>X6d=Uv~bOdYX@ zxSc*abymMwXTUzH_}D+Ej(OIbm{h%%~&06qf}=A7W#5buX9O7MTx{@=c3t+@Q( zuHDV^+O+9)?9xl`JACc6Pwl_sjt}4tOG3R=O?j8bI^EYm2sx5Bd`Rcl`G6KR?>Exj)+E z+)<@o>T zks`#Hhx@%Exb7Rqx&IK31B2jezDQiHSYNw%ae=5ABzJ9387~+LzrQJFj(| z@lbIyMlC~oDt1KTRJcZl$mlR#n&V&*{KzLUZKL%{#fg8y%;4FB_aJif!XJ#cl?#%WQ3@c-Mdz7W0h z#@>qe$^C*$+BA>8_^02;JrAJx-?By9#s_`TXN=$e{T5W8-xS>k+B}ipdUbvhZQS4; zz9bq;{L=B8`bl;)o}^0p}hHgSh^KXFy8BoD+Bk zFv0&-`&au#TQlDNkEY>eV$il%BLn zYPBhS@nLKhZ8UyVJ@S^k?NilDo6(hcoHkFpW6Q4J;P%UDcVe<)Q933bTc3G>-A7x- z)H`D;ZBj4#c8WI2mm4Fa};$Z*?p4sb5u9zeVkdOyDnU6eTfuiF3Hx2z@n z-xz-7`#(L}x4&&(>(;%#y5y4k4_|W)`Tv7G_uMmT*8>ks-0{#u;j&--iu@k|<|U9A z17{BO?VAh!9|rz^UXK6!U|#Y3KY2FZ_y5TMoO`@J(5q?V3~-@_@c;Qu>M8#3*sOl^ zoxi*o4UHWWz3#Fu?wX)|%jk1YJ{HBjXwDiy^S^70wv7+^lH-5JZ~uOas@*Sbp2%;# zI{ydGeoy%p{;x`ZHUDQQTeKO+FRH5ci_8D}_vP)`xif<6zTwiMq7aV#gW!k2=KS^k z&H3wq_27$j{z6sOc~yrt))m?^N{;oW4P|Xd+md=m9~`9ZS~}FF9f65MbPJV^E6*66 zHpU|DlA89-PHftz>(?zSJJ6#Ix8JmH#zN}Fro?8|t1*)@Qawh}e<^F5sx3x_zR{-Y zbiZ`}sAuUI|6-eMuAKM~9oo~nDmIZdb=sHK;kM@-zXpE${BV`|dAy-FIIm&H?1$8o+d}0f4#NfAymOXivHNZcrZJm;(d;xUM?HhKD&dM7PcCvi*a>L{P|uXNmY6({Qe9kVA+#;9Oocgiwm zY=@4CMN-ul<4@(52d`a1rllWY}Y%3>+IJoWc+(4*o>sGuAsw~2}!8wvR z{;$%%+qbPm{^z$*cwV$6&Y|J8J$&`me>m{{@4vP8hd&&&`<{FJ zSObj18esB{U;HAxqi^47We+_x9hi~8X+H+j%kIB_{LUZzVBnr!z5Z~Zef#en!(6%s z;4^S-0ltTy&)kvoZT{!nQ|IBEG#(Eg(-0o+a!#Y@-8Ww!-LxS;`mcZeOYuAJksJ8l zJJCzqws6(}7qw~{y`@(-i~n6)uz!N{|4XagZ~uPk{XZ4@ty|}(;Ovi-Z{h!{^jGu$ zcx8(=WyUXY zh`jPIF__e;ld_3H#fbQ%4-zx&DtoRU-G37^?Abc8{fCSl8)aFhJ(J4V>pJ)lzapo` zTl%Kkm98Ua##Hso^{4#O2IZ8j9se3$I|!B(6@>8a!Z4lz;5VVb|A&hb{9m>Iw{Kai z2KiyePku6b*S+_S z-Fe@A6LvoEz@!}yJdkCOjWmJNbqwymf6|V-@AmJy>88K!z4FT69K!V@@;~{nE6@hu zJO23oop}7O?*D7jXkt_#{Qt?{--_mDO;o&Y|JkvmV>kJYnvz>AiR^ zKG?hWv-`jIy*KvWdg}*!e(-}qyYIYn`0l&!9<}QyKS@)#=bpf>1Wwm6&~xCfyT06g z+if51x#pVZ_Vc_^%a&Ih#a!a^Zx;Z(w#4i0eE%+=zmwztnCJhRG|B=OY6$-yJ9;#V z?};m3_x?F@EZuFMf>;e$-{SGBY5^Zyrp1c2q}RZLgL z=2^GO)TuV+1x8Qluk`0Deai;qbe(OJ_KY6wD%+;ri9^avC2#DCJkorTw`FYGQZIGo zO_ zZbLpMH7O z?zcZ|p2%4&0NU$2I|EoV=-{44`#&oyf3mJ?$zTrmj7a z5nt<-FRNW*g07=y?CE&4UEQYj#E--)K4R-dk9MVB#)q=+=>ug{ES9{H6a85GwoTEo z(jQ5cKNXWZUaHNG)8s|RNliVsJ?8-K0}11M!uTd6_#bm5!T(kJ zfBTlTcpS!kFptaR9susIFFWU)9($WNzvSz7?Y?)kOP9Nkq^ADjaJO#1IdtWf{SIDv z<>Lphy6X1_dh~cAfzx~puDa@X2fKHF?BL~>|N2nZuK#zWZQC1;HEGi2n|AH)dK2^L zLZA)6YyUjQ#B)tta|-`+E#SO|w@ITZ;6jbc@;^y&+2V!Ko36er%4-4qY5sR@!3Xa_ z;5i8TqR$w={rjz|cE7X_N(RW%-}|^Y&Ns{}g45Hskn3Rn>lQ=i&c@ zMf>*b%ER+s;Q!5GJbxG3xOR0AydPM%V!40a%H{s`3d@jRrt+#DZR=5HyOL35pbnOTj9#kj`-KIrp?G`-#UJ=sdSWo_=6l_`;k7WJ}djW zUHNw6MO{pMw8L0jTe{D#oQ~V{-SR1M>oGR5s`$M2tbRD-r0t8Y#H9Kvv8plCy6$-B zIAvR@dJ_}wI|vqSSkHGrgm-S+7UA5$Hvozf{9m>Iw{KaC{Lg(MkIT4!=6;&TNuAF- z@8;h&Z+_XqX3Z}A=DhQIe$}qs_m6hyaNE&Noqllif(w3h7VT6OWyH?p0qkZrtgc^UuF)7UmGS?|gvwm2z!a58$Kj1(4$#Sf-whNyOktnTwa^EB3I98OAM3Z;k*_Ylw0R=G)zXVaFYBY#iAN z;u5>u_PGCp?|=w%PH=7{_`hoZYySZ)9*1#%%>6R=&)iRQKiL+zuwK2k*SBwf=lqr} zuiBTA()pWa&ANVra{|DnU$C@Qs;c($ z@;~11UWE6&zS9bq@rV&kzdMssq?02 zbK31T>RDwcFFs7_=t{llc*|D3(vfz{j$_M`RpVfnCC^j<8!^9)9%=k zGUKxHqA$9VI@^h|K)gOUbsn2m-*8_>aP#^#AQv;I8ie?DMy zKY3S<{mK9GW1jb)@Ll{Z8#l;alG1QGxUBj>o3w3w$h!w({60NkO<{HVq%GP!k>6Tp z-dxt8{-@|~xElH#j?xxw#_@})s{M|~|9J0j1o!@h@yuFiUEYe|n&nFZtCuYDuU-lu zUBwhw1-?=BR-2Yt>|dqobgJ^yW1W?XJ+V!@%Jvf2HNKoSqpRxam$Hr={7~M2ezYB( zsh*B}Ki&>hw?aJ*kdE_e)}BD*l~1V^i!(yB)W(#h4@xPwL3Bp7xY1w}IXc z(ogZB?U-%gu`9B6d}{nm>}+4RYDEywV)7kOd>3?N@6H7OSM5LTKcYqc=f04~L%a`w z$7sAp%JTqx9^gEn9l&Eb?$<8@E(I=2ATb7*1LS+I5BZEA@AK~faNS70mE(SLKY5pH zOwKjVIr*{7bph9%DGloneLSV%3~*uffi`K|_@FQPjPW~XcIk{Rog&rdm$qp0M1GT# zo2@;o?f~%iXE=5reoCMX+M>-keo8I22y34^-|}`tXgE{+3u8eeXI`k zr9L(;#;0VVPZ^2djoY+4{gASbTl>+rb^l?**wVJeuB7Gr<>o~Qpj>WYTtGj^rLg3kt)giq9Im|hM?*QlF{TxM!@@)Qk6Z(Af6RNOx!>eEfcta4ADH`gt_Ru!JjNrq&rjg=8Ut>3&H>JawgBe^kN0_> zKkp&o`jO}SZSLn9lf29MCO_u6F5tN*$~SFTf7s)V8|2_Tz)bLQ)j=DyMVrPpeb5(u zmh(Gj_VyW14_I6H*rV&BrvlobE%>OEU-EUWGjA!YTe~mL-B%s7VYok@UxZV&pO^pf zeV3v=JIeA(w`_^v-oNmM)vH3do*V=(1XeDb?_aqHK$?d%k7Z9@wNu8(IjNCVHWtoP zdOELdh#f~iM&6aN+m(ODq5PG%De*bBY172THoM)nyV8nJ**1EPyz-~@ojS2?+Em|+ zFWpbX=PgsGBE-lWS=8zNx_xnC7kQI9v9T;|5~ui;HoM)l(GTtez_TB#@D8Yad~yuQHq>GTA8 z88FW}wo!(%)S)hI&=zgdHs>{c$$USZ{G!`c`^Dpby!$V2+m@mT-UAQ*Um3!+;~=;o zuwp^Pzhc2W7xN?j<$$i2Hl#6iR{MOdyIk3^>RDE8tb>f5kCCOmM^BZdUfYk6abmIU z+BR6P%ggP)Ie8P4Q+9o5dEM^nioCYz#zH+)7voRrq}|w8GRT)3Gt;i(v3(hR(Gy>g zV{Cdmd39}lJ1=q(-a7#PUm3!EpkdC5-DL^>uiAgwe^g8MiLwUZKHFXg@Hme9beP_hY?qF?DH+_XBWE!L=pNEAW|=wg7qke4v8? z^Q>zNP=>P9p)PIE7H!(xkD~gWZhocTCzX2nAK!N=!h7EGwr(km6y&c9<9YMY>Lm+< zI3^A(n?KjTd>(+5`DOFwxOvmI4DG~nwlQzjD_x_nY*=}b)w*Ke*iycXUuE0Q8$ZUD zic5UX_q0Jq*|+RTe4E$=hYeuP0X52m5OL*m1Lu zR#|Tk?L)_E_0`DfZGk>WnK7w6>?0LD6{nHmwqKvO9PfYv{}&a4|F`FHjwFu%PwL<7 zzeSk)L_*d9+%I!2AnO6{*9o2nK~=CS{iyKaLOj zLtRYSib3gkY`C(PUW^U5K3;r`VX5-L{_2>#@v~j}ty0H6J!hCdnV;y2E#YNZdvbjtYYlJ8Hd%iN--{iwd%Rer zUF84Q{T^=|;?|er|9$(46#s87h~V8XVLWpl!nyw-_#m)k&P@N3IkPn8A|;$M+N7*f zOIFFSY=HKq22LGiMBkEg?28|16M1Eaz6ptkewa7@R0^Mt4Usdc(lh$D4dw-ou4UWt z>D3kA9zRY@#;({b=acrtk4Kg|N?zJ6SrseG;#XuuN9tL&+l&p-hYvMYD6d*LFUUE- zxlmHLDT4Px<{iWwNgV&j{df8&J zQ}sq>@$8xY#qs1>H*2PrrM@Gt^NXnG*!9XunKI0~KD3Umi?zX+ZJR8cSXI4k!^l~2 zd;2P7rt$J_?Anj=W!tmzO4jMW8>86Ow(R&!?9kCNG9Iok<*!_9T2AaT6@BeP>vP-V z+0PK?0_Vie(ggpX)IZpNm$1E063*lClpKS}aaZEpf8yM~%mJAba{MjxMtEH2)bVDz zvWs^fac@y5TxdN2Ru`>sWr|2IZ9uFeauUbZ-d>%l?rWnj_F>HdW? zr}OuqwkP8tW9r(cFYQl_U(6WmKB(;`{dD}9Sf~qsxbA~zKNp4Y3_uv) z0gCJ>-I~Wak~sda@Zajctx@*D+-J*vnEP|?hj~v|;{LzHy?*iT_e|XX_uaYg5dX#} z|BJ`}JGPbN;o1KPzWEcz{a+#6=NANb1{Tbi>R&M30QrS1&j`oVDH$WT(2`YptOw7i zJo#oibg8fG(3WMJx^_MC+Mg@qZ9i_=*a8oxf!EWHD<`pty!f|babk#Ri|vEzx3t5i ztz+k%F>z$e_c=z!io+TAc)F0IALR>UtmBD|QH?>2Jw2`xpKLpBd(HuTKM?%CA+lpz zg8xtczwAG%;pKjt_j&&n_xp+G|4z?m{3?33Gx7Z2cjvjoD(_&t{EzRu7U4bbd0RH- zNANAUFy8kQ!aZt1aA#mXxMcn`K`!zx<{?k0y6H#>Q`T)^|2$O>9-1CbTR3A{V4kvP z>(I97As=JM>zDQbk*6(VU&m?10~zHTDflh0aOPC5WzuwC=+Ed>_K`K}Xq@_-NbMarH${`ma-oTgfRMS65;?*Pu@97!DiSNUJ=+g2q1%W*%?z4CaUyq|dgkNcci2aHDo z?iiep@n{dU1KI-B_Wqy7jb41bY03vnnldMcm|+Cpsc-iO0E&udzIHjwMvrp2WP z3RkS&d3b%n{^;hCL(!7$hojrdjzmj$9F6YS4eWB$?K_XEHntO6fi2q(N7ruH7hSw! z=b^&leH&@h*rpHqqR(=EYa};bTf5fPW%cUb5j_>q25rGdJin-}+OItS?=Hf-|MT$d ze`I~$vM}CH6T*FTLGWcDGIff79ua1mqf)7hpv=5V!#Ypd2=Yotbg2h`{{pxsuk6k< z@>*Z}PEO>a?c0h`#p~)YRy!_Trcc+e z}efG26b9b z_gCyM!8YO?;9S6W03+MC7FU)3)&ED29usPO?|X~Rxbeohz?^DD_wF;!=-fGc#<}NC zKBHm7(6@#L4JMvpKZ_cEUame;&Cm`htIb^yRet=wCB7M&AkoV>d?M&fFAzeawdFtAYIJ zD`y8U5v3OQOGeWnpxA{;oXQHa_C|C12M+>*vwN4WElPZuIi00XAsM ztO2}!5k}R1UjE;=XLr$d@_+vN2)-{D#`}0ei)K#`;&?DHH+Qn1h?rEB!@5q|R6DrH zF2~J7X2G=Fblhj2iR#I z<8<_LU7d)Pw`HBY<=5$tH&#o=_2C&)(XnJ5AJT?Y>Bp6^W0viMI*)8c{>3)84d(#o z0=@$n;oRUHspRp$;(W|Z#Y5+ub9aqCedgD?;f6@wC?fXAXQ$EIV{~+*x^?^1KBi{wccLeZ$7WtoG zo^>r>9-O!Rf_rnKUHgWkm;8Eq^zuh%M6c>UGuq?vS<#-qpB=sS4|Af||7mXYhNmLY z8=sD-l;vxloTJ)%^q&>&{@Bdu<&R8{Ui{G1XqWqPqOZaxZ5tnP{noD4v#fE$=goTO zRQvon))CJ~X)}&rR8{R)j{kS>E-Ec9&cpj&BDn86jQ7TcaK1cTyH;@Q(PVLMIvV7vH2em3*8Cy+K(Z)`Fy zr(I&phA!(Z85O^_H-GAs^u=>#X3h<>Z`AS18GThx9kw$bv1#h)*NH{TC^^bYOiG4w zBI~BHV@G|j9LgSjH6{|5_!eKPEIMvHI!5DHbge$=IAZ0w?Kub5VlHq_looF}S^k&* z#~NL`4y@Iu&!YO*UqAb->#mzg)VCmIZz?iUugX1oOsn6yb58x{%|mB_YwH7&+WB~O zZ1*Cb9P6asn~(8PuU=+-8+GfBt#5GFaq{unS$86NB~!27r21!{J(pb0a{%Obj_f!IAivKBV*?t zJTiXX!6OsqA3PFTc<5*rkiF>8(aDPs9Stu%e00XjBgba1I&y5mx}#q$FZk+fV%er+ zDrJ6!2YH*n`kGi(_|?~|i@y4L7I-^Iss>^!%``6zP{Sv5C# zZz*NkH%l2374RFr3l}bo=I7_1G^S3S>e!(@+BQDui~kRVSf^nd2>SZXM}@uawi97O`hbRtq}6h&Y9$AS>V*0I$aid%0b8I&w?)V zsxBvs_u~ce{<%qbC%^=;C%$w!(Y)iFt2wjDP%>Qn^jtLxL)qaONdw~HNbo#?96 z+IA9eOgrpKnd5@@6^8KLXM78Ct>%BM5i5E8&wT;G{X)&|-9u+zfBpQ%;Cx_4l>pvv ze8B~i8#iq_p)ol3zXIUx#u^z&$26`}N05$u^`maxiH*-XYZi~=$?FxZ0c7mCZ&ueq zk@7vNo$vnX2fqr1ckX_9aOu7uJ-u#6uiq};-n-xO?S1;MD7*O&d1bf!X;s-B&#c~Y z*9&WQ-u>d*op-;wZr443S-#ofAa}{WW8tO1vVF& z=B_?)Y*GH9uZV@~4}k*@fe#OTy|VBK)*45?S>wUFEl0oExb4_KPJ|6xkA1VD{#7gs5X*vf2fvz`w_nA{STz{8#x(SS{SbtaXWt0)|5zr* z#y@k{;nCA~9`?`Jd3eOs9f#i?x9#9tW45ZXd_Ap1jqht1V~+JJ821;j4gNf0%l_wq zr-l^n<2HKq<4t=Wd4HqYZrpx9e=C3YeXp+?PDv-dOo^*`;GlqmHqtHO}mDM_8k29q@RK zIUmWrTzB%vxyf}Z*PNZ3rVNb=0)aqu_wL=GpOgP_%^-G|(zfv-YvLHc{a#)iO}T1p zv}v!*=qdZ{Jucb=b{>0m$qD^x{(nuy`tZXKt98!F_cp553+!j(hOY_#d;5#-SM7&* z8UU974{)EpZ}%=7{}<(LTDK;$ddZS7p8F5s9C;AOn}L~G6a5adktbM(be74-q*l8l zmlc8zL0xbcQgBV$f|*k@@t&a^d>bH(W!tvMs=93GiZ9zY>ui6j?D~oum(jY{s6l>Dtk;Fm@fk6O+VZ_Yb=4pO)bmp}$fmK17fGvSg2&SMg|@j&0~U zd1c4MOIfGPcug!!ZAeTaFFqhMZ)!M*`#@DIfT=*rlG-w=u6OTni!NQVS~P2x*#aDEqdCd~yI%6r#*}qZmUg>N zWb8VTlQz*unxXRG_~t;1I&}g_1I=sKP7}1KUE7bmpJ_a>P1@~L>h09ARj1Cl7WL}Q zXpV8^c}HH?_pSj@rGDgpw)0qs`)KZ~I{=rB%PQUeyY~zCTy*Q~k_K(Y7SwDRC`f9Z zR^V%wUXau!xH;+Kv4zQ3PAIC;ePU6K9zd_qmNSTJCT*$t{mI33Z=PIy*6mYDQtk?G zZSmvq*7NR}wzbXu)3>#IaK^R{Kc7{4!NYS(JO6sl_KO~wyZy39Bipx)Zw-uaj1yMFxI@?CeozGBz^y|r@p|Gl|#_kC|`{1oX= z-_F~8-#dA``@X+=&oACvwdYqKtlsnM57+GZ4e$ui?~}EAe>ZUL-X}g=xA%$9*YADu z3ylFo^7lPGG=JZ-!!~GqxpDtfOtKyS*22D z`zvUFVI=en{tW%+foEX%X^=kKF$6$fH@{L^)N`y(#K_#4FhE5!dW@DQN- zg7iW3hkazf??Jyg26qvEU9sy&zz;AsKX`T7uG?Q)y7Sf-mhQaqnZ-M<8L)6i4~*m0 zz!i_rQ{WhLtS|T_#vR~xXbZHyZ~C^DcTe4V4z^KKY^$^Hm{P)Rcjir#i_f@rlG>)+ zw#ipbEK2S^p(y!^@kL3OWELiM4Ho)3jM?mK9Vkd{nYO8R^T4KaI)^sj@|zXghm7BK z;IZG0{R`&Ng+Lp?z9-Gg|GeLX=Ls%pnlc<*sBy|XY}ul1`PBJ;xUxl?ar~mHYQOUQzq4rDmcl%| z?+yIFD7<*?tPt)63*vY-Fk{jLKQUdUi}SOF){6)gKK|BM%Z$N}OCpb4wg8vowV`kQB)8>y2uDfng>uax_+4`Dm!bB?zQjXWw zDm68`)w$=6YYmQVWr1aHowuE3k&7oAuTFIARP1`>$EY&+zO{xQ>F8FqYK;O$wl+Y1 z1o9)|rL6OUvI1!neO0bqJEL{ox>I=^&*OSo18}U#_j2rotU4BBJNJb=2TPp`fAvWE zOCM*H9k}9-*(J5>kJ#u-`Yhk)8<_7)2G0C+gRk!A8+>OE+URRCWRtJOuuZCYNBzp!BEZ7(g_dHXAib`d{(RpYML7Vo<2wI#;^+ZHR? z9~eFA-ulAAowP^W;)kjDW-NV7T#S)m%mn+uzOYZ11F8LHfxl;NzYu-y^zii3_P>}` z%CX>>aBR-~Y3??T6~`k$RMbFi(OVw*P_ywO(=bD;KT8+^{}IX-ZN~A7s;d3G z{J(b>_`j$yZ{wO(kv#147tfgynwy&w1SbZjO&sSZrduiV3L&%^IPFqr$xKI`({9;O zcELZm-aH=9n$N+rhqG~iex}GO-yU6M%hZV+>zp{5H(PW-Fu1` z9Z)B5+OEDjr(=f><2yEJ5a@v8`iT%s^-OJJbh_n3Zxl~?g-8YMgk)`o_XeQ z4~C(9LUgcX?0h-hTD8(T)~S=*5#!2puDq{Lt^>s5f41}7KhGDm11@>>)rI4q`k-J> zyDsB4CnbHZ_U+ui#~=yiWULEn0JXpc^#);0Fa&D?a744=n|$YdiFLuK0$&@T-Ds>0 z$R}x=eOSq0+|ZQJu-`G^d7&Z#x)u>Zvbx*H%=@*^X5s# zb#KcmA)NLdfyYM|Gj=ItPQ573aZq?DsP^{6lQn9@Fd zUHr%_<+}^~cY1h+iifc=#@2|n)%`kd_Mz$BQ&fLa?#kJE_7AebzeHUR{bjCL6gl)s^(;nN2+pHD% zzB#rbw`ButQ*K*s<1+znb8dUWJ10=CU3=(;Yj2!UJT$#@FXmEr-~xch_q-m(^GxJk z&O`o~=enRR(7kEOXmFv%sq?>Ui?)pq`l8Pmzy15qk2Y=Yk2X0saLWAOr0tk!la_&K z|HtQ(hb#13ukPL8?6*~)Po4iqD_gV~$1kd?_KU~=TMG;G@a~@o&c}!GzMRmU-0a}Y zNfQE7Cyez^1DI-L`lpVUyh&9V^^{@WYLBmLWGCnpJd5Y@r;f+9<^{Old=c&soG_Jb z#?Cb4wH?v3{6i+Djb#HTUgIa$CgY@!OrEPBgZJM~!ZB~wj1c=Q{^*B3WBoE7cRWOf z_Owl>o#mME^Xln#*B081j$0=-jjY&=Cnwv;YIDbezIDH1#!Kl)e|3CV69qX3I2Sl4 zwia$a8U80Pk$>u?re?Ic_S!jJd-u-0sCVzl1o8?}j!7@SJk<5vb2BcgU3(PK)ui6C zw_e)4DdoJfc3JWwCuQ4?w6V@=AAJ#c9~jZKR;}R|fy0pw>3ZgwLy%WMelUTuf}Qu) z#cLB8rly@fbGl+&d0fwZE|2lK&$G|HqNvI|CgX7tkI^~;m%sYzf=R!5X7$eV&KpzU z^O65g0$eZD_yTJJa7Mi$SQ8A}=xaQDqp#TroGSoYkz;^1eyj<=Jw(R<)&}V~Zvb2b zZn`)F`~;-p95aw~1-Oj3lAJcKDCw&4Mae`@tPgsV^CoUN<2vB_(3YAvf)k1F12<(A z*S;;gqz+IQsCWBhaHs~?3n_PzUvsxMzX#VS?wz`=<$cq(oqPYZZRb5OU7_`Z)3J7# zQQ8hTzwbZguv?)x74^6KtI{v%M9t^I>_ET%Wli2o{CrL?PhqhT`#_r~ z@>{RYPoj+*yrX=dGXJB$v_+e7{GzIAKQI69*}1c*1pD~>)hi<_7e>N(?@tK##RYME z7zmFG`W40p{kh{ZkOz=gQ27j1pDS{xbMqo+Y$zF{@5z(*@ZP(LTQ+W3ig(T}!|`Vp z>$ETWb>ndA#)~i7v}9~qE9P9vFm@+K>STa(gK4-Hk%4;=v+>R2@Qkd98Ok^9IDKXR zt$x`4lufJ6l2c=5e5$ciHchOSZQVb2ES<5Av1Q^>bvkyZFHQ``w&_Zk4tzmWgs+J7hH zuYCFC1(P1?zhZmKmKmFTzQN%CQ$!N;aWIxmciLS z$SrB`!}6$)dXZsD9qNlM+T%SD3dW}s2V!Dej4!z-uCp^{#GXW`zMxO0f4D0{_1Eb? z$AV)*bjJ8_oH$ud`Cs|% z-)~{H`=!kj`K?#y9&q;GmG4vM|8!-GHskn3Rn>mw`F}@IabZCo-uD*4b6;WH{~f|T z>_HqS2BwT1<5$QW1rfb6x)mdwI2aHi-=s$#bN zN}m0eJmWC^RrXDrYXdwivX-9oQP~mwv07HzoOs!8WL&#?Or1DH2C2lOWLaj65`z^l zBr#jK-S4 zkMjg+n|!#J%y$mZG9A|tz-2_63~*Xdqdn4&W5IPm=S-{(#$jy$ZX_-quW<>|)Cmen zSAa_eSCUsl;MWj%7U(fap+>K4a4>L<#u?X6#ySDGA*WbS^Tr&k8OlT2RZ5-f0O*S? zWf%69FZiTy1;)X6Ol-bx6LAc$WA-tA>5KG@eZ2r+zdHc!%y@8Y2#!-LfaBHzS#Jc{k?L^*}1X;lYku@PWbzDXuCm8VO1k(*9&(wyrGqq*X z{Zm*TYs*^gG4)z^%GmTYau3b{tk}7I+a^4NhBNcygR%a^p7^!P$Inku{g8G^5#v~~ zlaA~3nPc!B;T(MbW)_|c$fRG@2Qvn)EcHdtwdKaC`xCe9^xKS&HI{CSZ1dV+EaKBn zz5dJVx&83Ux@EDA^B+OnhY`XvfML!F&JE6yO7g!t_Q%Xj>Ct1>wY_@f-q5Sp#CYg~ z`abR21^VFn;te=&-Unc6L+T{8<-Bzjm2ExSe!RTcIbM20&6-2eHn|8`vAD#t%(0yq5VRj z$BQq{%j(;AIrx7Z_4YAb>SNI?fY}!I}VQ zf%6eOCqdvoGY4%mu`U4GkHa+utOYub$GTvGMi-=A!KuVW6LDQ3PCN#w9UI+!vq^><9ZJ{bMTq zmT@=-W5IE0hVkJzalANg_59#^jAJc~C&!j!%&{i^o!b+(Q&V#b-+HT%{LeXf8NlOg z-d`g8UjupmVtBYoChjT(HQe4i@+v!Ap@ zn{oW2s%pP-{J*2D2*=!c>sBs{;Fvp%_t1u>fpc+;8JL`r=AS&q4=@E(nW^8OEp5o# z?b$3l?M9C_Oue>abZA5LRlD|qa}ZhhCc%c?hz-vM%*CE6_>J=rs9fe zS8+?c)VJbAnNVOEyOzzLpp99mopy5mpdNDj_Ri?n{9lv&nmCV zZr-kQ$HCQi>{CyH<0$Pq@7jZzBqr15m5t}-$r%T(kg zwd?G>v?Cp)^5Fejag2W(I3M`vwi-1)wD3Oi<#4O1vr{{NT%9w{7<60Bn&WQ6xbm2b z=RD;a0Pg{acl^)yg$n;)4gSyW+jj-{eCj#Pt>tW%m+ z_#fYS&0Du(X#~&1g>nCP2*<%Z<_=`1kM?J$gD+Idyj#vfeHO}u(;jg1(ndM9OIc)X zecOi0gNyJj+sSw@!Ft?#UW{i07T`X;ap3ASu_LK#J2oEIrYC;HSdlKNY>N$V z8P{Bb_reEx1L*Q)mw=Vk4{&O5S9vmCu zzhOHehSb#Q;QuW)|MUEQMf}g}16Ma`G%+eTW&XEp(KbLITx-brf993n{{5C$yI1y~=r3*2W*on$s@ks{|Cenq!hLsnc;9OT-~9>Cosu02PY4Ea zJQ$c180DW77^#tle45T@v0jx;9qSeBdY#XTX`}uqe-?Ee8@f*WVm)m^CVdpX-8XGA zzCXJO-=E*HIe*;s5PLmE?aO5AYmyOYr}F zJ$q&WLE?Uc``Wi3asQcT4!jS?&Vu`qC!{Q?)EzGsIY}#HM{J1>Q>hbuNkzt6RysK5 zzYn|*ymue?{Ql(RzulLV^p3&X_a`MOp!~KCyPkPzi6h05!VeuSQ7xvv5skB za1K(gYg%PtP2fS>Y^)0m+E2#y1fXLM_&W|dO~JVY18MI7IniS(wwQW-(Ldv0JdBMo zHZ$=u=0=F0{Wu$_i+-_xHOGSQ(cff%egALVE{G{Lbr$%)xHA0D`N;EsZGrAh8fAeC zHBO!XU0bwme9#wt#`x{uZ)LUnrOgxhty|{-aQ3Il_o?%Lma;{gar~mHYCkXk?*ji9 zk^h%z{>MAxL%1J3h~ve;#L*-CAwTh@KQ#JF|3sCJ@Jszfr%mKcs`Q|v+C6PCb(GN% zn@Y#{#hQTM4bH*60GkgTIIz38VAE>6zc(AlyaDYSwh@=DL+d ztbJ|M^f!)OwQUg-o^uFt4&b~;m~(=2gL9;k{NDhxlJ^Cl*Q3YmUtE3lq=&A)I)iwa z=-6?@!*%Kmd>F^g4*^WQVEyshY+0|2w`|LL^Cu(g)pg3?{)cMRc=us&Kkzr;?T3?+ z-ZFR-=}F_EHQCIFfnw3rMIHfV{oRSvlNIB0`<8*QiP z^6}(ZPkRJ?&=*19%}gAOr7_}Se2kOv)<*2?1N%d;Z{LM&U}8*7oeTaisVx6h-7kE%8cx?2GCj?Mc66d`(}BJvEj_*6FvhBYGTT(Xrw)KBX;pY(@~ze}wRj zgfQns5#|QRzLNaU^>}lj^_5pn|7DLJllt}Ok@0Ac9_f!>bkV3s>(?LH57)^b1-vQi z?0P9nD)Lg6l=XI-ofnzPq@pM333YI;|55Nh@Xn(+jtAc8=kvYsD1h{@1o8@Y-dh*1 zO=OV14!i~1pCKIw#O42F)K`N4*Ma}1f&V9hd%mMcLfk}+5Y_}C@aiP22eNREARAme z8Jr6=&cT`h=Q)VxQ#4v26`X@Lkf2pAxI7NHP7)c>V=DHVAum1}!5{se4KS8Eh^ZEE zCcrq80ml4Y9dpE;ni>KBZ>0{ zj!y&QM-KIm9|4RU=AQtlvZN!VtlMMTV(YXnx;9Ipo!&6+V4 z$Dv!kI(qa_+18RxxJNw)$GSR3$BwJx*ivm0kMV`N3FzAd)d#7gjL6w-!*~uo9b=Qr zH2~g|xD@xujd$XA#=-JUpQxt~M~*&KU3odmYTuBTyrVBRnA&+`$JsujYiuby$TM~F zMxVA-oi3~GV`T8WLy&WTa{=p}2LGO)&x1Yw{Qx0IT!1Jutw7`INL(AsW@f_njZ&jqkI!U zY&3#Bq5)7J_UWfK{LwG{GZw}q_#YYP)YJvw|I*6x|5=!)>ia(_jdG)ckt0V&3knL< zH-PvZppyZ=8z^>|!akpCr4RZN{&)O7)^D{VUtNA_^F)5h)eXV_jPbz-AB^(5g;n|9 zA-@|)8?+920j6y&+MK^>?V9CyhwlVO?s)oE{c-zk`4D>&t16rJm^#a@=u|2_kuTWI z$w&+0n*xgeIVTD?tUDS0Z-iON|I4houDp8S6bKHodf{`>GZ z*#0~4F)-{IpKt6FKHr%CGh^ErDfe}J*8{p|&!Y|N4^h6mckiy&06Y(Hvf#Ia*-zS{%{YEhRkdF^{x97IMq8Jcw|GGW&;Ey} zhsK8{j~N}rv1?%L@Iihe)1*2-Sl10>8}h?g7HC-|uiD+R*l^mQ$9yJqRSJ1shF#`G zpQ$P18g=^8xwB^CeKaLU4(&uLRKItKP7(}~NC zO^?H1o&yQs+r?qr6TgOIhHoNggLl)EU-88_#189}Jv~0mi!D_zWk=U)=a@V7?3-@m zcxn6A7|Hfg@-nV^JVeipk#^Wm9jB^SHg$iqvF-6qfDq>b=S1Op@IU5AC6E7w|Jz-7 zq5tPSdSt)cx$~%(Yt?%9W!xM0KLej{1*>{QxlbDWC6y+wtm^jz0bTAFr|4 z&;Rq-{{+YXEN>J18vf_ z@j+ko8RPfq0c#4Y( zegx0Ehw zdFdn86KV6O=7#Z(!u*oW1?%yyf~n(13=PnyYcF1Ztavn+>*p0=qdPec2(7k$1VKk@l4!v40-Irxv~vA_4;KkoZZ!2e6Y|C_-7^T7X8!T$-w zj6o8{BOVgtq~=O$>QeB3S!Ma3&*Pm1q%^EQ^zoF2Gr)z_2il}<J9*Je}-fC;im-Jpe@>r;}=y``<3Vatwjav*5s{RI6o4> zK0iDmGc+k}L=Zd|$Qb;YUtx%q4*A@l!LkDKl(FkPI%7oE)T^@65gVRV+H55pgWnWBxq>k}Q-lSugTEMY$ATl*4 z7vILo=lTQp%FVzvh;-Y(o40gjEKKUyRX*9r&;4Tn+n2J#I>@k3PQN^IVvDJ=VSLzq z(YmfJ@uPKhJ-0pHffR~Nn-b=n;M~|*y0xg1$NyaS^SGd0%a%`mzhlQK?f!_kZ0v-nX z0>AKpb^U;6-}Cvp-G?!`0q70z*(DxB@gAm&fs25y1{Wgj0(1g+jMWa{dwe*i^4uTK zdDa4W?q9gS68v8P{+|#2pN@Tc0*NuG{2WM4T~=BC=RD-~_}T#1sZAT!ANF|T201tn zFcW-Sby?w^h1J)Kk_UO9ksem?U3qC64mwa98%v;Lp*6xdQ z_f-dN819ef7vWUx=jDGqU$6Op!Mq60rH8}g#)fb&e-Ouxf%HM2`o{p}(}AcTXw@_C zmZgn#I?t4LbSgGu+l~HU`n2V=ZK>0-48-y5pa9;}KLs4T;n0Eodzj)IzLO`=dT)LkUtHhn8@xR|V9sj2)2^*@{wWixb;x1Cx?o1zrYTgxvFx zc^c^-fhSP+JK(WT!0{;m7I*~hk1#c0{Zqh;IF_$}6UL+`a0Ni#7mhz4`SuptB2V!7 zsq=tyfMx)X`#H8e@6Y|7T=y6LN0s_FD z1}8HIUU{WtS9bQnLzq`w!&Y?upFGTK0i2(80ImTz7kR#(^Sm>_`F}ak9k?3c{{`RY zOEAwmwo!(%)S)hI$Qqco<$pl<|8(+;?pN(sj{moAE!wnhbsoO`6T$m+!nv6lp$Vgg z1#xT`2z>sDKOG2sVN&KzT{`Ndo-$HqJL^?y$Pv}a*cxf z6|(W&;ME8B?c0rS)o%oMO>%tGra{@T1apCNV$<4Hc{?yiD#`!+e;e&85+hE)SPYf}s zx6FEh$ce0-dSz@oCu+0p+BR()R{k$T!2iH2z)Qdj(0Ly1PXhyx|0B{TfhU09qx^fM zze6f`3jKZ^cbksdHEmr&=ujCHt_#kd~q*3jBmh&@Vr=X%%IN#X`g-U zkHtr(?56(DBv09o{C=gwIt|?(D-&x|>xsPEX6t)p#Qw)vAAFjI_w!D~JA#*kgG+H= z-fHrf*G}4}5`&$J9i%bsA|w5`kA>(R zFMjRE9kYt%^ccA^v12Q~v`vZ6tK*i%PHf6;&pE)kz&XLW!8uX^|MUNjyu)+S0CA`n$9bVt$G0z!5GQe@S z_kSp=wm8TC`8fXHgX8}#;Qvk7|0j?bgUZi=S6{J*aO z$WP`a>o`|AZz;ohN&e=X=KSV7=X@vZ`EUOZP?kE>r48DmP1+Ve$f}=|PZz(^?~_X7 z^8e~pdCTU_iOimy6~^=5p>bah4dPfa;Q#bPzki^{XqErKuhLIH@H=g+CqDZqjk2SS zyvmEd$cwC!gN=b2+P2nJ`jC@4KXkQE?WbIx{=mt2AJ915ueK29s<#y8uU~`j*-koM zJoF)coPN-biWmOaF0raQw3)imjF~YxQ^xf0(J;u<7P*)+C9 zhqiRz>C=pXWzT7&oWx=BPTZ=jW0BaDT@$a8Q{!vJjyAjA&MO^eLo&LOK9_6Fi5$zKK2$#5sW;H)AY# z9+SuY!FK|M-7)_@C#g;_*MK)lc}C^OX=@CVz7sOK@JtgS1mt_+IRYT{Ol0NxR7Z zultQV2*;}|&;P|m8&~J$;o15KzIhwY8Iu;m^JPJBS76j9@B4|-CLQ(32fF+*_|K`+ zGD>dXhiRifW?9R{>bi1bS5l>;^h8(Nw|y|LVPa5aJB|U^MtzEq; zls0O-_;6F#w%BCbXe(w{){R+WkyPtwJ*f+i4`!DXY}#;e|GqtVZ_YZb2_~mu9mVmm zeaZM}pVA+D%-nw2dfvPpr^K&hoUxSgbhn{xL;5YcEaSPvAl?BGnvJ=@Il;NH{lv%r z{9hCPC%5q&ANej7&#t|Ud)UY08o&fxzn_S8KuF`&Nj~3yJ6=JIf|rpeUNU$Qsg0M= zFX9#S@h$ZAGxYhLS1<-w09}AK0J)#XJ>-4zdu8^0-2ZWWWxpmVs>=N+%k=~KpW6WE zV0>2%9=yTue=&~#H-rBZNQ^<{=fEqkl*;k{^_WlipH}DSIhTe1IX^4&lex>(=4W!W zKvodYAEwL~DB$awwwlcP>B;)1(?OX9e-Bl~|mdu?M z!L{sg_85N%&*laFpM4k@`O$m+ksrP5V3f+E?&J6TqX6B`GGquPFJ&#~=&N?IMP2IX zbdSfQ*cf^7v}@QKHrB^zdQHH|Ek_a4`9KVa_zj+cknaeuVQa|c|5aU0O@m4gRwoHcalUY!3g z0sj|*{}V`zLFMPbtFLYs{=WwEiRZG~0=&-0xy&^z=Wazm&SlDQeiEGjT>o;dO2|1d zDa*Mpk(d7sh@RB%bn|<{!70c8C0jKA&msR$2;(_mTZ$m=*q?$LGSytY`@`r;>!><3a8D`We&^EhW7z%}{Ye5`Bm4*R9Jr)|8n zyQyo-j^Az9K9674`tfve{eKdU|JU<80MA9>*~Dpq&j*h2+LAHz)~ho63{)uN*$$K! zTk-VlIwx=GP?y^t_b`Sy7w`?h2-k+}Lk0ZLImiD`@<0E7$vwQEtpmVgg=@iwpZa_g z@C;3G7S;l@eZKTL;K#ZD-AFsh_}C}*jeTTa*=P1$jRD7kW5TiF7;&sPX4U=UF$MXb z*H`JUBXIfP!JB3dAHHwjQ%`LL{}+M(6G)6f<>tU6j}&cx?X|L9Q>Gl|_5YqgSAgfT zxR&L4tcv*G=3mN@*U9yqpFB?B8lpMCdkF~US;scYP?kE>Jp*0|H}{l<{$q4I|?ih|KJ_e5o|-MWSHu@ z;V6&%@ZB`rKainq7+Gb5`Wjjuc8v}CaQ$h&$_IVMX`>zbcj8g@8KF;99lYi! zUQmGd=WU%oJvTKlmR3`@%l4Z|o!c%09F290NJ;&#~bcajYt{AA{IQ{b-l_OP-hIzO)^1 z$)G_6Q~dq|`=5QbbjKr)Yytl#kQjr?&4I@rE8hP0+dFqpn|9;?=2CZnbDGzd$k7$8 zWo-`T@jllIvR~l2u=YSFfY-*l8Zgf~woyj@Z>UQfm01IvZhkQ=mH&D9zqEKuQGVX? zJbe2vg7?0L@txQZo*fU4_~_lhu=n2b4}b4%g<(h?yldr6yU0mO?x!8mVZG!}lzL^Q zEGhMwx64u|skGy}0U^A{W--2JGZ)te#*$lY{~~AW+3gkOz5Z=kwoM#8d?MBW>kc10 zxS#h0;(YpiJcmD4pJ!$jSv#jc@ZOJmX8Rr1LaTMm9SdY2EIZ_G! z=l`Z~57+SIz0Lrxe`n6byX>Mq-xMI{e;n*1`^rA6YyTVrjs?eryj&aLSpB>BpZiIk zm*w#p{a*O&v$?NlXCFTF+G{&@J@!}$_`f)T#2B1#4m|Qm@%BIdaodhTgZAzXhYxJS zT)GVC0Px%rkI#9oDc)Qb4(53-%5dIuK9bWro^eL2D;u2MZ$RTlF9({Yyt}4ZlYxf` z=2^!!%23wmP?t7ni#CsU9-u{qMbvz_z^ZjoK=2^!!%2dHGR8H;}kN?-N zT%Lz_*hTQ(*D&7w6T-9PK^!XwhW`C6|Il~e)c8A6mYq72XZ^d(v)z(`9PV=)gLll1 zOZ)ueppu~+?HSo&QWhVoEHX@KmoPdaZ~JlV+47bS^l{uh7SFTI#4+tu_ARzguq}R+ zE!r{t5Zg?pPW7MmMNafB87oe_8+gKo)p@HAA3U)Cz}`K(S1gDu0>_SZ`oz8{|46-g z)pyH}GY-a=__5;@8xpg$se0o>^0vN-0q+UGx1YWYaV~I9aBiG{|K)#<$F)3P$KwJX zA8;Mt4foDJjc=d+3(o<96NdsrzJnNym@C2{v5eoqf9e34T2}MLu)`ALxfG8qGKn2BBiVYPI1dR0FtMuLi zcymcEEti_mA#?(UDxk!QqOLy$*Rs3L|9$72@7%d3H_1(i``7iJJnu7eX1+2rnKR!v zbLPxt`C1*%%VIxd-)29jpTK#13{b6P zi9VCAD>GY#1JaVm=A{hN=b#Sv6;kh*i4$9{-*)!s=KWu&E$@D*)*kp=t=e;5`BFbq ziMu{iD}a@_Uw`NewGrXE&8Lr!1`mYC0D0C6-g;3{wUe(c+CoKN`>ZNntg|XvJXVz| z(N}|UrZJB+q$Lj!1B9a&WVyRC+5ZnSGEN>joR0Z%>ZaApQ&ulogzwg-`Y=!S&Yv*K zGk?5=dE-ZV=Gpi2oHWS`ggVcrqdmiS_4qBJg?^k>zY1&JUQ6CcEm!1-4u;e-pSo-v zPM%A*lWx3MGgdjfp;rfnO}3fO@4al0IW`iZVL3!ei3tG^dTwhAvrb(@=c!Kb1WG?^iEfc4B)(zK05ntd7wH_2j~B-DNrB|_HYU?78vt8!f2FLFbZ*E zq>T{>LxK4d0r~+`*P#s>0Q3R44j|wE$-7OCk6aHh!FD9*PtleWY+sIT1lyYkb(!NI z{}&vm>339l{`ol_w{O4r^|EE(emiyQS6`1D`Nda5hko%TF=R*tkv6dU0QbmU2Ik;08e7cJ8KQuMXY!RGhI@A-~aWlK*6W}yDFG#F{PDI9I^0WsbG^z-!Slgv}SZ$d`1=XCBL;L+aByaZfs1 zmP4cSNG~8Ac}DV^gTyuQOV?pP;2P}1PtZOM^@=>!RqM9&OWm~|O=p)|WZQD3tXBCg zy;2`(BmB<5Dx3>&9Pa|YvLS--2WB;Ht&(=Fz^2y-@(Hc z(k>49onbJ_OAG=A0t0~lKtCIO5fZ&!Al*1%_5~bk`U=`Yd;rd$IG%9*l(v~`C2TVR z-;dHa;26g>e2%f=BXF!`JBu%1j(teh7t@$eTJlmZ_f^FJRV!DnUoS2$WBbO9-+aDl z)1`|WHe9^Ob6p~cw1M=2_3JNQtP2}t!}$ijn{XmM%^~3R|osm+$CGo zj-3b8uGB+np=XEcGJL&i)-y%Zkhay318OLEDFX^(0M;cez1sE{ZhonFbSM1g!AO*U zx~f=yxO$*=AJwJv7&T+Y0yTSfoa)(QvU;e&V0G&)V>JzF$x{@(whxeBiJ#&e%!#xsbI0yGkm$-zIrg;77{@XZ-B%#x*f%($Tkc_Lr)k=8Dkb8pfx&xY{9Z-~cxjRgFDP!irt zB*DJMlUJA5kY(K)VJ?IlB(KqNLW;6fibH_O< z?G2xia=>i>=Ke#leisirI2qtvdD!m=Ls3?OJ_~&SvH!IFwE4Y&w`{~BB;K^abn;CH zI?Y2{JPtera9<$jQI&xhfOGS|7~uFy-+(roa~-xPeFFLeT+`<|0mr?pe1I$LJdVqx z<#Aj&%S8( zL)_|%{ZINH`z`x+wKAnx8gC-APakcgX{(9qN%|l+wpsXzPA~|oD z+x~x&aW3No#(3;cPfcD9`yV&Yzhvqp-@I|7yt7Bc){P$OVd%t1;htcgjx&$<0;Zd3 zmJHaRc+9`?+p;US5csYzan9&r@tRM|6Mjp!l`e7+Ql`jt!cep#M|gv2=xbnYV;SDT z<9)=0M5}JXW6&D)aq6ba;HI_pWXcmdBOfxczkb!x1N#nN{Px>#fB63UOW0p`3~K|c z9UWS4h`REBAnhGge_M~FWhyuI8}gX1ee+*ojrS2{rKaL zFh!xSpMU;Yoj-qG4IY#PA0STilAp3D)0Ryg)J6S7klrzK_HAnp`+Z}Rb*f^Mm8x4G zZ}@u0Y*1C2Cuv^Fpe)D_OK()6y2;T++vENI81?7tCaC)Ld#dE*WQE~g{qoB%nJUb* z@4x?ErKP2*r&^Cvf4y;v=A{hE%0e%a^LC*C#ewR;vmDbu$@m}x=j5dC-jtlWarv?o z{I;zhd;fiyD|=^+9O9WdYKVtnwg8PoXVNn+fDHH&@i^bdw<~4+PW*P>4y?g1&sHw= zQ@55m*eQcflQM}ugig90ckbP^xSum_gm*FYI_w`p_;dhJvfi?D{-Z?W?Idqg^>H?3}I|^-J>j|c{+s4SV z=q)*#*2yzynPx-R4RQYO@!QXS_Juv0lT+C@*hjLk|9tLfYv_y9H|99OapOMx{@>&H z{l8DJ1`Zp@cmBU+TOX=ywEw2<=e(bD{+_@a$m;vozF#!98tVN0M>9+lR?%B`G{>M0d z1NODQTy@n=_mnNY81~!3-=CSS=fFSx^pm!QOO`BAty;BG*I$3V2IEYlP5k%2|E+z1 zE}at{e#)Ut%C>b-7j*{deYy9@R<939Qxp!{#zT7KGm93qmWl$Dn z=A^e^!BWkO7HOqQ6d!=~iaF}`+g?{ISFThSFJ8>CzVwIa13c7VsOF^%%A(8=dXbd3 zE0g^{C-#41D$cA=Sw4TZA7{h(Fi-Z*95L8K%+TQ=#0e`cI37rwVbTm|y2U3lW{nye z@0~qu)&A{U_u;JG1K5ubyBFZkO0K2XC{-Rgpx!Z*4Rvj$eaxe6jeoK~BW~_xQ-?w$s9{gs}1)LF}*8%XI z!fH!@pglw$%RbX?Po_z_w3l@+d<-q!Qdg5s_yaO5dbR=fM*5a7nC)j@*u80E>M`1X z^pR}rKmBgn7|tgyU{Sl8^?GMbq z!_}Jxy)|2|(lRJ(#FVY^(2=d)LWOEBjxPEF*6=4`9zRU=?K?z${PD-?KmYlU3P&&3 z0r)PU$}N+$49cR+5PFf6w=0zWKX&Lqdg`VPsp}KtQ+)Gh`4>(a=ffJYclxk_p6SB} z!fpbHGh~_$C2rpfjm{T7I}{#G1HPHCWte9!Kd@u#{`CEOk6=wa34Vc>I;c~Q^ zpvU<ID7h(5?N^)asRCEu1W>4CD_ZHRo4>*N_} zI8VsOKES@Pd(-+<_Kh6uKkZ8qfMZ5EpgK^mQl%*i@4GKql`T6LHgL@E4D?kj`+tRA z`|po?&iy9=yMV1g%CCq`kiGdA;2-#2asig{TMD)t zXx(atI(qb|w&|SXBR^Y^h8N$FckZ-Y%b*;}q-MHek z+qrqx+p))LRl3?LMOl;y9og!Qx~A^o;?c3HOv!n8Z}FN+NJ!9Y`{CA?J`eW;Jk(&g zmO)vR8A30T@^)pi{~x@carEH+bgapzu1k0)1-2OWe+<{ez0-#d@Js`y5AE-nHjHtE z8ceh9b)L{jK52*b*EG`+Y96Est;oULKMCvLhfl%o;k(22*iYaU`9dQh^+|cGGKqc( z1A0V;@K}18Z_zq+a%7^cEFWyC=(A{pbq43Les&$*a;2`)26meXzf~@j2XxpQnTX#F z+JZgyAK^Cx_+7xs#Cfy*0sVHpv@TnxBUkFqFt~jKZ6)=Ve7Uz|37@7%d2r^Fk9~lB zfqmi_`o$Bg8ofY2_NtrIv(GGJh;np%G7aT8JY8h30$yXtCm4Ilu6mP4(gJA?dTmc=I|F4YphkJE3Z<01}@06-nommX&ID7 znK|h#9M$MTiDE-g#wDtLy$<-UVTaz=n49|2-|5+7s+K`nlo>)VlJa)B?f=JO|2M8n zUFUrVzg08Czi{Gc->eaXy;BGG^Gq88doiS+XDWev4Y`*zgbt07=FpN)(g*jq;+khb zJkFbe53uJ5&Y3@ncg~x!?;ugrl3pPEwv1`^J#|`oS;l}|N0;y$q2_hVGx8msj%>3W zE*&PHBNH@;JME#&oTmdTJw zeIfM((`bIun&oC0jQ`GpjO5c!uB#ZTbjtLwuIA`E9UlHJXb;Ih_ zSG`-a=2}&=W`g?bUuR<-eZv0~tnd5yjo+_<@sP_slhc5OSO-}CHGW%Qt=+aaBjkGk zSp(oWot6DZmUGFt%}~a2Gn8>O5(aF_AE_sryDA+R%Obq zQZp|@?@s6~bJI#iS-twE{gjj5B2mqLE?ErU`IqvlC!c&y?ccv&mp?c4<+lN|XJfwv zWKb4mhR}$As?zK1iD)=t*tGs+EqU0zd;8J9XUl)CABmc^{Qm9N{(DQjQPg7G7L z@X56OXP>}XMd8?g&PDmm(>B!r8r^;O#t+5*-+edU0hXPquDtT?{~^$y83%B01K)3q z!g$90{>1Qn0QV$P?i66@FIQZ#k>k((0LMOl7r^%|Tz8@W#qm0)%N)yPd^bZGMoG!t4tYH~UPk?SGk4iI>WhT7ms+EAY+xLUr!kIlca$8+%CmzhlP%EyI$Pn6v%w z1^a*fDpjV;%FEXa8I;uvGVy?A>vt56YW{PHV&hQOMAfq8Giv+x?RxzpH}$3cXIoJQ zWl?4by*WMWS>|W9|7SDO59~|dv0+^*&dN{m&YJF@KW?NC>%rd11ABV{fZYkYXI>xA zq)cg&?#{FBCk--XT5-%r<1yb|i?imA(+9xs<)tood+drSgZsr#4x*PbFw899qP6m@ zvI>2$&Pm|a`Lw0F{K6ym7QN6}b+qy%Ets!2+QF`$-5$atp+!%*fpVK|$2it7&<-=! zaL)bZ=jXq`n#d`98@SftwaaViGRqTOZt8G&%=!hjCCUPMQU(e6zh@u7IY}w_MkAGd zxszy3cY?XyZ1 z*5;dD${GThIq5AN)dXi1jzSp|RIOUiDX-V7zxU5geR)1W=gt$g49cR+5PFf6x65t+ zKYE|`e{cGZ^=nescowJNyk0-f#qq%wdEXxJmgnsOy*!gN-m=49p11o;S|DVam2S}m z@sU0h59QiaM{pJQ+Q{)H3AuEhK_UTCxq@C0NB^jl@L%3zj5 z(sjr(+Vzo8WM`tYX@!oVB{x{7JB@87vV_-NcT1MEtrhAtUAEr*{p6&y-MbFscLP7i z?+2Y>yU;!dXxMH>J4@S2{iN)YE_K%TcKOI}=G*uD-+N|E^{;tnaSHnc`^HB(+kfs8 zrv1MKxDRMjv*wN;Yt>qV=OEF+%{MPrg$vKXH$2mR_qg)PN$_Ln18^OHet@h4&|c^7 zw+;mhPKW$N+W&?C*HJ%8*&0{W9g zzU==iS!}wuOvxm?%T7{{x0tE6Zr!TwVO$*dwq(ElFZ=&^Mo`C>d|C$OP$qaQ17!jB zWA=T5ai&$CIR4O~yYGb0kWYFki!v$O))7)~)HMwb7rS-<&iwPJiWNGk5hF&ZQ>RX; zMT-`NRbTG^;~7D9?jNdUP!?r|(2JzJU779wnT&V$?@iyn-k<7!CoaV^V~QW&!}+ET z?(3Zhn=r9otmkcDVn5g^+`ru)afVFO_YxkR0%%5B|SWijJMdB88_b?Qi2hFq)6 zc0E}iT@OpY)fRSHn9epMFX^OxsDtTjA3M#WG0LIytg_IDz!^m==>vWCQN|}YGw>AN z1+3SyNk=_ezAev5v(lv=mQJfYQb$XMQ8vnwHbBV#J6MPi_eq+e} zuVVih*WVqE8NF?BvnG4gpUSMeY`v60S(FL++3GEHP2I)U7U_a>iWaCF{yafF{d7CE zV#Nye>8GEn0Rwm@c=q+>89{UAELP>qP1iCgi!wv#MN-}_xBdSRV>|ZWrE{!b{m!Bk z%su@$zt0C-?48i}O%E~AKp-tPkk=1%up`98zJ%~e+@iH)1>z!W0(f*Ba;O)-L6D4j z?^%2s|0V5@XV%m;SkLwb9c4jKz68fQ>Lb2U7YgUymD{LkbIGE-dkxX z4{2RGg-&#u_wIIM9`*zzZd$!!2lfS?J9F&ldpJLM1J)MewGOi^S?FOILC7DAtq)i?EmcFHLkj9x?aP$@=D7OC|Hnw z0M`R#O(6gFJ6?I^EchAAIes(+Y5`RMp3lNFmt+h?RA03J922?T&vjhR_i6X(EAX3t zj`Q@@BIo}^&N|{c5>XMLZ7UDN0Of$oKmX^-3ip&LxgNILLd)i}aRxw=I&6K!z4wG2}i;!YXtc9naEIu07_k6f0# z(zpHG=~EwIKfrq{wMCi({S1?VqwzbV&_xc1HUB)(IkpUFNa7voIlyCv>Vxw%C2)JbJZ zZiF4)h394d@U-OcmvMAG*O&!!lotgBG z8*?D}v8MYm4^PRnUh+}~WkE++dZVsslzeTGu6q7{9nLGPdTU4R18^OH?*jOKpLLes zJm8r>JR^wb1lF(DU;Vl4QhV;-6>I;EveJv<Vuv_G8}Z z!y2@A9Bl2lUfn(8dIP;+`w$;*$DMTAW2B9DXu%^ik_KKaOWzwZNk?AhYfulcw56_&=VEHBw?Bxy6Qg=We%jecj*`%@ZT;(9IMnJE_Z*=(al#}Ih@@zWIXSIRQW6tkQTDoWxelO@0&f`7dTQFzC z+x^~*cj|7GRkw{Umn{QvM~6-i)Y&PUT~_LwIbw)!F?_()XnXbv_Kh&?KgR{yf4(2n z`~Paz-2P4N+R3o}Nm-(Nc`ttRdI9X|{ND|(zMAEo2YWmRm<7zlI)Jqn5ZKo+6>0g0 ztFN91ovS(j7yD1!OKwic;J1N1AAn~BB_$=RXWA@PJ^S^cPYB)0NC**IJa;K)&X9}yMXq3 zKLGax^1A?j8_4qkct%j)zC+b*)q3MMfoc1fDDqMUWo4lk$$7g%+5f|~{inUf@ACL@ z)~pZjxV>Xx55~UrhG%RqfT0l|XWx%|3w8!@@{uli0X~sq&}rG^HRx@b)XVfq{d+I- zdlqlT`STycU;3FLzERkMwTWeBSwxSPg|do%T`s%q;~1LtaP*=~Qcvm+SuU$QV|6|4 z`nqJXJfhcZ3$0UVCDeMPO^r5TdJv#X^Dyl0!FPGqG;SO}f|Q1+kmdX9N+ z`_KOg=SR%v|0M>%IDQjs{ySrEu3$=m0{h-8P+(64kv0g?2lgUu=K(zP2?YxDX@|a3 z9pJNV`T$&8qWyKR0q~yvkG?1Ug_!7~!@HC!zV1Tl5}UBLZQ+jU_(rb9JlNNH_}*<1 z&Ieem`t`;7_>+s&U3d5#I?|JuGAPTIN!iq4`W~6|zWDsA(Xl;_e^dNV}sMiIcUL+J@l3niavq0&uVW?RSM|AXHTJchLZ z?gvQ58bG{Bn|-{i))lM|Wqd2pF8trK53nz=PlRdzxyH=(WzG}y`9F8xz4qM)9@wVp z)L9R#%NA9uu2iKMOWu(7i`T<;@H^H@m{KOLITNjS~=NQN_nPW43GVX`w zSpiiF6nMI6fdbpM7bvg=WBVFlC9ph#NE?Lc11pf01Z)6y0dd38hv)`Ef3-Z+xE~-qAg~dPcuV zyzYXeBNQ45Nsss#&129xa+v?Roo~q{?HHXOpf~R)^zG^OW8RN*=sv=4<$RCdqy2dG z(nXuG2YwmLr*%<3<+^lhIY_taVaYdT2iMQkFLf3k+-o_(vYh(6%5Un^akG7b+QyV; z$L;c3<)mIImz6(%{OHxGDI4}5+O^||Z^7(jwvYZFIdlPfwnv~WrY@xG_6knJxy`=C zlg9bk7qtCH-(VlfV*bzP?`nX4F>Or+fNO>g?zkf{xo+K^u=~lj4?sU4Yut60U)^|P zBHjlq{f*-t*nj!}^i>w=HH$)p-0v^AUZ0h(0hMX$ygOfK|ZOllZM`t^;5VNxw(pvraoKYfq*fMzWrliyz8; zr}P10fNI5~XHF_zf;Kp3kd{0)FJ(}cx$c15pv&}s9lcz?A2;S;a@Q`WRMW<3SYOzS zeFZx)C*Q8YIMbL%8q(Tp{xOiAXT9L9SLm9?$wi`Ggl+GEx&27k`6<{RILiX!Ok*Bt zNJ}0d1_(zl$Z~gOW&bxPtw>$Ia9+xyx5xUY4(;c|J8SPK*awXs47+$nG3yKWBC8z+#h3hcZ}W17{|Q;$M#vk3}AW$ zkv7Pp56ndR9AGi98d&Q`UxFX0{mJVQ@*TX`Vz>S0J#8_4QCW*(f8>6Eo3FaE(mj~d z$CikW^Oh>^KVG`T=1TTiwj-z=;5eqT3(1M^z_dfh%=3Oq{)L` z);U*KCi@RNinC_Y@ts*JzA;Z(IB|?0XYcy({@6RRM`w?PE_R6f?pAzMcRP`v9WJ>J+r2)$3FNoUthTJ^#`X;oQt15ZM`n5!51Wl zGMJ}f*TcTodWBEuLWMdlP)A)Jk>R4(Ww!IQPRSQNPFn@!1=?B4iBPwbeJ}c5vhe;t zfj0W!uI)z>=gmr{58&_#Ekl8nOY)pD1@ulG($~j6z`npf!M>4!K9bG+U;KQ|H~CE& z{q@@A%JuADuik!Dx9&Fh04ce`9e1q5TEI%!yk);JB#BFwP5;8_qHr8*PwOZYk77)_33=@BE-9DFMd0CE#842$8Y6)d-lY!v&-hr z*ob{|R(Wk&T}I)P@;RZQ+ex$J>-uKNm$@yZeKNI)TZVZraS81*I5H$XWEf}{>SlXj zkL1?9TQ{X)9bhxQ;ajHvZ^9d@erB4)?f(^iBfz&{!WcjM0{aB}2Kz`h_MdZ3+8jQo zTyN(1a9>nZxhLw>+3|V3dOP3)Y|1t2)Jajd-nv#@cijruzJ%WhXooEy!17JJ@CUe7 zA?pI-6XfsOMd89LRnemS&Ec@@Kj%nX`@A0DJmxO^e&87ET|d`!Y5yaLv_ZIifNKCt zfpviM`xE65=bW5&*}V@BNzP^3V$yM(C@uU4XN8dL(wwrf&x7R!YyoxyRh8;S2yeFN6uupRT zhRJWnUj>azj+PrtGu-4y+>-km=f?4~M-5p;n|J=>kItWb_wZ?ax3~`L-|_CUSTgLg znewEJPCZ07%Z7MJ+CUwt$El~(UGtdr5_(CKdy#M4XDWxtXSv*TfqN+{ez$4kuH^Lx z;%80UfIWcTtm-Xo82bPE8hB z%yHv!PQfbtM%{rgKKXJ4M(kpTUG6QX7%MdogR_#?Z(qM=AI?kMfcO0P|4DmE*@V`* z&mv0`bZY@e|9n2f35*?F2FfK48Sp>UbSj7=05n~epSEz z4%-KyACNcD52#XQgZk5-{IG>9|G&cRhXniq@eA@dELwDpDpqV)xb~l8DCbXHqpbqm zSD?Ve@z#F-B^bxK1`t7{4RX^5;?ZZ;0|n{>cK{UtuFccur=8{)5Y9z=EFcfT^+OYq zE_4hp_cCRPd{Zaml5W!eUiD^KZnypa0Au?>+W(clRQv{C$~=ty_)Qxh-qU-Bz24C? ztjjB&p|1-%B2MsLLdlaf@aViisA;kjX+kI@&q;YFUywN#cXe5*}x%C9sP3jU{7U9ula>{Gcnq`!BfQ`*WYw`%4 z@JcA@R+zaRLY2)*qdlKBYUpZwFS$K#%J_Boeqfo@U+NHiZ|l_mV=IntDtzn%>9{}U%z-*b5|hI2nx1d%q#O&>@= zpV>(J{~*9UfE59*)rIbN7z~77EdsJATK!GmJeN4x=rVjCHiQ; zafZEb)sjV9-#hy5*|gm|kIoxEat+qE@be20%N9rN{P@QI$#g=2H z+q72MD95A;Ayc=lEt9%+9eHo0Fv)e(+Ltn}&BSMq~Yaj9W&BPTOe9Ly>tbld& zkt}}7x8cZS-2%EO6TdCwn>%KtpM8OSf_>wI_fBTyVE_3H%R2zR$EyVBa{y}AT)pGr zhxe<89@+)$%vaod?^dh{q+qY$de}$*e+|WPo`;EF+XpF8Vgt@c*pnOkUmEQ%_PWzWL|3e_YFrAkqf8=>tCWnN5H`A5rW-pYw3-KkXpxJ?9Ao$BM}MfBwJkK(l6l zWwQULEc?H4c|z*4Ik5j@hWl~$j}Lpxyn{Qv_|9)SDa$O9kdx(U98b2gtml6HFkw#`ST4(-2E+dYx1 zLqmq4E2wNXozx{rzphWPUZ)PaU2OS5vIF&!`ca={i>*ATy^Q+m_Jka>98Q~P`9@vH zXX|8nY13iHmnXo6&l^8#4c-MTbLv4ln_tRq>frx=4*I~d*)vkuC$#-XAIZV~^V#Nm zKzRpH4)NQ82X4J}fU>|sj5{ssdD8us4`{Ns*)ww z{8#Yb@Hj^sQwd!w|Ma#6}Y_~vupuAeP zEnn&&^$^`!rcpkj6J3E2a&4W$Lt4Byz;6Wg@GY4-al`D>_0mmpL6>4+aPx-J5-~_HdU?KW>uj=3VvIR^XGNHTa+!k8Fkoy8TNk)>_5N%=UFcF0V0UBL2mkh zAAM#!kSqId+J4UWIXB?g5c&Quf4_G`lZJm~w*MzGIL2eW81{c!$}HH5aj+X$H}(#C z?FHDD7d!)P40;uD!n_w6JC8I$d^WwLWeRP2N2V=L=%`QY6`e*tc|@PY@jk%2V8ZCN zd$yz;#(wxic$cx%4*WXNA^eUWmfMzr^Mrlu1MCaz69=^YKamlJ z{g-zD+!M^b!7)H}pkDRrlczOqd_*;Bv`;OFPL+JVnE>hpR4|QPw`@%VoQ}A>@8b*;_>Us%(z4_&NSv-1sd@1`&I5I%9rzh z7B5chv@`Ye?&BxExbWde-~ROFS3mr60mwl7*zwQ5*uL|0>cT|{ujRMif(1)9FI1?; z;;5)vhYJ_3f1ya>hCdUGGmUwq$%9_7hW+O| z06y>Be_j&c{_|Uad#||S%17(h-*~Wb<3rj9Xw+yg!rwM(*WMLY86SOgpZc}Yq{$)G zy!oliu>aFx|F>fNUJK9%h#=Aix#ECv zb(b?pOCFn-GAN5Oxz

?kl9;F%u`YT)*w?(arn6P+Q*pQmsAkxmva7yz-@frV@93 zrd9wealii17iuHIb(>Eg9St4`j{)+m7rgbNqG~5!TeO9WzV=yFyjW-azF({=Ridv3 z<4j{7X-G>RAO;9WFUWFtWoQ3AGpDA^7&+LF^YnZ}Uhn7~KwI4rU>E}Z&3w{@pw%=X zcqz}!%OuM!+msQcr@by4`TM^Th*Lh!vRSn*!Ltj$8MqVQ!!Oh26J7~LF7M4WcUz1`TO zus5tSHfge7{n}{O?67Ll;=RkT|1)6!xqi!WoIXGVkv7OpA4ox;*$aea|2YoG9=~FU za~vpNyx8kq%9fsS;kq(&Vf(`edB{r{wk*oz`vmHsF1bSLjUD2jF~xK8hyHOVRfh>_ z>gf>&)zc$04lPkM_KZZx`Rk>;18uYC?Szc+rzcr<uy*Vn z&=L0GWq_eOZl`G)$w!#!Uh}uhBx8Wcb%&v381kL6m}w%zOzYT=^Wu1%3+PLjJ9Bg5 zyqQ}V7yh8Sh2VF}7bMeY3rTl)19fz_L0E0)$T8a5ohCYi!hl|>oAp1l(peS_*nI2@ z^p5Y{a|M3mcsceGTL0f5S?zhAAngAjKl=jv#QyDD(%(OIJR^tsKl>n`Kld7doIz6q zc@NjF?OWHZ*%8>wgTK1X%&SeN-RGG_IrAR?O)#1^J*a*SG;e-HJ@Lfp%dr15VgLC% zZXCzy14IyMgWU81?)}>jgk}FZ2AF$+V~R(2?NYYXtP9tbo{!((vv7aSdFqvym#DdO zHmDst_N!gH4yuIfD0nFY zx?+H^^=jK+xcQ~x(Vg%+M8fJ+;p&0feN>muWAJ;&3)Jk{ajIvJ$?Bm7gVn9K zjMX%xB~MZC+CD&bdQqg@U!m>)=Ja)m9@ziMDKkb4@{f+~>cf6u=NPdxJ;v9eDxhX80R4T*JHnh8tSE*s$TY z~Qm6c6z*6ff9g~uK{r1BFjTBNI1t4y&2#>zz8C3kefcR4SnVSkfZ(Q^UprWKFPkxK3c6z zso59GmR^9l?gCY*!d%s%{Q|Xn_aSxR!UgrufBsYb>tFxUVEpT^zg9<%oPeE7P*o}~ z(mdp&49c=)O23yifJ}Nj#>PI-9)gH$9!KZhmHs>hNZw+Px<&YrXG6@4&UH z%5xjkO>L4@-R`N1GAJuty`ZaCv~Y_{#iBc_QYFW!KmTdGx~E1@HD^woI&tEJ`s%B% z)DJ)WpuxJHK7CpxCa%_gz+Z2ita->w8I+ZUUL@!3%F_NP(Ed+KnK68zAHOB*!=5>B zzn9v2`T`6?#hGWqq;d1fz0iwH;c@a`4Cw2JxX??!$>)v>jXT7=m}dee%pNs#4c=|9 z!MlxRB3ER%dE{Qo=MIJ6q!Su5&mDK`Gw)4V5;sG4T<%R7W*H>z&d2^g{#HWbi0+*e z**0eWDE#l)2iO&p$l=_%Zd=Q`-JFLmSotX#cstLdL-y?Eh@o|2-JL zxd(vz03(RBL2mlM4)mErK-l)5-}rIe|K^g#2Tdwlns$5<=D_n+x2|#O?Af#G#~*)$ zDGGi4{PWN1{Q2{0@Sr640CAd^{FFtRwruKf+kZ#zm^u5lHHZDavB^4BvB^r+t&cZ+ zy<;}0D$SELFJ(|xxO$@s)lH5r+8*!s$EZJFHvwyjJymjYvikPhZ`Ciq{F14{O#A-( z?^Rk_ntH1BDD~GHr)XZvpsXzPA~|mt3Q!!V4m`^_-C4}-_F;@)x6G5e6k|U2i1}#) z@U57)?~BiQEVT9X(Q(*gBec>i8piu*d(9AOFA1-N7OzDoX=WIZEpkKAI%$r4ksBQL zWmz<=@?b6;KeXGc36lr)Sq(p6ExwOS2-Gi7jy|?rDMNrp78=gbXtz9 z%mLW}{VcO3%hD$_0ePYGg-${#PjD!0(w1}nc$@>UjP1a<{@-X2+RBL603NDUYr$g7X@BCnc2>6a^3o4NE)o7boaYqN&j`g6 z+Q!rFhqm!8S{%Xq`uxKaPaIQEKm9)E|4o6KKo!8W|Ma{{L@cAWwL|rgn$40-`WT0 z(mB!LryRWl?4b zy-3R21;xSk|Ab-xr@fsredqu`*2{f(ckb=;!n3eNzzeW*L2>(@X+fYpw9_Qi`61|G zYeLgL3%hN|we{;XNw?Dix`X9g{E}veY?+jH2Mnk^VlXr&;LF9 z0Deorw*Q;b&!Ufnx&F^i$!C%FNY(-QJ)pb?;Jo!-pke*`z9iZ;+R3c!Xx`GfS6&d> zKD*^U^bmc8(Dpn#JKnP85fuuLKmM-DPdxeLarMkI=V<>M+wDhR>Ux0VEXTcU?f=6M zuZ!#0G2?v4j%R_>5k%S`mwn)U(0_a${j34N^ZzOVq0awdKjhj!ef|o?qkG1dE&UGc z_dDwDyXL8+q>XwWoXPlQk-&9;BS%iEx(~!_8I(hrlx^#vF6s=@J7Vg#_@*!JQe|r- zsp^k-)M~#q|IR{9rex|(gWj4gS7{lPHDb!v_?+|>DpYfEbkP^EhCd1O_+hGV-y!Pb zk3SAM@6V(Z30w!@yMQXUOwuwai!wv#MN-}_sBzi;F<)?gPLYz_U0*sk3j|(EhOh6I0kH_HE0x{b$D%AHe+nm+OHsKsBJ&HP@7B_RvGC zH_``a+49|doG+(A7I7#?nU6ho82kJWYX2iEJ0HrvGfnLK6HlaLZ=M@Rk(PgW>Zz0J z*=M!=Z-}rZZ5tf@7!s*mO(j`N!hjz>Jt0!=p8rh;NiO-Nl~S%u2PS;ottO99eb=+rK_z{ zltr02>5aOk?&0Fmv8qhTd3bN}no3AW&^A5X`tn@>_X9lCV7Qh+S(F(p^Y98`3PCA>H zaa*QN7n#Tx9&PV*nS|e#DQQw(t;Z-AWoUVpKFY^jI(}&9jtK)^ePJ2P#c~LZ*2gp( zy>xznSL&?krOcGixQ10X%CX9B)jLox>)z67my`UUx5^^AnP%`x8MQ8!hj|vH{8rgn z4$82~q}vU2W+>&-G?0rmhj{uA^oynq>F=j6h~E)PrEhrl#IcNA%>Sih(g)ysX}$;G zv&nbW{LPT^0M7=#KRUYN-^uv%rSoS|OjWuU)(&RACAv~0$ zPOV=oqSz3Wafzy5uLHho*rE3|=BC2*cY5}is%20XWrom;q`X~O+W+{asf%g<2lw;i zj2L_;*UoF%vNpC&gH35~gEp?cE4_np&wLG}nRHpDQ?5fVaWizwmV0*yo~-nRDBoMq z%XJRyql?d8zq>4~mphI3Ot;IV!#19`oH_^Sb(+xWa=Ggv_W>R)JA|x2Imjb?MkwX9 z%M&Q0&>OViAJMIok9~lBVGa7kW!it*B|e+9QQQl_bAdQ+Q~8Tm+Fe$W0&MyCZG? zA4I?6`hP_r)bIcCS!bW*GhVH1DetASrSSe9m^CX-ee%gCxwilOHelDTLt2I<%gcT7 zd$4+wY(5%y$oH!I$dqx(iJ4v zF2B1B_&(A%h4vqPfqi1{mQCsGBYBwrvx9OCfVPS2(tJeht5(PL+&ORS=kH?Oo#6NKX_?mGn>SC#*~8p(NPC`n-X1E=wCiSE?0zUaPn(@T zIEj6Kr{GJxd%jVl<+IREcLCi0%=Y7YN@0L)%Xa1^>;JU>+#kq&g7-CSn7q)k|D4Bh z4IqL@8|0=Be26~t8R!4?fja;`yIg-N2JpG&GtMi>4wosFc&SXO71+35AFYi6#RCqe|T5g|F*FIuv_gc z#M&Y6W09`Wj`k)%qiJDRNUP~-W5{RFkk7d{@?#+@AeS;NUQ3VYund3(@@@W6rN8LUE&+d?Q zfbxj*nc|+nhwi?6)aYi-b{%is`a~Xm0I~mvVc!o0+4x5vJ%aQ6=of@%_l3^1`4Z30 z_R}BW`}+Jqn>MFl|Brv$uwnf4>#wi(2->JBP!8bxRj&PW?B$qi+JE{4Y~LGz%D_Dh z8*YaE{{&+==W+A_B8ap>Zu$W2|9RT~2Y~883?O~beE-D0=&b*jF1hr0nNqOBK(Ai2 zReE}QuI(Y$|L4rvq-9VJWkN^x>;FU2KC4t=ZNBNHtRaw@litEnO>kD>D3mcl)vEQJ z@_N1cd;d`1{bl77@O*&IohND;ltq~#^dc#5S4jK6IVIiiS)3X-X+jFVkF)ImOKrWe z?Vf^-Gtd^c26(IOQ`)X;`$wCi0Xn4XIO)iz=?#8KBfZdwe0?vnB(!B{K3leJr>N^K zS9)-H>@sNic3gO*%%amSC+EUe9i+@wUClPI>K-VIrq}#NnRWdv8eK-Iqm);-6Y`xf zz-!eBdQBdQ>+%X;fX6DItBz7v>M-@_xXml|mhvKR`0KCv*azY!jZa~p*o(e#nf9L@ z)$IewIsn%YV*ozSHGq0I-P96i1g%`xx^?<@w4t=8VsCQ}kHT+A2aW)i55THFTC)HYS%6U>*?H(T)4E%ySVO2 z`_6Gz#$K`i9Diy5`CS0l2)I^o*CUT?na}mxjvYCU(+7wk(gwNd1Kd0EIqko^f1(ds z25_Il$8`YqOZoYty{Nhd&qD5!o7G#P{)^iS_b7%CS}_? zsEay-^iCXq=+NDF!e_`Qy_7|nIq8kMrorK2*ABp$e;!q_LMJt1#0Yij)Tyx7Jm@Fz zjG#LA57ja#i!wv#MN;0b(DpwW_CF5xe|*a1fqneLUVqhxZ^OK_8*kEH*f8Ug7TdP9 z&VLi3m2Zd7NqS}(0Xf2B(FA1hK9ENp;-n=eg9T`6Oe-a{_6ohuoCYAmgBqs1i*_k3FCox5cg;_Z|+rf>yAEKsZz^Cl&L=u z3v>fs1zrH21KI$sfhT~L0KeBI9?Juof~PUSeg5?Uwgvb5bB&||K%36Bea`)(0Iv6Q z?30W3pXpqemA#hL8#dfJlk2zE9zgm45k%S`H+|rf^Dn;mSqAzP*XeEn_-={)koMQy zf5N`V{>Quu#jYI~Tc#xD;lQ1L^Qd|AmTLRP@8QGQ2gq;YckfP9HSb-nWl#=fQnsyw zx~MZq@0iis7B_3MNBybHy35u}8I(ntIq5BQP2I)U7U_a>iWaCF{yYI|ckR@Q6)V(d zpM4hAJ^-E(G-u9YRleMGErYTsGlX6wn7y~q}Nxp#*;KZJbBBCXbA z$dfcP%r5Ta**Zd&+o-dY*G;F>jdBPb<(qK$41G=+q&_x}Lo4@&e36++k3l1O5}JDK z_T&GaePGGdw>Pa#@a$pVU>~`R^?$RYnmz#Mt{gvTt2me7m{Jj-t>aoiUH)!h?b_3) zJ@(l4BhNhZ-Y3&67gZG8(s>~sUf>j7LFtpn5sXt(o% zTHxat%lgw7Vq0(y&-oVT{bKt$$LF|9d(SqNi}!pdK>vVkO24XVjT$q$aQSv@=_utPiU`47mTOv<)(P#1Lu>Fw01fAg+g(pBY(Tmx9IE=MnA zP!?t8q_<$fGR=!dwZ|C+6EJ^Yp(>Q`qPlnQt~PGmsC@u_`xxq70MqCb@tnYWY7Er8 zltEdP8A30T@^-oHf5w^jJ~@=S<3!3z-~NPoGq=qhJ7UAz{ohI&)w9bAoDJv8JzmWN zPbfWZIqv&VJb6jWt=!zwvrOd43tw*QlNTMqJa6}VD{1by5gXVS*eBRG*hlio{I;l*_jj+QTF|S>%+O?gdeE>NNpYQi+7r7olFwS`}^SgCTP!(hR znwR{PMVYp2>Yy&_%%peRm;=d=HQkSScuJo2l9w_l3p&Em8+A>id$4D+H?P|So?33m0lDlZCsf>|HRE}uHD%-!M?U}e zo|#j&urIJruy3%BFz4TL z;gLr?hwi<1gy+T^8}x#XXMiVwX4D7J|ELLY9iC;m6{rkU1Y!V=hqTlD-j4H<%K_Iw zIJcr7#PO4DK|9W|mNuR3#P$kh`;n~Mlw%@&1oCj4X4$ITa!YKhcI`eqX88cz3rIg8 zf=C-=)d$!|xM$@2`9~k!IU9Y5eV=`v&nEjMpI7li`8@Mt$o|KES_0s+P_0ynH5W>k zOvawJWEE2`NwsJ`SHBD3et`7!bp2fbzYXO106ZfoDJfY!(`KnE58E$%ltEdxOv(HLDJC+~?en?*bN08kdrLjL!p4Ui6ShbV(SFoKUo((!!CITN>)g zN>^6t;p(_teoGJk_v{1g3kP>@KYr%e(G2zx+y1vfzhU2@oxa?QV+BD!fX^|<651`! zaXG%w{?Q)B0Q3Vm$EFSD+?&tE!_m<(Puy`wum1Jx&tKTM@!I4TEq1)ys@1^{u}1Js zn>HtYeCC;x{~_A6Ir?Mk)(8LZ@yB<4)U4UYqYWD-Y_3yh($Z?xIu9>e^e=58i}U-Y zz$3te0N3z2zvtYZa~|6J@&Ii-?K9u4)3%ldxNbqP%$Ey}YiwKEZngvWSFuevuCaaC zPFdN0Wa;)~K502Vvpn=AVt}gA(N*tn+<4c5XP-TDm~%R7PXPA?L=b6%;6Bj4ea0E= zz1@26y|Z6O-=Xd2{Fl!oeNy&M_DlB1P-{@^f9$)YjfpNgyi2L#>n@Zou?cJ27VfBy zZ{%9cgMFQc@7)&Re1OHOU*AQl)su_VU3d5#I?|JuGAPTIN!ipv-EuJ=r1!<=SB;MC zas0d5HTS6N|FlKR3`Z|%$wOYsfZP~>bqPyv;X+T1E*#YsKENP+!xxA0Cqe%d>Y;g1aPiP9kgGxvz&8qo?QvJ72tS8U*JA~wwnGx z1Az1OM}Z~)?K#m5c+3Xxnb!y)?SlZ<73fpY-roUK11baM0nT4&KUoIac-m%`t0=%S zifyKS&M&b31jjOhZNj!O?LONq)Wvktaa?A3I9{>btOMJR^|~Ek+tmc>0CfSj1KTfx zKW-ba57Yaj5p^#1LH0lPVfqR5R+xF*4ujK=D zxKy-AcUAn_srYWe0~@~@SP%VJ3jr8s8uLg)+QLyC#P;W;SL&Us5aV}IpaSrS*nf`i z^Z_{6J9=>6X}-;`y>v*I&p%y=mJobt(&9S!pYq2z~~ zmYt4JWe|D^!_|{JI{xpu=Fh&sKEb|W*#AfDzC-($pBJB9q9DLA#q9@hUQGX+c8oST z2B0r+3qX5Ke}H2Z?OF|hV;Ak48%(F2zY8EeZ6U`u%HbGC8_98w^Lx(ish9Si;~nj( z*kg`81k0MAVEx^YwviAdSzhioq<_Nl(~n}E*mmWCn*rAQHh^m!cSaCt1M~rTCiqP8 zncy?VXM+AWpFi4OJ_}-h*;m=;+!xdNe6at~XQmGj15_&>J#$j&612fNgS6zac`1Xk zD3h|O!+nL+%k}$lV-6;F?Q%*rZJdVng}vBUuoH9g?HY_Tjd`RYt-aVQ_v`~^pJ3cx|G&@fJA4Lzjf-Om!ROfY1E`O4S&l!nWgLrW z&p0k|O`c;^1%Ni3wvF>#j$bC2#yrxHmOSL849cQR%BBwLqE3!;^hH<}mPyKo=x_Ei z+mHT=v>nGz`ZVr#D~~j3JGKqS{0RP7Z6MDC`$7!BXM=t)-*s{AOP&kU_M6WHNP;fu zgM4<_|M*Pt`J(@M^Hook-crT=$4i&ke2HM3Y0M)HX>A_yJt&JZc=2NxH*=F!7Z z*R;G4Rp{xTH4tYS^GK5iy+M@^=LX~VH9#rg=1P^eujIHML8J|G>I3X6>@#-XpwSFgLOmBq4tdG* z%jbywkIxsMHR_-rK%cWRa4Wz$KEXKCm`57Yl83yML0MVZeq`zEkEU1Z9af0(`znC% z0ImZ#o^wvebzQ#O<^HZ`BZ#zt-51y=*f-cm*jLzR*mw9G{x>eMW%5jmFCaFJYw{eI zI4|KC!L@FVR|My~CM2CSq$Lk|DT8ARWrni()ct$Aq}@1Hy4y_Ji(|UG&7_SYVW1!V zk=laKMyTf_l-&>Kxsd0U&lP3xS!2KBb4mX~d{6N=#Wxq@w9tL)f2Cc_XGHvA zSqC$pk=#5S?1$u~Jc4aSyG|dRpq(e=UVL()7rh|K)%8cy8&>0R{06uVz;^-M55RGq z-vtzpAkqd#A7Gzg-(VkMUtyo&Gxb}!#J)+$aUvWDy@bD&`uv*Zkh(Gq)kYlSBlzRC zL8v}q_8G=6_cG;)K6js!bdxrs_i|gn=Km%?{)_okmOp@)qS#^faiQz5rdB1lwSD9H z*Sfx0z3a-kQTa-nL{k42{S%Rr z7?fQ!wrMC^3-Sq#!u4JE%V?5c`TC4=@E*U*IdkTm^SS)&;LLF?91GXNxo|HUl;*TE_;?&4_9HfR=6ltj%ZC%;S~wT( zMT2F;QsOm2@+gVj5+_vtFAN95wQw%niw33hJXMbi!~dD%T-75yyq~E<>CdVjsvf0d zLB0RuSWxZbkDP>aoTz%JdW3WQMf$N-`%vv8(#L2x&rh`v)jq;G{v!R@s(q;T5$R(z zoad+7hiV_;9Dk91Y}Gzg`-t>08qV`m?L)PXaE`x7KelQgs(nQI7!Bw7srI4TM>xk{ zq#s+g57j;*eT;_l{8al;?IWDyFVc^#+J|Z%kv>Mld48&WsP+-g@fYdGR_#Nzk4PV* z;XFUpK2-ZC&+&JI!Dt#|vD#k^#KrH4iH+N1G+STM8%$%k_p3aQd%iyVlCTe*-Y}dx z%rzLzYYb)!$UR)XX!!iGd~AThYy*F{N@p<4CGL)3Z7xbZ3`WBP8m;cp=s?^yjo$c! zMx*~pqcg+njY0j~M!0*}aHLnP1UEJ5)u%hIs9y&@Ukr2x8#H>$L5)WHLsU#mk$eVq z934UWTr_&P+@2@hKJNl@x4`Lk95>k<9Q#@%BqpL=`wn>Osi&}f`Erz$9K|n3OHehZ z7ED$r=6(1M)^8}ln{T~>kt2s9@5<(gOH6{^WP#1$g3W3Dg%>$mU^JWGiU3_ARu7#{ zH%Oz^K5n+!=UHsd{Z@zbnA_(;Af^sH-Yle~r{U!(Q?UK(Z8%E)Pu`C4?pN&H`vWRx zSBKT^#{a$bGS;kJh}CNr;EVN(uy)--%$xr<#yof*Vgf-Vr?x^Ur7>JyFZFZmx4XRi zsnZ;tUjI1HLH6gLuh?)dpA%7fXtmlwzUY8l+h&o@Xxh$u+JIi+Dmu0TDu*Vbe�l zUF}e>UQHZ3F8m*(9zWsdpZ~4k`0<~Ar^lObPr=GnAERK&90g03en4$L!DpX;i1>Iv z>Nl8#zP%5l?iCNg6Xk|4CI%X<0UDhFMzgJ$K5bD&Xwo7p5uu00Y8{lEmO)?cLEr28W9H1av3>h?j{W0`8=5wKD)c%(YNvfj z`zWLyE&pdd=703gX+8S({RvH*O<^9U$CRnh@Yt)d?u$j3|ItiLcycT{cj*YH*N3|vBLl28}P$)J1SC2OeUw`wBq5)8%jC=XvrO7WsufH&QJpcRzCDw=?EnhJo zg&UV*(W3XkxeQ|ClS+(6V|n_mh|qbV|B<$dF@m@FF$|vS9;K2 zT~_w-=Xy*JyB?RDzf$!G|MiwEr{cN94^E$MdbBk zjD75%=-f3QwQARA@5;~D8sUldE3mtxkd{#q&093bEw^5erzbv!59Ymzg`dtse1i0& zo(;I0VKyFqr!Le_LJK6|~!vZaJkTnTem8+p*rEGYk z&>!;N7gWCV6nTnW~V0nK`(M@+>V|- zcT=m~aC>Xufd}qW;!5d%jhp7eYj20#irW#2>korX1CQU1w8Vi3M)lJ>)iV+B_CWoNFHt9LsiH%r(9`Ud6vJh2#LsPnZQH-VrY$S6 zYtKe3_+%EJYmTOQxwMNK=+dPSy?gINlcv)U2nMi_{n?eP7GlaPlW^yd!D!R24bn0* zsZjt?(OiFW3G2b{R+87E71vRf_RUXI&HU;xa&jsoyUI}7#`oyjb<-d85Py}C6+(r; zAk<4=OFfpMUd9*HW+Q5*&WF($z_1a6v18|Ye6wRcbKYgNw;cLH4daFdNy+u7$415e zavMDde;|NQ7tdB~NZzyO+l|V5i;CBv|Mk}~7KuN*bnQd*=-j2-Zz7a=bolUL)TDjn za*CluZUVKWlmfZ z1_N`YgobcMnK)0WN1eBzPoMpqgS^fd5r-wq=An4oY7}nzoa-4rSL|xv{;!xT+|E2t zSs#4K`YX}n>T5ccQQ^0TJ9qA4PMgg9wIkQutVf@|Kfvp&h2bOaI{l*6t5;DY7cvtb zE2GB}TtOQN1#d=7oSW+t7USFRiqNuEo)Vj+4_`U-3>-cU^Wz5S)~yJgI<2Nwqq+7m z8n3_kGPZy71vYM8aT>cAb8a7WGxacE^7e5yJx-iBj(-0bz`WMXm}_CamB?6fCmhZU zJTPX|X+0J#`V>y)ua%Nsq#kQd*~bz^8@IDQ=Yb9I{SRNEQ= zu_^Net-*vIJ^Sohw{G295oOl<{|~Fhi|o+!)Ams}?K9L&`+#fL{1|=zFbul$MkQWU zOd3PG`4aN`Iz&=@PsGMHL@2%=qGK|c9~;1ZBb=LmfNfu|RrL^pPu=FuoyYoxfpf5` zO5AAPVmj*;xv;y9eBShHN_xi6v**mg#Al!8TG9ZjC%;cUR-K9+Yf&Zi0_!CnG;Y=i zHjfS|3AdnL<_7+L=_wm3Kwa9?6&ah65`Qb_D_;7pJdS}x>M@7;*lJaeQZaZx@n6p< zzCJy(1G?w$V*c|T^7D((py7DhOEu_B8rDY)h)+sDv_FMwNf|TJ*OTkT%6&%S-SGM? zoXhKx9Cza>U$(4_7Av_P_;Vx#Tf^qopmCFbp;fC7XfHvmShavYZZnFCS7U3D=&}+! zcYle2gKxSl{FT%KOK&GmoZ$NOy|}htKgGw?sC5T=aUR&EYa!$A7V7dnV>`!r-4PuB zvE*CJ7!X7#p%-eUeoQUCRP;y;wu3WDL!XpS8xXq?EeaGUafVvN$2Eg1+Cq)TGFSMX z_m9ID<-^#2KEOQ*Gr6DSV-$V0hOwlO`%3m;=&->YBT_TCbn{)t*pkN0uEh8W6L8~A zH?fA%3YDwmASx!nc;R4eWIXN~@gw&+ZAPcgg(r2%-%5?XL)*3skWsNCV+{A!aE!+U z(ipEFLGAQ~w3!g%Vw=+^tz^7d{yQydr!Axw&0%qBSWofueGTaIl3=#FVRyP%UvaZu z5`$23Dr(o`{Dd{FQTLBP`ws17{!#k3m&+sP4g37uY_=Tpl6#%OsI2QZSZu7vx;ge^ z7{i@t-DWC=-FtxZ!BRaoD)B_@CBOSOjP1M8q{&N2s8F4?M%D(Yi`$a`r_YS6B*~>V z(_YrmU#(MYr)Jtm^hr6i3j^!F*=XCYJ^nG^T8tcZ5AGW|QW+247{9Xr(82ZH7S@K1 zRtL03D;#bw_lNjbUdr|n?f36Cnyh=dUu>_@V%y7pMTykPz1$b$iHhPLkXaZyd@p0i zMs)66szup*);jteMD4mGxnIzSW_jZ{|L)8DHG%o7A92BkNM`<2iFt0dro3M zKi|jRM=k~q8jRZp4o3THI?`V?Mk;$HF6!WA|HR8N;qgV$ZXC+Faj))Py~*~;rL4!9 z-_2yUKFo2rNVxSx`O&k_A`BV+9cvn2GH#UB;pAhfY31j$j+oLENvZYGx8J{6A7qT_ zybjfB^rk;zZIWn@3axRjToXauqAh+~y z-XO9nUCDUxAX>L=!S`3fH62$f^(oP^TYfQp*-qvCQY&tK)g08RcR!L+a%nFf))%9| zy^O0=J$^qP#XbUxeZ-?@@0HB2_Obu5n{i?{I&@gV9Q0lU6RI-bF~edrav!;4e_Sx` zy{t;v?~%*dCNulFw2fMIhbnyy$;E#2b@F(VVlO>)HEwNr@>sop!gX z#~<_<5=^YH-|6;|yU%dz?K{~&nu@F{J>UyeU|i9&SFS&#Guf9j_Ksw{xvMOPet+Oa zv(0wcAD_%QLji4STNyomi$PtxZ9=`Q#b{WikhS&~sIMJ5qecD({DtsMXFEnj`YYjs zV|<2_`F>i)RZ4xt=`~XWxh{#9{R_i9tycfQpYg`)n5;6}xyP->K+avhr5sk^sq`3|~w--)jIh3M3g>mGQm zhbB3NTr1I!wxMI+&$KK8zUP^Gh!%2QGl+47_=fUa&t2}?>h*?a&CJ0|L3L@w=A$`TWH(glpkkxEBpX3&}6uAjT8-5ORHp8;Ee9 z>)$>8jRuo_hs|kXed8z3HO3W7Pv~s>K$+?`na4cL4=fb^c zAX=;;W)c&LQN&P)oO9o9cep;W+6_w2H?vY3&S5Ov zAL9JcbGq$E z?QYvq*3kFq4Ti@f;JXN?!mV&DTnp#Iy=Wk{;Hp_69M75c^Sa{x}d$gLsm%?dj9wl50=fb^m`%zo^NWH%R4A?Yw%?`6ylc1^f-yUty zbvF$hQgz^fA)#7TYgGNyw}<4jwWt1-J&wNPizk2V+_B4*U0Zi*-JyMUev8&^udJ&1 E4?lBWX#fBK literal 0 HcmV?d00001 diff --git a/rts/Rml/assets/rml.rcss b/rts/Rml/assets/rml.rcss new file mode 100644 index 0000000000..0905b24b07 --- /dev/null +++ b/rts/Rml/assets/rml.rcss @@ -0,0 +1,61 @@ +/* +* Default styles for all the basic elements. +*/ + +div +{ + display: block; +} + +p +{ + display: block; +} + +h1 +{ + display: block; +} + +em +{ + font-style: italic; +} + +strong +{ + font-weight: bold; +} + +select +{ + text-align: left; +} + +tabset tabs +{ + display: block; +} + +table { + box-sizing: border-box; + display: table; +} +tr { + box-sizing: border-box; + display: table-row; +} +td { + box-sizing: border-box; + display: table-cell; +} +col { + box-sizing: border-box; + display: table-column; +} +colgroup { + display: table-column-group; +} +thead, tbody, tfoot { + display: table-row-group; +} diff --git a/rts/Rml/assets/test.rml b/rts/Rml/assets/test.rml new file mode 100644 index 0000000000..06ca506cb0 --- /dev/null +++ b/rts/Rml/assets/test.rml @@ -0,0 +1,27 @@ + + + Demo + + + +

hello bar

+ + diff --git a/rts/Rml/assets/window.rml b/rts/Rml/assets/window.rml new file mode 100644 index 0000000000..e368b36f5c --- /dev/null +++ b/rts/Rml/assets/window.rml @@ -0,0 +1,19 @@ + diff --git a/rts/System/SpringApp.cpp b/rts/System/SpringApp.cpp index ecf1035bbf..ee0c48dfad 100644 --- a/rts/System/SpringApp.cpp +++ b/rts/System/SpringApp.cpp @@ -8,6 +8,9 @@ // Include before other headers that define a bunch of macros that break stuff. #include +#include +#include +Rml::Context* context; #include #include @@ -105,8 +108,6 @@ #include "Game/SyncedGameCommands.h" #include "lib/luasocket/src/restrictions.h" - - CONFIG(unsigned, SetCoreAffinity).defaultValue(0).safemodeValue(1).description("Defines a bitmask indicating which CPU cores the main-thread should use."); CONFIG(unsigned, TextureMemPoolSize).defaultValue(512).minimumValue(0).description("Set to 0 to disable, otherwise specify a predefined memory to serve Bitmap allocation requests"); CONFIG(bool, UseLuaMemPools).defaultValue(true).description("Whether Lua VM memory allocations are made from pools."); @@ -223,7 +224,7 @@ SpringApp::~SpringApp() class DummyRmlUiSpringSystemInterface : public Rml::SystemInterface { public: double GetElapsedTime() override { - return 0.0; + return spring_gettime().toMilliSecsf(); } private: @@ -257,7 +258,7 @@ bool SpringApp::Init() Watchdog::RegisterThread(WDT_MAIN, true); // A dummy call to basic RmlUi function to verify that all is linking correctly. - Rml::SetSystemInterface(&dummyRmlUiSpringSystemInterface); + // Rml::SetSystemInterface(&dummyRmlUiSpringSystemInterface); // Create Window if (!InitWindow(("Spring " + SpringVersion::GetSync()).c_str())) { @@ -298,6 +299,7 @@ bool SpringApp::Init() // GUIs #ifndef HEADLESS agui::gui = new agui::Gui(); + #endif keyCodes.Reset(); scanCodes.Reset(); @@ -309,6 +311,20 @@ bool SpringApp::Init() // Lua socket restrictions CLuaSocketRestrictions::InitStatic(); LuaVFSDownload::Init(); + Backend::Initialize(globalRendering->GetWindow(), globalRendering->GetContext()); + Rml::SetSystemInterface(Backend::GetSystemInterface()); + Rml::SetRenderInterface(Backend::GetRenderInterface()); + Rml::Initialise(); + context = Rml::CreateContext("default", Rml::Vector2i(1500, 1500)); + Rml::LoadFontFace("/home/mike/.local/share/BeyondAllReason/fonts/FreeSansBold.otf",true); + Rml::Debugger::Initialise(context); + Rml::ElementDocument* document = context->LoadDocument("/home/mike/software/spring/rts/Rml/assets/demo.rml"); + if (document) + document->Show(); + else exit(1); + + + // Create CGameSetup and CPreGame objects Startup(); @@ -869,6 +885,9 @@ bool SpringApp::Update() swap = (retc && activeController != nullptr && activeController->Draw()); #endif +Backend::BeginFrame(); +context->Render(); +Backend::PresentFrame(); // always swap by default, not doing so can upset some drivers globalRendering->SwapBuffers(swap, false); return retc; @@ -894,6 +913,7 @@ int SpringApp::Run() spring::exitCode = spring::EXIT_CODE_NOINIT; while (!gu->globalQuit) { + context->Update(); Watchdog::ClearTimer(WDT_MAIN); input.PushEvents(); diff --git a/rts/builds/legacy/CMakeLists.txt b/rts/builds/legacy/CMakeLists.txt index edf8c68767..c4c93a772d 100644 --- a/rts/builds/legacy/CMakeLists.txt +++ b/rts/builds/legacy/CMakeLists.txt @@ -15,6 +15,8 @@ set(engineLibraries ${SDL2_LIBRARY}) if("${SDL2_VERSION_STRING}" VERSION_LESS "2") message(FATAL_ERROR "Found SDL v${SDL2_VERSION_STRING} while 2 is required!") endif() +find_package(SDL2_image REQUIRED) +set(APPEND engineLibraries "SDL2_image::SDL2_image") set(OpenGL_GL_PREFERENCE LEGACY) find_package_static(OpenGL REQUIRED) @@ -66,6 +68,7 @@ list(APPEND engineLibraries ${SPRING_SIM_LIBRARIES}) list(APPEND engineLibraries engineSim) list(APPEND engineLibraries pr-downloader) list(APPEND engineLibraries RmlCore) +list(APPEND engineLibraries RmlDebugger) ### Assemble external incude dirs list(APPEND engineIncludes ${OPENAL_INCLUDE_DIR}) @@ -77,7 +80,7 @@ include_directories(${engineIncludes}) ### Build the executable add_executable(engine-legacy ${EXE_FLAGS} ${engineSources} ${ENGINE_ICON} ${engineHeaders}) -target_link_libraries(engine-legacy ${engineLibraries}) +target_link_libraries(engine-legacy ${engineLibraries} SDL2_image::SDL2_image) ### Install the executable From 13010e2e5bb6015ea7f2177d95b37c6bf6f64027 Mon Sep 17 00:00:00 2001 From: loveridge Date: Sat, 30 Sep 2023 16:23:25 -0700 Subject: [PATCH 03/58] remove sdl2_image --- CMakeLists.txt | 1 - rts/Rml/Backends/RmlUi_Backend.h | 11 +- rts/Rml/Backends/RmlUi_Backend_SDL_GL3.cpp | 224 ++++++++++++--------- rts/System/SpringApp.cpp | 40 +--- rts/builds/legacy/CMakeLists.txt | 4 +- 5 files changed, 141 insertions(+), 139 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 348494475e..29bc436c02 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -278,7 +278,6 @@ endif (USE_ASAN) # Note the missing REQUIRED, as headless & dedi may not depend on those. # So req. checks are done in the build target's CMakeLists.txt. find_package(SDL2) -find_package(SDL2_image) find_package_static(DevIL) if (PREFER_STATIC_LIBS) diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index f21309a561..c56fdc4f15 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -45,7 +45,7 @@ using KeyDownCallback = bool (*)(Rml::Context* context, Rml::Input::KeyIdentifie starting point and copy relevant parts into the main loop of your application. On the other hand, the underlying platform and renderer used by the backend are intended to be re-usable as is. */ -namespace Backend { +namespace RmlGui { // Initializes the backend, including the custom system and render interfaces, and opens a window for rendering the RmlUi context. bool Initialize(SDL_Window* target_window, SDL_GLContext target_glcontext); @@ -63,11 +63,18 @@ bool ProcessEvents(Rml::Context* context, KeyDownCallback key_down_callback = nu // Request application closure during the next event processing call. void RequestExit(); +void Update(); + +void RenderFrame(); +void CreateContext(); +void CreateOverlayContext(); +void AddContext(Rml::Context *context); + // Prepares the render state to accept rendering commands from RmlUi, call before rendering the RmlUi context. void BeginFrame(); // Presents the rendered frame to the screen, call after rendering the RmlUi context. void PresentFrame(); -} // namespace Backend +} #endif diff --git a/rts/Rml/Backends/RmlUi_Backend_SDL_GL3.cpp b/rts/Rml/Backends/RmlUi_Backend_SDL_GL3.cpp index eb386e09a1..ef4663f028 100644 --- a/rts/Rml/Backends/RmlUi_Backend_SDL_GL3.cpp +++ b/rts/Rml/Backends/RmlUi_Backend_SDL_GL3.cpp @@ -29,50 +29,46 @@ #include "RmlUi_Backend.h" #include "RmlUi_Platform_SDL.h" #include "RmlUi_Renderer_GL3.h" -#include -#include -#include +#include +#include #include #include -#include +#include "Rendering/GL/myGL.h" +#include "Rendering/Textures/Bitmap.h" + +// #include "System/FileSystem/ArchiveScanner.h" +// #include "System/FileSystem/DataDirLocater.h" +#include "System/FileSystem/DataDirsAccess.h" +// #include "System/FileSystem/FileHandler.h" +// #include "System/FileSystem/FileSystem.h" +// #include "System/FileSystem/FileSystemInitializer.h" #if defined RMLUI_PLATFORM_EMSCRIPTEN - #include +#include #else - #if !(SDL_VIDEO_RENDER_OGL) - #error "Only the OpenGL SDL backend is supported." - #endif +#if !(SDL_VIDEO_RENDER_OGL) +#error "Only the OpenGL SDL backend is supported." +#endif #endif /** - Custom render interface example for the SDL/GL3 backend. + Custom render interface example for the SDL/GL3 backend. - Overloads the OpenGL3 render interface to load textures through SDL_image's built-in texture loading functionality. + Overloads the OpenGL3 render interface to load textures through SDL_image's built-in texture loading functionality. */ -class RenderInterface_GL3_SDL : public RenderInterface_GL3 { +class RenderInterface_GL3_SDL : public RenderInterface_GL3 +{ public: RenderInterface_GL3_SDL() {} - bool LoadTexture(Rml::TextureHandle& texture_handle, Rml::Vector2i& texture_dimensions, const Rml::String& source) override + bool LoadTexture(Rml::TextureHandle &texture_handle, Rml::Vector2i &texture_dimensions, const Rml::String &source) override { - Rml::FileInterface* file_interface = Rml::GetFileInterface(); - Rml::FileHandle file_handle = file_interface->Open(source); - if (!file_handle) + CBitmap bmp; + if (!bmp.Load(source)) + { return false; - - file_interface->Seek(file_handle, 0, SEEK_END); - const size_t buffer_size = file_interface->Tell(file_handle); - file_interface->Seek(file_handle, 0, SEEK_SET); - - using Rml::byte; - Rml::UniquePtr buffer(new byte[buffer_size]); - file_interface->Read(buffer.get(), buffer_size, file_handle); - file_interface->Close(file_handle); - - const size_t i = source.rfind('.'); - Rml::String extension = (i == Rml::String::npos ? Rml::String() : source.substr(i + 1)); - - SDL_Surface* surface = IMG_LoadTyped_RW(SDL_RWFromMem(buffer.get(), int(buffer_size)), 1, extension.c_str()); + } + SDL_Surface *surface = bmp.CreateSDLSurface(); bool success = false; if (surface) @@ -85,7 +81,7 @@ class RenderInterface_GL3_SDL : public RenderInterface_GL3 { SDL_SetSurfaceAlphaMod(surface, SDL_ALPHA_OPAQUE); SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE); - SDL_Surface* new_surface = SDL_CreateRGBSurfaceWithFormat(0, surface->w, surface->h, 32, SDL_PIXELFORMAT_RGBA32); + SDL_Surface *new_surface = SDL_CreateRGBSurfaceWithFormat(0, surface->w, surface->h, 32, SDL_PIXELFORMAT_RGBA32); if (!new_surface) return false; @@ -96,7 +92,7 @@ class RenderInterface_GL3_SDL : public RenderInterface_GL3 { surface = new_surface; } - success = RenderInterface_GL3::GenerateTexture(texture_handle, (const Rml::byte*)surface->pixels, texture_dimensions); + success = RenderInterface_GL3::GenerateTexture(texture_handle, (const Rml::byte *)surface->pixels, texture_dimensions); SDL_FreeSurface(surface); } @@ -104,81 +100,60 @@ class RenderInterface_GL3_SDL : public RenderInterface_GL3 { } }; +class VFSFileInterface : public Rml::FileInterface +{ +public: + VFSFileInterface() {} + Rml::FileHandle Open(const Rml::String &path) + { + const std::string &fsFullPath = dataDirsAccess.LocateFile(path); + return (Rml::FileHandle)std::fopen(fsFullPath.c_str(), "rb"); + } + + void Close(Rml::FileHandle file) + { + fclose((FILE *)file); + } + + size_t Read(void *buffer, size_t size, Rml::FileHandle file) + { + return fread(buffer, 1, size, (FILE *)file); + } + + bool Seek(Rml::FileHandle file, long offset, int origin) + { + return fseek((FILE *)file, offset, origin) == 0; + } + + size_t Tell(Rml::FileHandle file) + { + return ftell((FILE *)file); + }; +}; + /** - Global data used by this backend. + Global data used by this backend. - Lifetime governed by the calls to Backend::Initialize() and Backend::Shutdown(). + Lifetime governed by the calls to Backend::Initialize() and Backend::Shutdown(). */ -struct BackendData { +struct BackendData +{ SystemInterface_SDL system_interface; RenderInterface_GL3_SDL render_interface; + VFSFileInterface file_interface; - SDL_Window* window = nullptr; + SDL_Window *window = nullptr; SDL_GLContext glcontext = nullptr; + std::vector contexts; bool running = true; }; static Rml::UniquePtr data; -bool Backend::Initialize(SDL_Window* target_window, SDL_GLContext target_glcontext) { +bool RmlGui::Initialize(SDL_Window *target_window, SDL_GLContext target_glcontext) +{ RMLUI_ASSERT(!data); -// if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS | SDL_INIT_TIMER) != 0) -// return false; - - // Submit click events when focusing the window. - // SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1"); - -#if defined RMLUI_PLATFORM_EMSCRIPTEN - // GLES 3.0 (WebGL 2.0) - SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); -#else - // GL 3.3 Core - // SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); - // SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); - // SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); - // SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); -#endif - - // Request stencil buffer of at least 8-bit size to supporting clipping on transformed elements. - // SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); - // SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - -// // Enable linear filtering and MSAA for better-looking visuals, especially when transforms are applied. - // SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); - // SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); - // SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2); - -// const Uint32 window_flags = (SDL_WINDOW_OPENGL | (allow_resize ? SDL_WINDOW_RESIZABLE : 0)); - - // SDL_Window* window = SDL_CreateWindow(window_name, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, window_flags); -// if (!window) -// { -// // Try again on low-quality settings. -// SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "nearest"); -// SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); -// SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); -// window = SDL_CreateWindow(window_name, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, window_flags); -// if (!window) -// { -// fprintf(stderr, "SDL error on create window: %s\n", SDL_GetError()); -// return false; -// } -// } - - // SDL_GLContext glcontext = SDL_GL_CreateContext(target_window); - // SDL_GL_MakeCurrent(target_window, glcontext); -// SDL_GL_SetSwapInterval(1); - -// if (!RmlGL3::Initialize()) -// { -// fprintf(stderr, "Could not initialize OpenGL"); -// return false; -// } - data = Rml::MakeUnique(); if (!data->render_interface) @@ -191,13 +166,17 @@ bool Backend::Initialize(SDL_Window* target_window, SDL_GLContext target_glconte data->window = target_window; data->glcontext = target_glcontext; + // Rml::SetFileInterface(&data->file_interface); + Rml::SetSystemInterface(RmlGui::GetSystemInterface()); + Rml::SetRenderInterface(RmlGui::GetRenderInterface()); + data->system_interface.SetWindow(target_window); - data->render_interface.SetViewport(1500,1500); + data->render_interface.SetViewport(1500, 1500); return true; } -void Backend::Shutdown() +void RmlGui::Shutdown() { RMLUI_ASSERT(data); @@ -209,19 +188,19 @@ void Backend::Shutdown() // SDL_Quit(); } -Rml::SystemInterface* Backend::GetSystemInterface() +Rml::SystemInterface *RmlGui::GetSystemInterface() { RMLUI_ASSERT(data); return &data->system_interface; } -Rml::RenderInterface* Backend::GetRenderInterface() +Rml::RenderInterface *RmlGui::GetRenderInterface() { RMLUI_ASSERT(data); return &data->render_interface; } -bool Backend::ProcessEvents(Rml::Context* context, KeyDownCallback key_down_callback, bool power_save) +bool RmlGui::ProcessEvents(Rml::Context *context, KeyDownCallback key_down_callback, bool power_save) { RMLUI_ASSERT(data && context); @@ -300,14 +279,59 @@ bool Backend::ProcessEvents(Rml::Context* context, KeyDownCallback key_down_call return result; } -void Backend::RequestExit() +void RmlGui::RequestExit() { RMLUI_ASSERT(data); data->running = false; } -void Backend::BeginFrame() +void RmlGui::CreateContext() +{ + Rml::Context *context = Rml::CreateContext("overlay", Rml::Vector2i(1500, 1500)); + Rml::Debugger::Initialise(context); + RmlGui::AddContext(context); +} + +void RmlGui::CreateOverlayContext() +{ + Rml::Context *context = Rml::CreateContext("overlay", Rml::Vector2i(1500, 1500)); + Rml::Debugger::Initialise(context); + RmlGui::AddContext(context); + Rml::ElementDocument *document = context->LoadDocument("assets/demo.rml"); + if (document) + document->Show(); +} +void RmlGui::AddContext(Rml::Context *context) +{ + data->contexts.push_back(context); +} + +void RmlGui::Update() +{ + RMLUI_ASSERT(data); + // TODO: define if headless? + for (auto &context : data->contexts) + { + context->Update(); + } +} + +void RmlGui::RenderFrame() +{ + RMLUI_ASSERT(data); + +#ifndef HEADLESS + RmlGui::BeginFrame(); + for (auto &context : data->contexts) + { + context->Render(); + } + RmlGui::PresentFrame(); +#endif +} + +void RmlGui::BeginFrame() { RMLUI_ASSERT(data); @@ -315,7 +339,7 @@ void Backend::BeginFrame() data->render_interface.BeginFrame(); } -void Backend::PresentFrame() +void RmlGui::PresentFrame() { RMLUI_ASSERT(data); diff --git a/rts/System/SpringApp.cpp b/rts/System/SpringApp.cpp index ee0c48dfad..757a666edd 100644 --- a/rts/System/SpringApp.cpp +++ b/rts/System/SpringApp.cpp @@ -8,9 +8,7 @@ // Include before other headers that define a bunch of macros that break stuff. #include -#include #include -Rml::Context* context; #include #include @@ -221,18 +219,6 @@ SpringApp::~SpringApp() spring_clock::PopTickRate(); } -class DummyRmlUiSpringSystemInterface : public Rml::SystemInterface { -public: - double GetElapsedTime() override { - return spring_gettime().toMilliSecsf(); - } - -private: - std::chrono::steady_clock::time_point start; -}; - -static DummyRmlUiSpringSystemInterface dummyRmlUiSpringSystemInterface; - /** * @brief Initializes the SpringApp instance * @return whether initialization was successful @@ -257,9 +243,6 @@ bool SpringApp::Init() Watchdog::Install(); Watchdog::RegisterThread(WDT_MAIN, true); - // A dummy call to basic RmlUi function to verify that all is linking correctly. - // Rml::SetSystemInterface(&dummyRmlUiSpringSystemInterface); - // Create Window if (!InitWindow(("Spring " + SpringVersion::GetSync()).c_str())) { SDL_Quit(); @@ -299,6 +282,11 @@ bool SpringApp::Init() // GUIs #ifndef HEADLESS agui::gui = new agui::Gui(); + RmlGui::Initialize(globalRendering->GetWindow(), globalRendering->GetContext()); + Rml::Initialise(); + Rml::LoadFontFace("/home/mike/.local/share/BeyondAllReason/fonts/FreeSansBold.otf",true); + RmlGui::CreateOverlayContext(); + #endif keyCodes.Reset(); @@ -311,18 +299,6 @@ bool SpringApp::Init() // Lua socket restrictions CLuaSocketRestrictions::InitStatic(); LuaVFSDownload::Init(); - Backend::Initialize(globalRendering->GetWindow(), globalRendering->GetContext()); - Rml::SetSystemInterface(Backend::GetSystemInterface()); - Rml::SetRenderInterface(Backend::GetRenderInterface()); - Rml::Initialise(); - context = Rml::CreateContext("default", Rml::Vector2i(1500, 1500)); - Rml::LoadFontFace("/home/mike/.local/share/BeyondAllReason/fonts/FreeSansBold.otf",true); - Rml::Debugger::Initialise(context); - Rml::ElementDocument* document = context->LoadDocument("/home/mike/software/spring/rts/Rml/assets/demo.rml"); - if (document) - document->Show(); - else exit(1); - @@ -881,13 +857,12 @@ bool SpringApp::Update() // sic; Update can set the controller to null retc = ( activeController == nullptr || activeController->Update()); + RmlGui::Update(); auto lock = CLoadLock::GetUniqueLock(); swap = (retc && activeController != nullptr && activeController->Draw()); #endif -Backend::BeginFrame(); -context->Render(); -Backend::PresentFrame(); + RmlGui::RenderFrame(); // always swap by default, not doing so can upset some drivers globalRendering->SwapBuffers(swap, false); return retc; @@ -913,7 +888,6 @@ int SpringApp::Run() spring::exitCode = spring::EXIT_CODE_NOINIT; while (!gu->globalQuit) { - context->Update(); Watchdog::ClearTimer(WDT_MAIN); input.PushEvents(); diff --git a/rts/builds/legacy/CMakeLists.txt b/rts/builds/legacy/CMakeLists.txt index c4c93a772d..835fb0c3b0 100644 --- a/rts/builds/legacy/CMakeLists.txt +++ b/rts/builds/legacy/CMakeLists.txt @@ -15,8 +15,6 @@ set(engineLibraries ${SDL2_LIBRARY}) if("${SDL2_VERSION_STRING}" VERSION_LESS "2") message(FATAL_ERROR "Found SDL v${SDL2_VERSION_STRING} while 2 is required!") endif() -find_package(SDL2_image REQUIRED) -set(APPEND engineLibraries "SDL2_image::SDL2_image") set(OpenGL_GL_PREFERENCE LEGACY) find_package_static(OpenGL REQUIRED) @@ -80,7 +78,7 @@ include_directories(${engineIncludes}) ### Build the executable add_executable(engine-legacy ${EXE_FLAGS} ${engineSources} ${ENGINE_ICON} ${engineHeaders}) -target_link_libraries(engine-legacy ${engineLibraries} SDL2_image::SDL2_image) +target_link_libraries(engine-legacy ${engineLibraries}) ### Install the executable From 1bb6420c058eb7a7ece0ed089dd73de39c35c91c Mon Sep 17 00:00:00 2001 From: loveridge Date: Sat, 30 Sep 2023 17:20:02 -0700 Subject: [PATCH 04/58] VFS system integration --- {rts/Rml/assets => cont/RmlUi/demo}/LICENSE.txt | 0 .../assets => cont/RmlUi/demo}/LatoLatin-Bold.ttf | Bin .../RmlUi/demo}/LatoLatin-BoldItalic.ttf | Bin .../assets => cont/RmlUi/demo}/LatoLatin-Italic.ttf | Bin .../RmlUi/demo}/LatoLatin-Regular.ttf | Bin .../RmlUi/demo}/NotoEmoji-Regular.ttf | Bin {rts/Rml/assets => cont/RmlUi/demo}/alien_small.tga | Bin {rts/Rml/assets => cont/RmlUi/demo}/demo.rml | 0 {rts/Rml/assets => cont/RmlUi/demo}/hello_world.png | Bin .../RmlUi/demo}/high_scores_alien_1.tga | Bin .../RmlUi/demo}/high_scores_alien_2.tga | Bin .../RmlUi/demo}/high_scores_alien_3.tga | Bin .../RmlUi/demo}/high_scores_defender.tga | Bin {rts/Rml/assets => cont/RmlUi/demo}/invader.rcss | 0 {rts/Rml/assets => cont/RmlUi/demo}/invader.tga | Bin {rts/Rml/assets => cont/RmlUi/demo}/present.tga | Bin {rts/Rml/assets => cont/RmlUi/demo}/rml.rcss | 0 {rts/Rml/assets => cont/RmlUi/demo}/test.rml | 0 {rts/Rml/assets => cont/RmlUi/demo}/window.rml | 0 rts/Rml/Backends/RmlUi_Backend_SDL_GL3.cpp | 4 ++-- rts/System/SpringApp.cpp | 2 +- 21 files changed, 3 insertions(+), 3 deletions(-) rename {rts/Rml/assets => cont/RmlUi/demo}/LICENSE.txt (100%) rename {rts/Rml/assets => cont/RmlUi/demo}/LatoLatin-Bold.ttf (100%) rename {rts/Rml/assets => cont/RmlUi/demo}/LatoLatin-BoldItalic.ttf (100%) rename {rts/Rml/assets => cont/RmlUi/demo}/LatoLatin-Italic.ttf (100%) rename {rts/Rml/assets => cont/RmlUi/demo}/LatoLatin-Regular.ttf (100%) rename {rts/Rml/assets => cont/RmlUi/demo}/NotoEmoji-Regular.ttf (100%) rename {rts/Rml/assets => cont/RmlUi/demo}/alien_small.tga (100%) rename {rts/Rml/assets => cont/RmlUi/demo}/demo.rml (100%) rename {rts/Rml/assets => cont/RmlUi/demo}/hello_world.png (100%) rename {rts/Rml/assets => cont/RmlUi/demo}/high_scores_alien_1.tga (100%) rename {rts/Rml/assets => cont/RmlUi/demo}/high_scores_alien_2.tga (100%) rename {rts/Rml/assets => cont/RmlUi/demo}/high_scores_alien_3.tga (100%) rename {rts/Rml/assets => cont/RmlUi/demo}/high_scores_defender.tga (100%) rename {rts/Rml/assets => cont/RmlUi/demo}/invader.rcss (100%) rename {rts/Rml/assets => cont/RmlUi/demo}/invader.tga (100%) rename {rts/Rml/assets => cont/RmlUi/demo}/present.tga (100%) rename {rts/Rml/assets => cont/RmlUi/demo}/rml.rcss (100%) rename {rts/Rml/assets => cont/RmlUi/demo}/test.rml (100%) rename {rts/Rml/assets => cont/RmlUi/demo}/window.rml (100%) diff --git a/rts/Rml/assets/LICENSE.txt b/cont/RmlUi/demo/LICENSE.txt similarity index 100% rename from rts/Rml/assets/LICENSE.txt rename to cont/RmlUi/demo/LICENSE.txt diff --git a/rts/Rml/assets/LatoLatin-Bold.ttf b/cont/RmlUi/demo/LatoLatin-Bold.ttf similarity index 100% rename from rts/Rml/assets/LatoLatin-Bold.ttf rename to cont/RmlUi/demo/LatoLatin-Bold.ttf diff --git a/rts/Rml/assets/LatoLatin-BoldItalic.ttf b/cont/RmlUi/demo/LatoLatin-BoldItalic.ttf similarity index 100% rename from rts/Rml/assets/LatoLatin-BoldItalic.ttf rename to cont/RmlUi/demo/LatoLatin-BoldItalic.ttf diff --git a/rts/Rml/assets/LatoLatin-Italic.ttf b/cont/RmlUi/demo/LatoLatin-Italic.ttf similarity index 100% rename from rts/Rml/assets/LatoLatin-Italic.ttf rename to cont/RmlUi/demo/LatoLatin-Italic.ttf diff --git a/rts/Rml/assets/LatoLatin-Regular.ttf b/cont/RmlUi/demo/LatoLatin-Regular.ttf similarity index 100% rename from rts/Rml/assets/LatoLatin-Regular.ttf rename to cont/RmlUi/demo/LatoLatin-Regular.ttf diff --git a/rts/Rml/assets/NotoEmoji-Regular.ttf b/cont/RmlUi/demo/NotoEmoji-Regular.ttf similarity index 100% rename from rts/Rml/assets/NotoEmoji-Regular.ttf rename to cont/RmlUi/demo/NotoEmoji-Regular.ttf diff --git a/rts/Rml/assets/alien_small.tga b/cont/RmlUi/demo/alien_small.tga similarity index 100% rename from rts/Rml/assets/alien_small.tga rename to cont/RmlUi/demo/alien_small.tga diff --git a/rts/Rml/assets/demo.rml b/cont/RmlUi/demo/demo.rml similarity index 100% rename from rts/Rml/assets/demo.rml rename to cont/RmlUi/demo/demo.rml diff --git a/rts/Rml/assets/hello_world.png b/cont/RmlUi/demo/hello_world.png similarity index 100% rename from rts/Rml/assets/hello_world.png rename to cont/RmlUi/demo/hello_world.png diff --git a/rts/Rml/assets/high_scores_alien_1.tga b/cont/RmlUi/demo/high_scores_alien_1.tga similarity index 100% rename from rts/Rml/assets/high_scores_alien_1.tga rename to cont/RmlUi/demo/high_scores_alien_1.tga diff --git a/rts/Rml/assets/high_scores_alien_2.tga b/cont/RmlUi/demo/high_scores_alien_2.tga similarity index 100% rename from rts/Rml/assets/high_scores_alien_2.tga rename to cont/RmlUi/demo/high_scores_alien_2.tga diff --git a/rts/Rml/assets/high_scores_alien_3.tga b/cont/RmlUi/demo/high_scores_alien_3.tga similarity index 100% rename from rts/Rml/assets/high_scores_alien_3.tga rename to cont/RmlUi/demo/high_scores_alien_3.tga diff --git a/rts/Rml/assets/high_scores_defender.tga b/cont/RmlUi/demo/high_scores_defender.tga similarity index 100% rename from rts/Rml/assets/high_scores_defender.tga rename to cont/RmlUi/demo/high_scores_defender.tga diff --git a/rts/Rml/assets/invader.rcss b/cont/RmlUi/demo/invader.rcss similarity index 100% rename from rts/Rml/assets/invader.rcss rename to cont/RmlUi/demo/invader.rcss diff --git a/rts/Rml/assets/invader.tga b/cont/RmlUi/demo/invader.tga similarity index 100% rename from rts/Rml/assets/invader.tga rename to cont/RmlUi/demo/invader.tga diff --git a/rts/Rml/assets/present.tga b/cont/RmlUi/demo/present.tga similarity index 100% rename from rts/Rml/assets/present.tga rename to cont/RmlUi/demo/present.tga diff --git a/rts/Rml/assets/rml.rcss b/cont/RmlUi/demo/rml.rcss similarity index 100% rename from rts/Rml/assets/rml.rcss rename to cont/RmlUi/demo/rml.rcss diff --git a/rts/Rml/assets/test.rml b/cont/RmlUi/demo/test.rml similarity index 100% rename from rts/Rml/assets/test.rml rename to cont/RmlUi/demo/test.rml diff --git a/rts/Rml/assets/window.rml b/cont/RmlUi/demo/window.rml similarity index 100% rename from rts/Rml/assets/window.rml rename to cont/RmlUi/demo/window.rml diff --git a/rts/Rml/Backends/RmlUi_Backend_SDL_GL3.cpp b/rts/Rml/Backends/RmlUi_Backend_SDL_GL3.cpp index ef4663f028..2b215502e4 100644 --- a/rts/Rml/Backends/RmlUi_Backend_SDL_GL3.cpp +++ b/rts/Rml/Backends/RmlUi_Backend_SDL_GL3.cpp @@ -166,7 +166,7 @@ bool RmlGui::Initialize(SDL_Window *target_window, SDL_GLContext target_glcontex data->window = target_window; data->glcontext = target_glcontext; - // Rml::SetFileInterface(&data->file_interface); + Rml::SetFileInterface(&data->file_interface); Rml::SetSystemInterface(RmlGui::GetSystemInterface()); Rml::SetRenderInterface(RmlGui::GetRenderInterface()); @@ -298,7 +298,7 @@ void RmlGui::CreateOverlayContext() Rml::Context *context = Rml::CreateContext("overlay", Rml::Vector2i(1500, 1500)); Rml::Debugger::Initialise(context); RmlGui::AddContext(context); - Rml::ElementDocument *document = context->LoadDocument("assets/demo.rml"); + Rml::ElementDocument *document = context->LoadDocument("RmlUi/demo/demo.rml"); if (document) document->Show(); } diff --git a/rts/System/SpringApp.cpp b/rts/System/SpringApp.cpp index 757a666edd..27e2a8b449 100644 --- a/rts/System/SpringApp.cpp +++ b/rts/System/SpringApp.cpp @@ -284,7 +284,7 @@ bool SpringApp::Init() agui::gui = new agui::Gui(); RmlGui::Initialize(globalRendering->GetWindow(), globalRendering->GetContext()); Rml::Initialise(); - Rml::LoadFontFace("/home/mike/.local/share/BeyondAllReason/fonts/FreeSansBold.otf",true); + Rml::LoadFontFace("fonts/FreeSansBold.otf", true); RmlGui::CreateOverlayContext(); From bb6ebfdfbacc2596830352ce48fe85666db5461a Mon Sep 17 00:00:00 2001 From: loveridge Date: Mon, 2 Oct 2023 22:28:51 -0700 Subject: [PATCH 05/58] rmlui lua and sdl integration --- cont/RmlUi/demo/window.rml | 29 +- rts/Game/Game.cpp | 36 ++- rts/Game/UI/MouseHandler.cpp | 7 + rts/Game/UI/MouseHandler.h | 3 + ..._Backend_SDL_GL3.cpp => RmlUi_Backend.cpp} | 79 ++++- rts/Rml/Backends/RmlUi_Backend.h | 5 +- rts/Rml/CMakeLists.txt | 2 +- rts/System/Input/MouseInput.cpp | 4 + rts/System/SpringApp.cpp | 6 - rts/builds/legacy/CMakeLists.txt | 2 + rts/lib/CMakeLists.txt | 2 + rts/lib/RmlSolLua/.gitignore | 3 + rts/lib/RmlSolLua/CMakeLists.txt | 60 ++++ rts/lib/RmlSolLua/CMakePresets.json | 101 +++++++ rts/lib/RmlSolLua/LICENSE | 21 ++ rts/lib/RmlSolLua/README.md | 65 ++++ rts/lib/RmlSolLua/premake5.lua | 53 ++++ rts/lib/RmlSolLua/src/RmlSolLua.cpp | 57 ++++ rts/lib/RmlSolLua/src/RmlSolLua.h | 65 ++++ rts/lib/RmlSolLua/src/bind/Colour.cpp | 57 ++++ rts/lib/RmlSolLua/src/bind/Context.cpp | 188 ++++++++++++ rts/lib/RmlSolLua/src/bind/Convert.cpp | 43 +++ rts/lib/RmlSolLua/src/bind/DataModel.cpp | 33 ++ rts/lib/RmlSolLua/src/bind/Document.cpp | 113 +++++++ rts/lib/RmlSolLua/src/bind/Element.cpp | 243 +++++++++++++++ rts/lib/RmlSolLua/src/bind/ElementDerived.cpp | 97 ++++++ rts/lib/RmlSolLua/src/bind/ElementForm.cpp | 204 +++++++++++++ rts/lib/RmlSolLua/src/bind/Event.cpp | 63 ++++ rts/lib/RmlSolLua/src/bind/Global.cpp | 285 ++++++++++++++++++ rts/lib/RmlSolLua/src/bind/Log.cpp | 29 ++ rts/lib/RmlSolLua/src/bind/Vector.cpp | 54 ++++ rts/lib/RmlSolLua/src/bind/bind.cpp | 47 +++ rts/lib/RmlSolLua/src/bind/bind.h | 203 +++++++++++++ .../RmlSolLua/src/plugin/SolLuaDataModel.cpp | 128 ++++++++ .../RmlSolLua/src/plugin/SolLuaDataModel.h | 45 +++ .../RmlSolLua/src/plugin/SolLuaDocument.cpp | 64 ++++ rts/lib/RmlSolLua/src/plugin/SolLuaDocument.h | 68 +++++ .../src/plugin/SolLuaEventListener.cpp | 114 +++++++ .../src/plugin/SolLuaEventListener.h | 30 ++ .../RmlSolLua/src/plugin/SolLuaInstancer.cpp | 26 ++ .../RmlSolLua/src/plugin/SolLuaInstancer.h | 32 ++ rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp | 50 +++ rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.h | 43 +++ 43 files changed, 2833 insertions(+), 26 deletions(-) rename rts/Rml/Backends/{RmlUi_Backend_SDL_GL3.cpp => RmlUi_Backend.cpp} (81%) create mode 100644 rts/lib/RmlSolLua/.gitignore create mode 100644 rts/lib/RmlSolLua/CMakeLists.txt create mode 100644 rts/lib/RmlSolLua/CMakePresets.json create mode 100644 rts/lib/RmlSolLua/LICENSE create mode 100644 rts/lib/RmlSolLua/README.md create mode 100644 rts/lib/RmlSolLua/premake5.lua create mode 100644 rts/lib/RmlSolLua/src/RmlSolLua.cpp create mode 100644 rts/lib/RmlSolLua/src/RmlSolLua.h create mode 100644 rts/lib/RmlSolLua/src/bind/Colour.cpp create mode 100644 rts/lib/RmlSolLua/src/bind/Context.cpp create mode 100644 rts/lib/RmlSolLua/src/bind/Convert.cpp create mode 100644 rts/lib/RmlSolLua/src/bind/DataModel.cpp create mode 100644 rts/lib/RmlSolLua/src/bind/Document.cpp create mode 100644 rts/lib/RmlSolLua/src/bind/Element.cpp create mode 100644 rts/lib/RmlSolLua/src/bind/ElementDerived.cpp create mode 100644 rts/lib/RmlSolLua/src/bind/ElementForm.cpp create mode 100644 rts/lib/RmlSolLua/src/bind/Event.cpp create mode 100644 rts/lib/RmlSolLua/src/bind/Global.cpp create mode 100644 rts/lib/RmlSolLua/src/bind/Log.cpp create mode 100644 rts/lib/RmlSolLua/src/bind/Vector.cpp create mode 100644 rts/lib/RmlSolLua/src/bind/bind.cpp create mode 100644 rts/lib/RmlSolLua/src/bind/bind.h create mode 100644 rts/lib/RmlSolLua/src/plugin/SolLuaDataModel.cpp create mode 100644 rts/lib/RmlSolLua/src/plugin/SolLuaDataModel.h create mode 100644 rts/lib/RmlSolLua/src/plugin/SolLuaDocument.cpp create mode 100644 rts/lib/RmlSolLua/src/plugin/SolLuaDocument.h create mode 100644 rts/lib/RmlSolLua/src/plugin/SolLuaEventListener.cpp create mode 100644 rts/lib/RmlSolLua/src/plugin/SolLuaEventListener.h create mode 100644 rts/lib/RmlSolLua/src/plugin/SolLuaInstancer.cpp create mode 100644 rts/lib/RmlSolLua/src/plugin/SolLuaInstancer.h create mode 100644 rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp create mode 100644 rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.h diff --git a/cont/RmlUi/demo/window.rml b/cont/RmlUi/demo/window.rml index e368b36f5c..493515ea70 100644 --- a/cont/RmlUi/demo/window.rml +++ b/cont/RmlUi/demo/window.rml @@ -2,8 +2,31 @@ + - +
@@ -12,6 +35,10 @@
+

+

+

+
diff --git a/rts/Game/Game.cpp b/rts/Game/Game.cpp index 981cf5cbd2..100e085f74 100644 --- a/rts/Game/Game.cpp +++ b/rts/Game/Game.cpp @@ -2,6 +2,7 @@ #include "Rendering/GL/myGL.h" +#include #include "Game.h" #include "Camera.h" #include "CameraHandler.h" @@ -127,6 +128,8 @@ #include "System/TimeProfiler.h" #include "System/LoadLock.h" +#include + #undef CreateDirectory @@ -504,6 +507,9 @@ void CGame::Load(const std::string& mapFileName) } } + RmlGui::Initialize(globalRendering->GetWindow(), globalRendering->GetContext(), luaUI->GetLuaState(), globalRendering->winSizeX, globalRendering->winSizeY); + RmlGui::CreateOverlayContext(); + Watchdog::DeregisterThread(WDT_LOAD); AddTimedJobs(); @@ -1259,7 +1265,7 @@ bool CGame::UpdateUnsynced(const spring_time currentTime) globalRendering->lastFrameStart = currentTime; // Update the interpolation coefficient (globalRendering->timeOffset) if (!gs->paused && !IsSimLagging() && !gs->PreSimFrame() && !videoCapturing->AllowRecord()) { - globalRendering->weightedSpeedFactor = 0.001f * gu->simFPS; + globalRendering->weightedSpeedFactor = 0.001f * gu->simFPS; globalRendering->lastTimeOffset = globalRendering->timeOffset; globalRendering->timeOffset = (currentTime - lastFrameTime).toMilliSecsf() * globalRendering->weightedSpeedFactor; @@ -1279,36 +1285,36 @@ bool CGame::UpdateUnsynced(const spring_time currentTime) float CTO = globalRendering->timeOffset; // This mode forces a strict time step of 0.5 simframes per draw frames. Only useful for testing @ 60hz - if (SmoothTimeOffset == -1) { + if (SmoothTimeOffset == -1) { if (newSimFrame) { - if (LTO > (1.0f - drawsimratio * strictness)) + if (LTO > (1.0f - drawsimratio * strictness)) globalRendering->timeOffset = drawsimratio; - else + else globalRendering->timeOffset = 0.0f; } else { - if (LTO > drawsimratio * strictness) + if (LTO > drawsimratio * strictness) globalRendering->timeOffset = std::fmin(LTO + drawsimratio * strictness, 1.0f); else globalRendering->timeOffset = std::fmin(drawsimratio * strictness, 1.0f); } } - // This mode tries to correct for the wrongly calculated timeOffset adaptively, - // while trying to maintain a smooth interpolation rate + // This mode tries to correct for the wrongly calculated timeOffset adaptively, + // while trying to maintain a smooth interpolation rate // As frame rates dip below 45fps, this method is only marginally better than old method // But that is heavily dependent on wether the load is sim or draw based. // TODO: the camera smoothing still seems to take sim load into account heavily. So large sim loads jitter the camera quite a bit when moving if (SmoothTimeOffset > 0){ - // if we have a new sim frame, then check when the time and CTO of the previous draw frame was. + // if we have a new sim frame, then check when the time and CTO of the previous draw frame was. drawsimratio = std::fmin(drawsimratio, 1.0); // Clamp it otherwise we will accumulate delay when < 30 FPS float oldCTO = globalRendering->timeOffset; float newCTO = globalRendering->timeOffset; - if (newSimFrame) { - // newsimframe is a special case, as our new time offset is kind of wrong. + if (newSimFrame) { + // newsimframe is a special case, as our new time offset is kind of wrong. // What we want to know is when the last draw happened, and at what offset. - // There are two special cases here, if the last draw happened "on time", then we want to 'pull in' CTO to 0, + // There are two special cases here, if the last draw happened "on time", then we want to 'pull in' CTO to 0, // irrespective of the time spent in sim. // If the last draw frame didnt happend on time, and had a large CTO, then we need to 'carry over' some time offset @@ -1319,7 +1325,7 @@ bool CGame::UpdateUnsynced(const spring_time currentTime) } } else { - // On draw frames that dont have a preceding sim frame, we want to 'smooth' the CTO out a bit. + // On draw frames that dont have a preceding sim frame, we want to 'smooth' the CTO out a bit. // Otherwise, the sim frame is also calculated into the offset, making things jittery if ((CTO - LTO < (drawsimratio) * strictness)) { newCTO = std::fmin(LTO + drawsimratio * strictness, 1.3f); @@ -1431,6 +1437,7 @@ bool CGame::Draw() { if (UpdateUnsynced(currentTimePreUpdate)) return false; + RmlGui::Update(); const spring_time currentTimePreDraw = spring_gettime(); SCOPED_SPECIAL_TIMER("Draw"); @@ -1525,6 +1532,7 @@ bool CGame::Draw() { glEnable(GL_DEPTH_TEST); glLoadIdentity(); + RmlGui::RenderFrame(); if (videoCapturing->AllowRecord()) { videoCapturing->SetLastFrameTime(globalRendering->lastFrameTime = 1000.0f / GAME_SPEED); @@ -1674,7 +1682,7 @@ void CGame::SimFrame() { // note: starts at -1, first actual frame is 0 gs->frameNum += 1; - lastFrameTime = spring_gettime(); + lastFrameTime = spring_gettime(); // This is not very ideal, as the timeoffset of each new draw frame is also calculated from this // with a strange side effect: if the timeOffset was a high number, like 0.9, then this will force the next draw frame to have an offset of 0.0x // What this means, is that in the case where we have frames to spare, and and over rendering, then the following can happen at 60hz: @@ -1684,7 +1692,7 @@ void CGame::SimFrame() { // drawframe timeoffset ~ 1.0 (1 extra draw!) // simframe // drawframe timeoffset ~ 0.0 // THIS is the problematic case, as visually, this frame is 'near identical' to the previously drawn one! - // simframe + // simframe // drawframe timeoffset ~ 0.0 // drawframe timeoffset ~ 0.5 // simframe diff --git a/rts/Game/UI/MouseHandler.cpp b/rts/Game/UI/MouseHandler.cpp index 9246029efa..b5b12f54b6 100644 --- a/rts/Game/UI/MouseHandler.cpp +++ b/rts/Game/UI/MouseHandler.cpp @@ -307,6 +307,8 @@ void CMouseHandler::MousePress(int x, int y, int button) bp.dir = (dir = GetCursorCameraDir(x, y)); bp.movement = 0; + pressedBitMask |= 1 << button; + if (activeReceiver != nullptr && activeReceiver->MousePress(x, y, button)) return; @@ -463,6 +465,7 @@ void CMouseHandler::MouseRelease(int x, int y, int button) dir = GetCursorCameraDir(x, y); buttons[button].pressed = false; + pressedBitMask &= ~(1 << button); if (inMapDrawer != nullptr && inMapDrawer->IsDrawMode()) { inMapDrawer->MouseRelease(x, y, button); @@ -543,6 +546,10 @@ void CMouseHandler::MouseRelease(int x, int y, int button) } } +bool CMouseHandler::ButtonPressed() +{ + return pressedBitMask > 0; +} void CMouseHandler::MouseWheel(float delta) { diff --git a/rts/Game/UI/MouseHandler.h b/rts/Game/UI/MouseHandler.h index 58dbbab061..86dd7c583e 100644 --- a/rts/Game/UI/MouseHandler.h +++ b/rts/Game/UI/MouseHandler.h @@ -87,6 +87,8 @@ class CMouseHandler bool GetSelectionBoxVertices(float3& bl, float3& br, float3& tl, float3& tr) const; + bool ButtonPressed(); + private: int2 GetViewMouseCenter() const; void SetCursor(const std::string& cmdName, const bool forceRebind = false); @@ -116,6 +118,7 @@ class CMouseHandler bool wasLocked = false; bool offscreen = false; bool mmbScroll = false; + uint pressedBitMask = 0; private: bool hideCursor = true; diff --git a/rts/Rml/Backends/RmlUi_Backend_SDL_GL3.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp similarity index 81% rename from rts/Rml/Backends/RmlUi_Backend_SDL_GL3.cpp rename to rts/Rml/Backends/RmlUi_Backend.cpp index 2b215502e4..cb835689da 100644 --- a/rts/Rml/Backends/RmlUi_Backend_SDL_GL3.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -30,11 +30,15 @@ #include "RmlUi_Platform_SDL.h" #include "RmlUi_Renderer_GL3.h" #include +#include #include #include #include #include "Rendering/GL/myGL.h" #include "Rendering/Textures/Bitmap.h" +#include "Lua/LuaUI.h" +#include "RmlSolLua.h" +#include // #include "System/FileSystem/ArchiveScanner.h" // #include "System/FileSystem/DataDirLocater.h" @@ -42,6 +46,7 @@ // #include "System/FileSystem/FileHandler.h" // #include "System/FileSystem/FileSystem.h" // #include "System/FileSystem/FileSystemInitializer.h" +#include "System/Input/InputHandler.h" #if defined RMLUI_PLATFORM_EMSCRIPTEN #include @@ -145,13 +150,15 @@ struct BackendData SDL_Window *window = nullptr; SDL_GLContext glcontext = nullptr; std::vector contexts; + InputHandler::SignalType::connection_type inputCon; bool running = true; }; static Rml::UniquePtr data; -bool RmlGui::Initialize(SDL_Window *target_window, SDL_GLContext target_glcontext) +bool RmlGui::Initialize(SDL_Window *target_window, SDL_GLContext target_glcontext, lua_State *lua_state, int winX, int winY) { + sol::state_view lua(lua_state); RMLUI_ASSERT(!data); data = Rml::MakeUnique(); @@ -171,8 +178,30 @@ bool RmlGui::Initialize(SDL_Window *target_window, SDL_GLContext target_glcontex Rml::SetRenderInterface(RmlGui::GetRenderInterface()); data->system_interface.SetWindow(target_window); - data->render_interface.SetViewport(1500, 1500); - + // int w = 0; + // int h = 0; + // SDL_Renderer* renderer = SDL_GetRenderer(target_window); + // if (renderer == NULL) { + // const char* errmessage = SDL_GetError(); + // LOG_L(L_FATAL, "[SpringApp::%s] renderer get error: %s", __func__, errmessage); + // } + // int errcode = SDL_GetRendererOutputSize(renderer, &w, &h); + // if (errcode < 0) { + // const char* errmessage = SDL_GetError(); + // LOG_L(L_FATAL, "[SpringApp::%s] renderer output size error: %s", __func__, errmessage); + // } + data->render_interface.SetViewport(winX, winY); + + Rml::Initialise(); + // bool ok = CLuaRml::LoadHandler(); + // if (!ok) { + // exit(1); + // } + // Rml::Lua::Interpreter::LoadFile(Rml::String("luainvaders/lua/start.lua")); + + Rml::SolLua::Initialise(&lua); + Rml::LoadFontFace("fonts/FreeSansBold.otf", true); + data->inputCon = input.AddHandler(&RmlGui::ProcessEvent); return true; } @@ -200,6 +229,50 @@ Rml::RenderInterface *RmlGui::GetRenderInterface() return &data->render_interface; } +bool RmlGui::ProcessMouseEvent(const SDL_Event &event) +{ + SDL_Event ev(event); + if (data == NULL || data->contexts.size() < 1) + return false; + return RmlSDL::InputEventHandler(data->contexts[0], ev); +} + +bool RmlGui::ProcessEvent(const SDL_Event &event) +{ + SDL_Event ev(event); + switch (ev.type) + { + case SDL_WINDOWEVENT: + { + switch (ev.window.event) + { + case SDL_WINDOWEVENT_SIZE_CHANGED: + { + Rml::Vector2i dimensions(ev.window.data1, ev.window.data2); + data->render_interface.SetViewport(dimensions.x, dimensions.y); + } + break; + } + if (data != NULL && data->contexts.size() > 0) + RmlSDL::InputEventHandler(data->contexts[0], ev); + } + break; + case SDL_MOUSEMOTION: + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEWHEEL: + break; // handled by ProcessMouseEvent + case SDL_KEYDOWN: + default: + { + if (data != NULL && data->contexts.size() > 0) + RmlSDL::InputEventHandler(data->contexts[0], ev); + } + break; + } + return false; +} + bool RmlGui::ProcessEvents(Rml::Context *context, KeyDownCallback key_down_callback, bool power_save) { RMLUI_ASSERT(data && context); diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index c56fdc4f15..5652343701 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -34,6 +34,7 @@ #include #include #include +#include "lib/sol2/sol.hpp" using KeyDownCallback = bool (*)(Rml::Context* context, Rml::Input::KeyIdentifier key, int key_modifier, float native_dp_ratio, bool priority); @@ -48,7 +49,7 @@ using KeyDownCallback = bool (*)(Rml::Context* context, Rml::Input::KeyIdentifie namespace RmlGui { // Initializes the backend, including the custom system and render interfaces, and opens a window for rendering the RmlUi context. -bool Initialize(SDL_Window* target_window, SDL_GLContext target_glcontext); +bool Initialize(SDL_Window* target_window, SDL_GLContext target_glcontext, lua_State* lua_state, int winX, int winY); // Closes the window and release all resources owned by the backend, including the system and render interfaces. void Shutdown(); @@ -60,6 +61,8 @@ Rml::RenderInterface* GetRenderInterface(); // Polls and processes events from the current platform, and applies any relevant events to the provided RmlUi context and the key down callback. // @return False to indicate that the application should be closed. bool ProcessEvents(Rml::Context* context, KeyDownCallback key_down_callback = nullptr, bool power_save = false); +bool ProcessEvent(const SDL_Event& event); +bool ProcessMouseEvent(const SDL_Event& event); // Request application closure during the next event processing call. void RequestExit(); diff --git a/rts/Rml/CMakeLists.txt b/rts/Rml/CMakeLists.txt index d05f7f084b..86fbb4a5de 100644 --- a/rts/Rml/CMakeLists.txt +++ b/rts/Rml/CMakeLists.txt @@ -1,5 +1,5 @@ set(sources_engine_Rml - "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_Backend_SDL_GL3.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_Backend.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_Platform_SDL.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_Renderer_GL3.cpp" PARENT_SCOPE diff --git a/rts/System/Input/MouseInput.cpp b/rts/System/Input/MouseInput.cpp index 450c22eebf..f5fe459fb8 100644 --- a/rts/System/Input/MouseInput.cpp +++ b/rts/System/Input/MouseInput.cpp @@ -26,6 +26,7 @@ #include "Rendering/GlobalRendering.h" #include "System/MainDefines.h" #include "System/SafeUtil.h" +#include #include @@ -68,6 +69,9 @@ IMouseInput::~IMouseInput() bool IMouseInput::HandleSDLMouseEvent(const SDL_Event& event) { + if (!mouse->ButtonPressed() && !RmlGui::ProcessMouseEvent(event)) { + return false; + } switch (event.type) { case SDL_MOUSEMOTION: { mousepos = int2(event.motion.x, event.motion.y); diff --git a/rts/System/SpringApp.cpp b/rts/System/SpringApp.cpp index 27e2a8b449..eddd8ed9a2 100644 --- a/rts/System/SpringApp.cpp +++ b/rts/System/SpringApp.cpp @@ -282,10 +282,6 @@ bool SpringApp::Init() // GUIs #ifndef HEADLESS agui::gui = new agui::Gui(); - RmlGui::Initialize(globalRendering->GetWindow(), globalRendering->GetContext()); - Rml::Initialise(); - Rml::LoadFontFace("fonts/FreeSansBold.otf", true); - RmlGui::CreateOverlayContext(); #endif @@ -857,12 +853,10 @@ bool SpringApp::Update() // sic; Update can set the controller to null retc = ( activeController == nullptr || activeController->Update()); - RmlGui::Update(); auto lock = CLoadLock::GetUniqueLock(); swap = (retc && activeController != nullptr && activeController->Draw()); #endif - RmlGui::RenderFrame(); // always swap by default, not doing so can upset some drivers globalRendering->SwapBuffers(swap, false); return retc; diff --git a/rts/builds/legacy/CMakeLists.txt b/rts/builds/legacy/CMakeLists.txt index 835fb0c3b0..5df94f217f 100644 --- a/rts/builds/legacy/CMakeLists.txt +++ b/rts/builds/legacy/CMakeLists.txt @@ -67,12 +67,14 @@ list(APPEND engineLibraries engineSim) list(APPEND engineLibraries pr-downloader) list(APPEND engineLibraries RmlCore) list(APPEND engineLibraries RmlDebugger) +list(APPEND engineLibraries RmlSolLua) ### Assemble external incude dirs list(APPEND engineIncludes ${OPENAL_INCLUDE_DIR}) list(APPEND engineIncludes ${ENGINE_SRC_ROOT_DIR}/lib/asio/include) list(APPEND engineIncludes ${ENGINE_SRC_ROOT_DIR}/lib/slimsig/include) list(APPEND engineIncludes ${ENGINE_SRC_ROOT_DIR}/lib/cereal/include) +list(APPEND engineIncludes ${ENGINE_SRC_ROOT_DIR}/lib/RmlSolLua/src) include_directories(${engineIncludes}) diff --git a/rts/lib/CMakeLists.txt b/rts/lib/CMakeLists.txt index 3eb7137c52..db05ab2e4e 100644 --- a/rts/lib/CMakeLists.txt +++ b/rts/lib/CMakeLists.txt @@ -101,4 +101,6 @@ add_subdirectory(tracy) find_freetype_hack() # hack to find different named freetype.dll find_package_static(Freetype REQUIRED) +# option(BUILD_LUA_BINDINGS "RmlUI lua " TRUE) add_subdirectory(RmlUi) +add_subdirectory(RmlSolLua) diff --git a/rts/lib/RmlSolLua/.gitignore b/rts/lib/RmlSolLua/.gitignore new file mode 100644 index 0000000000..c1bd2721e6 --- /dev/null +++ b/rts/lib/RmlSolLua/.gitignore @@ -0,0 +1,3 @@ +.vs +out +!.gitignore diff --git a/rts/lib/RmlSolLua/CMakeLists.txt b/rts/lib/RmlSolLua/CMakeLists.txt new file mode 100644 index 0000000000..3a31d630ce --- /dev/null +++ b/rts/lib/RmlSolLua/CMakeLists.txt @@ -0,0 +1,60 @@ +# CMakeList.txt : CMake project for RmlSolLua, include source and define +# project specific logic here. +# +cmake_minimum_required (VERSION 3.13) + +project ("RmlSolLua") + +set (CMAKE_CXX_STANDARD 17) + +# Add source to this project's executable. +add_library (RmlSolLua STATIC) + +find_library (RmlCore NAMES RmlUi RmlCore) + +target_sources (RmlSolLua + PRIVATE + "src/RmlSolLua.h" + "src/RmlSolLua.cpp" + "src/bind/bind.cpp" + "src/bind/bind.h" + "src/bind/Colour.cpp" + "src/bind/Context.cpp" + "src/bind/Convert.cpp" + "src/bind/DataModel.cpp" + "src/bind/Document.cpp" + "src/bind/Element.cpp" + "src/bind/ElementDerived.cpp" + "src/bind/ElementForm.cpp" + "src/bind/Event.cpp" + "src/bind/Global.cpp" + "src/bind/Log.cpp" + "src/bind/Vector.cpp" + "src/plugin/SolLuaDataModel.cpp" + "src/plugin/SolLuaDataModel.h" + "src/plugin/SolLuaDocument.cpp" + "src/plugin/SolLuaDocument.h" + "src/plugin/SolLuaEventListener.cpp" + "src/plugin/SolLuaEventListener.h" + "src/plugin/SolLuaInstancer.cpp" + "src/plugin/SolLuaInstancer.h" + "src/plugin/SolLuaPlugin.cpp" + "src/plugin/SolLuaPlugin.h" + PUBLIC + "src/RmlSolLua.h" +) + +target_include_directories (RmlSolLua + PRIVATE + ${PROJECT_SOURCE_DIR}/src/ + ${PROJECT_SOURCE_DIR}/include/ + ../RmlUi/Include/ + ../ + ../lua/include + + PUBLIC + ${PROJECT_SOURCE_DIR}/include/ +) + + +# TODO: Add tests and install targets if needed. diff --git a/rts/lib/RmlSolLua/CMakePresets.json b/rts/lib/RmlSolLua/CMakePresets.json new file mode 100644 index 0000000000..f4bc98b32a --- /dev/null +++ b/rts/lib/RmlSolLua/CMakePresets.json @@ -0,0 +1,101 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "windows-base", + "hidden": true, + "generator": "Ninja", + "binaryDir": "${sourceDir}/out/build/${presetName}", + "installDir": "${sourceDir}/out/install/${presetName}", + "cacheVariables": { + "CMAKE_C_COMPILER": "cl.exe", + "CMAKE_CXX_COMPILER": "cl.exe" + }, + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Windows" + } + }, + { + "name": "x64-debug", + "displayName": "x64 Debug", + "inherits": "windows-base", + "architecture": { + "value": "x64", + "strategy": "external" + }, + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + } + }, + { + "name": "x64-release", + "displayName": "x64 Release", + "inherits": "x64-debug", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release" + } + }, + { + "name": "x86-debug", + "displayName": "x86 Debug", + "inherits": "windows-base", + "architecture": { + "value": "x86", + "strategy": "external" + }, + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + } + }, + { + "name": "x86-release", + "displayName": "x86 Release", + "inherits": "x86-debug", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release" + } + }, + { + "name": "linux-debug", + "displayName": "Linux Debug", + "generator": "Ninja", + "binaryDir": "${sourceDir}/out/build/${presetName}", + "installDir": "${sourceDir}/out/install/${presetName}", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + }, + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Linux" + }, + "vendor": { + "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": { + "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}" + } + } + }, + { + "name": "macos-debug", + "displayName": "macOS Debug", + "generator": "Ninja", + "binaryDir": "${sourceDir}/out/build/${presetName}", + "installDir": "${sourceDir}/out/install/${presetName}", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + }, + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Darwin" + }, + "vendor": { + "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": { + "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}" + } + } + } + ] +} diff --git a/rts/lib/RmlSolLua/LICENSE b/rts/lib/RmlSolLua/LICENSE new file mode 100644 index 0000000000..87ccd13e7f --- /dev/null +++ b/rts/lib/RmlSolLua/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 John Norman + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/rts/lib/RmlSolLua/README.md b/rts/lib/RmlSolLua/README.md new file mode 100644 index 0000000000..a2a1409533 --- /dev/null +++ b/rts/lib/RmlSolLua/README.md @@ -0,0 +1,65 @@ +RmlSolLua +=================== + +Generate bindings for [RmlUi](https://github.com/mikke89/RmlUi) using [sol3](https://github.com/ThePhD/sol2). + +**RmlUi**'s built-in Lua plugin only supports Lua 5.2 and up. This project leverages the **sol3** library to generate bindings that are compatible with Lua versions 5.1+ (and LuaJIT 2.1+ and MoonJIT). **RmlSolLua** also extends the base Lua implementation with many new bindings. + +This project requires C++17. + +## Usage + +```c++ +#include +#include +#include + +int main() +{ + // Open the sol3 Lua state. + sol::state lua; + lua.open_libraries(sol::lib::base, sol::lib::string, sol::lib::table, sol::lib::math); + + // Initialize RmlUi. + Backend::Initialize(...); + Rml::Initialise(); + + // Initialize RmlSolLua. + Rml::SolLua::Initialise(&lua); + + // Do stuff. + { + // ... + } + + // Collect garbage before shutdown. + // This is needed in RmlUi 5.0 and below to prevent a crash. + // Alternatively, make sure initialize the RmlSolLua plugin LAST. + lua.collect_garbage(); + + // Shutdown RmlUi. + // This will also close RmlSolLua. + Rml::Shutdown(); + Backend::Shutdown(); + + return 0; +} + +``` + +> ##### Note +> **RmlSolLua** does not manage your **sol3** `sol::state`. You must ensure it stays in scope until after the call to `Rml::Shutdown`. +> +> **RmlUi 5.0** has a use-after-free bug with plugin shutdown that involves plugins that monitor `Rml::Element` creation and deletion (like the Debugger plugin). To avoid a crash, you must either initialize RmlSolLua LAST (after Debugger), or call the `collect_garbage` function on your Lua state right before you shut down **RmlUi**. + +## Coverage + +**RmlSolLua** contains all the **RmlUi 5.0** Lua bindings EXCEPT: +- custom element instancing +- datagrid sources and formatters + +**RmlSolLua** contains many extra Lua bindings not covered by **RmlUi 5.0**. There are too many to list, but they can be found in the bindings under `src/bind/*.cpp` below any `//--` comments. Any binding not covered by **RmlUi**'s base Lua bindings are kept separate to be easily identified. + +## License + +**RmlSolLua** is published under the [MIT license](LICENSE). diff --git a/rts/lib/RmlSolLua/premake5.lua b/rts/lib/RmlSolLua/premake5.lua new file mode 100644 index 0000000000..819bb70ddf --- /dev/null +++ b/rts/lib/RmlSolLua/premake5.lua @@ -0,0 +1,53 @@ +workspace "RmlSolLua" + configurations { "Debug", "Release" } + platforms { "x32", "x64" } + symbols "On" + + cppdialect "C++17" + + filter "configurations:Debug" + defines { "DEBUG", "_DEBUG" } + editandcontinue "Off" + optimize "Off" + + filter "configurations:Release" + defines { "NDEBUG" } + optimize "Size" + flags { "LinkTimeOptimization" } + staticruntime "On" + + -- Set our platform architectures. + filter "platforms:x32" + architecture "x32" + filter "platforms:x64" + architecture "x64" + + +project "RmlSolLua" + kind "StaticLib" + language "C++" + targetdir "out" + debugdir "out" + + -- Add files. + files { "src/**" } + includedirs { "src" } + + -- Library includes. + includedirs { + "dependencies/sol2/include/", + "dependencies/luajit-2.0/src/", + "dependencies/RmlUi/include/", + } + + -- Links. + links { + "lua51", + "RmlUi", + } + + -- Defines + defines { + "RMLUI_STATIC_LIB", + -- "RMLUI_NO_THIRDPARTY_CONTAINERS". -- Enable to use STL containers. + } diff --git a/rts/lib/RmlSolLua/src/RmlSolLua.cpp b/rts/lib/RmlSolLua/src/RmlSolLua.cpp new file mode 100644 index 0000000000..a365f1cf5c --- /dev/null +++ b/rts/lib/RmlSolLua/src/RmlSolLua.cpp @@ -0,0 +1,57 @@ +#include "RmlSolLua.h" + +#include +#include + +#include "bind/bind.h" +#include "plugin/SolLuaPlugin.h" + + +namespace Rml::SolLua +{ + + void Initialise(sol::state_view* state) + { + if (state != nullptr) + { + ::Rml::RegisterPlugin(new SolLuaPlugin(*state)); + RegisterLua(state); + } + } + + void Initialise(sol::state_view* state, const Rml::String& lua_environment_identifier) + { + if (state != nullptr) + { + ::Rml::RegisterPlugin(new SolLuaPlugin(*state, lua_environment_identifier)); + RegisterLua(state); + } + } + + void Initialize(sol::state_view* state) + { + Initialise(state); + } + + void Initialize(sol::state_view* state, const Rml::String& lua_environment_identifier) + { + Initialise(state, lua_environment_identifier); + } + + void RegisterLua(sol::state_view* state) + { + bind_color(*state); + bind_context(*state); + bind_datamodel(*state); + bind_element(*state); + bind_element_derived(*state); + bind_element_form(*state); + bind_document(*state); + bind_event(*state); + bind_global(*state); + bind_log(*state); + bind_vector(*state); + bind_convert(*state); + } + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/RmlSolLua.h b/rts/lib/RmlSolLua/src/RmlSolLua.h new file mode 100644 index 0000000000..1fb2844377 --- /dev/null +++ b/rts/lib/RmlSolLua/src/RmlSolLua.h @@ -0,0 +1,65 @@ +#pragma once + +#include + +#ifdef RMLUILUA_API + #undef RMLUILUA_API +#endif + +#if !defined RMLUI_STATIC_LIB + #ifdef RMLUI_PLATFORM_WIN32 + #if defined RmlLua_EXPORTS + #define RMLUILUA_API __declspec(dllexport) + #else + #define RMLUILUA_API __declspec(dllimport) + #endif + #else + #define RMLUILUA_API __attribute__((visibility("default"))) + #endif +#else + #define RMLUILUA_API +#endif + + +namespace sol +{ + class state_view; +} + +namespace Rml::SolLua +{ + /// + /// Initializes RmlSolLua using the supplied Lua state. + /// + /// The Lua state to initialize into. + RMLUILUA_API void Initialise(sol::state_view* state); + + /// + /// Initializes RmlSolLua using the supplied Lua state. + /// Sets the Lua variable specified by lua_environment_identifier to the document's id when running Lua code. + /// + /// The Lua state to initialize into. + /// The Lua variable name that is set to the document's id. + RMLUILUA_API void Initialise(sol::state_view* state, const Rml::String& lua_environment_identifier); + + /// + /// Initializes RmlSolLua using the supplied Lua state. + /// + /// The Lua state to initialize into. + RMLUILUA_API void Initialize(sol::state_view* state); + + /// + /// Initializes RmlSolLua using the supplied Lua state. + /// Sets the Lua variable specified by lua_environment_identifier to the document's id when running Lua code. + /// + /// The Lua state to initialize into. + /// The Lua variable name that is set to the document's id. + RMLUILUA_API void Initialize(sol::state_view* state, const Rml::String& lua_environment_identifier); + + /// + /// Registers RmlSolLua into the specified Lua state. + /// + /// The Lua state to register into. + RMLUILUA_API void RegisterLua(sol::state_view* state); + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/bind/Colour.cpp b/rts/lib/RmlSolLua/src/bind/Colour.cpp new file mode 100644 index 0000000000..7ee0c882d8 --- /dev/null +++ b/rts/lib/RmlSolLua/src/bind/Colour.cpp @@ -0,0 +1,57 @@ +#include "bind.h" + + +namespace Rml::SolLua +{ + + using ColourbTuple = std::tuple; + using ColourfTuple = std::tuple; + + template + std::tuple getRGBA(Rml::Colour& self) + { + return std::tuple(self.red, self.green, self.blue, self.alpha); + } + + template + void setRGBA(Rml::Colour& self, std::tuple color) + { + sol::tie(self.red, self.green, self.blue, self.alpha) = color; + } + + void bind_color(sol::state_view& lua) + { + lua.new_usertype("Colourb", sol::constructors(), + // O + sol::meta_function::addition, &Rml::Colourb::operator+, + sol::meta_function::subtraction, &Rml::Colourb::operator-, + sol::meta_function::multiplication, &Rml::Colourb::operator*, + sol::meta_function::division, &Rml::Colourb::operator/, + sol::meta_function::equal_to, &Rml::Colourb::operator==, + + // G+S + "red", &Rml::Colourb::red, + "green", &Rml::Colourb::green, + "blue", &Rml::Colourb::blue, + "alpha", &Rml::Colourb::alpha, + "rgba", sol::property(static_cast(&getRGBA), static_cast(&setRGBA)) + ); + + lua.new_usertype("Colourf", sol::constructors(), + // O + sol::meta_function::addition, &Rml::Colourf::operator+, + sol::meta_function::subtraction, &Rml::Colourf::operator-, + sol::meta_function::multiplication, &Rml::Colourf::operator*, + sol::meta_function::division, &Rml::Colourf::operator/, + sol::meta_function::equal_to, &Rml::Colourf::operator==, + + // G+S + "red", &Rml::Colourf::red, + "green", &Rml::Colourf::green, + "blue", &Rml::Colourf::blue, + "alpha", &Rml::Colourf::alpha, + "rgba", sol::property(static_cast(&getRGBA), static_cast(&setRGBA)) + ); + } + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/bind/Context.cpp b/rts/lib/RmlSolLua/src/bind/Context.cpp new file mode 100644 index 0000000000..ff4662f1c4 --- /dev/null +++ b/rts/lib/RmlSolLua/src/bind/Context.cpp @@ -0,0 +1,188 @@ +#include "bind.h" + +#include "plugin/SolLuaDocument.h" +#include "plugin/SolLuaDataModel.h" + +#include + + +namespace Rml::SolLua +{ + + namespace document + { + /// + /// Return a SolLuaDocument. + /// + auto getDocumentBypass(Rml::Context& self, int idx) + { + auto document = self.GetDocument(idx); + auto result = dynamic_cast(document); + return result; + } + + /// + /// Return a SolLuaDocument. + /// + auto getDocumentBypassString(Rml::Context& self, const Rml::String& name) + { + auto document = self.GetDocument(name); + return dynamic_cast(document); + } + + /// + /// Helper function to fill the indexed table with data. + /// + auto getDocument(Rml::Context& self) + { + std::function result = [&self](int idx) -> auto { return getDocumentBypass(self, idx); }; + return result; + } + } + + namespace datamodel + { + /// + /// Bind a sol::table into the data model. + /// + /// The data model container. + /// The table to bind. + void bindTable(SolLuaDataModel* data, sol::table& table) + { + for (auto& [key, value] : table) + { + auto skey = key.as(); + auto it = data->ObjectList.insert_or_assign(skey, value); + + if (value.get_type() == sol::type::function) + { + data->Constructor.BindEventCallback(skey, + [skey, cb = sol::protected_function{ value }, state = sol::state_view{ table.lua_state() }](Rml::DataModelHandle, Rml::Event& event, const Rml::VariantList& varlist) + { + if (cb.valid()) + { + std::vector args; + for (const auto& variant : varlist) + { + args.push_back(makeObjectFromVariant(&variant, state)); + } + auto pfr = cb(event, sol::as_args(args)); + if (!pfr.valid()) + ErrorHandler(cb.lua_state(), std::move(pfr)); + } + }); + } + else + { + data->Constructor.BindCustomDataVariable(skey, Rml::DataVariable(data->ObjectDef.get(), &(it.first->second))); + } + } + } + + /// + /// Opens a Lua data model. + /// + /// The context that called this function. + /// The name of the data model. + /// The table to bind as the data model. + /// Lua state. + /// A unique pointer to a Sol Lua Data Model. + std::unique_ptr openDataModel(Rml::Context& self, const Rml::String& name, sol::object model, sol::this_state s) + { + sol::state_view lua{ s }; + + // Create data model. + auto constructor = self.CreateDataModel(name); + auto data = std::make_unique(lua); + + // Already created? Get existing. + if (!constructor) + { + constructor = self.GetDataModel(name); + if (!constructor) + return data; + } + + data->Constructor = constructor; + data->Handle = constructor.GetModelHandle(); + data->ObjectDef = std::make_unique(data.get()); + + // Only bind table. + if (model.get_type() == sol::type::table) + { + data->Table = model.as(); + datamodel::bindTable(data.get(), data->Table); + } + + return data; + } + } + + namespace element + { + auto getElementAtPoint1(Rml::Context& self, Rml::Vector2f point) + { + return self.GetElementAtPoint(point); + } + + auto getElementAtPoint2(Rml::Context& self, Rml::Vector2f point, Rml::Element& ignore) + { + return self.GetElementAtPoint(point, &ignore); + } + } + + /// + /// Binds the Rml::Context class to Lua. + /// + /// The Lua state to bind into. + void bind_context(sol::state_view& lua) + { + lua.new_usertype("Context", sol::no_constructor, + // M + "AddEventListener", &Rml::Context::AddEventListener, + "CreateDocument", [](Rml::Context& self) { return self.CreateDocument(); }, + "LoadDocument", [](Rml::Context& self, const Rml::String& document) { + auto doc = self.LoadDocument(document); + return dynamic_cast(doc); + }, + "GetDocument", &document::getDocumentBypassString, + "Render", &Rml::Context::Render, + "UnloadAllDocuments", &Rml::Context::UnloadAllDocuments, + "UnloadDocument", &Rml::Context::UnloadDocument, + "Update", &Rml::Context::Update, + "OpenDataModel", &datamodel::openDataModel, + "ProcessMouseMove", &Rml::Context::ProcessMouseMove, + "ProcessMouseButtonDown", &Rml::Context::ProcessMouseButtonDown, + "ProcessMouseButtonUp", &Rml::Context::ProcessMouseButtonUp, + // "ProcessMouseWheel", &Rml::Context::ProcessMouseWheel, + "ProcessMouseLeave", &Rml::Context::ProcessMouseLeave, + "IsMouseInteracting", &Rml::Context::IsMouseInteracting, + "ProcessKeyDown", &Rml::Context::ProcessKeyDown, + "ProcessKeyUp", &Rml::Context::ProcessKeyUp, + "ProcessTextInput", sol::resolve(&Rml::Context::ProcessTextInput), + //-- + "EnableMouseCursor", &Rml::Context::EnableMouseCursor, + "ActivateTheme", &Rml::Context::ActivateTheme, + "IsThemeActive", &Rml::Context::IsThemeActive, + "GetElementAtPoint", sol::overload(&element::getElementAtPoint1, &element::getElementAtPoint2), + "PullDocumentToFront", &Rml::Context::PullDocumentToFront, + "PushDocumentToBack", &Rml::Context::PushDocumentToBack, + "UnfocusDocument", &Rml::Context::UnfocusDocument, + // RemoveEventListener + + // G+S + "dimensions", sol::property(&Rml::Context::GetDimensions, &Rml::Context::SetDimensions), + "dp_ratio", sol::property(&Rml::Context::GetDensityIndependentPixelRatio, &Rml::Context::SetDensityIndependentPixelRatio), + //-- + "clip_region", sol::property(&Rml::Context::GetActiveClipRegion, &Rml::Context::SetActiveClipRegion), + + // G + "documents", sol::readonly_property(&getIndexedTable), + "focus_element", sol::readonly_property(&Rml::Context::GetFocusElement), + "hover_element", sol::readonly_property(&Rml::Context::GetHoverElement), + "name", sol::readonly_property(&Rml::Context::GetName), + "root_element", sol::readonly_property(&Rml::Context::GetRootElement) + ); + } + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/bind/Convert.cpp b/rts/lib/RmlSolLua/src/bind/Convert.cpp new file mode 100644 index 0000000000..34c05781bc --- /dev/null +++ b/rts/lib/RmlSolLua/src/bind/Convert.cpp @@ -0,0 +1,43 @@ +#include "bind.h" + +#include "plugin/SolLuaDocument.h" + + +namespace Rml::SolLua +{ + + namespace functions + { + template + T* convert(Rml::Element* element) + { + auto test = dynamic_cast(element); + if (test == nullptr) + return nullptr; + + return test; + } + + #define CONVERSION(T) static_cast(&functions::convert) + } + + void bind_convert(sol::state_view& lua) + { + auto element = lua.create_named_table("Element"); + auto element_as = element.create_named("As"); + + element_as["Document"] = CONVERSION(SolLuaDocument); + element_as["ElementText"] = CONVERSION(Rml::ElementText); + // element_as["ElementDataGrid"] = CONVERSION(Rml::ElementDataGrid); + // element_as["ElementDataGridRow"] = CONVERSION(Rml::ElementDataGridRow); + // element_as["ElementDataGridCell"] = CONVERSION(Rml::ElementDataGridCell); + element_as["ElementForm"] = CONVERSION(Rml::ElementForm); + element_as["ElementFormControl"] = CONVERSION(Rml::ElementFormControl); + element_as["ElementFormControlInput"] = CONVERSION(Rml::ElementFormControlInput); + element_as["ElementFormControlSelect"] = CONVERSION(Rml::ElementFormControlSelect); + // element_as["ElementFormControlDataSelect"] = CONVERSION(Rml::ElementFormControlDataSelect); + element_as["ElementFormControlTextArea"] = CONVERSION(Rml::ElementFormControlTextArea); + element_as["ElementTabSet"] = CONVERSION(Rml::ElementTabSet); + } + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/bind/DataModel.cpp b/rts/lib/RmlSolLua/src/bind/DataModel.cpp new file mode 100644 index 0000000000..a393dbf6be --- /dev/null +++ b/rts/lib/RmlSolLua/src/bind/DataModel.cpp @@ -0,0 +1,33 @@ +#include "bind.h" + +#include "plugin/SolLuaDocument.h" +#include "plugin/SolLuaDataModel.h" + + +namespace Rml::SolLua +{ + namespace functions + { + sol::object dataModelGet(SolLuaDataModel& self, const std::string& name, sol::this_state s) + { + return self.Table.get(name); + } + + void dataModelSet(SolLuaDataModel& self, const std::string& name, sol::object value, sol::this_state s) + { + self.Handle.DirtyVariable(name); + self.Table.set(name, value); + } + } + + void bind_datamodel(sol::state_view& lua) + { + + lua.new_usertype("SolLuaDataModel", sol::no_constructor, + sol::meta_function::index, &functions::dataModelGet, + sol::meta_function::new_index, &functions::dataModelSet + ); + + } + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/bind/Document.cpp b/rts/lib/RmlSolLua/src/bind/Document.cpp new file mode 100644 index 0000000000..2facaa30bf --- /dev/null +++ b/rts/lib/RmlSolLua/src/bind/Document.cpp @@ -0,0 +1,113 @@ +#include "bind.h" + +#include "plugin/SolLuaDocument.h" + + +namespace Rml::SolLua +{ + + namespace document + { + auto show(SolLuaDocument& self) + { + self.Show(); + } + + auto showModal(SolLuaDocument& self, Rml::ModalFlag modal) + { + self.Show(modal); + } + + auto showModalFocus(SolLuaDocument& self, Rml::ModalFlag modal, Rml::FocusFlag focus) + { + self.Show(modal, focus); + } + + auto reloadStyleSheet(SolLuaDocument& self) + { + self.ReloadStyleSheet(); + } + + auto reloadStyleSheetAndLoad(SolLuaDocument& self, bool load) + { + reloadStyleSheet(self); + if (load) + { + // Dispatch the load event so we can re-bind any scripts that got wiped out. + self.DispatchEvent(EventId::Load, Dictionary()); + } + } + + auto loadInlineScript3(SolLuaDocument& self, const Rml::String& content, const Rml::String& source_path, int source_line) + { + self.LoadInlineScript(content, source_path, source_line); + } + + auto loadInlineScript2(SolLuaDocument& self, const Rml::String& content, const Rml::String& source_path) + { + loadInlineScript3(self, content, source_path, 0); + } + + auto loadInlineScript1(SolLuaDocument& self, const Rml::String& content) + { + loadInlineScript3(self, content, self.GetSourceURL(), 0); + } + + auto appendToStyleSheet(SolLuaDocument& self, const Rml::String& content) + { + auto styleSheet = Rml::Factory::InstanceStyleSheetString(content); + auto combined = styleSheet->CombineStyleSheetContainer(*self.GetStyleSheetContainer()); + self.SetStyleSheetContainer(std::move(combined)); + } + } + + void bind_document(sol::state_view& lua) + { + lua.new_enum("RmlModalFlag", + { + { "None", Rml::ModalFlag::None }, + { "Modal", Rml::ModalFlag::Modal }, + { "Keep", Rml::ModalFlag::Keep } + } + ); + + lua.new_enum("RmlFocusFlag", + { + { "None", Rml::FocusFlag::None }, + { "Document", Rml::FocusFlag::Document }, + { "Keep", Rml::FocusFlag::Keep }, + { "Auto", Rml::FocusFlag::Auto } + } + ); + + lua.new_usertype("Document", sol::no_constructor, + // M + "PullToFront", &SolLuaDocument::PullToFront, + "PushToBack", &SolLuaDocument::PushToBack, + "Show", sol::overload(&document::show, &document::showModal, &document::showModalFocus), + "Hide", &SolLuaDocument::Hide, + "Close", &SolLuaDocument::Close, + "CreateElement", &SolLuaDocument::CreateElement, + "CreateTextNode", &SolLuaDocument::CreateTextNode, + //-- + "ReloadStyleSheet", sol::overload(&document::reloadStyleSheet, &document::reloadStyleSheetAndLoad), + "LoadInlineScript", sol::overload(&document::loadInlineScript1, &document::loadInlineScript2, &document::loadInlineScript3), + "LoadExternalScript", &SolLuaDocument::LoadExternalScript, + "UpdateDocument", &SolLuaDocument::UpdateDocument, + "AppendToStyleSheet", &document::appendToStyleSheet, + + // G+S + "title", sol::property(&SolLuaDocument::GetTitle, &SolLuaDocument::SetTitle), + + // G + "context", sol::readonly_property(&SolLuaDocument::GetContext), + //-- + "url", sol::readonly_property(&SolLuaDocument::GetSourceURL), + "modal", sol::readonly_property(&SolLuaDocument::IsModal), + + // B + sol::base_classes, sol::bases() + ); + } + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/bind/Element.cpp b/rts/lib/RmlSolLua/src/bind/Element.cpp new file mode 100644 index 0000000000..f955d9a030 --- /dev/null +++ b/rts/lib/RmlSolLua/src/bind/Element.cpp @@ -0,0 +1,243 @@ +#include "bind.h" + +#include "plugin/SolLuaDocument.h" +#include "plugin/SolLuaEventListener.h" + +#include + + +namespace Rml::SolLua +{ + + namespace functions + { + void addEventListener(Rml::Element& self, const Rml::String& event, sol::protected_function func, const bool in_capture_phase = false) + { + auto e = new SolLuaEventListener{ func, &self }; + self.AddEventListener(event, e, in_capture_phase); + } + + void addEventListener(Rml::Element& self, const Rml::String& event, const Rml::String& code, sol::this_state s) + { + auto state = sol::state_view{ s }; + auto e = new SolLuaEventListener{ state, code, &self }; + self.AddEventListener(event, e, false); + } + + void addEventListener(Rml::Element& self, const Rml::String& event, const Rml::String& code, sol::this_state s, const bool in_capture_phase) + { + auto state = sol::state_view{ s }; + auto e = new SolLuaEventListener{ state, code, &self }; + self.AddEventListener(event, e, in_capture_phase); + } + + auto getAttribute(Rml::Element& self, const Rml::String& name, sol::this_state s) + { + sol::state_view state{ s }; + + auto attr = self.GetAttribute(name); + return makeObjectFromVariant(attr, s); + } + + auto getElementsByTagName(Rml::Element& self, const Rml::String& tag) + { + Rml::ElementList result; + self.GetElementsByTagName(result, tag); + return result; + } + + auto getElementsByClassName(Rml::Element& self, const Rml::String& class_name) + { + Rml::ElementList result; + self.GetElementsByClassName(result, class_name); + return result; + } + + auto getAttributes(Rml::Element& self, sol::this_state s) + { + SolObjectMap result; + + const auto& attributes = self.GetAttributes(); + for (auto& [key, value] : attributes) + { + auto object = makeObjectFromVariant(&value, s); + result.insert(std::make_pair(key, object)); + } + + return result; + } + + auto getOwnerDocument(Rml::Element& self) + { + auto document = self.GetOwnerDocument(); + auto soldocument = dynamic_cast(document); + return soldocument; + } + + auto getQuerySelectorAll(Rml::Element& self, const Rml::String& selector) + { + Rml::ElementList result; + self.QuerySelectorAll(result, selector); + return result; + } + } + + namespace child + { + auto getMaxChildren(Rml::Element& self) + { + std::function result = std::bind(&Rml::Element::GetNumChildren, &self, false); + return result; + } + } + + namespace style + { + struct StyleProxyIter + { + StyleProxyIter(Rml::PropertiesIteratorView&& self) : Iterator(std::move(self)) {} + Rml::PropertiesIteratorView Iterator; + }; + + auto nextPair(sol::user iter_state, sol::this_state s) + { + StyleProxyIter& iter = iter_state; + if (iter.Iterator.AtEnd()) + return std::make_tuple(sol::object(sol::lua_nil), sol::object(sol::lua_nil)); + + auto result = std::make_tuple(sol::object(s, sol::in_place, iter.Iterator.GetName()), sol::object(s, sol::in_place, iter.Iterator.GetProperty().ToString())); + ++iter.Iterator; + + return result; + } + + struct StyleProxy + { + StyleProxy(Rml::Element& element) : m_element(element) {} + + std::string Get(const std::string& name) + { + auto prop = m_element.GetProperty(name); + if (prop == nullptr) return {}; + return prop->ToString(); + } + + void Set(const std::string& name, const std::string& value) + { + m_element.SetProperty(name, value); + } + + auto Pairs() + { + StyleProxyIter iter{ std::move(m_element.IterateLocalProperties()) }; + return std::make_tuple(&nextPair, std::move(iter), sol::lua_nil); + } + + private: + Rml::Element& m_element; + }; + + auto getElementStyleProxy(Rml::Element& self) + { + return StyleProxy{ self }; + } + } + + void bind_element(sol::state_view& lua) + { + lua.new_usertype("EventListener", sol::no_constructor, + // M + "OnAttach", &Rml::EventListener::OnAttach, + "OnDetach", &Rml::EventListener::OnDetach, + "ProcessEvent", &Rml::EventListener::ProcessEvent + ); + + /////////////////////////// + + lua.new_usertype("StyleProxy", sol::no_constructor, + sol::meta_function::index, &style::StyleProxy::Get, + sol::meta_function::new_index, &style::StyleProxy::Set, + sol::meta_function::pairs, &style::StyleProxy::Pairs + ); + + lua.new_usertype("Element", sol::no_constructor, + // M + "AddEventListener", sol::overload( + [](Rml::Element& s, const Rml::String& e, sol::protected_function f) { functions::addEventListener(s, e, f, false); }, + sol::resolve(&functions::addEventListener), + sol::resolve(&functions::addEventListener), + sol::resolve(&functions::addEventListener) + ), + "AppendChild", [](Rml::Element& self, Rml::ElementPtr& e) { self.AppendChild(std::move(e)); }, + "Blur", &Rml::Element::Blur, + "Click", &Rml::Element::Click, + "DispatchEvent", sol::resolve(&Rml::Element::DispatchEvent), + "Focus", &Rml::Element::Focus, + "GetAttribute", &functions::getAttribute, + "GetElementById", &Rml::Element::GetElementById, + "GetElementsByTagName", &functions::getElementsByTagName, + "QuerySelector", &Rml::Element::QuerySelector, + "QuerySelectorAll", &functions::getQuerySelectorAll, + "HasAttribute", &Rml::Element::HasAttribute, + "HasChildNodes", &Rml::Element::HasChildNodes, + "InsertBefore", [](Rml::Element& self, Rml::ElementPtr& element, Rml::Element* adjacent_element) { self.InsertBefore(std::move(element), adjacent_element); }, + "IsClassSet", &Rml::Element::IsClassSet, + "RemoveAttribute", &Rml::Element::RemoveAttribute, + "RemoveChild", &Rml::Element::RemoveChild, + "ReplaceChild", [](Rml::Element& self, Rml::ElementPtr& inserted_element, Rml::Element* replaced_element) { self.ReplaceChild(std::move(inserted_element), replaced_element); }, + "ScrollIntoView", [](Rml::Element& self, sol::variadic_args va) { if (va.size() == 0) self.ScrollIntoView(true); else self.ScrollIntoView(va[0].as()); }, + "SetAttribute", static_cast(&Rml::Element::SetAttribute), + "SetClass", &Rml::Element::SetClass, + //-- + "GetElementsByClassName", &functions::getElementsByClassName, + "Clone", &Rml::Element::Clone, + "Closest", &Rml::Element::Closest, + "SetPseudoClass", &Rml::Element::SetPseudoClass, + "IsPseudoClassSet", &Rml::Element::IsPseudoClassSet, + "ArePseudoClassesSet", &Rml::Element::ArePseudoClassesSet, + "GetActivePseudoClasses", &Rml::Element::GetActivePseudoClasses, + "IsPointWithinElement", &Rml::Element::IsPointWithinElement, + "ProcessDefaultAction", &Rml::Element::ProcessDefaultAction, + + // G+S + "class_name", sol::property(&Rml::Element::GetClassNames, &Rml::Element::SetClassNames), + "id", sol::property(&Rml::Element::GetId, &Rml::Element::SetId), + "inner_rml", sol::property(sol::resolve(&Rml::Element::GetInnerRML), &Rml::Element::SetInnerRML), + "scroll_left", sol::property(&Rml::Element::GetScrollLeft, &Rml::Element::SetScrollLeft), + "scroll_top", sol::property(&Rml::Element::GetScrollTop, &Rml::Element::SetScrollTop), + + // G + "attributes", sol::readonly_property(&functions::getAttributes), + "child_nodes", sol::readonly_property(&getIndexedTable), + "client_left", sol::readonly_property(&Rml::Element::GetClientLeft), + "client_height", sol::readonly_property(&Rml::Element::GetClientHeight), + "client_top", sol::readonly_property(&Rml::Element::GetClientTop), + "client_width", sol::readonly_property(&Rml::Element::GetClientWidth), + "first_child", sol::readonly_property(&Rml::Element::GetFirstChild), + "last_child", sol::readonly_property(&Rml::Element::GetLastChild), + "next_sibling", sol::readonly_property(&Rml::Element::GetNextSibling), + "offset_height", sol::readonly_property(&Rml::Element::GetOffsetHeight), + "offset_left", sol::readonly_property(&Rml::Element::GetOffsetLeft), + "offset_parent", sol::readonly_property(&Rml::Element::GetOffsetParent), + "offset_top", sol::readonly_property(&Rml::Element::GetOffsetTop), + "offset_width", sol::readonly_property(&Rml::Element::GetOffsetWidth), + "owner_document", sol::readonly_property(&functions::getOwnerDocument), + "parent_node", sol::readonly_property(&Rml::Element::GetParentNode), + "previous_sibling", sol::readonly_property(&Rml::Element::GetPreviousSibling), + "scroll_height", sol::readonly_property(&Rml::Element::GetScrollHeight), + "scroll_width", sol::readonly_property(&Rml::Element::GetScrollWidth), + "style", sol::readonly_property(&style::getElementStyleProxy), + "tag_name", sol::readonly_property(&Rml::Element::GetTagName), + //-- + "address", sol::readonly_property([](Rml::Element& self) { return self.GetAddress(); }), + "absolute_left", sol::readonly_property(&Rml::Element::GetAbsoluteLeft), + "absolute_top", sol::readonly_property(&Rml::Element::GetAbsoluteTop), + "baseline", sol::readonly_property(&Rml::Element::GetBaseline), + "line_height", sol::readonly_property(&Rml::Element::GetLineHeight), + "visible", sol::readonly_property(&Rml::Element::IsVisible), + "z_index", sol::readonly_property(&Rml::Element::GetZIndex) + ); + + } + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/bind/ElementDerived.cpp b/rts/lib/RmlSolLua/src/bind/ElementDerived.cpp new file mode 100644 index 0000000000..62c1e21aa2 --- /dev/null +++ b/rts/lib/RmlSolLua/src/bind/ElementDerived.cpp @@ -0,0 +1,97 @@ +#include "bind.h" + +#include "plugin/SolLuaEventListener.h" + +#include + + +namespace Rml::SolLua +{ + + void bind_element_derived(sol::state_view& lua) + { + + lua.new_usertype("ElementText", sol::no_constructor, + // G + "text", sol::property(&Rml::ElementText::GetText, &Rml::ElementText::SetText), + + // B + sol::base_classes, sol::bases() + ); + + /////////////////////////// + + // lua.new_usertype("ElementDataGrid", sol::no_constructor, + // // M + // "AddColumn", sol::resolve(&Rml::ElementDataGrid::AddColumn), + // "SetDataSource", &Rml::ElementDataGrid::SetDataSource, + + // // G + // "rows", sol::readonly_property(&getIndexedTable), + + // // B + // sol::base_classes, sol::bases() + // ); + + // lua.new_usertype("ElementDataGridRow", sol::no_constructor, + // // M + // //-- + // "RefreshRows", &Rml::ElementDataGridRow::RefreshRows, + + // // G+S + // "expanded", sol::property(&Rml::ElementDataGridRow::IsRowExpanded, [](Rml::ElementDataGridRow& self, bool expanded) { if (expanded) self.ExpandRow(); else self.CollapseRow(); }), + + // // G + // "parent_relative_index", sol::readonly_property(&Rml::ElementDataGridRow::GetParentRelativeIndex), + // "table_relative_index", sol::readonly_property(&Rml::ElementDataGridRow::GetTableRelativeIndex), + // "parent_row", sol::readonly_property(&Rml::ElementDataGridRow::GetParentRow), + // "parent_grid", sol::readonly_property(&Rml::ElementDataGridRow::GetParentGrid), + + // // B + // sol::base_classes, sol::bases() + // ); + + // //-- + // lua.new_usertype("ElementDataGridCell", sol::no_constructor, + // // G + // //-- + // "column", sol::readonly_property(&Rml::ElementDataGridCell::GetColumn), + + // // B + // sol::base_classes, sol::bases() + // ); + + /////////////////////////// + + lua.new_usertype("ElementTabSet", sol::no_constructor, + // M + "SetPanel", sol::resolve(&Rml::ElementTabSet::SetPanel), + "SetTab", sol::resolve(&Rml::ElementTabSet::SetTab), + //-- + "RemoveTab", &Rml::ElementTabSet::RemoveTab, + + // G+S + "active_tab", sol::property(&Rml::ElementTabSet::GetActiveTab, &Rml::ElementTabSet::SetActiveTab), + + // G + "num_tabs", &Rml::ElementTabSet::GetNumTabs, + + // B + sol::base_classes, sol::bases() + ); + + /////////////////////////// + + //-- + lua.new_usertype("ElementProgress", sol::no_constructor, + // G+S + //-- + "value", sol::property(&Rml::ElementProgress::GetValue, &Rml::ElementProgress::SetValue), + "max", sol::property(&Rml::ElementProgress::GetMax, &Rml::ElementProgress::SetMax), + + // B + sol::base_classes, sol::bases() + ); + } + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/bind/ElementForm.cpp b/rts/lib/RmlSolLua/src/bind/ElementForm.cpp new file mode 100644 index 0000000000..ad75e47cf1 --- /dev/null +++ b/rts/lib/RmlSolLua/src/bind/ElementForm.cpp @@ -0,0 +1,204 @@ +#include "bind.h" + +#include "plugin/SolLuaEventListener.h" + +#include + + +namespace Rml::SolLua +{ + + namespace functions + { + constexpr bool hasAttribute(auto& self, const std::string& name) + { + return self.HasAttribute(name); + } + #define HASATTRGETTER(S, N) [](S& self) { return self.HasAttribute(N); } + + // template + // T getAttributeWithDefault(auto& self, const std::string& name, T def) + // { + // auto attr = self.GetAttribute(name, def); + // return attr; + // } + // #define GETATTRGETTER(S, N, D) [](S& self) { return functions::getAttributeWithDefault(self, N, D); } + + constexpr void setAttribute(auto& self, const std::string& name, const auto& value) + { + if constexpr (std::is_same_v, bool>) + { + if (value) + self.SetAttribute(name, true); + else self.RemoveAttribute(name); + } + else + { + self.SetAttribute(name, value); + } + } + #define SETATTR(S, N, D) [](S& self, const D& value) { functions::setAttribute(self, N, value); } + } + + namespace options + { + struct SelectOptionsProxyNode + { + Rml::Element* Element; + std::string Value; + }; + + struct SelectOptionsProxy + { + SelectOptionsProxy(Rml::ElementFormControlSelect& element) : m_element(element) {} + + SelectOptionsProxyNode Get(int index) const + { + auto element = m_element.GetOption(index); + if (!element) + return SelectOptionsProxyNode{ nullptr, {} }; + + return SelectOptionsProxyNode{ .Element = element, .Value = element->GetAttribute("value", std::string{}) }; + } + + std::vector Pairs() const + { + std::vector result; + int i = 0; + while (auto element = m_element.GetOption(i++)) + { + result.push_back({ .Element = element, .Value = element->GetAttribute("value", std::string{}) }); + } + + return result; + } + + private: + Rml::ElementFormControlSelect& m_element; + }; + + auto getOptionsProxy(Rml::ElementFormControlSelect& self) + { + return SelectOptionsProxy{ self }; + } + } + + namespace submit + { + void submit(Rml::ElementForm& self) + { + self.Submit(); + } + + void submitName(Rml::ElementForm& self, const std::string& name) + { + self.Submit(name); + } + + void submitNameValue(Rml::ElementForm& self, const std::string& name, const std::string& value) + { + self.Submit(name, value); + } + } + + void bind_element_form(sol::state_view& lua) + { + + lua.new_usertype("ElementForm", sol::no_constructor, + // M + "Submit", sol::overload(&submit::submit, &submit::submitName, &submit::submitNameValue), + + // B + sol::base_classes, sol::bases() + ); + + /////////////////////////// + + lua.new_usertype("ElementFormControl", sol::no_constructor, + // G+S + "disabled", sol::property(&Rml::ElementFormControl::IsDisabled, &Rml::ElementFormControl::SetDisabled), + "name", sol::property(&Rml::ElementFormControl::GetName, &Rml::ElementFormControl::SetName), + "value", sol::property(&Rml::ElementFormControl::GetValue, &Rml::ElementFormControl::SetValue), + + // G + //-- + "submitted", sol::readonly_property(&Rml::ElementFormControl::IsSubmitted), + + // B + sol::base_classes, sol::bases() + ); + + /////////////////////////// + + // lua.new_usertype("ElementFormControlInput", sol::no_constructor, + // // G+S + // "checked", sol::property(HASATTRGETTER(Rml::ElementFormControlInput, "checked"), SETATTR(Rml::ElementFormControlInput, "checked", bool)), + // "maxlength", sol::property(GETATTRGETTER(Rml::ElementFormControlInput, "maxlength", -1), SETATTR(Rml::ElementFormControlInput, "maxlength", int)), + // "size", sol::property(GETATTRGETTER(Rml::ElementFormControlInput, "size", 20), SETATTR(Rml::ElementFormControlInput, "size", int)), + // "max", sol::property(GETATTRGETTER(Rml::ElementFormControlInput, "max", 100), SETATTR(Rml::ElementFormControlInput, "max", int)), + // "min", sol::property(GETATTRGETTER(Rml::ElementFormControlInput, "min", 0), SETATTR(Rml::ElementFormControlInput, "min", int)), + // "step", sol::property(GETATTRGETTER(Rml::ElementFormControlInput, "step", 1), SETATTR(Rml::ElementFormControlInput, "step", int)), + + // // B + // sol::base_classes, sol::bases() + // ); + + /////////////////////////// + + lua.new_usertype("SelectOptionsProxy", sol::no_constructor, + sol::meta_function::index, &options::SelectOptionsProxy::Get, + sol::meta_function::pairs, &options::SelectOptionsProxy::Pairs, + sol::meta_function::ipairs, &options::SelectOptionsProxy::Pairs + ); + + lua.new_usertype("SelectOptionsProxyNode", sol::no_constructor, + "element", &options::SelectOptionsProxyNode::Element, + "value", &options::SelectOptionsProxyNode::Value + ); + + lua.new_usertype("ElementFormControlSelect", sol::no_constructor, + // M + "Add", [](Rml::ElementFormControlSelect& self, Rml::ElementPtr& element, sol::variadic_args va) { + int before = (va.size() > 0 ? va.get() : -1); + self.Add(std::move(element), before); + return 1; + }, + "Remove", &Rml::ElementFormControlSelect::Remove, + "RemoveAll", &Rml::ElementFormControlSelect::RemoveAll, + + // G+S + "selection", sol::property(&Rml::ElementFormControlSelect::GetSelection, &Rml::ElementFormControlSelect::SetSelection), + + // G + "options", &options::getOptionsProxy, + + // B + sol::base_classes, sol::bases() + ); + + /////////////////////////// + + // lua.new_usertype("ElementFormControlDataSelect", sol::no_constructor, + // // M + // "SetDataSource", &Rml::ElementFormControlDataSelect::SetDataSource, + + // // B + // sol::base_classes, sol::bases() + // ); + + /////////////////////////// + + lua.new_usertype("ElementFormControlTextArea", sol::no_constructor, + // G+S + "cols", sol::property(&Rml::ElementFormControlTextArea::GetNumColumns, &Rml::ElementFormControlTextArea::SetNumColumns), + "maxlength", sol::property(&Rml::ElementFormControlTextArea::GetMaxLength, &Rml::ElementFormControlTextArea::SetMaxLength), + "rows", sol::property(&Rml::ElementFormControlTextArea::GetNumRows, &Rml::ElementFormControlTextArea::SetNumRows), + "wordwrap", sol::property(&Rml::ElementFormControlTextArea::SetWordWrap, &Rml::ElementFormControlTextArea::GetWordWrap), + + // B + sol::base_classes, sol::bases() + ); + + } + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/bind/Event.cpp b/rts/lib/RmlSolLua/src/bind/Event.cpp new file mode 100644 index 0000000000..fc75fb7cb8 --- /dev/null +++ b/rts/lib/RmlSolLua/src/bind/Event.cpp @@ -0,0 +1,63 @@ +#include "bind.h" + + +namespace Rml::SolLua +{ + + namespace functions + { + SolObjectMap getParameters(Rml::Event& self, sol::this_state s) + { + SolObjectMap result; + + const auto& parameters = self.GetParameters(); + for (auto& [key, value] : parameters) + { + if (self.GetId() == Rml::EventId::Tabchange && value.GetType() == Rml::Variant::INT) + { + auto object = sol::make_object(s, value.Get()); + result.insert(std::make_pair(key, object)); + } + else + { + auto object = makeObjectFromVariant(&value, s); + result.insert(std::make_pair(key, object)); + } + } + + return result; + } + } + + void bind_event(sol::state_view& lua) + { + //-- + lua.new_enum("RmlEventPhase", + "None", Rml::EventPhase::None, + "Capture", Rml::EventPhase::Capture, + "Target", Rml::EventPhase::Target, + "Bubble", Rml::EventPhase::Bubble + ); + + lua.new_usertype("Event", sol::no_constructor, + // M + "StopPropagation", &Rml::Event::StopPropagation, + //-- + "StopImmediatePropagation", &Rml::Event::StopImmediatePropagation, + + // G+S + + // G + "current_element", sol::readonly_property(&Rml::Event::GetCurrentElement), + "type", sol::readonly_property(&Rml::Event::GetType), + "target_element", sol::readonly_property(&Rml::Event::GetTargetElement), + "parameters", sol::readonly_property(&functions::getParameters), + //-- + "event_phase", sol::readonly_property(&Rml::Event::GetPhase), + "interruptible", sol::readonly_property(&Rml::Event::IsInterruptible), + "propagating", sol::readonly_property(&Rml::Event::IsPropagating), + "immediate_propagating", sol::readonly_property(&Rml::Event::IsImmediatePropagating) + ); + } + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/bind/Global.cpp b/rts/lib/RmlSolLua/src/bind/Global.cpp new file mode 100644 index 0000000000..ebc1e0b998 --- /dev/null +++ b/rts/lib/RmlSolLua/src/bind/Global.cpp @@ -0,0 +1,285 @@ +#include "bind.h" + + +namespace Rml::SolLua +{ + + namespace functions + { + auto getContext() + { + std::function result = [](int idx) { return Rml::GetContext(idx); }; + return result; + } + + auto getMaxContexts() + { + std::function result = []() { return Rml::GetNumContexts(); }; + return result; + } + + auto loadFontFace1(const Rml::String& file) + { + return Rml::LoadFontFace(file); + } + + auto loadFontFace2(const Rml::String& file, bool fallback) + { + return Rml::LoadFontFace(file, fallback); + } + + auto loadFontFace3(const Rml::String& file, bool fallback, Rml::Style::FontWeight weight) + { + return Rml::LoadFontFace(file, fallback, weight); + } + + auto registerEventType4(const Rml::String& type, bool interruptible, bool bubbles, Rml::DefaultActionPhase default_action_phase) + { + return Rml::RegisterEventType(type, interruptible, bubbles, default_action_phase); + } + + auto registerEventType3(const Rml::String& type, bool interruptible, bool bubbles) + { + return Rml::RegisterEventType(type, interruptible, bubbles, Rml::DefaultActionPhase::None); + } + } + + #define _ENUM(N) lua["RmlKeyIdentifier"][#N] = Rml::Input::KI_##N + + void bind_global(sol::state_view& lua) + { + + // We can't make this into an enum. + // The compiler can't handle everything under one call. + //lua.new_enum("RmlKeyIdentifier"); + lua.create_named_table("RmlKeyIdentifier"); + _ENUM(UNKNOWN); + _ENUM(SPACE); + _ENUM(0); + _ENUM(1); + _ENUM(2); + _ENUM(3); + _ENUM(4); + _ENUM(5); + _ENUM(6); + _ENUM(7); + _ENUM(8); + _ENUM(9); + _ENUM(A); + _ENUM(B); + _ENUM(C); + _ENUM(D); + _ENUM(E); + _ENUM(F); + _ENUM(G); + _ENUM(H); + _ENUM(I); + _ENUM(J); + _ENUM(K); + _ENUM(L); + _ENUM(M); + _ENUM(N); + _ENUM(O); + _ENUM(P); + _ENUM(Q); + _ENUM(R); + _ENUM(S); + _ENUM(T); + _ENUM(U); + _ENUM(V); + _ENUM(W); + _ENUM(X); + _ENUM(Y); + _ENUM(Z); + _ENUM(OEM_1); + _ENUM(OEM_PLUS); + _ENUM(OEM_COMMA); + _ENUM(OEM_MINUS); + _ENUM(OEM_PERIOD); + _ENUM(OEM_2); + _ENUM(OEM_3); + _ENUM(OEM_4); + _ENUM(OEM_5); + _ENUM(OEM_6); + _ENUM(OEM_7); + _ENUM(OEM_8); + _ENUM(OEM_102); + _ENUM(NUMPAD0); + _ENUM(NUMPAD1); + _ENUM(NUMPAD2); + _ENUM(NUMPAD3); + _ENUM(NUMPAD4); + _ENUM(NUMPAD5); + _ENUM(NUMPAD6); + _ENUM(NUMPAD7); + _ENUM(NUMPAD8); + _ENUM(NUMPAD9); + _ENUM(NUMPADENTER); + _ENUM(MULTIPLY); + _ENUM(ADD); + _ENUM(SEPARATOR); + _ENUM(SUBTRACT); + _ENUM(DECIMAL); + _ENUM(DIVIDE); + _ENUM(OEM_NEC_EQUAL); + _ENUM(BACK); + _ENUM(TAB); + _ENUM(CLEAR); + _ENUM(RETURN); + _ENUM(PAUSE); + _ENUM(CAPITAL); + _ENUM(KANA); + _ENUM(HANGUL); + _ENUM(JUNJA); + _ENUM(FINAL); + _ENUM(HANJA); + _ENUM(KANJI); + _ENUM(ESCAPE); + _ENUM(CONVERT); + _ENUM(NONCONVERT); + _ENUM(ACCEPT); + _ENUM(MODECHANGE); + _ENUM(PRIOR); + _ENUM(NEXT); + _ENUM(END); + _ENUM(HOME); + _ENUM(LEFT); + _ENUM(UP); + _ENUM(RIGHT); + _ENUM(DOWN); + _ENUM(SELECT); + _ENUM(PRINT); + _ENUM(EXECUTE); + _ENUM(SNAPSHOT); + _ENUM(INSERT); + _ENUM(DELETE); + _ENUM(HELP); + _ENUM(LWIN); + _ENUM(RWIN); + _ENUM(APPS); + _ENUM(POWER); + _ENUM(SLEEP); + _ENUM(WAKE); + _ENUM(F1); + _ENUM(F2); + _ENUM(F3); + _ENUM(F4); + _ENUM(F5); + _ENUM(F6); + _ENUM(F7); + _ENUM(F8); + _ENUM(F9); + _ENUM(F10); + _ENUM(F11); + _ENUM(F12); + _ENUM(F13); + _ENUM(F14); + _ENUM(F15); + _ENUM(F16); + _ENUM(F17); + _ENUM(F18); + _ENUM(F19); + _ENUM(F20); + _ENUM(F21); + _ENUM(F22); + _ENUM(F23); + _ENUM(F24); + _ENUM(NUMLOCK); + _ENUM(SCROLL); + _ENUM(OEM_FJ_JISHO); + _ENUM(OEM_FJ_MASSHOU); + _ENUM(OEM_FJ_TOUROKU); + _ENUM(OEM_FJ_LOYA); + _ENUM(OEM_FJ_ROYA); + _ENUM(LSHIFT); + _ENUM(RSHIFT); + _ENUM(LCONTROL); + _ENUM(RCONTROL); + _ENUM(LMENU); + _ENUM(RMENU); + _ENUM(BROWSER_BACK); + _ENUM(BROWSER_FORWARD); + _ENUM(BROWSER_REFRESH); + _ENUM(BROWSER_STOP); + _ENUM(BROWSER_SEARCH); + _ENUM(BROWSER_FAVORITES); + _ENUM(BROWSER_HOME); + _ENUM(VOLUME_MUTE); + _ENUM(VOLUME_DOWN); + _ENUM(VOLUME_UP); + _ENUM(MEDIA_NEXT_TRACK); + _ENUM(MEDIA_PREV_TRACK); + _ENUM(MEDIA_STOP); + _ENUM(MEDIA_PLAY_PAUSE); + _ENUM(LAUNCH_MAIL); + _ENUM(LAUNCH_MEDIA_SELECT); + _ENUM(LAUNCH_APP1); + _ENUM(LAUNCH_APP2); + _ENUM(OEM_AX); + _ENUM(ICO_HELP); + _ENUM(ICO_00); + _ENUM(PROCESSKEY); + _ENUM(ICO_CLEAR); + _ENUM(ATTN); + _ENUM(CRSEL); + _ENUM(EXSEL); + _ENUM(EREOF); + _ENUM(PLAY); + _ENUM(ZOOM); + _ENUM(PA1); + _ENUM(OEM_CLEAR); + + lua.new_enum("RmlKeyModifier", { + { "CTRL", Rml::Input::KM_CTRL }, + { "SHIFT", Rml::Input::KM_SHIFT }, + { "ALT", Rml::Input::KM_ALT }, + { "META", Rml::Input::KM_META }, + { "CAPSLOCK", Rml::Input::KM_CAPSLOCK }, + { "NUMLOCK", Rml::Input::KM_NUMLOCK }, + { "SCROLLLOCK", Rml::Input::KM_SCROLLLOCK } + }); + + //-- + lua.new_enum("RmlFontWeight", { + { "Auto", Rml::Style::FontWeight::Auto }, + { "Normal", Rml::Style::FontWeight::Normal }, + { "Bold", Rml::Style::FontWeight::Bold } + }); + + lua.new_enum("RmlDefaultActionPhase", { + { "None", Rml::DefaultActionPhase::None }, + { "Target", Rml::DefaultActionPhase::Target }, + { "TargetAndBubble", Rml::DefaultActionPhase::TargetAndBubble } + }); + + struct rmlui {}; + + auto g = lua.new_usertype("rmlui", + // M + "CreateContext", &Rml::CreateContext, + "LoadFontFace", sol::overload( + &functions::loadFontFace1, + &functions::loadFontFace2, + &functions::loadFontFace3 + ), + //"RegisterTag", + //-- + "GetContext", sol::resolve(&Rml::GetContext), + "RegisterEventType", sol::overload(&functions::registerEventType4, &functions::registerEventType3), + + // G + "contexts", sol::readonly_property(&getIndexedTable), + //-- + "version", sol::readonly_property(&Rml::GetVersion) + ); + g.set("key_identifier", sol::readonly_property([&lua] { return lua["RmlKeyIdentifier"]; })); + g.set("key_modifier", sol::readonly_property([&lua] { return lua["RmlKeyModifier"]; })); + //-- + g.set("font_weight", sol::readonly_property([&lua] { return lua["RmlFontWeight"]; })); + g.set("default_action_phase", sol::readonly_property([&lua] { return lua["RmlDefaultActionPhase"]; })); + + } + + #undef _ENUM + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/bind/Log.cpp b/rts/lib/RmlSolLua/src/bind/Log.cpp new file mode 100644 index 0000000000..d57c25a711 --- /dev/null +++ b/rts/lib/RmlSolLua/src/bind/Log.cpp @@ -0,0 +1,29 @@ +#include "bind.h" + + +namespace Rml::SolLua +{ + + void bind_log(sol::state_view& lua) + { + lua.new_enum("RmlLogType", + { + { "always", Rml::Log::LT_ALWAYS }, + { "error", Rml::Log::LT_ERROR }, + { "warning", Rml::Log::LT_WARNING }, + { "info", Rml::Log::LT_INFO }, + { "debug", Rml::Log::LT_DEBUG } + } + ); + + // Log.logtype.always + // Log.Message(Log.logtype.error, "This is an error.") + auto log = lua.create_named_table("Log"); + log["logtype"] = lua["RmlLogType"]; + log.set_function("Message", [](Rml::Log::Type type, const std::string& message) { Log::Message(type, "%s", message.c_str()); }); + + // print("Text") + lua.set_function("print", [](const std::string& message) { Log::Message(Rml::Log::LT_INFO, "%s", message.c_str()); }); + } + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/bind/Vector.cpp b/rts/lib/RmlSolLua/src/bind/Vector.cpp new file mode 100644 index 0000000000..52c4f2bdd4 --- /dev/null +++ b/rts/lib/RmlSolLua/src/bind/Vector.cpp @@ -0,0 +1,54 @@ +#include "bind.h" + + +namespace Rml::SolLua +{ + + void bind_vector(sol::state_view& lua) + { + lua.new_usertype("Vector2i", sol::constructors(), + // O + sol::meta_function::addition, &Rml::Vector2i::operator+, + sol::meta_function::subtraction, sol::resolve(&Rml::Vector2i::operator-), + sol::meta_function::multiplication, sol::overload( + sol::resolve(&Rml::Vector2i::operator*), + sol::resolve(&Rml::Vector2i::operator*) + ), + sol::meta_function::division, sol::overload( + sol::resolve(&Rml::Vector2i::operator/), + sol::resolve(&Rml::Vector2i::operator/) + ), + sol::meta_function::unary_minus, sol::resolve(&Rml::Vector2i::operator-), + + // G+S + "x", &Rml::Vector2i::x, + "y", &Rml::Vector2i::y, + + // G + "magnitude", &Rml::Vector2i::Magnitude + ); + + lua.new_usertype("Vector2f", sol::constructors(), + // O + sol::meta_function::addition, &Rml::Vector2f::operator+, + sol::meta_function::subtraction, sol::resolve(&Rml::Vector2f::operator-), + sol::meta_function::multiplication, sol::overload( + sol::resolve(&Rml::Vector2f::operator*), + sol::resolve(&Rml::Vector2f::operator*) + ), + sol::meta_function::division, sol::overload( + sol::resolve(&Rml::Vector2f::operator/), + sol::resolve(&Rml::Vector2f::operator/) + ), + sol::meta_function::unary_minus, sol::resolve(&Rml::Vector2f::operator-), + + // G+S + "x", &Rml::Vector2f::x, + "y", &Rml::Vector2f::y, + + // G + "magnitude", &Rml::Vector2f::Magnitude + ); + } + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/bind/bind.cpp b/rts/lib/RmlSolLua/src/bind/bind.cpp new file mode 100644 index 0000000000..5a35d375b3 --- /dev/null +++ b/rts/lib/RmlSolLua/src/bind/bind.cpp @@ -0,0 +1,47 @@ +#include "bind.h" + +#include + + +namespace Rml::SolLua +{ + + sol::object makeObjectFromVariant(const Rml::Variant* variant, sol::state_view s) + { + if (!variant) return sol::make_object(s, sol::nil); + + switch (variant->GetType()) + { + case Rml::Variant::BOOL: + return sol::make_object(s, variant->Get()); + case Rml::Variant::BYTE: + case Rml::Variant::CHAR: + case Rml::Variant::INT: + return sol::make_object(s, variant->Get()); + case Rml::Variant::INT64: + return sol::make_object(s, variant->Get()); + case Rml::Variant::UINT: + return sol::make_object(s, variant->Get()); + case Rml::Variant::UINT64: + return sol::make_object(s, variant->Get()); + case Rml::Variant::FLOAT: + case Rml::Variant::DOUBLE: + return sol::make_object(s, variant->Get()); + case Rml::Variant::COLOURB: + return sol::make_object_userdata(s, variant->Get()); + case Rml::Variant::COLOURF: + return sol::make_object_userdata(s, variant->Get()); + case Rml::Variant::STRING: + return sol::make_object(s, variant->GetReference()); + case Rml::Variant::VECTOR2: + return sol::make_object_userdata(s, variant->Get()); + case Rml::Variant::VOIDPTR: + return sol::make_object(s, variant->Get()); + default: + return sol::make_object(s, sol::nil); + } + + return sol::make_object(s, sol::nil); + } + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/bind/bind.h b/rts/lib/RmlSolLua/src/bind/bind.h new file mode 100644 index 0000000000..9c208138b3 --- /dev/null +++ b/rts/lib/RmlSolLua/src/bind/bind.h @@ -0,0 +1,203 @@ +#pragma once + +#include +#include + +#include + + +#ifndef RMLUI_NO_THIRDPARTY_CONTAINERS +template +struct sol::is_container> : std::true_type {}; + +template +struct sol::is_container> : std::true_type {}; + +template +struct sol::is_container> : std::true_type {}; + +template +struct sol::is_container> : std::true_type {}; + +//template +//struct sol::is_container> : std::true_type {}; + +template <> +struct sol::is_container : std::true_type {}; +#endif + + +namespace Rml::SolLua +{ + + sol::object makeObjectFromVariant(const Rml::Variant* variant, sol::state_view s); + using SolObjectMap = std::unordered_map; + +} // end namespace Rml::SolLua + + +namespace Rml::SolLua +{ + + /// + /// Constructs an iterator that can be used with sol::as_table() to return an integer indexed table. + /// + /// The type of Rml::Element we are using for iteration. + template + struct TableIndexedIterator + { + struct Iter + { + using iterator_category = std::forward_iterator_tag; + using difference_type = std::ptrdiff_t; + using value_type = T*; + using pointer = T**; + using reference = T*&; + + Iter(const TableIndexedIterator* owner, int pos) + : m_owner{ owner }, m_pos{ pos } + {} + + auto operator++() const + { + m_pos = std::min(++m_pos, m_owner->m_func_max()); + return *this; + } + + auto operator++(int) const + { + auto cur_pos = m_pos; + m_pos = std::min(++m_pos, m_owner->m_func_max()); + return *this; + } + + auto operator==(const Iter& other) const + { + auto max = m_owner->m_func_max(); + auto my_pos = std::min(m_pos, max); + auto other_pos = std::min(other.m_pos, max); + return my_pos == other_pos; + } + auto operator!=(const Iter& other) const + { + return !(*this == other); + } + + auto operator*() const + { + return m_owner->m_func_get(m_pos); + } + + private: + const TableIndexedIterator* m_owner; + mutable int m_pos = 0; + }; + + /// + /// Constructs the iterator. + /// + /// The element we are pulling data from. + /// The function to get new data (ex: Rml::Element::GetChild). Must be of type std::function. + /// The function to get the max number of items (ex: Rml::Element::GetNumChildren). Must be of type std::function. + TableIndexedIterator(std::function get, std::function max) + : m_func_get{ get }, m_func_max{ max } + { + assert((m_func_get) && (m_func_max)); + } + + Iter begin() const + { + Iter it(this, 0); + return it; + } + + Iter end() const + { + Iter it(this, m_func_max()); + return it; + } + + int size() const + { + return m_func_max(); + } + + friend Iter; + + private: + std::function m_func_get; + std::function m_func_max; + }; + + template + sol::as_table_t> getIndexedTable(S& self) + { + std::function get; + if constexpr (std::is_member_function_pointer_v) + { + // Straight member function pointer like Rml::Element::GetChild. + get = std::bind(G, &self, std::placeholders::_1); + } + else + { + // A helper function to convert the normal getter to type std::function. + auto f = std::invoke(G, self); + get = f; + } + + std::function max; + if constexpr (std::is_member_function_pointer_v) + { + // Straight member function pointer like Rml::Element::GetNumChildren. + max = std::bind(M, &self); + } + else + { + // A helper function to convert the normal getter to type std::function. + auto f = std::invoke(M, self); + max = f; + } + + TableIndexedIterator result{ get, max }; + return sol::as_table(result); + } + + template + sol::as_table_t> getIndexedTable() + { + std::function get; + std::function max; + + // A helper function to convert the normal getter to type std::function. + auto fget = std::invoke(G); + get = fget; + + // A helper function to convert the normal getter to type std::function. + auto fmax = std::invoke(M); + max = fmax; + + TableIndexedIterator result{ get, max }; + return sol::as_table(result); + } + +} // end namespace Rml::SolLua + + +namespace Rml::SolLua +{ + + // Called from RmlSolLua.cpp + void bind_color(sol::state_view& lua); + void bind_context(sol::state_view& lua); + void bind_datamodel(sol::state_view& lua); + void bind_document(sol::state_view& lua); + void bind_element(sol::state_view& lua); + void bind_element_derived(sol::state_view& lua); + void bind_element_form(sol::state_view& lua); + void bind_event(sol::state_view& lua); + void bind_global(sol::state_view& lua); + void bind_log(sol::state_view& lua); + void bind_vector(sol::state_view& lua); + void bind_convert(sol::state_view& lua); + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaDataModel.cpp b/rts/lib/RmlSolLua/src/plugin/SolLuaDataModel.cpp new file mode 100644 index 0000000000..7353c14715 --- /dev/null +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaDataModel.cpp @@ -0,0 +1,128 @@ +#include "SolLuaDataModel.h" + +#include + + +namespace Rml::SolLua +{ + + SolLuaObjectDef::SolLuaObjectDef(SolLuaDataModel* model) + : VariableDefinition(DataVariableType::Scalar), m_model(model) + { + } + + bool SolLuaObjectDef::Get(void* ptr, Rml::Variant& variant) + { + auto obj = static_cast(ptr); + + if (obj->is()) + variant = obj->as(); + else if (obj->is()) + variant = obj->as(); + else if (obj->is()) + variant = obj->as(); + else if (obj->is()) + variant = obj->as(); + else if (obj->is()) + variant = obj->as(); + else if (obj->is()) + variant = obj->as(); + else if (obj->is()) + variant = obj->as(); + else // if (obj->get_type() == sol::type::lua_nil) + variant = Rml::Variant{}; + + return true; + } + + bool SolLuaObjectDef::Set(void* ptr, const Rml::Variant& variant) + { + auto obj = static_cast(ptr); + + if (obj->is()) + variant.GetInto(*static_cast(ptr)); + else if (obj->is()) + variant.GetInto(*static_cast(ptr)); + else if (obj->is()) + variant.GetInto(*static_cast(ptr)); + else if (obj->is()) + variant.GetInto(*static_cast(ptr)); + else if (obj->is()) + variant.GetInto(*static_cast(ptr)); + else if (obj->is()) + variant.GetInto(*static_cast(ptr)); + else if (obj->is()) + variant.GetInto(*static_cast(ptr)); + else // if (obj->get_type() == sol::type::lua_nil) + *obj = sol::make_object(m_model->Lua, sol::nil); + + return true; + } + + int SolLuaObjectDef::Size(void* ptr) + { + // Non-table types are 1 entry long. + auto object = static_cast(ptr); + if (object->get_type() != sol::type::table) + return 1; + + auto t = object->as(); + return static_cast(t.size()); + } + + DataVariable SolLuaObjectDef::Child(void* ptr, const Rml::DataAddressEntry& address) + { + // Child should be called on a table. + auto object = static_cast(ptr); + if (object->get_type() != sol::type::table) + return DataVariable{}; + + // Get our table object. + // Get the pointer as a string for use with holding onto the object. + auto table = object->as(); + std::string tablestr = std::to_string(reinterpret_cast(table.pointer())); + + // Accessing by name. + if (address.index == -1) + { + // Try to get the object. + auto e = table.get(address.name); + if (e.get_type() == sol::type::lua_nil) + return DataVariable{}; + + // Hold a reference to it and return the pointer. + auto it = m_model->ObjectList.insert_or_assign(tablestr + "_" + std::to_string(address.index), e); + return DataVariable{ m_model->ObjectDef.get(), &(it.first->second) }; + } + // Accessing by index. + else + { + // See if we have a key with the index. + auto has_index = table.get(address.index); + if (has_index.get_type() != sol::type::lua_nil) + { + auto it = m_model->ObjectList.insert_or_assign(tablestr + "_" + std::to_string(address.index), has_index); + return DataVariable{ m_model->ObjectDef.get(), &(it.first->second) }; + } + + // Iterate through the entries and grab the nth entry. + int idx = 0; + for (auto& [k, v] : table.pairs()) + { + if (idx == address.index) + { + auto it = m_model->ObjectList.insert_or_assign(tablestr + "_" + std::to_string(idx), v); + return DataVariable{ m_model->ObjectDef.get(), &(it.first->second) }; + } + ++idx; + } + + // Index out of range. + return DataVariable{}; + } + + // Failure. + return DataVariable{}; + } + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaDataModel.h b/rts/lib/RmlSolLua/src/plugin/SolLuaDataModel.h new file mode 100644 index 0000000000..0e712d57df --- /dev/null +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaDataModel.h @@ -0,0 +1,45 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include + +#include + + +namespace Rml::SolLua +{ + class SolLuaObjectDef; + + struct SolLuaDataModel + { + SolLuaDataModel(sol::state_view s) : Lua{ s } {} + + Rml::DataModelConstructor Constructor; + Rml::DataModelHandle Handle; + sol::state_view Lua; + std::unique_ptr ObjectDef; + + // sol data types are reference counted. Hold onto them as we use them. + sol::table Table; + std::unordered_map ObjectList; + }; + + class SolLuaObjectDef final : public Rml::VariableDefinition + { + public: + SolLuaObjectDef(SolLuaDataModel* model); + bool Get(void* ptr, Rml::Variant& variant) override; + bool Set(void* ptr, const Rml::Variant& variant) override; + int Size(void* ptr) override; + DataVariable Child(void* ptr, const Rml::DataAddressEntry& address) override; + protected: + SolLuaDataModel* m_model; + sol::object m_object; + }; + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaDocument.cpp b/rts/lib/RmlSolLua/src/plugin/SolLuaDocument.cpp new file mode 100644 index 0000000000..c258392c2d --- /dev/null +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaDocument.cpp @@ -0,0 +1,64 @@ +#include "SolLuaDocument.h" + +#include +#include +#include + + +namespace Rml::SolLua +{ + + sol::protected_function_result ErrorHandler(lua_State*, sol::protected_function_result pfr) + { + if (!pfr.valid()) + { + sol::error err = pfr; + Rml::Log::Message(Rml::Log::LT_ERROR, "[LUA][ERROR] %s", err.what()); + } + return pfr; + } + + //----------------------------------------------------- + + SolLuaDocument::SolLuaDocument(sol::state_view state, const Rml::String& tag, const Rml::String& lua_env_identifier) + : m_state(state), ElementDocument(tag), m_environment(state, sol::create, state.globals()), m_lua_env_identifier(lua_env_identifier) + { + } + + void SolLuaDocument::LoadInlineScript(const Rml::String& content, const Rml::String& source_path, int source_line) + { + auto* context = GetContext(); + + Rml::String buffer{ "--" }; + buffer.append("["); + buffer.append(context->GetName()); + buffer.append("]["); + buffer.append(GetSourceURL()); + buffer.append("]:"); + buffer.append(Rml::ToString(source_line)); + buffer.append("\n"); + buffer.append(content); + + if (!m_lua_env_identifier.empty()) + m_environment[m_lua_env_identifier] = GetId(); + + m_state.safe_script(buffer, m_environment, ErrorHandler); + } + + void SolLuaDocument::LoadExternalScript(const String& source_path) + { + if (!m_lua_env_identifier.empty()) + m_environment[m_lua_env_identifier] = GetId(); + + m_state.safe_script_file(source_path, m_environment, ErrorHandler); + } + + sol::protected_function_result SolLuaDocument::RunLuaScript(const Rml::String& script) + { + if (!m_lua_env_identifier.empty()) + m_environment[m_lua_env_identifier] = GetId(); + + return m_state.safe_script(script, m_environment, ErrorHandler); + } + +} // namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaDocument.h b/rts/lib/RmlSolLua/src/plugin/SolLuaDocument.h new file mode 100644 index 0000000000..debbd1e7b2 --- /dev/null +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaDocument.h @@ -0,0 +1,68 @@ +#pragma once + +#include + +#include + + +namespace Rml::SolLua +{ + /// + /// Lua error handler. + /// + /// (Unused) Lua state. + /// The result that holds our error. + /// The error result. + sol::protected_function_result ErrorHandler(lua_State*, sol::protected_function_result pfr); + + + class SolLuaDocument : public ::Rml::ElementDocument + { + public: + /// + /// Construct the SolLuaDocument. + /// + /// The Lua state to register into. + /// The document tag (body). + SolLuaDocument(sol::state_view state, const Rml::String& tag, const Rml::String& lua_env_identifier); + + /// + /// Loads an inline script. + /// + /// The UI context. + /// Source path. + /// Source line. + void LoadInlineScript(const Rml::String& content, const Rml::String& source_path, int source_line) override; + + /// + /// Loads a script from a file. + /// + /// The file to load. + void LoadExternalScript(const Rml::String& source_path) override; + + /// + /// Runs a piece of Lua script within the environment with our error handler. + /// + /// The script to run. + /// The result of the script. + sol::protected_function_result RunLuaScript(const Rml::String& script); + + /// + /// Gets the Lua environment attached to this document. + /// + /// A reference to the Lua environment. + sol::environment& GetLuaEnvironment() { return m_environment; } + + /// + /// Gets the Lua environment identifier attached to this document. + /// + /// A const reference to the Lua environment identifier. + const Rml::String& GetLuaEnvironmentIdentifier() const { return m_lua_env_identifier; } + + protected: + sol::state_view m_state; + sol::environment m_environment; + Rml::String m_lua_env_identifier; + }; + +} // namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaEventListener.cpp b/rts/lib/RmlSolLua/src/plugin/SolLuaEventListener.cpp new file mode 100644 index 0000000000..63f9ef4fb3 --- /dev/null +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaEventListener.cpp @@ -0,0 +1,114 @@ +#include "SolLuaEventListener.h" + +#include "plugin/SolLuaDocument.h" + +#include +#include +#include +#include + +#include +//#include + + +namespace Rml::SolLua +{ + + SolLuaEventListener::SolLuaEventListener(sol::state_view& lua, const Rml::String& code, Rml::Element* element) + : m_element(element) + { + if (element == nullptr) + return; + + auto* context = element->GetContext(); + auto* document = element->GetOwnerDocument(); + + // Wrap our code so we pass event, element, and document. + //auto f = std::format("return function (event,element,document) {} end", code); + Rml::String f{ "--" }; + if (context != nullptr) + { + f.append("["); + f.append(context->GetName()); + f.append("]"); + } + if (document != nullptr) + { + f.append("["); + f.append(document->GetSourceURL()); + f.append("]"); + } + + if (f.size() != 2) + f.append(" "); + + f.append(element->GetTagName()); + if (const auto& id = element->GetId(); !id.empty()) + { + f.append("#"); + f.append(id); + } + if (auto classes = element->GetClassNames(); !classes.empty()) + { + f.append("."); + std::replace(classes.begin(), classes.end(), ' ', '.'); + f.append(classes); + } + + f.append("\n"); + f.append("return function (event,element,document) "); + f.append(code); + f.append(" end"); + + // Run the script and get our function to call. + // We would have liked to call SolLuaDocument::RunLuaScript, but we don't know our owner_document at this point! + // Just get the function now. When we process the event, we will move it to the environment. + auto result = lua.safe_script(f, ErrorHandler); + if (result.valid()) + { + auto obj = result.get(); + if (obj.get_type() == sol::type::function) + { + auto func = obj.as(); + m_func = func; + } + else + { + Log::Message(Log::LT_ERROR, "[LUA][ERROR] A function wasn't returned for the event listener."); + } + } + } + + SolLuaEventListener::SolLuaEventListener(sol::protected_function func, Rml::Element* element) + : m_func(func), m_element(element) + { + } + + void SolLuaEventListener::OnDetach(Rml::Element* element) + { + delete this; + } + + void SolLuaEventListener::ProcessEvent(Rml::Event& event) + { + auto document = dynamic_cast(m_element->GetOwnerDocument()); + if (document != nullptr && m_func.valid()) + { + auto& env = document->GetLuaEnvironment(); + const auto& ident = document->GetLuaEnvironmentIdentifier(); + + // Move our event into the Lua environment. + sol::set_environment(env, m_func); + + // If we have an identifier, set it now. + if (!ident.empty()) + env.set(ident, document->GetId()); + + // Call the event! + auto result = m_func.call(event, m_element, document); + if (!result.valid()) + ErrorHandler(m_func.lua_state(), std::move(result)); + } + } + +} // namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaEventListener.h b/rts/lib/RmlSolLua/src/plugin/SolLuaEventListener.h new file mode 100644 index 0000000000..98cbc47cd7 --- /dev/null +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaEventListener.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include +#include + + +namespace Rml +{ + class Element; + class ElementDocument; +} + +namespace Rml::SolLua +{ + class SolLuaEventListener : public ::Rml::EventListener + { + public: + SolLuaEventListener(sol::state_view& lua, const Rml::String& code, Rml::Element* element); + SolLuaEventListener(sol::protected_function func, Rml::Element* element); + + void OnDetach(Rml::Element* element) override; + void ProcessEvent(Rml::Event& event) override; + + private: + sol::protected_function m_func; + Rml::Element* m_element; + }; + +} // namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaInstancer.cpp b/rts/lib/RmlSolLua/src/plugin/SolLuaInstancer.cpp new file mode 100644 index 0000000000..18f71e18eb --- /dev/null +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaInstancer.cpp @@ -0,0 +1,26 @@ +#include "SolLuaInstancer.h" + +#include "SolLuaDocument.h" +#include "SolLuaEventListener.h" + + +namespace Rml::SolLua +{ + + ElementPtr SolLuaDocumentElementInstancer::InstanceElement(Element* parent, const String& tag, const XMLAttributes& attributes) + { + return ElementPtr(new SolLuaDocument(m_state, tag, m_lua_env_identifier)); + } + + void SolLuaDocumentElementInstancer::ReleaseElement(Element* element) + { + delete element; + } + + + EventListener* SolLuaEventListenerInstancer::InstanceEventListener(const String& value, Element* element) + { + return new SolLuaEventListener(m_state, value, element); + } + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaInstancer.h b/rts/lib/RmlSolLua/src/plugin/SolLuaInstancer.h new file mode 100644 index 0000000000..2c38479672 --- /dev/null +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaInstancer.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include + +#include + + +namespace Rml::SolLua +{ + + class SolLuaDocumentElementInstancer : public ::Rml::ElementInstancer + { + public: + SolLuaDocumentElementInstancer(sol::state_view state, const Rml::String& lua_env_identifier) : m_state{ state }, m_lua_env_identifier{ lua_env_identifier } {} + ElementPtr InstanceElement(Element* parent, const String& tag, const XMLAttributes& attributes) override; + void ReleaseElement(Element* element) override; + protected: + sol::state_view m_state; + Rml::String m_lua_env_identifier; + }; + + class SolLuaEventListenerInstancer : public ::Rml::EventListenerInstancer + { + public: + SolLuaEventListenerInstancer(sol::state_view state) : m_state{ state } {} + EventListener* InstanceEventListener(const String& value, Element* element) override; + protected: + sol::state_view m_state; + }; + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp new file mode 100644 index 0000000000..65d700e4b5 --- /dev/null +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp @@ -0,0 +1,50 @@ +#include "SolLuaPlugin.h" + +#include "SolLuaInstancer.h" + +#include "bind/bind.h" + + + +namespace Rml::SolLua +{ + + SolLuaPlugin::SolLuaPlugin(sol::state_view lua_state) + : m_lua_state{ lua_state } + { + } + + SolLuaPlugin::SolLuaPlugin(sol::state_view lua_state, const Rml::String& lua_environment_identifier) + : m_lua_state{ lua_state }, m_lua_env_identifier{ lua_environment_identifier } + { + } + + int SolLuaPlugin::GetEventClasses() + { + return EVT_BASIC; + } + + void SolLuaPlugin::OnInitialise() + { + document_element_instancer = std::make_unique(m_lua_state, m_lua_env_identifier); + event_listener_instancer = std::make_unique(m_lua_state); + Factory::RegisterElementInstancer("body", document_element_instancer.get()); + Factory::RegisterEventListenerInstancer(event_listener_instancer.get()); + } + + void SolLuaPlugin::OnShutdown() + { + m_lua_state.collect_garbage(); + delete this; + } + + void SolLuaPlugin::OnElementCreate(Element* element) + { + } + + void SolLuaPlugin::OnElementDestroy(Element* element) + { + //TODO: need to do something? + } + +} // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.h b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.h new file mode 100644 index 0000000000..1d44d149e8 --- /dev/null +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.h @@ -0,0 +1,43 @@ +// RmlSolLua.h : Include file for standard system include files, +// or project specific include files. + +#pragma once + +#include "../RmlSolLua.h" + +#include +#include +#include +#include + +#include + + +namespace Rml::SolLua +{ + + class SolLuaDocumentElementInstancer; + class SolLuaEventListenerInstancer; + + class RMLUILUA_API SolLuaPlugin : public Plugin + { + public: + SolLuaPlugin(sol::state_view lua_state); + SolLuaPlugin(sol::state_view lua_state, const Rml::String& lua_environment_identifier); + + private: + int GetEventClasses() override; + + void OnInitialise() override; + void OnShutdown() override; + + std::unique_ptr document_element_instancer; + std::unique_ptr event_listener_instancer; + void OnElementCreate(Element* element); + void OnElementDestroy(Element* element); + + sol::state_view m_lua_state; + Rml::String m_lua_env_identifier; + }; + +} // end namespace Rml::SolLua From 51331975ade04438cfed31790e579712b90120df Mon Sep 17 00:00:00 2001 From: loveridge Date: Fri, 6 Oct 2023 11:55:52 -0700 Subject: [PATCH 06/58] rmlui reload support and better luaui integration --- cont/{RmlUi/demo => LuaUI/Rml}/LICENSE.txt | 0 .../demo => LuaUI/Rml}/LatoLatin-Bold.ttf | Bin .../Rml}/LatoLatin-BoldItalic.ttf | Bin .../demo => LuaUI/Rml}/LatoLatin-Italic.ttf | Bin .../demo => LuaUI/Rml}/LatoLatin-Regular.ttf | Bin .../demo => LuaUI/Rml}/NotoEmoji-Regular.ttf | Bin .../{RmlUi/demo => LuaUI/Rml}/alien_small.tga | Bin cont/{RmlUi/demo => LuaUI/Rml}/demo.rml | 0 .../{RmlUi/demo => LuaUI/Rml}/hello_world.png | Bin .../Rml}/high_scores_alien_1.tga | Bin .../Rml}/high_scores_alien_2.tga | Bin .../Rml}/high_scores_alien_3.tga | Bin .../Rml}/high_scores_defender.tga | Bin cont/{RmlUi/demo => LuaUI/Rml}/invader.rcss | 0 cont/{RmlUi/demo => LuaUI/Rml}/invader.tga | Bin cont/{RmlUi/demo => LuaUI/Rml}/present.tga | Bin cont/{RmlUi/demo => LuaUI/Rml}/rml.rcss | 0 cont/LuaUI/Rml/test.rml | 23 ++ cont/{RmlUi/demo => LuaUI/Rml}/window.rml | 0 cont/RmlUi/demo/test.rml | 27 -- rts/Game/Game.cpp | 5 +- rts/Game/UI/GuiHandler.cpp | 2 + rts/Lua/LuaUI.cpp | 1 + rts/Lua/LuaUI.h | 3 +- rts/Rml/Backends/RmlUi_Backend.cpp | 290 +++++++++--------- rts/Rml/Backends/RmlUi_Backend.h | 8 +- rts/System/Ecs/EcsMain.h | 4 +- rts/System/Platform/errorhandler.cpp | 2 +- rts/lib/RmlSolLua/src/bind/Context.cpp | 5 + rts/lib/RmlSolLua/src/bind/ElementForm.cpp | 44 +-- rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp | 2 +- rts/lib/lua/src/lapi.cpp | 6 +- rts/lib/lua/src/lgc.cpp | 6 +- rts/lib/lua/src/lstate.cpp | 4 +- rts/lib/lua/src/lstate.h | 2 +- 35 files changed, 217 insertions(+), 217 deletions(-) rename cont/{RmlUi/demo => LuaUI/Rml}/LICENSE.txt (100%) rename cont/{RmlUi/demo => LuaUI/Rml}/LatoLatin-Bold.ttf (100%) rename cont/{RmlUi/demo => LuaUI/Rml}/LatoLatin-BoldItalic.ttf (100%) rename cont/{RmlUi/demo => LuaUI/Rml}/LatoLatin-Italic.ttf (100%) rename cont/{RmlUi/demo => LuaUI/Rml}/LatoLatin-Regular.ttf (100%) rename cont/{RmlUi/demo => LuaUI/Rml}/NotoEmoji-Regular.ttf (100%) rename cont/{RmlUi/demo => LuaUI/Rml}/alien_small.tga (100%) rename cont/{RmlUi/demo => LuaUI/Rml}/demo.rml (100%) rename cont/{RmlUi/demo => LuaUI/Rml}/hello_world.png (100%) rename cont/{RmlUi/demo => LuaUI/Rml}/high_scores_alien_1.tga (100%) rename cont/{RmlUi/demo => LuaUI/Rml}/high_scores_alien_2.tga (100%) rename cont/{RmlUi/demo => LuaUI/Rml}/high_scores_alien_3.tga (100%) rename cont/{RmlUi/demo => LuaUI/Rml}/high_scores_defender.tga (100%) rename cont/{RmlUi/demo => LuaUI/Rml}/invader.rcss (100%) rename cont/{RmlUi/demo => LuaUI/Rml}/invader.tga (100%) rename cont/{RmlUi/demo => LuaUI/Rml}/present.tga (100%) rename cont/{RmlUi/demo => LuaUI/Rml}/rml.rcss (100%) create mode 100644 cont/LuaUI/Rml/test.rml rename cont/{RmlUi/demo => LuaUI/Rml}/window.rml (100%) delete mode 100644 cont/RmlUi/demo/test.rml diff --git a/cont/RmlUi/demo/LICENSE.txt b/cont/LuaUI/Rml/LICENSE.txt similarity index 100% rename from cont/RmlUi/demo/LICENSE.txt rename to cont/LuaUI/Rml/LICENSE.txt diff --git a/cont/RmlUi/demo/LatoLatin-Bold.ttf b/cont/LuaUI/Rml/LatoLatin-Bold.ttf similarity index 100% rename from cont/RmlUi/demo/LatoLatin-Bold.ttf rename to cont/LuaUI/Rml/LatoLatin-Bold.ttf diff --git a/cont/RmlUi/demo/LatoLatin-BoldItalic.ttf b/cont/LuaUI/Rml/LatoLatin-BoldItalic.ttf similarity index 100% rename from cont/RmlUi/demo/LatoLatin-BoldItalic.ttf rename to cont/LuaUI/Rml/LatoLatin-BoldItalic.ttf diff --git a/cont/RmlUi/demo/LatoLatin-Italic.ttf b/cont/LuaUI/Rml/LatoLatin-Italic.ttf similarity index 100% rename from cont/RmlUi/demo/LatoLatin-Italic.ttf rename to cont/LuaUI/Rml/LatoLatin-Italic.ttf diff --git a/cont/RmlUi/demo/LatoLatin-Regular.ttf b/cont/LuaUI/Rml/LatoLatin-Regular.ttf similarity index 100% rename from cont/RmlUi/demo/LatoLatin-Regular.ttf rename to cont/LuaUI/Rml/LatoLatin-Regular.ttf diff --git a/cont/RmlUi/demo/NotoEmoji-Regular.ttf b/cont/LuaUI/Rml/NotoEmoji-Regular.ttf similarity index 100% rename from cont/RmlUi/demo/NotoEmoji-Regular.ttf rename to cont/LuaUI/Rml/NotoEmoji-Regular.ttf diff --git a/cont/RmlUi/demo/alien_small.tga b/cont/LuaUI/Rml/alien_small.tga similarity index 100% rename from cont/RmlUi/demo/alien_small.tga rename to cont/LuaUI/Rml/alien_small.tga diff --git a/cont/RmlUi/demo/demo.rml b/cont/LuaUI/Rml/demo.rml similarity index 100% rename from cont/RmlUi/demo/demo.rml rename to cont/LuaUI/Rml/demo.rml diff --git a/cont/RmlUi/demo/hello_world.png b/cont/LuaUI/Rml/hello_world.png similarity index 100% rename from cont/RmlUi/demo/hello_world.png rename to cont/LuaUI/Rml/hello_world.png diff --git a/cont/RmlUi/demo/high_scores_alien_1.tga b/cont/LuaUI/Rml/high_scores_alien_1.tga similarity index 100% rename from cont/RmlUi/demo/high_scores_alien_1.tga rename to cont/LuaUI/Rml/high_scores_alien_1.tga diff --git a/cont/RmlUi/demo/high_scores_alien_2.tga b/cont/LuaUI/Rml/high_scores_alien_2.tga similarity index 100% rename from cont/RmlUi/demo/high_scores_alien_2.tga rename to cont/LuaUI/Rml/high_scores_alien_2.tga diff --git a/cont/RmlUi/demo/high_scores_alien_3.tga b/cont/LuaUI/Rml/high_scores_alien_3.tga similarity index 100% rename from cont/RmlUi/demo/high_scores_alien_3.tga rename to cont/LuaUI/Rml/high_scores_alien_3.tga diff --git a/cont/RmlUi/demo/high_scores_defender.tga b/cont/LuaUI/Rml/high_scores_defender.tga similarity index 100% rename from cont/RmlUi/demo/high_scores_defender.tga rename to cont/LuaUI/Rml/high_scores_defender.tga diff --git a/cont/RmlUi/demo/invader.rcss b/cont/LuaUI/Rml/invader.rcss similarity index 100% rename from cont/RmlUi/demo/invader.rcss rename to cont/LuaUI/Rml/invader.rcss diff --git a/cont/RmlUi/demo/invader.tga b/cont/LuaUI/Rml/invader.tga similarity index 100% rename from cont/RmlUi/demo/invader.tga rename to cont/LuaUI/Rml/invader.tga diff --git a/cont/RmlUi/demo/present.tga b/cont/LuaUI/Rml/present.tga similarity index 100% rename from cont/RmlUi/demo/present.tga rename to cont/LuaUI/Rml/present.tga diff --git a/cont/RmlUi/demo/rml.rcss b/cont/LuaUI/Rml/rml.rcss similarity index 100% rename from cont/RmlUi/demo/rml.rcss rename to cont/LuaUI/Rml/rml.rcss diff --git a/cont/LuaUI/Rml/test.rml b/cont/LuaUI/Rml/test.rml new file mode 100644 index 0000000000..e30c250046 --- /dev/null +++ b/cont/LuaUI/Rml/test.rml @@ -0,0 +1,23 @@ + + + Rml Topbar + + + +
+
+ +
+ + + + Rml Topbar + + + +
+
+ +
\ No newline at end of file diff --git a/cont/RmlUi/demo/window.rml b/cont/LuaUI/Rml/window.rml similarity index 100% rename from cont/RmlUi/demo/window.rml rename to cont/LuaUI/Rml/window.rml diff --git a/cont/RmlUi/demo/test.rml b/cont/RmlUi/demo/test.rml deleted file mode 100644 index 06ca506cb0..0000000000 --- a/cont/RmlUi/demo/test.rml +++ /dev/null @@ -1,27 +0,0 @@ - - - Demo - - - -

hello bar

- -
diff --git a/rts/Game/Game.cpp b/rts/Game/Game.cpp index 100e085f74..ebd645e393 100644 --- a/rts/Game/Game.cpp +++ b/rts/Game/Game.cpp @@ -295,6 +295,7 @@ CGame::~CGame() ENTER_SYNCED_CODE(); LOG("[Game::%s][1]", __func__); + RmlGui::Shutdown(); helper->Kill(); KillLua(true); KillMisc(); @@ -507,9 +508,6 @@ void CGame::Load(const std::string& mapFileName) } } - RmlGui::Initialize(globalRendering->GetWindow(), globalRendering->GetContext(), luaUI->GetLuaState(), globalRendering->winSizeX, globalRendering->winSizeY); - RmlGui::CreateOverlayContext(); - Watchdog::DeregisterThread(WDT_LOAD); AddTimedJobs(); @@ -806,6 +804,7 @@ void CGame::LoadInterface() GameSetupDrawer::Disable(); GameSetupDrawer::Enable(); } + RmlGui::Initialize(globalRendering->GetWindow(), globalRendering->GetContext(), globalRendering->winSizeX, globalRendering->winSizeY); } void CGame::LoadLua(bool dryRun, bool onlyUnsynced) diff --git a/rts/Game/UI/GuiHandler.cpp b/rts/Game/UI/GuiHandler.cpp index 61a5f91b35..2bf3f37521 100644 --- a/rts/Game/UI/GuiHandler.cpp +++ b/rts/Game/UI/GuiHandler.cpp @@ -2,6 +2,7 @@ #include "GuiHandler.h" +#include #include "CommandColors.h" #include "KeyBindings.h" #include "KeyCodes.h" @@ -168,6 +169,7 @@ bool CGuiHandler::EnableLuaUI(bool enableCommand) } } + RmlGui::Reload(); CLuaUI::ReloadHandler(); if (luaUI != nullptr) { diff --git a/rts/Lua/LuaUI.cpp b/rts/Lua/LuaUI.cpp index 19d3145170..82d9613bdd 100644 --- a/rts/Lua/LuaUI.cpp +++ b/rts/Lua/LuaUI.cpp @@ -163,6 +163,7 @@ CLuaUI::CLuaUI() KillLua(); return; } + RmlGui::InitializeLua(L); lua_settop(L, 0); if (!LoadCode(L, std::move(code), file)) { diff --git a/rts/Lua/LuaUI.h b/rts/Lua/LuaUI.h index 5ecc1406f7..dc4bf3e143 100644 --- a/rts/Lua/LuaUI.h +++ b/rts/Lua/LuaUI.h @@ -6,6 +6,7 @@ #include #include +#include #include "LuaHandle.h" #include "System/UnorderedMap.hpp" @@ -47,7 +48,7 @@ class CLuaUI : public CLuaHandle } static bool CanLoadHandler() { return true; } - static bool ReloadHandler() { return (FreeHandler(), LoadFreeHandler()); } // NOTE the ',' + static bool ReloadHandler() { return (RmlGui::Reload(), FreeHandler(), LoadFreeHandler()); } // NOTE the ',' static bool LoadFreeHandler() { return (LoadHandler() || FreeHandler()); } static bool LoadHandler(); diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index cb835689da..212de1e848 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -38,7 +38,9 @@ #include "Rendering/Textures/Bitmap.h" #include "Lua/LuaUI.h" #include "RmlSolLua.h" +#include "System/FileSystem/FileHandler.h" #include +#include // #include "System/FileSystem/ArchiveScanner.h" // #include "System/FileSystem/DataDirLocater.h" @@ -111,28 +113,53 @@ class VFSFileInterface : public Rml::FileInterface VFSFileInterface() {} Rml::FileHandle Open(const Rml::String &path) { - const std::string &fsFullPath = dataDirsAccess.LocateFile(path); - return (Rml::FileHandle)std::fopen(fsFullPath.c_str(), "rb"); + // LOG_L(L_FATAL, "[SpringApp::%s]OPENING: %s", __func__, path.c_str()); + // TODO: luaui makes the second one SPRING_VFS_MOD + const std::string mode = (CLuaHandle::GetDevMode()) ? SPRING_VFS_RAW_FIRST : SPRING_VFS_RAW_FIRST; + CFileHandler *fh = new CFileHandler(path, mode); + if (!fh->FileExists()) + { + delete fh; + return (Rml::FileHandle) nullptr; + } + return (Rml::FileHandle)fh; } void Close(Rml::FileHandle file) { - fclose((FILE *)file); + ((CFileHandler *)file)->Close(); + delete (CFileHandler *)file; } size_t Read(void *buffer, size_t size, Rml::FileHandle file) { - return fread(buffer, 1, size, (FILE *)file); + return ((CFileHandler *)file)->Read(buffer, size); } bool Seek(Rml::FileHandle file, long offset, int origin) { - return fseek((FILE *)file, offset, origin) == 0; + std::ios_base::seekdir seekdir; + switch (origin) + { + case SEEK_CUR: + seekdir = std::ios_base::cur; + break; + case SEEK_END: + seekdir = std::ios_base::end; + break; + case SEEK_SET: + default: + seekdir = std::ios_base::beg; + break; + } + ((CFileHandler *)file)->Seek(offset, seekdir); + // TODO: need to detect seek failure and then return false? + return true; } size_t Tell(Rml::FileHandle file) { - return ftell((FILE *)file); + return ((CFileHandler *)file)->GetPos(); }; }; @@ -152,15 +179,16 @@ struct BackendData std::vector contexts; InputHandler::SignalType::connection_type inputCon; - bool running = true; + // make atomic_bool? + bool initialized = false; + bool debuggerAttached = false; + int winX = 1; + int winY = 1; }; static Rml::UniquePtr data; -bool RmlGui::Initialize(SDL_Window *target_window, SDL_GLContext target_glcontext, lua_State *lua_state, int winX, int winY) +bool RmlGui::Initialize(SDL_Window *target_window, SDL_GLContext target_glcontext, int winX, int winY) { - sol::state_view lua(lua_state); - RMLUI_ASSERT(!data); - data = Rml::MakeUnique(); if (!data->render_interface) @@ -191,6 +219,8 @@ bool RmlGui::Initialize(SDL_Window *target_window, SDL_GLContext target_glcontex // LOG_L(L_FATAL, "[SpringApp::%s] renderer output size error: %s", __func__, errmessage); // } data->render_interface.SetViewport(winX, winY); + data->winX = winX; + data->winY = winY; Rml::Initialise(); // bool ok = CLuaRml::LoadHandler(); @@ -199,181 +229,90 @@ bool RmlGui::Initialize(SDL_Window *target_window, SDL_GLContext target_glcontex // } // Rml::Lua::Interpreter::LoadFile(Rml::String("luainvaders/lua/start.lua")); - Rml::SolLua::Initialise(&lua); Rml::LoadFontFace("fonts/FreeSansBold.otf", true); data->inputCon = input.AddHandler(&RmlGui::ProcessEvent); + RmlGui::CreateOverlayContext(); + data->initialized = true; + return true; +} + +bool RmlGui::InitializeLua(lua_State *lua_state) +{ + sol::state_view lua(lua_state); + Rml::SolLua::Initialise(&lua); return true; } void RmlGui::Shutdown() { - RMLUI_ASSERT(data); + data->initialized = false; // SDL_GL_DeleteContext(data->glcontext); // SDL_DestroyWindow(data->window); + Rml::Shutdown(); // data.reset(); // SDL_Quit(); } -Rml::SystemInterface *RmlGui::GetSystemInterface() -{ - RMLUI_ASSERT(data); - return &data->system_interface; -} - -Rml::RenderInterface *RmlGui::GetRenderInterface() +void RmlGui::Reload() { - RMLUI_ASSERT(data); - return &data->render_interface; + LOG_L(L_FATAL, "[SpringApp::%s] reloading: ", __func__); + SDL_Window *window = data->window; + SDL_GLContext glcontext = data->glcontext; + int winX = data->winX; + int winY = data->winY; + RmlGui::Shutdown(); + RmlGui::Initialize(window, glcontext, winX, winY); + // RmlGui::CreateOverlayContext(); } -bool RmlGui::ProcessMouseEvent(const SDL_Event &event) +void RmlGui::ToggleDebugger() { - SDL_Event ev(event); - if (data == NULL || data->contexts.size() < 1) - return false; - return RmlSDL::InputEventHandler(data->contexts[0], ev); -} - -bool RmlGui::ProcessEvent(const SDL_Event &event) -{ - SDL_Event ev(event); - switch (ev.type) + if (data->debuggerAttached) { - case SDL_WINDOWEVENT: - { - switch (ev.window.event) - { - case SDL_WINDOWEVENT_SIZE_CHANGED: - { - Rml::Vector2i dimensions(ev.window.data1, ev.window.data2); - data->render_interface.SetViewport(dimensions.x, dimensions.y); - } - break; - } - if (data != NULL && data->contexts.size() > 0) - RmlSDL::InputEventHandler(data->contexts[0], ev); + Rml::Debugger::Initialise(data->contexts[0]); + Rml::Debugger::SetVisible(true); } - break; - case SDL_MOUSEMOTION: - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - case SDL_MOUSEWHEEL: - break; // handled by ProcessMouseEvent - case SDL_KEYDOWN: - default: + else { - if (data != NULL && data->contexts.size() > 0) - RmlSDL::InputEventHandler(data->contexts[0], ev); - } - break; + Rml::Debugger::Shutdown(); } - return false; + data->debuggerAttached = !data->debuggerAttached; } -bool RmlGui::ProcessEvents(Rml::Context *context, KeyDownCallback key_down_callback, bool power_save) +Rml::SystemInterface *RmlGui::GetSystemInterface() { - RMLUI_ASSERT(data && context); - -#if defined RMLUI_PLATFORM_EMSCRIPTEN - - // Ideally we would hand over control of the main loop to emscripten: - // - // // Hand over control of the main loop to the WebAssembly runtime. - // emscripten_set_main_loop_arg(EventLoopIteration, (void*)user_data_handle, 0, true); - // - // The above is the recommended approach. However, as we don't control the main loop here we have to make due with another approach. Instead, use - // Asyncify to yield by sleeping. - // Important: Must be linked with option -sASYNCIFY - emscripten_sleep(1); - -#endif - - bool result = data->running; - data->running = true; - - SDL_Event ev; - int has_event = 0; - if (power_save) - has_event = SDL_WaitEventTimeout(&ev, static_cast(Rml::Math::Min(context->GetNextUpdateDelay(), (double)10.0) * 1000)); - else - has_event = SDL_PollEvent(&ev); - while (has_event) - { - switch (ev.type) - { - case SDL_QUIT: - { - result = false; - } - break; - case SDL_KEYDOWN: - { - const Rml::Input::KeyIdentifier key = RmlSDL::ConvertKey(ev.key.keysym.sym); - const int key_modifier = RmlSDL::GetKeyModifierState(); - const float native_dp_ratio = 1.f; - - // See if we have any global shortcuts that take priority over the context. - if (key_down_callback && !key_down_callback(context, key, key_modifier, native_dp_ratio, true)) - break; - // Otherwise, hand the event over to the context by calling the input handler as normal. - if (!RmlSDL::InputEventHandler(context, ev)) - break; - // The key was not consumed by the context either, try keyboard shortcuts of lower priority. - if (key_down_callback && !key_down_callback(context, key, key_modifier, native_dp_ratio, false)) - break; - } - break; - case SDL_WINDOWEVENT: - { - switch (ev.window.event) - { - case SDL_WINDOWEVENT_SIZE_CHANGED: - { - Rml::Vector2i dimensions(ev.window.data1, ev.window.data2); - data->render_interface.SetViewport(dimensions.x, dimensions.y); - } - break; - } - RmlSDL::InputEventHandler(context, ev); - } - break; - default: - { - RmlSDL::InputEventHandler(context, ev); - } - break; - } - has_event = SDL_PollEvent(&ev); - } + return &data->system_interface; +} - return result; +Rml::RenderInterface *RmlGui::GetRenderInterface() +{ + return &data->render_interface; } void RmlGui::RequestExit() { - RMLUI_ASSERT(data); - - data->running = false; + // data->running = false; } void RmlGui::CreateContext() { - Rml::Context *context = Rml::CreateContext("overlay", Rml::Vector2i(1500, 1500)); + Rml::Context *context = Rml::CreateContext("overlay", Rml::Vector2i(data->winX, data->winY)); Rml::Debugger::Initialise(context); RmlGui::AddContext(context); } void RmlGui::CreateOverlayContext() { - Rml::Context *context = Rml::CreateContext("overlay", Rml::Vector2i(1500, 1500)); - Rml::Debugger::Initialise(context); + Rml::Context *context = Rml::CreateContext("overlay", Rml::Vector2i(data->winX, data->winY)); + // Rml::Debugger::Initialise(context); RmlGui::AddContext(context); - Rml::ElementDocument *document = context->LoadDocument("RmlUi/demo/demo.rml"); - if (document) - document->Show(); + // Rml::Debugger::SetVisible(true); + // Rml::ElementDocument *document = context->LoadDocument("RmlUi/demo/demo.rml"); + // if (document) + // document->Show(); } void RmlGui::AddContext(Rml::Context *context) { @@ -382,7 +321,11 @@ void RmlGui::AddContext(Rml::Context *context) void RmlGui::Update() { - RMLUI_ASSERT(data); + ZoneScopedN("RmlGui Update"); + if (!data->initialized) + { + return; + } // TODO: define if headless? for (auto &context : data->contexts) { @@ -392,7 +335,11 @@ void RmlGui::Update() void RmlGui::RenderFrame() { - RMLUI_ASSERT(data); + ZoneScopedN("RmlGui Draw"); + if (!data->initialized) + { + return; + } #ifndef HEADLESS RmlGui::BeginFrame(); @@ -406,15 +353,12 @@ void RmlGui::RenderFrame() void RmlGui::BeginFrame() { - RMLUI_ASSERT(data); - // data->render_interface.Clear(); data->render_interface.BeginFrame(); } void RmlGui::PresentFrame() { - RMLUI_ASSERT(data); data->render_interface.EndFrame(); // SDL_GL_SwapWindow(data->window); @@ -422,3 +366,53 @@ void RmlGui::PresentFrame() // Optional, used to mark frames during performance profiling. RMLUI_FrameMark; } + +bool RmlGui::ProcessMouseEvent(const SDL_Event &event) +{ + SDL_Event ev(event); + if (data == NULL || data->contexts.size() < 1 || !data->initialized) + return false; + return RmlSDL::InputEventHandler(data->contexts[0], ev); +} + +bool RmlGui::ProcessEvent(const SDL_Event &event) +{ + if (!data->initialized) + { + return false; + } + SDL_Event ev(event); + switch (ev.type) + { + case SDL_WINDOWEVENT: + { + switch (ev.window.event) + { + case SDL_WINDOWEVENT_SIZE_CHANGED: + { + Rml::Vector2i dimensions(ev.window.data1, ev.window.data2); + data->render_interface.SetViewport(dimensions.x, dimensions.y); + data->winX = dimensions.x; + data->winY = dimensions.y; + } + break; + } + if (data != NULL && data->contexts.size() > 0) + RmlSDL::InputEventHandler(data->contexts[0], ev); + } + break; + case SDL_MOUSEMOTION: + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEWHEEL: + break; // handled by ProcessMouseEvent + case SDL_KEYDOWN: + default: + { + if (data != NULL && data->contexts.size() > 0) + RmlSDL::InputEventHandler(data->contexts[0], ev); + } + break; + } + return false; +} diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index 5652343701..bcaadeaf3d 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -49,22 +49,22 @@ using KeyDownCallback = bool (*)(Rml::Context* context, Rml::Input::KeyIdentifie namespace RmlGui { // Initializes the backend, including the custom system and render interfaces, and opens a window for rendering the RmlUi context. -bool Initialize(SDL_Window* target_window, SDL_GLContext target_glcontext, lua_State* lua_state, int winX, int winY); +bool Initialize(SDL_Window* target_window, SDL_GLContext target_glcontext, int winX, int winY); +bool InitializeLua(lua_State* lua_state); // Closes the window and release all resources owned by the backend, including the system and render interfaces. void Shutdown(); +void Reload(); // Returns a pointer to the custom system interface which should be provided to RmlUi. Rml::SystemInterface* GetSystemInterface(); // Returns a pointer to the custom render interface which should be provided to RmlUi. Rml::RenderInterface* GetRenderInterface(); -// Polls and processes events from the current platform, and applies any relevant events to the provided RmlUi context and the key down callback. -// @return False to indicate that the application should be closed. -bool ProcessEvents(Rml::Context* context, KeyDownCallback key_down_callback = nullptr, bool power_save = false); bool ProcessEvent(const SDL_Event& event); bool ProcessMouseEvent(const SDL_Event& event); // Request application closure during the next event processing call. void RequestExit(); +void ToggleDebugger(); void Update(); diff --git a/rts/System/Ecs/EcsMain.h b/rts/System/Ecs/EcsMain.h index 7789fd1452..1803c9214b 100644 --- a/rts/System/Ecs/EcsMain.h +++ b/rts/System/Ecs/EcsMain.h @@ -7,7 +7,7 @@ #ifdef cast #define RESTORE_LUA_MACROS #undef cast -#undef registry +// #undef registry #endif #define ENTT_USE_ATOMIC @@ -56,7 +56,7 @@ // from llimits.h #define cast(t, exp) ((t)(exp)) // from lstate.h -#define registry(L) (&G(L)->l_registry) +// #define registry(L) (&G(L)->l_registry) #undef RESTORE_LUA_MACROS #endif diff --git a/rts/System/Platform/errorhandler.cpp b/rts/System/Platform/errorhandler.cpp index 374920cf25..358044747b 100644 --- a/rts/System/Platform/errorhandler.cpp +++ b/rts/System/Platform/errorhandler.cpp @@ -59,7 +59,7 @@ static void ExitSpringProcess(const char* msg, const char* caption, unsigned int static void ExitSpringProcess(const char* msg, const char* caption, unsigned int flags) { - LOG_L(L_ERROR, "[%s] errorMsg=\"%s\" msgCaption=\"%s\" mainThread=%d", __func__, msg, caption, Threading::IsMainThread()); + LOG_L(L_FATAL, "[%s] errorMsg=\"%s\" msgCaption=\"%s\" mainThread=%d", __func__, msg, caption, Threading::IsMainThread()); switch (SpringApp::PostKill(Threading::Error(caption, msg, flags))) { case -1: { diff --git a/rts/lib/RmlSolLua/src/bind/Context.cpp b/rts/lib/RmlSolLua/src/bind/Context.cpp index ff4662f1c4..c10004952c 100644 --- a/rts/lib/RmlSolLua/src/bind/Context.cpp +++ b/rts/lib/RmlSolLua/src/bind/Context.cpp @@ -151,10 +151,15 @@ namespace Rml::SolLua "UnloadDocument", &Rml::Context::UnloadDocument, "Update", &Rml::Context::Update, "OpenDataModel", &datamodel::openDataModel, + "RemoveDataModel", &Rml::Context::RemoveDataModel, "ProcessMouseMove", &Rml::Context::ProcessMouseMove, "ProcessMouseButtonDown", &Rml::Context::ProcessMouseButtonDown, "ProcessMouseButtonUp", &Rml::Context::ProcessMouseButtonUp, // "ProcessMouseWheel", &Rml::Context::ProcessMouseWheel, + "ProcessMouseWheel", sol::overload( + static_cast(&Rml::Context::ProcessMouseWheel), + static_cast(&Rml::Context::ProcessMouseWheel) + ), "ProcessMouseLeave", &Rml::Context::ProcessMouseLeave, "IsMouseInteracting", &Rml::Context::IsMouseInteracting, "ProcessKeyDown", &Rml::Context::ProcessKeyDown, diff --git a/rts/lib/RmlSolLua/src/bind/ElementForm.cpp b/rts/lib/RmlSolLua/src/bind/ElementForm.cpp index ad75e47cf1..45ccb2d0be 100644 --- a/rts/lib/RmlSolLua/src/bind/ElementForm.cpp +++ b/rts/lib/RmlSolLua/src/bind/ElementForm.cpp @@ -10,23 +10,25 @@ namespace Rml::SolLua namespace functions { - constexpr bool hasAttribute(auto& self, const std::string& name) + template + constexpr bool hasAttribute(TSelf& self, const std::string& name) { return self.HasAttribute(name); } #define HASATTRGETTER(S, N) [](S& self) { return self.HasAttribute(N); } - // template - // T getAttributeWithDefault(auto& self, const std::string& name, T def) - // { - // auto attr = self.GetAttribute(name, def); - // return attr; - // } - // #define GETATTRGETTER(S, N, D) [](S& self) { return functions::getAttributeWithDefault(self, N, D); } + template + T getAttributeWithDefault(TSelf& self, const std::string& name, T def) + { + auto attr = self.template GetAttribute(name, def); + return attr; + } + #define GETATTRGETTER(S, N, D) [](S& self) { return functions::getAttributeWithDefault(self, N, D); } - constexpr void setAttribute(auto& self, const std::string& name, const auto& value) + template + constexpr void setAttribute(TSelf& self, const std::string& name, const T& value) { - if constexpr (std::is_same_v, bool>) + if constexpr (std::is_same_v, bool>) { if (value) self.SetAttribute(name, true); @@ -130,18 +132,18 @@ namespace Rml::SolLua /////////////////////////// - // lua.new_usertype("ElementFormControlInput", sol::no_constructor, - // // G+S - // "checked", sol::property(HASATTRGETTER(Rml::ElementFormControlInput, "checked"), SETATTR(Rml::ElementFormControlInput, "checked", bool)), - // "maxlength", sol::property(GETATTRGETTER(Rml::ElementFormControlInput, "maxlength", -1), SETATTR(Rml::ElementFormControlInput, "maxlength", int)), - // "size", sol::property(GETATTRGETTER(Rml::ElementFormControlInput, "size", 20), SETATTR(Rml::ElementFormControlInput, "size", int)), - // "max", sol::property(GETATTRGETTER(Rml::ElementFormControlInput, "max", 100), SETATTR(Rml::ElementFormControlInput, "max", int)), - // "min", sol::property(GETATTRGETTER(Rml::ElementFormControlInput, "min", 0), SETATTR(Rml::ElementFormControlInput, "min", int)), - // "step", sol::property(GETATTRGETTER(Rml::ElementFormControlInput, "step", 1), SETATTR(Rml::ElementFormControlInput, "step", int)), + lua.new_usertype("ElementFormControlInput", sol::no_constructor, + // G+S + "checked", sol::property(HASATTRGETTER(Rml::ElementFormControlInput, "checked"), SETATTR(Rml::ElementFormControlInput, "checked", bool)), + "maxlength", sol::property(GETATTRGETTER(Rml::ElementFormControlInput, "maxlength", -1), SETATTR(Rml::ElementFormControlInput, "maxlength", int)), + "size", sol::property(GETATTRGETTER(Rml::ElementFormControlInput, "size", 20), SETATTR(Rml::ElementFormControlInput, "size", int)), + "max", sol::property(GETATTRGETTER(Rml::ElementFormControlInput, "max", 100), SETATTR(Rml::ElementFormControlInput, "max", int)), + "min", sol::property(GETATTRGETTER(Rml::ElementFormControlInput, "min", 0), SETATTR(Rml::ElementFormControlInput, "min", int)), + "step", sol::property(GETATTRGETTER(Rml::ElementFormControlInput, "step", 1), SETATTR(Rml::ElementFormControlInput, "step", int)), - // // B - // sol::base_classes, sol::bases() - // ); + // B + sol::base_classes, sol::bases() + ); /////////////////////////// diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp index 65d700e4b5..4673b62914 100644 --- a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp @@ -34,7 +34,7 @@ namespace Rml::SolLua void SolLuaPlugin::OnShutdown() { - m_lua_state.collect_garbage(); + // m_lua_state.collect_garbage(); delete this; } diff --git a/rts/lib/lua/src/lapi.cpp b/rts/lib/lua/src/lapi.cpp index e9ef367edc..f74efbbe5e 100644 --- a/rts/lib/lua/src/lapi.cpp +++ b/rts/lib/lua/src/lapi.cpp @@ -59,7 +59,7 @@ static TValue *index2adr (lua_State *L, int idx) { return L->top + idx; } else switch (idx) { /* pseudo-indices */ - case LUA_REGISTRYINDEX: return registry(L); + case LUA_REGISTRYINDEX: return lregistry(L); case LUA_ENVIRONINDEX: { Closure *func = curr_func(L); sethvalue(L, &L->env, func->c.env); @@ -212,7 +212,7 @@ LUA_API void lua_replace (lua_State *L, int idx) { api_checkvalidindex(L, o); if (idx == LUA_ENVIRONINDEX) { Closure *func = curr_func(L); - api_check(L, ttistable(L->top - 1)); + api_check(L, ttistable(L->top - 1)); func->c.env = hvalue(L->top - 1); luaC_barrier(L, func, L->top - 1); } @@ -783,7 +783,7 @@ LUA_API int lua_setfenv (lua_State *L, int idx) { #define checkresults(L,na,nr) \ api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na))) - + LUA_API void lua_call (lua_State *L, int nargs, int nresults) { StkId func; diff --git a/rts/lib/lua/src/lgc.cpp b/rts/lib/lua/src/lgc.cpp index e909c79a96..72b6d93bb4 100644 --- a/rts/lib/lua/src/lgc.cpp +++ b/rts/lib/lua/src/lgc.cpp @@ -310,7 +310,7 @@ static l_mem propagatemark (global_State *g) { traverseproto(g, p); return sizeof(Proto) + sizeof(Instruction) * p->sizecode + sizeof(Proto *) * p->sizep + - sizeof(TValue) * p->sizek + + sizeof(TValue) * p->sizek + sizeof(int) * p->sizelineinfo + sizeof(LocVar) * p->sizelocvars + sizeof(TString *) * p->sizeupvalues; @@ -506,7 +506,7 @@ static void markroot (lua_State *L) { markobject(g, g->mainthread); /* make global table be traversed before main stack */ markvalue(g, gt(g->mainthread)); - markvalue(g, registry(L)); + markvalue(g, lregistry(L)); markmt(g); g->gcstate = GCSpropagate; } @@ -696,7 +696,7 @@ void luaC_linkupval (lua_State *L, UpVal *uv) { GCObject *o = obj2gco(uv); o->gch.next = g->rootgc; /* link upvalue into `rootgc' list */ g->rootgc = o; - if (isgray(o)) { + if (isgray(o)) { if (g->gcstate == GCSpropagate) { gray2black(o); /* closed upvalues need barrier */ luaC_barrier(L, uv, uv->v); diff --git a/rts/lib/lua/src/lstate.cpp b/rts/lib/lua/src/lstate.cpp index 71b70faf55..7d13e317e1 100644 --- a/rts/lib/lua/src/lstate.cpp +++ b/rts/lib/lua/src/lstate.cpp @@ -72,7 +72,7 @@ static void f_luaopen (lua_State *L, void *ud) { UNUSED(ud); stack_init(L, L); /* init stack */ sethvalue(L, gt(L), luaH_new(L, 0, 2)); /* table of globals */ - sethvalue(L, registry(L), luaH_new(L, 0, 2)); /* registry */ + sethvalue(L, lregistry(L), luaH_new(L, 0, 2)); /* registry */ luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */ luaT_init(L); luaX_init(L); @@ -163,7 +163,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { g->strt.size = 0; g->strt.nuse = 0; g->strt.hash = NULL; - setnilvalue(registry(L)); + setnilvalue(lregistry(L)); luaZ_initbuffer(L, &g->buff); g->panic = NULL; g->gcstate = GCSpause; diff --git a/rts/lib/lua/src/lstate.h b/rts/lib/lua/src/lstate.h index 03449f8c7d..7106d48f00 100644 --- a/rts/lib/lua/src/lstate.h +++ b/rts/lib/lua/src/lstate.h @@ -21,7 +21,7 @@ struct lua_longjmp; /* defined in ldo.c */ #define gt(L) (&L->l_gt) /* registry */ -#define registry(L) (&G(L)->l_registry) +#define lregistry(L) (&G(L)->l_registry) /* extra stack space to handle TM calls and some other extras */ From 74f253e2743e59a423b6ad08bc1f966cabd9adcf Mon Sep 17 00:00:00 2001 From: loveridge Date: Fri, 6 Oct 2023 11:57:01 -0700 Subject: [PATCH 07/58] delete extra file --- cont/LuaUI/Rml/test.rml | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 cont/LuaUI/Rml/test.rml diff --git a/cont/LuaUI/Rml/test.rml b/cont/LuaUI/Rml/test.rml deleted file mode 100644 index e30c250046..0000000000 --- a/cont/LuaUI/Rml/test.rml +++ /dev/null @@ -1,23 +0,0 @@ - - - Rml Topbar - - - -
-
- -
- - - - Rml Topbar - - - -
-
- -
\ No newline at end of file From 0e5dde909d563eaf9d73ff6a5fc17b75cafcb497 Mon Sep 17 00:00:00 2001 From: Marek Rusinowski Date: Mon, 9 Oct 2023 17:28:16 +0200 Subject: [PATCH 08/58] Temporarily switch to RmlUi branch with tracy integration fixed --- rts/lib/CMakeLists.txt | 13 +++++-------- rts/lib/RmlUi | 2 +- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/rts/lib/CMakeLists.txt b/rts/lib/CMakeLists.txt index db05ab2e4e..1c19541f8e 100644 --- a/rts/lib/CMakeLists.txt +++ b/rts/lib/CMakeLists.txt @@ -86,14 +86,11 @@ option(TRACY_PROFILE_MEMORY "Profile memory allocations" OFF) add_subdirectory(tracy) -# TODO(p2004): Enabling tracy for RmlUi is at the momemnt broken and waits for -# resolution upstream https://github.com/mikke89/RmlUi/issues/516. -# if (TRACY_ENABLE) -# set(ENABLE_TRACY_PROFILING ON CACHE BOOL "Enable RmlUi tracy profiling") -# # Place the include directories for tracy in TRACY_INCLUDE_DIR as that's -# # what RmlUi expects to be set in their FindTracy.cmake -# get_target_property(TRACY_INCLUDE_DIR TracyClient INCLUDE_DIRECTORIES) -# endif() +if (TRACY_ENABLE) + option(RMLUI_TRACY_PROFILING "Enable RmlUi profiling with Tracy." ON) + # We have our own memory profiling, never enable RmlUi one. + set(RMLUI_TRACY_MEMORY_PROFILING OFF CACHE BOOL "Enable RmlUi tracy profiling") +endif() # We resolve freetype here to make sure RmlUi find_package picks the same # correct version as picked by the engine. diff --git a/rts/lib/RmlUi b/rts/lib/RmlUi index a602da2440..50e24c71bb 160000 --- a/rts/lib/RmlUi +++ b/rts/lib/RmlUi @@ -1 +1 @@ -Subproject commit a602da244048f99fa1730194c8479b377227f7c6 +Subproject commit 50e24c71bbbb524f1c2d06fd2fd322bc6e1a6831 From 2aaf8c65e9a5c4012e191f8da016ed122c15fb80 Mon Sep 17 00:00:00 2001 From: loveridge Date: Sat, 21 Oct 2023 12:59:02 -0700 Subject: [PATCH 09/58] data model change detection bad edition --- rts/lib/RmlSolLua/src/bind/DataModel.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/rts/lib/RmlSolLua/src/bind/DataModel.cpp b/rts/lib/RmlSolLua/src/bind/DataModel.cpp index a393dbf6be..01b34f766c 100644 --- a/rts/lib/RmlSolLua/src/bind/DataModel.cpp +++ b/rts/lib/RmlSolLua/src/bind/DataModel.cpp @@ -15,8 +15,13 @@ namespace Rml::SolLua void dataModelSet(SolLuaDataModel& self, const std::string& name, sol::object value, sol::this_state s) { - self.Handle.DirtyVariable(name); self.Table.set(name, value); + self.Handle.DirtyVariable(name); + } + + void dataModelSetDirty(SolLuaDataModel& self, const std::string& name) + { + self.Handle.DirtyVariable(name); } } @@ -25,7 +30,8 @@ namespace Rml::SolLua lua.new_usertype("SolLuaDataModel", sol::no_constructor, sol::meta_function::index, &functions::dataModelGet, - sol::meta_function::new_index, &functions::dataModelSet + sol::meta_function::new_index, &functions::dataModelSet, + "__SetDirty", &functions::dataModelSetDirty ); } From f260dccbce58b192a0cbc79a8f9e3eeef69d7f62 Mon Sep 17 00:00:00 2001 From: loveridge Date: Sat, 21 Oct 2023 17:04:06 -0700 Subject: [PATCH 10/58] fix for chobby support, better binds, translation table --- rts/Rml/Backends/RmlUi_Backend.cpp | 45 +++- rts/Rml/Backends/RmlUi_Backend.h | 2 + rts/Rml/Backends/RmlUi_Platform_SDL.cpp | 112 +++++++--- rts/Rml/Backends/RmlUi_Platform_SDL.h | 57 ++--- rts/Rml/RmlInputReceiver.h | 22 ++ rts/lib/RmlSolLua/src/RmlSolLua.cpp | 31 +-- rts/lib/RmlSolLua/src/RmlSolLua.h | 11 +- rts/lib/RmlSolLua/src/TranslationTable.h | 43 ++++ rts/lib/RmlSolLua/src/bind/Context.cpp | 196 ++++++++++-------- rts/lib/RmlSolLua/src/bind/Element.cpp | 9 + rts/lib/RmlSolLua/src/bind/Global.cpp | 10 +- rts/lib/RmlSolLua/src/bind/bind.h | 3 +- .../RmlSolLua/src/plugin/SolLuaDataModel.cpp | 12 +- rts/lib/RmlSolLua/src/plugin/SolLuaDocument.h | 2 +- rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.h | 4 +- 15 files changed, 377 insertions(+), 182 deletions(-) create mode 100644 rts/Rml/RmlInputReceiver.h create mode 100644 rts/lib/RmlSolLua/src/TranslationTable.h diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index 212de1e848..e81054acba 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -49,14 +49,8 @@ // #include "System/FileSystem/FileSystem.h" // #include "System/FileSystem/FileSystemInitializer.h" #include "System/Input/InputHandler.h" - -#if defined RMLUI_PLATFORM_EMSCRIPTEN -#include -#else -#if !(SDL_VIDEO_RENDER_OGL) -#error "Only the OpenGL SDL backend is supported." -#endif -#endif +#include "Rml/RmlInputReceiver.h" +#include "Game/UI/MouseHandler.h" /** Custom render interface example for the SDL/GL3 backend. @@ -178,6 +172,7 @@ struct BackendData SDL_GLContext glcontext = nullptr; std::vector contexts; InputHandler::SignalType::connection_type inputCon; + CRmlInputReceiver inputReceiver; // make atomic_bool? bool initialized = false; @@ -239,7 +234,8 @@ bool RmlGui::Initialize(SDL_Window *target_window, SDL_GLContext target_glcontex bool RmlGui::InitializeLua(lua_State *lua_state) { sol::state_view lua(lua_state); - Rml::SolLua::Initialise(&lua); + Rml::SolLua::SolLuaPlugin* slp = Rml::SolLua::Initialise(&lua); + data->system_interface.SetTranslationTable(&slp->translationTable); return true; } @@ -371,10 +367,37 @@ bool RmlGui::ProcessMouseEvent(const SDL_Event &event) { SDL_Event ev(event); if (data == NULL || data->contexts.size() < 1 || !data->initialized) - return false; - return RmlSDL::InputEventHandler(data->contexts[0], ev); + { + return true; + } + switch (ev.type) + { + case SDL_MOUSEMOTION: + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEWHEEL: + { + bool handled = RmlSDL::InputEventHandler(data->contexts[0], ev); + data->inputReceiver.setActive(!handled); + return handled; + } + default: + { + data->inputReceiver.setActive(false); + return true; + } + } } +bool RmlGui::ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat) +{ + if (!data->initialized) + { + return false; + } + return false; + // RmlSDL::InputEventHandler(data->contexts[0], ev); +} bool RmlGui::ProcessEvent(const SDL_Event &event) { if (!data->initialized) diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index bcaadeaf3d..060304822b 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -35,6 +35,7 @@ #include #include #include "lib/sol2/sol.hpp" +#include "Rml/Backends/RmlUi_Platform_SDL.h" using KeyDownCallback = bool (*)(Rml::Context* context, Rml::Input::KeyIdentifier key, int key_modifier, float native_dp_ratio, bool priority); @@ -62,6 +63,7 @@ Rml::RenderInterface* GetRenderInterface(); bool ProcessEvent(const SDL_Event& event); bool ProcessMouseEvent(const SDL_Event& event); +bool ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat); // Request application closure during the next event processing call. void RequestExit(); void ToggleDebugger(); diff --git a/rts/Rml/Backends/RmlUi_Platform_SDL.cpp b/rts/Rml/Backends/RmlUi_Platform_SDL.cpp index 8269dc21da..336880b9f3 100644 --- a/rts/Rml/Backends/RmlUi_Platform_SDL.cpp +++ b/rts/Rml/Backends/RmlUi_Platform_SDL.cpp @@ -32,6 +32,7 @@ #include #include #include +#include SystemInterface_SDL::SystemInterface_SDL() { @@ -55,7 +56,7 @@ SystemInterface_SDL::~SystemInterface_SDL() SDL_FreeCursor(cursor_unavailable); } -void SystemInterface_SDL::SetWindow(SDL_Window* in_window) +void SystemInterface_SDL::SetWindow(SDL_Window *in_window) { window = in_window; } @@ -67,50 +68,80 @@ double SystemInterface_SDL::GetElapsedTime() return double(SDL_GetPerformanceCounter() - start) / frequency; } -void SystemInterface_SDL::SetMouseCursor(const Rml::String& cursor_name) +int SystemInterface_SDL::TranslateString(Rml::String &translated, const Rml::String &input) { - SDL_Cursor* cursor = nullptr; + if (!translationTable || !translationTable->exists(input)) + { + translated = input; + return 0; + } + std::string translation = translationTable->getTranslationString(input); + translated = translation; + return 1; +} + +bool LogMessage(Rml::Log::Type type, const Rml::String &message) +{ + const char *fmtStr = "[LUA:Rml] %s"; + const char *logStr = message.c_str(); + switch (type) + { + case Rml::Log::LT_INFO: + { + LOG_L(L_INFO, fmtStr, logStr); + } + break; + case Rml::Log::LT_ASSERT: + { + LOG_L(L_DEBUG, fmtStr, logStr); + } + break; + case Rml::Log::LT_ERROR: + { + LOG_L(L_ERROR, fmtStr, logStr); + } + break; + case Rml::Log::LT_WARNING: + { + LOG_L(L_WARNING, fmtStr, logStr); + } + break; + } + return true; +} + +void SystemInterface_SDL::SetMouseCursor(const Rml::String &cursor_name) +{ + SDL_Cursor *cursor = nullptr; if (cursor_name.empty() || cursor_name == "arrow") - cursor = cursor_default; - else if (cursor_name == "move") - cursor = cursor_move; - else if (cursor_name == "pointer") - cursor = cursor_pointer; - else if (cursor_name == "resize") - cursor = cursor_resize; - else if (cursor_name == "cross") - cursor = cursor_cross; - else if (cursor_name == "text") - cursor = cursor_text; - else if (cursor_name == "unavailable") - cursor = cursor_unavailable; - else if (Rml::StringUtilities::StartsWith(cursor_name, "rmlui-scroll")) - cursor = cursor_move; + mouse->ChangeCursor("cursornormal"); + else + mouse->ChangeCursor(cursor_name); - if (cursor) - SDL_SetCursor(cursor); } -void SystemInterface_SDL::SetClipboardText(const Rml::String& text_utf8) +void SystemInterface_SDL::SetClipboardText(const Rml::String &text_utf8) { SDL_SetClipboardText(text_utf8.c_str()); } -void SystemInterface_SDL::GetClipboardText(Rml::String& text) +void SystemInterface_SDL::GetClipboardText(Rml::String &text) { - char* raw_text = SDL_GetClipboardText(); + char *raw_text = SDL_GetClipboardText(); text = Rml::String(raw_text); SDL_free(raw_text); } -bool RmlSDL::InputEventHandler(Rml::Context* context, SDL_Event& ev) +bool RmlSDL::InputEventHandler(Rml::Context *context, SDL_Event &ev) { bool result = true; switch (ev.type) { - case SDL_MOUSEMOTION: result = context->ProcessMouseMove(ev.motion.x, ev.motion.y, GetKeyModifierState()); break; + case SDL_MOUSEMOTION: + result = context->ProcessMouseMove(ev.motion.x, ev.motion.y, GetKeyModifierState()); + break; case SDL_MOUSEBUTTONDOWN: result = context->ProcessMouseButtonDown(ConvertMouseButton(ev.button.button), GetKeyModifierState()); SDL_CaptureMouse(SDL_TRUE); @@ -119,14 +150,20 @@ bool RmlSDL::InputEventHandler(Rml::Context* context, SDL_Event& ev) SDL_CaptureMouse(SDL_FALSE); result = context->ProcessMouseButtonUp(ConvertMouseButton(ev.button.button), GetKeyModifierState()); break; - case SDL_MOUSEWHEEL: result = context->ProcessMouseWheel(float(-ev.wheel.y), GetKeyModifierState()); break; + case SDL_MOUSEWHEEL: + result = context->ProcessMouseWheel(float(-ev.wheel.y), GetKeyModifierState()); + break; case SDL_KEYDOWN: result = context->ProcessKeyDown(ConvertKey(ev.key.keysym.sym), GetKeyModifierState()); if (ev.key.keysym.sym == SDLK_RETURN || ev.key.keysym.sym == SDLK_KP_ENTER) result &= context->ProcessTextInput('\n'); break; - case SDL_KEYUP: result = context->ProcessKeyUp(ConvertKey(ev.key.keysym.sym), GetKeyModifierState()); break; - case SDL_TEXTINPUT: result = context->ProcessTextInput(Rml::String(&ev.text.text[0])); break; + case SDL_KEYUP: + result = context->ProcessKeyUp(ConvertKey(ev.key.keysym.sym), GetKeyModifierState()); + break; + case SDL_TEXTINPUT: + result = context->ProcessTextInput(Rml::String(&ev.text.text[0])); + break; case SDL_WINDOWEVENT: { switch (ev.window.event) @@ -137,11 +174,14 @@ bool RmlSDL::InputEventHandler(Rml::Context* context, SDL_Event& ev) context->SetDimensions(dimensions); } break; - case SDL_WINDOWEVENT_LEAVE: context->ProcessMouseLeave(); break; + case SDL_WINDOWEVENT_LEAVE: + context->ProcessMouseLeave(); + break; } } break; - default: break; + default: + break; } return result; @@ -276,10 +316,14 @@ int RmlSDL::ConvertMouseButton(int button) { switch (button) { - case SDL_BUTTON_LEFT: return 0; - case SDL_BUTTON_RIGHT: return 1; - case SDL_BUTTON_MIDDLE: return 2; - default: return 3; + case SDL_BUTTON_LEFT: + return 0; + case SDL_BUTTON_RIGHT: + return 1; + case SDL_BUTTON_MIDDLE: + return 2; + default: + return 3; } } diff --git a/rts/Rml/Backends/RmlUi_Platform_SDL.h b/rts/Rml/Backends/RmlUi_Platform_SDL.h index 937a6b08ec..a786f86f33 100644 --- a/rts/Rml/Backends/RmlUi_Platform_SDL.h +++ b/rts/Rml/Backends/RmlUi_Platform_SDL.h @@ -33,50 +33,59 @@ #include #include #include +#include "Game/UI/MouseHandler.h" +#include "lib/RmlSolLua/src/TranslationTable.h" -class SystemInterface_SDL : public Rml::SystemInterface { +class SystemInterface_SDL : public Rml::SystemInterface +{ public: SystemInterface_SDL(); ~SystemInterface_SDL(); // Optionally, provide or change the window to be used for setting the mouse cursors. - void SetWindow(SDL_Window* window); + void SetWindow(SDL_Window *window); + + int TranslateString(Rml::String &translated, const Rml::String &input) override; // -- Inherited from Rml::SystemInterface -- double GetElapsedTime() override; - void SetMouseCursor(const Rml::String& cursor_name) override; + void SetMouseCursor(const Rml::String &cursor_name) override; + + void SetClipboardText(const Rml::String &text) override; + void GetClipboardText(Rml::String &text) override; - void SetClipboardText(const Rml::String& text) override; - void GetClipboardText(Rml::String& text) override; + void SetTranslationTable(TranslationTable *tt) { translationTable = tt; }; private: - SDL_Window* window = nullptr; - - SDL_Cursor* cursor_default = nullptr; - SDL_Cursor* cursor_move = nullptr; - SDL_Cursor* cursor_pointer = nullptr; - SDL_Cursor* cursor_resize = nullptr; - SDL_Cursor* cursor_cross = nullptr; - SDL_Cursor* cursor_text = nullptr; - SDL_Cursor* cursor_unavailable = nullptr; + SDL_Window *window = nullptr; + + SDL_Cursor *cursor_default = nullptr; + SDL_Cursor *cursor_move = nullptr; + SDL_Cursor *cursor_pointer = nullptr; + SDL_Cursor *cursor_resize = nullptr; + SDL_Cursor *cursor_cross = nullptr; + SDL_Cursor *cursor_text = nullptr; + SDL_Cursor *cursor_unavailable = nullptr; + TranslationTable *translationTable = nullptr; }; -namespace RmlSDL { +namespace RmlSDL +{ -// Applies input on the context based on the given SDL event. -// @return True if the event is still propagating, false if it was handled by the context. -bool InputEventHandler(Rml::Context* context, SDL_Event& ev); + // Applies input on the context based on the given SDL event. + // @return True if the event is still propagating, false if it was handled by the context. + bool InputEventHandler(Rml::Context *context, SDL_Event &ev); -// Converts the SDL key to RmlUi key. -Rml::Input::KeyIdentifier ConvertKey(int sdl_key); + // Converts the SDL key to RmlUi key. + Rml::Input::KeyIdentifier ConvertKey(int sdl_key); -// Converts the SDL mouse button to RmlUi mouse button. -int ConvertMouseButton(int sdl_mouse_button); + // Converts the SDL mouse button to RmlUi mouse button. + int ConvertMouseButton(int sdl_mouse_button); -// Returns the active RmlUi key modifier state. -int GetKeyModifierState(); + // Returns the active RmlUi key modifier state. + int GetKeyModifierState(); } // namespace RmlSDL diff --git a/rts/Rml/RmlInputReceiver.h b/rts/Rml/RmlInputReceiver.h new file mode 100644 index 0000000000..b3a1b384f6 --- /dev/null +++ b/rts/Rml/RmlInputReceiver.h @@ -0,0 +1,22 @@ +/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ + +#ifndef RMLINPUT_H +#define RMLINPUT_H + +#include "Game/UI/InputReceiver.h" +#include "Rml/Backends/RmlUi_Backend.h" + +class CRmlInputReceiver : public CInputReceiver +{ +public: + CRmlInputReceiver() : CInputReceiver(FRONT), rml_active(false){}; + ~CRmlInputReceiver() = default; + + bool IsAbove(int x, int y) { return rml_active; }; + void setActive(bool active) { rml_active = active; }; + bool KeyPressed(int keyCode, int scanCode, bool isRepeat) { return RmlGui::ProcessKeyPressed(keyCode, scanCode, isRepeat); } + +private: + bool rml_active; +}; +#endif diff --git a/rts/lib/RmlSolLua/src/RmlSolLua.cpp b/rts/lib/RmlSolLua/src/RmlSolLua.cpp index a365f1cf5c..25dfbb27b7 100644 --- a/rts/lib/RmlSolLua/src/RmlSolLua.cpp +++ b/rts/lib/RmlSolLua/src/RmlSolLua.cpp @@ -4,41 +4,46 @@ #include #include "bind/bind.h" -#include "plugin/SolLuaPlugin.h" namespace Rml::SolLua { - void Initialise(sol::state_view* state) + SolLuaPlugin* Initialise(sol::state_view* state) { + SolLuaPlugin* slp; if (state != nullptr) { - ::Rml::RegisterPlugin(new SolLuaPlugin(*state)); - RegisterLua(state); + slp = new SolLuaPlugin(*state); + ::Rml::RegisterPlugin(slp); + RegisterLua(state, slp); } + return slp; } - void Initialise(sol::state_view* state, const Rml::String& lua_environment_identifier) + SolLuaPlugin* Initialise(sol::state_view* state, const Rml::String& lua_environment_identifier) { + SolLuaPlugin* slp; if (state != nullptr) { - ::Rml::RegisterPlugin(new SolLuaPlugin(*state, lua_environment_identifier)); - RegisterLua(state); + slp = new SolLuaPlugin(*state, lua_environment_identifier); + ::Rml::RegisterPlugin(slp); + RegisterLua(state, slp); } + return slp; } - void Initialize(sol::state_view* state) + SolLuaPlugin* Initialize(sol::state_view* state) { - Initialise(state); + return Initialise(state); } - void Initialize(sol::state_view* state, const Rml::String& lua_environment_identifier) + SolLuaPlugin* Initialize(sol::state_view* state, const Rml::String& lua_environment_identifier) { - Initialise(state, lua_environment_identifier); + return Initialise(state, lua_environment_identifier); } - void RegisterLua(sol::state_view* state) + void RegisterLua(sol::state_view* state, SolLuaPlugin* slp) { bind_color(*state); bind_context(*state); @@ -48,7 +53,7 @@ namespace Rml::SolLua bind_element_form(*state); bind_document(*state); bind_event(*state); - bind_global(*state); + bind_global(*state, &slp->translationTable); bind_log(*state); bind_vector(*state); bind_convert(*state); diff --git a/rts/lib/RmlSolLua/src/RmlSolLua.h b/rts/lib/RmlSolLua/src/RmlSolLua.h index 1fb2844377..0a4df142e0 100644 --- a/rts/lib/RmlSolLua/src/RmlSolLua.h +++ b/rts/lib/RmlSolLua/src/RmlSolLua.h @@ -1,6 +1,7 @@ #pragma once #include +#include "plugin/SolLuaPlugin.h" #ifdef RMLUILUA_API #undef RMLUILUA_API @@ -32,7 +33,7 @@ namespace Rml::SolLua /// Initializes RmlSolLua using the supplied Lua state. /// /// The Lua state to initialize into. - RMLUILUA_API void Initialise(sol::state_view* state); + RMLUILUA_API SolLuaPlugin* Initialise(sol::state_view* state); /// /// Initializes RmlSolLua using the supplied Lua state. @@ -40,13 +41,13 @@ namespace Rml::SolLua /// /// The Lua state to initialize into. /// The Lua variable name that is set to the document's id. - RMLUILUA_API void Initialise(sol::state_view* state, const Rml::String& lua_environment_identifier); + RMLUILUA_API SolLuaPlugin* Initialise(sol::state_view* state, const Rml::String& lua_environment_identifier); /// /// Initializes RmlSolLua using the supplied Lua state. /// /// The Lua state to initialize into. - RMLUILUA_API void Initialize(sol::state_view* state); + RMLUILUA_API SolLuaPlugin* Initialize(sol::state_view* state); /// /// Initializes RmlSolLua using the supplied Lua state. @@ -54,12 +55,12 @@ namespace Rml::SolLua /// /// The Lua state to initialize into. /// The Lua variable name that is set to the document's id. - RMLUILUA_API void Initialize(sol::state_view* state, const Rml::String& lua_environment_identifier); + RMLUILUA_API SolLuaPlugin* Initialize(sol::state_view* state, const Rml::String& lua_environment_identifier); /// /// Registers RmlSolLua into the specified Lua state. /// /// The Lua state to register into. - RMLUILUA_API void RegisterLua(sol::state_view* state); + RMLUILUA_API void RegisterLua(sol::state_view* state, SolLuaPlugin* slp); } // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/TranslationTable.h b/rts/lib/RmlSolLua/src/TranslationTable.h new file mode 100644 index 0000000000..67e2d047da --- /dev/null +++ b/rts/lib/RmlSolLua/src/TranslationTable.h @@ -0,0 +1,43 @@ +/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ + +#ifndef TRANSLATIONTABLE_H +#define TRANSLATIONTABLE_H + +#include +#include +#include + +class TranslationTable +{ +public: + TranslationTable(){}; + + // no-copy + TranslationTable(const TranslationTable &) = delete; + + bool addTranslation(std::string key, std::string translation) + { + bool existed = exists(key); + translations[key] = translation; + return existed; + }; + + bool exists(std::string key) { + return translations.count(key) > 0; + } + + std::string getTranslationString(std::string key) + { + return translations[key]; + }; + + void clear() + { + translations.clear(); + }; + +private: + std::unordered_map translations; +}; + +#endif // TRANSLATIONTABLE_H \ No newline at end of file diff --git a/rts/lib/RmlSolLua/src/bind/Context.cpp b/rts/lib/RmlSolLua/src/bind/Context.cpp index c10004952c..276614ac42 100644 --- a/rts/lib/RmlSolLua/src/bind/Context.cpp +++ b/rts/lib/RmlSolLua/src/bind/Context.cpp @@ -5,7 +5,6 @@ #include - namespace Rml::SolLua { @@ -14,28 +13,29 @@ namespace Rml::SolLua /// /// Return a SolLuaDocument. /// - auto getDocumentBypass(Rml::Context& self, int idx) + auto getDocumentBypass(Rml::Context &self, int idx) { auto document = self.GetDocument(idx); - auto result = dynamic_cast(document); + auto result = dynamic_cast(document); return result; } /// /// Return a SolLuaDocument. /// - auto getDocumentBypassString(Rml::Context& self, const Rml::String& name) + auto getDocumentBypassString(Rml::Context &self, const Rml::String &name) { auto document = self.GetDocument(name); - return dynamic_cast(document); + return dynamic_cast(document); } /// /// Helper function to fill the indexed table with data. /// - auto getDocument(Rml::Context& self) + auto getDocument(Rml::Context &self) { - std::function result = [&self](int idx) -> auto { return getDocumentBypass(self, idx); }; + std::function result = [&self](int idx) -> auto + { return getDocumentBypass(self, idx); }; return result; } } @@ -47,30 +47,38 @@ namespace Rml::SolLua /// /// The data model container. /// The table to bind. - void bindTable(SolLuaDataModel* data, sol::table& table) + void bindTable(SolLuaDataModel *data, sol::table &table) { - for (auto& [key, value] : table) + for (auto &[key, value] : table) { - auto skey = key.as(); + std::string skey; + if (key.is()) + { + skey = std::to_string(key.as()); + } + else + { + skey = key.as(); + } auto it = data->ObjectList.insert_or_assign(skey, value); if (value.get_type() == sol::type::function) { data->Constructor.BindEventCallback(skey, - [skey, cb = sol::protected_function{ value }, state = sol::state_view{ table.lua_state() }](Rml::DataModelHandle, Rml::Event& event, const Rml::VariantList& varlist) - { - if (cb.valid()) - { - std::vector args; - for (const auto& variant : varlist) - { - args.push_back(makeObjectFromVariant(&variant, state)); - } - auto pfr = cb(event, sol::as_args(args)); - if (!pfr.valid()) - ErrorHandler(cb.lua_state(), std::move(pfr)); - } - }); + [skey, cb = sol::protected_function{value}, state = sol::state_view{table.lua_state()}](Rml::DataModelHandle, Rml::Event &event, const Rml::VariantList &varlist) + { + if (cb.valid()) + { + std::vector args; + for (const auto &variant : varlist) + { + args.push_back(makeObjectFromVariant(&variant, state)); + } + auto pfr = cb(event, sol::as_args(args)); + if (!pfr.valid()) + ErrorHandler(cb.lua_state(), std::move(pfr)); + } + }); } else { @@ -87,20 +95,20 @@ namespace Rml::SolLua /// The table to bind as the data model. /// Lua state. /// A unique pointer to a Sol Lua Data Model. - std::unique_ptr openDataModel(Rml::Context& self, const Rml::String& name, sol::object model, sol::this_state s) + sol::table openDataModel(Rml::Context &self, const Rml::String &name, sol::object model, sol::this_state s) { - sol::state_view lua{ s }; + sol::state_view lua{s}; // Create data model. auto constructor = self.CreateDataModel(name); - auto data = std::make_unique(lua); + auto data = std::make_shared(lua); // Already created? Get existing. if (!constructor) { constructor = self.GetDataModel(name); - if (!constructor) - return data; + if (!constructor) + return sol::lua_nil; } data->Constructor = constructor; @@ -114,18 +122,35 @@ namespace Rml::SolLua datamodel::bindTable(data.get(), data->Table); } - return data; + auto obj_table = lua.create_table_with(); + + sol::table obj_metatable = lua.create_table_with(); + obj_metatable[sol::meta_function::new_index] = [data](sol::object t, const std::string &name, sol::object value, sol::this_state s) + { + data->Table.set(name, value); + data->ObjectList.insert_or_assign(name, value); + data->Handle.DirtyVariable(name); + }; + + obj_metatable[sol::meta_function::index] = [data](sol::object t, const std::string &name, sol::this_state s) + { + return data->Table.get(name); + }; + + obj_table[sol::metatable_key] = obj_metatable; + + return obj_table; } } namespace element { - auto getElementAtPoint1(Rml::Context& self, Rml::Vector2f point) + auto getElementAtPoint1(Rml::Context &self, Rml::Vector2f point) { return self.GetElementAtPoint(point); } - auto getElementAtPoint2(Rml::Context& self, Rml::Vector2f point, Rml::Element& ignore) + auto getElementAtPoint2(Rml::Context &self, Rml::Vector2f point, Rml::Element &ignore) { return self.GetElementAtPoint(point, &ignore); } @@ -135,59 +160,64 @@ namespace Rml::SolLua /// Binds the Rml::Context class to Lua. /// /// The Lua state to bind into. - void bind_context(sol::state_view& lua) + void bind_context(sol::state_view &lua) { - lua.new_usertype("Context", sol::no_constructor, - // M - "AddEventListener", &Rml::Context::AddEventListener, - "CreateDocument", [](Rml::Context& self) { return self.CreateDocument(); }, - "LoadDocument", [](Rml::Context& self, const Rml::String& document) { + lua.new_usertype( + "Context", sol::no_constructor, + // M + "AddEventListener", &Rml::Context::AddEventListener, + "CreateDocument", [](Rml::Context &self) + { return self.CreateDocument(); }, + "LoadDocument", [](Rml::Context &self, const Rml::String &document, sol::object w, sol::this_environment e, sol::this_state s) + { auto doc = self.LoadDocument(document); - return dynamic_cast(doc); - }, - "GetDocument", &document::getDocumentBypassString, - "Render", &Rml::Context::Render, - "UnloadAllDocuments", &Rml::Context::UnloadAllDocuments, - "UnloadDocument", &Rml::Context::UnloadDocument, - "Update", &Rml::Context::Update, - "OpenDataModel", &datamodel::openDataModel, - "RemoveDataModel", &Rml::Context::RemoveDataModel, - "ProcessMouseMove", &Rml::Context::ProcessMouseMove, - "ProcessMouseButtonDown", &Rml::Context::ProcessMouseButtonDown, - "ProcessMouseButtonUp", &Rml::Context::ProcessMouseButtonUp, - // "ProcessMouseWheel", &Rml::Context::ProcessMouseWheel, - "ProcessMouseWheel", sol::overload( - static_cast(&Rml::Context::ProcessMouseWheel), - static_cast(&Rml::Context::ProcessMouseWheel) - ), - "ProcessMouseLeave", &Rml::Context::ProcessMouseLeave, - "IsMouseInteracting", &Rml::Context::IsMouseInteracting, - "ProcessKeyDown", &Rml::Context::ProcessKeyDown, - "ProcessKeyUp", &Rml::Context::ProcessKeyUp, - "ProcessTextInput", sol::resolve(&Rml::Context::ProcessTextInput), - //-- - "EnableMouseCursor", &Rml::Context::EnableMouseCursor, - "ActivateTheme", &Rml::Context::ActivateTheme, - "IsThemeActive", &Rml::Context::IsThemeActive, - "GetElementAtPoint", sol::overload(&element::getElementAtPoint1, &element::getElementAtPoint2), - "PullDocumentToFront", &Rml::Context::PullDocumentToFront, - "PushDocumentToBack", &Rml::Context::PushDocumentToBack, - "UnfocusDocument", &Rml::Context::UnfocusDocument, - // RemoveEventListener - - // G+S - "dimensions", sol::property(&Rml::Context::GetDimensions, &Rml::Context::SetDimensions), - "dp_ratio", sol::property(&Rml::Context::GetDensityIndependentPixelRatio, &Rml::Context::SetDensityIndependentPixelRatio), - //-- - "clip_region", sol::property(&Rml::Context::GetActiveClipRegion, &Rml::Context::SetActiveClipRegion), - - // G - "documents", sol::readonly_property(&getIndexedTable), - "focus_element", sol::readonly_property(&Rml::Context::GetFocusElement), - "hover_element", sol::readonly_property(&Rml::Context::GetHoverElement), - "name", sol::readonly_property(&Rml::Context::GetName), - "root_element", sol::readonly_property(&Rml::Context::GetRootElement) - ); + auto env = dynamic_cast(doc)->GetLuaEnvironment(); + // sol::environment env(s,sol::create); + // env[sol::metatable_key] = e.env; + // sol::state_view state(s); + // sol::environment env(state, sol::create, state.globals()); + env["widget"] = w; + // dynamic_cast(doc)->m_environment = env; + return dynamic_cast(doc); }, + "GetDocument", &document::getDocumentBypassString, + "Render", &Rml::Context::Render, + "UnloadAllDocuments", &Rml::Context::UnloadAllDocuments, + "UnloadDocument", &Rml::Context::UnloadDocument, + "Update", &Rml::Context::Update, + "OpenDataModel", &datamodel::openDataModel, + "RemoveDataModel", &Rml::Context::RemoveDataModel, + "ProcessMouseMove", &Rml::Context::ProcessMouseMove, + "ProcessMouseButtonDown", &Rml::Context::ProcessMouseButtonDown, + "ProcessMouseButtonUp", &Rml::Context::ProcessMouseButtonUp, + // "ProcessMouseWheel", &Rml::Context::ProcessMouseWheel, + "ProcessMouseWheel", sol::overload(static_cast(&Rml::Context::ProcessMouseWheel), static_cast(&Rml::Context::ProcessMouseWheel)), + "ProcessMouseLeave", &Rml::Context::ProcessMouseLeave, + "IsMouseInteracting", &Rml::Context::IsMouseInteracting, + "ProcessKeyDown", &Rml::Context::ProcessKeyDown, + "ProcessKeyUp", &Rml::Context::ProcessKeyUp, + "ProcessTextInput", sol::resolve(&Rml::Context::ProcessTextInput), + //-- + "EnableMouseCursor", &Rml::Context::EnableMouseCursor, + "ActivateTheme", &Rml::Context::ActivateTheme, + "IsThemeActive", &Rml::Context::IsThemeActive, + "GetElementAtPoint", sol::overload(&element::getElementAtPoint1, &element::getElementAtPoint2), + "PullDocumentToFront", &Rml::Context::PullDocumentToFront, + "PushDocumentToBack", &Rml::Context::PushDocumentToBack, + "UnfocusDocument", &Rml::Context::UnfocusDocument, + // RemoveEventListener + + // G+S + "dimensions", sol::property(&Rml::Context::GetDimensions, &Rml::Context::SetDimensions), + "dp_ratio", sol::property(&Rml::Context::GetDensityIndependentPixelRatio, &Rml::Context::SetDensityIndependentPixelRatio), + //-- + "clip_region", sol::property(&Rml::Context::GetActiveClipRegion, &Rml::Context::SetActiveClipRegion), + + // G + "documents", sol::readonly_property(&getIndexedTable), + "focus_element", sol::readonly_property(&Rml::Context::GetFocusElement), + "hover_element", sol::readonly_property(&Rml::Context::GetHoverElement), + "name", sol::readonly_property(&Rml::Context::GetName), + "root_element", sol::readonly_property(&Rml::Context::GetRootElement)); } } // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/bind/Element.cpp b/rts/lib/RmlSolLua/src/bind/Element.cpp index f955d9a030..449f0d74b7 100644 --- a/rts/lib/RmlSolLua/src/bind/Element.cpp +++ b/rts/lib/RmlSolLua/src/bind/Element.cpp @@ -198,6 +198,15 @@ namespace Rml::SolLua "GetActivePseudoClasses", &Rml::Element::GetActivePseudoClasses, "IsPointWithinElement", &Rml::Element::IsPointWithinElement, "ProcessDefaultAction", &Rml::Element::ProcessDefaultAction, + "GetValue",[](Rml::Element& self) { + if (self.GetTagName() == "input") { + return dynamic_cast(&self)->GetValue(); + }else if (self.GetTagName() == "textarea") { + return dynamic_cast(&self)->GetValue(); + } + return std::string(); + }, + "GetChild", [](Rml::Element& self, int index) { return self.GetChild(index); }, // G+S "class_name", sol::property(&Rml::Element::GetClassNames, &Rml::Element::SetClassNames), diff --git a/rts/lib/RmlSolLua/src/bind/Global.cpp b/rts/lib/RmlSolLua/src/bind/Global.cpp index ebc1e0b998..3276e54db5 100644 --- a/rts/lib/RmlSolLua/src/bind/Global.cpp +++ b/rts/lib/RmlSolLua/src/bind/Global.cpp @@ -46,7 +46,7 @@ namespace Rml::SolLua #define _ENUM(N) lua["RmlKeyIdentifier"][#N] = Rml::Input::KI_##N - void bind_global(sol::state_view& lua) + void bind_global(sol::state_view& lua, TranslationTable* translationTable) { // We can't make this into an enum. @@ -251,7 +251,7 @@ namespace Rml::SolLua { "Target", Rml::DefaultActionPhase::Target }, { "TargetAndBubble", Rml::DefaultActionPhase::TargetAndBubble } }); - + struct rmlui {}; auto g = lua.new_usertype("rmlui", @@ -266,6 +266,12 @@ namespace Rml::SolLua //-- "GetContext", sol::resolve(&Rml::GetContext), "RegisterEventType", sol::overload(&functions::registerEventType4, &functions::registerEventType3), + "AddTranslationString", [translationTable](const Rml::String& key, const Rml::String& translation, sol::this_state s) { + return translationTable->addTranslation(key, translation); + }, + "ClearTranslations", [translationTable](sol::this_state s) { + return translationTable->clear(); + }, // G "contexts", sol::readonly_property(&getIndexedTable), diff --git a/rts/lib/RmlSolLua/src/bind/bind.h b/rts/lib/RmlSolLua/src/bind/bind.h index 9c208138b3..aba7fed1c7 100644 --- a/rts/lib/RmlSolLua/src/bind/bind.h +++ b/rts/lib/RmlSolLua/src/bind/bind.h @@ -2,6 +2,7 @@ #include #include +#include "../TranslationTable.h" #include @@ -195,7 +196,7 @@ namespace Rml::SolLua void bind_element_derived(sol::state_view& lua); void bind_element_form(sol::state_view& lua); void bind_event(sol::state_view& lua); - void bind_global(sol::state_view& lua); + void bind_global(sol::state_view& lua, TranslationTable* translationTable); void bind_log(sol::state_view& lua); void bind_vector(sol::state_view& lua); void bind_convert(sol::state_view& lua); diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaDataModel.cpp b/rts/lib/RmlSolLua/src/plugin/SolLuaDataModel.cpp index 7353c14715..2c54d89b38 100644 --- a/rts/lib/RmlSolLua/src/plugin/SolLuaDataModel.cpp +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaDataModel.cpp @@ -79,7 +79,7 @@ namespace Rml::SolLua // Get our table object. // Get the pointer as a string for use with holding onto the object. - auto table = object->as(); + sol::table table = object->as(); std::string tablestr = std::to_string(reinterpret_cast(table.pointer())); // Accessing by name. @@ -91,25 +91,25 @@ namespace Rml::SolLua return DataVariable{}; // Hold a reference to it and return the pointer. - auto it = m_model->ObjectList.insert_or_assign(tablestr + "_" + std::to_string(address.index), e); + auto it = m_model->ObjectList.insert_or_assign(tablestr + "_" + address.name, e); return DataVariable{ m_model->ObjectDef.get(), &(it.first->second) }; } // Accessing by index. else { // See if we have a key with the index. - auto has_index = table.get(address.index); + auto has_index = table.get(address.index+1); if (has_index.get_type() != sol::type::lua_nil) { - auto it = m_model->ObjectList.insert_or_assign(tablestr + "_" + std::to_string(address.index), has_index); + auto it = m_model->ObjectList.insert_or_assign(tablestr + "_" + std::to_string(address.index+1), has_index); return DataVariable{ m_model->ObjectDef.get(), &(it.first->second) }; } // Iterate through the entries and grab the nth entry. - int idx = 0; + int idx = 1; for (auto& [k, v] : table.pairs()) { - if (idx == address.index) + if (idx == address.index+1) { auto it = m_model->ObjectList.insert_or_assign(tablestr + "_" + std::to_string(idx), v); return DataVariable{ m_model->ObjectDef.get(), &(it.first->second) }; diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaDocument.h b/rts/lib/RmlSolLua/src/plugin/SolLuaDocument.h index debbd1e7b2..1762451c88 100644 --- a/rts/lib/RmlSolLua/src/plugin/SolLuaDocument.h +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaDocument.h @@ -59,9 +59,9 @@ namespace Rml::SolLua /// A const reference to the Lua environment identifier. const Rml::String& GetLuaEnvironmentIdentifier() const { return m_lua_env_identifier; } + sol::environment m_environment; protected: sol::state_view m_state; - sol::environment m_environment; Rml::String m_lua_env_identifier; }; diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.h b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.h index 1d44d149e8..239f7c192a 100644 --- a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.h +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.h @@ -3,12 +3,11 @@ #pragma once -#include "../RmlSolLua.h" - #include #include #include #include +#include "../TranslationTable.h" #include @@ -25,6 +24,7 @@ namespace Rml::SolLua SolLuaPlugin(sol::state_view lua_state); SolLuaPlugin(sol::state_view lua_state, const Rml::String& lua_environment_identifier); + TranslationTable translationTable; private: int GetEventClasses() override; From ee297a5a328f5a8fc9a9717b12f96971aab9f1e2 Mon Sep 17 00:00:00 2001 From: loveridge Date: Wed, 8 Nov 2023 23:14:07 -0700 Subject: [PATCH 11/58] key event handling, luaui reloading, rmlsol bug fixes --- rts/Game/Game.cpp | 9 + rts/Lua/LuaHandle.cpp | 13 +- rts/Lua/LuaHandle.h | 2 + rts/Lua/LuaUI.cpp | 2 +- rts/Lua/LuaUI.h | 2 +- rts/Rml/Backends/RmlUi_Backend.cpp | 74 +-- rts/Rml/Backends/RmlUi_Backend.h | 4 + rts/Rml/Backends/RmlUi_Platform_SDL.cpp | 53 ++- rts/Rml/Backends/RmlUi_Platform_SDL.h | 11 +- rts/lib/RmlSolLua/src/bind/Context.cpp | 12 +- rts/lib/RmlSolLua/src/bind/Global.cpp | 420 +++++++++--------- .../RmlSolLua/src/plugin/SolLuaDocument.cpp | 8 +- .../src/plugin/SolLuaEventListener.cpp | 5 +- 13 files changed, 337 insertions(+), 278 deletions(-) diff --git a/rts/Game/Game.cpp b/rts/Game/Game.cpp index ebd645e393..1a67e149ae 100644 --- a/rts/Game/Game.cpp +++ b/rts/Game/Game.cpp @@ -1073,6 +1073,9 @@ int CGame::KeyPressed(int keyCode, int scanCode, bool isRepeat) lastActionList = keyBindings.GetActionList(curKeyCodeChain, curScanCodeChain); + if (RmlGui::ProcessKeyPressed(keyCode, scanCode, isRepeat)) + return 0; + if (gameTextInput.ConsumePressedKey(keyCode, scanCode, lastActionList)) return 0; @@ -1112,6 +1115,9 @@ int CGame::KeyPressed(int keyCode, int scanCode, bool isRepeat) int CGame::KeyReleased(int keyCode, int scanCode) { + if (RmlGui::ProcessKeyReleased(keyCode, scanCode)) + return 0; + if (gameTextInput.ConsumeReleasedKey(keyCode, scanCode)) return 0; @@ -1145,6 +1151,9 @@ int CGame::KeyMapChanged() int CGame::TextInput(const std::string& utf8Text) { + if (RmlGui::ProcessTextInput(utf8Text)) + return 0; + if (eventHandler.TextInput(utf8Text)) return 0; diff --git a/rts/Lua/LuaHandle.cpp b/rts/Lua/LuaHandle.cpp index 1a491fe09d..1e7dd69037 100644 --- a/rts/Lua/LuaHandle.cpp +++ b/rts/Lua/LuaHandle.cpp @@ -79,7 +79,7 @@ bool CLuaHandle::devMode = false; * For now, to use these addons in a widget, prepend widget: and, for a gadget, prepend gadget:. For example, * * function widget:UnitCreated(unitID, unitDefID, unitTeam, builderID) - * ... + * ... * end * * Some functions may differ between (synced) gadget and widgets; those are in the [Synced - Unsynced Shared](#Synced___Unsynced_Shared) section. Essentially the reason is that all information should be available to synced (game logic controlling) gadgets, but restricted to unsynced gadget/widget (e.g. information about an enemy unit only detected via radar and not yet in LOS). In such cases the full (synced) param list is documented. @@ -172,6 +172,10 @@ void CLuaHandle::KillLua(bool inFreeHandler) if (inFreeHandler) Shutdown(); + if(rmlui) { + RmlGui::Reload(); + } + // 3. delete the lua_State // // must be done here: if called from a ctor, we want the @@ -3333,7 +3337,7 @@ bool CLuaHandle::MapDrawCmd(int playerID, int type, /*** - * + * * @function GameSetup * @string state * @bool ready @@ -3791,6 +3795,11 @@ int CLuaHandle::CallOutUpdateCallIn(lua_State* L) return 0; } +void CLuaHandle::InitializeRmlUi() +{ + RmlGui::InitializeLua(L); + rmlui = true; +} /******************************************************************************/ /******************************************************************************/ diff --git a/rts/Lua/LuaHandle.h b/rts/Lua/LuaHandle.h index 599e303a14..16b1e0d773 100644 --- a/rts/Lua/LuaHandle.h +++ b/rts/Lua/LuaHandle.h @@ -316,7 +316,9 @@ class CLuaHandle : public CEventClient void RunDrawCallIn(const LuaHashString& hs); void DrawObjectsLua(std::initializer_list bools, const char* func); + void InitializeRmlUi(); protected: + bool rmlui = false; bool userMode = false; bool killMe = false; // set for handles that fail to RunCallIn diff --git a/rts/Lua/LuaUI.cpp b/rts/Lua/LuaUI.cpp index 82d9613bdd..ad76d3b274 100644 --- a/rts/Lua/LuaUI.cpp +++ b/rts/Lua/LuaUI.cpp @@ -163,7 +163,7 @@ CLuaUI::CLuaUI() KillLua(); return; } - RmlGui::InitializeLua(L); + InitializeRmlUi(); lua_settop(L, 0); if (!LoadCode(L, std::move(code), file)) { diff --git a/rts/Lua/LuaUI.h b/rts/Lua/LuaUI.h index dc4bf3e143..07e495fa75 100644 --- a/rts/Lua/LuaUI.h +++ b/rts/Lua/LuaUI.h @@ -48,7 +48,7 @@ class CLuaUI : public CLuaHandle } static bool CanLoadHandler() { return true; } - static bool ReloadHandler() { return (RmlGui::Reload(), FreeHandler(), LoadFreeHandler()); } // NOTE the ',' + static bool ReloadHandler() { return (FreeHandler(), LoadFreeHandler()); } // NOTE the ',' static bool LoadFreeHandler() { return (LoadHandler() || FreeHandler()); } static bool LoadHandler(); diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index e81054acba..eda0bf927a 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -107,9 +107,8 @@ class VFSFileInterface : public Rml::FileInterface VFSFileInterface() {} Rml::FileHandle Open(const Rml::String &path) { - // LOG_L(L_FATAL, "[SpringApp::%s]OPENING: %s", __func__, path.c_str()); - // TODO: luaui makes the second one SPRING_VFS_MOD - const std::string mode = (CLuaHandle::GetDevMode()) ? SPRING_VFS_RAW_FIRST : SPRING_VFS_RAW_FIRST; + // LOG_L(L_FATAL, "[SpringApp::%s]OPENING: %s %d", __func__, path.c_str(), CLuaHandle::GetDevMode()); + const std::string mode = SPRING_VFS_RAW_FIRST; CFileHandler *fh = new CFileHandler(path, mode); if (!fh->FileExists()) { @@ -179,6 +178,7 @@ struct BackendData bool debuggerAttached = false; int winX = 1; int winY = 1; + lua_State *ls; }; static Rml::UniquePtr data; @@ -201,28 +201,11 @@ bool RmlGui::Initialize(SDL_Window *target_window, SDL_GLContext target_glcontex Rml::SetRenderInterface(RmlGui::GetRenderInterface()); data->system_interface.SetWindow(target_window); - // int w = 0; - // int h = 0; - // SDL_Renderer* renderer = SDL_GetRenderer(target_window); - // if (renderer == NULL) { - // const char* errmessage = SDL_GetError(); - // LOG_L(L_FATAL, "[SpringApp::%s] renderer get error: %s", __func__, errmessage); - // } - // int errcode = SDL_GetRendererOutputSize(renderer, &w, &h); - // if (errcode < 0) { - // const char* errmessage = SDL_GetError(); - // LOG_L(L_FATAL, "[SpringApp::%s] renderer output size error: %s", __func__, errmessage); - // } data->render_interface.SetViewport(winX, winY); data->winX = winX; data->winY = winY; Rml::Initialise(); - // bool ok = CLuaRml::LoadHandler(); - // if (!ok) { - // exit(1); - // } - // Rml::Lua::Interpreter::LoadFile(Rml::String("luainvaders/lua/start.lua")); Rml::LoadFontFace("fonts/FreeSansBold.otf", true); data->inputCon = input.AddHandler(&RmlGui::ProcessEvent); @@ -234,7 +217,8 @@ bool RmlGui::Initialize(SDL_Window *target_window, SDL_GLContext target_glcontex bool RmlGui::InitializeLua(lua_State *lua_state) { sol::state_view lua(lua_state); - Rml::SolLua::SolLuaPlugin* slp = Rml::SolLua::Initialise(&lua); + data->ls = lua_state; + Rml::SolLua::SolLuaPlugin *slp = Rml::SolLua::Initialise(&lua); data->system_interface.SetTranslationTable(&slp->translationTable); return true; } @@ -245,7 +229,6 @@ void RmlGui::Shutdown() // SDL_GL_DeleteContext(data->glcontext); // SDL_DestroyWindow(data->window); - Rml::Shutdown(); // data.reset(); @@ -296,7 +279,7 @@ void RmlGui::RequestExit() void RmlGui::CreateContext() { Rml::Context *context = Rml::CreateContext("overlay", Rml::Vector2i(data->winX, data->winY)); - Rml::Debugger::Initialise(context); + // Rml::Debugger::Initialise(context); RmlGui::AddContext(context); } @@ -378,6 +361,14 @@ bool RmlGui::ProcessMouseEvent(const SDL_Event &event) case SDL_MOUSEWHEEL: { bool handled = RmlSDL::InputEventHandler(data->contexts[0], ev); + if (handled && ev.type == SDL_MOUSEBUTTONDOWN) + { + Rml::Element *el = data->contexts[0]->GetFocusElement(); + if (el) + { + el->Blur(); + } + } data->inputReceiver.setActive(!handled); return handled; } @@ -395,9 +386,38 @@ bool RmlGui::ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat) { return false; } - return false; - // RmlSDL::InputEventHandler(data->contexts[0], ev); + auto kc = RmlSDL::ConvertKey(keyCode); + // if (kc == Rml::Input::KI_ESCAPE) + // { + // Rml::Element *el = data->contexts[0]->GetFocusElement(); + // if (el) + // { + // el->Blur(); + // } + // return false; + // } + + return !RmlSDL::EventKeyDown(data->contexts[0], kc); } + +bool RmlGui::ProcessKeyReleased(int keyCode, int scanCode) +{ + if (!data->initialized) + { + return false; + } + return !RmlSDL::EventKeyUp(data->contexts[0], RmlSDL::ConvertKey(keyCode)); +} + +bool RmlGui::ProcessTextInput(const std::string &text) +{ + if (!data->initialized) + { + return false; + } + return !RmlSDL::EventTextInput(data->contexts[0], text); +} + bool RmlGui::ProcessEvent(const SDL_Event &event) { if (!data->initialized) @@ -428,8 +448,10 @@ bool RmlGui::ProcessEvent(const SDL_Event &event) case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: case SDL_MOUSEWHEEL: - break; // handled by ProcessMouseEvent case SDL_KEYDOWN: + case SDL_KEYUP: + case SDL_TEXTINPUT: + break; // handled elsewhere default: { if (data != NULL && data->contexts.size() > 0) diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index 060304822b..f677d4657c 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -63,7 +63,11 @@ Rml::RenderInterface* GetRenderInterface(); bool ProcessEvent(const SDL_Event& event); bool ProcessMouseEvent(const SDL_Event& event); + bool ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat); +bool ProcessKeyReleased(int keyCode, int scanCode); +bool ProcessTextInput(const std::string& text); + // Request application closure during the next event processing call. void RequestExit(); void ToggleDebugger(); diff --git a/rts/Rml/Backends/RmlUi_Platform_SDL.cpp b/rts/Rml/Backends/RmlUi_Platform_SDL.cpp index 336880b9f3..7f9f791c41 100644 --- a/rts/Rml/Backends/RmlUi_Platform_SDL.cpp +++ b/rts/Rml/Backends/RmlUi_Platform_SDL.cpp @@ -36,24 +36,10 @@ SystemInterface_SDL::SystemInterface_SDL() { - cursor_default = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW); - cursor_move = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEALL); - cursor_pointer = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND); - cursor_resize = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENWSE); - cursor_cross = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_CROSSHAIR); - cursor_text = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_IBEAM); - cursor_unavailable = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NO); } SystemInterface_SDL::~SystemInterface_SDL() { - SDL_FreeCursor(cursor_default); - SDL_FreeCursor(cursor_move); - SDL_FreeCursor(cursor_pointer); - SDL_FreeCursor(cursor_resize); - SDL_FreeCursor(cursor_cross); - SDL_FreeCursor(cursor_text); - SDL_FreeCursor(cursor_unavailable); } void SystemInterface_SDL::SetWindow(SDL_Window *in_window) @@ -80,18 +66,15 @@ int SystemInterface_SDL::TranslateString(Rml::String &translated, const Rml::Str return 1; } -bool LogMessage(Rml::Log::Type type, const Rml::String &message) +bool SystemInterface_SDL::LogMessage(Rml::Log::Type type, const Rml::String &message) { - const char *fmtStr = "[LUA:Rml] %s"; + const char *fmtStr = "[Lua:Rml] %s"; const char *logStr = message.c_str(); switch (type) { - case Rml::Log::LT_INFO: - { - LOG_L(L_INFO, fmtStr, logStr); - } - break; + case Rml::Log::LT_ASSERT: + case Rml::Log::LT_DEBUG: { LOG_L(L_DEBUG, fmtStr, logStr); } @@ -106,19 +89,23 @@ bool LogMessage(Rml::Log::Type type, const Rml::String &message) LOG_L(L_WARNING, fmtStr, logStr); } break; + + case Rml::Log::LT_INFO: + default: + { + LOG_L(L_INFO, fmtStr, logStr); + } + break; } return true; } void SystemInterface_SDL::SetMouseCursor(const Rml::String &cursor_name) { - SDL_Cursor *cursor = nullptr; - if (cursor_name.empty() || cursor_name == "arrow") mouse->ChangeCursor("cursornormal"); else mouse->ChangeCursor(cursor_name); - } void SystemInterface_SDL::SetClipboardText(const Rml::String &text_utf8) @@ -133,6 +120,24 @@ void SystemInterface_SDL::GetClipboardText(Rml::String &text) SDL_free(raw_text); } +bool RmlSDL::EventKeyDown(Rml::Context *context, Rml::Input::KeyIdentifier key) +{ + bool result = context->ProcessKeyDown(key, GetKeyModifierState()); + if (key == Rml::Input::KI_RETURN || key == Rml::Input::KI_NUMPADENTER) + result &= context->ProcessTextInput('\n'); + return result; +} + +bool RmlSDL::EventKeyUp(Rml::Context *context, Rml::Input::KeyIdentifier key) +{ + return context->ProcessKeyUp(key, GetKeyModifierState()); +} + +bool RmlSDL::EventTextInput(Rml::Context *context, const std::string& text) +{ + return context->ProcessTextInput(Rml::String(text)); +} + bool RmlSDL::InputEventHandler(Rml::Context *context, SDL_Event &ev) { bool result = true; diff --git a/rts/Rml/Backends/RmlUi_Platform_SDL.h b/rts/Rml/Backends/RmlUi_Platform_SDL.h index a786f86f33..972a7b35fa 100644 --- a/rts/Rml/Backends/RmlUi_Platform_SDL.h +++ b/rts/Rml/Backends/RmlUi_Platform_SDL.h @@ -46,6 +46,7 @@ class SystemInterface_SDL : public Rml::SystemInterface void SetWindow(SDL_Window *window); int TranslateString(Rml::String &translated, const Rml::String &input) override; + virtual bool LogMessage(Rml::Log::Type type, const Rml::String& message) override; // -- Inherited from Rml::SystemInterface -- @@ -61,13 +62,6 @@ class SystemInterface_SDL : public Rml::SystemInterface private: SDL_Window *window = nullptr; - SDL_Cursor *cursor_default = nullptr; - SDL_Cursor *cursor_move = nullptr; - SDL_Cursor *cursor_pointer = nullptr; - SDL_Cursor *cursor_resize = nullptr; - SDL_Cursor *cursor_cross = nullptr; - SDL_Cursor *cursor_text = nullptr; - SDL_Cursor *cursor_unavailable = nullptr; TranslationTable *translationTable = nullptr; }; @@ -77,6 +71,9 @@ namespace RmlSDL // Applies input on the context based on the given SDL event. // @return True if the event is still propagating, false if it was handled by the context. bool InputEventHandler(Rml::Context *context, SDL_Event &ev); + bool EventKeyDown(Rml::Context *context, Rml::Input::KeyIdentifier key); + bool EventKeyUp(Rml::Context *context, Rml::Input::KeyIdentifier key); + bool EventTextInput(Rml::Context *context, const std::string& text); // Converts the SDL key to RmlUi key. Rml::Input::KeyIdentifier ConvertKey(int sdl_key); diff --git a/rts/lib/RmlSolLua/src/bind/Context.cpp b/rts/lib/RmlSolLua/src/bind/Context.cpp index 276614ac42..b1b391f90b 100644 --- a/rts/lib/RmlSolLua/src/bind/Context.cpp +++ b/rts/lib/RmlSolLua/src/bind/Context.cpp @@ -107,8 +107,8 @@ namespace Rml::SolLua if (!constructor) { constructor = self.GetDataModel(name); - if (!constructor) - return sol::lua_nil; + if (!constructor) + return sol::lua_nil; } data->Constructor = constructor; @@ -171,12 +171,16 @@ namespace Rml::SolLua "LoadDocument", [](Rml::Context &self, const Rml::String &document, sol::object w, sol::this_environment e, sol::this_state s) { auto doc = self.LoadDocument(document); + if (doc == nullptr) { + return (SolLuaDocument*) nullptr; + } auto env = dynamic_cast(doc)->GetLuaEnvironment(); - // sol::environment env(s,sol::create); + // sol::environment envi(e); // env[sol::metatable_key] = e.env; - // sol::state_view state(s); // sol::environment env(state, sol::create, state.globals()); env["widget"] = w; + // env["__HandleError"] = envi["__HandleError"]; + // dynamic_cast(doc)->m_environment = env; return dynamic_cast(doc); }, "GetDocument", &document::getDocumentBypassString, diff --git a/rts/lib/RmlSolLua/src/bind/Global.cpp b/rts/lib/RmlSolLua/src/bind/Global.cpp index 3276e54db5..10bd3125fb 100644 --- a/rts/lib/RmlSolLua/src/bind/Global.cpp +++ b/rts/lib/RmlSolLua/src/bind/Global.cpp @@ -44,214 +44,11 @@ namespace Rml::SolLua } } - #define _ENUM(N) lua["RmlKeyIdentifier"][#N] = Rml::Input::KI_##N + #define _ENUM(N) t[#N] = Rml::Input::KI_##N void bind_global(sol::state_view& lua, TranslationTable* translationTable) { - // We can't make this into an enum. - // The compiler can't handle everything under one call. - //lua.new_enum("RmlKeyIdentifier"); - lua.create_named_table("RmlKeyIdentifier"); - _ENUM(UNKNOWN); - _ENUM(SPACE); - _ENUM(0); - _ENUM(1); - _ENUM(2); - _ENUM(3); - _ENUM(4); - _ENUM(5); - _ENUM(6); - _ENUM(7); - _ENUM(8); - _ENUM(9); - _ENUM(A); - _ENUM(B); - _ENUM(C); - _ENUM(D); - _ENUM(E); - _ENUM(F); - _ENUM(G); - _ENUM(H); - _ENUM(I); - _ENUM(J); - _ENUM(K); - _ENUM(L); - _ENUM(M); - _ENUM(N); - _ENUM(O); - _ENUM(P); - _ENUM(Q); - _ENUM(R); - _ENUM(S); - _ENUM(T); - _ENUM(U); - _ENUM(V); - _ENUM(W); - _ENUM(X); - _ENUM(Y); - _ENUM(Z); - _ENUM(OEM_1); - _ENUM(OEM_PLUS); - _ENUM(OEM_COMMA); - _ENUM(OEM_MINUS); - _ENUM(OEM_PERIOD); - _ENUM(OEM_2); - _ENUM(OEM_3); - _ENUM(OEM_4); - _ENUM(OEM_5); - _ENUM(OEM_6); - _ENUM(OEM_7); - _ENUM(OEM_8); - _ENUM(OEM_102); - _ENUM(NUMPAD0); - _ENUM(NUMPAD1); - _ENUM(NUMPAD2); - _ENUM(NUMPAD3); - _ENUM(NUMPAD4); - _ENUM(NUMPAD5); - _ENUM(NUMPAD6); - _ENUM(NUMPAD7); - _ENUM(NUMPAD8); - _ENUM(NUMPAD9); - _ENUM(NUMPADENTER); - _ENUM(MULTIPLY); - _ENUM(ADD); - _ENUM(SEPARATOR); - _ENUM(SUBTRACT); - _ENUM(DECIMAL); - _ENUM(DIVIDE); - _ENUM(OEM_NEC_EQUAL); - _ENUM(BACK); - _ENUM(TAB); - _ENUM(CLEAR); - _ENUM(RETURN); - _ENUM(PAUSE); - _ENUM(CAPITAL); - _ENUM(KANA); - _ENUM(HANGUL); - _ENUM(JUNJA); - _ENUM(FINAL); - _ENUM(HANJA); - _ENUM(KANJI); - _ENUM(ESCAPE); - _ENUM(CONVERT); - _ENUM(NONCONVERT); - _ENUM(ACCEPT); - _ENUM(MODECHANGE); - _ENUM(PRIOR); - _ENUM(NEXT); - _ENUM(END); - _ENUM(HOME); - _ENUM(LEFT); - _ENUM(UP); - _ENUM(RIGHT); - _ENUM(DOWN); - _ENUM(SELECT); - _ENUM(PRINT); - _ENUM(EXECUTE); - _ENUM(SNAPSHOT); - _ENUM(INSERT); - _ENUM(DELETE); - _ENUM(HELP); - _ENUM(LWIN); - _ENUM(RWIN); - _ENUM(APPS); - _ENUM(POWER); - _ENUM(SLEEP); - _ENUM(WAKE); - _ENUM(F1); - _ENUM(F2); - _ENUM(F3); - _ENUM(F4); - _ENUM(F5); - _ENUM(F6); - _ENUM(F7); - _ENUM(F8); - _ENUM(F9); - _ENUM(F10); - _ENUM(F11); - _ENUM(F12); - _ENUM(F13); - _ENUM(F14); - _ENUM(F15); - _ENUM(F16); - _ENUM(F17); - _ENUM(F18); - _ENUM(F19); - _ENUM(F20); - _ENUM(F21); - _ENUM(F22); - _ENUM(F23); - _ENUM(F24); - _ENUM(NUMLOCK); - _ENUM(SCROLL); - _ENUM(OEM_FJ_JISHO); - _ENUM(OEM_FJ_MASSHOU); - _ENUM(OEM_FJ_TOUROKU); - _ENUM(OEM_FJ_LOYA); - _ENUM(OEM_FJ_ROYA); - _ENUM(LSHIFT); - _ENUM(RSHIFT); - _ENUM(LCONTROL); - _ENUM(RCONTROL); - _ENUM(LMENU); - _ENUM(RMENU); - _ENUM(BROWSER_BACK); - _ENUM(BROWSER_FORWARD); - _ENUM(BROWSER_REFRESH); - _ENUM(BROWSER_STOP); - _ENUM(BROWSER_SEARCH); - _ENUM(BROWSER_FAVORITES); - _ENUM(BROWSER_HOME); - _ENUM(VOLUME_MUTE); - _ENUM(VOLUME_DOWN); - _ENUM(VOLUME_UP); - _ENUM(MEDIA_NEXT_TRACK); - _ENUM(MEDIA_PREV_TRACK); - _ENUM(MEDIA_STOP); - _ENUM(MEDIA_PLAY_PAUSE); - _ENUM(LAUNCH_MAIL); - _ENUM(LAUNCH_MEDIA_SELECT); - _ENUM(LAUNCH_APP1); - _ENUM(LAUNCH_APP2); - _ENUM(OEM_AX); - _ENUM(ICO_HELP); - _ENUM(ICO_00); - _ENUM(PROCESSKEY); - _ENUM(ICO_CLEAR); - _ENUM(ATTN); - _ENUM(CRSEL); - _ENUM(EXSEL); - _ENUM(EREOF); - _ENUM(PLAY); - _ENUM(ZOOM); - _ENUM(PA1); - _ENUM(OEM_CLEAR); - - lua.new_enum("RmlKeyModifier", { - { "CTRL", Rml::Input::KM_CTRL }, - { "SHIFT", Rml::Input::KM_SHIFT }, - { "ALT", Rml::Input::KM_ALT }, - { "META", Rml::Input::KM_META }, - { "CAPSLOCK", Rml::Input::KM_CAPSLOCK }, - { "NUMLOCK", Rml::Input::KM_NUMLOCK }, - { "SCROLLLOCK", Rml::Input::KM_SCROLLLOCK } - }); - - //-- - lua.new_enum("RmlFontWeight", { - { "Auto", Rml::Style::FontWeight::Auto }, - { "Normal", Rml::Style::FontWeight::Normal }, - { "Bold", Rml::Style::FontWeight::Bold } - }); - - lua.new_enum("RmlDefaultActionPhase", { - { "None", Rml::DefaultActionPhase::None }, - { "Target", Rml::DefaultActionPhase::Target }, - { "TargetAndBubble", Rml::DefaultActionPhase::TargetAndBubble } - }); - struct rmlui {}; auto g = lua.new_usertype("rmlui", @@ -278,12 +75,217 @@ namespace Rml::SolLua //-- "version", sol::readonly_property(&Rml::GetVersion) ); - g.set("key_identifier", sol::readonly_property([&lua] { return lua["RmlKeyIdentifier"]; })); - g.set("key_modifier", sol::readonly_property([&lua] { return lua["RmlKeyModifier"]; })); - //-- - g.set("font_weight", sol::readonly_property([&lua] { return lua["RmlFontWeight"]; })); - g.set("default_action_phase", sol::readonly_property([&lua] { return lua["RmlDefaultActionPhase"]; })); + g.set("key_identifier", sol::readonly_property([](sol::this_state l) { + sol::state_view lua(l); + sol::table t = lua.create_table(); + _ENUM(UNKNOWN); + _ENUM(SPACE); + _ENUM(0); + _ENUM(1); + _ENUM(2); + _ENUM(3); + _ENUM(4); + _ENUM(5); + _ENUM(6); + _ENUM(7); + _ENUM(8); + _ENUM(9); + _ENUM(A); + _ENUM(B); + _ENUM(C); + _ENUM(D); + _ENUM(E); + _ENUM(F); + _ENUM(G); + _ENUM(H); + _ENUM(I); + _ENUM(J); + _ENUM(K); + _ENUM(L); + _ENUM(M); + _ENUM(N); + _ENUM(O); + _ENUM(P); + _ENUM(Q); + _ENUM(R); + _ENUM(S); + _ENUM(T); + _ENUM(U); + _ENUM(V); + _ENUM(W); + _ENUM(X); + _ENUM(Y); + _ENUM(Z); + _ENUM(OEM_1); + _ENUM(OEM_PLUS); + _ENUM(OEM_COMMA); + _ENUM(OEM_MINUS); + _ENUM(OEM_PERIOD); + _ENUM(OEM_2); + _ENUM(OEM_3); + _ENUM(OEM_4); + _ENUM(OEM_5); + _ENUM(OEM_6); + _ENUM(OEM_7); + _ENUM(OEM_8); + _ENUM(OEM_102); + _ENUM(NUMPAD0); + _ENUM(NUMPAD1); + _ENUM(NUMPAD2); + _ENUM(NUMPAD3); + _ENUM(NUMPAD4); + _ENUM(NUMPAD5); + _ENUM(NUMPAD6); + _ENUM(NUMPAD7); + _ENUM(NUMPAD8); + _ENUM(NUMPAD9); + _ENUM(NUMPADENTER); + _ENUM(MULTIPLY); + _ENUM(ADD); + _ENUM(SEPARATOR); + _ENUM(SUBTRACT); + _ENUM(DECIMAL); + _ENUM(DIVIDE); + _ENUM(OEM_NEC_EQUAL); + _ENUM(BACK); + _ENUM(TAB); + _ENUM(CLEAR); + _ENUM(RETURN); + _ENUM(PAUSE); + _ENUM(CAPITAL); + _ENUM(KANA); + _ENUM(HANGUL); + _ENUM(JUNJA); + _ENUM(FINAL); + _ENUM(HANJA); + _ENUM(KANJI); + _ENUM(ESCAPE); + _ENUM(CONVERT); + _ENUM(NONCONVERT); + _ENUM(ACCEPT); + _ENUM(MODECHANGE); + _ENUM(PRIOR); + _ENUM(NEXT); + _ENUM(END); + _ENUM(HOME); + _ENUM(LEFT); + _ENUM(UP); + _ENUM(RIGHT); + _ENUM(DOWN); + _ENUM(SELECT); + _ENUM(PRINT); + _ENUM(EXECUTE); + _ENUM(SNAPSHOT); + _ENUM(INSERT); + _ENUM(DELETE); + _ENUM(HELP); + _ENUM(LWIN); + _ENUM(RWIN); + _ENUM(APPS); + _ENUM(POWER); + _ENUM(SLEEP); + _ENUM(WAKE); + _ENUM(F1); + _ENUM(F2); + _ENUM(F3); + _ENUM(F4); + _ENUM(F5); + _ENUM(F6); + _ENUM(F7); + _ENUM(F8); + _ENUM(F9); + _ENUM(F10); + _ENUM(F11); + _ENUM(F12); + _ENUM(F13); + _ENUM(F14); + _ENUM(F15); + _ENUM(F16); + _ENUM(F17); + _ENUM(F18); + _ENUM(F19); + _ENUM(F20); + _ENUM(F21); + _ENUM(F22); + _ENUM(F23); + _ENUM(F24); + _ENUM(NUMLOCK); + _ENUM(SCROLL); + _ENUM(OEM_FJ_JISHO); + _ENUM(OEM_FJ_MASSHOU); + _ENUM(OEM_FJ_TOUROKU); + _ENUM(OEM_FJ_LOYA); + _ENUM(OEM_FJ_ROYA); + _ENUM(LSHIFT); + _ENUM(RSHIFT); + _ENUM(LCONTROL); + _ENUM(RCONTROL); + _ENUM(LMENU); + _ENUM(RMENU); + _ENUM(BROWSER_BACK); + _ENUM(BROWSER_FORWARD); + _ENUM(BROWSER_REFRESH); + _ENUM(BROWSER_STOP); + _ENUM(BROWSER_SEARCH); + _ENUM(BROWSER_FAVORITES); + _ENUM(BROWSER_HOME); + _ENUM(VOLUME_MUTE); + _ENUM(VOLUME_DOWN); + _ENUM(VOLUME_UP); + _ENUM(MEDIA_NEXT_TRACK); + _ENUM(MEDIA_PREV_TRACK); + _ENUM(MEDIA_STOP); + _ENUM(MEDIA_PLAY_PAUSE); + _ENUM(LAUNCH_MAIL); + _ENUM(LAUNCH_MEDIA_SELECT); + _ENUM(LAUNCH_APP1); + _ENUM(LAUNCH_APP2); + _ENUM(OEM_AX); + _ENUM(ICO_HELP); + _ENUM(ICO_00); + _ENUM(PROCESSKEY); + _ENUM(ICO_CLEAR); + _ENUM(ATTN); + _ENUM(CRSEL); + _ENUM(EXSEL); + _ENUM(EREOF); + _ENUM(PLAY); + _ENUM(ZOOM); + _ENUM(PA1); + _ENUM(OEM_CLEAR); + return t; + })); + + g.set("key_modifier", sol::readonly_property([](sol::this_state l) { + sol::state_view lua(l); + return sol::table::create_with(lua.lua_state(), + "CTRL", Rml::Input::KM_CTRL , + "SHIFT", Rml::Input::KM_SHIFT , + "ALT", Rml::Input::KM_ALT , + "META", Rml::Input::KM_META , + "CAPSLOCK", Rml::Input::KM_CAPSLOCK , + "NUMLOCK", Rml::Input::KM_NUMLOCK , + "SCROLLLOCK", Rml::Input::KM_SCROLLLOCK + ); + })); + + g.set("font_weight", sol::readonly_property([](sol::this_state l) { + sol::state_view lua(l); + return sol::table::create_with(lua.lua_state(), + "Auto", Rml::Style::FontWeight::Auto, + "Normal", Rml::Style::FontWeight::Normal, + "Bold", Rml::Style::FontWeight::Bold + ); + })); + g.set("default_action_phase", sol::readonly_property([](sol::this_state l) { + sol::state_view lua(l); + return sol::table::create_with(lua.lua_state(), + "None", Rml::DefaultActionPhase::None, + "Target", Rml::DefaultActionPhase::Target, + "TargetAndBubble", Rml::DefaultActionPhase::TargetAndBubble + ); + })); } #undef _ENUM diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaDocument.cpp b/rts/lib/RmlSolLua/src/plugin/SolLuaDocument.cpp index c258392c2d..0d30093bd7 100644 --- a/rts/lib/RmlSolLua/src/plugin/SolLuaDocument.cpp +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaDocument.cpp @@ -8,12 +8,16 @@ namespace Rml::SolLua { - sol::protected_function_result ErrorHandler(lua_State*, sol::protected_function_result pfr) + sol::protected_function_result ErrorHandler(lua_State* l, sol::protected_function_result pfr) { if (!pfr.valid()) { sol::error err = pfr; - Rml::Log::Message(Rml::Log::LT_ERROR, "[LUA][ERROR] %s", err.what()); + Rml::Log::Message(Rml::Log::LT_ERROR, "[Lua] %s", err.what()); + // sol::state_view lua(l); + // auto handle = lua["__HandleError"]; + // sol::protected_function pf = handle; + // pf(); } return pfr; } diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaEventListener.cpp b/rts/lib/RmlSolLua/src/plugin/SolLuaEventListener.cpp index 63f9ef4fb3..a497acb134 100644 --- a/rts/lib/RmlSolLua/src/plugin/SolLuaEventListener.cpp +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaEventListener.cpp @@ -74,7 +74,7 @@ namespace Rml::SolLua } else { - Log::Message(Log::LT_ERROR, "[LUA][ERROR] A function wasn't returned for the event listener."); + Log::Message(Log::LT_ERROR, "[Lua] A function wasn't returned for the event listener."); } } } @@ -106,8 +106,9 @@ namespace Rml::SolLua // Call the event! auto result = m_func.call(event, m_element, document); - if (!result.valid()) + if (!result.valid()){ ErrorHandler(m_func.lua_state(), std::move(result)); + } } } From 28857f127c3699a54a891418f2c85cfdc07a273f Mon Sep 17 00:00:00 2001 From: loveridge Date: Wed, 8 Nov 2023 23:15:00 -0700 Subject: [PATCH 12/58] remove rml demo files --- cont/LuaUI/Rml/LICENSE.txt | 212 ------- cont/LuaUI/Rml/LatoLatin-Bold.ttf | Bin 146156 -> 0 bytes cont/LuaUI/Rml/LatoLatin-BoldItalic.ttf | Bin 149756 -> 0 bytes cont/LuaUI/Rml/LatoLatin-Italic.ttf | Bin 153688 -> 0 bytes cont/LuaUI/Rml/LatoLatin-Regular.ttf | Bin 148540 -> 0 bytes cont/LuaUI/Rml/NotoEmoji-Regular.ttf | Bin 418804 -> 0 bytes cont/LuaUI/Rml/alien_small.tga | Bin 4140 -> 0 bytes cont/LuaUI/Rml/demo.rml | 28 - cont/LuaUI/Rml/hello_world.png | Bin 10463 -> 0 bytes cont/LuaUI/Rml/high_scores_alien_1.tga | Bin 16402 -> 0 bytes cont/LuaUI/Rml/high_scores_alien_2.tga | Bin 16402 -> 0 bytes cont/LuaUI/Rml/high_scores_alien_3.tga | Bin 16402 -> 0 bytes cont/LuaUI/Rml/high_scores_defender.tga | Bin 32786 -> 0 bytes cont/LuaUI/Rml/invader.rcss | 701 ------------------------ cont/LuaUI/Rml/invader.tga | Bin 1049115 -> 0 bytes cont/LuaUI/Rml/present.tga | Bin 40539 -> 0 bytes cont/LuaUI/Rml/rml.rcss | 61 --- cont/LuaUI/Rml/window.rml | 46 -- 18 files changed, 1048 deletions(-) delete mode 100644 cont/LuaUI/Rml/LICENSE.txt delete mode 100644 cont/LuaUI/Rml/LatoLatin-Bold.ttf delete mode 100644 cont/LuaUI/Rml/LatoLatin-BoldItalic.ttf delete mode 100644 cont/LuaUI/Rml/LatoLatin-Italic.ttf delete mode 100644 cont/LuaUI/Rml/LatoLatin-Regular.ttf delete mode 100644 cont/LuaUI/Rml/NotoEmoji-Regular.ttf delete mode 100644 cont/LuaUI/Rml/alien_small.tga delete mode 100644 cont/LuaUI/Rml/demo.rml delete mode 100644 cont/LuaUI/Rml/hello_world.png delete mode 100644 cont/LuaUI/Rml/high_scores_alien_1.tga delete mode 100644 cont/LuaUI/Rml/high_scores_alien_2.tga delete mode 100644 cont/LuaUI/Rml/high_scores_alien_3.tga delete mode 100644 cont/LuaUI/Rml/high_scores_defender.tga delete mode 100644 cont/LuaUI/Rml/invader.rcss delete mode 100644 cont/LuaUI/Rml/invader.tga delete mode 100644 cont/LuaUI/Rml/present.tga delete mode 100644 cont/LuaUI/Rml/rml.rcss delete mode 100644 cont/LuaUI/Rml/window.rml diff --git a/cont/LuaUI/Rml/LICENSE.txt b/cont/LuaUI/Rml/LICENSE.txt deleted file mode 100644 index 63ef813fa1..0000000000 --- a/cont/LuaUI/Rml/LICENSE.txt +++ /dev/null @@ -1,212 +0,0 @@ -The RmlUi samples include fonts that are separately licensed. They are listed -below along with their licenses. - ------------------------------------------------------------ ------------------------------------------------------------ ---- Lato --- ---- http://www.latofonts.com/ --- ---- --- ---- LatoLatin-Bold.ttf --- ---- LatoLatin-BoldItalic.ttf --- ---- LatoLatin-Italic.ttf --- ---- LatoLatin-Regular.ttf --- ------------------------------------------------------------ ------------------------------------------------------------ - -Copyright (c) 2010-2015, Łukasz Dziedzic (dziedzic@typoland.com), -with Reserved Font Name Lato. - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. - - ------------------------------------------------------------ ------------------------------------------------------------ ---- Noto Emoji --- ---- https://www.google.com/get/noto/ --- ---- --- ---- NotoEmoji-Regular.ttf --- ------------------------------------------------------------ ------------------------------------------------------------ - -This Font Software is licensed under the SIL Open Font License, -Version 1.1. - -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font -creation efforts of academic and linguistic communities, and to -provide a free and open framework in which fonts may be shared and -improved in partnership with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply to -any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software -components as distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, -deleting, or substituting -- in part or in whole -- any of the -components of the Original Version, by changing formats or by porting -the Font Software to a new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, -modify, redistribute, and sell modified and unmodified copies of the -Font Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, in -Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the -corresponding Copyright Holder. This restriction only applies to the -primary font name as presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created using -the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/cont/LuaUI/Rml/LatoLatin-Bold.ttf b/cont/LuaUI/Rml/LatoLatin-Bold.ttf deleted file mode 100644 index c598c24a3d270def997e6c8b32bc2425e7cd8d18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146156 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≧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

3=AUYLi1zm#9`5f{OeSj(h#op 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 z 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%0AQG2*(c4piwpZ>}`(B$9Nbq8?(LeGt;(KF}V)dMT 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 diff --git a/cont/LuaUI/Rml/demo.rml b/cont/LuaUI/Rml/demo.rml deleted file mode 100644 index 3e34c11c66..0000000000 --- a/cont/LuaUI/Rml/demo.rml +++ /dev/null @@ -1,28 +0,0 @@ - - - Demo - - - - - hello bar - - diff --git a/cont/LuaUI/Rml/hello_world.png b/cont/LuaUI/Rml/hello_world.png deleted file mode 100644 index bec0f8235b0305e8a56a088ea183436c3bd52e5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10463 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 diff --git a/cont/LuaUI/Rml/high_scores_alien_1.tga b/cont/LuaUI/Rml/high_scores_alien_1.tga deleted file mode 100644 index 722557738ec6db0728f9b7932098800726a8d939..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16402 zcmeI2KZ_JW5XE=b-~=%c6pciT42_JGo5;iT0`VJ&iGqTGC>%zD9A*llk(wwd7#Q3I z`_abtTc(!2W_PN4d*`^j?Se-#k6JRfQ2h45QQi64H9frr9f!CNoTK^L1;|8Rj5 z+;Z0&ne+;|4Cgz!p2e;*mER}nJ`)}btOb(-rN7|aB zb)?h%sPdigRq)mebkM~nCw}9UyWXgoUSYm6X6d&BC)`###>2|L`t6JGgStd}bg{wK z{LIP(d-4lcIK#bEF3Z8TuqUMQ4>|vo-7jo2?Xkf&^p)EFp6uWZ_fjd1e--{mY!tx! zKB527-4nKjb;Msf{^#7qC$;~M*kET!h`)6F$Ip9v9zPL>Z^pw)k5620b}HKlvlwH2 z?>_KnIf5fxZNHJbABdm#_<1C}6g~^qPAT73zCx7xo7s09;Rvt$0Kf-iP@#71h__lV!vgH33a@i~KdcgjGJrZMrcjXwIw>}Ww2g+xO|ds~5Mso+msLj?k9buBs&)m2C|w1;RYuGycq zyzk^hjyJL6c(a?6#?n(9+nJd+_Dme_&Sp1fRawrKv!{2eJG+_(%md~D^MHB4JYXI$ z510qc1LlDY58Tk$Tf%MOzVJYJBs>A04Qt#v>Ei=s?%lr7fNxN-1cIU)D17`B_+R5`{6sZ->6) zk&O;?;e#-Lg!ZvchUSa5cs`aq&=$Yg^+C80`tqsQN5WkjWIEaCKo>a!KLG03gl&L& zX}-XBVLY$Y2HN76xw+!5>sb6NAE2u(f2`CFu&*><#NxRvezC1a&-u(<|FwMSiscXN zE6o?gIO_;sUWR_w&vUQ`}T%)p8erKJ?wAX573VfupJI?$t~=w+l3SwuLw!@b7g>B`{B8bi{agGG$$!!J z-_-J5XphT(CGWrJ{wLHowR^|EWd9T0|4xl>Xpi`p?tjDYpL(x>Z$o|I{d_*(_z3$` z_lw11<0CcR&9`r3>Gx0g{hRfD>vN}`TYT=+Q^n(dp*psfe*cE&AG}9V={8?lx6WepEK|I(w4Qj`x;{>tr_WqzzvFOByG*_Io8 z$)2D(-_FVhx%^V&Wk`&eIcpjbT#s+NJcj32(>Yc#vIE^#Ri2dx#ehQpT_@J#m z2a7z9f6;}`D%WGnzRM8)*!@X(Ct$k|+UR4<`Wo;bvi`q_+Z%zs3E!kXXrqrYDgLa1 zL$Ckn_YoWdq~6b2`wPh?R!)SW=lgoJsPJ3kv9J2h0QJ0rP-) I;QD#sKUNipPyhe` diff --git a/cont/LuaUI/Rml/high_scores_alien_3.tga b/cont/LuaUI/Rml/high_scores_alien_3.tga deleted file mode 100644 index 9f832c3b74288da9c6c2bbb919df653f022166be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16402 zcmeI2zm5|z5XSST2m(C<}GW6ykJ&t&6dGMP=HG?QlX3crUUT#0U?g$Tsr@~8N89q+19 zdG=EKZGIkUf;YmkaK163XT*SgKrT=ZJV6It#+;eyHhM;Ev4u@+r`8t@$r78N`0-Kr zC2Zr5ziVMBP!~Nx2i>)>Yd&mY6WgivMMJV=q0!xZXDu$c>$=O|wfg$xPfW3i?bQ0B zAz5Pc6JJ_v*{>z`e``;+Q|n6>c@5qtKfC_@(3tna3*m7X|3Fvv(4zp_JY#Nj&}9r` zyK`;ZU#aoclv%P*eny{v%hG3oJ^D(37qzVsUJK+epxp@cp@S}C7|R@SzHR*JTMJ8J zpZX%TEJ@}6MbGn`xG-Z}h|DFl&gztjqAN{Q1#X4I5?R}VUr@pnPdwjqbe8RWVa$5$D1oHNi zu+RQ%V`TZ-d(GGC(suf>jSu*OPxw|^{&)V@+5hdD+V!;eTD(@5w%0G6q4)ol_0RfS z`d<8p{`}`Xr4jhN`fGhk^R@HiL-3{172iq=?`piS@R>ap{`i7V_*PnYXQker3S;4q zFZhISr6q~~bUNLD*=%+JyMOKdd_LcFVf*d9$g=;3p|du$b9$s7p(_@|CsXKi$_*H2z+C%a~)g0 zd;GKNL5KfX^WEd0RSyFHG3UF-KdT-D{x>P#y?EGq;Qjt_)AHTpZ|lKI1NgprB5-a2 zX!DFde)~%Kzl_vJEw&zbzkd$>e}>Y*v-N=U1I{V<4#`;>pv^P-$d^OD&&zz38i5*t Y8i5*t8i5*t8i5*t8i5*te=!1o0Dv&GtN;K2 diff --git a/cont/LuaUI/Rml/high_scores_defender.tga b/cont/LuaUI/Rml/high_scores_defender.tga deleted file mode 100644 index e10f9463b76a37c9387878a77659913703eebc79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32786 zcmeI3y>1gh6onTkjD#qVK%qpbs1Ow`TR~6DJETcV5z!*V6YvUofKcq4Ih=1ZBkhiz zm|cfRGxuEU%3j;Ep7Y(EpS?5gy2o9%i>~k9Jk3XbHUSeb0TVC*6EFc2FaZ-V0TVC* z6EFc2FaZ-V0TVC*6EJ~$An-`%cp~4(pUYp!U&&A8uN!r=p%JZUMmr2(5zWy3Ob(N` z@(=P}{z?A1QAb-ZM=P4q4g*+3Gp>E~zn6cJpUJ<=f69L~>S#kFTG5Pl7{DT$(f`o~ z;P69!B_Dz~TG5Pl7{DT$F$U5P(iX0+7ut5ay~b-bG$-vafJHQ89@NX}4~JUgxVGMC zPTG4t!y=k7?lB)?OpF?Tw8H=v(TsaM=K0L^qQ)QXFn~ogbNp|veaGMJ-|c_xM5@wq z>g<{Sx&Qb0@BZKYzx)46`|-8acK<)#^Z5SH_kX_s_x=B{wjZsvocsSV=jr@!-2AWC ze{R;kdi4bn*ME*$|E;y(&-GT!qp$y#`#)xTKQgCQp3`_g)fj#M$3{%1`@g>F_%d^9 zCGOg#GCs1dq!F#r_kWf9Kgk80Cq6@?@#p$RBU+>H|19@^pC&G}jsG71+%6yLIzy8j zZNwg}jDPfjQTKmK`pnAtz`gDVE#rJB{;Jt@tUmU&_j}Glz4w5&Fr5#uFO@2LB;>x%YnZC9-?6!B;5 z@8uEm^SeardgrM11xbybpRX(0yR~J$HT{3->>j?H|LME4&vhI*(w84TpY|R?Y{=54=q7 s{Cw-tw>}dv0TVC*6EFc2FaZ-V0TVC*6EFc2FaZ-V0TVC*69`1$FASy}dH?_b diff --git a/cont/LuaUI/Rml/invader.rcss b/cont/LuaUI/Rml/invader.rcss deleted file mode 100644 index 0509f27e54..0000000000 --- a/cont/LuaUI/Rml/invader.rcss +++ /dev/null @@ -1,701 +0,0 @@ -@spritesheet theme -{ - src: invader.tga; - - /* For high dpi screens, designates the scaling it is intended to be shown at. */ - resolution: 1x; - - /** - The following specifies a list of sprite names and associated rectangles into the image given above. - Any sprite given here can be specified in a decorator. Their names must be globally unique. - Rectangles are specified as: x y width height. With the origin assumed to be at the top left corner. - */ - title-bar-l: 147px 0px 82px 85px; - title-bar-c: 229px 0px 1px 85px; - title-bar-r: 231px 0px 15px 85px; - - /* huditems are vertically flipped titlebars */ - huditem-l: 147px 55px 82px -55px; - huditem-c: 229px 55px 1px -55px; - huditem-r: 231px 55px 15px -55px; - - icon-help: 128px 152px 51px 39px; - icon-invader: 179px 152px 51px 39px; - icon-game: 230px 152px 51px 39px; - icon-hiscore: 281px 152px 51px 39px; - icon-waves: 332px 152px 51px 39px; - icon-flag: 336px 191px 51px 39px; - icon-lives: 383px 152px 51px 39px; - icon-score: 434px 152px 51px 39px; - - window-tl: 0px 0px 133px 140px; - window-t: 134px 0px 1px 140px; - window-tr: 136px 0px 10px 140px; - window-l: 0px 139px 10px 1px; - window-c: 11px 139px 1px 1px; - window-r: 10px 139px -10px 1px; /* mirrored left */ - window-bl: 0px 140px 11px 11px; - window-b: 11px 140px 1px 11px; - window-br: 136px 140px 10px 11px; - - button: 247px 0px 159px 45px; - button-hover: 247px 45px 159px 45px; - button-active: 247px 90px 159px 45px; - - button-inner: 259px 19px 135px 1px; - button-inner-hover: 259px 64px 135px 1px; - button-inner-active: 259px 109px 135px 1px; - - text-l: 162px 192px 14px 31px; - text-c: 176px 192px 1px 31px; - textarea: 162px 193px 145px 31px; - textarea-inner: 173px 206px 127px 10px; - - selectbox-tl: 281px 275px 11px 9px; - selectbox-t: 292px 275px 1px 9px; - selectbox-tr: 294px 275px 11px 9px; - selectbox-l: 281px 283px 11px 1px; - selectbox-c: 292px 283px 1px 1px; - selectbox-bl: 281px 285px 11px 11px; - selectbox-b: 292px 285px 1px 11px; - selectbox-br: 294px 285px 11px 11px; - - selectvalue: 162px 192px 145px 37px; - selectvalue-hover: 162px 230px 145px 37px; - selectarrow: 307px 192px 30px 37px; - selectarrow-hover: 307px 230px 30px 37px; - selectarrow-active: 307px 268px 30px 37px; - - radio: 407px 0px 30px 30px; - radio-hover: 437px 0px 30px 30px; - radio-active: 467px 0px 30px 30px; - radio-checked: 407px 30px 30px 30px; - radio-checked-hover: 437px 30px 30px 30px; - radio-checked-active: 467px 30px 30px 30px; - - checkbox: 407px 60px 30px 30px; - checkbox-hover: 437px 60px 30px 30px; - checkbox-active: 467px 60px 30px 30px; - checkbox-checked: 407px 90px 30px 30px; - checkbox-checked-hover: 437px 90px 30px 30px; - checkbox-checked-active: 467px 90px 30px 30px; - - tableheader-l: 127px 192px 16px 31px; - tableheader-c: 143px 192px 2px 31px; - tableheader-r: 145px 192px 15px 31px; - - expand: 3px 232px 17px 17px; - expand-hover: 21px 232px 17px 17px; - expand-active: 39px 232px 17px 17px; - expand-collapsed: 3px 250px 17px 17px; - expand-collapsed-hover: 21px 250px 17px 17px; - expand-collapsed-active: 39px 250px 17px 17px; - - slidertrack-t: 70px 199px 27px 2px; - slidertrack-c: 70px 201px 27px 1px; - slidertrack-b: 70px 202px 27px 2px; - - sliderbar-t: 56px 152px 23px 23px; - sliderbar-c: 56px 175px 23px 1px; - sliderbar-b: 56px 176px 23px 22px; - sliderbar-hover-t: 80px 152px 23px 23px; - sliderbar-hover-c: 80px 175px 23px 1px; - sliderbar-hover-b: 80px 176px 23px 22px; - sliderbar-active-t: 104px 152px 23px 23px; - sliderbar-active-c: 104px 175px 23px 1px; - sliderbar-active-b: 104px 176px 23px 22px; - - sliderarrowdec: 0px 152px 27px 24px; - sliderarrowdec-hover: 0px 177px 27px 24px; - sliderarrowdec-active: 0px 202px 27px 24px; - - sliderarrowinc: 28px 152px 27px 24px; - sliderarrowinc-hover: 28px 177px 27px 24px; - sliderarrowinc-active: 28px 202px 27px 24px; - - range-track: 219px 194px 3px 32px; - range-track-inner: 220px 204px 1px 14px; - range-bar: 127px 191px 34px 32px; - range-dec: 3px 232px 17px 17px; - range-dec-hover: 21px 232px 17px 17px; - range-dec-active: 39px 232px 17px 17px; - range-inc: 3px 250px 17px 17px; - range-inc-hover: 21px 250px 17px 17px; - range-inc-active: 39px 250px 17px 17px; - - progress-l: 103px 267px 13px 34px; - progress-c: 116px 267px 54px 34px; - progress-r: 170px 267px 13px 34px; - progress-fill-l: 110px 302px 6px 34px; - progress-fill-c: 140px 302px 6px 34px; - progress-fill-r: 170px 302px 6px 34px; - gauge: 0px 271px 100px 86px; - gauge-fill: 0px 356px 100px 86px; -} - -body -{ - font-family: FreeSans; - font-weight: normal; - font-style: normal; - font-size: 15dp; - color: white; -} - -body.window -{ - padding-top: 43dp; - padding-bottom: 20dp; - - min-width: 250dp; - max-width: 800dp; - - min-height: 135dp; - max-height: 700dp; -} - -div#title_bar -{ - z-index: 1; - - position: absolute; - top: 7dp; - left: 0; - - text-align: left; - vertical-align: bottom; -} - -div#title_bar div#icon -{ - position: absolute; - left: 15dp; - top: -4dp; - - width: 51dp; - height: 39dp; -} - - -div#title_bar span -{ - padding-left: 85dp; - padding-right: 25dp; - padding-top: 18dp; - padding-bottom: 43dp; - - vertical-align: top; - - line-height: 24dp; - font-size: 20dp; - font-weight: bold; - - font-effect: glow(1dp black); - decorator: tiled-horizontal( title-bar-l, title-bar-c, title-bar-r ); -} - -div#window -{ - width: auto; - height: 100%; - padding: 10dp 15dp; - - decorator: tiled-box( - window-tl, window-t, window-tr, - window-l, window-c, window-r, - window-bl, window-b, window-br - ); -} - -div#content -{ - z-index: 2; - - width: auto; - height: 100%; - - overflow: hidden auto; - - text-align: center; -} - - - -p -{ - text-align: left; - margin-bottom: 1em; -} - -h1 -{ - margin-left: 0.4em; - margin-bottom: 0.4em; - - text-align: left; - font-size: 16dp; - font-weight: bold; - - font-effect: glow(1dp 1dp 1dp 1dp #1117); -} - - - -input, -select -{ - margin-left: 20dp; -} - -input.submit -{ - margin-left: 0; -} - - - -button, -input.submit -{ - display: inline-block; - - width: 159dp; - height: 33dp; - padding-top: 12dp; - - font-size: 16dp; - text-align: center; - tab-index: auto; - - decorator: image(button); -} - -button:focus, -input.submit:focus -{ - font-effect: blur(3dp #fff); -} - -button:hover, -input.submit:hover -{ - decorator: image(button-hover); -} - -button:active, -input.submit:active -{ - decorator: image(button-active); -} - -input.submit:disabled -{ - decorator: image(button); - image-color: rgba(50, 150, 150, 120); - cursor: unavailable; -} - -input.text, input.password -{ - box-sizing: border-box; - height: 31dp; - padding: 11dp 10dp 0; - decorator: tiled-horizontal( text-l, text-c, auto ); /* Right becomes mirrored left */ - cursor: text; -} - -textarea -{ - padding: 14dp 12dp 10dp; - decorator: ninepatch( textarea, textarea-inner, 1.0 ); - cursor: text; -} - -input.text, -input.password, -select, -textarea -{ - color: #333; - font-size: 13dp; -} - -table input.text -{ - box-sizing: border-box; - width: 100%; - height: 18dp; - margin: 0; - padding: 0 5dp; - line-height: 1.0; - - border-width: 1dp; - border-color: black; - background-color: white; - - font-size: 15dp; - - decorator: none; -} - - - -select -{ - width: 175dp; - height: 37dp; -} - -select selectvalue -{ - width: auto; - margin-right: 30dp; - - height: 25dp; - padding: 12dp 10dp 0dp 10dp; - - decorator: image( selectvalue ); -} - -select selectarrow -{ - width: 30dp; - height: 37dp; - - decorator: image( selectarrow ); -} - -select:hover selectarrow -{ - decorator: image( selectarrow-hover ); -} - -select:active selectarrow, -select selectarrow:checked -{ - decorator: image( selectarrow-active ); -} - -select selectbox -{ - margin-left: 1dp; - margin-top: -7dp; - margin-bottom: -10dp; - width: 162dp; - padding: 1dp 4dp 4dp 4dp; -} - -select selectbox, -tbody -{ - decorator: tiled-box( - selectbox-tl, selectbox-t, selectbox-tr, - selectbox-l, selectbox-c, auto, /* auto mirrors left */ - selectbox-bl, selectbox-b, selectbox-br - ); -} - -select selectbox option -{ - width: auto; - padding: 3dp 0 3dp 6dp; - background: #DDDD; -} - -select selectbox option:nth-child(even), -tr:nth-child(even) -{ - background: #FFFFFFA0; -} -select selectbox option:checked -{ - font-weight: bold; -} -select selectbox option:hover -{ - background: #FF5D5D; -} - - - -input.radio, -input.checkbox -{ - width: 30dp; - height: 30dp; - - vertical-align: -11dp; -} - -input.radio -{ - decorator: image(radio); -} - -input.radio:hover -{ - decorator: image(radio-hover); -} - -input.radio:active -{ - decorator: image(radio-active); -} - -input.radio:checked -{ - decorator: image(radio-checked); -} - -input.radio:checked:hover -{ - decorator: image(radio-checked-hover); -} - -input.radio:checked:active -{ - decorator: image(radio-checked-active); -} - -input.checkbox -{ - decorator: image(checkbox); -} - -input.checkbox:hover -{ - decorator: image(checkbox-hover); -} - -input.checkbox:active -{ - decorator: image(checkbox-active); -} - -input.checkbox:checked -{ - decorator: image(checkbox-checked); -} - -input.checkbox:checked:hover -{ - decorator: image(checkbox-checked-hover); -} - -input.checkbox:checked:active -{ - decorator: image(checkbox-checked-active); -} - -input.range { - width: 200dp; - height: 32dp; - vertical-align: -12dp; -} -input.range slidertrack { - margin-top: 3dp; - height: 22dp; - image-color: #ecc; - decorator: ninepatch( range-track, range-track-inner, 1.0 ); -} -input.range sliderbar { - margin-left: -8dp; - margin-right: -7dp; - margin-top: -3dp; - width: 34dp; - height: 23dp; - decorator: image( range-bar ); -} -input.range sliderbar:hover, input.range slidertrack:hover + sliderbar { - image-color: #cc0; -} -input.range sliderbar:active, input.range slidertrack:active + sliderbar { - image-color: #c80; -} -input.range sliderarrowdec, input.range sliderarrowinc { - width: 17dp; - height: 17dp; - margin-top: 6dp; -} -input.range sliderarrowdec { decorator: image( range-dec ); } -input.range sliderarrowinc { decorator: image( range-inc ); } -input.range sliderarrowdec:hover { decorator: image( range-dec-hover ); } -input.range sliderarrowinc:hover { decorator: image( range-inc-hover ); } -input.range sliderarrowdec:active { decorator: image( range-dec-active ); } -input.range sliderarrowinc:active { decorator: image( range-inc-active ); } - -thead tr { - height: 35dp; - decorator: tiled-horizontal( tableheader-l, tableheader-c, tableheader-r ); -} -thead td { - padding-top: 11dp; -} - -tbody { - /* Margin left/right only affects the background positioning for the decorator, not the cell placement */ - margin-left: 5dp; - margin-right: 4dp; - /* Padding top/bottom adds extra spacing between the header row and the body, and between the body and table bottom */ - padding-top: 4dp; - padding-bottom: 4dp; -} -tbody tr { - margin-left: 9dp; - margin-right: 8dp; - color: black; -} - - -expand -{ - display: block; - - margin: 1dp 0 1dp 5dp; - height: 17dp; - width: 17dp; - - decorator: image( expand ); -} - -expand:hover -{ - decorator: image( expand-hover ); -} - -expand:active -{ - decorator: image( expand-active ); -} - -expand.collapsed -{ - decorator: image( expand-collapsed ); -} - -expand.collapsed:hover -{ - decorator: image( expand-collapsed-hover ); -} - -expand.collapsed:active -{ - decorator: image( expand-collapsed-active ); -} - - -scrollbarvertical -{ - margin-top: -6dp; - margin-bottom: -6dp; - margin-right: -11dp; - width: 27dp; -} - -scrollbarvertical slidertrack -{ - decorator: tiled-vertical( slidertrack-t, slidertrack-c, slidertrack-b ); -} -scrollbarvertical slidertrack:active -{ - image-color: #aaa; -} - -scrollbarvertical sliderbar -{ - margin-left: 4dp; - width: 23dp; - min-height: 46dp; - - decorator: tiled-vertical( sliderbar-t, sliderbar-c, sliderbar-b ); -} -scrollbarvertical sliderbar:hover -{ - decorator: tiled-vertical( sliderbar-hover-t, sliderbar-hover-c, sliderbar-hover-b ); -} -scrollbarvertical sliderbar:active -{ - decorator: tiled-vertical( sliderbar-active-t, sliderbar-active-c, sliderbar-active-b ); -} - -scrollbarvertical sliderarrowdec, -scrollbarvertical sliderarrowinc -{ - width: 27dp; - height: 24dp; -} -scrollbarvertical sliderarrowdec -{ - decorator: image( sliderarrowdec ); -} -scrollbarvertical sliderarrowdec:hover -{ - decorator: image( sliderarrowdec-hover ); -} -scrollbarvertical sliderarrowdec:active -{ - decorator: image( sliderarrowdec-active ); -} - -scrollbarvertical sliderarrowinc -{ - decorator: image( sliderarrowinc ); -} -scrollbarvertical sliderarrowinc:hover -{ - decorator: image( sliderarrowinc-hover ); -} -scrollbarvertical sliderarrowinc:active -{ - decorator: image( sliderarrowinc-active ); -} - -scrollbarhorizontal -{ - width: 0; - height: 0; -} - -textarea scrollbarvertical -{ - cursor: arrow; - margin: 10dp 0 4dp 0; - width: 12dp; -} -textarea scrollbarvertical slidertrack -{ - decorator: none; -} -textarea scrollbarvertical sliderbar -{ - margin-left: 2dp; - width: 10dp; - min-height: 16dp; -} -textarea scrollbarvertical sliderarrowdec, -textarea scrollbarvertical sliderarrowinc -{ - width: 0; - height: 0; -} - -textarea scrollbarhorizontal -{ - cursor: arrow; - margin-left: 7dp; - height: 12dp; -} -textarea scrollbarhorizontal sliderbar -{ - background-color: #BC0000CC; - height: 8dp; - min-width: 10dp; -} -textarea scrollbarhorizontal sliderbar:hover -{ - background-color: #B82500CC; -} -textarea scrollbarhorizontal sliderbar:active -{ - background-color: #770000CC; -} diff --git a/cont/LuaUI/Rml/invader.tga b/cont/LuaUI/Rml/invader.tga deleted file mode 100644 index 3223e72f34e33f988e0962a35422f8a24cd4d3a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1049115 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�l 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 E4?lBWX#fBK diff --git a/cont/LuaUI/Rml/rml.rcss b/cont/LuaUI/Rml/rml.rcss deleted file mode 100644 index 0905b24b07..0000000000 --- a/cont/LuaUI/Rml/rml.rcss +++ /dev/null @@ -1,61 +0,0 @@ -/* -* Default styles for all the basic elements. -*/ - -div -{ - display: block; -} - -p -{ - display: block; -} - -h1 -{ - display: block; -} - -em -{ - font-style: italic; -} - -strong -{ - font-weight: bold; -} - -select -{ - text-align: left; -} - -tabset tabs -{ - display: block; -} - -table { - box-sizing: border-box; - display: table; -} -tr { - box-sizing: border-box; - display: table-row; -} -td { - box-sizing: border-box; - display: table-cell; -} -col { - box-sizing: border-box; - display: table-column; -} -colgroup { - display: table-column-group; -} -thead, tbody, tfoot { - display: table-row-group; -} diff --git a/cont/LuaUI/Rml/window.rml b/cont/LuaUI/Rml/window.rml deleted file mode 100644 index 493515ea70..0000000000 --- a/cont/LuaUI/Rml/window.rml +++ /dev/null @@ -1,46 +0,0 @@ - From f0386dcf72b5e9decd4a5cde3d9e1dda204bc0b3 Mon Sep 17 00:00:00 2001 From: loveridge Date: Thu, 9 Nov 2023 20:44:00 -0700 Subject: [PATCH 13/58] create contexts lua side --- rts/Rml/Backends/RmlUi_Backend.cpp | 73 +++++++++---------- rts/Rml/Backends/RmlUi_Backend.h | 2 +- rts/Rml/RmlInputReceiver.h | 1 - rts/System/Input/MouseInput.cpp | 2 +- rts/lib/RmlSolLua/src/RmlSolLua.cpp | 20 ++--- rts/lib/RmlSolLua/src/RmlSolLua.h | 18 +---- rts/lib/RmlSolLua/src/bind/Global.cpp | 4 +- rts/lib/RmlSolLua/src/bind/bind.h | 2 +- rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp | 8 +- rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.h | 5 +- 10 files changed, 55 insertions(+), 80 deletions(-) diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index eda0bf927a..969ac3c534 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -42,21 +42,13 @@ #include #include -// #include "System/FileSystem/ArchiveScanner.h" -// #include "System/FileSystem/DataDirLocater.h" #include "System/FileSystem/DataDirsAccess.h" -// #include "System/FileSystem/FileHandler.h" -// #include "System/FileSystem/FileSystem.h" -// #include "System/FileSystem/FileSystemInitializer.h" #include "System/Input/InputHandler.h" #include "Rml/RmlInputReceiver.h" #include "Game/UI/MouseHandler.h" -/** - Custom render interface example for the SDL/GL3 backend. +void createContext(const std::string &name); - Overloads the OpenGL3 render interface to load textures through SDL_image's built-in texture loading functionality. - */ class RenderInterface_GL3_SDL : public RenderInterface_GL3 { public: @@ -209,7 +201,7 @@ bool RmlGui::Initialize(SDL_Window *target_window, SDL_GLContext target_glcontex Rml::LoadFontFace("fonts/FreeSansBold.otf", true); data->inputCon = input.AddHandler(&RmlGui::ProcessEvent); - RmlGui::CreateOverlayContext(); + // RmlGui::CreateOverlayContext(); data->initialized = true; return true; } @@ -218,7 +210,7 @@ bool RmlGui::InitializeLua(lua_State *lua_state) { sol::state_view lua(lua_state); data->ls = lua_state; - Rml::SolLua::SolLuaPlugin *slp = Rml::SolLua::Initialise(&lua); + Rml::SolLua::SolLuaPlugin *slp = Rml::SolLua::Initialise(&lua, createContext); data->system_interface.SetTranslationTable(&slp->translationTable); return true; } @@ -237,6 +229,10 @@ void RmlGui::Shutdown() void RmlGui::Reload() { + if (!data->initialized) + { + return; + } LOG_L(L_FATAL, "[SpringApp::%s] reloading: ", __func__); SDL_Window *window = data->window; SDL_GLContext glcontext = data->glcontext; @@ -276,23 +272,23 @@ void RmlGui::RequestExit() // data->running = false; } -void RmlGui::CreateContext() +void createContext(const std::string &name) { - Rml::Context *context = Rml::CreateContext("overlay", Rml::Vector2i(data->winX, data->winY)); + Rml::Context *context = Rml::CreateContext(name, Rml::Vector2i(data->winX, data->winY)); // Rml::Debugger::Initialise(context); RmlGui::AddContext(context); } +void RmlGui::CreateContext(const std::string &name) +{ + createContext(name); +} + void RmlGui::CreateOverlayContext() { - Rml::Context *context = Rml::CreateContext("overlay", Rml::Vector2i(data->winX, data->winY)); - // Rml::Debugger::Initialise(context); - RmlGui::AddContext(context); - // Rml::Debugger::SetVisible(true); - // Rml::ElementDocument *document = context->LoadDocument("RmlUi/demo/demo.rml"); - // if (document) - // document->Show(); + createContext("overlay"); } + void RmlGui::AddContext(Rml::Context *context) { data->contexts.push_back(context); @@ -301,21 +297,22 @@ void RmlGui::AddContext(Rml::Context *context) void RmlGui::Update() { ZoneScopedN("RmlGui Update"); - if (!data->initialized) + if (!data->initialized || data->contexts.size() < 1) { return; } - // TODO: define if headless? +#ifndef HEADLESS for (auto &context : data->contexts) { context->Update(); } +#endif } void RmlGui::RenderFrame() { ZoneScopedN("RmlGui Draw"); - if (!data->initialized) + if (!data->initialized || data->contexts.size() < 1) { return; } @@ -338,20 +335,19 @@ void RmlGui::BeginFrame() void RmlGui::PresentFrame() { - data->render_interface.EndFrame(); - // SDL_GL_SwapWindow(data->window); - - // Optional, used to mark frames during performance profiling. RMLUI_FrameMark; } +/* + Return true if the event was handled by rmlui +*/ bool RmlGui::ProcessMouseEvent(const SDL_Event &event) { SDL_Event ev(event); if (data == NULL || data->contexts.size() < 1 || !data->initialized) { - return true; + return false; } switch (ev.type) { @@ -360,8 +356,8 @@ bool RmlGui::ProcessMouseEvent(const SDL_Event &event) case SDL_MOUSEBUTTONUP: case SDL_MOUSEWHEEL: { - bool handled = RmlSDL::InputEventHandler(data->contexts[0], ev); - if (handled && ev.type == SDL_MOUSEBUTTONDOWN) + bool handled = !RmlSDL::InputEventHandler(data->contexts[0], ev); + if (!handled && ev.type == SDL_MOUSEBUTTONDOWN) { Rml::Element *el = data->contexts[0]->GetFocusElement(); if (el) @@ -369,24 +365,27 @@ bool RmlGui::ProcessMouseEvent(const SDL_Event &event) el->Blur(); } } - data->inputReceiver.setActive(!handled); + data->inputReceiver.setActive(handled); return handled; } default: { data->inputReceiver.setActive(false); - return true; + return false; } } } +/* + Return true if the event was handled by rmlui +*/ bool RmlGui::ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat) { - if (!data->initialized) + if (!data->initialized || data->contexts.size() < 1) { return false; } - auto kc = RmlSDL::ConvertKey(keyCode); + auto kc = RmlSDL::ConvertKey(keyCode); // if (kc == Rml::Input::KI_ESCAPE) // { // Rml::Element *el = data->contexts[0]->GetFocusElement(); @@ -402,7 +401,7 @@ bool RmlGui::ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat) bool RmlGui::ProcessKeyReleased(int keyCode, int scanCode) { - if (!data->initialized) + if (!data->initialized || data->contexts.size() < 1) { return false; } @@ -411,7 +410,7 @@ bool RmlGui::ProcessKeyReleased(int keyCode, int scanCode) bool RmlGui::ProcessTextInput(const std::string &text) { - if (!data->initialized) + if (!data->initialized || data->contexts.size() < 1) { return false; } @@ -420,7 +419,7 @@ bool RmlGui::ProcessTextInput(const std::string &text) bool RmlGui::ProcessEvent(const SDL_Event &event) { - if (!data->initialized) + if (!data->initialized || data->contexts.size() < 1) { return false; } diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index f677d4657c..9a050a8b79 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -75,7 +75,7 @@ void ToggleDebugger(); void Update(); void RenderFrame(); -void CreateContext(); +void CreateContext(const std::string& name); void CreateOverlayContext(); void AddContext(Rml::Context *context); diff --git a/rts/Rml/RmlInputReceiver.h b/rts/Rml/RmlInputReceiver.h index b3a1b384f6..1aa3258a3f 100644 --- a/rts/Rml/RmlInputReceiver.h +++ b/rts/Rml/RmlInputReceiver.h @@ -14,7 +14,6 @@ class CRmlInputReceiver : public CInputReceiver bool IsAbove(int x, int y) { return rml_active; }; void setActive(bool active) { rml_active = active; }; - bool KeyPressed(int keyCode, int scanCode, bool isRepeat) { return RmlGui::ProcessKeyPressed(keyCode, scanCode, isRepeat); } private: bool rml_active; diff --git a/rts/System/Input/MouseInput.cpp b/rts/System/Input/MouseInput.cpp index f5fe459fb8..d1bce5206a 100644 --- a/rts/System/Input/MouseInput.cpp +++ b/rts/System/Input/MouseInput.cpp @@ -69,7 +69,7 @@ IMouseInput::~IMouseInput() bool IMouseInput::HandleSDLMouseEvent(const SDL_Event& event) { - if (!mouse->ButtonPressed() && !RmlGui::ProcessMouseEvent(event)) { + if (!mouse->ButtonPressed() && RmlGui::ProcessMouseEvent(event)) { return false; } switch (event.type) { diff --git a/rts/lib/RmlSolLua/src/RmlSolLua.cpp b/rts/lib/RmlSolLua/src/RmlSolLua.cpp index 25dfbb27b7..3162382cf0 100644 --- a/rts/lib/RmlSolLua/src/RmlSolLua.cpp +++ b/rts/lib/RmlSolLua/src/RmlSolLua.cpp @@ -9,40 +9,30 @@ namespace Rml::SolLua { - SolLuaPlugin* Initialise(sol::state_view* state) + SolLuaPlugin* Initialise(sol::state_view* state, void (*contextCreator)(const std::string& name)) { SolLuaPlugin* slp; if (state != nullptr) { - slp = new SolLuaPlugin(*state); + slp = new SolLuaPlugin(*state, contextCreator); ::Rml::RegisterPlugin(slp); RegisterLua(state, slp); } return slp; } - SolLuaPlugin* Initialise(sol::state_view* state, const Rml::String& lua_environment_identifier) + SolLuaPlugin* Initialise(sol::state_view* state, void (*contextCreator)(const std::string& name), const Rml::String& lua_environment_identifier) { SolLuaPlugin* slp; if (state != nullptr) { - slp = new SolLuaPlugin(*state, lua_environment_identifier); + slp = new SolLuaPlugin(*state, contextCreator, lua_environment_identifier); ::Rml::RegisterPlugin(slp); RegisterLua(state, slp); } return slp; } - SolLuaPlugin* Initialize(sol::state_view* state) - { - return Initialise(state); - } - - SolLuaPlugin* Initialize(sol::state_view* state, const Rml::String& lua_environment_identifier) - { - return Initialise(state, lua_environment_identifier); - } - void RegisterLua(sol::state_view* state, SolLuaPlugin* slp) { bind_color(*state); @@ -53,7 +43,7 @@ namespace Rml::SolLua bind_element_form(*state); bind_document(*state); bind_event(*state); - bind_global(*state, &slp->translationTable); + bind_global(*state, &slp->translationTable, slp->createContext); bind_log(*state); bind_vector(*state); bind_convert(*state); diff --git a/rts/lib/RmlSolLua/src/RmlSolLua.h b/rts/lib/RmlSolLua/src/RmlSolLua.h index 0a4df142e0..dcdc03c54c 100644 --- a/rts/lib/RmlSolLua/src/RmlSolLua.h +++ b/rts/lib/RmlSolLua/src/RmlSolLua.h @@ -33,7 +33,7 @@ namespace Rml::SolLua /// Initializes RmlSolLua using the supplied Lua state. /// /// The Lua state to initialize into. - RMLUILUA_API SolLuaPlugin* Initialise(sol::state_view* state); + RMLUILUA_API SolLuaPlugin* Initialise(sol::state_view* state, void (*contextCreator)(const std::string& name)); ///

/// Initializes RmlSolLua using the supplied Lua state. @@ -41,21 +41,7 @@ namespace Rml::SolLua /// /// The Lua state to initialize into. /// The Lua variable name that is set to the document's id. - RMLUILUA_API SolLuaPlugin* Initialise(sol::state_view* state, const Rml::String& lua_environment_identifier); - - /// - /// Initializes RmlSolLua using the supplied Lua state. - /// - /// The Lua state to initialize into. - RMLUILUA_API SolLuaPlugin* Initialize(sol::state_view* state); - - /// - /// Initializes RmlSolLua using the supplied Lua state. - /// Sets the Lua variable specified by lua_environment_identifier to the document's id when running Lua code. - /// - /// The Lua state to initialize into. - /// The Lua variable name that is set to the document's id. - RMLUILUA_API SolLuaPlugin* Initialize(sol::state_view* state, const Rml::String& lua_environment_identifier); + RMLUILUA_API SolLuaPlugin* Initialise(sol::state_view* state, void (*contextCreator)(const std::string& name), const Rml::String& lua_environment_identifier); /// /// Registers RmlSolLua into the specified Lua state. diff --git a/rts/lib/RmlSolLua/src/bind/Global.cpp b/rts/lib/RmlSolLua/src/bind/Global.cpp index 10bd3125fb..6c2aa57d1c 100644 --- a/rts/lib/RmlSolLua/src/bind/Global.cpp +++ b/rts/lib/RmlSolLua/src/bind/Global.cpp @@ -46,14 +46,14 @@ namespace Rml::SolLua #define _ENUM(N) t[#N] = Rml::Input::KI_##N - void bind_global(sol::state_view& lua, TranslationTable* translationTable) + void bind_global(sol::state_view& lua, TranslationTable* translationTable, void (*createContext)(const std::string& name)) { struct rmlui {}; auto g = lua.new_usertype("rmlui", // M - "CreateContext", &Rml::CreateContext, + "CreateContext", createContext, "LoadFontFace", sol::overload( &functions::loadFontFace1, &functions::loadFontFace2, diff --git a/rts/lib/RmlSolLua/src/bind/bind.h b/rts/lib/RmlSolLua/src/bind/bind.h index aba7fed1c7..54bdc30132 100644 --- a/rts/lib/RmlSolLua/src/bind/bind.h +++ b/rts/lib/RmlSolLua/src/bind/bind.h @@ -196,7 +196,7 @@ namespace Rml::SolLua void bind_element_derived(sol::state_view& lua); void bind_element_form(sol::state_view& lua); void bind_event(sol::state_view& lua); - void bind_global(sol::state_view& lua, TranslationTable* translationTable); + void bind_global(sol::state_view& lua, TranslationTable* translationTable, void (*createContext)(const std::string& name)); void bind_log(sol::state_view& lua); void bind_vector(sol::state_view& lua); void bind_convert(sol::state_view& lua); diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp index 4673b62914..fd61aa3be8 100644 --- a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp @@ -9,13 +9,13 @@ namespace Rml::SolLua { - SolLuaPlugin::SolLuaPlugin(sol::state_view lua_state) - : m_lua_state{ lua_state } + SolLuaPlugin::SolLuaPlugin(sol::state_view lua_state, void (*contextCreator)(const std::string& name)) + : m_lua_state{ lua_state }, createContext{contextCreator} { } - SolLuaPlugin::SolLuaPlugin(sol::state_view lua_state, const Rml::String& lua_environment_identifier) - : m_lua_state{ lua_state }, m_lua_env_identifier{ lua_environment_identifier } + SolLuaPlugin::SolLuaPlugin(sol::state_view lua_state, void (*contextCreator)(const std::string& name), const Rml::String& lua_environment_identifier) + : m_lua_state{ lua_state }, createContext{contextCreator}, m_lua_env_identifier{ lua_environment_identifier } { } diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.h b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.h index 239f7c192a..56eb5adb07 100644 --- a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.h +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.h @@ -21,10 +21,11 @@ namespace Rml::SolLua class RMLUILUA_API SolLuaPlugin : public Plugin { public: - SolLuaPlugin(sol::state_view lua_state); - SolLuaPlugin(sol::state_view lua_state, const Rml::String& lua_environment_identifier); + SolLuaPlugin(sol::state_view lua_state, void (*contextCreator)(const std::string& name)); + SolLuaPlugin(sol::state_view lua_state, void (*contextCreator)(const std::string& name), const Rml::String& lua_environment_identifier); TranslationTable translationTable; + void (*createContext)(const std::string& name); private: int GetEventClasses() override; From aae105509708683d8f47263fb3d84055852a78ba Mon Sep 17 00:00:00 2001 From: loveridge Date: Thu, 9 Nov 2023 21:19:01 -0700 Subject: [PATCH 14/58] clean up comments --- rts/Rml/Backends/RmlUi_Backend.cpp | 10 ---------- rts/Rml/Backends/RmlUi_Backend.h | 19 ++----------------- rts/System/Ecs/EcsMain.h | 2 -- 3 files changed, 2 insertions(+), 29 deletions(-) diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index 969ac3c534..d8e6bda664 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -267,11 +267,6 @@ Rml::RenderInterface *RmlGui::GetRenderInterface() return &data->render_interface; } -void RmlGui::RequestExit() -{ - // data->running = false; -} - void createContext(const std::string &name) { Rml::Context *context = Rml::CreateContext(name, Rml::Vector2i(data->winX, data->winY)); @@ -280,11 +275,6 @@ void createContext(const std::string &name) } void RmlGui::CreateContext(const std::string &name) -{ - createContext(name); -} - -void RmlGui::CreateOverlayContext() { createContext("overlay"); } diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index 9a050a8b79..b11ad16a87 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -39,26 +39,15 @@ using KeyDownCallback = bool (*)(Rml::Context* context, Rml::Input::KeyIdentifier key, int key_modifier, float native_dp_ratio, bool priority); -/** - This interface serves as a basic abstraction over the various backends included with RmlUi. It is mainly intended as an example to get something - simple up and running, and provides just enough functionality for the included samples. - - This interface may be used directly for simple applications and testing. However, for anything more advanced we recommend to use the backend as a - starting point and copy relevant parts into the main loop of your application. On the other hand, the underlying platform and renderer used by the - backend are intended to be re-usable as is. - */ namespace RmlGui { -// Initializes the backend, including the custom system and render interfaces, and opens a window for rendering the RmlUi context. bool Initialize(SDL_Window* target_window, SDL_GLContext target_glcontext, int winX, int winY); bool InitializeLua(lua_State* lua_state); -// Closes the window and release all resources owned by the backend, including the system and render interfaces. + void Shutdown(); void Reload(); -// Returns a pointer to the custom system interface which should be provided to RmlUi. Rml::SystemInterface* GetSystemInterface(); -// Returns a pointer to the custom render interface which should be provided to RmlUi. Rml::RenderInterface* GetRenderInterface(); bool ProcessEvent(const SDL_Event& event); @@ -68,20 +57,16 @@ bool ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat); bool ProcessKeyReleased(int keyCode, int scanCode); bool ProcessTextInput(const std::string& text); -// Request application closure during the next event processing call. -void RequestExit(); void ToggleDebugger(); void Update(); - void RenderFrame(); + void CreateContext(const std::string& name); void CreateOverlayContext(); void AddContext(Rml::Context *context); -// Prepares the render state to accept rendering commands from RmlUi, call before rendering the RmlUi context. void BeginFrame(); -// Presents the rendered frame to the screen, call after rendering the RmlUi context. void PresentFrame(); } diff --git a/rts/System/Ecs/EcsMain.h b/rts/System/Ecs/EcsMain.h index 1803c9214b..0ccd71b493 100644 --- a/rts/System/Ecs/EcsMain.h +++ b/rts/System/Ecs/EcsMain.h @@ -7,7 +7,6 @@ #ifdef cast #define RESTORE_LUA_MACROS #undef cast -// #undef registry #endif #define ENTT_USE_ATOMIC @@ -56,7 +55,6 @@ // from llimits.h #define cast(t, exp) ((t)(exp)) // from lstate.h -// #define registry(L) (&G(L)->l_registry) #undef RESTORE_LUA_MACROS #endif From 02a2344cb291420d3a20d54d9e9d6db7d5fd03b0 Mon Sep 17 00:00:00 2001 From: loveridge Date: Fri, 10 Nov 2023 09:34:01 -0700 Subject: [PATCH 15/58] allow multiple rmlui contexts --- rts/Rml/Backends/RmlUi_Backend.cpp | 151 +++++++++++++++++------------ rts/Rml/Backends/RmlUi_Backend.h | 2 +- 2 files changed, 88 insertions(+), 65 deletions(-) diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index d8e6bda664..c595462a51 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -243,11 +243,11 @@ void RmlGui::Reload() // RmlGui::CreateOverlayContext(); } -void RmlGui::ToggleDebugger() +void RmlGui::ToggleDebugger(int contextIndex) { if (data->debuggerAttached) { - Rml::Debugger::Initialise(data->contexts[0]); + Rml::Debugger::Initialise(data->contexts[contextIndex]); Rml::Debugger::SetVisible(true); } else @@ -334,36 +334,43 @@ void RmlGui::PresentFrame() */ bool RmlGui::ProcessMouseEvent(const SDL_Event &event) { - SDL_Event ev(event); if (data == NULL || data->contexts.size() < 1 || !data->initialized) { return false; } - switch (ev.type) - { - case SDL_MOUSEMOTION: - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - case SDL_MOUSEWHEEL: + bool result = false; + for (auto &context : data->contexts) { - bool handled = !RmlSDL::InputEventHandler(data->contexts[0], ev); - if (!handled && ev.type == SDL_MOUSEBUTTONDOWN) + SDL_Event ev(event); + switch (ev.type) + { + case SDL_MOUSEMOTION: + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEWHEEL: { - Rml::Element *el = data->contexts[0]->GetFocusElement(); - if (el) + bool handled = !RmlSDL::InputEventHandler(context, ev); + if (!handled && ev.type == SDL_MOUSEBUTTONDOWN) { - el->Blur(); + Rml::Element *el = context->GetFocusElement(); + if (el) + { + el->Blur(); + } } + data->inputReceiver.setActive(handled); + result |= handled; + break; + } + default: + { + data->inputReceiver.setActive(false); + result |= false; + break; + } } - data->inputReceiver.setActive(handled); - return handled; - } - default: - { - data->inputReceiver.setActive(false); - return false; - } } + return result; } /* @@ -375,18 +382,23 @@ bool RmlGui::ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat) { return false; } - auto kc = RmlSDL::ConvertKey(keyCode); - // if (kc == Rml::Input::KI_ESCAPE) - // { - // Rml::Element *el = data->contexts[0]->GetFocusElement(); - // if (el) - // { - // el->Blur(); - // } - // return false; - // } - - return !RmlSDL::EventKeyDown(data->contexts[0], kc); + bool result = false; + for (auto &context : data->contexts) + { + auto kc = RmlSDL::ConvertKey(keyCode); + // if (kc == Rml::Input::KI_ESCAPE) + // { + // Rml::Element *el = context->GetFocusElement(); + // if (el) + // { + // el->Blur(); + // } + // return false; + // } + + result |= !RmlSDL::EventKeyDown(context, kc); + } + return result; } bool RmlGui::ProcessKeyReleased(int keyCode, int scanCode) @@ -395,7 +407,12 @@ bool RmlGui::ProcessKeyReleased(int keyCode, int scanCode) { return false; } - return !RmlSDL::EventKeyUp(data->contexts[0], RmlSDL::ConvertKey(keyCode)); + bool result = false; + for (auto &context : data->contexts) + { + result |= !RmlSDL::EventKeyUp(context, RmlSDL::ConvertKey(keyCode)); + } + return result; } bool RmlGui::ProcessTextInput(const std::string &text) @@ -404,7 +421,12 @@ bool RmlGui::ProcessTextInput(const std::string &text) { return false; } - return !RmlSDL::EventTextInput(data->contexts[0], text); + bool result = false; + for (auto &context : data->contexts) + { + result |= !RmlSDL::EventTextInput(context, text); + } + return result; } bool RmlGui::ProcessEvent(const SDL_Event &event) @@ -413,40 +435,41 @@ bool RmlGui::ProcessEvent(const SDL_Event &event) { return false; } - SDL_Event ev(event); - switch (ev.type) - { - case SDL_WINDOWEVENT: + for (auto &context : data->contexts) { - switch (ev.window.event) + SDL_Event ev(event); + switch (ev.type) + { + case SDL_WINDOWEVENT: { - case SDL_WINDOWEVENT_SIZE_CHANGED: + switch (ev.window.event) + { + case SDL_WINDOWEVENT_SIZE_CHANGED: + { + Rml::Vector2i dimensions(ev.window.data1, ev.window.data2); + data->render_interface.SetViewport(dimensions.x, dimensions.y); + data->winX = dimensions.x; + data->winY = dimensions.y; + } + break; + } + RmlSDL::InputEventHandler(context, ev); + } + break; + case SDL_MOUSEMOTION: + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEWHEEL: + case SDL_KEYDOWN: + case SDL_KEYUP: + case SDL_TEXTINPUT: + break; // handled elsewhere + default: { - Rml::Vector2i dimensions(ev.window.data1, ev.window.data2); - data->render_interface.SetViewport(dimensions.x, dimensions.y); - data->winX = dimensions.x; - data->winY = dimensions.y; + RmlSDL::InputEventHandler(context, ev); } break; } - if (data != NULL && data->contexts.size() > 0) - RmlSDL::InputEventHandler(data->contexts[0], ev); - } - break; - case SDL_MOUSEMOTION: - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - case SDL_MOUSEWHEEL: - case SDL_KEYDOWN: - case SDL_KEYUP: - case SDL_TEXTINPUT: - break; // handled elsewhere - default: - { - if (data != NULL && data->contexts.size() > 0) - RmlSDL::InputEventHandler(data->contexts[0], ev); - } - break; } return false; } diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index b11ad16a87..f4601f2a22 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -57,7 +57,7 @@ bool ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat); bool ProcessKeyReleased(int keyCode, int scanCode); bool ProcessTextInput(const std::string& text); -void ToggleDebugger(); +void ToggleDebugger(int contextIndex); void Update(); void RenderFrame(); From fc4e86bc81ae55ee84be809f15794bd7540f1892 Mon Sep 17 00:00:00 2001 From: loveridge Date: Fri, 10 Nov 2023 14:02:02 -0700 Subject: [PATCH 16/58] pull out inner loop of processevent calls --- rts/Rml/Backends/RmlUi_Backend.cpp | 134 +++++++++++++----------- rts/Rml/Backends/RmlUi_Backend.h | 1 - rts/Rml/Backends/RmlUi_Platform_SDL.cpp | 4 +- rts/Rml/Backends/RmlUi_Platform_SDL.h | 2 +- 4 files changed, 73 insertions(+), 68 deletions(-) diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index c595462a51..fad97f23b4 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -201,7 +201,6 @@ bool RmlGui::Initialize(SDL_Window *target_window, SDL_GLContext target_glcontex Rml::LoadFontFace("fonts/FreeSansBold.otf", true); data->inputCon = input.AddHandler(&RmlGui::ProcessEvent); - // RmlGui::CreateOverlayContext(); data->initialized = true; return true; } @@ -240,7 +239,6 @@ void RmlGui::Reload() int winY = data->winY; RmlGui::Shutdown(); RmlGui::Initialize(window, glcontext, winX, winY); - // RmlGui::CreateOverlayContext(); } void RmlGui::ToggleDebugger(int contextIndex) @@ -276,7 +274,7 @@ void createContext(const std::string &name) void RmlGui::CreateContext(const std::string &name) { - createContext("overlay"); + createContext(name); } void RmlGui::AddContext(Rml::Context *context) @@ -329,6 +327,36 @@ void RmlGui::PresentFrame() RMLUI_FrameMark; } +bool processContextMouseEvent(Rml::Context *context, const SDL_Event &event) +{ + switch (event.type) + { + case SDL_MOUSEMOTION: + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEWHEEL: + { + bool handled = !RmlSDL::InputEventHandler(context, event); + if (!handled && event.type == SDL_MOUSEBUTTONDOWN) + { + Rml::Element *el = context->GetFocusElement(); + if (el) + { + el->Blur(); + } + } + data->inputReceiver.setActive(handled); + return handled; + } + default: + { + data->inputReceiver.setActive(false); + return false; + } + } + return false; +} + /* Return true if the event was handled by rmlui */ @@ -341,34 +369,7 @@ bool RmlGui::ProcessMouseEvent(const SDL_Event &event) bool result = false; for (auto &context : data->contexts) { - SDL_Event ev(event); - switch (ev.type) - { - case SDL_MOUSEMOTION: - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - case SDL_MOUSEWHEEL: - { - bool handled = !RmlSDL::InputEventHandler(context, ev); - if (!handled && ev.type == SDL_MOUSEBUTTONDOWN) - { - Rml::Element *el = context->GetFocusElement(); - if (el) - { - el->Blur(); - } - } - data->inputReceiver.setActive(handled); - result |= handled; - break; - } - default: - { - data->inputReceiver.setActive(false); - result |= false; - break; - } - } + result |= processContextMouseEvent(context, event); } return result; } @@ -429,47 +430,52 @@ bool RmlGui::ProcessTextInput(const std::string &text) return result; } -bool RmlGui::ProcessEvent(const SDL_Event &event) +bool processContextEvent(Rml::Context *context, const SDL_Event &event) { - if (!data->initialized || data->contexts.size() < 1) + switch (event.type) { - return false; - } - for (auto &context : data->contexts) + case SDL_WINDOWEVENT: { - SDL_Event ev(event); - switch (ev.type) - { - case SDL_WINDOWEVENT: + switch (event.window.event) { - switch (ev.window.event) - { - case SDL_WINDOWEVENT_SIZE_CHANGED: - { - Rml::Vector2i dimensions(ev.window.data1, ev.window.data2); - data->render_interface.SetViewport(dimensions.x, dimensions.y); - data->winX = dimensions.x; - data->winY = dimensions.y; - } - break; - } - RmlSDL::InputEventHandler(context, ev); - } - break; - case SDL_MOUSEMOTION: - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - case SDL_MOUSEWHEEL: - case SDL_KEYDOWN: - case SDL_KEYUP: - case SDL_TEXTINPUT: - break; // handled elsewhere - default: + case SDL_WINDOWEVENT_SIZE_CHANGED: { - RmlSDL::InputEventHandler(context, ev); + Rml::Vector2i dimensions(event.window.data1, event.window.data2); + data->render_interface.SetViewport(dimensions.x, dimensions.y); + data->winX = dimensions.x; + data->winY = dimensions.y; } break; } + RmlSDL::InputEventHandler(context, event); + } + break; + case SDL_MOUSEMOTION: + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEWHEEL: + case SDL_KEYDOWN: + case SDL_KEYUP: + case SDL_TEXTINPUT: + break; // handled elsewhere + default: + { + RmlSDL::InputEventHandler(context, event); + } + break; + } + return false; +} + +bool RmlGui::ProcessEvent(const SDL_Event &event) +{ + if (!data->initialized || data->contexts.size() < 1) + { + return false; + } + for (auto &context : data->contexts) + { + processContextEvent(context, event); } return false; } diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index f4601f2a22..85b873ca0e 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -63,7 +63,6 @@ void Update(); void RenderFrame(); void CreateContext(const std::string& name); -void CreateOverlayContext(); void AddContext(Rml::Context *context); void BeginFrame(); diff --git a/rts/Rml/Backends/RmlUi_Platform_SDL.cpp b/rts/Rml/Backends/RmlUi_Platform_SDL.cpp index 7f9f791c41..c563e396cd 100644 --- a/rts/Rml/Backends/RmlUi_Platform_SDL.cpp +++ b/rts/Rml/Backends/RmlUi_Platform_SDL.cpp @@ -133,12 +133,12 @@ bool RmlSDL::EventKeyUp(Rml::Context *context, Rml::Input::KeyIdentifier key) return context->ProcessKeyUp(key, GetKeyModifierState()); } -bool RmlSDL::EventTextInput(Rml::Context *context, const std::string& text) +bool RmlSDL::EventTextInput(Rml::Context *context, const std::string &text) { return context->ProcessTextInput(Rml::String(text)); } -bool RmlSDL::InputEventHandler(Rml::Context *context, SDL_Event &ev) +bool RmlSDL::InputEventHandler(Rml::Context *context, const SDL_Event &ev) { bool result = true; diff --git a/rts/Rml/Backends/RmlUi_Platform_SDL.h b/rts/Rml/Backends/RmlUi_Platform_SDL.h index 972a7b35fa..6c5ff72122 100644 --- a/rts/Rml/Backends/RmlUi_Platform_SDL.h +++ b/rts/Rml/Backends/RmlUi_Platform_SDL.h @@ -70,7 +70,7 @@ namespace RmlSDL // Applies input on the context based on the given SDL event. // @return True if the event is still propagating, false if it was handled by the context. - bool InputEventHandler(Rml::Context *context, SDL_Event &ev); + bool InputEventHandler(Rml::Context *context, const SDL_Event &ev); bool EventKeyDown(Rml::Context *context, Rml::Input::KeyIdentifier key); bool EventKeyUp(Rml::Context *context, Rml::Input::KeyIdentifier key); bool EventTextInput(Rml::Context *context, const std::string& text); From 5ccc2c4fa1bea807adcef576c9ca56ae88d2c558 Mon Sep 17 00:00:00 2001 From: loveridge Date: Fri, 10 Nov 2023 14:31:59 -0700 Subject: [PATCH 17/58] add comment to make it clear certain events are not captured --- rts/Rml/Backends/RmlUi_Backend.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index fad97f23b4..ce1e716821 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -464,6 +464,7 @@ bool processContextEvent(Rml::Context *context, const SDL_Event &event) } break; } + // these events are not captured, and should continue propogating return false; } @@ -473,9 +474,10 @@ bool RmlGui::ProcessEvent(const SDL_Event &event) { return false; } + bool result = false; for (auto &context : data->contexts) { - processContextEvent(context, event); + result |= processContextEvent(context, event); } - return false; + return result; } From 3f6b9574fce9211bbfadf3d680831b34373864ff Mon Sep 17 00:00:00 2001 From: Marek Rusinowski Date: Sat, 11 Nov 2023 18:28:33 +0100 Subject: [PATCH 18/58] Update RmlUi to latest git version --- rts/lib/RmlUi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rts/lib/RmlUi b/rts/lib/RmlUi index 50e24c71bb..e1184fa891 160000 --- a/rts/lib/RmlUi +++ b/rts/lib/RmlUi @@ -1 +1 @@ -Subproject commit 50e24c71bbbb524f1c2d06fd2fd322bc6e1a6831 +Subproject commit e1184fa8913df3178dfeea4f34b0453219d8e142 From 5c37983cad845d201214f271f28296fd10b27603 Mon Sep 17 00:00:00 2001 From: loveridge Date: Sat, 11 Nov 2023 17:07:37 -0700 Subject: [PATCH 19/58] headless building and lua support --- rts/Lua/LuaHandle.cpp | 3 +- rts/Rml/Backends/RmlUi_Backend.cpp | 5 ++++ rts/Rml/Backends/RmlUi_Platform_SDL.cpp | 5 ++-- rts/Rml/Backends/RmlUi_Renderer_Headless.h | 33 ++++++++++++++++++++++ rts/builds/headless/CMakeLists.txt | 6 +++- rts/builds/legacy/CMakeLists.txt | 2 ++ rts/lib/CMakeLists.txt | 12 +++++++- rts/lib/headlessStubs/sdlstub.c | 17 +++++++++++ 8 files changed, 76 insertions(+), 7 deletions(-) create mode 100644 rts/Rml/Backends/RmlUi_Renderer_Headless.h diff --git a/rts/Lua/LuaHandle.cpp b/rts/Lua/LuaHandle.cpp index 1e7dd69037..44b2abb4f5 100644 --- a/rts/Lua/LuaHandle.cpp +++ b/rts/Lua/LuaHandle.cpp @@ -3797,8 +3797,7 @@ int CLuaHandle::CallOutUpdateCallIn(lua_State* L) void CLuaHandle::InitializeRmlUi() { - RmlGui::InitializeLua(L); - rmlui = true; + rmlui = RmlGui::InitializeLua(L); } /******************************************************************************/ diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index ce1e716821..367f110c3e 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -29,6 +29,7 @@ #include "RmlUi_Backend.h" #include "RmlUi_Platform_SDL.h" #include "RmlUi_Renderer_GL3.h" +#include "RmlUi_Renderer_Headless.h" #include #include #include @@ -156,7 +157,11 @@ class VFSFileInterface : public Rml::FileInterface struct BackendData { SystemInterface_SDL system_interface; +#ifndef HEADLESS RenderInterface_GL3_SDL render_interface; +#else + RenderInterface_Headless render_interface; +#endif VFSFileInterface file_interface; SDL_Window *window = nullptr; diff --git a/rts/Rml/Backends/RmlUi_Platform_SDL.cpp b/rts/Rml/Backends/RmlUi_Platform_SDL.cpp index c563e396cd..45f97c3bc8 100644 --- a/rts/Rml/Backends/RmlUi_Platform_SDL.cpp +++ b/rts/Rml/Backends/RmlUi_Platform_SDL.cpp @@ -33,6 +33,7 @@ #include #include #include +#include SystemInterface_SDL::SystemInterface_SDL() { @@ -49,9 +50,7 @@ void SystemInterface_SDL::SetWindow(SDL_Window *in_window) double SystemInterface_SDL::GetElapsedTime() { - static const Uint64 start = SDL_GetPerformanceCounter(); - static const double frequency = double(SDL_GetPerformanceFrequency()); - return double(SDL_GetPerformanceCounter() - start) / frequency; + return spring_gettime().toSecsf(); } int SystemInterface_SDL::TranslateString(Rml::String &translated, const Rml::String &input) diff --git a/rts/Rml/Backends/RmlUi_Renderer_Headless.h b/rts/Rml/Backends/RmlUi_Renderer_Headless.h new file mode 100644 index 0000000000..ca13da1ba3 --- /dev/null +++ b/rts/Rml/Backends/RmlUi_Renderer_Headless.h @@ -0,0 +1,33 @@ +#include +#include + +class RenderInterface_Headless : public Rml::RenderInterface +{ +public: + RenderInterface_Headless(){}; + ~RenderInterface_Headless(){}; + explicit operator bool() const { return true; } + void RenderGeometry(Rml::Vertex *vertices, int num_vertices, int *indices, int num_indices, Rml::TextureHandle texture, const Rml::Vector2f &translation) {}; + + Rml::CompiledGeometryHandle CompileGeometry(Rml::Vertex *vertices, int num_vertices, int *indices, int num_indices, Rml::TextureHandle texture) + { + return (Rml::CompiledGeometryHandle)nullptr; + }; + void RenderCompiledGeometry(Rml::CompiledGeometryHandle geometry, const Rml::Vector2f &translation){}; + void ReleaseCompiledGeometry(Rml::CompiledGeometryHandle geometry){}; + void SetScissorRegion(int x, int y, int width, int height) {}; + void EnableScissorRegion(bool enable) {}; + bool LoadTexture(Rml::TextureHandle &texture_handle, Rml::Vector2i &texture_dimensions, const Rml::String &source) + { + return true; + }; + bool GenerateTexture(Rml::TextureHandle &texture_handle, const Rml::byte *source, const Rml::Vector2i &source_dimensions) + { + return true; + }; + void ReleaseTexture(Rml::TextureHandle texture){}; + void SetTransform(const Rml::Matrix4f *transform){}; + void BeginFrame(){}; + void EndFrame(){}; + void SetViewport(int x, int y){}; +}; diff --git a/rts/builds/headless/CMakeLists.txt b/rts/builds/headless/CMakeLists.txt index 41cfe619de..ccd86140d6 100644 --- a/rts/builds/headless/CMakeLists.txt +++ b/rts/builds/headless/CMakeLists.txt @@ -28,13 +28,17 @@ list(APPEND engineHeadlessLibraries no-sound) list(APPEND engineHeadlessLibraries engineSim) list(APPEND engineHeadlessLibraries pr-downloader) list(APPEND engineHeadlessLibraries RmlCore) +list(APPEND engineHeadlessLibraries RmlDebugger) +list(APPEND engineHeadlessLibraries RmlSolLua) +list(APPEND engineHeadlessLibraries lunasvg) include_directories(${ENGINE_SRC_ROOT_DIR}/lib/assimp/include) include_directories(${ENGINE_SRC_ROOT_DIR}/lib/asio/include) include_directories(${ENGINE_SRC_ROOT_DIR}/lib/slimsig/include) +include_directories(${ENGINE_SRC_ROOT_DIR}/lib/RmlSolLua/src) +include_directories(${ENGINE_SRC_ROOT_DIR}/lib/lunasvg/include) include_directories(${ENGINE_SRC_ROOT_DIR}/lib/cereal/include) - ### Build the executable add_executable(engine-headless ${engineSources} ${ENGINE_ICON}) target_link_libraries(engine-headless no-sound ${engineHeadlessLibraries} no-sound) diff --git a/rts/builds/legacy/CMakeLists.txt b/rts/builds/legacy/CMakeLists.txt index 5df94f217f..82681947e8 100644 --- a/rts/builds/legacy/CMakeLists.txt +++ b/rts/builds/legacy/CMakeLists.txt @@ -68,6 +68,7 @@ list(APPEND engineLibraries pr-downloader) list(APPEND engineLibraries RmlCore) list(APPEND engineLibraries RmlDebugger) list(APPEND engineLibraries RmlSolLua) +list(APPEND engineLibraries lunasvg) ### Assemble external incude dirs list(APPEND engineIncludes ${OPENAL_INCLUDE_DIR}) @@ -75,6 +76,7 @@ list(APPEND engineIncludes ${ENGINE_SRC_ROOT_DIR}/lib/asio/include) list(APPEND engineIncludes ${ENGINE_SRC_ROOT_DIR}/lib/slimsig/include) list(APPEND engineIncludes ${ENGINE_SRC_ROOT_DIR}/lib/cereal/include) list(APPEND engineIncludes ${ENGINE_SRC_ROOT_DIR}/lib/RmlSolLua/src) +list(APPEND engineIncludes ${ENGINE_SRC_ROOT_DIR}/lib/lunasvg/include) include_directories(${engineIncludes}) diff --git a/rts/lib/CMakeLists.txt b/rts/lib/CMakeLists.txt index 1c19541f8e..64c41c6842 100644 --- a/rts/lib/CMakeLists.txt +++ b/rts/lib/CMakeLists.txt @@ -98,6 +98,16 @@ endif() find_freetype_hack() # hack to find different named freetype.dll find_package_static(Freetype REQUIRED) -# option(BUILD_LUA_BINDINGS "RmlUI lua " TRUE) +# lunasvg does not expect number constants to be floats, so we undo this cmake flag for its compilation +string(REPLACE "-fsingle-precision-constant" "" NEW_CMAKE_FLAGS ${CMAKE_CXX_FLAGS}) +set(SAVED_CMAKE_FLAGS ${CMAKE_CXX_FLAGS}) +set(CMAKE_CXX_FLAGS ${NEW_CMAKE_FLAGS}) +set(SAVED_BUILD_LIBS ${BUILD_SHARED_LIBS}) +option(BUILD_SHARED_LIBS "" ON) +add_subdirectory(lunasvg) +set(CMAKE_CXX_FLAGS ${SAVED_CMAKE_FLAGS}) + +option(ENABLE_SVG_PLUGIN "RmlUi with SVG support" ON) add_subdirectory(RmlUi) + add_subdirectory(RmlSolLua) diff --git a/rts/lib/headlessStubs/sdlstub.c b/rts/lib/headlessStubs/sdlstub.c index 34ec697439..b231e2abd1 100644 --- a/rts/lib/headlessStubs/sdlstub.c +++ b/rts/lib/headlessStubs/sdlstub.c @@ -363,6 +363,23 @@ extern DECLSPEC void SDLCALL SDL_StartTextInput(void) { extern DECLSPEC void SDLCALL SDL_StopTextInput(void) { } +extern DECLSPEC int SDLCALL SDL_CaptureMouse(SDL_bool capture) { + return 0; +} + +extern DECLSPEC int SDLCALL SDL_SetSurfaceAlphaMod(SDL_Surface* surface, Uint8 alpha) { + return 0; +} +extern DECLSPEC int SDLCALL SDL_SetSurfaceBlendMode(SDL_Surface* surface, SDL_BlendMode mode) { + return 0; +} +extern DECLSPEC SDL_Surface* SDLCALL SDL_CreateRGBSurfaceWithFormat(Uint32 flags, int width, int height, int depth, Uint32 format) { + return NULL; +} +extern DECLSPEC int SDLCALL SDL_UpperBlit(SDL_Surface* src, const SDL_Rect* srcrect, SDL_Surface* dst, SDL_Rect* dstrect) { + return 0; +} + #ifdef __cplusplus } // extern "C" #endif From 8a7df4f5e21741918c7b4376087790944e30ebb8 Mon Sep 17 00:00:00 2001 From: loveridge Date: Sat, 11 Nov 2023 17:16:20 -0700 Subject: [PATCH 20/58] add lunasvg submodule --- .gitmodules | 3 +++ rts/lib/lunasvg | 1 + 2 files changed, 4 insertions(+) create mode 160000 rts/lib/lunasvg diff --git a/.gitmodules b/.gitmodules index 32c4e8429a..8e4eff1506 100644 --- a/.gitmodules +++ b/.gitmodules @@ -33,3 +33,6 @@ [submodule "rts/lib/RmlUi"] path = rts/lib/RmlUi url = https://github.com/mikke89/RmlUi.git +[submodule "rts/lib/lunasvg"] + path = rts/lib/lunasvg + url = https://github.com/sammycage/lunasvg.git diff --git a/rts/lib/lunasvg b/rts/lib/lunasvg new file mode 160000 index 0000000000..8df7756f1b --- /dev/null +++ b/rts/lib/lunasvg @@ -0,0 +1 @@ +Subproject commit 8df7756f1b20d30895a816c55179b3e3c59d9c8d From 9258d2a8d89f73c049fadfa6109a9609cb810fee Mon Sep 17 00:00:00 2001 From: loveridge Date: Sat, 11 Nov 2023 17:16:55 -0700 Subject: [PATCH 21/58] update lunasvg version --- rts/lib/lunasvg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rts/lib/lunasvg b/rts/lib/lunasvg index 8df7756f1b..87137e791c 160000 --- a/rts/lib/lunasvg +++ b/rts/lib/lunasvg @@ -1 +1 @@ -Subproject commit 8df7756f1b20d30895a816c55179b3e3c59d9c8d +Subproject commit 87137e791c912432b93982722a8e965628950ca7 From 31a9bb6ca023b3ae97dc503e539c7c592e0a5e88 Mon Sep 17 00:00:00 2001 From: loveridge Date: Sat, 11 Nov 2023 17:22:01 -0700 Subject: [PATCH 22/58] reset build option --- rts/lib/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/rts/lib/CMakeLists.txt b/rts/lib/CMakeLists.txt index 64c41c6842..639a746520 100644 --- a/rts/lib/CMakeLists.txt +++ b/rts/lib/CMakeLists.txt @@ -106,6 +106,7 @@ set(SAVED_BUILD_LIBS ${BUILD_SHARED_LIBS}) option(BUILD_SHARED_LIBS "" ON) add_subdirectory(lunasvg) set(CMAKE_CXX_FLAGS ${SAVED_CMAKE_FLAGS}) +set(BUILD_SHARED_LIBS OFF) option(ENABLE_SVG_PLUGIN "RmlUi with SVG support" ON) add_subdirectory(RmlUi) From 57d37f5b58c15efa92a8a037e9e4c733cc766591 Mon Sep 17 00:00:00 2001 From: loveridge Date: Wed, 15 Nov 2023 14:51:38 -0700 Subject: [PATCH 23/58] didnt need to build lunasvg as a shared lib --- rts/builds/headless/CMakeLists.txt | 1 - rts/builds/legacy/CMakeLists.txt | 1 - rts/lib/CMakeLists.txt | 3 --- 3 files changed, 5 deletions(-) diff --git a/rts/builds/headless/CMakeLists.txt b/rts/builds/headless/CMakeLists.txt index ccd86140d6..b4173ab592 100644 --- a/rts/builds/headless/CMakeLists.txt +++ b/rts/builds/headless/CMakeLists.txt @@ -36,7 +36,6 @@ include_directories(${ENGINE_SRC_ROOT_DIR}/lib/assimp/include) include_directories(${ENGINE_SRC_ROOT_DIR}/lib/asio/include) include_directories(${ENGINE_SRC_ROOT_DIR}/lib/slimsig/include) include_directories(${ENGINE_SRC_ROOT_DIR}/lib/RmlSolLua/src) -include_directories(${ENGINE_SRC_ROOT_DIR}/lib/lunasvg/include) include_directories(${ENGINE_SRC_ROOT_DIR}/lib/cereal/include) ### Build the executable diff --git a/rts/builds/legacy/CMakeLists.txt b/rts/builds/legacy/CMakeLists.txt index 82681947e8..9d1044b9c3 100644 --- a/rts/builds/legacy/CMakeLists.txt +++ b/rts/builds/legacy/CMakeLists.txt @@ -76,7 +76,6 @@ list(APPEND engineIncludes ${ENGINE_SRC_ROOT_DIR}/lib/asio/include) list(APPEND engineIncludes ${ENGINE_SRC_ROOT_DIR}/lib/slimsig/include) list(APPEND engineIncludes ${ENGINE_SRC_ROOT_DIR}/lib/cereal/include) list(APPEND engineIncludes ${ENGINE_SRC_ROOT_DIR}/lib/RmlSolLua/src) -list(APPEND engineIncludes ${ENGINE_SRC_ROOT_DIR}/lib/lunasvg/include) include_directories(${engineIncludes}) diff --git a/rts/lib/CMakeLists.txt b/rts/lib/CMakeLists.txt index 639a746520..8891e2281d 100644 --- a/rts/lib/CMakeLists.txt +++ b/rts/lib/CMakeLists.txt @@ -102,11 +102,8 @@ find_package_static(Freetype REQUIRED) string(REPLACE "-fsingle-precision-constant" "" NEW_CMAKE_FLAGS ${CMAKE_CXX_FLAGS}) set(SAVED_CMAKE_FLAGS ${CMAKE_CXX_FLAGS}) set(CMAKE_CXX_FLAGS ${NEW_CMAKE_FLAGS}) -set(SAVED_BUILD_LIBS ${BUILD_SHARED_LIBS}) -option(BUILD_SHARED_LIBS "" ON) add_subdirectory(lunasvg) set(CMAKE_CXX_FLAGS ${SAVED_CMAKE_FLAGS}) -set(BUILD_SHARED_LIBS OFF) option(ENABLE_SVG_PLUGIN "RmlUi with SVG support" ON) add_subdirectory(RmlUi) From 09291567fb95691ab8797a0a19fc7ef89f6f388e Mon Sep 17 00:00:00 2001 From: Marek Rusinowski Date: Sat, 16 Dec 2023 15:37:44 +0100 Subject: [PATCH 24/58] fix: uint is not standard and breaks mingw compile --- rts/Game/UI/MouseHandler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rts/Game/UI/MouseHandler.h b/rts/Game/UI/MouseHandler.h index 86dd7c583e..8bd16d0547 100644 --- a/rts/Game/UI/MouseHandler.h +++ b/rts/Game/UI/MouseHandler.h @@ -118,7 +118,7 @@ class CMouseHandler bool wasLocked = false; bool offscreen = false; bool mmbScroll = false; - uint pressedBitMask = 0; + uint32_t pressedBitMask = 0; private: bool hideCursor = true; From 62d7910baa718bd365158fd3e13799c24cfadbb2 Mon Sep 17 00:00:00 2001 From: Marek Rusinowski Date: Sat, 16 Dec 2023 21:19:25 +0100 Subject: [PATCH 25/58] Rework RmlSolLua integration into build This fixes the build under mingw that didn't work because of broken linking. - Cleanup messu include_target_directories replacing with proper linking of targets. Had to fix the include target directories for lua lib - Undo merging of the public and private interfaces, and separate public interface of the library - Stop appending the include dir directly to engine include dirs and stop using absolute path based references when referencing. --- rts/Rml/Backends/RmlUi_Backend.cpp | 2 +- rts/Rml/Backends/RmlUi_Platform_SDL.h | 2 +- rts/builds/headless/CMakeLists.txt | 1 - rts/builds/legacy/CMakeLists.txt | 1 - rts/lib/RmlSolLua/CMakeLists.txt | 19 +++++++++---------- .../{src => include/RmlSolLua}/RmlSolLua.h | 2 +- .../RmlSolLua}/SolLuaPlugin.h | 2 +- .../RmlSolLua}/TranslationTable.h | 0 rts/lib/RmlSolLua/src/RmlSolLua.cpp | 2 +- rts/lib/RmlSolLua/src/bind/bind.h | 2 +- rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp | 2 +- rts/lib/lua/CMakeLists.txt | 2 ++ 12 files changed, 18 insertions(+), 19 deletions(-) rename rts/lib/RmlSolLua/{src => include/RmlSolLua}/RmlSolLua.h (98%) rename rts/lib/RmlSolLua/{src/plugin => include/RmlSolLua}/SolLuaPlugin.h (97%) rename rts/lib/RmlSolLua/{src => include/RmlSolLua}/TranslationTable.h (100%) diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index 367f110c3e..34879216a7 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -38,7 +38,7 @@ #include "Rendering/GL/myGL.h" #include "Rendering/Textures/Bitmap.h" #include "Lua/LuaUI.h" -#include "RmlSolLua.h" +#include #include "System/FileSystem/FileHandler.h" #include #include diff --git a/rts/Rml/Backends/RmlUi_Platform_SDL.h b/rts/Rml/Backends/RmlUi_Platform_SDL.h index 6c5ff72122..9492534281 100644 --- a/rts/Rml/Backends/RmlUi_Platform_SDL.h +++ b/rts/Rml/Backends/RmlUi_Platform_SDL.h @@ -34,7 +34,7 @@ #include #include #include "Game/UI/MouseHandler.h" -#include "lib/RmlSolLua/src/TranslationTable.h" +#include class SystemInterface_SDL : public Rml::SystemInterface { diff --git a/rts/builds/headless/CMakeLists.txt b/rts/builds/headless/CMakeLists.txt index b4173ab592..93d17b2312 100644 --- a/rts/builds/headless/CMakeLists.txt +++ b/rts/builds/headless/CMakeLists.txt @@ -35,7 +35,6 @@ list(APPEND engineHeadlessLibraries lunasvg) include_directories(${ENGINE_SRC_ROOT_DIR}/lib/assimp/include) include_directories(${ENGINE_SRC_ROOT_DIR}/lib/asio/include) include_directories(${ENGINE_SRC_ROOT_DIR}/lib/slimsig/include) -include_directories(${ENGINE_SRC_ROOT_DIR}/lib/RmlSolLua/src) include_directories(${ENGINE_SRC_ROOT_DIR}/lib/cereal/include) ### Build the executable diff --git a/rts/builds/legacy/CMakeLists.txt b/rts/builds/legacy/CMakeLists.txt index 9d1044b9c3..f0648f572b 100644 --- a/rts/builds/legacy/CMakeLists.txt +++ b/rts/builds/legacy/CMakeLists.txt @@ -75,7 +75,6 @@ list(APPEND engineIncludes ${OPENAL_INCLUDE_DIR}) list(APPEND engineIncludes ${ENGINE_SRC_ROOT_DIR}/lib/asio/include) list(APPEND engineIncludes ${ENGINE_SRC_ROOT_DIR}/lib/slimsig/include) list(APPEND engineIncludes ${ENGINE_SRC_ROOT_DIR}/lib/cereal/include) -list(APPEND engineIncludes ${ENGINE_SRC_ROOT_DIR}/lib/RmlSolLua/src) include_directories(${engineIncludes}) diff --git a/rts/lib/RmlSolLua/CMakeLists.txt b/rts/lib/RmlSolLua/CMakeLists.txt index 3a31d630ce..922dde8395 100644 --- a/rts/lib/RmlSolLua/CMakeLists.txt +++ b/rts/lib/RmlSolLua/CMakeLists.txt @@ -10,11 +10,8 @@ set (CMAKE_CXX_STANDARD 17) # Add source to this project's executable. add_library (RmlSolLua STATIC) -find_library (RmlCore NAMES RmlUi RmlCore) - target_sources (RmlSolLua PRIVATE - "src/RmlSolLua.h" "src/RmlSolLua.cpp" "src/bind/bind.cpp" "src/bind/bind.h" @@ -39,19 +36,21 @@ target_sources (RmlSolLua "src/plugin/SolLuaInstancer.cpp" "src/plugin/SolLuaInstancer.h" "src/plugin/SolLuaPlugin.cpp" - "src/plugin/SolLuaPlugin.h" PUBLIC - "src/RmlSolLua.h" + "include/RmlSolLua/RmlSolLua.h" + "include/RmlSolLua/SolLuaPlugin.h" + "include/RmlSolLua/TranslationTable.h" +) + +target_link_libraries(RmlSolLua + PUBLIC + RmlCore + lua ) target_include_directories (RmlSolLua PRIVATE ${PROJECT_SOURCE_DIR}/src/ - ${PROJECT_SOURCE_DIR}/include/ - ../RmlUi/Include/ - ../ - ../lua/include - PUBLIC ${PROJECT_SOURCE_DIR}/include/ ) diff --git a/rts/lib/RmlSolLua/src/RmlSolLua.h b/rts/lib/RmlSolLua/include/RmlSolLua/RmlSolLua.h similarity index 98% rename from rts/lib/RmlSolLua/src/RmlSolLua.h rename to rts/lib/RmlSolLua/include/RmlSolLua/RmlSolLua.h index dcdc03c54c..59972e1588 100644 --- a/rts/lib/RmlSolLua/src/RmlSolLua.h +++ b/rts/lib/RmlSolLua/include/RmlSolLua/RmlSolLua.h @@ -1,7 +1,7 @@ #pragma once #include -#include "plugin/SolLuaPlugin.h" +#include "SolLuaPlugin.h" #ifdef RMLUILUA_API #undef RMLUILUA_API diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.h b/rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h similarity index 97% rename from rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.h rename to rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h index 56eb5adb07..ffba9eaa03 100644 --- a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.h +++ b/rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h @@ -7,7 +7,7 @@ #include #include #include -#include "../TranslationTable.h" +#include "TranslationTable.h" #include diff --git a/rts/lib/RmlSolLua/src/TranslationTable.h b/rts/lib/RmlSolLua/include/RmlSolLua/TranslationTable.h similarity index 100% rename from rts/lib/RmlSolLua/src/TranslationTable.h rename to rts/lib/RmlSolLua/include/RmlSolLua/TranslationTable.h diff --git a/rts/lib/RmlSolLua/src/RmlSolLua.cpp b/rts/lib/RmlSolLua/src/RmlSolLua.cpp index 3162382cf0..d7f4e6e0e7 100644 --- a/rts/lib/RmlSolLua/src/RmlSolLua.cpp +++ b/rts/lib/RmlSolLua/src/RmlSolLua.cpp @@ -1,4 +1,4 @@ -#include "RmlSolLua.h" +#include "RmlSolLua/RmlSolLua.h" #include #include diff --git a/rts/lib/RmlSolLua/src/bind/bind.h b/rts/lib/RmlSolLua/src/bind/bind.h index 54bdc30132..f69ee18380 100644 --- a/rts/lib/RmlSolLua/src/bind/bind.h +++ b/rts/lib/RmlSolLua/src/bind/bind.h @@ -2,7 +2,7 @@ #include #include -#include "../TranslationTable.h" +#include "RmlSolLua/TranslationTable.h" #include diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp index fd61aa3be8..6b77b14f1a 100644 --- a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp @@ -1,4 +1,4 @@ -#include "SolLuaPlugin.h" +#include #include "SolLuaInstancer.h" diff --git a/rts/lib/lua/CMakeLists.txt b/rts/lib/lua/CMakeLists.txt index 4a6ce64bf4..80abb26367 100644 --- a/rts/lib/lua/CMakeLists.txt +++ b/rts/lib/lua/CMakeLists.txt @@ -49,6 +49,8 @@ else () TARGET_LINK_LIBRARIES(lua) endif () +target_include_directories(lua PUBLIC include) + if (UNIX) SET_TARGET_PROPERTIES(lua PROPERTIES COMPILE_FLAGS "-DLUA_USE_MKSTEMP ${PIC_FLAG}") else (UNIX) From f1dd51564b8f6533100aafb96dbac1444a09eb64 Mon Sep 17 00:00:00 2001 From: Marek Rusinowski Date: Sun, 17 Dec 2023 00:42:57 +0100 Subject: [PATCH 26/58] Fix RmlSolLua compilation under MSVC - Designated initializers are C++20 feature, so we need to bump to that version - Element.cpp generates huge amount of sections, so adding /bigobj switch for it. --- rts/lib/RmlSolLua/CMakeLists.txt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/rts/lib/RmlSolLua/CMakeLists.txt b/rts/lib/RmlSolLua/CMakeLists.txt index 922dde8395..774d627433 100644 --- a/rts/lib/RmlSolLua/CMakeLists.txt +++ b/rts/lib/RmlSolLua/CMakeLists.txt @@ -5,7 +5,7 @@ cmake_minimum_required (VERSION 3.13) project ("RmlSolLua") -set (CMAKE_CXX_STANDARD 17) +set (CMAKE_CXX_STANDARD 20) # Add source to this project's executable. add_library (RmlSolLua STATIC) @@ -42,6 +42,13 @@ target_sources (RmlSolLua "include/RmlSolLua/TranslationTable.h" ) +# We hit C1128 in Visual Studio 17.8.3 without this. +if (MSVC) + set_source_files_properties("src/bind/Element.cpp" + PROPERTIES COMPILE_FLAGS "/bigobj" + ) +endif() + target_link_libraries(RmlSolLua PUBLIC RmlCore From 5d97998d02307ac1bb18d100cb9d0cdd54ed8c33 Mon Sep 17 00:00:00 2001 From: sprunk Date: Sat, 30 Dec 2023 18:36:25 +0100 Subject: [PATCH 27/58] Document the mouse press check --- rts/System/Input/MouseInput.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rts/System/Input/MouseInput.cpp b/rts/System/Input/MouseInput.cpp index d1bce5206a..00adc106aa 100644 --- a/rts/System/Input/MouseInput.cpp +++ b/rts/System/Input/MouseInput.cpp @@ -69,7 +69,11 @@ IMouseInput::~IMouseInput() bool IMouseInput::HandleSDLMouseEvent(const SDL_Event& event) { - if (!mouse->ButtonPressed() && RmlGui::ProcessMouseEvent(event)) { + /* Only want to give a mouse event to RmlUI if the mouse isn't currently performing a drag. + * Otherwise box selections get stuck when the mouse goes over an Rml element. */ + const bool mousePressed = mouse->ButtonPressed(); + + if (!mousePressed && RmlGui::ProcessMouseEvent(event)) { return false; } switch (event.type) { From 928e5d310f2f189bf23018a499c24af69cfcb907 Mon Sep 17 00:00:00 2001 From: loveridge Date: Sat, 30 Dec 2023 13:07:07 -0700 Subject: [PATCH 28/58] Change size() < 1 to empty. Move setActive after processContext loop --- rts/Rml/Backends/RmlUi_Backend.cpp | 33 +++++++++++++----------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index 34879216a7..38f6b793fd 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -212,6 +212,9 @@ bool RmlGui::Initialize(SDL_Window *target_window, SDL_GLContext target_glcontex bool RmlGui::InitializeLua(lua_State *lua_state) { + if (!data || !data->initialized) { + return false; + } sol::state_view lua(lua_state); data->ls = lua_state; Rml::SolLua::SolLuaPlugin *slp = Rml::SolLua::Initialise(&lua, createContext); @@ -221,6 +224,9 @@ bool RmlGui::InitializeLua(lua_State *lua_state) void RmlGui::Shutdown() { + if (!data || !data->initialized) { + return; + } data->initialized = false; // SDL_GL_DeleteContext(data->glcontext); @@ -290,7 +296,7 @@ void RmlGui::AddContext(Rml::Context *context) void RmlGui::Update() { ZoneScopedN("RmlGui Update"); - if (!data->initialized || data->contexts.size() < 1) + if (!data->initialized || data->contexts.empty()) { return; } @@ -305,7 +311,7 @@ void RmlGui::Update() void RmlGui::RenderFrame() { ZoneScopedN("RmlGui Draw"); - if (!data->initialized || data->contexts.size() < 1) + if (!data->initialized || data->contexts.empty()) { return; } @@ -350,12 +356,10 @@ bool processContextMouseEvent(Rml::Context *context, const SDL_Event &event) el->Blur(); } } - data->inputReceiver.setActive(handled); return handled; } default: { - data->inputReceiver.setActive(false); return false; } } @@ -367,7 +371,7 @@ bool processContextMouseEvent(Rml::Context *context, const SDL_Event &event) */ bool RmlGui::ProcessMouseEvent(const SDL_Event &event) { - if (data == NULL || data->contexts.size() < 1 || !data->initialized) + if (data == NULL || data->contexts.empty() || !data->initialized) { return false; } @@ -376,6 +380,7 @@ bool RmlGui::ProcessMouseEvent(const SDL_Event &event) { result |= processContextMouseEvent(context, event); } + data->inputReceiver.setActive(result); return result; } @@ -384,7 +389,7 @@ bool RmlGui::ProcessMouseEvent(const SDL_Event &event) */ bool RmlGui::ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat) { - if (!data->initialized || data->contexts.size() < 1) + if (!data->initialized || data->contexts.empty()) { return false; } @@ -392,16 +397,6 @@ bool RmlGui::ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat) for (auto &context : data->contexts) { auto kc = RmlSDL::ConvertKey(keyCode); - // if (kc == Rml::Input::KI_ESCAPE) - // { - // Rml::Element *el = context->GetFocusElement(); - // if (el) - // { - // el->Blur(); - // } - // return false; - // } - result |= !RmlSDL::EventKeyDown(context, kc); } return result; @@ -409,7 +404,7 @@ bool RmlGui::ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat) bool RmlGui::ProcessKeyReleased(int keyCode, int scanCode) { - if (!data->initialized || data->contexts.size() < 1) + if (!data->initialized || data->contexts.empty()) { return false; } @@ -423,7 +418,7 @@ bool RmlGui::ProcessKeyReleased(int keyCode, int scanCode) bool RmlGui::ProcessTextInput(const std::string &text) { - if (!data->initialized || data->contexts.size() < 1) + if (!data->initialized || data->contexts.empty()) { return false; } @@ -475,7 +470,7 @@ bool processContextEvent(Rml::Context *context, const SDL_Event &event) bool RmlGui::ProcessEvent(const SDL_Event &event) { - if (!data->initialized || data->contexts.size() < 1) + if (!data->initialized || data->contexts.empty()) { return false; } From f86c87710de2ec27403f0bbb8300edd24f76aa64 Mon Sep 17 00:00:00 2001 From: loveridge Date: Tue, 9 Jan 2024 21:48:41 -0700 Subject: [PATCH 29/58] Deeper MouseHandler integration for processing mouse events --- rts/Game/UI/MouseHandler.cpp | 24 +++++- rts/Rml/Backends/RmlUi_Backend.cpp | 97 +++++++++++++++++++------ rts/Rml/Backends/RmlUi_Backend.h | 45 +++++++----- rts/Rml/Backends/RmlUi_Platform_SDL.cpp | 16 ++++ rts/Rml/Backends/RmlUi_Platform_SDL.h | 4 + rts/Rml/RmlInputReceiver.h | 9 +++ rts/System/Input/MouseInput.cpp | 3 - 7 files changed, 151 insertions(+), 47 deletions(-) diff --git a/rts/Game/UI/MouseHandler.cpp b/rts/Game/UI/MouseHandler.cpp index b5b12f54b6..3c043ee682 100644 --- a/rts/Game/UI/MouseHandler.cpp +++ b/rts/Game/UI/MouseHandler.cpp @@ -39,6 +39,7 @@ #include "System/StringUtil.h" #include "System/Input/KeyInput.h" #include "System/Input/MouseInput.h" +#include "Rml/Backends/RmlUi_Backend.h" #include @@ -272,6 +273,10 @@ void CMouseHandler::MouseMove(int x, int y, int dx, int dy) if (game != nullptr && !game->IsGameOver()) playerHandler.Player(gu->myPlayerNum)->currentStats.mousePixels += movedPixels; + if (!ButtonPressed() && RmlGui::ProcessMouseMove(x, lasty, dx, dy, activeButtonIdx)) { + return; + } + if (activeReceiver != nullptr) activeReceiver->MouseMove(x, lasty, dx, dy, activeButtonIdx); @@ -297,7 +302,12 @@ void CMouseHandler::MousePress(int x, int y, int button) if (game != nullptr && !game->IsGameOver()) playerHandler.Player(gu->myPlayerNum)->currentStats.mouseClicks++; - ButtonPressEvt& bp = buttons[activeButtonIdx = button]; + if (RmlGui::ProcessMousePress(x, y, button)) { + return; + } + + activeButtonIdx = button; + ButtonPressEvt& bp = buttons[activeButtonIdx]; bp.chorded = (buttons[SDL_BUTTON_LEFT].pressed || buttons[SDL_BUTTON_RIGHT].pressed); bp.pressed = true; bp.time = gu->gameTime; @@ -368,6 +378,10 @@ bool CMouseHandler::GetSelectionBoxVertices(float3& bl, float3& br, float3& tl, if (activeReceiver != nullptr) return false; + if (RmlGui::IsActive()) { + return false; + } + if (gu->fpsMode) return false; @@ -472,6 +486,10 @@ void CMouseHandler::MouseRelease(int x, int y, int button) return; } + if (RmlGui::ProcessMouseRelease(x, y, button)) { + return; + } + if (activeReceiver != nullptr) { activeReceiver->MouseRelease(x, y, button); @@ -553,6 +571,10 @@ bool CMouseHandler::ButtonPressed() void CMouseHandler::MouseWheel(float delta) { + if (RmlGui::ProcessMouseWheel(delta)) { + return; + } + if (eventHandler.MouseWheel(delta > 0.0f, delta)) return; diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index 38f6b793fd..5b219ee259 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -179,6 +179,11 @@ struct BackendData }; static Rml::UniquePtr data; +bool RmlInitialized() +{ + return data && data->initialized; +} + bool RmlGui::Initialize(SDL_Window *target_window, SDL_GLContext target_glcontext, int winX, int winY) { data = Rml::MakeUnique(); @@ -212,7 +217,8 @@ bool RmlGui::Initialize(SDL_Window *target_window, SDL_GLContext target_glcontex bool RmlGui::InitializeLua(lua_State *lua_state) { - if (!data || !data->initialized) { + if (!RmlInitialized()) + { return false; } sol::state_view lua(lua_state); @@ -224,7 +230,8 @@ bool RmlGui::InitializeLua(lua_State *lua_state) void RmlGui::Shutdown() { - if (!data || !data->initialized) { + if (!RmlInitialized()) + { return; } data->initialized = false; @@ -239,7 +246,7 @@ void RmlGui::Shutdown() void RmlGui::Reload() { - if (!data->initialized) + if (!RmlInitialized()) { return; } @@ -276,6 +283,15 @@ Rml::RenderInterface *RmlGui::GetRenderInterface() return &data->render_interface; } +bool RmlGui::IsActive() +{ + if (!RmlInitialized()) + { + return false; + } + return data->inputReceiver.IsAbove(0, 0); +} + void createContext(const std::string &name) { Rml::Context *context = Rml::CreateContext(name, Rml::Vector2i(data->winX, data->winY)); @@ -296,7 +312,7 @@ void RmlGui::AddContext(Rml::Context *context) void RmlGui::Update() { ZoneScopedN("RmlGui Update"); - if (!data->initialized || data->contexts.empty()) + if (!RmlInitialized()) { return; } @@ -311,7 +327,7 @@ void RmlGui::Update() void RmlGui::RenderFrame() { ZoneScopedN("RmlGui Draw"); - if (!data->initialized || data->contexts.empty()) + if (!RmlInitialized()) { return; } @@ -338,17 +354,39 @@ void RmlGui::PresentFrame() RMLUI_FrameMark; } -bool processContextMouseEvent(Rml::Context *context, const SDL_Event &event) +/* + Return true if the event was handled by rmlui +*/ +bool RmlGui::ProcessMouseMove(int x, int y, int dx, int dy, int button) { - switch (event.type) + if (!RmlInitialized()) { - case SDL_MOUSEMOTION: - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - case SDL_MOUSEWHEEL: + return false; + } + bool result = false; + for (auto &context : data->contexts) { - bool handled = !RmlSDL::InputEventHandler(context, event); - if (!handled && event.type == SDL_MOUSEBUTTONDOWN) + result |= !RmlSDL::EventMouseMove(context, x, y); + } + data->inputReceiver.setActive(result); + return result; +} + +/* + Return true if the event was handled by rmlui +*/ +bool RmlGui::ProcessMousePress(int x, int y, int button) +{ + if (!RmlInitialized()) + { + return false; + } + bool result = false; + for (auto &context : data->contexts) + { + bool handled = !RmlSDL::EventMousePress(context, x, y, button); + result |= handled; + if (!handled) { Rml::Element *el = context->GetFocusElement(); if (el) @@ -356,29 +394,42 @@ bool processContextMouseEvent(Rml::Context *context, const SDL_Event &event) el->Blur(); } } - return handled; } - default: + data->inputReceiver.setActive(result); + return result; +} + +/* + Return true if the event was handled by rmlui +*/ +bool RmlGui::ProcessMouseRelease(int x, int y, int button) +{ + if (!RmlInitialized()) { return false; } + bool result = false; + for (auto &context : data->contexts) + { + result |= !RmlSDL::EventMouseRelease(context, x, y, button); } - return false; + data->inputReceiver.setActive(result); + return result; } /* Return true if the event was handled by rmlui */ -bool RmlGui::ProcessMouseEvent(const SDL_Event &event) +bool RmlGui::ProcessMouseWheel(float delta) { - if (data == NULL || data->contexts.empty() || !data->initialized) + if (!RmlInitialized()) { return false; } bool result = false; for (auto &context : data->contexts) { - result |= processContextMouseEvent(context, event); + result |= !RmlSDL::EventMouseWheel(context, delta); } data->inputReceiver.setActive(result); return result; @@ -389,7 +440,7 @@ bool RmlGui::ProcessMouseEvent(const SDL_Event &event) */ bool RmlGui::ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat) { - if (!data->initialized || data->contexts.empty()) + if (!RmlInitialized()) { return false; } @@ -404,7 +455,7 @@ bool RmlGui::ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat) bool RmlGui::ProcessKeyReleased(int keyCode, int scanCode) { - if (!data->initialized || data->contexts.empty()) + if (!RmlInitialized()) { return false; } @@ -418,7 +469,7 @@ bool RmlGui::ProcessKeyReleased(int keyCode, int scanCode) bool RmlGui::ProcessTextInput(const std::string &text) { - if (!data->initialized || data->contexts.empty()) + if (!RmlInitialized()) { return false; } @@ -470,7 +521,7 @@ bool processContextEvent(Rml::Context *context, const SDL_Event &event) bool RmlGui::ProcessEvent(const SDL_Event &event) { - if (!data->initialized || data->contexts.empty()) + if (!RmlInitialized()) { return false; } diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index 85b873ca0e..66dc251204 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -37,36 +37,41 @@ #include "lib/sol2/sol.hpp" #include "Rml/Backends/RmlUi_Platform_SDL.h" -using KeyDownCallback = bool (*)(Rml::Context* context, Rml::Input::KeyIdentifier key, int key_modifier, float native_dp_ratio, bool priority); +using KeyDownCallback = bool (*)(Rml::Context *context, Rml::Input::KeyIdentifier key, int key_modifier, float native_dp_ratio, bool priority); -namespace RmlGui { +namespace RmlGui +{ -bool Initialize(SDL_Window* target_window, SDL_GLContext target_glcontext, int winX, int winY); -bool InitializeLua(lua_State* lua_state); + bool Initialize(SDL_Window *target_window, SDL_GLContext target_glcontext, int winX, int winY); + bool InitializeLua(lua_State *lua_state); -void Shutdown(); -void Reload(); + void Shutdown(); + void Reload(); -Rml::SystemInterface* GetSystemInterface(); -Rml::RenderInterface* GetRenderInterface(); + Rml::SystemInterface *GetSystemInterface(); + Rml::RenderInterface *GetRenderInterface(); -bool ProcessEvent(const SDL_Event& event); -bool ProcessMouseEvent(const SDL_Event& event); + bool ProcessEvent(const SDL_Event &event); -bool ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat); -bool ProcessKeyReleased(int keyCode, int scanCode); -bool ProcessTextInput(const std::string& text); + bool ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat); + bool ProcessKeyReleased(int keyCode, int scanCode); + bool ProcessTextInput(const std::string &text); + bool ProcessMouseMove(int x, int y, int dx, int dy, int button); + bool ProcessMousePress(int x, int y, int button); + bool ProcessMouseRelease(int x, int y, int button); + bool ProcessMouseWheel(float delta); -void ToggleDebugger(int contextIndex); + void ToggleDebugger(int contextIndex); + bool IsActive(); -void Update(); -void RenderFrame(); + void Update(); + void RenderFrame(); -void CreateContext(const std::string& name); -void AddContext(Rml::Context *context); + void CreateContext(const std::string &name); + void AddContext(Rml::Context *context); -void BeginFrame(); -void PresentFrame(); + void BeginFrame(); + void PresentFrame(); } diff --git a/rts/Rml/Backends/RmlUi_Platform_SDL.cpp b/rts/Rml/Backends/RmlUi_Platform_SDL.cpp index 45f97c3bc8..e79b8a928a 100644 --- a/rts/Rml/Backends/RmlUi_Platform_SDL.cpp +++ b/rts/Rml/Backends/RmlUi_Platform_SDL.cpp @@ -137,6 +137,22 @@ bool RmlSDL::EventTextInput(Rml::Context *context, const std::string &text) return context->ProcessTextInput(Rml::String(text)); } +bool RmlSDL::EventMouseMove(Rml::Context *context, Sint32 x, Sint32 y) { + return context->ProcessMouseMove(x,y, GetKeyModifierState()); +} + +bool RmlSDL::EventMousePress(Rml::Context *context, Sint32 x, Sint32 y, Sint32 button) { + return context->ProcessMouseButtonDown(ConvertMouseButton(button), GetKeyModifierState()); +}; + +bool RmlSDL::EventMouseRelease(Rml::Context *context, Sint32 x, Sint32 y, Sint32 button) { + return context->ProcessMouseButtonUp(ConvertMouseButton(button), GetKeyModifierState()); +}; + +bool RmlSDL::EventMouseWheel(Rml::Context *context, float delta) { + return context->ProcessMouseWheel(-delta, GetKeyModifierState()); +}; + bool RmlSDL::InputEventHandler(Rml::Context *context, const SDL_Event &ev) { bool result = true; diff --git a/rts/Rml/Backends/RmlUi_Platform_SDL.h b/rts/Rml/Backends/RmlUi_Platform_SDL.h index 9492534281..4988dab86d 100644 --- a/rts/Rml/Backends/RmlUi_Platform_SDL.h +++ b/rts/Rml/Backends/RmlUi_Platform_SDL.h @@ -74,6 +74,10 @@ namespace RmlSDL bool EventKeyDown(Rml::Context *context, Rml::Input::KeyIdentifier key); bool EventKeyUp(Rml::Context *context, Rml::Input::KeyIdentifier key); bool EventTextInput(Rml::Context *context, const std::string& text); + bool EventMouseMove(Rml::Context *context, Sint32 x, Sint32 y); + bool EventMousePress(Rml::Context *context, Sint32 x, Sint32 y, Sint32 button); + bool EventMouseRelease(Rml::Context *context, Sint32 x, Sint32 y, Sint32 button); + bool EventMouseWheel(Rml::Context *context, float delta); // Converts the SDL key to RmlUi key. Rml::Input::KeyIdentifier ConvertKey(int sdl_key); diff --git a/rts/Rml/RmlInputReceiver.h b/rts/Rml/RmlInputReceiver.h index 1aa3258a3f..abb97104e2 100644 --- a/rts/Rml/RmlInputReceiver.h +++ b/rts/Rml/RmlInputReceiver.h @@ -12,9 +12,18 @@ class CRmlInputReceiver : public CInputReceiver CRmlInputReceiver() : CInputReceiver(FRONT), rml_active(false){}; ~CRmlInputReceiver() = default; + /** + IsAbove is used for determining which cursor icon should be displayed. This is tracked in ProcessMouse functions when RmlUi handles + the event and that state is true if rml is capturing the mouse. + */ bool IsAbove(int x, int y) { return rml_active; }; void setActive(bool active) { rml_active = active; }; + bool KeyPressed(int keyCode, int scanCode, bool isRepeat) { return RmlGui::ProcessKeyPressed(keyCode, scanCode, isRepeat); } + void MouseMove(int x, int y, int dx, int dy, int button) { RmlGui::ProcessMouseMove(x, y, dx, dy, button); } + bool MousePress(int x, int y, int button) { return RmlGui::ProcessMousePress(x, y, button); } + void MouseRelease(int x, int y, int button) { RmlGui::ProcessMouseRelease(x, y, button); } + private: bool rml_active; }; diff --git a/rts/System/Input/MouseInput.cpp b/rts/System/Input/MouseInput.cpp index 00adc106aa..426b12a3f2 100644 --- a/rts/System/Input/MouseInput.cpp +++ b/rts/System/Input/MouseInput.cpp @@ -73,9 +73,6 @@ bool IMouseInput::HandleSDLMouseEvent(const SDL_Event& event) * Otherwise box selections get stuck when the mouse goes over an Rml element. */ const bool mousePressed = mouse->ButtonPressed(); - if (!mousePressed && RmlGui::ProcessMouseEvent(event)) { - return false; - } switch (event.type) { case SDL_MOUSEMOTION: { mousepos = int2(event.motion.x, event.motion.y); From 426b364ca407df8b3b2da61bbe33c723c9754550 Mon Sep 17 00:00:00 2001 From: loveridge Date: Sun, 14 Jan 2024 09:48:32 -0700 Subject: [PATCH 30/58] Fix software rendered mouse cursor --- rts/Game/Game.cpp | 2 +- rts/Game/UI/MouseHandler.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/rts/Game/Game.cpp b/rts/Game/Game.cpp index 1a67e149ae..c40412bbbd 100644 --- a/rts/Game/Game.cpp +++ b/rts/Game/Game.cpp @@ -1533,6 +1533,7 @@ bool CGame::Draw() { DrawInputReceivers(); DrawInputText(); DrawInterfaceWidgets(); + RmlGui::RenderFrame(); mouse->DrawCursor(); eventHandler.DrawScreenPost(); @@ -1540,7 +1541,6 @@ bool CGame::Draw() { glEnable(GL_DEPTH_TEST); glLoadIdentity(); - RmlGui::RenderFrame(); if (videoCapturing->AllowRecord()) { videoCapturing->SetLastFrameTime(globalRendering->lastFrameTime = 1000.0f / GAME_SPEED); diff --git a/rts/Game/UI/MouseHandler.cpp b/rts/Game/UI/MouseHandler.cpp index 3c043ee682..38585c0730 100644 --- a/rts/Game/UI/MouseHandler.cpp +++ b/rts/Game/UI/MouseHandler.cpp @@ -273,6 +273,8 @@ void CMouseHandler::MouseMove(int x, int y, int dx, int dy) if (game != nullptr && !game->IsGameOver()) playerHandler.Player(gu->myPlayerNum)->currentStats.mousePixels += movedPixels; + /* Only want to give a mouse event to RmlUI if the mouse isn't currently performing a drag. + * Otherwise box selections get stuck when the mouse goes over an Rml element. */ if (!ButtonPressed() && RmlGui::ProcessMouseMove(x, lasty, dx, dy, activeButtonIdx)) { return; } From ed12f483e003050fcd47da48ae42b2d24a16e870 Mon Sep 17 00:00:00 2001 From: loveridge Date: Sun, 14 Jan 2024 10:06:53 -0700 Subject: [PATCH 31/58] Missed half of the move of this comment --- rts/System/Input/MouseInput.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/rts/System/Input/MouseInput.cpp b/rts/System/Input/MouseInput.cpp index 426b12a3f2..4868bb9e94 100644 --- a/rts/System/Input/MouseInput.cpp +++ b/rts/System/Input/MouseInput.cpp @@ -69,8 +69,6 @@ IMouseInput::~IMouseInput() bool IMouseInput::HandleSDLMouseEvent(const SDL_Event& event) { - /* Only want to give a mouse event to RmlUI if the mouse isn't currently performing a drag. - * Otherwise box selections get stuck when the mouse goes over an Rml element. */ const bool mousePressed = mouse->ButtonPressed(); switch (event.type) { From 66f2440e0daef531e35e43e298b835c4eba09fea Mon Sep 17 00:00:00 2001 From: loveridge Date: Sun, 14 Jan 2024 13:58:29 -0700 Subject: [PATCH 32/58] print sol aux_message --- rts/lib/sol2/sol.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rts/lib/sol2/sol.hpp b/rts/lib/sol2/sol.hpp index 5dcf817c38..34d4ed49fa 100644 --- a/rts/lib/sol2/sol.hpp +++ b/rts/lib/sol2/sol.hpp @@ -9146,7 +9146,7 @@ namespace sol { inline int push_type_panic_string(lua_State* L, int index, type expected, type actual, string_view message, string_view aux_message) noexcept { const char* err = message.size() == 0 - ? (aux_message.size() == 0 ? "stack index %d, expected %s, received %s" : "stack index %d, expected %s, received %s: %s") + ? (aux_message.size() == 0 ? "stack index %d, expected %s, received %s" : "stack index %d, expected %s, received %s: %s%s") : "stack index %d, expected %s, received %s: %s %s"; const char* type_name = expected == type::poly ? "anything" : lua_typename(L, static_cast(expected)); { From 2b61a4b91d2b24532ec53c67c82293690f6aa1f8 Mon Sep 17 00:00:00 2001 From: ChrisClark13 Date: Sun, 14 Jan 2024 15:54:47 -0700 Subject: [PATCH 33/58] add couple things to .gitignore make lua binding for RemoveContext --- .gitignore | 2 ++ rts/lib/RmlSolLua/src/bind/Global.cpp | 1 + 2 files changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 1c48718993..06b56af430 100644 --- a/.gitignore +++ b/.gitignore @@ -65,6 +65,7 @@ progress.make /_ReSharper.Caches .vs/ .vscode +/.idea # Windows libraries used by spring when compiling with MinGW # recommended: place the dir somewhere else, and specify with @@ -74,6 +75,7 @@ progress.make # Windows libraries used by spring when compiling with Visual Studio /vclibs +/vclibs64 # Installer files /external diff --git a/rts/lib/RmlSolLua/src/bind/Global.cpp b/rts/lib/RmlSolLua/src/bind/Global.cpp index 6c2aa57d1c..d251d8d634 100644 --- a/rts/lib/RmlSolLua/src/bind/Global.cpp +++ b/rts/lib/RmlSolLua/src/bind/Global.cpp @@ -62,6 +62,7 @@ namespace Rml::SolLua //"RegisterTag", //-- "GetContext", sol::resolve(&Rml::GetContext), + "RemoveContext", sol::resolve(&Rml::RemoveContext), "RegisterEventType", sol::overload(&functions::registerEventType4, &functions::registerEventType3), "AddTranslationString", [translationTable](const Rml::String& key, const Rml::String& translation, sol::this_state s) { return translationTable->addTranslation(key, translation); From 96f9a8ba6a90ee19f5da6149cdadf6bf618f16aa Mon Sep 17 00:00:00 2001 From: ChrisClark13 Date: Sun, 14 Jan 2024 18:53:06 -0700 Subject: [PATCH 34/58] do less bullying of the RmlSolLua lib instead set up our own plugin to keep track of created/removed contexts --- rts/Rml/Backends/RmlUi_Backend.cpp | 51 +++++++++++--- rts/Rml/Backends/RmlUi_Backend.h | 3 +- .../RmlSolLua/include/RmlSolLua/RmlSolLua.h | 4 +- .../include/RmlSolLua/SolLuaPlugin.h | 7 +- rts/lib/RmlSolLua/src/RmlSolLua.cpp | 10 +-- rts/lib/RmlSolLua/src/bind/Global.cpp | 15 +++- rts/lib/RmlSolLua/src/bind/bind.h | 4 +- rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp | 68 ++++++++----------- 8 files changed, 94 insertions(+), 68 deletions(-) diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index 5b219ee259..4dde8558e1 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -49,6 +49,7 @@ #include "Game/UI/MouseHandler.h" void createContext(const std::string &name); +bool removeContext(const std::string& name); class RenderInterface_GL3_SDL : public RenderInterface_GL3 { @@ -149,6 +150,34 @@ class VFSFileInterface : public Rml::FileInterface }; }; +class PassThroughPlugin : public Rml::Plugin +{ + void (*onContextCreate)(Rml::Context*); + void (*onContextDestroy)(Rml::Context*); + + public: + PassThroughPlugin(void (*onContextCreate)(Rml::Context*), void (*onContextDestroy)(Rml::Context*)) + : onContextCreate{onContextCreate}, onContextDestroy{onContextDestroy} + { + } + + int GetEventClasses() override + { + return EVT_BASIC; + } + + void OnInitialise() override {}; + void OnShutdown() override {}; + void OnContextCreate(Rml::Context* context) override + { + onContextCreate(context); + }; + void OnContextDestroy(Rml::Context* context) override + { + onContextDestroy(context); + }; +}; + /** Global data used by this backend. @@ -176,6 +205,8 @@ struct BackendData int winX = 1; int winY = 1; lua_State *ls; + + Rml::UniquePtr plugin; }; static Rml::UniquePtr data; @@ -223,7 +254,10 @@ bool RmlGui::InitializeLua(lua_State *lua_state) } sol::state_view lua(lua_state); data->ls = lua_state; - Rml::SolLua::SolLuaPlugin *slp = Rml::SolLua::Initialise(&lua, createContext); + data->plugin = Rml::MakeUnique(AddContext,RemoveContext); + Rml::RegisterPlugin(data->plugin.get()); + + Rml::SolLua::SolLuaPlugin *slp = Rml::SolLua::Initialise(&lua); data->system_interface.SetTranslationTable(&slp->translationTable); return true; } @@ -292,22 +326,17 @@ bool RmlGui::IsActive() return data->inputReceiver.IsAbove(0, 0); } -void createContext(const std::string &name) +void RmlGui::AddContext(Rml::Context *context) { - Rml::Context *context = Rml::CreateContext(name, Rml::Vector2i(data->winX, data->winY)); - // Rml::Debugger::Initialise(context); - RmlGui::AddContext(context); + context->SetDimensions({data->winX, data->winY}); + data->contexts.push_back(context); } -void RmlGui::CreateContext(const std::string &name) +void RmlGui::RemoveContext(Rml::Context *context) { - createContext(name); + data->contexts.erase(std::ranges::find(data->contexts, context)); } -void RmlGui::AddContext(Rml::Context *context) -{ - data->contexts.push_back(context); -} void RmlGui::Update() { diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index 66dc251204..045f7d84a0 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -36,6 +36,7 @@ #include #include "lib/sol2/sol.hpp" #include "Rml/Backends/RmlUi_Platform_SDL.h" +#include "RmlUi/Core/Context.h" using KeyDownCallback = bool (*)(Rml::Context *context, Rml::Input::KeyIdentifier key, int key_modifier, float native_dp_ratio, bool priority); @@ -67,8 +68,8 @@ namespace RmlGui void Update(); void RenderFrame(); - void CreateContext(const std::string &name); void AddContext(Rml::Context *context); + void RemoveContext(Rml::Context *context); void BeginFrame(); void PresentFrame(); diff --git a/rts/lib/RmlSolLua/include/RmlSolLua/RmlSolLua.h b/rts/lib/RmlSolLua/include/RmlSolLua/RmlSolLua.h index 59972e1588..ae388bfe70 100644 --- a/rts/lib/RmlSolLua/include/RmlSolLua/RmlSolLua.h +++ b/rts/lib/RmlSolLua/include/RmlSolLua/RmlSolLua.h @@ -33,7 +33,7 @@ namespace Rml::SolLua /// Initializes RmlSolLua using the supplied Lua state. /// /// The Lua state to initialize into. - RMLUILUA_API SolLuaPlugin* Initialise(sol::state_view* state, void (*contextCreator)(const std::string& name)); + RMLUILUA_API SolLuaPlugin* Initialise(sol::state_view* state); /// /// Initializes RmlSolLua using the supplied Lua state. @@ -41,7 +41,7 @@ namespace Rml::SolLua /// /// The Lua state to initialize into. /// The Lua variable name that is set to the document's id. - RMLUILUA_API SolLuaPlugin* Initialise(sol::state_view* state, void (*contextCreator)(const std::string& name), const Rml::String& lua_environment_identifier); + RMLUILUA_API SolLuaPlugin* Initialise(sol::state_view* state, const Rml::String& lua_environment_identifier); /// /// Registers RmlSolLua into the specified Lua state. diff --git a/rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h b/rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h index ffba9eaa03..36bdbe669f 100644 --- a/rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h +++ b/rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h @@ -21,11 +21,10 @@ namespace Rml::SolLua class RMLUILUA_API SolLuaPlugin : public Plugin { public: - SolLuaPlugin(sol::state_view lua_state, void (*contextCreator)(const std::string& name)); - SolLuaPlugin(sol::state_view lua_state, void (*contextCreator)(const std::string& name), const Rml::String& lua_environment_identifier); + SolLuaPlugin(sol::state_view lua_state); + SolLuaPlugin(sol::state_view lua_state, const Rml::String& lua_environment_identifier); TranslationTable translationTable; - void (*createContext)(const std::string& name); private: int GetEventClasses() override; @@ -34,8 +33,6 @@ namespace Rml::SolLua std::unique_ptr document_element_instancer; std::unique_ptr event_listener_instancer; - void OnElementCreate(Element* element); - void OnElementDestroy(Element* element); sol::state_view m_lua_state; Rml::String m_lua_env_identifier; diff --git a/rts/lib/RmlSolLua/src/RmlSolLua.cpp b/rts/lib/RmlSolLua/src/RmlSolLua.cpp index d7f4e6e0e7..c17d866417 100644 --- a/rts/lib/RmlSolLua/src/RmlSolLua.cpp +++ b/rts/lib/RmlSolLua/src/RmlSolLua.cpp @@ -9,24 +9,24 @@ namespace Rml::SolLua { - SolLuaPlugin* Initialise(sol::state_view* state, void (*contextCreator)(const std::string& name)) + SolLuaPlugin* Initialise(sol::state_view* state) { SolLuaPlugin* slp; if (state != nullptr) { - slp = new SolLuaPlugin(*state, contextCreator); + slp = new SolLuaPlugin(*state); ::Rml::RegisterPlugin(slp); RegisterLua(state, slp); } return slp; } - SolLuaPlugin* Initialise(sol::state_view* state, void (*contextCreator)(const std::string& name), const Rml::String& lua_environment_identifier) + SolLuaPlugin* Initialise(sol::state_view* state, const Rml::String& lua_environment_identifier) { SolLuaPlugin* slp; if (state != nullptr) { - slp = new SolLuaPlugin(*state, contextCreator, lua_environment_identifier); + slp = new SolLuaPlugin(*state, lua_environment_identifier); ::Rml::RegisterPlugin(slp); RegisterLua(state, slp); } @@ -43,7 +43,7 @@ namespace Rml::SolLua bind_element_form(*state); bind_document(*state); bind_event(*state); - bind_global(*state, &slp->translationTable, slp->createContext); + bind_global(*state, slp); bind_log(*state); bind_vector(*state); bind_convert(*state); diff --git a/rts/lib/RmlSolLua/src/bind/Global.cpp b/rts/lib/RmlSolLua/src/bind/Global.cpp index d251d8d634..7590dcf05f 100644 --- a/rts/lib/RmlSolLua/src/bind/Global.cpp +++ b/rts/lib/RmlSolLua/src/bind/Global.cpp @@ -1,4 +1,5 @@ #include "bind.h" +#include "RmlSolLua/SolLuaPlugin.h" namespace Rml::SolLua @@ -6,6 +7,13 @@ namespace Rml::SolLua namespace functions { + auto createContext(const Rml::String& name) + { + // Janky, but less jank than before at least + // context will be resized right away, use 1080p dimensions + return Rml::CreateContext(name, Rml::Vector2i(1920, 1080)); + } + auto getContext() { std::function result = [](int idx) { return Rml::GetContext(idx); }; @@ -46,14 +54,16 @@ namespace Rml::SolLua #define _ENUM(N) t[#N] = Rml::Input::KI_##N - void bind_global(sol::state_view& lua, TranslationTable* translationTable, void (*createContext)(const std::string& name)) + void bind_global(sol::state_view& lua, SolLuaPlugin* slp) { struct rmlui {}; + auto translationTable = &slp->translationTable; auto g = lua.new_usertype("rmlui", // M - "CreateContext", createContext, + "CreateContext", functions::createContext, + "RemoveContext", sol::resolve(&Rml::RemoveContext), "LoadFontFace", sol::overload( &functions::loadFontFace1, &functions::loadFontFace2, @@ -62,7 +72,6 @@ namespace Rml::SolLua //"RegisterTag", //-- "GetContext", sol::resolve(&Rml::GetContext), - "RemoveContext", sol::resolve(&Rml::RemoveContext), "RegisterEventType", sol::overload(&functions::registerEventType4, &functions::registerEventType3), "AddTranslationString", [translationTable](const Rml::String& key, const Rml::String& translation, sol::this_state s) { return translationTable->addTranslation(key, translation); diff --git a/rts/lib/RmlSolLua/src/bind/bind.h b/rts/lib/RmlSolLua/src/bind/bind.h index f69ee18380..9b12b4ed43 100644 --- a/rts/lib/RmlSolLua/src/bind/bind.h +++ b/rts/lib/RmlSolLua/src/bind/bind.h @@ -6,6 +6,8 @@ #include +#include "RmlSolLua/SolLuaPlugin.h" + #ifndef RMLUI_NO_THIRDPARTY_CONTAINERS template @@ -196,7 +198,7 @@ namespace Rml::SolLua void bind_element_derived(sol::state_view& lua); void bind_element_form(sol::state_view& lua); void bind_event(sol::state_view& lua); - void bind_global(sol::state_view& lua, TranslationTable* translationTable, void (*createContext)(const std::string& name)); + void bind_global(sol::state_view& lua, SolLuaPlugin *slp); void bind_log(sol::state_view& lua); void bind_vector(sol::state_view& lua); void bind_convert(sol::state_view& lua); diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp index 6b77b14f1a..19cb6e39f6 100644 --- a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp @@ -5,46 +5,34 @@ #include "bind/bind.h" - namespace Rml::SolLua { - - SolLuaPlugin::SolLuaPlugin(sol::state_view lua_state, void (*contextCreator)(const std::string& name)) - : m_lua_state{ lua_state }, createContext{contextCreator} - { - } - - SolLuaPlugin::SolLuaPlugin(sol::state_view lua_state, void (*contextCreator)(const std::string& name), const Rml::String& lua_environment_identifier) - : m_lua_state{ lua_state }, createContext{contextCreator}, m_lua_env_identifier{ lua_environment_identifier } - { - } - - int SolLuaPlugin::GetEventClasses() - { - return EVT_BASIC; - } - - void SolLuaPlugin::OnInitialise() - { - document_element_instancer = std::make_unique(m_lua_state, m_lua_env_identifier); - event_listener_instancer = std::make_unique(m_lua_state); - Factory::RegisterElementInstancer("body", document_element_instancer.get()); - Factory::RegisterEventListenerInstancer(event_listener_instancer.get()); - } - - void SolLuaPlugin::OnShutdown() - { - // m_lua_state.collect_garbage(); - delete this; - } - - void SolLuaPlugin::OnElementCreate(Element* element) - { - } - - void SolLuaPlugin::OnElementDestroy(Element* element) - { - //TODO: need to do something? - } - + SolLuaPlugin::SolLuaPlugin(sol::state_view lua_state) + : m_lua_state{lua_state} + { + } + + SolLuaPlugin::SolLuaPlugin(sol::state_view lua_state, const Rml::String& lua_environment_identifier) + : m_lua_state{lua_state}, m_lua_env_identifier{lua_environment_identifier} + { + } + + int SolLuaPlugin::GetEventClasses() + { + return EVT_BASIC; + } + + void SolLuaPlugin::OnInitialise() + { + document_element_instancer = std::make_unique(m_lua_state, m_lua_env_identifier); + event_listener_instancer = std::make_unique(m_lua_state); + Factory::RegisterElementInstancer("body", document_element_instancer.get()); + Factory::RegisterEventListenerInstancer(event_listener_instancer.get()); + } + + void SolLuaPlugin::OnShutdown() + { + // m_lua_state.collect_garbage(); + delete this; + } } // end namespace Rml::SolLua From f4f11e49e06c21f6f4b44a434223be19d8670e45 Mon Sep 17 00:00:00 2001 From: ChrisClark13 Date: Sun, 14 Jan 2024 15:54:47 -0700 Subject: [PATCH 35/58] add couple things to .gitignore make lua binding for RemoveContext --- .gitignore | 2 ++ rts/lib/RmlSolLua/src/bind/Global.cpp | 1 + 2 files changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 1c48718993..06b56af430 100644 --- a/.gitignore +++ b/.gitignore @@ -65,6 +65,7 @@ progress.make /_ReSharper.Caches .vs/ .vscode +/.idea # Windows libraries used by spring when compiling with MinGW # recommended: place the dir somewhere else, and specify with @@ -74,6 +75,7 @@ progress.make # Windows libraries used by spring when compiling with Visual Studio /vclibs +/vclibs64 # Installer files /external diff --git a/rts/lib/RmlSolLua/src/bind/Global.cpp b/rts/lib/RmlSolLua/src/bind/Global.cpp index 6c2aa57d1c..d251d8d634 100644 --- a/rts/lib/RmlSolLua/src/bind/Global.cpp +++ b/rts/lib/RmlSolLua/src/bind/Global.cpp @@ -62,6 +62,7 @@ namespace Rml::SolLua //"RegisterTag", //-- "GetContext", sol::resolve(&Rml::GetContext), + "RemoveContext", sol::resolve(&Rml::RemoveContext), "RegisterEventType", sol::overload(&functions::registerEventType4, &functions::registerEventType3), "AddTranslationString", [translationTable](const Rml::String& key, const Rml::String& translation, sol::this_state s) { return translationTable->addTranslation(key, translation); From b1f5b406812d4863fe00095b6bcd98f4b40df53f Mon Sep 17 00:00:00 2001 From: ChrisClark13 Date: Sun, 14 Jan 2024 18:53:06 -0700 Subject: [PATCH 36/58] do less bullying of the RmlSolLua lib instead set up our own plugin to keep track of created/removed contexts --- rts/Rml/Backends/RmlUi_Backend.cpp | 51 +++++++++++--- rts/Rml/Backends/RmlUi_Backend.h | 3 +- .../RmlSolLua/include/RmlSolLua/RmlSolLua.h | 4 +- .../include/RmlSolLua/SolLuaPlugin.h | 7 +- rts/lib/RmlSolLua/src/RmlSolLua.cpp | 10 +-- rts/lib/RmlSolLua/src/bind/Global.cpp | 15 +++- rts/lib/RmlSolLua/src/bind/bind.h | 4 +- rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp | 68 ++++++++----------- 8 files changed, 94 insertions(+), 68 deletions(-) diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index 5b219ee259..4dde8558e1 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -49,6 +49,7 @@ #include "Game/UI/MouseHandler.h" void createContext(const std::string &name); +bool removeContext(const std::string& name); class RenderInterface_GL3_SDL : public RenderInterface_GL3 { @@ -149,6 +150,34 @@ class VFSFileInterface : public Rml::FileInterface }; }; +class PassThroughPlugin : public Rml::Plugin +{ + void (*onContextCreate)(Rml::Context*); + void (*onContextDestroy)(Rml::Context*); + + public: + PassThroughPlugin(void (*onContextCreate)(Rml::Context*), void (*onContextDestroy)(Rml::Context*)) + : onContextCreate{onContextCreate}, onContextDestroy{onContextDestroy} + { + } + + int GetEventClasses() override + { + return EVT_BASIC; + } + + void OnInitialise() override {}; + void OnShutdown() override {}; + void OnContextCreate(Rml::Context* context) override + { + onContextCreate(context); + }; + void OnContextDestroy(Rml::Context* context) override + { + onContextDestroy(context); + }; +}; + /** Global data used by this backend. @@ -176,6 +205,8 @@ struct BackendData int winX = 1; int winY = 1; lua_State *ls; + + Rml::UniquePtr plugin; }; static Rml::UniquePtr data; @@ -223,7 +254,10 @@ bool RmlGui::InitializeLua(lua_State *lua_state) } sol::state_view lua(lua_state); data->ls = lua_state; - Rml::SolLua::SolLuaPlugin *slp = Rml::SolLua::Initialise(&lua, createContext); + data->plugin = Rml::MakeUnique(AddContext,RemoveContext); + Rml::RegisterPlugin(data->plugin.get()); + + Rml::SolLua::SolLuaPlugin *slp = Rml::SolLua::Initialise(&lua); data->system_interface.SetTranslationTable(&slp->translationTable); return true; } @@ -292,22 +326,17 @@ bool RmlGui::IsActive() return data->inputReceiver.IsAbove(0, 0); } -void createContext(const std::string &name) +void RmlGui::AddContext(Rml::Context *context) { - Rml::Context *context = Rml::CreateContext(name, Rml::Vector2i(data->winX, data->winY)); - // Rml::Debugger::Initialise(context); - RmlGui::AddContext(context); + context->SetDimensions({data->winX, data->winY}); + data->contexts.push_back(context); } -void RmlGui::CreateContext(const std::string &name) +void RmlGui::RemoveContext(Rml::Context *context) { - createContext(name); + data->contexts.erase(std::ranges::find(data->contexts, context)); } -void RmlGui::AddContext(Rml::Context *context) -{ - data->contexts.push_back(context); -} void RmlGui::Update() { diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index 66dc251204..045f7d84a0 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -36,6 +36,7 @@ #include #include "lib/sol2/sol.hpp" #include "Rml/Backends/RmlUi_Platform_SDL.h" +#include "RmlUi/Core/Context.h" using KeyDownCallback = bool (*)(Rml::Context *context, Rml::Input::KeyIdentifier key, int key_modifier, float native_dp_ratio, bool priority); @@ -67,8 +68,8 @@ namespace RmlGui void Update(); void RenderFrame(); - void CreateContext(const std::string &name); void AddContext(Rml::Context *context); + void RemoveContext(Rml::Context *context); void BeginFrame(); void PresentFrame(); diff --git a/rts/lib/RmlSolLua/include/RmlSolLua/RmlSolLua.h b/rts/lib/RmlSolLua/include/RmlSolLua/RmlSolLua.h index 59972e1588..ae388bfe70 100644 --- a/rts/lib/RmlSolLua/include/RmlSolLua/RmlSolLua.h +++ b/rts/lib/RmlSolLua/include/RmlSolLua/RmlSolLua.h @@ -33,7 +33,7 @@ namespace Rml::SolLua /// Initializes RmlSolLua using the supplied Lua state. /// /// The Lua state to initialize into. - RMLUILUA_API SolLuaPlugin* Initialise(sol::state_view* state, void (*contextCreator)(const std::string& name)); + RMLUILUA_API SolLuaPlugin* Initialise(sol::state_view* state); /// /// Initializes RmlSolLua using the supplied Lua state. @@ -41,7 +41,7 @@ namespace Rml::SolLua /// /// The Lua state to initialize into. /// The Lua variable name that is set to the document's id. - RMLUILUA_API SolLuaPlugin* Initialise(sol::state_view* state, void (*contextCreator)(const std::string& name), const Rml::String& lua_environment_identifier); + RMLUILUA_API SolLuaPlugin* Initialise(sol::state_view* state, const Rml::String& lua_environment_identifier); /// /// Registers RmlSolLua into the specified Lua state. diff --git a/rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h b/rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h index ffba9eaa03..36bdbe669f 100644 --- a/rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h +++ b/rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h @@ -21,11 +21,10 @@ namespace Rml::SolLua class RMLUILUA_API SolLuaPlugin : public Plugin { public: - SolLuaPlugin(sol::state_view lua_state, void (*contextCreator)(const std::string& name)); - SolLuaPlugin(sol::state_view lua_state, void (*contextCreator)(const std::string& name), const Rml::String& lua_environment_identifier); + SolLuaPlugin(sol::state_view lua_state); + SolLuaPlugin(sol::state_view lua_state, const Rml::String& lua_environment_identifier); TranslationTable translationTable; - void (*createContext)(const std::string& name); private: int GetEventClasses() override; @@ -34,8 +33,6 @@ namespace Rml::SolLua std::unique_ptr document_element_instancer; std::unique_ptr event_listener_instancer; - void OnElementCreate(Element* element); - void OnElementDestroy(Element* element); sol::state_view m_lua_state; Rml::String m_lua_env_identifier; diff --git a/rts/lib/RmlSolLua/src/RmlSolLua.cpp b/rts/lib/RmlSolLua/src/RmlSolLua.cpp index d7f4e6e0e7..c17d866417 100644 --- a/rts/lib/RmlSolLua/src/RmlSolLua.cpp +++ b/rts/lib/RmlSolLua/src/RmlSolLua.cpp @@ -9,24 +9,24 @@ namespace Rml::SolLua { - SolLuaPlugin* Initialise(sol::state_view* state, void (*contextCreator)(const std::string& name)) + SolLuaPlugin* Initialise(sol::state_view* state) { SolLuaPlugin* slp; if (state != nullptr) { - slp = new SolLuaPlugin(*state, contextCreator); + slp = new SolLuaPlugin(*state); ::Rml::RegisterPlugin(slp); RegisterLua(state, slp); } return slp; } - SolLuaPlugin* Initialise(sol::state_view* state, void (*contextCreator)(const std::string& name), const Rml::String& lua_environment_identifier) + SolLuaPlugin* Initialise(sol::state_view* state, const Rml::String& lua_environment_identifier) { SolLuaPlugin* slp; if (state != nullptr) { - slp = new SolLuaPlugin(*state, contextCreator, lua_environment_identifier); + slp = new SolLuaPlugin(*state, lua_environment_identifier); ::Rml::RegisterPlugin(slp); RegisterLua(state, slp); } @@ -43,7 +43,7 @@ namespace Rml::SolLua bind_element_form(*state); bind_document(*state); bind_event(*state); - bind_global(*state, &slp->translationTable, slp->createContext); + bind_global(*state, slp); bind_log(*state); bind_vector(*state); bind_convert(*state); diff --git a/rts/lib/RmlSolLua/src/bind/Global.cpp b/rts/lib/RmlSolLua/src/bind/Global.cpp index d251d8d634..7590dcf05f 100644 --- a/rts/lib/RmlSolLua/src/bind/Global.cpp +++ b/rts/lib/RmlSolLua/src/bind/Global.cpp @@ -1,4 +1,5 @@ #include "bind.h" +#include "RmlSolLua/SolLuaPlugin.h" namespace Rml::SolLua @@ -6,6 +7,13 @@ namespace Rml::SolLua namespace functions { + auto createContext(const Rml::String& name) + { + // Janky, but less jank than before at least + // context will be resized right away, use 1080p dimensions + return Rml::CreateContext(name, Rml::Vector2i(1920, 1080)); + } + auto getContext() { std::function result = [](int idx) { return Rml::GetContext(idx); }; @@ -46,14 +54,16 @@ namespace Rml::SolLua #define _ENUM(N) t[#N] = Rml::Input::KI_##N - void bind_global(sol::state_view& lua, TranslationTable* translationTable, void (*createContext)(const std::string& name)) + void bind_global(sol::state_view& lua, SolLuaPlugin* slp) { struct rmlui {}; + auto translationTable = &slp->translationTable; auto g = lua.new_usertype("rmlui", // M - "CreateContext", createContext, + "CreateContext", functions::createContext, + "RemoveContext", sol::resolve(&Rml::RemoveContext), "LoadFontFace", sol::overload( &functions::loadFontFace1, &functions::loadFontFace2, @@ -62,7 +72,6 @@ namespace Rml::SolLua //"RegisterTag", //-- "GetContext", sol::resolve(&Rml::GetContext), - "RemoveContext", sol::resolve(&Rml::RemoveContext), "RegisterEventType", sol::overload(&functions::registerEventType4, &functions::registerEventType3), "AddTranslationString", [translationTable](const Rml::String& key, const Rml::String& translation, sol::this_state s) { return translationTable->addTranslation(key, translation); diff --git a/rts/lib/RmlSolLua/src/bind/bind.h b/rts/lib/RmlSolLua/src/bind/bind.h index f69ee18380..9b12b4ed43 100644 --- a/rts/lib/RmlSolLua/src/bind/bind.h +++ b/rts/lib/RmlSolLua/src/bind/bind.h @@ -6,6 +6,8 @@ #include +#include "RmlSolLua/SolLuaPlugin.h" + #ifndef RMLUI_NO_THIRDPARTY_CONTAINERS template @@ -196,7 +198,7 @@ namespace Rml::SolLua void bind_element_derived(sol::state_view& lua); void bind_element_form(sol::state_view& lua); void bind_event(sol::state_view& lua); - void bind_global(sol::state_view& lua, TranslationTable* translationTable, void (*createContext)(const std::string& name)); + void bind_global(sol::state_view& lua, SolLuaPlugin *slp); void bind_log(sol::state_view& lua); void bind_vector(sol::state_view& lua); void bind_convert(sol::state_view& lua); diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp index 6b77b14f1a..19cb6e39f6 100644 --- a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp @@ -5,46 +5,34 @@ #include "bind/bind.h" - namespace Rml::SolLua { - - SolLuaPlugin::SolLuaPlugin(sol::state_view lua_state, void (*contextCreator)(const std::string& name)) - : m_lua_state{ lua_state }, createContext{contextCreator} - { - } - - SolLuaPlugin::SolLuaPlugin(sol::state_view lua_state, void (*contextCreator)(const std::string& name), const Rml::String& lua_environment_identifier) - : m_lua_state{ lua_state }, createContext{contextCreator}, m_lua_env_identifier{ lua_environment_identifier } - { - } - - int SolLuaPlugin::GetEventClasses() - { - return EVT_BASIC; - } - - void SolLuaPlugin::OnInitialise() - { - document_element_instancer = std::make_unique(m_lua_state, m_lua_env_identifier); - event_listener_instancer = std::make_unique(m_lua_state); - Factory::RegisterElementInstancer("body", document_element_instancer.get()); - Factory::RegisterEventListenerInstancer(event_listener_instancer.get()); - } - - void SolLuaPlugin::OnShutdown() - { - // m_lua_state.collect_garbage(); - delete this; - } - - void SolLuaPlugin::OnElementCreate(Element* element) - { - } - - void SolLuaPlugin::OnElementDestroy(Element* element) - { - //TODO: need to do something? - } - + SolLuaPlugin::SolLuaPlugin(sol::state_view lua_state) + : m_lua_state{lua_state} + { + } + + SolLuaPlugin::SolLuaPlugin(sol::state_view lua_state, const Rml::String& lua_environment_identifier) + : m_lua_state{lua_state}, m_lua_env_identifier{lua_environment_identifier} + { + } + + int SolLuaPlugin::GetEventClasses() + { + return EVT_BASIC; + } + + void SolLuaPlugin::OnInitialise() + { + document_element_instancer = std::make_unique(m_lua_state, m_lua_env_identifier); + event_listener_instancer = std::make_unique(m_lua_state); + Factory::RegisterElementInstancer("body", document_element_instancer.get()); + Factory::RegisterEventListenerInstancer(event_listener_instancer.get()); + } + + void SolLuaPlugin::OnShutdown() + { + // m_lua_state.collect_garbage(); + delete this; + } } // end namespace Rml::SolLua From 0ceaf206ced50dfea2cceeb6d6cdadce3a2898c5 Mon Sep 17 00:00:00 2001 From: ChrisClark13 Date: Mon, 15 Jan 2024 23:09:25 -0700 Subject: [PATCH 37/58] attempt to add thread safety to RmlGui::data->context accesses allow RmlUI to properly set cursors have RmlUI input events take precedence after other inputs (but after regular Lua input) --- rts/Game/UI/GuiHandler.cpp | 46 +- rts/Game/UI/InputReceiver.cpp | 7 +- rts/Game/UI/InputReceiver.h | 2 + rts/Lua/LuaUnsyncedCtrl.cpp | 59 ++- rts/Rml/Backends/RmlUi_Backend.cpp | 795 +++++++++++++++-------------- rts/Rml/Backends/RmlUi_Backend.h | 5 +- rts/Rml/RmlInputReceiver.h | 24 +- 7 files changed, 492 insertions(+), 446 deletions(-) diff --git a/rts/Game/UI/GuiHandler.cpp b/rts/Game/UI/GuiHandler.cpp index 2bf3f37521..a9dca44cf9 100644 --- a/rts/Game/UI/GuiHandler.cpp +++ b/rts/Game/UI/GuiHandler.cpp @@ -2,10 +2,8 @@ #include "GuiHandler.h" -#include #include "CommandColors.h" #include "KeyBindings.h" -#include "KeyCodes.h" #include "MiniMap.h" #include "MouseHandler.h" #include "Game/Camera.h" @@ -14,49 +12,46 @@ #include "Game/GlobalUnsynced.h" #include "Game/SelectedUnitsHandler.h" #include "Game/TraceRay.h" -#include "Lua/LuaConfig.h" -#include "Lua/LuaTextures.h" #include "Lua/LuaGaia.h" #include "Lua/LuaRules.h" +#include "Lua/LuaTextures.h" #include "Lua/LuaUI.h" #include "Map/Ground.h" #include "Map/MapInfo.h" -#include "Map/MetalMap.h" #include "Map/ReadMap.h" -#include "Rendering/Fonts/glFont.h" #include "Rendering/IconHandler.h" -#include "Rendering/Units/UnitDrawer.h" +#include "Rendering/Fonts/glFont.h" #include "Rendering/GL/glExtra.h" #include "Rendering/Map/InfoTexture/IInfoTextureHandler.h" -#include "Rendering/Textures/Bitmap.h" #include "Rendering/Textures/NamedTextures.h" +#include "Rendering/Units/UnitDrawer.h" +#include "Rml/Backends/RmlUi_Backend.h" #include "Sim/Features/Feature.h" #include "Sim/Misc/LosHandler.h" -#include "Sim/Units/CommandAI/CommandAI.h" -#include "Sim/Units/CommandAI/BuilderCAI.h" -#include "Sim/Units/UnitDefHandler.h" #include "Sim/Units/Unit.h" +#include "Sim/Units/UnitDefHandler.h" #include "Sim/Units/UnitHandler.h" -#include "Sim/Units/UnitLoader.h" -#include "Sim/Weapons/WeaponDefHandler.h" +#include "Sim/Units/CommandAI/BuilderCAI.h" +#include "Sim/Units/CommandAI/CommandAI.h" #include "Sim/Weapons/Weapon.h" -#include "System/Config/ConfigHandler.h" +#include "Sim/Weapons/WeaponDefHandler.h" #include "System/EventHandler.h" -#include "System/GlobalConfig.h" -#include "System/Log/ILog.h" #include "System/SpringMath.h" +#include "System/StringUtil.h" #include "System/UnorderedMap.hpp" #include "System/UnorderedSet.hpp" -#include "System/StringUtil.h" +#include "System/Config/ConfigHandler.h" +#include "System/FileSystem/FileHandler.h" +#include "System/FileSystem/SimpleParser.h" #include "System/Input/KeyInput.h" +#include "System/Log/ILog.h" #include "System/Sound/ISound.h" #include "System/Sound/ISoundChannels.h" -#include "System/FileSystem/FileHandler.h" -#include "System/FileSystem/SimpleParser.h" #include #include + CONFIG(bool, MiniMapMarker).defaultValue(true).headlessValue(false); CONFIG(bool, InvertQueueKey).defaultValue(false); @@ -1050,9 +1045,16 @@ void CGuiHandler::SetCursorIcon() const if (!game->hideInterface && !mouse->offscreen) ir = GetReceiverAt(mouse->lastx, mouse->lasty); - if ((ir != nullptr) && (ir != minimap)) { - mouse->ChangeCursor(newCursor, cursorScale); - return; + if (ir != nullptr) + { + // mouse cursor icon is being handled elsewhere + if (ir->HandlesCursorIcon()) + return; + + if (ir != minimap) { + mouse->ChangeCursor(newCursor, cursorScale); + return; + } } if (ir == minimap) diff --git a/rts/Game/UI/InputReceiver.cpp b/rts/Game/UI/InputReceiver.cpp index 3adb227c86..dc256a01c3 100644 --- a/rts/Game/UI/InputReceiver.cpp +++ b/rts/Game/UI/InputReceiver.cpp @@ -4,6 +4,7 @@ #include "InputReceiver.h" #include "Lua/LuaInputReceiver.h" #include "Rendering/GL/myGL.h" +#include "Rml/Backends/RmlUi_Backend.h" #include "System/Rectangle.h" @@ -68,10 +69,14 @@ void CInputReceiver::DrawReceivers() CInputReceiver* CInputReceiver::GetReceiverAt(int x, int y) { - // always ask Lua first + // check lua first if (luaInputReceiver != nullptr && luaInputReceiver->IsAbove(x, y)) return luaInputReceiver; + // check RmlUI second + if (RmlGui::IsActive()) + return RmlGui::GetInputReceiver(); + for (CInputReceiver* recv: GetReceivers()) { if (recv == nullptr) continue; diff --git a/rts/Game/UI/InputReceiver.h b/rts/Game/UI/InputReceiver.h index 49bbf67ba1..d81ac6a11a 100644 --- a/rts/Game/UI/InputReceiver.h +++ b/rts/Game/UI/InputReceiver.h @@ -29,6 +29,8 @@ class CInputReceiver virtual void MouseMove(int x, int y, int dx, int dy, int button) {} virtual void MouseRelease(int x, int y, int button) {} virtual bool IsAbove(int x, int y) { return false; } + virtual bool HandlesCursorIcon() { return false; } + virtual void Draw() {} virtual std::string GetTooltip(int x, int y) { return "No tooltip defined"; } diff --git a/rts/Lua/LuaUnsyncedCtrl.cpp b/rts/Lua/LuaUnsyncedCtrl.cpp index 7d66aed8e2..4105f77e0f 100644 --- a/rts/Lua/LuaUnsyncedCtrl.cpp +++ b/rts/Lua/LuaUnsyncedCtrl.cpp @@ -3,9 +3,9 @@ #include "LuaUnsyncedCtrl.h" #include "LuaConfig.h" -#include "LuaInclude.h" #include "LuaHandle.h" #include "LuaHashString.h" +#include "LuaInclude.h" #include "LuaMenu.h" #include "LuaOpenGLUtils.h" #include "LuaParser.h" @@ -16,51 +16,49 @@ #include "ExternalAI/SkirmishAIHandler.h" #include "Game/Camera.h" #include "Game/CameraHandler.h" -#include "Game/Camera/CameraController.h" #include "Game/GameSetup.h" #include "Game/GlobalUnsynced.h" +#include "Game/InMapDraw.h" +#include "Game/InMapDrawModel.h" #include "Game/IVideoCapturing.h" #include "Game/SelectedUnitsHandler.h" +#include "Game/Camera/CameraController.h" #include "Game/Players/Player.h" #include "Game/Players/PlayerHandler.h" -#include "Game/InMapDraw.h" -#include "Game/InMapDrawModel.h" #include "Game/UI/CommandColors.h" #include "Game/UI/CursorIcons.h" #include "Game/UI/GuiHandler.h" #include "Game/UI/InfoConsole.h" -#include "Game/UI/KeyCodes.h" -#include "Game/UI/KeySet.h" #include "Game/UI/KeyBindings.h" +#include "Game/UI/KeySet.h" #include "Game/UI/MiniMap.h" #include "Game/UI/MouseHandler.h" #include "Game/UI/Groups/Group.h" #include "Game/UI/Groups/GroupHandler.h" -#include "Map/MapInfo.h" -#include "Map/ReadMap.h" #include "Map/BaseGroundDrawer.h" #include "Map/BaseGroundTextures.h" +#include "Map/ReadMap.h" #include "Map/SMF/SMFGroundDrawer.h" #include "Map/SMF/ROAM/RoamMeshDrawer.h" -#include "Net/Protocol/NetProtocol.h" #include "Net/GameServer.h" +#include "Net/Protocol/NetProtocol.h" +#include "Rendering/CommandDrawer.h" +#include "Rendering/IconHandler.h" +#include "Rendering/Env/IGroundDecalDrawer.h" #include "Rendering/Env/ISky.h" +#include "Rendering/Env/MapRendering.h" #include "Rendering/Env/SunLighting.h" #include "Rendering/Env/WaterRendering.h" -#include "Rendering/Env/MapRendering.h" -#include "Rendering/Env/IGroundDecalDrawer.h" #include "Rendering/Env/Decals/DecalsDrawerGL4.h" #include "Rendering/Env/Particles/Classes/NanoProjectile.h" +#include "Rendering/Features/FeatureDrawer.h" #include "Rendering/GL/myGL.h" -#include "Rendering/CommandDrawer.h" -#include "Rendering/IconHandler.h" +#include "Rendering/Map/InfoTexture/IInfoTextureHandler.h" #include "Rendering/Models/3DModel.h" #include "Rendering/Models/IModelParser.h" -#include "Rendering/Features/FeatureDrawer.h" -#include "Rendering/Units/UnitDrawer.h" -#include "Rendering/Map/InfoTexture/IInfoTextureHandler.h" #include "Rendering/Textures/Bitmap.h" #include "Rendering/Textures/NamedTextures.h" +#include "Rendering/Units/UnitDrawer.h" #include "Sim/Features/FeatureDef.h" #include "Sim/Features/FeatureDefHandler.h" #include "Sim/Features/FeatureHandler.h" @@ -70,25 +68,24 @@ #include "Sim/Units/Unit.h" #include "Sim/Units/UnitDefHandler.h" #include "Sim/Units/UnitHandler.h" -#include "System/Config/ConfigHandler.h" #include "System/EventHandler.h" #include "System/GlobalConfig.h" -#include "System/Log/DefaultFilter.h" -#include "System/Log/ILog.h" -#include "System/Net/PackPacket.h" -#include "System/Platform/Misc.h" +#include "System/LoadLock.h" #include "System/SafeUtil.h" -#include "System/UnorderedMap.hpp" +#include "System/SpringHash.h" #include "System/StringUtil.h" -#include "System/Sound/ISound.h" -#include "System/Sound/ISoundChannels.h" -#include "System/FileSystem/FileHandler.h" +#include "System/UnorderedMap.hpp" +#include "System/Config/ConfigHandler.h" #include "System/FileSystem/DataDirLocater.h" +#include "System/FileSystem/FileHandler.h" #include "System/FileSystem/FileSystem.h" +#include "System/Log/ILog.h" +#include "System/Net/PackPacket.h" +#include "System/Platform/Misc.h" #include "System/Platform/Watchdog.h" #include "System/Platform/WindowManagerHelper.h" -#include "System/SpringHash.h" -#include "System/LoadLock.h" +#include "System/Sound/ISound.h" +#include "System/Sound/ISoundChannels.h" #if !defined(HEADLESS) && !defined(NO_SOUND) @@ -102,10 +99,12 @@ #include -#include #include +#include #include +#include "Rml/Backends/RmlUi_Backend.h" + // MinGW defines this for a WINAPI function #undef SendMessage #undef CreateDirectory @@ -2740,6 +2739,10 @@ int LuaUnsyncedCtrl::WarpMouse(lua_State* L) */ int LuaUnsyncedCtrl::SetMouseCursor(lua_State* L) { + // ignore lua requests to control cursor when mouse is over RmlUI element + if (RmlGui::IsActive()) + return 0; + const std::string& cursorName = luaL_checkstring(L, 1); const float cursorScale = luaL_optfloat(L, 2, 1.0f); diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index 4dde8558e1..6e2c903a92 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -26,156 +26,169 @@ * */ -#include "RmlUi_Backend.h" -#include "RmlUi_Platform_SDL.h" -#include "RmlUi_Renderer_GL3.h" -#include "RmlUi_Renderer_Headless.h" +#include +#include +#include #include -#include #include #include -#include -#include "Rendering/GL/myGL.h" -#include "Rendering/Textures/Bitmap.h" -#include "Lua/LuaUI.h" -#include -#include "System/FileSystem/FileHandler.h" -#include #include -#include "System/FileSystem/DataDirsAccess.h" -#include "System/Input/InputHandler.h" +#include "RmlUi_Backend.h" +#include "RmlUi_Platform_SDL.h" +#include "RmlUi_Renderer_GL3.h" +#include "Lua/LuaUI.h" +#include "Rendering/Textures/Bitmap.h" #include "Rml/RmlInputReceiver.h" -#include "Game/UI/MouseHandler.h" +#include "System/FileSystem/FileHandler.h" +#include "System/Input/InputHandler.h" + +using CtxMutex = std::recursive_mutex; +using CtxLockGuard = std::lock_guard; -void createContext(const std::string &name); +void createContext(const std::string& name); bool removeContext(const std::string& name); class RenderInterface_GL3_SDL : public RenderInterface_GL3 { public: - RenderInterface_GL3_SDL() {} - - bool LoadTexture(Rml::TextureHandle &texture_handle, Rml::Vector2i &texture_dimensions, const Rml::String &source) override - { - CBitmap bmp; - if (!bmp.Load(source)) - { - return false; - } - SDL_Surface *surface = bmp.CreateSDLSurface(); - - bool success = false; - if (surface) - { - texture_dimensions.x = surface->w; - texture_dimensions.y = surface->h; - - if (surface->format->format != SDL_PIXELFORMAT_RGBA32) - { - SDL_SetSurfaceAlphaMod(surface, SDL_ALPHA_OPAQUE); - SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE); - - SDL_Surface *new_surface = SDL_CreateRGBSurfaceWithFormat(0, surface->w, surface->h, 32, SDL_PIXELFORMAT_RGBA32); - if (!new_surface) - return false; - - if (SDL_BlitSurface(surface, 0, new_surface, 0) != 0) - return false; - - SDL_FreeSurface(surface); - surface = new_surface; - } - - success = RenderInterface_GL3::GenerateTexture(texture_handle, (const Rml::byte *)surface->pixels, texture_dimensions); - SDL_FreeSurface(surface); - } - - return success; - } + RenderInterface_GL3_SDL() + { + } + + bool LoadTexture(Rml::TextureHandle& texture_handle, Rml::Vector2i& texture_dimensions, + const Rml::String& source) override + { + CBitmap bmp; + if (!bmp.Load(source)) + { + return false; + } + SDL_Surface* surface = bmp.CreateSDLSurface(); + + bool success = false; + if (surface) + { + texture_dimensions.x = surface->w; + texture_dimensions.y = surface->h; + + if (surface->format->format != SDL_PIXELFORMAT_RGBA32) + { + SDL_SetSurfaceAlphaMod(surface, SDL_ALPHA_OPAQUE); + SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE); + + SDL_Surface* new_surface = SDL_CreateRGBSurfaceWithFormat( + 0, surface->w, surface->h, 32, SDL_PIXELFORMAT_RGBA32); + if (!new_surface) + return false; + + if (SDL_BlitSurface(surface, 0, new_surface, 0) != 0) + return false; + + SDL_FreeSurface(surface); + surface = new_surface; + } + + success = RenderInterface_GL3::GenerateTexture(texture_handle, (const Rml::byte*)surface->pixels, + texture_dimensions); + SDL_FreeSurface(surface); + } + + return success; + } }; class VFSFileInterface : public Rml::FileInterface { public: - VFSFileInterface() {} - Rml::FileHandle Open(const Rml::String &path) - { - // LOG_L(L_FATAL, "[SpringApp::%s]OPENING: %s %d", __func__, path.c_str(), CLuaHandle::GetDevMode()); - const std::string mode = SPRING_VFS_RAW_FIRST; - CFileHandler *fh = new CFileHandler(path, mode); - if (!fh->FileExists()) - { - delete fh; - return (Rml::FileHandle) nullptr; - } - return (Rml::FileHandle)fh; - } - - void Close(Rml::FileHandle file) - { - ((CFileHandler *)file)->Close(); - delete (CFileHandler *)file; - } - - size_t Read(void *buffer, size_t size, Rml::FileHandle file) - { - return ((CFileHandler *)file)->Read(buffer, size); - } - - bool Seek(Rml::FileHandle file, long offset, int origin) - { - std::ios_base::seekdir seekdir; - switch (origin) - { - case SEEK_CUR: - seekdir = std::ios_base::cur; - break; - case SEEK_END: - seekdir = std::ios_base::end; - break; - case SEEK_SET: - default: - seekdir = std::ios_base::beg; - break; - } - ((CFileHandler *)file)->Seek(offset, seekdir); - // TODO: need to detect seek failure and then return false? - return true; - } - - size_t Tell(Rml::FileHandle file) - { - return ((CFileHandler *)file)->GetPos(); - }; + VFSFileInterface() + { + } + + Rml::FileHandle Open(const Rml::String& path) + { + // LOG_L(L_FATAL, "[SpringApp::%s]OPENING: %s %d", __func__, path.c_str(), CLuaHandle::GetDevMode()); + const std::string mode = SPRING_VFS_RAW_FIRST; + CFileHandler* fh = new CFileHandler(path, mode); + if (!fh->FileExists()) + { + delete fh; + return (Rml::FileHandle)nullptr; + } + return (Rml::FileHandle)fh; + } + + void Close(Rml::FileHandle file) + { + ((CFileHandler*)file)->Close(); + delete (CFileHandler*)file; + } + + size_t Read(void* buffer, size_t size, Rml::FileHandle file) + { + return ((CFileHandler*)file)->Read(buffer, size); + } + + bool Seek(Rml::FileHandle file, long offset, int origin) + { + std::ios_base::seekdir seekdir; + switch (origin) + { + case SEEK_CUR: + seekdir = std::ios_base::cur; + break; + case SEEK_END: + seekdir = std::ios_base::end; + break; + case SEEK_SET: + default: + seekdir = std::ios_base::beg; + break; + } + ((CFileHandler*)file)->Seek(offset, seekdir); + // TODO: need to detect seek failure and then return false? + return true; + } + + size_t Tell(Rml::FileHandle file) + { + return ((CFileHandler*)file)->GetPos(); + }; }; class PassThroughPlugin : public Rml::Plugin { - void (*onContextCreate)(Rml::Context*); - void (*onContextDestroy)(Rml::Context*); - - public: - PassThroughPlugin(void (*onContextCreate)(Rml::Context*), void (*onContextDestroy)(Rml::Context*)) - : onContextCreate{onContextCreate}, onContextDestroy{onContextDestroy} - { - } - - int GetEventClasses() override - { - return EVT_BASIC; - } - - void OnInitialise() override {}; - void OnShutdown() override {}; - void OnContextCreate(Rml::Context* context) override - { - onContextCreate(context); - }; - void OnContextDestroy(Rml::Context* context) override - { - onContextDestroy(context); - }; + void (*onContextCreate)(Rml::Context*); + void (*onContextDestroy)(Rml::Context*); + +public: + PassThroughPlugin(void (*onContextCreate)(Rml::Context*), void (*onContextDestroy)(Rml::Context*)) + : onContextCreate{onContextCreate}, onContextDestroy{onContextDestroy} + { + } + + int GetEventClasses() override + { + return EVT_BASIC; + } + + void OnInitialise() override + { + }; + + void OnShutdown() override + { + }; + + void OnContextCreate(Rml::Context* context) override + { + onContextCreate(context); + }; + + void OnContextDestroy(Rml::Context* context) override + { + onContextDestroy(context); + }; }; /** @@ -185,202 +198,214 @@ class PassThroughPlugin : public Rml::Plugin */ struct BackendData { - SystemInterface_SDL system_interface; + SystemInterface_SDL system_interface; #ifndef HEADLESS - RenderInterface_GL3_SDL render_interface; + RenderInterface_GL3_SDL render_interface; #else RenderInterface_Headless render_interface; #endif - VFSFileInterface file_interface; - - SDL_Window *window = nullptr; - SDL_GLContext glcontext = nullptr; - std::vector contexts; - InputHandler::SignalType::connection_type inputCon; - CRmlInputReceiver inputReceiver; - - // make atomic_bool? - bool initialized = false; - bool debuggerAttached = false; - int winX = 1; - int winY = 1; - lua_State *ls; - - Rml::UniquePtr plugin; + VFSFileInterface file_interface; + + SDL_Window* window = nullptr; + SDL_GLContext glcontext = nullptr; + std::vector contexts; + InputHandler::SignalType::connection_type inputCon; + CRmlInputReceiver inputReceiver; + + // make atomic_bool? + bool initialized = false; + bool debuggerAttached = false; + int winX = 1; + int winY = 1; + lua_State* ls; + + Rml::UniquePtr plugin; + CtxMutex contextMutex; }; + static Rml::UniquePtr data; bool RmlInitialized() { - return data && data->initialized; + return data && data->initialized; } -bool RmlGui::Initialize(SDL_Window *target_window, SDL_GLContext target_glcontext, int winX, int winY) +bool RmlGui::Initialize(SDL_Window* target_window, SDL_GLContext target_glcontext, int winX, int winY) { - data = Rml::MakeUnique(); + data = Rml::MakeUnique(); - if (!data->render_interface) - { - data.reset(); - fprintf(stderr, "Could not initialize OpenGL3 render interface."); - return false; - } + if (!data->render_interface) + { + data.reset(); + fprintf(stderr, "Could not initialize OpenGL3 render interface."); + return false; + } - data->window = target_window; - data->glcontext = target_glcontext; + data->window = target_window; + data->glcontext = target_glcontext; - Rml::SetFileInterface(&data->file_interface); - Rml::SetSystemInterface(RmlGui::GetSystemInterface()); - Rml::SetRenderInterface(RmlGui::GetRenderInterface()); + Rml::SetFileInterface(&data->file_interface); + Rml::SetSystemInterface(RmlGui::GetSystemInterface()); + Rml::SetRenderInterface(RmlGui::GetRenderInterface()); - data->system_interface.SetWindow(target_window); - data->render_interface.SetViewport(winX, winY); - data->winX = winX; - data->winY = winY; + data->system_interface.SetWindow(target_window); + data->render_interface.SetViewport(winX, winY); + data->winX = winX; + data->winY = winY; - Rml::Initialise(); + Rml::Initialise(); - Rml::LoadFontFace("fonts/FreeSansBold.otf", true); - data->inputCon = input.AddHandler(&RmlGui::ProcessEvent); - data->initialized = true; - return true; + Rml::LoadFontFace("fonts/FreeSansBold.otf", true); + data->inputCon = input.AddHandler(&RmlGui::ProcessEvent); + data->initialized = true; + return true; } -bool RmlGui::InitializeLua(lua_State *lua_state) +bool RmlGui::InitializeLua(lua_State* lua_state) { - if (!RmlInitialized()) - { - return false; - } - sol::state_view lua(lua_state); - data->ls = lua_state; - data->plugin = Rml::MakeUnique(AddContext,RemoveContext); - Rml::RegisterPlugin(data->plugin.get()); - - Rml::SolLua::SolLuaPlugin *slp = Rml::SolLua::Initialise(&lua); - data->system_interface.SetTranslationTable(&slp->translationTable); - return true; + if (!RmlInitialized()) + { + return false; + } + sol::state_view lua(lua_state); + data->ls = lua_state; + data->plugin = Rml::MakeUnique(AddContext, RemoveContext); + Rml::RegisterPlugin(data->plugin.get()); + + Rml::SolLua::SolLuaPlugin* slp = Rml::SolLua::Initialise(&lua); + data->system_interface.SetTranslationTable(&slp->translationTable); + return true; } void RmlGui::Shutdown() { - if (!RmlInitialized()) - { - return; - } - data->initialized = false; - - // SDL_GL_DeleteContext(data->glcontext); - // SDL_DestroyWindow(data->window); - Rml::Shutdown(); - // data.reset(); - - // SDL_Quit(); + if (!RmlInitialized()) + { + return; + } + data->initialized = false; + + // removes all contexts + Rml::Shutdown(); } void RmlGui::Reload() { - if (!RmlInitialized()) - { - return; - } - LOG_L(L_FATAL, "[SpringApp::%s] reloading: ", __func__); - SDL_Window *window = data->window; - SDL_GLContext glcontext = data->glcontext; - int winX = data->winX; - int winY = data->winY; - RmlGui::Shutdown(); - RmlGui::Initialize(window, glcontext, winX, winY); + if (!RmlInitialized()) + { + return; + } + LOG_L(L_FATAL, "[SpringApp::%s] reloading: ", __func__); + SDL_Window* window = data->window; + SDL_GLContext glcontext = data->glcontext; + int winX = data->winX; + int winY = data->winY; + RmlGui::Shutdown(); + RmlGui::Initialize(window, glcontext, winX, winY); } void RmlGui::ToggleDebugger(int contextIndex) { - if (data->debuggerAttached) - { - Rml::Debugger::Initialise(data->contexts[contextIndex]); - Rml::Debugger::SetVisible(true); - } - else - { - Rml::Debugger::Shutdown(); - } - data->debuggerAttached = !data->debuggerAttached; + if (data->debuggerAttached) + { + // TODO: Ensure thread safety somehow if needed + Rml::Debugger::Initialise(data->contexts[contextIndex]); + Rml::Debugger::SetVisible(true); + } + else + { + Rml::Debugger::Shutdown(); + } + data->debuggerAttached = !data->debuggerAttached; } -Rml::SystemInterface *RmlGui::GetSystemInterface() +Rml::SystemInterface* RmlGui::GetSystemInterface() { - return &data->system_interface; + return &data->system_interface; } -Rml::RenderInterface *RmlGui::GetRenderInterface() +Rml::RenderInterface* RmlGui::GetRenderInterface() { - return &data->render_interface; + return &data->render_interface; } bool RmlGui::IsActive() { - if (!RmlInitialized()) - { - return false; - } - return data->inputReceiver.IsAbove(0, 0); + if (!RmlInitialized()) + { + return false; + } + return data->inputReceiver.IsAbove(); } -void RmlGui::AddContext(Rml::Context *context) + +CInputReceiver* RmlGui::GetInputReceiver() +{ + if (!RmlInitialized()) + { + return nullptr; + } + return &data->inputReceiver; +} + + +void RmlGui::AddContext(Rml::Context* context) { - context->SetDimensions({data->winX, data->winY}); - data->contexts.push_back(context); + CtxLockGuard lock(data->contextMutex); + context->SetDimensions({data->winX, data->winY}); + data->contexts.push_back(context); } -void RmlGui::RemoveContext(Rml::Context *context) +void RmlGui::RemoveContext(Rml::Context* context) { - data->contexts.erase(std::ranges::find(data->contexts, context)); + CtxLockGuard lock(data->contextMutex); + data->contexts.erase(std::ranges::find(data->contexts, context)); } void RmlGui::Update() { - ZoneScopedN("RmlGui Update"); - if (!RmlInitialized()) - { - return; - } + ZoneScopedN("RmlGui Update"); + if (!RmlInitialized()) + { + return; + } #ifndef HEADLESS - for (auto &context : data->contexts) - { - context->Update(); - } + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) + { + context->Update(); + } #endif } void RmlGui::RenderFrame() { - ZoneScopedN("RmlGui Draw"); - if (!RmlInitialized()) - { - return; - } + ZoneScopedN("RmlGui Draw"); + if (!RmlInitialized()) + { + return; + } #ifndef HEADLESS - RmlGui::BeginFrame(); - for (auto &context : data->contexts) - { - context->Render(); - } - RmlGui::PresentFrame(); + RmlGui::BeginFrame(); + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) + { + context->Render(); + } + RmlGui::PresentFrame(); #endif } void RmlGui::BeginFrame() { - // data->render_interface.Clear(); - data->render_interface.BeginFrame(); + // data->render_interface.Clear(); + data->render_interface.BeginFrame(); } void RmlGui::PresentFrame() { - data->render_interface.EndFrame(); - RMLUI_FrameMark; + data->render_interface.EndFrame(); + RMLUI_FrameMark; } /* @@ -388,17 +413,17 @@ void RmlGui::PresentFrame() */ bool RmlGui::ProcessMouseMove(int x, int y, int dx, int dy, int button) { - if (!RmlInitialized()) - { - return false; - } - bool result = false; - for (auto &context : data->contexts) - { - result |= !RmlSDL::EventMouseMove(context, x, y); - } - data->inputReceiver.setActive(result); - return result; + if (!RmlInitialized()) + { + return false; + } + bool result = false; + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) + { + result |= !RmlSDL::EventMouseMove(context, x, y); + } + data->inputReceiver.setActive(result); + return result; } /* @@ -406,26 +431,26 @@ bool RmlGui::ProcessMouseMove(int x, int y, int dx, int dy, int button) */ bool RmlGui::ProcessMousePress(int x, int y, int button) { - if (!RmlInitialized()) - { - return false; - } - bool result = false; - for (auto &context : data->contexts) - { - bool handled = !RmlSDL::EventMousePress(context, x, y, button); - result |= handled; - if (!handled) - { - Rml::Element *el = context->GetFocusElement(); - if (el) - { - el->Blur(); - } - } - } - data->inputReceiver.setActive(result); - return result; + if (!RmlInitialized()) + { + return false; + } + bool result = false; + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) + { + bool handled = !RmlSDL::EventMousePress(context, x, y, button); + result |= handled; + if (!handled) + { + Rml::Element* el = context->GetFocusElement(); + if (el) + { + el->Blur(); + } + } + } + data->inputReceiver.setActive(result); + return result; } /* @@ -433,17 +458,17 @@ bool RmlGui::ProcessMousePress(int x, int y, int button) */ bool RmlGui::ProcessMouseRelease(int x, int y, int button) { - if (!RmlInitialized()) - { - return false; - } - bool result = false; - for (auto &context : data->contexts) - { - result |= !RmlSDL::EventMouseRelease(context, x, y, button); - } - data->inputReceiver.setActive(result); - return result; + if (!RmlInitialized()) + { + return false; + } + bool result = false; + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) + { + result |= !RmlSDL::EventMouseRelease(context, x, y, button); + } + data->inputReceiver.setActive(result); + return result; } /* @@ -451,17 +476,17 @@ bool RmlGui::ProcessMouseRelease(int x, int y, int button) */ bool RmlGui::ProcessMouseWheel(float delta) { - if (!RmlInitialized()) - { - return false; - } - bool result = false; - for (auto &context : data->contexts) - { - result |= !RmlSDL::EventMouseWheel(context, delta); - } - data->inputReceiver.setActive(result); - return result; + if (!RmlInitialized()) + { + return false; + } + bool result = false; + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) + { + result |= !RmlSDL::EventMouseWheel(context, delta); + } + data->inputReceiver.setActive(result); + return result; } /* @@ -469,95 +494,95 @@ bool RmlGui::ProcessMouseWheel(float delta) */ bool RmlGui::ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat) { - if (!RmlInitialized()) - { - return false; - } - bool result = false; - for (auto &context : data->contexts) - { - auto kc = RmlSDL::ConvertKey(keyCode); - result |= !RmlSDL::EventKeyDown(context, kc); - } - return result; + if (!RmlInitialized()) + { + return false; + } + bool result = false; + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) + { + auto kc = RmlSDL::ConvertKey(keyCode); + result |= !RmlSDL::EventKeyDown(context, kc); + } + return result; } bool RmlGui::ProcessKeyReleased(int keyCode, int scanCode) { - if (!RmlInitialized()) - { - return false; - } - bool result = false; - for (auto &context : data->contexts) - { - result |= !RmlSDL::EventKeyUp(context, RmlSDL::ConvertKey(keyCode)); - } - return result; + if (!RmlInitialized()) + { + return false; + } + bool result = false; + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) + { + result |= !RmlSDL::EventKeyUp(context, RmlSDL::ConvertKey(keyCode)); + } + return result; } -bool RmlGui::ProcessTextInput(const std::string &text) +bool RmlGui::ProcessTextInput(const std::string& text) { - if (!RmlInitialized()) - { - return false; - } - bool result = false; - for (auto &context : data->contexts) - { - result |= !RmlSDL::EventTextInput(context, text); - } - return result; + if (!RmlInitialized()) + { + return false; + } + bool result = false; + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) + { + result |= !RmlSDL::EventTextInput(context, text); + } + return result; } -bool processContextEvent(Rml::Context *context, const SDL_Event &event) +bool processContextEvent(Rml::Context* context, const SDL_Event& event) { - switch (event.type) - { - case SDL_WINDOWEVENT: - { - switch (event.window.event) - { - case SDL_WINDOWEVENT_SIZE_CHANGED: - { - Rml::Vector2i dimensions(event.window.data1, event.window.data2); - data->render_interface.SetViewport(dimensions.x, dimensions.y); - data->winX = dimensions.x; - data->winY = dimensions.y; - } - break; - } - RmlSDL::InputEventHandler(context, event); - } - break; - case SDL_MOUSEMOTION: - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - case SDL_MOUSEWHEEL: - case SDL_KEYDOWN: - case SDL_KEYUP: - case SDL_TEXTINPUT: - break; // handled elsewhere - default: - { - RmlSDL::InputEventHandler(context, event); - } - break; - } - // these events are not captured, and should continue propogating - return false; + switch (event.type) + { + case SDL_WINDOWEVENT: + { + switch (event.window.event) + { + case SDL_WINDOWEVENT_SIZE_CHANGED: + { + Rml::Vector2i dimensions(event.window.data1, event.window.data2); + data->render_interface.SetViewport(dimensions.x, dimensions.y); + data->winX = dimensions.x; + data->winY = dimensions.y; + } + break; + } + RmlSDL::InputEventHandler(context, event); + } + break; + case SDL_MOUSEMOTION: + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEWHEEL: + case SDL_KEYDOWN: + case SDL_KEYUP: + case SDL_TEXTINPUT: + break; // handled elsewhere + default: + { + RmlSDL::InputEventHandler(context, event); + } + break; + } + // these events are not captured, and should continue propogating + return false; } -bool RmlGui::ProcessEvent(const SDL_Event &event) +bool RmlGui::ProcessEvent(const SDL_Event& event) { - if (!RmlInitialized()) - { - return false; - } - bool result = false; - for (auto &context : data->contexts) - { - result |= processContextEvent(context, event); - } - return result; + if (!RmlInitialized()) + { + return false; + } + bool result = false; + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) + { + result |= processContextEvent(context, event); + } + return result; } diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index 045f7d84a0..cd44cdc719 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -34,9 +34,9 @@ #include #include #include + +#include "Game/UI/InputReceiver.h" #include "lib/sol2/sol.hpp" -#include "Rml/Backends/RmlUi_Platform_SDL.h" -#include "RmlUi/Core/Context.h" using KeyDownCallback = bool (*)(Rml::Context *context, Rml::Input::KeyIdentifier key, int key_modifier, float native_dp_ratio, bool priority); @@ -64,6 +64,7 @@ namespace RmlGui void ToggleDebugger(int contextIndex); bool IsActive(); + CInputReceiver* GetInputReceiver(); void Update(); void RenderFrame(); diff --git a/rts/Rml/RmlInputReceiver.h b/rts/Rml/RmlInputReceiver.h index abb97104e2..207fee4c0c 100644 --- a/rts/Rml/RmlInputReceiver.h +++ b/rts/Rml/RmlInputReceiver.h @@ -4,7 +4,7 @@ #define RMLINPUT_H #include "Game/UI/InputReceiver.h" -#include "Rml/Backends/RmlUi_Backend.h" +#include "Backends/RmlUi_Backend.h" class CRmlInputReceiver : public CInputReceiver { @@ -13,16 +13,24 @@ class CRmlInputReceiver : public CInputReceiver ~CRmlInputReceiver() = default; /** - IsAbove is used for determining which cursor icon should be displayed. This is tracked in ProcessMouse functions when RmlUi handles - the event and that state is true if rml is capturing the mouse. + IsAbove is used for determining which part of the game is interacting with the mouse. +

+ Unlike the other implementations of this function, tracking of this state is handled enirely by the RmlUI ProcessMouse functions. +

+ This means that the x and y parameters are completely ignored + + @param x ignored, the "IsAbove" state is handled elsewhere + @param y ignored, this "IsAbove" state is handled elsewhere + @return If the mouse is interacting with any RmlUI elements */ - bool IsAbove(int x, int y) { return rml_active; }; + bool IsAbove(int x = 0, int y = 0) { return rml_active; }; + bool HandlesCursorIcon() override { return true; }; void setActive(bool active) { rml_active = active; }; - bool KeyPressed(int keyCode, int scanCode, bool isRepeat) { return RmlGui::ProcessKeyPressed(keyCode, scanCode, isRepeat); } - void MouseMove(int x, int y, int dx, int dy, int button) { RmlGui::ProcessMouseMove(x, y, dx, dy, button); } - bool MousePress(int x, int y, int button) { return RmlGui::ProcessMousePress(x, y, button); } - void MouseRelease(int x, int y, int button) { RmlGui::ProcessMouseRelease(x, y, button); } + bool KeyPressed(int keyCode, int scanCode, bool isRepeat) { return RmlGui::ProcessKeyPressed(keyCode, scanCode, isRepeat); }; + void MouseMove(int x, int y, int dx, int dy, int button) { RmlGui::ProcessMouseMove(x, y, dx, dy, button); }; + bool MousePress(int x, int y, int button) { return RmlGui::ProcessMousePress(x, y, button); }; + void MouseRelease(int x, int y, int button) { RmlGui::ProcessMouseRelease(x, y, button); }; private: bool rml_active; From 01ccf83cb90ce6c7ee072a6718b3d729f2c0995e Mon Sep 17 00:00:00 2001 From: ChrisClark13 Date: Tue, 16 Jan 2024 20:42:30 -0700 Subject: [PATCH 38/58] have RmlGui store what cursor it would like (or "" to cede control of it) and have the system check that. rename own custom Platform_SDL stuff to Platform_RTS clean up code here and there, undo changes to random files --- rts/Game/UI/GuiHandler.cpp | 13 +- rts/Game/UI/InputReceiver.cpp | 2 +- rts/Game/UI/InputReceiver.h | 2 - rts/Game/UI/MouseHandler.cpp | 9 +- rts/Lua/LuaUnsyncedCtrl.cpp | 4 - rts/Rml/Backends/RmlUi_Backend.cpp | 56 ++- rts/Rml/Backends/RmlUi_Backend.h | 9 +- rts/Rml/Backends/RmlUi_Platform_RTS.cpp | 372 ++++++++++++++++++ ...Ui_Platform_SDL.h => RmlUi_Platform_RTS.h} | 29 +- rts/Rml/Backends/RmlUi_Platform_SDL.cpp | 372 ------------------ rts/Rml/Backends/RmlUi_Renderer_Headless.h | 5 + rts/Rml/CMakeLists.txt | 2 +- rts/Rml/RmlInputReceiver.h | 6 +- rts/lib/RmlSolLua/src/bind/Global.cpp | 5 +- 14 files changed, 438 insertions(+), 448 deletions(-) create mode 100644 rts/Rml/Backends/RmlUi_Platform_RTS.cpp rename rts/Rml/Backends/{RmlUi_Platform_SDL.h => RmlUi_Platform_RTS.h} (84%) delete mode 100644 rts/Rml/Backends/RmlUi_Platform_SDL.cpp diff --git a/rts/Game/UI/GuiHandler.cpp b/rts/Game/UI/GuiHandler.cpp index a9dca44cf9..65bef61739 100644 --- a/rts/Game/UI/GuiHandler.cpp +++ b/rts/Game/UI/GuiHandler.cpp @@ -1045,16 +1045,9 @@ void CGuiHandler::SetCursorIcon() const if (!game->hideInterface && !mouse->offscreen) ir = GetReceiverAt(mouse->lastx, mouse->lasty); - if (ir != nullptr) - { - // mouse cursor icon is being handled elsewhere - if (ir->HandlesCursorIcon()) - return; - - if (ir != minimap) { - mouse->ChangeCursor(newCursor, cursorScale); - return; - } + if ((ir != nullptr) && (ir != minimap)) { + mouse->ChangeCursor(newCursor, cursorScale); + return; } if (ir == minimap) diff --git a/rts/Game/UI/InputReceiver.cpp b/rts/Game/UI/InputReceiver.cpp index dc256a01c3..f8a4ea3579 100644 --- a/rts/Game/UI/InputReceiver.cpp +++ b/rts/Game/UI/InputReceiver.cpp @@ -74,7 +74,7 @@ CInputReceiver* CInputReceiver::GetReceiverAt(int x, int y) return luaInputReceiver; // check RmlUI second - if (RmlGui::IsActive()) + if (RmlGui::IsMouseInteractingWith()) return RmlGui::GetInputReceiver(); for (CInputReceiver* recv: GetReceivers()) { diff --git a/rts/Game/UI/InputReceiver.h b/rts/Game/UI/InputReceiver.h index d81ac6a11a..49bbf67ba1 100644 --- a/rts/Game/UI/InputReceiver.h +++ b/rts/Game/UI/InputReceiver.h @@ -29,8 +29,6 @@ class CInputReceiver virtual void MouseMove(int x, int y, int dx, int dy, int button) {} virtual void MouseRelease(int x, int y, int button) {} virtual bool IsAbove(int x, int y) { return false; } - virtual bool HandlesCursorIcon() { return false; } - virtual void Draw() {} virtual std::string GetTooltip(int x, int y) { return "No tooltip defined"; } diff --git a/rts/Game/UI/MouseHandler.cpp b/rts/Game/UI/MouseHandler.cpp index 38585c0730..133ef7a624 100644 --- a/rts/Game/UI/MouseHandler.cpp +++ b/rts/Game/UI/MouseHandler.cpp @@ -380,7 +380,7 @@ bool CMouseHandler::GetSelectionBoxVertices(float3& bl, float3& br, float3& tl, if (activeReceiver != nullptr) return false; - if (RmlGui::IsActive()) { + if (RmlGui::IsMouseInteractingWith()) { return false; } @@ -705,6 +705,13 @@ std::string CMouseHandler::GetCurrentTooltip() const void CMouseHandler::Update() { + // Rml is very polite about asking for changes to the cursor + // so let's make sure it's not ignored! + if (RmlGui::IsMouseInteractingWith()) + // if the cursor string is empty, then Rml is cedeing control of it + if (auto& rmlCursor = RmlGui::GetMouseCursor(); !rmlCursor.empty()) + queuedCursorName = rmlCursor; + SetCursor(queuedCursorName); if (!hideCursor) { diff --git a/rts/Lua/LuaUnsyncedCtrl.cpp b/rts/Lua/LuaUnsyncedCtrl.cpp index 4105f77e0f..2a6c32f90e 100644 --- a/rts/Lua/LuaUnsyncedCtrl.cpp +++ b/rts/Lua/LuaUnsyncedCtrl.cpp @@ -2739,10 +2739,6 @@ int LuaUnsyncedCtrl::WarpMouse(lua_State* L) */ int LuaUnsyncedCtrl::SetMouseCursor(lua_State* L) { - // ignore lua requests to control cursor when mouse is over RmlUI element - if (RmlGui::IsActive()) - return 0; - const std::string& cursorName = luaL_checkstring(L, 1); const float cursorScale = luaL_optfloat(L, 2, 1.0f); diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index 6e2c903a92..41a68b71b1 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -35,7 +35,7 @@ #include #include "RmlUi_Backend.h" -#include "RmlUi_Platform_SDL.h" +#include "RmlUi_Platform_RTS.h" #include "RmlUi_Renderer_GL3.h" #include "Lua/LuaUI.h" #include "Rendering/Textures/Bitmap.h" @@ -52,9 +52,7 @@ bool removeContext(const std::string& name); class RenderInterface_GL3_SDL : public RenderInterface_GL3 { public: - RenderInterface_GL3_SDL() - { - } + RenderInterface_GL3_SDL() {} bool LoadTexture(Rml::TextureHandle& texture_handle, Rml::Vector2i& texture_dimensions, const Rml::String& source) override @@ -101,9 +99,7 @@ class RenderInterface_GL3_SDL : public RenderInterface_GL3 class VFSFileInterface : public Rml::FileInterface { public: - VFSFileInterface() - { - } + VFSFileInterface() {} Rml::FileHandle Open(const Rml::String& path) { @@ -163,22 +159,15 @@ class PassThroughPlugin : public Rml::Plugin public: PassThroughPlugin(void (*onContextCreate)(Rml::Context*), void (*onContextDestroy)(Rml::Context*)) - : onContextCreate{onContextCreate}, onContextDestroy{onContextDestroy} - { - } + : onContextCreate{onContextCreate}, onContextDestroy{onContextDestroy} {} int GetEventClasses() override { return EVT_BASIC; } - void OnInitialise() override - { - }; - - void OnShutdown() override - { - }; + void OnInitialise() override {}; + void OnShutdown() override {}; void OnContextCreate(Rml::Context* context) override { @@ -198,7 +187,7 @@ class PassThroughPlugin : public Rml::Plugin */ struct BackendData { - SystemInterface_SDL system_interface; + SystemInterface_RTS system_interface; #ifndef HEADLESS RenderInterface_GL3_SDL render_interface; #else @@ -248,7 +237,6 @@ bool RmlGui::Initialize(SDL_Window* target_window, SDL_GLContext target_glcontex Rml::SetSystemInterface(RmlGui::GetSystemInterface()); Rml::SetRenderInterface(RmlGui::GetRenderInterface()); - data->system_interface.SetWindow(target_window); data->render_interface.SetViewport(winX, winY); data->winX = winX; data->winY = winY; @@ -329,7 +317,7 @@ Rml::RenderInterface* RmlGui::GetRenderInterface() return &data->render_interface; } -bool RmlGui::IsActive() +bool RmlGui::IsMouseInteractingWith() { if (!RmlInitialized()) { @@ -338,6 +326,14 @@ bool RmlGui::IsActive() return data->inputReceiver.IsAbove(); } +const std::string& RmlGui::GetMouseCursor() +{ + if (!RmlInitialized()) + { + return ""; + } + return data->system_interface.GetMouseCursor(); +} CInputReceiver* RmlGui::GetInputReceiver() { @@ -420,7 +416,7 @@ bool RmlGui::ProcessMouseMove(int x, int y, int dx, int dy, int button) bool result = false; for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { - result |= !RmlSDL::EventMouseMove(context, x, y); + result |= !RmlRTS::EventMouseMove(context, x, y); } data->inputReceiver.setActive(result); return result; @@ -438,7 +434,7 @@ bool RmlGui::ProcessMousePress(int x, int y, int button) bool result = false; for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { - bool handled = !RmlSDL::EventMousePress(context, x, y, button); + bool handled = !RmlRTS::EventMousePress(context, x, y, button); result |= handled; if (!handled) { @@ -465,7 +461,7 @@ bool RmlGui::ProcessMouseRelease(int x, int y, int button) bool result = false; for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { - result |= !RmlSDL::EventMouseRelease(context, x, y, button); + result |= !RmlRTS::EventMouseRelease(context, x, y, button); } data->inputReceiver.setActive(result); return result; @@ -483,7 +479,7 @@ bool RmlGui::ProcessMouseWheel(float delta) bool result = false; for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { - result |= !RmlSDL::EventMouseWheel(context, delta); + result |= !RmlRTS::EventMouseWheel(context, delta); } data->inputReceiver.setActive(result); return result; @@ -501,8 +497,8 @@ bool RmlGui::ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat) bool result = false; for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { - auto kc = RmlSDL::ConvertKey(keyCode); - result |= !RmlSDL::EventKeyDown(context, kc); + auto kc = RmlRTS::ConvertKey(keyCode); + result |= !RmlRTS::EventKeyDown(context, kc); } return result; } @@ -516,7 +512,7 @@ bool RmlGui::ProcessKeyReleased(int keyCode, int scanCode) bool result = false; for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { - result |= !RmlSDL::EventKeyUp(context, RmlSDL::ConvertKey(keyCode)); + result |= !RmlRTS::EventKeyUp(context, RmlRTS::ConvertKey(keyCode)); } return result; } @@ -530,7 +526,7 @@ bool RmlGui::ProcessTextInput(const std::string& text) bool result = false; for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { - result |= !RmlSDL::EventTextInput(context, text); + result |= !RmlRTS::EventTextInput(context, text); } return result; } @@ -552,7 +548,7 @@ bool processContextEvent(Rml::Context* context, const SDL_Event& event) } break; } - RmlSDL::InputEventHandler(context, event); + RmlRTS::InputEventHandler(context, event); } break; case SDL_MOUSEMOTION: @@ -565,7 +561,7 @@ bool processContextEvent(Rml::Context* context, const SDL_Event& event) break; // handled elsewhere default: { - RmlSDL::InputEventHandler(context, event); + RmlRTS::InputEventHandler(context, event); } break; } diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index cd44cdc719..b109895332 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -29,17 +29,13 @@ #ifndef RMLUI_BACKENDS_BACKEND_H #define RMLUI_BACKENDS_BACKEND_H -#include -#include -#include +#include #include #include #include "Game/UI/InputReceiver.h" #include "lib/sol2/sol.hpp" -using KeyDownCallback = bool (*)(Rml::Context *context, Rml::Input::KeyIdentifier key, int key_modifier, float native_dp_ratio, bool priority); - namespace RmlGui { @@ -63,7 +59,8 @@ namespace RmlGui bool ProcessMouseWheel(float delta); void ToggleDebugger(int contextIndex); - bool IsActive(); + bool IsMouseInteractingWith(); + const std::string& GetMouseCursor(); CInputReceiver* GetInputReceiver(); void Update(); diff --git a/rts/Rml/Backends/RmlUi_Platform_RTS.cpp b/rts/Rml/Backends/RmlUi_Platform_RTS.cpp new file mode 100644 index 0000000000..5d0cd326ac --- /dev/null +++ b/rts/Rml/Backends/RmlUi_Platform_RTS.cpp @@ -0,0 +1,372 @@ +/* + * This source file is part of RmlUi, the HTML/CSS Interface Middleware + * + * For the latest information, see http://github.com/mikke89/RmlUi + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * Copyright (c) 2019-2023 The RmlUi Team, and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "RmlUi_Platform_RTS.h" +#include +#include +#include +#include +#include +#include + +SystemInterface_RTS::SystemInterface_RTS() {} + +SystemInterface_RTS::~SystemInterface_RTS() {} + +double SystemInterface_RTS::GetElapsedTime() +{ + return spring_gettime().toSecsf(); +} + +int SystemInterface_RTS::TranslateString(Rml::String& translated, const Rml::String& input) +{ + if (!translationTable || !translationTable->exists(input)) + { + translated = input; + return 0; + } + std::string translation = translationTable->getTranslationString(input); + translated = translation; + return 1; +} + +bool SystemInterface_RTS::LogMessage(Rml::Log::Type type, const Rml::String& message) +{ + const char* fmtStr = "[Lua:Rml] %s"; + const char* logStr = message.c_str(); + switch (type) + { + case Rml::Log::LT_ASSERT: + case Rml::Log::LT_DEBUG: + { + LOG_L(L_DEBUG, fmtStr, logStr); + } + break; + case Rml::Log::LT_ERROR: + { + LOG_L(L_ERROR, fmtStr, logStr); + } + break; + case Rml::Log::LT_WARNING: + { + LOG_L(L_WARNING, fmtStr, logStr); + } + break; + + case Rml::Log::LT_INFO: + default: + { + LOG_L(L_INFO, fmtStr, logStr); + } + break; + } + return true; +} + +void SystemInterface_RTS::SetMouseCursor(const Rml::String& cursor_name) +{ + mouseCursor = cursor_name; +} + +const Rml::String& SystemInterface_RTS::GetMouseCursor() +{ + return mouseCursor; +} + +void SystemInterface_RTS::SetClipboardText(const Rml::String& text_utf8) +{ + SDL_SetClipboardText(text_utf8.c_str()); +} + +void SystemInterface_RTS::GetClipboardText(Rml::String& text) +{ + char* raw_text = SDL_GetClipboardText(); + text = Rml::String(raw_text); + SDL_free(raw_text); +} + +void SystemInterface_RTS::SetTranslationTable(TranslationTable* tt) +{ + translationTable = tt; +} + +bool RmlRTS::EventKeyDown(Rml::Context* context, Rml::Input::KeyIdentifier key) +{ + bool result = context->ProcessKeyDown(key, GetKeyModifierState()); + if (key == Rml::Input::KI_RETURN || key == Rml::Input::KI_NUMPADENTER) + result &= context->ProcessTextInput('\n'); + return result; +} + +bool RmlRTS::EventKeyUp(Rml::Context* context, Rml::Input::KeyIdentifier key) +{ + return context->ProcessKeyUp(key, GetKeyModifierState()); +} + +bool RmlRTS::EventTextInput(Rml::Context* context, const std::string& text) +{ + return context->ProcessTextInput(Rml::String(text)); +} + +bool RmlRTS::EventMouseMove(Rml::Context* context, Sint32 x, Sint32 y) +{ + return context->ProcessMouseMove(x, y, GetKeyModifierState()); +} + +bool RmlRTS::EventMousePress(Rml::Context* context, Sint32 x, Sint32 y, Sint32 button) +{ + return context->ProcessMouseButtonDown(ConvertMouseButton(button), GetKeyModifierState()); +}; + +bool RmlRTS::EventMouseRelease(Rml::Context* context, Sint32 x, Sint32 y, Sint32 button) +{ + return context->ProcessMouseButtonUp(ConvertMouseButton(button), GetKeyModifierState()); +}; + +bool RmlRTS::EventMouseWheel(Rml::Context* context, float delta) +{ + return context->ProcessMouseWheel(-delta, GetKeyModifierState()); +}; + +bool RmlRTS::InputEventHandler(Rml::Context* context, const SDL_Event& ev) +{ + bool result = true; + + switch (ev.type) + { + case SDL_MOUSEMOTION: + result = context->ProcessMouseMove(ev.motion.x, ev.motion.y, GetKeyModifierState()); + break; + case SDL_MOUSEBUTTONDOWN: + result = context->ProcessMouseButtonDown(ConvertMouseButton(ev.button.button), GetKeyModifierState()); + SDL_CaptureMouse(SDL_TRUE); + break; + case SDL_MOUSEBUTTONUP: + SDL_CaptureMouse(SDL_FALSE); + result = context->ProcessMouseButtonUp(ConvertMouseButton(ev.button.button), GetKeyModifierState()); + break; + case SDL_MOUSEWHEEL: + result = context->ProcessMouseWheel(float(-ev.wheel.y), GetKeyModifierState()); + break; + case SDL_KEYDOWN: + result = context->ProcessKeyDown(ConvertKey(ev.key.keysym.sym), GetKeyModifierState()); + if (ev.key.keysym.sym == SDLK_RETURN || ev.key.keysym.sym == SDLK_KP_ENTER) + result &= context->ProcessTextInput('\n'); + break; + case SDL_KEYUP: + result = context->ProcessKeyUp(ConvertKey(ev.key.keysym.sym), GetKeyModifierState()); + break; + case SDL_TEXTINPUT: + result = context->ProcessTextInput(Rml::String(&ev.text.text[0])); + break; + case SDL_WINDOWEVENT: + { + switch (ev.window.event) + { + case SDL_WINDOWEVENT_SIZE_CHANGED: + { + Rml::Vector2i dimensions(ev.window.data1, ev.window.data2); + context->SetDimensions(dimensions); + } + break; + case SDL_WINDOWEVENT_LEAVE: + context->ProcessMouseLeave(); + break; + } + } + break; + default: + break; + } + + return result; +} + +Rml::Input::KeyIdentifier RmlRTS::ConvertKey(int sdlkey) +{ + // clang-format off + switch (sdlkey) + { + case SDLK_UNKNOWN: return Rml::Input::KI_UNKNOWN; + case SDLK_ESCAPE: return Rml::Input::KI_ESCAPE; + case SDLK_SPACE: return Rml::Input::KI_SPACE; + case SDLK_0: return Rml::Input::KI_0; + case SDLK_1: return Rml::Input::KI_1; + case SDLK_2: return Rml::Input::KI_2; + case SDLK_3: return Rml::Input::KI_3; + case SDLK_4: return Rml::Input::KI_4; + case SDLK_5: return Rml::Input::KI_5; + case SDLK_6: return Rml::Input::KI_6; + case SDLK_7: return Rml::Input::KI_7; + case SDLK_8: return Rml::Input::KI_8; + case SDLK_9: return Rml::Input::KI_9; + case SDLK_a: return Rml::Input::KI_A; + case SDLK_b: return Rml::Input::KI_B; + case SDLK_c: return Rml::Input::KI_C; + case SDLK_d: return Rml::Input::KI_D; + case SDLK_e: return Rml::Input::KI_E; + case SDLK_f: return Rml::Input::KI_F; + case SDLK_g: return Rml::Input::KI_G; + case SDLK_h: return Rml::Input::KI_H; + case SDLK_i: return Rml::Input::KI_I; + case SDLK_j: return Rml::Input::KI_J; + case SDLK_k: return Rml::Input::KI_K; + case SDLK_l: return Rml::Input::KI_L; + case SDLK_m: return Rml::Input::KI_M; + case SDLK_n: return Rml::Input::KI_N; + case SDLK_o: return Rml::Input::KI_O; + case SDLK_p: return Rml::Input::KI_P; + case SDLK_q: return Rml::Input::KI_Q; + case SDLK_r: return Rml::Input::KI_R; + case SDLK_s: return Rml::Input::KI_S; + case SDLK_t: return Rml::Input::KI_T; + case SDLK_u: return Rml::Input::KI_U; + case SDLK_v: return Rml::Input::KI_V; + case SDLK_w: return Rml::Input::KI_W; + case SDLK_x: return Rml::Input::KI_X; + case SDLK_y: return Rml::Input::KI_Y; + case SDLK_z: return Rml::Input::KI_Z; + case SDLK_SEMICOLON: return Rml::Input::KI_OEM_1; + case SDLK_PLUS: return Rml::Input::KI_OEM_PLUS; + case SDLK_COMMA: return Rml::Input::KI_OEM_COMMA; + case SDLK_MINUS: return Rml::Input::KI_OEM_MINUS; + case SDLK_PERIOD: return Rml::Input::KI_OEM_PERIOD; + case SDLK_SLASH: return Rml::Input::KI_OEM_2; + case SDLK_BACKQUOTE: return Rml::Input::KI_OEM_3; + case SDLK_LEFTBRACKET: return Rml::Input::KI_OEM_4; + case SDLK_BACKSLASH: return Rml::Input::KI_OEM_5; + case SDLK_RIGHTBRACKET: return Rml::Input::KI_OEM_6; + case SDLK_QUOTEDBL: return Rml::Input::KI_OEM_7; + case SDLK_KP_0: return Rml::Input::KI_NUMPAD0; + case SDLK_KP_1: return Rml::Input::KI_NUMPAD1; + case SDLK_KP_2: return Rml::Input::KI_NUMPAD2; + case SDLK_KP_3: return Rml::Input::KI_NUMPAD3; + case SDLK_KP_4: return Rml::Input::KI_NUMPAD4; + case SDLK_KP_5: return Rml::Input::KI_NUMPAD5; + case SDLK_KP_6: return Rml::Input::KI_NUMPAD6; + case SDLK_KP_7: return Rml::Input::KI_NUMPAD7; + case SDLK_KP_8: return Rml::Input::KI_NUMPAD8; + case SDLK_KP_9: return Rml::Input::KI_NUMPAD9; + case SDLK_KP_ENTER: return Rml::Input::KI_NUMPADENTER; + case SDLK_KP_MULTIPLY: return Rml::Input::KI_MULTIPLY; + case SDLK_KP_PLUS: return Rml::Input::KI_ADD; + case SDLK_KP_MINUS: return Rml::Input::KI_SUBTRACT; + case SDLK_KP_PERIOD: return Rml::Input::KI_DECIMAL; + case SDLK_KP_DIVIDE: return Rml::Input::KI_DIVIDE; + case SDLK_KP_EQUALS: return Rml::Input::KI_OEM_NEC_EQUAL; + case SDLK_BACKSPACE: return Rml::Input::KI_BACK; + case SDLK_TAB: return Rml::Input::KI_TAB; + case SDLK_CLEAR: return Rml::Input::KI_CLEAR; + case SDLK_RETURN: return Rml::Input::KI_RETURN; + case SDLK_PAUSE: return Rml::Input::KI_PAUSE; + case SDLK_CAPSLOCK: return Rml::Input::KI_CAPITAL; + case SDLK_PAGEUP: return Rml::Input::KI_PRIOR; + case SDLK_PAGEDOWN: return Rml::Input::KI_NEXT; + case SDLK_END: return Rml::Input::KI_END; + case SDLK_HOME: return Rml::Input::KI_HOME; + case SDLK_LEFT: return Rml::Input::KI_LEFT; + case SDLK_UP: return Rml::Input::KI_UP; + case SDLK_RIGHT: return Rml::Input::KI_RIGHT; + case SDLK_DOWN: return Rml::Input::KI_DOWN; + case SDLK_INSERT: return Rml::Input::KI_INSERT; + case SDLK_DELETE: return Rml::Input::KI_DELETE; + case SDLK_HELP: return Rml::Input::KI_HELP; + case SDLK_F1: return Rml::Input::KI_F1; + case SDLK_F2: return Rml::Input::KI_F2; + case SDLK_F3: return Rml::Input::KI_F3; + case SDLK_F4: return Rml::Input::KI_F4; + case SDLK_F5: return Rml::Input::KI_F5; + case SDLK_F6: return Rml::Input::KI_F6; + case SDLK_F7: return Rml::Input::KI_F7; + case SDLK_F8: return Rml::Input::KI_F8; + case SDLK_F9: return Rml::Input::KI_F9; + case SDLK_F10: return Rml::Input::KI_F10; + case SDLK_F11: return Rml::Input::KI_F11; + case SDLK_F12: return Rml::Input::KI_F12; + case SDLK_F13: return Rml::Input::KI_F13; + case SDLK_F14: return Rml::Input::KI_F14; + case SDLK_F15: return Rml::Input::KI_F15; + case SDLK_NUMLOCKCLEAR: return Rml::Input::KI_NUMLOCK; + case SDLK_SCROLLLOCK: return Rml::Input::KI_SCROLL; + case SDLK_LSHIFT: return Rml::Input::KI_LSHIFT; + case SDLK_RSHIFT: return Rml::Input::KI_RSHIFT; + case SDLK_LCTRL: return Rml::Input::KI_LCONTROL; + case SDLK_RCTRL: return Rml::Input::KI_RCONTROL; + case SDLK_LALT: return Rml::Input::KI_LMENU; + case SDLK_RALT: return Rml::Input::KI_RMENU; + case SDLK_LGUI: return Rml::Input::KI_LMETA; + case SDLK_RGUI: return Rml::Input::KI_RMETA; + /* + case SDLK_LSUPER: return Rml::Input::KI_LWIN; + case SDLK_RSUPER: return Rml::Input::KI_RWIN; + */ + default: break; + } + // clang-format on + + return Rml::Input::KI_UNKNOWN; +} + +int RmlRTS::ConvertMouseButton(int button) +{ + switch (button) + { + case SDL_BUTTON_LEFT: + return 0; + case SDL_BUTTON_RIGHT: + return 1; + case SDL_BUTTON_MIDDLE: + return 2; + default: + return 3; + } +} + +int RmlRTS::GetKeyModifierState() +{ + SDL_Keymod sdl_mods = SDL_GetModState(); + + int retval = 0; + + if (sdl_mods & KMOD_CTRL) + retval |= Rml::Input::KM_CTRL; + + if (sdl_mods & KMOD_SHIFT) + retval |= Rml::Input::KM_SHIFT; + + if (sdl_mods & KMOD_ALT) + retval |= Rml::Input::KM_ALT; + + if (sdl_mods & KMOD_NUM) + retval |= Rml::Input::KM_NUMLOCK; + + if (sdl_mods & KMOD_CAPS) + retval |= Rml::Input::KM_CAPSLOCK; + + return retval; +} diff --git a/rts/Rml/Backends/RmlUi_Platform_SDL.h b/rts/Rml/Backends/RmlUi_Platform_RTS.h similarity index 84% rename from rts/Rml/Backends/RmlUi_Platform_SDL.h rename to rts/Rml/Backends/RmlUi_Platform_RTS.h index 4988dab86d..d285995557 100644 --- a/rts/Rml/Backends/RmlUi_Platform_SDL.h +++ b/rts/Rml/Backends/RmlUi_Platform_RTS.h @@ -26,8 +26,8 @@ * */ -#ifndef RMLUI_BACKENDS_PLATFORM_SDL_H -#define RMLUI_BACKENDS_PLATFORM_SDL_H +#ifndef RMLUI_BACKENDS_PLATFORM_RTS_H +#define RMLUI_BACKENDS_PLATFORM_RTS_H #include #include @@ -36,19 +36,15 @@ #include "Game/UI/MouseHandler.h" #include -class SystemInterface_SDL : public Rml::SystemInterface +class SystemInterface_RTS : public Rml::SystemInterface { public: - SystemInterface_SDL(); - ~SystemInterface_SDL(); - - // Optionally, provide or change the window to be used for setting the mouse cursors. - void SetWindow(SDL_Window *window); - - int TranslateString(Rml::String &translated, const Rml::String &input) override; - virtual bool LogMessage(Rml::Log::Type type, const Rml::String& message) override; + SystemInterface_RTS(); + ~SystemInterface_RTS(); // -- Inherited from Rml::SystemInterface -- + int TranslateString(Rml::String &translated, const Rml::String &input) override; + bool LogMessage(Rml::Log::Type type, const Rml::String& message) override; double GetElapsedTime() override; @@ -57,15 +53,16 @@ class SystemInterface_SDL : public Rml::SystemInterface void SetClipboardText(const Rml::String &text) override; void GetClipboardText(Rml::String &text) override; - void SetTranslationTable(TranslationTable *tt) { translationTable = tt; }; + // Hooks for RTS engine + const Rml::String& GetMouseCursor(); + void SetTranslationTable(TranslationTable *tt);; private: - SDL_Window *window = nullptr; - TranslationTable *translationTable = nullptr; + Rml::String mouseCursor; }; -namespace RmlSDL +namespace RmlRTS { // Applies input on the context based on the given SDL event. @@ -88,6 +85,6 @@ namespace RmlSDL // Returns the active RmlUi key modifier state. int GetKeyModifierState(); -} // namespace RmlSDL +} // namespace RmlRTS #endif diff --git a/rts/Rml/Backends/RmlUi_Platform_SDL.cpp b/rts/Rml/Backends/RmlUi_Platform_SDL.cpp deleted file mode 100644 index e79b8a928a..0000000000 --- a/rts/Rml/Backends/RmlUi_Platform_SDL.cpp +++ /dev/null @@ -1,372 +0,0 @@ -/* - * This source file is part of RmlUi, the HTML/CSS Interface Middleware - * - * For the latest information, see http://github.com/mikke89/RmlUi - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * Copyright (c) 2019-2023 The RmlUi Team, and contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "RmlUi_Platform_SDL.h" -#include -#include -#include -#include -#include -#include -#include - -SystemInterface_SDL::SystemInterface_SDL() -{ -} - -SystemInterface_SDL::~SystemInterface_SDL() -{ -} - -void SystemInterface_SDL::SetWindow(SDL_Window *in_window) -{ - window = in_window; -} - -double SystemInterface_SDL::GetElapsedTime() -{ - return spring_gettime().toSecsf(); -} - -int SystemInterface_SDL::TranslateString(Rml::String &translated, const Rml::String &input) -{ - if (!translationTable || !translationTable->exists(input)) - { - translated = input; - return 0; - } - std::string translation = translationTable->getTranslationString(input); - translated = translation; - return 1; -} - -bool SystemInterface_SDL::LogMessage(Rml::Log::Type type, const Rml::String &message) -{ - const char *fmtStr = "[Lua:Rml] %s"; - const char *logStr = message.c_str(); - switch (type) - { - - case Rml::Log::LT_ASSERT: - case Rml::Log::LT_DEBUG: - { - LOG_L(L_DEBUG, fmtStr, logStr); - } - break; - case Rml::Log::LT_ERROR: - { - LOG_L(L_ERROR, fmtStr, logStr); - } - break; - case Rml::Log::LT_WARNING: - { - LOG_L(L_WARNING, fmtStr, logStr); - } - break; - - case Rml::Log::LT_INFO: - default: - { - LOG_L(L_INFO, fmtStr, logStr); - } - break; - } - return true; -} - -void SystemInterface_SDL::SetMouseCursor(const Rml::String &cursor_name) -{ - if (cursor_name.empty() || cursor_name == "arrow") - mouse->ChangeCursor("cursornormal"); - else - mouse->ChangeCursor(cursor_name); -} - -void SystemInterface_SDL::SetClipboardText(const Rml::String &text_utf8) -{ - SDL_SetClipboardText(text_utf8.c_str()); -} - -void SystemInterface_SDL::GetClipboardText(Rml::String &text) -{ - char *raw_text = SDL_GetClipboardText(); - text = Rml::String(raw_text); - SDL_free(raw_text); -} - -bool RmlSDL::EventKeyDown(Rml::Context *context, Rml::Input::KeyIdentifier key) -{ - bool result = context->ProcessKeyDown(key, GetKeyModifierState()); - if (key == Rml::Input::KI_RETURN || key == Rml::Input::KI_NUMPADENTER) - result &= context->ProcessTextInput('\n'); - return result; -} - -bool RmlSDL::EventKeyUp(Rml::Context *context, Rml::Input::KeyIdentifier key) -{ - return context->ProcessKeyUp(key, GetKeyModifierState()); -} - -bool RmlSDL::EventTextInput(Rml::Context *context, const std::string &text) -{ - return context->ProcessTextInput(Rml::String(text)); -} - -bool RmlSDL::EventMouseMove(Rml::Context *context, Sint32 x, Sint32 y) { - return context->ProcessMouseMove(x,y, GetKeyModifierState()); -} - -bool RmlSDL::EventMousePress(Rml::Context *context, Sint32 x, Sint32 y, Sint32 button) { - return context->ProcessMouseButtonDown(ConvertMouseButton(button), GetKeyModifierState()); -}; - -bool RmlSDL::EventMouseRelease(Rml::Context *context, Sint32 x, Sint32 y, Sint32 button) { - return context->ProcessMouseButtonUp(ConvertMouseButton(button), GetKeyModifierState()); -}; - -bool RmlSDL::EventMouseWheel(Rml::Context *context, float delta) { - return context->ProcessMouseWheel(-delta, GetKeyModifierState()); -}; - -bool RmlSDL::InputEventHandler(Rml::Context *context, const SDL_Event &ev) -{ - bool result = true; - - switch (ev.type) - { - case SDL_MOUSEMOTION: - result = context->ProcessMouseMove(ev.motion.x, ev.motion.y, GetKeyModifierState()); - break; - case SDL_MOUSEBUTTONDOWN: - result = context->ProcessMouseButtonDown(ConvertMouseButton(ev.button.button), GetKeyModifierState()); - SDL_CaptureMouse(SDL_TRUE); - break; - case SDL_MOUSEBUTTONUP: - SDL_CaptureMouse(SDL_FALSE); - result = context->ProcessMouseButtonUp(ConvertMouseButton(ev.button.button), GetKeyModifierState()); - break; - case SDL_MOUSEWHEEL: - result = context->ProcessMouseWheel(float(-ev.wheel.y), GetKeyModifierState()); - break; - case SDL_KEYDOWN: - result = context->ProcessKeyDown(ConvertKey(ev.key.keysym.sym), GetKeyModifierState()); - if (ev.key.keysym.sym == SDLK_RETURN || ev.key.keysym.sym == SDLK_KP_ENTER) - result &= context->ProcessTextInput('\n'); - break; - case SDL_KEYUP: - result = context->ProcessKeyUp(ConvertKey(ev.key.keysym.sym), GetKeyModifierState()); - break; - case SDL_TEXTINPUT: - result = context->ProcessTextInput(Rml::String(&ev.text.text[0])); - break; - case SDL_WINDOWEVENT: - { - switch (ev.window.event) - { - case SDL_WINDOWEVENT_SIZE_CHANGED: - { - Rml::Vector2i dimensions(ev.window.data1, ev.window.data2); - context->SetDimensions(dimensions); - } - break; - case SDL_WINDOWEVENT_LEAVE: - context->ProcessMouseLeave(); - break; - } - } - break; - default: - break; - } - - return result; -} - -Rml::Input::KeyIdentifier RmlSDL::ConvertKey(int sdlkey) -{ - // clang-format off - switch (sdlkey) - { - case SDLK_UNKNOWN: return Rml::Input::KI_UNKNOWN; - case SDLK_ESCAPE: return Rml::Input::KI_ESCAPE; - case SDLK_SPACE: return Rml::Input::KI_SPACE; - case SDLK_0: return Rml::Input::KI_0; - case SDLK_1: return Rml::Input::KI_1; - case SDLK_2: return Rml::Input::KI_2; - case SDLK_3: return Rml::Input::KI_3; - case SDLK_4: return Rml::Input::KI_4; - case SDLK_5: return Rml::Input::KI_5; - case SDLK_6: return Rml::Input::KI_6; - case SDLK_7: return Rml::Input::KI_7; - case SDLK_8: return Rml::Input::KI_8; - case SDLK_9: return Rml::Input::KI_9; - case SDLK_a: return Rml::Input::KI_A; - case SDLK_b: return Rml::Input::KI_B; - case SDLK_c: return Rml::Input::KI_C; - case SDLK_d: return Rml::Input::KI_D; - case SDLK_e: return Rml::Input::KI_E; - case SDLK_f: return Rml::Input::KI_F; - case SDLK_g: return Rml::Input::KI_G; - case SDLK_h: return Rml::Input::KI_H; - case SDLK_i: return Rml::Input::KI_I; - case SDLK_j: return Rml::Input::KI_J; - case SDLK_k: return Rml::Input::KI_K; - case SDLK_l: return Rml::Input::KI_L; - case SDLK_m: return Rml::Input::KI_M; - case SDLK_n: return Rml::Input::KI_N; - case SDLK_o: return Rml::Input::KI_O; - case SDLK_p: return Rml::Input::KI_P; - case SDLK_q: return Rml::Input::KI_Q; - case SDLK_r: return Rml::Input::KI_R; - case SDLK_s: return Rml::Input::KI_S; - case SDLK_t: return Rml::Input::KI_T; - case SDLK_u: return Rml::Input::KI_U; - case SDLK_v: return Rml::Input::KI_V; - case SDLK_w: return Rml::Input::KI_W; - case SDLK_x: return Rml::Input::KI_X; - case SDLK_y: return Rml::Input::KI_Y; - case SDLK_z: return Rml::Input::KI_Z; - case SDLK_SEMICOLON: return Rml::Input::KI_OEM_1; - case SDLK_PLUS: return Rml::Input::KI_OEM_PLUS; - case SDLK_COMMA: return Rml::Input::KI_OEM_COMMA; - case SDLK_MINUS: return Rml::Input::KI_OEM_MINUS; - case SDLK_PERIOD: return Rml::Input::KI_OEM_PERIOD; - case SDLK_SLASH: return Rml::Input::KI_OEM_2; - case SDLK_BACKQUOTE: return Rml::Input::KI_OEM_3; - case SDLK_LEFTBRACKET: return Rml::Input::KI_OEM_4; - case SDLK_BACKSLASH: return Rml::Input::KI_OEM_5; - case SDLK_RIGHTBRACKET: return Rml::Input::KI_OEM_6; - case SDLK_QUOTEDBL: return Rml::Input::KI_OEM_7; - case SDLK_KP_0: return Rml::Input::KI_NUMPAD0; - case SDLK_KP_1: return Rml::Input::KI_NUMPAD1; - case SDLK_KP_2: return Rml::Input::KI_NUMPAD2; - case SDLK_KP_3: return Rml::Input::KI_NUMPAD3; - case SDLK_KP_4: return Rml::Input::KI_NUMPAD4; - case SDLK_KP_5: return Rml::Input::KI_NUMPAD5; - case SDLK_KP_6: return Rml::Input::KI_NUMPAD6; - case SDLK_KP_7: return Rml::Input::KI_NUMPAD7; - case SDLK_KP_8: return Rml::Input::KI_NUMPAD8; - case SDLK_KP_9: return Rml::Input::KI_NUMPAD9; - case SDLK_KP_ENTER: return Rml::Input::KI_NUMPADENTER; - case SDLK_KP_MULTIPLY: return Rml::Input::KI_MULTIPLY; - case SDLK_KP_PLUS: return Rml::Input::KI_ADD; - case SDLK_KP_MINUS: return Rml::Input::KI_SUBTRACT; - case SDLK_KP_PERIOD: return Rml::Input::KI_DECIMAL; - case SDLK_KP_DIVIDE: return Rml::Input::KI_DIVIDE; - case SDLK_KP_EQUALS: return Rml::Input::KI_OEM_NEC_EQUAL; - case SDLK_BACKSPACE: return Rml::Input::KI_BACK; - case SDLK_TAB: return Rml::Input::KI_TAB; - case SDLK_CLEAR: return Rml::Input::KI_CLEAR; - case SDLK_RETURN: return Rml::Input::KI_RETURN; - case SDLK_PAUSE: return Rml::Input::KI_PAUSE; - case SDLK_CAPSLOCK: return Rml::Input::KI_CAPITAL; - case SDLK_PAGEUP: return Rml::Input::KI_PRIOR; - case SDLK_PAGEDOWN: return Rml::Input::KI_NEXT; - case SDLK_END: return Rml::Input::KI_END; - case SDLK_HOME: return Rml::Input::KI_HOME; - case SDLK_LEFT: return Rml::Input::KI_LEFT; - case SDLK_UP: return Rml::Input::KI_UP; - case SDLK_RIGHT: return Rml::Input::KI_RIGHT; - case SDLK_DOWN: return Rml::Input::KI_DOWN; - case SDLK_INSERT: return Rml::Input::KI_INSERT; - case SDLK_DELETE: return Rml::Input::KI_DELETE; - case SDLK_HELP: return Rml::Input::KI_HELP; - case SDLK_F1: return Rml::Input::KI_F1; - case SDLK_F2: return Rml::Input::KI_F2; - case SDLK_F3: return Rml::Input::KI_F3; - case SDLK_F4: return Rml::Input::KI_F4; - case SDLK_F5: return Rml::Input::KI_F5; - case SDLK_F6: return Rml::Input::KI_F6; - case SDLK_F7: return Rml::Input::KI_F7; - case SDLK_F8: return Rml::Input::KI_F8; - case SDLK_F9: return Rml::Input::KI_F9; - case SDLK_F10: return Rml::Input::KI_F10; - case SDLK_F11: return Rml::Input::KI_F11; - case SDLK_F12: return Rml::Input::KI_F12; - case SDLK_F13: return Rml::Input::KI_F13; - case SDLK_F14: return Rml::Input::KI_F14; - case SDLK_F15: return Rml::Input::KI_F15; - case SDLK_NUMLOCKCLEAR: return Rml::Input::KI_NUMLOCK; - case SDLK_SCROLLLOCK: return Rml::Input::KI_SCROLL; - case SDLK_LSHIFT: return Rml::Input::KI_LSHIFT; - case SDLK_RSHIFT: return Rml::Input::KI_RSHIFT; - case SDLK_LCTRL: return Rml::Input::KI_LCONTROL; - case SDLK_RCTRL: return Rml::Input::KI_RCONTROL; - case SDLK_LALT: return Rml::Input::KI_LMENU; - case SDLK_RALT: return Rml::Input::KI_RMENU; - case SDLK_LGUI: return Rml::Input::KI_LMETA; - case SDLK_RGUI: return Rml::Input::KI_RMETA; - /* - case SDLK_LSUPER: return Rml::Input::KI_LWIN; - case SDLK_RSUPER: return Rml::Input::KI_RWIN; - */ - default: break; - } - // clang-format on - - return Rml::Input::KI_UNKNOWN; -} - -int RmlSDL::ConvertMouseButton(int button) -{ - switch (button) - { - case SDL_BUTTON_LEFT: - return 0; - case SDL_BUTTON_RIGHT: - return 1; - case SDL_BUTTON_MIDDLE: - return 2; - default: - return 3; - } -} - -int RmlSDL::GetKeyModifierState() -{ - SDL_Keymod sdl_mods = SDL_GetModState(); - - int retval = 0; - - if (sdl_mods & KMOD_CTRL) - retval |= Rml::Input::KM_CTRL; - - if (sdl_mods & KMOD_SHIFT) - retval |= Rml::Input::KM_SHIFT; - - if (sdl_mods & KMOD_ALT) - retval |= Rml::Input::KM_ALT; - - if (sdl_mods & KMOD_NUM) - retval |= Rml::Input::KM_NUMLOCK; - - if (sdl_mods & KMOD_CAPS) - retval |= Rml::Input::KM_CAPSLOCK; - - return retval; -} diff --git a/rts/Rml/Backends/RmlUi_Renderer_Headless.h b/rts/Rml/Backends/RmlUi_Renderer_Headless.h index ca13da1ba3..494ed51240 100644 --- a/rts/Rml/Backends/RmlUi_Renderer_Headless.h +++ b/rts/Rml/Backends/RmlUi_Renderer_Headless.h @@ -1,3 +1,6 @@ +#ifndef RMLUI_RENDERER_HEADLESS_H +#define RMLUI_RENDERER_HEADLESS_H + #include #include @@ -31,3 +34,5 @@ class RenderInterface_Headless : public Rml::RenderInterface void EndFrame(){}; void SetViewport(int x, int y){}; }; + +#endif // RMLUI_RENDERER_HEADLESS_H diff --git a/rts/Rml/CMakeLists.txt b/rts/Rml/CMakeLists.txt index 86fbb4a5de..c1c4e69d14 100644 --- a/rts/Rml/CMakeLists.txt +++ b/rts/Rml/CMakeLists.txt @@ -1,6 +1,6 @@ set(sources_engine_Rml "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_Backend.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_Platform_SDL.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_Platform_RTS.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_Renderer_GL3.cpp" PARENT_SCOPE ) diff --git a/rts/Rml/RmlInputReceiver.h b/rts/Rml/RmlInputReceiver.h index 207fee4c0c..a25ebd2a5c 100644 --- a/rts/Rml/RmlInputReceiver.h +++ b/rts/Rml/RmlInputReceiver.h @@ -15,16 +15,16 @@ class CRmlInputReceiver : public CInputReceiver /** IsAbove is used for determining which part of the game is interacting with the mouse.

- Unlike the other implementations of this function, tracking of this state is handled enirely by the RmlUI ProcessMouse functions. + Unlike the other implementations of this function, tracking of this + state is handled enirely by the RmlUI ProcessMouse functions.

- This means that the x and y parameters are completely ignored + This results in the x and y parameters here being completely ignored @param x ignored, the "IsAbove" state is handled elsewhere @param y ignored, this "IsAbove" state is handled elsewhere @return If the mouse is interacting with any RmlUI elements */ bool IsAbove(int x = 0, int y = 0) { return rml_active; }; - bool HandlesCursorIcon() override { return true; }; void setActive(bool active) { rml_active = active; }; bool KeyPressed(int keyCode, int scanCode, bool isRepeat) { return RmlGui::ProcessKeyPressed(keyCode, scanCode, isRepeat); }; diff --git a/rts/lib/RmlSolLua/src/bind/Global.cpp b/rts/lib/RmlSolLua/src/bind/Global.cpp index 7590dcf05f..12a75028e9 100644 --- a/rts/lib/RmlSolLua/src/bind/Global.cpp +++ b/rts/lib/RmlSolLua/src/bind/Global.cpp @@ -10,8 +10,9 @@ namespace Rml::SolLua auto createContext(const Rml::String& name) { // Janky, but less jank than before at least - // context will be resized right away, use 1080p dimensions - return Rml::CreateContext(name, Rml::Vector2i(1920, 1080)); + // context will be resized right away + // send {0, 0} in for now to avoid triggering a resize event + return Rml::CreateContext(name, {0, 0}); } auto getContext() From 41bbfe54664e3909ca19c060a663a50dd567ad6f Mon Sep 17 00:00:00 2001 From: ChrisClark13 Date: Wed, 17 Jan 2024 21:42:29 -0700 Subject: [PATCH 39/58] Platform_RTS ended up being disliked, so re-renamed stuff to "RmlSystemInterface" and the namespace to "RmlSDLSpring" --- rts/Rml/Backends/RmlUi_Backend.cpp | 28 ++++++----- rts/Rml/Backends/RmlUi_Backend.h | 4 +- rts/Rml/Backends/RmlUi_Renderer_GL3.cpp | 4 +- rts/Rml/Backends/RmlUi_Renderer_GL3.h | 4 +- ...form_RTS.cpp => RmlUi_SystemInterface.cpp} | 48 ++++++++++--------- ...Platform_RTS.h => RmlUi_SystemInterface.h} | 34 ++++++++----- rts/Rml/CMakeLists.txt | 2 +- 7 files changed, 72 insertions(+), 52 deletions(-) rename rts/Rml/Backends/{RmlUi_Platform_RTS.cpp => RmlUi_SystemInterface.cpp} (87%) rename rts/Rml/Backends/{RmlUi_Platform_RTS.h => RmlUi_SystemInterface.h} (79%) diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index 41a68b71b1..cb3d3dabae 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -1,5 +1,7 @@ +/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ + /* - * This source file is part of RmlUi, the HTML/CSS Interface Middleware + * This source file is dervied from the source code of RmlUi, the HTML/CSS Interface Middleware * * For the latest information, see http://github.com/mikke89/RmlUi * @@ -35,7 +37,7 @@ #include #include "RmlUi_Backend.h" -#include "RmlUi_Platform_RTS.h" +#include "RmlUi_SystemInterface.h" #include "RmlUi_Renderer_GL3.h" #include "Lua/LuaUI.h" #include "Rendering/Textures/Bitmap.h" @@ -187,7 +189,7 @@ class PassThroughPlugin : public Rml::Plugin */ struct BackendData { - SystemInterface_RTS system_interface; + RmlSystemInterface system_interface; #ifndef HEADLESS RenderInterface_GL3_SDL render_interface; #else @@ -416,7 +418,7 @@ bool RmlGui::ProcessMouseMove(int x, int y, int dx, int dy, int button) bool result = false; for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { - result |= !RmlRTS::EventMouseMove(context, x, y); + result |= !RmlSDLSpring::EventMouseMove(context, x, y); } data->inputReceiver.setActive(result); return result; @@ -434,7 +436,7 @@ bool RmlGui::ProcessMousePress(int x, int y, int button) bool result = false; for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { - bool handled = !RmlRTS::EventMousePress(context, x, y, button); + bool handled = !RmlSDLSpring::EventMousePress(context, x, y, button); result |= handled; if (!handled) { @@ -461,7 +463,7 @@ bool RmlGui::ProcessMouseRelease(int x, int y, int button) bool result = false; for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { - result |= !RmlRTS::EventMouseRelease(context, x, y, button); + result |= !RmlSDLSpring::EventMouseRelease(context, x, y, button); } data->inputReceiver.setActive(result); return result; @@ -479,7 +481,7 @@ bool RmlGui::ProcessMouseWheel(float delta) bool result = false; for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { - result |= !RmlRTS::EventMouseWheel(context, delta); + result |= !RmlSDLSpring::EventMouseWheel(context, delta); } data->inputReceiver.setActive(result); return result; @@ -497,8 +499,8 @@ bool RmlGui::ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat) bool result = false; for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { - auto kc = RmlRTS::ConvertKey(keyCode); - result |= !RmlRTS::EventKeyDown(context, kc); + auto kc = RmlSDLSpring::ConvertKey(keyCode); + result |= !RmlSDLSpring::EventKeyDown(context, kc); } return result; } @@ -512,7 +514,7 @@ bool RmlGui::ProcessKeyReleased(int keyCode, int scanCode) bool result = false; for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { - result |= !RmlRTS::EventKeyUp(context, RmlRTS::ConvertKey(keyCode)); + result |= !RmlSDLSpring::EventKeyUp(context, RmlSDLSpring::ConvertKey(keyCode)); } return result; } @@ -526,7 +528,7 @@ bool RmlGui::ProcessTextInput(const std::string& text) bool result = false; for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { - result |= !RmlRTS::EventTextInput(context, text); + result |= !RmlSDLSpring::EventTextInput(context, text); } return result; } @@ -548,7 +550,7 @@ bool processContextEvent(Rml::Context* context, const SDL_Event& event) } break; } - RmlRTS::InputEventHandler(context, event); + RmlSDLSpring::InputEventHandler(context, event); } break; case SDL_MOUSEMOTION: @@ -561,7 +563,7 @@ bool processContextEvent(Rml::Context* context, const SDL_Event& event) break; // handled elsewhere default: { - RmlRTS::InputEventHandler(context, event); + RmlSDLSpring::InputEventHandler(context, event); } break; } diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index b109895332..30226590ae 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -1,5 +1,7 @@ +/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ + /* - * This source file is part of RmlUi, the HTML/CSS Interface Middleware + * This source file is dervied from the source code of RmlUi, the HTML/CSS Interface Middleware * * For the latest information, see http://github.com/mikke89/RmlUi * diff --git a/rts/Rml/Backends/RmlUi_Renderer_GL3.cpp b/rts/Rml/Backends/RmlUi_Renderer_GL3.cpp index 633c25042c..c236fe0a73 100644 --- a/rts/Rml/Backends/RmlUi_Renderer_GL3.cpp +++ b/rts/Rml/Backends/RmlUi_Renderer_GL3.cpp @@ -1,5 +1,7 @@ +/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ + /* - * This source file is part of RmlUi, the HTML/CSS Interface Middleware + * This source file is dervied from the source code of RmlUi, the HTML/CSS Interface Middleware * * For the latest information, see http://github.com/mikke89/RmlUi * diff --git a/rts/Rml/Backends/RmlUi_Renderer_GL3.h b/rts/Rml/Backends/RmlUi_Renderer_GL3.h index 537b61519a..2a59a8cdc2 100644 --- a/rts/Rml/Backends/RmlUi_Renderer_GL3.h +++ b/rts/Rml/Backends/RmlUi_Renderer_GL3.h @@ -1,5 +1,7 @@ +/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ + /* - * This source file is part of RmlUi, the HTML/CSS Interface Middleware + * This source file is dervied from the source code of RmlUi, the HTML/CSS Interface Middleware * * For the latest information, see http://github.com/mikke89/RmlUi * diff --git a/rts/Rml/Backends/RmlUi_Platform_RTS.cpp b/rts/Rml/Backends/RmlUi_SystemInterface.cpp similarity index 87% rename from rts/Rml/Backends/RmlUi_Platform_RTS.cpp rename to rts/Rml/Backends/RmlUi_SystemInterface.cpp index 5d0cd326ac..bc9b929d12 100644 --- a/rts/Rml/Backends/RmlUi_Platform_RTS.cpp +++ b/rts/Rml/Backends/RmlUi_SystemInterface.cpp @@ -1,5 +1,7 @@ +/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ + /* - * This source file is part of RmlUi, the HTML/CSS Interface Middleware + * This source file is dervied from the source code of RmlUi, the HTML/CSS Interface Middleware * * For the latest information, see http://github.com/mikke89/RmlUi * @@ -26,7 +28,7 @@ * */ -#include "RmlUi_Platform_RTS.h" +#include "RmlUi_SystemInterface.h" #include #include #include @@ -34,16 +36,16 @@ #include #include -SystemInterface_RTS::SystemInterface_RTS() {} +RmlSystemInterface::RmlSystemInterface() {} -SystemInterface_RTS::~SystemInterface_RTS() {} +RmlSystemInterface::~RmlSystemInterface() {} -double SystemInterface_RTS::GetElapsedTime() +double RmlSystemInterface::GetElapsedTime() { return spring_gettime().toSecsf(); } -int SystemInterface_RTS::TranslateString(Rml::String& translated, const Rml::String& input) +int RmlSystemInterface::TranslateString(Rml::String& translated, const Rml::String& input) { if (!translationTable || !translationTable->exists(input)) { @@ -55,7 +57,7 @@ int SystemInterface_RTS::TranslateString(Rml::String& translated, const Rml::Str return 1; } -bool SystemInterface_RTS::LogMessage(Rml::Log::Type type, const Rml::String& message) +bool RmlSystemInterface::LogMessage(Rml::Log::Type type, const Rml::String& message) { const char* fmtStr = "[Lua:Rml] %s"; const char* logStr = message.c_str(); @@ -88,34 +90,34 @@ bool SystemInterface_RTS::LogMessage(Rml::Log::Type type, const Rml::String& mes return true; } -void SystemInterface_RTS::SetMouseCursor(const Rml::String& cursor_name) +void RmlSystemInterface::SetMouseCursor(const Rml::String& cursor_name) { mouseCursor = cursor_name; } -const Rml::String& SystemInterface_RTS::GetMouseCursor() +const Rml::String& RmlSystemInterface::GetMouseCursor() { return mouseCursor; } -void SystemInterface_RTS::SetClipboardText(const Rml::String& text_utf8) +void RmlSystemInterface::SetClipboardText(const Rml::String& text_utf8) { SDL_SetClipboardText(text_utf8.c_str()); } -void SystemInterface_RTS::GetClipboardText(Rml::String& text) +void RmlSystemInterface::GetClipboardText(Rml::String& text) { char* raw_text = SDL_GetClipboardText(); text = Rml::String(raw_text); SDL_free(raw_text); } -void SystemInterface_RTS::SetTranslationTable(TranslationTable* tt) +void RmlSystemInterface::SetTranslationTable(TranslationTable* tt) { translationTable = tt; } -bool RmlRTS::EventKeyDown(Rml::Context* context, Rml::Input::KeyIdentifier key) +bool RmlSDLSpring::EventKeyDown(Rml::Context* context, Rml::Input::KeyIdentifier key) { bool result = context->ProcessKeyDown(key, GetKeyModifierState()); if (key == Rml::Input::KI_RETURN || key == Rml::Input::KI_NUMPADENTER) @@ -123,37 +125,37 @@ bool RmlRTS::EventKeyDown(Rml::Context* context, Rml::Input::KeyIdentifier key) return result; } -bool RmlRTS::EventKeyUp(Rml::Context* context, Rml::Input::KeyIdentifier key) +bool RmlSDLSpring::EventKeyUp(Rml::Context* context, Rml::Input::KeyIdentifier key) { return context->ProcessKeyUp(key, GetKeyModifierState()); } -bool RmlRTS::EventTextInput(Rml::Context* context, const std::string& text) +bool RmlSDLSpring::EventTextInput(Rml::Context* context, const std::string& text) { return context->ProcessTextInput(Rml::String(text)); } -bool RmlRTS::EventMouseMove(Rml::Context* context, Sint32 x, Sint32 y) +bool RmlSDLSpring::EventMouseMove(Rml::Context* context, Sint32 x, Sint32 y) { return context->ProcessMouseMove(x, y, GetKeyModifierState()); } -bool RmlRTS::EventMousePress(Rml::Context* context, Sint32 x, Sint32 y, Sint32 button) +bool RmlSDLSpring::EventMousePress(Rml::Context* context, Sint32 x, Sint32 y, Sint32 button) { return context->ProcessMouseButtonDown(ConvertMouseButton(button), GetKeyModifierState()); }; -bool RmlRTS::EventMouseRelease(Rml::Context* context, Sint32 x, Sint32 y, Sint32 button) +bool RmlSDLSpring::EventMouseRelease(Rml::Context* context, Sint32 x, Sint32 y, Sint32 button) { return context->ProcessMouseButtonUp(ConvertMouseButton(button), GetKeyModifierState()); }; -bool RmlRTS::EventMouseWheel(Rml::Context* context, float delta) +bool RmlSDLSpring::EventMouseWheel(Rml::Context* context, float delta) { return context->ProcessMouseWheel(-delta, GetKeyModifierState()); }; -bool RmlRTS::InputEventHandler(Rml::Context* context, const SDL_Event& ev) +bool RmlSDLSpring::InputEventHandler(Rml::Context* context, const SDL_Event& ev) { bool result = true; @@ -207,7 +209,7 @@ bool RmlRTS::InputEventHandler(Rml::Context* context, const SDL_Event& ev) return result; } -Rml::Input::KeyIdentifier RmlRTS::ConvertKey(int sdlkey) +Rml::Input::KeyIdentifier RmlSDLSpring::ConvertKey(int sdlkey) { // clang-format off switch (sdlkey) @@ -332,7 +334,7 @@ Rml::Input::KeyIdentifier RmlRTS::ConvertKey(int sdlkey) return Rml::Input::KI_UNKNOWN; } -int RmlRTS::ConvertMouseButton(int button) +int RmlSDLSpring::ConvertMouseButton(int button) { switch (button) { @@ -347,7 +349,7 @@ int RmlRTS::ConvertMouseButton(int button) } } -int RmlRTS::GetKeyModifierState() +int RmlSDLSpring::GetKeyModifierState() { SDL_Keymod sdl_mods = SDL_GetModState(); diff --git a/rts/Rml/Backends/RmlUi_Platform_RTS.h b/rts/Rml/Backends/RmlUi_SystemInterface.h similarity index 79% rename from rts/Rml/Backends/RmlUi_Platform_RTS.h rename to rts/Rml/Backends/RmlUi_SystemInterface.h index d285995557..21d1afa7fb 100644 --- a/rts/Rml/Backends/RmlUi_Platform_RTS.h +++ b/rts/Rml/Backends/RmlUi_SystemInterface.h @@ -1,5 +1,7 @@ +/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ + /* - * This source file is part of RmlUi, the HTML/CSS Interface Middleware + * This source file is dervied from the source code of RmlUi, the HTML/CSS Interface Middleware * * For the latest information, see http://github.com/mikke89/RmlUi * @@ -26,24 +28,32 @@ * */ -#ifndef RMLUI_BACKENDS_PLATFORM_RTS_H -#define RMLUI_BACKENDS_PLATFORM_RTS_H +#ifndef RMLUI_SYSTEMINTERFACE_H +#define RMLUI_SYSTEMINTERFACE_H + #include + #include #include #include #include "Game/UI/MouseHandler.h" #include -class SystemInterface_RTS : public Rml::SystemInterface +class RmlSystemInterface : public Rml::SystemInterface { public: - SystemInterface_RTS(); - ~SystemInterface_RTS(); + RmlSystemInterface(); + ~RmlSystemInterface(); // -- Inherited from Rml::SystemInterface -- - int TranslateString(Rml::String &translated, const Rml::String &input) override; + /** + * @brief Call back for any raw text (CDATA in the XML spec) inside the *.rml files. + * @param translatedOut + * @param input + * @return + */ + int TranslateString(Rml::String &translatedOut, const Rml::String &input) override; bool LogMessage(Rml::Log::Type type, const Rml::String& message) override; double GetElapsedTime() override; @@ -53,7 +63,7 @@ class SystemInterface_RTS : public Rml::SystemInterface void SetClipboardText(const Rml::String &text) override; void GetClipboardText(Rml::String &text) override; - // Hooks for RTS engine + // Hooks for Spring engine const Rml::String& GetMouseCursor(); void SetTranslationTable(TranslationTable *tt);; @@ -62,7 +72,8 @@ class SystemInterface_RTS : public Rml::SystemInterface Rml::String mouseCursor; }; -namespace RmlRTS +// not named "Rml" or "RmlSDL" to avoid name collision with the original Rml lib files +namespace RmlSDLSpring { // Applies input on the context based on the given SDL event. @@ -85,6 +96,5 @@ namespace RmlRTS // Returns the active RmlUi key modifier state. int GetKeyModifierState(); -} // namespace RmlRTS - -#endif +} // namespace RmlSDLSpring +#endif // RMLUI_SYSTEMINTERFACE_H diff --git a/rts/Rml/CMakeLists.txt b/rts/Rml/CMakeLists.txt index c1c4e69d14..14fdcc818d 100644 --- a/rts/Rml/CMakeLists.txt +++ b/rts/Rml/CMakeLists.txt @@ -1,6 +1,6 @@ set(sources_engine_Rml "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_Backend.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_Platform_RTS.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_SystemInterface.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_Renderer_GL3.cpp" PARENT_SCOPE ) From 8ddcb47ddcd94c5f830c22defe062d5e654d855b Mon Sep 17 00:00:00 2001 From: ChrisClark13 Date: Wed, 17 Jan 2024 21:54:42 -0700 Subject: [PATCH 40/58] undo refactoring of import lists in non-Rml files improve a comment --- rts/Game/UI/GuiHandler.cpp | 33 +++++++++------- rts/Lua/LuaUnsyncedCtrl.cpp | 55 ++++++++++++++------------- rts/lib/RmlSolLua/src/bind/Global.cpp | 5 +-- 3 files changed, 49 insertions(+), 44 deletions(-) diff --git a/rts/Game/UI/GuiHandler.cpp b/rts/Game/UI/GuiHandler.cpp index 65bef61739..2bf3f37521 100644 --- a/rts/Game/UI/GuiHandler.cpp +++ b/rts/Game/UI/GuiHandler.cpp @@ -2,8 +2,10 @@ #include "GuiHandler.h" +#include #include "CommandColors.h" #include "KeyBindings.h" +#include "KeyCodes.h" #include "MiniMap.h" #include "MouseHandler.h" #include "Game/Camera.h" @@ -12,46 +14,49 @@ #include "Game/GlobalUnsynced.h" #include "Game/SelectedUnitsHandler.h" #include "Game/TraceRay.h" +#include "Lua/LuaConfig.h" +#include "Lua/LuaTextures.h" #include "Lua/LuaGaia.h" #include "Lua/LuaRules.h" -#include "Lua/LuaTextures.h" #include "Lua/LuaUI.h" #include "Map/Ground.h" #include "Map/MapInfo.h" +#include "Map/MetalMap.h" #include "Map/ReadMap.h" -#include "Rendering/IconHandler.h" #include "Rendering/Fonts/glFont.h" +#include "Rendering/IconHandler.h" +#include "Rendering/Units/UnitDrawer.h" #include "Rendering/GL/glExtra.h" #include "Rendering/Map/InfoTexture/IInfoTextureHandler.h" +#include "Rendering/Textures/Bitmap.h" #include "Rendering/Textures/NamedTextures.h" -#include "Rendering/Units/UnitDrawer.h" -#include "Rml/Backends/RmlUi_Backend.h" #include "Sim/Features/Feature.h" #include "Sim/Misc/LosHandler.h" -#include "Sim/Units/Unit.h" +#include "Sim/Units/CommandAI/CommandAI.h" +#include "Sim/Units/CommandAI/BuilderCAI.h" #include "Sim/Units/UnitDefHandler.h" +#include "Sim/Units/Unit.h" #include "Sim/Units/UnitHandler.h" -#include "Sim/Units/CommandAI/BuilderCAI.h" -#include "Sim/Units/CommandAI/CommandAI.h" -#include "Sim/Weapons/Weapon.h" +#include "Sim/Units/UnitLoader.h" #include "Sim/Weapons/WeaponDefHandler.h" +#include "Sim/Weapons/Weapon.h" +#include "System/Config/ConfigHandler.h" #include "System/EventHandler.h" +#include "System/GlobalConfig.h" +#include "System/Log/ILog.h" #include "System/SpringMath.h" -#include "System/StringUtil.h" #include "System/UnorderedMap.hpp" #include "System/UnorderedSet.hpp" -#include "System/Config/ConfigHandler.h" -#include "System/FileSystem/FileHandler.h" -#include "System/FileSystem/SimpleParser.h" +#include "System/StringUtil.h" #include "System/Input/KeyInput.h" -#include "System/Log/ILog.h" #include "System/Sound/ISound.h" #include "System/Sound/ISoundChannels.h" +#include "System/FileSystem/FileHandler.h" +#include "System/FileSystem/SimpleParser.h" #include #include - CONFIG(bool, MiniMapMarker).defaultValue(true).headlessValue(false); CONFIG(bool, InvertQueueKey).defaultValue(false); diff --git a/rts/Lua/LuaUnsyncedCtrl.cpp b/rts/Lua/LuaUnsyncedCtrl.cpp index 2a6c32f90e..7d66aed8e2 100644 --- a/rts/Lua/LuaUnsyncedCtrl.cpp +++ b/rts/Lua/LuaUnsyncedCtrl.cpp @@ -3,9 +3,9 @@ #include "LuaUnsyncedCtrl.h" #include "LuaConfig.h" +#include "LuaInclude.h" #include "LuaHandle.h" #include "LuaHashString.h" -#include "LuaInclude.h" #include "LuaMenu.h" #include "LuaOpenGLUtils.h" #include "LuaParser.h" @@ -16,49 +16,51 @@ #include "ExternalAI/SkirmishAIHandler.h" #include "Game/Camera.h" #include "Game/CameraHandler.h" +#include "Game/Camera/CameraController.h" #include "Game/GameSetup.h" #include "Game/GlobalUnsynced.h" -#include "Game/InMapDraw.h" -#include "Game/InMapDrawModel.h" #include "Game/IVideoCapturing.h" #include "Game/SelectedUnitsHandler.h" -#include "Game/Camera/CameraController.h" #include "Game/Players/Player.h" #include "Game/Players/PlayerHandler.h" +#include "Game/InMapDraw.h" +#include "Game/InMapDrawModel.h" #include "Game/UI/CommandColors.h" #include "Game/UI/CursorIcons.h" #include "Game/UI/GuiHandler.h" #include "Game/UI/InfoConsole.h" -#include "Game/UI/KeyBindings.h" +#include "Game/UI/KeyCodes.h" #include "Game/UI/KeySet.h" +#include "Game/UI/KeyBindings.h" #include "Game/UI/MiniMap.h" #include "Game/UI/MouseHandler.h" #include "Game/UI/Groups/Group.h" #include "Game/UI/Groups/GroupHandler.h" +#include "Map/MapInfo.h" +#include "Map/ReadMap.h" #include "Map/BaseGroundDrawer.h" #include "Map/BaseGroundTextures.h" -#include "Map/ReadMap.h" #include "Map/SMF/SMFGroundDrawer.h" #include "Map/SMF/ROAM/RoamMeshDrawer.h" -#include "Net/GameServer.h" #include "Net/Protocol/NetProtocol.h" -#include "Rendering/CommandDrawer.h" -#include "Rendering/IconHandler.h" -#include "Rendering/Env/IGroundDecalDrawer.h" +#include "Net/GameServer.h" #include "Rendering/Env/ISky.h" -#include "Rendering/Env/MapRendering.h" #include "Rendering/Env/SunLighting.h" #include "Rendering/Env/WaterRendering.h" +#include "Rendering/Env/MapRendering.h" +#include "Rendering/Env/IGroundDecalDrawer.h" #include "Rendering/Env/Decals/DecalsDrawerGL4.h" #include "Rendering/Env/Particles/Classes/NanoProjectile.h" -#include "Rendering/Features/FeatureDrawer.h" #include "Rendering/GL/myGL.h" -#include "Rendering/Map/InfoTexture/IInfoTextureHandler.h" +#include "Rendering/CommandDrawer.h" +#include "Rendering/IconHandler.h" #include "Rendering/Models/3DModel.h" #include "Rendering/Models/IModelParser.h" +#include "Rendering/Features/FeatureDrawer.h" +#include "Rendering/Units/UnitDrawer.h" +#include "Rendering/Map/InfoTexture/IInfoTextureHandler.h" #include "Rendering/Textures/Bitmap.h" #include "Rendering/Textures/NamedTextures.h" -#include "Rendering/Units/UnitDrawer.h" #include "Sim/Features/FeatureDef.h" #include "Sim/Features/FeatureDefHandler.h" #include "Sim/Features/FeatureHandler.h" @@ -68,24 +70,25 @@ #include "Sim/Units/Unit.h" #include "Sim/Units/UnitDefHandler.h" #include "Sim/Units/UnitHandler.h" +#include "System/Config/ConfigHandler.h" #include "System/EventHandler.h" #include "System/GlobalConfig.h" -#include "System/LoadLock.h" +#include "System/Log/DefaultFilter.h" +#include "System/Log/ILog.h" +#include "System/Net/PackPacket.h" +#include "System/Platform/Misc.h" #include "System/SafeUtil.h" -#include "System/SpringHash.h" -#include "System/StringUtil.h" #include "System/UnorderedMap.hpp" -#include "System/Config/ConfigHandler.h" -#include "System/FileSystem/DataDirLocater.h" +#include "System/StringUtil.h" +#include "System/Sound/ISound.h" +#include "System/Sound/ISoundChannels.h" #include "System/FileSystem/FileHandler.h" +#include "System/FileSystem/DataDirLocater.h" #include "System/FileSystem/FileSystem.h" -#include "System/Log/ILog.h" -#include "System/Net/PackPacket.h" -#include "System/Platform/Misc.h" #include "System/Platform/Watchdog.h" #include "System/Platform/WindowManagerHelper.h" -#include "System/Sound/ISound.h" -#include "System/Sound/ISoundChannels.h" +#include "System/SpringHash.h" +#include "System/LoadLock.h" #if !defined(HEADLESS) && !defined(NO_SOUND) @@ -99,12 +102,10 @@ #include -#include #include +#include #include -#include "Rml/Backends/RmlUi_Backend.h" - // MinGW defines this for a WINAPI function #undef SendMessage #undef CreateDirectory diff --git a/rts/lib/RmlSolLua/src/bind/Global.cpp b/rts/lib/RmlSolLua/src/bind/Global.cpp index 12a75028e9..ad58f38091 100644 --- a/rts/lib/RmlSolLua/src/bind/Global.cpp +++ b/rts/lib/RmlSolLua/src/bind/Global.cpp @@ -9,9 +9,8 @@ namespace Rml::SolLua { auto createContext(const Rml::String& name) { - // Janky, but less jank than before at least - // context will be resized right away - // send {0, 0} in for now to avoid triggering a resize event + // context will be resized right away by other code + // send {0, 0} in to avoid triggering a pointless resize event in the Rml code return Rml::CreateContext(name, {0, 0}); } From f57fd0e39527621d908103bc72fd208c7bee4d55 Mon Sep 17 00:00:00 2001 From: ChrisClark13 Date: Wed, 17 Jan 2024 21:55:31 -0700 Subject: [PATCH 41/58] check Rml input first --- rts/Game/UI/InputReceiver.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rts/Game/UI/InputReceiver.cpp b/rts/Game/UI/InputReceiver.cpp index f8a4ea3579..e2a4d817ee 100644 --- a/rts/Game/UI/InputReceiver.cpp +++ b/rts/Game/UI/InputReceiver.cpp @@ -69,14 +69,14 @@ void CInputReceiver::DrawReceivers() CInputReceiver* CInputReceiver::GetReceiverAt(int x, int y) { - // check lua first - if (luaInputReceiver != nullptr && luaInputReceiver->IsAbove(x, y)) - return luaInputReceiver; - - // check RmlUI second + // check RmlUI first if (RmlGui::IsMouseInteractingWith()) return RmlGui::GetInputReceiver(); + // check lua second + if (luaInputReceiver != nullptr && luaInputReceiver->IsAbove(x, y)) + return luaInputReceiver; + for (CInputReceiver* recv: GetReceivers()) { if (recv == nullptr) continue; From 5f42a5a8682df567db0d7899e44a1e79c17c1a51 Mon Sep 17 00:00:00 2001 From: ChrisClark13 Date: Wed, 17 Jan 2024 22:01:40 -0700 Subject: [PATCH 42/58] fix a singular character to be lowercase blargh --- rts/Rml/Backends/RmlUi_Backend.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index 30226590ae..fbe64340e7 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -31,8 +31,7 @@ #ifndef RMLUI_BACKENDS_BACKEND_H #define RMLUI_BACKENDS_BACKEND_H -#include -#include +#include #include #include "Game/UI/InputReceiver.h" From fc72223bd32bc466da9af217d12e2fe394b5fa7b Mon Sep 17 00:00:00 2001 From: loveridge Date: Wed, 17 Jan 2024 22:36:00 -0700 Subject: [PATCH 43/58] fix spelling --- rts/Rml/Backends/RmlUi_Backend.cpp | 2 +- rts/Rml/Backends/RmlUi_Backend.h | 2 +- rts/Rml/Backends/RmlUi_Renderer_GL3.cpp | 2 +- rts/Rml/Backends/RmlUi_Renderer_GL3.h | 2 +- rts/Rml/Backends/RmlUi_SystemInterface.cpp | 2 +- rts/Rml/Backends/RmlUi_SystemInterface.h | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index cb3d3dabae..28eccaab97 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -1,7 +1,7 @@ /* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ /* - * This source file is dervied from the source code of RmlUi, the HTML/CSS Interface Middleware + * This source file is derived from the source code of RmlUi, the HTML/CSS Interface Middleware * * For the latest information, see http://github.com/mikke89/RmlUi * diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index fbe64340e7..09dd839c1e 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -1,7 +1,7 @@ /* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ /* - * This source file is dervied from the source code of RmlUi, the HTML/CSS Interface Middleware + * This source file is derived from the source code of RmlUi, the HTML/CSS Interface Middleware * * For the latest information, see http://github.com/mikke89/RmlUi * diff --git a/rts/Rml/Backends/RmlUi_Renderer_GL3.cpp b/rts/Rml/Backends/RmlUi_Renderer_GL3.cpp index c236fe0a73..0ecdc8ee14 100644 --- a/rts/Rml/Backends/RmlUi_Renderer_GL3.cpp +++ b/rts/Rml/Backends/RmlUi_Renderer_GL3.cpp @@ -1,7 +1,7 @@ /* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ /* - * This source file is dervied from the source code of RmlUi, the HTML/CSS Interface Middleware + * This source file is derived from the source code of RmlUi, the HTML/CSS Interface Middleware * * For the latest information, see http://github.com/mikke89/RmlUi * diff --git a/rts/Rml/Backends/RmlUi_Renderer_GL3.h b/rts/Rml/Backends/RmlUi_Renderer_GL3.h index 2a59a8cdc2..2401d8e230 100644 --- a/rts/Rml/Backends/RmlUi_Renderer_GL3.h +++ b/rts/Rml/Backends/RmlUi_Renderer_GL3.h @@ -1,7 +1,7 @@ /* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ /* - * This source file is dervied from the source code of RmlUi, the HTML/CSS Interface Middleware + * This source file is derived from the source code of RmlUi, the HTML/CSS Interface Middleware * * For the latest information, see http://github.com/mikke89/RmlUi * diff --git a/rts/Rml/Backends/RmlUi_SystemInterface.cpp b/rts/Rml/Backends/RmlUi_SystemInterface.cpp index bc9b929d12..80236da25c 100644 --- a/rts/Rml/Backends/RmlUi_SystemInterface.cpp +++ b/rts/Rml/Backends/RmlUi_SystemInterface.cpp @@ -1,7 +1,7 @@ /* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ /* - * This source file is dervied from the source code of RmlUi, the HTML/CSS Interface Middleware + * This source file is derived from the source code of RmlUi, the HTML/CSS Interface Middleware * * For the latest information, see http://github.com/mikke89/RmlUi * diff --git a/rts/Rml/Backends/RmlUi_SystemInterface.h b/rts/Rml/Backends/RmlUi_SystemInterface.h index 21d1afa7fb..ac76e32c10 100644 --- a/rts/Rml/Backends/RmlUi_SystemInterface.h +++ b/rts/Rml/Backends/RmlUi_SystemInterface.h @@ -1,7 +1,7 @@ /* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ /* - * This source file is dervied from the source code of RmlUi, the HTML/CSS Interface Middleware + * This source file is derived from the source code of RmlUi, the HTML/CSS Interface Middleware * * For the latest information, see http://github.com/mikke89/RmlUi * From 2ee784707479ffdcb7e1a50df4f2ef7077d9a100 Mon Sep 17 00:00:00 2001 From: loveridge Date: Wed, 17 Jan 2024 22:54:41 -0700 Subject: [PATCH 44/58] reference fix --- rts/Rml/Backends/RmlUi_Backend.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index 28eccaab97..0ca8bb3975 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -332,7 +332,8 @@ const std::string& RmlGui::GetMouseCursor() { if (!RmlInitialized()) { - return ""; + static std::string empty = ""; + return empty; } return data->system_interface.GetMouseCursor(); } From 641d2a3311f4a1be674e1af4b24b35c677f0bbc5 Mon Sep 17 00:00:00 2001 From: loveridge Date: Fri, 26 Jan 2024 23:33:37 -0700 Subject: [PATCH 45/58] use cbitmap texture binding --- rts/Rml/Backends/RmlUi_Backend.cpp | 59 ++++++++---------------------- 1 file changed, 15 insertions(+), 44 deletions(-) diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index 0ca8bb3975..1d86368b95 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -51,51 +51,22 @@ using CtxLockGuard = std::lock_guard; void createContext(const std::string& name); bool removeContext(const std::string& name); -class RenderInterface_GL3_SDL : public RenderInterface_GL3 -{ +class RenderInterface_GL3_SDL : public RenderInterface_GL3 { public: - RenderInterface_GL3_SDL() {} - - bool LoadTexture(Rml::TextureHandle& texture_handle, Rml::Vector2i& texture_dimensions, - const Rml::String& source) override - { - CBitmap bmp; - if (!bmp.Load(source)) - { - return false; - } - SDL_Surface* surface = bmp.CreateSDLSurface(); - - bool success = false; - if (surface) - { - texture_dimensions.x = surface->w; - texture_dimensions.y = surface->h; - - if (surface->format->format != SDL_PIXELFORMAT_RGBA32) - { - SDL_SetSurfaceAlphaMod(surface, SDL_ALPHA_OPAQUE); - SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE); - - SDL_Surface* new_surface = SDL_CreateRGBSurfaceWithFormat( - 0, surface->w, surface->h, 32, SDL_PIXELFORMAT_RGBA32); - if (!new_surface) - return false; - - if (SDL_BlitSurface(surface, 0, new_surface, 0) != 0) - return false; - - SDL_FreeSurface(surface); - surface = new_surface; - } - - success = RenderInterface_GL3::GenerateTexture(texture_handle, (const Rml::byte*)surface->pixels, - texture_dimensions); - SDL_FreeSurface(surface); - } - - return success; - } + RenderInterface_GL3_SDL() {} + + bool LoadTexture(Rml::TextureHandle &texture_handle, + Rml::Vector2i &texture_dimensions, + const Rml::String &source) override { + CBitmap bmp; + if (!bmp.Load(source)) { + return false; + } + texture_dimensions.x = bmp.xsize; + texture_dimensions.y = bmp.ysize; + texture_handle = bmp.CreateTexture(); + return texture_handle != 0; + } }; class VFSFileInterface : public Rml::FileInterface From b86474b37ed1127c16f2d047685590cfea03bbee Mon Sep 17 00:00:00 2001 From: loveridge Date: Sat, 27 Jan 2024 13:09:13 -0700 Subject: [PATCH 46/58] spaces to tabs with clang-format --- rts/Rml/Backends/RmlUi_Backend.cpp | 697 ++++++++++----------- rts/Rml/Backends/RmlUi_Backend.h | 19 +- rts/Rml/Backends/RmlUi_SystemInterface.cpp | 257 ++++---- rts/Rml/Backends/RmlUi_SystemInterface.h | 36 +- 4 files changed, 482 insertions(+), 527 deletions(-) diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index 1d86368b95..d987420856 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -1,7 +1,8 @@ /* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ /* - * This source file is derived from the source code of RmlUi, the HTML/CSS Interface Middleware + * This source file is derived from the source code of RmlUi, the HTML/CSS + * Interface Middleware * * For the latest information, see http://github.com/mikke89/RmlUi * @@ -28,20 +29,20 @@ * */ -#include -#include #include #include -#include #include +#include +#include +#include #include -#include "RmlUi_Backend.h" -#include "RmlUi_SystemInterface.h" -#include "RmlUi_Renderer_GL3.h" #include "Lua/LuaUI.h" #include "Rendering/Textures/Bitmap.h" #include "Rml/RmlInputReceiver.h" +#include "RmlUi_Backend.h" +#include "RmlUi_Renderer_GL3.h" +#include "RmlUi_SystemInterface.h" #include "System/FileSystem/FileHandler.h" #include "System/Input/InputHandler.h" @@ -51,508 +52,474 @@ using CtxLockGuard = std::lock_guard; void createContext(const std::string& name); bool removeContext(const std::string& name); -class RenderInterface_GL3_SDL : public RenderInterface_GL3 { +class RenderInterface_GL3_SDL : public RenderInterface_GL3 +{ public: - RenderInterface_GL3_SDL() {} - - bool LoadTexture(Rml::TextureHandle &texture_handle, - Rml::Vector2i &texture_dimensions, - const Rml::String &source) override { - CBitmap bmp; - if (!bmp.Load(source)) { - return false; - } - texture_dimensions.x = bmp.xsize; - texture_dimensions.y = bmp.ysize; - texture_handle = bmp.CreateTexture(); - return texture_handle != 0; - } + RenderInterface_GL3_SDL() + { + } + + bool LoadTexture(Rml::TextureHandle& texture_handle, Rml::Vector2i& texture_dimensions, + const Rml::String& source) override + { + CBitmap bmp; + if (!bmp.Load(source)) { + return false; + } + texture_dimensions.x = bmp.xsize; + texture_dimensions.y = bmp.ysize; + texture_handle = bmp.CreateTexture(); + return texture_handle != 0; + } }; class VFSFileInterface : public Rml::FileInterface { public: - VFSFileInterface() {} - - Rml::FileHandle Open(const Rml::String& path) - { - // LOG_L(L_FATAL, "[SpringApp::%s]OPENING: %s %d", __func__, path.c_str(), CLuaHandle::GetDevMode()); - const std::string mode = SPRING_VFS_RAW_FIRST; - CFileHandler* fh = new CFileHandler(path, mode); - if (!fh->FileExists()) - { - delete fh; - return (Rml::FileHandle)nullptr; - } - return (Rml::FileHandle)fh; - } - - void Close(Rml::FileHandle file) - { - ((CFileHandler*)file)->Close(); - delete (CFileHandler*)file; - } - - size_t Read(void* buffer, size_t size, Rml::FileHandle file) - { - return ((CFileHandler*)file)->Read(buffer, size); - } - - bool Seek(Rml::FileHandle file, long offset, int origin) - { - std::ios_base::seekdir seekdir; - switch (origin) - { - case SEEK_CUR: - seekdir = std::ios_base::cur; - break; - case SEEK_END: - seekdir = std::ios_base::end; - break; - case SEEK_SET: - default: - seekdir = std::ios_base::beg; - break; - } - ((CFileHandler*)file)->Seek(offset, seekdir); - // TODO: need to detect seek failure and then return false? - return true; - } - - size_t Tell(Rml::FileHandle file) - { - return ((CFileHandler*)file)->GetPos(); - }; + VFSFileInterface() + { + } + + Rml::FileHandle Open(const Rml::String& path) + { + // LOG_L(L_FATAL, "[SpringApp::%s]OPENING: %s %d", __func__, path.c_str(), + // CLuaHandle::GetDevMode()); + const std::string mode = SPRING_VFS_RAW_FIRST; + CFileHandler* fh = new CFileHandler(path, mode); + if (!fh->FileExists()) { + delete fh; + return (Rml::FileHandle) nullptr; + } + return (Rml::FileHandle)fh; + } + + void Close(Rml::FileHandle file) + { + ((CFileHandler*)file)->Close(); + delete (CFileHandler*)file; + } + + size_t Read(void* buffer, size_t size, Rml::FileHandle file) + { + return ((CFileHandler*)file)->Read(buffer, size); + } + + bool Seek(Rml::FileHandle file, long offset, int origin) + { + std::ios_base::seekdir seekdir; + switch (origin) { + case SEEK_CUR: + seekdir = std::ios_base::cur; + break; + case SEEK_END: + seekdir = std::ios_base::end; + break; + case SEEK_SET: + default: + seekdir = std::ios_base::beg; + break; + } + ((CFileHandler*)file)->Seek(offset, seekdir); + // TODO: need to detect seek failure and then return false? + return true; + } + + size_t Tell(Rml::FileHandle file) + { + return ((CFileHandler*)file)->GetPos(); + }; }; class PassThroughPlugin : public Rml::Plugin { - void (*onContextCreate)(Rml::Context*); - void (*onContextDestroy)(Rml::Context*); + void (*onContextCreate)(Rml::Context*); + void (*onContextDestroy)(Rml::Context*); public: - PassThroughPlugin(void (*onContextCreate)(Rml::Context*), void (*onContextDestroy)(Rml::Context*)) - : onContextCreate{onContextCreate}, onContextDestroy{onContextDestroy} {} - - int GetEventClasses() override - { - return EVT_BASIC; - } - - void OnInitialise() override {}; - void OnShutdown() override {}; - - void OnContextCreate(Rml::Context* context) override - { - onContextCreate(context); - }; - - void OnContextDestroy(Rml::Context* context) override - { - onContextDestroy(context); - }; + PassThroughPlugin(void (*onContextCreate)(Rml::Context*), + void (*onContextDestroy)(Rml::Context*)) + : onContextCreate{onContextCreate} + , onContextDestroy{onContextDestroy} + { + } + + int GetEventClasses() override + { + return EVT_BASIC; + } + + void OnInitialise() override{}; + void OnShutdown() override{}; + + void OnContextCreate(Rml::Context* context) override + { + onContextCreate(context); + }; + + void OnContextDestroy(Rml::Context* context) override + { + onContextDestroy(context); + }; }; /** - Global data used by this backend. - - Lifetime governed by the calls to Backend::Initialize() and Backend::Shutdown(). + Global data used by this backend. + Lifetime governed by the calls to Backend::Initialize() and + Backend::Shutdown(). */ -struct BackendData -{ - RmlSystemInterface system_interface; +struct BackendData { + RmlSystemInterface system_interface; #ifndef HEADLESS - RenderInterface_GL3_SDL render_interface; + RenderInterface_GL3_SDL render_interface; #else RenderInterface_Headless render_interface; #endif - VFSFileInterface file_interface; - - SDL_Window* window = nullptr; - SDL_GLContext glcontext = nullptr; - std::vector contexts; - InputHandler::SignalType::connection_type inputCon; - CRmlInputReceiver inputReceiver; - - // make atomic_bool? - bool initialized = false; - bool debuggerAttached = false; - int winX = 1; - int winY = 1; - lua_State* ls; - - Rml::UniquePtr plugin; - CtxMutex contextMutex; + VFSFileInterface file_interface; + + SDL_Window* window = nullptr; + SDL_GLContext glcontext = nullptr; + std::vector contexts; + InputHandler::SignalType::connection_type inputCon; + CRmlInputReceiver inputReceiver; + + // make atomic_bool? + bool initialized = false; + bool debuggerAttached = false; + int winX = 1; + int winY = 1; + lua_State* ls; + + Rml::UniquePtr plugin; + CtxMutex contextMutex; }; static Rml::UniquePtr data; bool RmlInitialized() { - return data && data->initialized; + return data && data->initialized; } -bool RmlGui::Initialize(SDL_Window* target_window, SDL_GLContext target_glcontext, int winX, int winY) +bool RmlGui::Initialize(SDL_Window* target_window, SDL_GLContext target_glcontext, int winX, + int winY) { - data = Rml::MakeUnique(); + data = Rml::MakeUnique(); - if (!data->render_interface) - { - data.reset(); - fprintf(stderr, "Could not initialize OpenGL3 render interface."); - return false; - } + if (!data->render_interface) { + data.reset(); + fprintf(stderr, "Could not initialize OpenGL3 render interface."); + return false; + } - data->window = target_window; - data->glcontext = target_glcontext; + data->window = target_window; + data->glcontext = target_glcontext; - Rml::SetFileInterface(&data->file_interface); - Rml::SetSystemInterface(RmlGui::GetSystemInterface()); - Rml::SetRenderInterface(RmlGui::GetRenderInterface()); + Rml::SetFileInterface(&data->file_interface); + Rml::SetSystemInterface(RmlGui::GetSystemInterface()); + Rml::SetRenderInterface(RmlGui::GetRenderInterface()); - data->render_interface.SetViewport(winX, winY); - data->winX = winX; - data->winY = winY; + data->render_interface.SetViewport(winX, winY); + data->winX = winX; + data->winY = winY; - Rml::Initialise(); + Rml::Initialise(); - Rml::LoadFontFace("fonts/FreeSansBold.otf", true); - data->inputCon = input.AddHandler(&RmlGui::ProcessEvent); - data->initialized = true; - return true; + Rml::LoadFontFace("fonts/FreeSansBold.otf", true); + data->inputCon = input.AddHandler(&RmlGui::ProcessEvent); + data->initialized = true; + return true; } bool RmlGui::InitializeLua(lua_State* lua_state) { - if (!RmlInitialized()) - { - return false; - } - sol::state_view lua(lua_state); - data->ls = lua_state; - data->plugin = Rml::MakeUnique(AddContext, RemoveContext); - Rml::RegisterPlugin(data->plugin.get()); - - Rml::SolLua::SolLuaPlugin* slp = Rml::SolLua::Initialise(&lua); - data->system_interface.SetTranslationTable(&slp->translationTable); - return true; + if (!RmlInitialized()) { + return false; + } + sol::state_view lua(lua_state); + data->ls = lua_state; + data->plugin = Rml::MakeUnique(AddContext, RemoveContext); + Rml::RegisterPlugin(data->plugin.get()); + + Rml::SolLua::SolLuaPlugin* slp = Rml::SolLua::Initialise(&lua); + data->system_interface.SetTranslationTable(&slp->translationTable); + return true; } void RmlGui::Shutdown() { - if (!RmlInitialized()) - { - return; - } - data->initialized = false; - - // removes all contexts - Rml::Shutdown(); + if (!RmlInitialized()) { + return; + } + data->initialized = false; + + // removes all contexts + Rml::Shutdown(); } void RmlGui::Reload() { - if (!RmlInitialized()) - { - return; - } - LOG_L(L_FATAL, "[SpringApp::%s] reloading: ", __func__); - SDL_Window* window = data->window; - SDL_GLContext glcontext = data->glcontext; - int winX = data->winX; - int winY = data->winY; - RmlGui::Shutdown(); - RmlGui::Initialize(window, glcontext, winX, winY); + if (!RmlInitialized()) { + return; + } + LOG_L(L_FATAL, "[SpringApp::%s] reloading: ", __func__); + SDL_Window* window = data->window; + SDL_GLContext glcontext = data->glcontext; + int winX = data->winX; + int winY = data->winY; + RmlGui::Shutdown(); + RmlGui::Initialize(window, glcontext, winX, winY); } void RmlGui::ToggleDebugger(int contextIndex) { - if (data->debuggerAttached) - { - // TODO: Ensure thread safety somehow if needed - Rml::Debugger::Initialise(data->contexts[contextIndex]); - Rml::Debugger::SetVisible(true); - } - else - { - Rml::Debugger::Shutdown(); - } - data->debuggerAttached = !data->debuggerAttached; + if (data->debuggerAttached) { + // TODO: Ensure thread safety somehow if needed + Rml::Debugger::Initialise(data->contexts[contextIndex]); + Rml::Debugger::SetVisible(true); + } else { + Rml::Debugger::Shutdown(); + } + data->debuggerAttached = !data->debuggerAttached; } Rml::SystemInterface* RmlGui::GetSystemInterface() { - return &data->system_interface; + return &data->system_interface; } Rml::RenderInterface* RmlGui::GetRenderInterface() { - return &data->render_interface; + return &data->render_interface; } bool RmlGui::IsMouseInteractingWith() { - if (!RmlInitialized()) - { - return false; - } - return data->inputReceiver.IsAbove(); + if (!RmlInitialized()) { + return false; + } + return data->inputReceiver.IsAbove(); } const std::string& RmlGui::GetMouseCursor() { - if (!RmlInitialized()) - { - static std::string empty = ""; - return empty; - } - return data->system_interface.GetMouseCursor(); + if (!RmlInitialized()) { + static std::string empty = ""; + return empty; + } + return data->system_interface.GetMouseCursor(); } CInputReceiver* RmlGui::GetInputReceiver() { - if (!RmlInitialized()) - { - return nullptr; - } - return &data->inputReceiver; + if (!RmlInitialized()) { + return nullptr; + } + return &data->inputReceiver; } - void RmlGui::AddContext(Rml::Context* context) { - CtxLockGuard lock(data->contextMutex); - context->SetDimensions({data->winX, data->winY}); - data->contexts.push_back(context); + CtxLockGuard lock(data->contextMutex); + context->SetDimensions({data->winX, data->winY}); + data->contexts.push_back(context); } void RmlGui::RemoveContext(Rml::Context* context) { - CtxLockGuard lock(data->contextMutex); - data->contexts.erase(std::ranges::find(data->contexts, context)); + CtxLockGuard lock(data->contextMutex); + data->contexts.erase(std::ranges::find(data->contexts, context)); } - void RmlGui::Update() { - ZoneScopedN("RmlGui Update"); - if (!RmlInitialized()) - { - return; - } + ZoneScopedN("RmlGui Update"); + if (!RmlInitialized()) { + return; + } #ifndef HEADLESS - for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) - { - context->Update(); - } + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { + context->Update(); + } #endif } void RmlGui::RenderFrame() { - ZoneScopedN("RmlGui Draw"); - if (!RmlInitialized()) - { - return; - } + ZoneScopedN("RmlGui Draw"); + if (!RmlInitialized()) { + return; + } #ifndef HEADLESS - RmlGui::BeginFrame(); - for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) - { - context->Render(); - } - RmlGui::PresentFrame(); + RmlGui::BeginFrame(); + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { + context->Render(); + } + RmlGui::PresentFrame(); #endif } void RmlGui::BeginFrame() { - // data->render_interface.Clear(); - data->render_interface.BeginFrame(); + // data->render_interface.Clear(); + data->render_interface.BeginFrame(); } void RmlGui::PresentFrame() { - data->render_interface.EndFrame(); - RMLUI_FrameMark; + data->render_interface.EndFrame(); + RMLUI_FrameMark; } /* - Return true if the event was handled by rmlui + Return true if the event was handled by rmlui */ bool RmlGui::ProcessMouseMove(int x, int y, int dx, int dy, int button) { - if (!RmlInitialized()) - { - return false; - } - bool result = false; - for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) - { - result |= !RmlSDLSpring::EventMouseMove(context, x, y); - } - data->inputReceiver.setActive(result); - return result; + if (!RmlInitialized()) { + return false; + } + bool result = false; + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { + result |= !RmlSDLSpring::EventMouseMove(context, x, y); + } + data->inputReceiver.setActive(result); + return result; } /* - Return true if the event was handled by rmlui + Return true if the event was handled by rmlui */ bool RmlGui::ProcessMousePress(int x, int y, int button) { - if (!RmlInitialized()) - { - return false; - } - bool result = false; - for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) - { - bool handled = !RmlSDLSpring::EventMousePress(context, x, y, button); - result |= handled; - if (!handled) - { - Rml::Element* el = context->GetFocusElement(); - if (el) - { - el->Blur(); - } - } - } - data->inputReceiver.setActive(result); - return result; + if (!RmlInitialized()) { + return false; + } + bool result = false; + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { + bool handled = !RmlSDLSpring::EventMousePress(context, x, y, button); + result |= handled; + if (!handled) { + Rml::Element* el = context->GetFocusElement(); + if (el) { + el->Blur(); + } + } + } + data->inputReceiver.setActive(result); + return result; } /* - Return true if the event was handled by rmlui + Return true if the event was handled by rmlui */ bool RmlGui::ProcessMouseRelease(int x, int y, int button) { - if (!RmlInitialized()) - { - return false; - } - bool result = false; - for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) - { - result |= !RmlSDLSpring::EventMouseRelease(context, x, y, button); - } - data->inputReceiver.setActive(result); - return result; + if (!RmlInitialized()) { + return false; + } + bool result = false; + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { + result |= !RmlSDLSpring::EventMouseRelease(context, x, y, button); + } + data->inputReceiver.setActive(result); + return result; } /* - Return true if the event was handled by rmlui + Return true if the event was handled by rmlui */ bool RmlGui::ProcessMouseWheel(float delta) { - if (!RmlInitialized()) - { - return false; - } - bool result = false; - for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) - { - result |= !RmlSDLSpring::EventMouseWheel(context, delta); - } - data->inputReceiver.setActive(result); - return result; + if (!RmlInitialized()) { + return false; + } + bool result = false; + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { + result |= !RmlSDLSpring::EventMouseWheel(context, delta); + } + data->inputReceiver.setActive(result); + return result; } /* - Return true if the event was handled by rmlui + Return true if the event was handled by rmlui */ bool RmlGui::ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat) { - if (!RmlInitialized()) - { - return false; - } - bool result = false; - for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) - { - auto kc = RmlSDLSpring::ConvertKey(keyCode); - result |= !RmlSDLSpring::EventKeyDown(context, kc); - } - return result; + if (!RmlInitialized()) { + return false; + } + bool result = false; + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { + auto kc = RmlSDLSpring::ConvertKey(keyCode); + result |= !RmlSDLSpring::EventKeyDown(context, kc); + } + return result; } bool RmlGui::ProcessKeyReleased(int keyCode, int scanCode) { - if (!RmlInitialized()) - { - return false; - } - bool result = false; - for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) - { - result |= !RmlSDLSpring::EventKeyUp(context, RmlSDLSpring::ConvertKey(keyCode)); - } - return result; + if (!RmlInitialized()) { + return false; + } + bool result = false; + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { + result |= !RmlSDLSpring::EventKeyUp(context, RmlSDLSpring::ConvertKey(keyCode)); + } + return result; } bool RmlGui::ProcessTextInput(const std::string& text) { - if (!RmlInitialized()) - { - return false; - } - bool result = false; - for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) - { - result |= !RmlSDLSpring::EventTextInput(context, text); - } - return result; + if (!RmlInitialized()) { + return false; + } + bool result = false; + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { + result |= !RmlSDLSpring::EventTextInput(context, text); + } + return result; } bool processContextEvent(Rml::Context* context, const SDL_Event& event) { - switch (event.type) - { - case SDL_WINDOWEVENT: - { - switch (event.window.event) - { - case SDL_WINDOWEVENT_SIZE_CHANGED: - { - Rml::Vector2i dimensions(event.window.data1, event.window.data2); - data->render_interface.SetViewport(dimensions.x, dimensions.y); - data->winX = dimensions.x; - data->winY = dimensions.y; - } - break; - } - RmlSDLSpring::InputEventHandler(context, event); - } - break; - case SDL_MOUSEMOTION: - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - case SDL_MOUSEWHEEL: - case SDL_KEYDOWN: - case SDL_KEYUP: - case SDL_TEXTINPUT: - break; // handled elsewhere - default: - { - RmlSDLSpring::InputEventHandler(context, event); - } - break; - } - // these events are not captured, and should continue propogating - return false; + switch (event.type) { + case SDL_WINDOWEVENT: { + switch (event.window.event) { + case SDL_WINDOWEVENT_SIZE_CHANGED: { + Rml::Vector2i dimensions(event.window.data1, event.window.data2); + data->render_interface.SetViewport(dimensions.x, dimensions.y); + data->winX = dimensions.x; + data->winY = dimensions.y; + } break; + } + RmlSDLSpring::InputEventHandler(context, event); + } break; + case SDL_MOUSEMOTION: + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEWHEEL: + case SDL_KEYDOWN: + case SDL_KEYUP: + case SDL_TEXTINPUT: + break; // handled elsewhere + default: { + RmlSDLSpring::InputEventHandler(context, event); + } break; + } + // these events are not captured, and should continue propogating + return false; } bool RmlGui::ProcessEvent(const SDL_Event& event) { - if (!RmlInitialized()) - { - return false; - } - bool result = false; - for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) - { - result |= processContextEvent(context, event); - } - return result; + if (!RmlInitialized()) { + return false; + } + bool result = false; + for (CtxLockGuard lock(data->contextMutex); const auto& context : data->contexts) { + result |= processContextEvent(context, event); + } + return result; } diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index 09dd839c1e..0a2c8420df 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -39,21 +39,20 @@ namespace RmlGui { - - bool Initialize(SDL_Window *target_window, SDL_GLContext target_glcontext, int winX, int winY); - bool InitializeLua(lua_State *lua_state); + bool Initialize(SDL_Window* target_window, SDL_GLContext target_glcontext, int winX, int winY); + bool InitializeLua(lua_State* lua_state); void Shutdown(); void Reload(); - Rml::SystemInterface *GetSystemInterface(); - Rml::RenderInterface *GetRenderInterface(); + Rml::SystemInterface* GetSystemInterface(); + Rml::RenderInterface* GetRenderInterface(); - bool ProcessEvent(const SDL_Event &event); + bool ProcessEvent(const SDL_Event& event); bool ProcessKeyPressed(int keyCode, int scanCode, bool isRepeat); bool ProcessKeyReleased(int keyCode, int scanCode); - bool ProcessTextInput(const std::string &text); + bool ProcessTextInput(const std::string& text); bool ProcessMouseMove(int x, int y, int dx, int dy, int button); bool ProcessMousePress(int x, int y, int button); bool ProcessMouseRelease(int x, int y, int button); @@ -67,12 +66,12 @@ namespace RmlGui void Update(); void RenderFrame(); - void AddContext(Rml::Context *context); - void RemoveContext(Rml::Context *context); + void AddContext(Rml::Context* context); + void RemoveContext(Rml::Context* context); void BeginFrame(); void PresentFrame(); -} +} // namespace RmlGui #endif diff --git a/rts/Rml/Backends/RmlUi_SystemInterface.cpp b/rts/Rml/Backends/RmlUi_SystemInterface.cpp index 80236da25c..70889b2cb1 100644 --- a/rts/Rml/Backends/RmlUi_SystemInterface.cpp +++ b/rts/Rml/Backends/RmlUi_SystemInterface.cpp @@ -36,182 +36,172 @@ #include #include -RmlSystemInterface::RmlSystemInterface() {} +RmlSystemInterface::RmlSystemInterface() +{ +} -RmlSystemInterface::~RmlSystemInterface() {} +RmlSystemInterface::~RmlSystemInterface() +{ +} double RmlSystemInterface::GetElapsedTime() { - return spring_gettime().toSecsf(); + return spring_gettime().toSecsf(); } int RmlSystemInterface::TranslateString(Rml::String& translated, const Rml::String& input) { - if (!translationTable || !translationTable->exists(input)) - { - translated = input; - return 0; - } - std::string translation = translationTable->getTranslationString(input); - translated = translation; - return 1; + if (!translationTable || !translationTable->exists(input)) { + translated = input; + return 0; + } + std::string translation = translationTable->getTranslationString(input); + translated = translation; + return 1; } bool RmlSystemInterface::LogMessage(Rml::Log::Type type, const Rml::String& message) { - const char* fmtStr = "[Lua:Rml] %s"; - const char* logStr = message.c_str(); - switch (type) - { - case Rml::Log::LT_ASSERT: - case Rml::Log::LT_DEBUG: - { - LOG_L(L_DEBUG, fmtStr, logStr); - } - break; - case Rml::Log::LT_ERROR: - { - LOG_L(L_ERROR, fmtStr, logStr); - } - break; - case Rml::Log::LT_WARNING: - { - LOG_L(L_WARNING, fmtStr, logStr); - } - break; - - case Rml::Log::LT_INFO: - default: - { - LOG_L(L_INFO, fmtStr, logStr); - } - break; - } - return true; + const char* fmtStr = "[Lua:Rml] %s"; + const char* logStr = message.c_str(); + switch (type) { + case Rml::Log::LT_ASSERT: + case Rml::Log::LT_DEBUG: { + LOG_L(L_DEBUG, fmtStr, logStr); + } break; + case Rml::Log::LT_ERROR: { + LOG_L(L_ERROR, fmtStr, logStr); + } break; + case Rml::Log::LT_WARNING: { + LOG_L(L_WARNING, fmtStr, logStr); + } break; + + case Rml::Log::LT_INFO: + default: { + LOG_L(L_INFO, fmtStr, logStr); + } break; + } + return true; } void RmlSystemInterface::SetMouseCursor(const Rml::String& cursor_name) { - mouseCursor = cursor_name; + mouseCursor = cursor_name; } const Rml::String& RmlSystemInterface::GetMouseCursor() { - return mouseCursor; + return mouseCursor; } void RmlSystemInterface::SetClipboardText(const Rml::String& text_utf8) { - SDL_SetClipboardText(text_utf8.c_str()); + SDL_SetClipboardText(text_utf8.c_str()); } void RmlSystemInterface::GetClipboardText(Rml::String& text) { - char* raw_text = SDL_GetClipboardText(); - text = Rml::String(raw_text); - SDL_free(raw_text); + char* raw_text = SDL_GetClipboardText(); + text = Rml::String(raw_text); + SDL_free(raw_text); } void RmlSystemInterface::SetTranslationTable(TranslationTable* tt) { - translationTable = tt; + translationTable = tt; } bool RmlSDLSpring::EventKeyDown(Rml::Context* context, Rml::Input::KeyIdentifier key) { - bool result = context->ProcessKeyDown(key, GetKeyModifierState()); - if (key == Rml::Input::KI_RETURN || key == Rml::Input::KI_NUMPADENTER) - result &= context->ProcessTextInput('\n'); - return result; + bool result = context->ProcessKeyDown(key, GetKeyModifierState()); + if (key == Rml::Input::KI_RETURN || key == Rml::Input::KI_NUMPADENTER) + result &= context->ProcessTextInput('\n'); + return result; } bool RmlSDLSpring::EventKeyUp(Rml::Context* context, Rml::Input::KeyIdentifier key) { - return context->ProcessKeyUp(key, GetKeyModifierState()); + return context->ProcessKeyUp(key, GetKeyModifierState()); } bool RmlSDLSpring::EventTextInput(Rml::Context* context, const std::string& text) { - return context->ProcessTextInput(Rml::String(text)); + return context->ProcessTextInput(Rml::String(text)); } bool RmlSDLSpring::EventMouseMove(Rml::Context* context, Sint32 x, Sint32 y) { - return context->ProcessMouseMove(x, y, GetKeyModifierState()); + return context->ProcessMouseMove(x, y, GetKeyModifierState()); } bool RmlSDLSpring::EventMousePress(Rml::Context* context, Sint32 x, Sint32 y, Sint32 button) { - return context->ProcessMouseButtonDown(ConvertMouseButton(button), GetKeyModifierState()); + return context->ProcessMouseButtonDown(ConvertMouseButton(button), GetKeyModifierState()); }; bool RmlSDLSpring::EventMouseRelease(Rml::Context* context, Sint32 x, Sint32 y, Sint32 button) { - return context->ProcessMouseButtonUp(ConvertMouseButton(button), GetKeyModifierState()); + return context->ProcessMouseButtonUp(ConvertMouseButton(button), GetKeyModifierState()); }; bool RmlSDLSpring::EventMouseWheel(Rml::Context* context, float delta) { - return context->ProcessMouseWheel(-delta, GetKeyModifierState()); + return context->ProcessMouseWheel(-delta, GetKeyModifierState()); }; bool RmlSDLSpring::InputEventHandler(Rml::Context* context, const SDL_Event& ev) { - bool result = true; - - switch (ev.type) - { - case SDL_MOUSEMOTION: - result = context->ProcessMouseMove(ev.motion.x, ev.motion.y, GetKeyModifierState()); - break; - case SDL_MOUSEBUTTONDOWN: - result = context->ProcessMouseButtonDown(ConvertMouseButton(ev.button.button), GetKeyModifierState()); - SDL_CaptureMouse(SDL_TRUE); - break; - case SDL_MOUSEBUTTONUP: - SDL_CaptureMouse(SDL_FALSE); - result = context->ProcessMouseButtonUp(ConvertMouseButton(ev.button.button), GetKeyModifierState()); - break; - case SDL_MOUSEWHEEL: - result = context->ProcessMouseWheel(float(-ev.wheel.y), GetKeyModifierState()); - break; - case SDL_KEYDOWN: - result = context->ProcessKeyDown(ConvertKey(ev.key.keysym.sym), GetKeyModifierState()); - if (ev.key.keysym.sym == SDLK_RETURN || ev.key.keysym.sym == SDLK_KP_ENTER) - result &= context->ProcessTextInput('\n'); - break; - case SDL_KEYUP: - result = context->ProcessKeyUp(ConvertKey(ev.key.keysym.sym), GetKeyModifierState()); - break; - case SDL_TEXTINPUT: - result = context->ProcessTextInput(Rml::String(&ev.text.text[0])); - break; - case SDL_WINDOWEVENT: - { - switch (ev.window.event) - { - case SDL_WINDOWEVENT_SIZE_CHANGED: - { - Rml::Vector2i dimensions(ev.window.data1, ev.window.data2); - context->SetDimensions(dimensions); - } - break; - case SDL_WINDOWEVENT_LEAVE: - context->ProcessMouseLeave(); - break; - } - } - break; - default: - break; - } - - return result; + bool result = true; + + switch (ev.type) { + case SDL_MOUSEMOTION: + result = context->ProcessMouseMove(ev.motion.x, ev.motion.y, GetKeyModifierState()); + break; + case SDL_MOUSEBUTTONDOWN: + result = context->ProcessMouseButtonDown(ConvertMouseButton(ev.button.button), + GetKeyModifierState()); + SDL_CaptureMouse(SDL_TRUE); + break; + case SDL_MOUSEBUTTONUP: + SDL_CaptureMouse(SDL_FALSE); + result = context->ProcessMouseButtonUp(ConvertMouseButton(ev.button.button), + GetKeyModifierState()); + break; + case SDL_MOUSEWHEEL: + result = context->ProcessMouseWheel(float(-ev.wheel.y), GetKeyModifierState()); + break; + case SDL_KEYDOWN: + result = context->ProcessKeyDown(ConvertKey(ev.key.keysym.sym), GetKeyModifierState()); + if (ev.key.keysym.sym == SDLK_RETURN || ev.key.keysym.sym == SDLK_KP_ENTER) + result &= context->ProcessTextInput('\n'); + break; + case SDL_KEYUP: + result = context->ProcessKeyUp(ConvertKey(ev.key.keysym.sym), GetKeyModifierState()); + break; + case SDL_TEXTINPUT: + result = context->ProcessTextInput(Rml::String(&ev.text.text[0])); + break; + case SDL_WINDOWEVENT: { + switch (ev.window.event) { + case SDL_WINDOWEVENT_SIZE_CHANGED: { + Rml::Vector2i dimensions(ev.window.data1, ev.window.data2); + context->SetDimensions(dimensions); + } break; + case SDL_WINDOWEVENT_LEAVE: + context->ProcessMouseLeave(); + break; + } + } break; + default: + break; + } + + return result; } Rml::Input::KeyIdentifier RmlSDLSpring::ConvertKey(int sdlkey) { - // clang-format off + // clang-format off switch (sdlkey) { case SDLK_UNKNOWN: return Rml::Input::KI_UNKNOWN; @@ -329,46 +319,45 @@ Rml::Input::KeyIdentifier RmlSDLSpring::ConvertKey(int sdlkey) */ default: break; } - // clang-format on + // clang-format on - return Rml::Input::KI_UNKNOWN; + return Rml::Input::KI_UNKNOWN; } int RmlSDLSpring::ConvertMouseButton(int button) { - switch (button) - { - case SDL_BUTTON_LEFT: - return 0; - case SDL_BUTTON_RIGHT: - return 1; - case SDL_BUTTON_MIDDLE: - return 2; - default: - return 3; - } + switch (button) { + case SDL_BUTTON_LEFT: + return 0; + case SDL_BUTTON_RIGHT: + return 1; + case SDL_BUTTON_MIDDLE: + return 2; + default: + return 3; + } } int RmlSDLSpring::GetKeyModifierState() { - SDL_Keymod sdl_mods = SDL_GetModState(); + SDL_Keymod sdl_mods = SDL_GetModState(); - int retval = 0; + int retval = 0; - if (sdl_mods & KMOD_CTRL) - retval |= Rml::Input::KM_CTRL; + if (sdl_mods & KMOD_CTRL) + retval |= Rml::Input::KM_CTRL; - if (sdl_mods & KMOD_SHIFT) - retval |= Rml::Input::KM_SHIFT; + if (sdl_mods & KMOD_SHIFT) + retval |= Rml::Input::KM_SHIFT; - if (sdl_mods & KMOD_ALT) - retval |= Rml::Input::KM_ALT; + if (sdl_mods & KMOD_ALT) + retval |= Rml::Input::KM_ALT; - if (sdl_mods & KMOD_NUM) - retval |= Rml::Input::KM_NUMLOCK; + if (sdl_mods & KMOD_NUM) + retval |= Rml::Input::KM_NUMLOCK; - if (sdl_mods & KMOD_CAPS) - retval |= Rml::Input::KM_CAPSLOCK; + if (sdl_mods & KMOD_CAPS) + retval |= Rml::Input::KM_CAPSLOCK; - return retval; + return retval; } diff --git a/rts/Rml/Backends/RmlUi_SystemInterface.h b/rts/Rml/Backends/RmlUi_SystemInterface.h index ac76e32c10..d057839032 100644 --- a/rts/Rml/Backends/RmlUi_SystemInterface.h +++ b/rts/Rml/Backends/RmlUi_SystemInterface.h @@ -34,11 +34,11 @@ #include +#include "Game/UI/MouseHandler.h" +#include #include #include #include -#include "Game/UI/MouseHandler.h" -#include class RmlSystemInterface : public Rml::SystemInterface { @@ -53,22 +53,22 @@ class RmlSystemInterface : public Rml::SystemInterface * @param input * @return */ - int TranslateString(Rml::String &translatedOut, const Rml::String &input) override; + int TranslateString(Rml::String& translatedOut, const Rml::String& input) override; bool LogMessage(Rml::Log::Type type, const Rml::String& message) override; double GetElapsedTime() override; - void SetMouseCursor(const Rml::String &cursor_name) override; + void SetMouseCursor(const Rml::String& cursor_name) override; - void SetClipboardText(const Rml::String &text) override; - void GetClipboardText(Rml::String &text) override; + void SetClipboardText(const Rml::String& text) override; + void GetClipboardText(Rml::String& text) override; // Hooks for Spring engine const Rml::String& GetMouseCursor(); - void SetTranslationTable(TranslationTable *tt);; + void SetTranslationTable(TranslationTable* tt); private: - TranslationTable *translationTable = nullptr; + TranslationTable* translationTable = nullptr; Rml::String mouseCursor; }; @@ -78,14 +78,14 @@ namespace RmlSDLSpring // Applies input on the context based on the given SDL event. // @return True if the event is still propagating, false if it was handled by the context. - bool InputEventHandler(Rml::Context *context, const SDL_Event &ev); - bool EventKeyDown(Rml::Context *context, Rml::Input::KeyIdentifier key); - bool EventKeyUp(Rml::Context *context, Rml::Input::KeyIdentifier key); - bool EventTextInput(Rml::Context *context, const std::string& text); - bool EventMouseMove(Rml::Context *context, Sint32 x, Sint32 y); - bool EventMousePress(Rml::Context *context, Sint32 x, Sint32 y, Sint32 button); - bool EventMouseRelease(Rml::Context *context, Sint32 x, Sint32 y, Sint32 button); - bool EventMouseWheel(Rml::Context *context, float delta); + bool InputEventHandler(Rml::Context* context, const SDL_Event& ev); + bool EventKeyDown(Rml::Context* context, Rml::Input::KeyIdentifier key); + bool EventKeyUp(Rml::Context* context, Rml::Input::KeyIdentifier key); + bool EventTextInput(Rml::Context* context, const std::string& text); + bool EventMouseMove(Rml::Context* context, Sint32 x, Sint32 y); + bool EventMousePress(Rml::Context* context, Sint32 x, Sint32 y, Sint32 button); + bool EventMouseRelease(Rml::Context* context, Sint32 x, Sint32 y, Sint32 button); + bool EventMouseWheel(Rml::Context* context, float delta); // Converts the SDL key to RmlUi key. Rml::Input::KeyIdentifier ConvertKey(int sdl_key); @@ -96,5 +96,5 @@ namespace RmlSDLSpring // Returns the active RmlUi key modifier state. int GetKeyModifierState(); -} // namespace RmlSDLSpring -#endif // RMLUI_SYSTEMINTERFACE_H +} // namespace RmlSDLSpring +#endif // RMLUI_SYSTEMINTERFACE_H From e8604ebb27342c026e04b8c2e71f84acb1519bcc Mon Sep 17 00:00:00 2001 From: loveridge Date: Sun, 28 Jan 2024 10:40:10 -0700 Subject: [PATCH 47/58] mask lua macros --- rts/Rml/Backends/RmlUi_Backend.h | 2 ++ rts/System/Ecs/EcsMain.h | 15 ++------------- rts/lib/lua/mask_lua_macros.h | 10 ++++++++++ rts/lib/lua/restore_lua_macros.h | 9 +++++++++ rts/lib/lua/src/lapi.cpp | 6 +++--- rts/lib/lua/src/lgc.cpp | 6 +++--- rts/lib/lua/src/lstate.cpp | 4 ++-- rts/lib/lua/src/lstate.h | 2 +- 8 files changed, 32 insertions(+), 22 deletions(-) create mode 100644 rts/lib/lua/mask_lua_macros.h create mode 100644 rts/lib/lua/restore_lua_macros.h diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index 0a2c8420df..2fec187c67 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -35,7 +35,9 @@ #include #include "Game/UI/InputReceiver.h" +#include "lib/lua/mask_lua_macros.h" #include "lib/sol2/sol.hpp" +#include "lib/lua/restore_lua_macros.h" namespace RmlGui { diff --git a/rts/System/Ecs/EcsMain.h b/rts/System/Ecs/EcsMain.h index 0ccd71b493..529155ffd3 100644 --- a/rts/System/Ecs/EcsMain.h +++ b/rts/System/Ecs/EcsMain.h @@ -3,11 +3,7 @@ #ifndef ECS_MAIN_H__ #define ECS_MAIN_H__ -// lua llimits.h and lstate.h makes some macros that breaks EnTT -#ifdef cast -#define RESTORE_LUA_MACROS -#undef cast -#endif +#include "lib/lua/mask_lua_macros.h" #define ENTT_USE_ATOMIC @@ -51,13 +47,6 @@ // *comp += addition; // } -#ifdef RESTORE_LUA_MACROS -// from llimits.h -#define cast(t, exp) ((t)(exp)) -// from lstate.h -#undef RESTORE_LUA_MACROS -#endif - - +#include "lib/lua/restore_lua_macros.h" #endif \ No newline at end of file diff --git a/rts/lib/lua/mask_lua_macros.h b/rts/lib/lua/mask_lua_macros.h new file mode 100644 index 0000000000..28c4fee3f8 --- /dev/null +++ b/rts/lib/lua/mask_lua_macros.h @@ -0,0 +1,10 @@ +// lua llimits.h and lstate.h makes some macros that breaks EnTT and sol2 +// import mask_lua_macros.h to mask them +// and then import restore_lua_macros.h afterwards +// be sure to keep the restored definitions the same as lua's when upgrading versions + +#ifdef cast +#define RESTORE_LUA_MACROS +#undef cast +#undef registry +#endif diff --git a/rts/lib/lua/restore_lua_macros.h b/rts/lib/lua/restore_lua_macros.h new file mode 100644 index 0000000000..6a5c676436 --- /dev/null +++ b/rts/lib/lua/restore_lua_macros.h @@ -0,0 +1,9 @@ +// import after mask_lua_macros.h + +#ifdef RESTORE_LUA_MACROS +// from llimits.h +#define cast(t, exp) ((t)(exp)) +// from lstate.h +#define registry(L) (&G(L)->l_registry) +#undef RESTORE_LUA_MACROS +#endif \ No newline at end of file diff --git a/rts/lib/lua/src/lapi.cpp b/rts/lib/lua/src/lapi.cpp index f74efbbe5e..e9ef367edc 100644 --- a/rts/lib/lua/src/lapi.cpp +++ b/rts/lib/lua/src/lapi.cpp @@ -59,7 +59,7 @@ static TValue *index2adr (lua_State *L, int idx) { return L->top + idx; } else switch (idx) { /* pseudo-indices */ - case LUA_REGISTRYINDEX: return lregistry(L); + case LUA_REGISTRYINDEX: return registry(L); case LUA_ENVIRONINDEX: { Closure *func = curr_func(L); sethvalue(L, &L->env, func->c.env); @@ -212,7 +212,7 @@ LUA_API void lua_replace (lua_State *L, int idx) { api_checkvalidindex(L, o); if (idx == LUA_ENVIRONINDEX) { Closure *func = curr_func(L); - api_check(L, ttistable(L->top - 1)); + api_check(L, ttistable(L->top - 1)); func->c.env = hvalue(L->top - 1); luaC_barrier(L, func, L->top - 1); } @@ -783,7 +783,7 @@ LUA_API int lua_setfenv (lua_State *L, int idx) { #define checkresults(L,na,nr) \ api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na))) - + LUA_API void lua_call (lua_State *L, int nargs, int nresults) { StkId func; diff --git a/rts/lib/lua/src/lgc.cpp b/rts/lib/lua/src/lgc.cpp index 72b6d93bb4..e909c79a96 100644 --- a/rts/lib/lua/src/lgc.cpp +++ b/rts/lib/lua/src/lgc.cpp @@ -310,7 +310,7 @@ static l_mem propagatemark (global_State *g) { traverseproto(g, p); return sizeof(Proto) + sizeof(Instruction) * p->sizecode + sizeof(Proto *) * p->sizep + - sizeof(TValue) * p->sizek + + sizeof(TValue) * p->sizek + sizeof(int) * p->sizelineinfo + sizeof(LocVar) * p->sizelocvars + sizeof(TString *) * p->sizeupvalues; @@ -506,7 +506,7 @@ static void markroot (lua_State *L) { markobject(g, g->mainthread); /* make global table be traversed before main stack */ markvalue(g, gt(g->mainthread)); - markvalue(g, lregistry(L)); + markvalue(g, registry(L)); markmt(g); g->gcstate = GCSpropagate; } @@ -696,7 +696,7 @@ void luaC_linkupval (lua_State *L, UpVal *uv) { GCObject *o = obj2gco(uv); o->gch.next = g->rootgc; /* link upvalue into `rootgc' list */ g->rootgc = o; - if (isgray(o)) { + if (isgray(o)) { if (g->gcstate == GCSpropagate) { gray2black(o); /* closed upvalues need barrier */ luaC_barrier(L, uv, uv->v); diff --git a/rts/lib/lua/src/lstate.cpp b/rts/lib/lua/src/lstate.cpp index 7d13e317e1..71b70faf55 100644 --- a/rts/lib/lua/src/lstate.cpp +++ b/rts/lib/lua/src/lstate.cpp @@ -72,7 +72,7 @@ static void f_luaopen (lua_State *L, void *ud) { UNUSED(ud); stack_init(L, L); /* init stack */ sethvalue(L, gt(L), luaH_new(L, 0, 2)); /* table of globals */ - sethvalue(L, lregistry(L), luaH_new(L, 0, 2)); /* registry */ + sethvalue(L, registry(L), luaH_new(L, 0, 2)); /* registry */ luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */ luaT_init(L); luaX_init(L); @@ -163,7 +163,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { g->strt.size = 0; g->strt.nuse = 0; g->strt.hash = NULL; - setnilvalue(lregistry(L)); + setnilvalue(registry(L)); luaZ_initbuffer(L, &g->buff); g->panic = NULL; g->gcstate = GCSpause; diff --git a/rts/lib/lua/src/lstate.h b/rts/lib/lua/src/lstate.h index 7106d48f00..03449f8c7d 100644 --- a/rts/lib/lua/src/lstate.h +++ b/rts/lib/lua/src/lstate.h @@ -21,7 +21,7 @@ struct lua_longjmp; /* defined in ldo.c */ #define gt(L) (&L->l_gt) /* registry */ -#define lregistry(L) (&G(L)->l_registry) +#define registry(L) (&G(L)->l_registry) /* extra stack space to handle TM calls and some other extras */ From 577701470b3c67cc457e2cb4ea8ec4ad208077ea Mon Sep 17 00:00:00 2001 From: loveridge Date: Sun, 28 Jan 2024 11:26:42 -0700 Subject: [PATCH 48/58] Remove unused variable --- rts/System/Input/MouseInput.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/rts/System/Input/MouseInput.cpp b/rts/System/Input/MouseInput.cpp index 4868bb9e94..7aabf166cb 100644 --- a/rts/System/Input/MouseInput.cpp +++ b/rts/System/Input/MouseInput.cpp @@ -69,8 +69,6 @@ IMouseInput::~IMouseInput() bool IMouseInput::HandleSDLMouseEvent(const SDL_Event& event) { - const bool mousePressed = mouse->ButtonPressed(); - switch (event.type) { case SDL_MOUSEMOTION: { mousepos = int2(event.motion.x, event.motion.y); From 2845335d1e190f37641985674ac040a07ccf6cd3 Mon Sep 17 00:00:00 2001 From: loveridge Date: Sun, 28 Jan 2024 16:40:13 -0700 Subject: [PATCH 49/58] add an explicit removeLua call --- rts/Lua/LuaHandle.cpp | 5 ++-- rts/Rml/Backends/RmlUi_Backend.cpp | 20 +++++++++++-- rts/Rml/Backends/RmlUi_Backend.h | 1 + .../include/RmlSolLua/SolLuaPlugin.h | 11 +++++++ rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp | 30 ++++++++++++++++++- 5 files changed, 61 insertions(+), 6 deletions(-) diff --git a/rts/Lua/LuaHandle.cpp b/rts/Lua/LuaHandle.cpp index 44b2abb4f5..d0db25007e 100644 --- a/rts/Lua/LuaHandle.cpp +++ b/rts/Lua/LuaHandle.cpp @@ -23,6 +23,7 @@ #include "Game/UI/KeySet.h" #include "Game/UI/MiniMap.h" #include "Rendering/GlobalRendering.h" +#include "Rml/Backends/RmlUi_Backend.h" #include "Sim/Misc/GlobalSynced.h" #include "Sim/Misc/TeamHandler.h" #include "Sim/Projectiles/Projectile.h" @@ -173,7 +174,7 @@ void CLuaHandle::KillLua(bool inFreeHandler) Shutdown(); if(rmlui) { - RmlGui::Reload(); + RmlGui::RemoveLua(); } // 3. delete the lua_State @@ -1103,7 +1104,7 @@ void CLuaHandle::UnitTaken(const CUnit* unit, int oldTeam, int newTeam) * @number unitID * @number unitDefID * @number newTeam - * @number oldTeam + * @number oldTeam */ void CLuaHandle::UnitGiven(const CUnit* unit, int oldTeam, int newTeam) { diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index d987420856..4e3bd7be1a 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -187,9 +187,10 @@ struct BackendData { bool debuggerAttached = false; int winX = 1; int winY = 1; - lua_State* ls; + lua_State* ls = nullptr; Rml::UniquePtr plugin; + Rml::SolLua::SolLuaPlugin* luaPlugin = nullptr; CtxMutex contextMutex; }; @@ -240,8 +241,21 @@ bool RmlGui::InitializeLua(lua_State* lua_state) data->plugin = Rml::MakeUnique(AddContext, RemoveContext); Rml::RegisterPlugin(data->plugin.get()); - Rml::SolLua::SolLuaPlugin* slp = Rml::SolLua::Initialise(&lua); - data->system_interface.SetTranslationTable(&slp->translationTable); + data->luaPlugin = Rml::SolLua::Initialise(&lua); + data->system_interface.SetTranslationTable(&data->luaPlugin->translationTable); + return true; +} + +bool RmlGui::RemoveLua() +{ + if (!RmlInitialized() || !data->ls) { + return false; + } + data->luaPlugin->RemoveLuaItems(); + Update(); + Rml::UnregisterPlugin(data->plugin.get()); + Rml::UnregisterPlugin(data->luaPlugin); + return true; } diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index 2fec187c67..2e114ec987 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -43,6 +43,7 @@ namespace RmlGui { bool Initialize(SDL_Window* target_window, SDL_GLContext target_glcontext, int winX, int winY); bool InitializeLua(lua_State* lua_state); + bool RemoveLua(); void Shutdown(); void Reload(); diff --git a/rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h b/rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h index 36bdbe669f..a6269918d0 100644 --- a/rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h +++ b/rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h @@ -7,6 +7,7 @@ #include #include #include +#include "RmlUi/Core/ElementDocument.h" #include "TranslationTable.h" #include @@ -24,6 +25,8 @@ namespace Rml::SolLua SolLuaPlugin(sol::state_view lua_state); SolLuaPlugin(sol::state_view lua_state, const Rml::String& lua_environment_identifier); + void RemoveLuaItems(); + TranslationTable translationTable; private: int GetEventClasses() override; @@ -31,11 +34,19 @@ namespace Rml::SolLua void OnInitialise() override; void OnShutdown() override; + void OnContextCreate(Context* context) override; + void OnContextDestroy(Context* context) override; + void OnDocumentLoad(ElementDocument* document) override; + void OnDocumentUnload(ElementDocument* document) override; + std::unique_ptr document_element_instancer; std::unique_ptr event_listener_instancer; sol::state_view m_lua_state; Rml::String m_lua_env_identifier; + + std::vector luaContexts; + std::vector luaDocuments; }; } // end namespace Rml::SolLua diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp index 19cb6e39f6..aedb15d331 100644 --- a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp @@ -1,8 +1,11 @@ #include +#include "RmlUi/Core/Context.h" #include "SolLuaInstancer.h" +#include #include "bind/bind.h" +#include namespace Rml::SolLua @@ -19,7 +22,32 @@ namespace Rml::SolLua int SolLuaPlugin::GetEventClasses() { - return EVT_BASIC; + return EVT_BASIC | EVT_DOCUMENT; + } + + void SolLuaPlugin::OnContextCreate(Context* context) { + luaContexts.emplace_back(context); + } + + void SolLuaPlugin::OnContextDestroy(Context* context) { + luaContexts.erase(std::remove(luaContexts.begin(), luaContexts.end(), context), luaContexts.end()); + } + + void SolLuaPlugin::OnDocumentLoad(ElementDocument* document) { + luaDocuments.emplace_back(document); + } + + void SolLuaPlugin::OnDocumentUnload(ElementDocument* document) { + luaDocuments.erase(std::remove(luaDocuments.begin(), luaDocuments.end(), document), luaDocuments.end()); + } + + void SolLuaPlugin::RemoveLuaItems(){ + for(auto d: luaDocuments) { + d->Close(); + } + for(auto c: luaContexts) { + Rml::RemoveContext(c->GetName()); + } } void SolLuaPlugin::OnInitialise() From 8f31df304bcfa6a07c66afe6ae0a2d65d13f2c9f Mon Sep 17 00:00:00 2001 From: loveridge Date: Sun, 28 Jan 2024 17:01:14 -0700 Subject: [PATCH 50/58] accurate tracking of lua added items --- .../RmlSolLua/include/RmlSolLua/SolLuaPlugin.h | 4 ++-- rts/lib/RmlSolLua/src/RmlSolLua.cpp | 2 +- rts/lib/RmlSolLua/src/bind/Context.cpp | 13 +++++++++---- rts/lib/RmlSolLua/src/bind/Global.cpp | 15 +++++++-------- rts/lib/RmlSolLua/src/bind/bind.h | 2 +- rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp | 4 ++-- 6 files changed, 22 insertions(+), 18 deletions(-) diff --git a/rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h b/rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h index a6269918d0..ec5dbc43e7 100644 --- a/rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h +++ b/rts/lib/RmlSolLua/include/RmlSolLua/SolLuaPlugin.h @@ -26,6 +26,8 @@ namespace Rml::SolLua SolLuaPlugin(sol::state_view lua_state, const Rml::String& lua_environment_identifier); void RemoveLuaItems(); + void AddContextTracking(Context* context); + void AddDocumentTracking(ElementDocument* document); TranslationTable translationTable; private: @@ -34,9 +36,7 @@ namespace Rml::SolLua void OnInitialise() override; void OnShutdown() override; - void OnContextCreate(Context* context) override; void OnContextDestroy(Context* context) override; - void OnDocumentLoad(ElementDocument* document) override; void OnDocumentUnload(ElementDocument* document) override; std::unique_ptr document_element_instancer; diff --git a/rts/lib/RmlSolLua/src/RmlSolLua.cpp b/rts/lib/RmlSolLua/src/RmlSolLua.cpp index c17d866417..f85e1e00fd 100644 --- a/rts/lib/RmlSolLua/src/RmlSolLua.cpp +++ b/rts/lib/RmlSolLua/src/RmlSolLua.cpp @@ -36,7 +36,7 @@ namespace Rml::SolLua void RegisterLua(sol::state_view* state, SolLuaPlugin* slp) { bind_color(*state); - bind_context(*state); + bind_context(*state, slp); bind_datamodel(*state); bind_element(*state); bind_element_derived(*state); diff --git a/rts/lib/RmlSolLua/src/bind/Context.cpp b/rts/lib/RmlSolLua/src/bind/Context.cpp index b1b391f90b..2037df3f67 100644 --- a/rts/lib/RmlSolLua/src/bind/Context.cpp +++ b/rts/lib/RmlSolLua/src/bind/Context.cpp @@ -160,17 +160,22 @@ namespace Rml::SolLua /// Binds the Rml::Context class to Lua. ///
/// The Lua state to bind into. - void bind_context(sol::state_view &lua) + void bind_context(sol::state_view &lua, SolLuaPlugin* slp) { lua.new_usertype( "Context", sol::no_constructor, // M "AddEventListener", &Rml::Context::AddEventListener, - "CreateDocument", [](Rml::Context &self) - { return self.CreateDocument(); }, - "LoadDocument", [](Rml::Context &self, const Rml::String &document, sol::object w, sol::this_environment e, sol::this_state s) + "CreateDocument", [slp](Rml::Context &self) + { + auto doc = self.CreateDocument(); + slp->AddDocumentTracking(doc); + return doc; + }, + "LoadDocument", [slp](Rml::Context &self, const Rml::String &document, sol::object w, sol::this_environment e, sol::this_state s) { auto doc = self.LoadDocument(document); + slp->AddDocumentTracking(doc); if (doc == nullptr) { return (SolLuaDocument*) nullptr; } diff --git a/rts/lib/RmlSolLua/src/bind/Global.cpp b/rts/lib/RmlSolLua/src/bind/Global.cpp index ad58f38091..606ad23ed7 100644 --- a/rts/lib/RmlSolLua/src/bind/Global.cpp +++ b/rts/lib/RmlSolLua/src/bind/Global.cpp @@ -7,13 +7,6 @@ namespace Rml::SolLua namespace functions { - auto createContext(const Rml::String& name) - { - // context will be resized right away by other code - // send {0, 0} in to avoid triggering a pointless resize event in the Rml code - return Rml::CreateContext(name, {0, 0}); - } - auto getContext() { std::function result = [](int idx) { return Rml::GetContext(idx); }; @@ -62,7 +55,13 @@ namespace Rml::SolLua auto g = lua.new_usertype("rmlui", // M - "CreateContext", functions::createContext, + "CreateContext", [slp](const Rml::String& name) { + // context will be resized right away by other code + // send {0, 0} in to avoid triggering a pointless resize event in the Rml code + auto context = Rml::CreateContext(name, {0, 0}); + slp->AddContextTracking(context); + return context; + }, "RemoveContext", sol::resolve(&Rml::RemoveContext), "LoadFontFace", sol::overload( &functions::loadFontFace1, diff --git a/rts/lib/RmlSolLua/src/bind/bind.h b/rts/lib/RmlSolLua/src/bind/bind.h index 9b12b4ed43..8d427917c5 100644 --- a/rts/lib/RmlSolLua/src/bind/bind.h +++ b/rts/lib/RmlSolLua/src/bind/bind.h @@ -191,7 +191,7 @@ namespace Rml::SolLua // Called from RmlSolLua.cpp void bind_color(sol::state_view& lua); - void bind_context(sol::state_view& lua); + void bind_context(sol::state_view& lua, SolLuaPlugin *slp); void bind_datamodel(sol::state_view& lua); void bind_document(sol::state_view& lua); void bind_element(sol::state_view& lua); diff --git a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp index aedb15d331..2056c138ea 100644 --- a/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp +++ b/rts/lib/RmlSolLua/src/plugin/SolLuaPlugin.cpp @@ -25,7 +25,7 @@ namespace Rml::SolLua return EVT_BASIC | EVT_DOCUMENT; } - void SolLuaPlugin::OnContextCreate(Context* context) { + void SolLuaPlugin::AddContextTracking(Context* context) { luaContexts.emplace_back(context); } @@ -33,7 +33,7 @@ namespace Rml::SolLua luaContexts.erase(std::remove(luaContexts.begin(), luaContexts.end(), context), luaContexts.end()); } - void SolLuaPlugin::OnDocumentLoad(ElementDocument* document) { + void SolLuaPlugin::AddDocumentTracking(ElementDocument* document) { luaDocuments.emplace_back(document); } From b9319316d0a6120e85c41b516988c68ec3ec7b37 Mon Sep 17 00:00:00 2001 From: ChrisClark13 Date: Sun, 28 Jan 2024 19:40:03 -0700 Subject: [PATCH 51/58] move general Rml::Context watching plugin outside of Lua init/destroy get rid of never-going-to-be-used code in RmlUi_Renderer_GL3 rename file/class to RmlUi_Renderer_GL3_Spring since it's now more deeply integrated with Spring move VFSInterface to own files --- rts/Rml/Backends/RmlUi_Backend.cpp | 101 +- rts/Rml/Backends/RmlUi_Backend.h | 4 +- rts/Rml/Backends/RmlUi_Include_GL3.h | 3582 ----------------- ..._GL3.cpp => RmlUi_Renderer_GL3_Spring.cpp} | 392 +- ...erer_GL3.h => RmlUi_Renderer_GL3_Spring.h} | 25 +- rts/Rml/Backends/RmlUi_SystemInterface.h | 1 - rts/Rml/Backends/RmlUi_VFSFileInterface.cpp | 56 + rts/Rml/Backends/RmlUi_VFSFileInterface.h | 19 + rts/Rml/CMakeLists.txt | 3 +- 9 files changed, 236 insertions(+), 3947 deletions(-) delete mode 100644 rts/Rml/Backends/RmlUi_Include_GL3.h rename rts/Rml/Backends/{RmlUi_Renderer_GL3.cpp => RmlUi_Renderer_GL3_Spring.cpp} (63%) rename rts/Rml/Backends/{RmlUi_Renderer_GL3.h => RmlUi_Renderer_GL3_Spring.h} (89%) create mode 100644 rts/Rml/Backends/RmlUi_VFSFileInterface.cpp create mode 100644 rts/Rml/Backends/RmlUi_VFSFileInterface.h diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index 4e3bd7be1a..d1a98f133d 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -41,9 +41,9 @@ #include "Rendering/Textures/Bitmap.h" #include "Rml/RmlInputReceiver.h" #include "RmlUi_Backend.h" -#include "RmlUi_Renderer_GL3.h" +#include "RmlUi_Renderer_GL3_Spring.h" #include "RmlUi_SystemInterface.h" -#include "System/FileSystem/FileHandler.h" +#include "RmlUi_VFSFileInterface.h" #include "System/Input/InputHandler.h" using CtxMutex = std::recursive_mutex; @@ -52,84 +52,7 @@ using CtxLockGuard = std::lock_guard; void createContext(const std::string& name); bool removeContext(const std::string& name); -class RenderInterface_GL3_SDL : public RenderInterface_GL3 -{ -public: - RenderInterface_GL3_SDL() - { - } - - bool LoadTexture(Rml::TextureHandle& texture_handle, Rml::Vector2i& texture_dimensions, - const Rml::String& source) override - { - CBitmap bmp; - if (!bmp.Load(source)) { - return false; - } - texture_dimensions.x = bmp.xsize; - texture_dimensions.y = bmp.ysize; - texture_handle = bmp.CreateTexture(); - return texture_handle != 0; - } -}; - -class VFSFileInterface : public Rml::FileInterface -{ -public: - VFSFileInterface() - { - } - - Rml::FileHandle Open(const Rml::String& path) - { - // LOG_L(L_FATAL, "[SpringApp::%s]OPENING: %s %d", __func__, path.c_str(), - // CLuaHandle::GetDevMode()); - const std::string mode = SPRING_VFS_RAW_FIRST; - CFileHandler* fh = new CFileHandler(path, mode); - if (!fh->FileExists()) { - delete fh; - return (Rml::FileHandle) nullptr; - } - return (Rml::FileHandle)fh; - } - - void Close(Rml::FileHandle file) - { - ((CFileHandler*)file)->Close(); - delete (CFileHandler*)file; - } - - size_t Read(void* buffer, size_t size, Rml::FileHandle file) - { - return ((CFileHandler*)file)->Read(buffer, size); - } - - bool Seek(Rml::FileHandle file, long offset, int origin) - { - std::ios_base::seekdir seekdir; - switch (origin) { - case SEEK_CUR: - seekdir = std::ios_base::cur; - break; - case SEEK_END: - seekdir = std::ios_base::end; - break; - case SEEK_SET: - default: - seekdir = std::ios_base::beg; - break; - } - ((CFileHandler*)file)->Seek(offset, seekdir); - // TODO: need to detect seek failure and then return false? - return true; - } - - size_t Tell(Rml::FileHandle file) - { - return ((CFileHandler*)file)->GetPos(); - }; -}; - +/// Passes through RML events to the function pointers given in the constructor class PassThroughPlugin : public Rml::Plugin { void (*onContextCreate)(Rml::Context*); @@ -170,7 +93,7 @@ class PassThroughPlugin : public Rml::Plugin struct BackendData { RmlSystemInterface system_interface; #ifndef HEADLESS - RenderInterface_GL3_SDL render_interface; + RenderInterface_GL3_Spring render_interface; #else RenderInterface_Headless render_interface; #endif @@ -228,6 +151,10 @@ bool RmlGui::Initialize(SDL_Window* target_window, SDL_GLContext target_glcontex Rml::LoadFontFace("fonts/FreeSansBold.otf", true); data->inputCon = input.AddHandler(&RmlGui::ProcessEvent); data->initialized = true; + + data->plugin = Rml::MakeUnique(OnContextCreate, OnContextDestroy); + Rml::RegisterPlugin(data->plugin.get()); + return true; } @@ -238,9 +165,6 @@ bool RmlGui::InitializeLua(lua_State* lua_state) } sol::state_view lua(lua_state); data->ls = lua_state; - data->plugin = Rml::MakeUnique(AddContext, RemoveContext); - Rml::RegisterPlugin(data->plugin.get()); - data->luaPlugin = Rml::SolLua::Initialise(&lua); data->system_interface.SetTranslationTable(&data->luaPlugin->translationTable); return true; @@ -253,7 +177,6 @@ bool RmlGui::RemoveLua() } data->luaPlugin->RemoveLuaItems(); Update(); - Rml::UnregisterPlugin(data->plugin.get()); Rml::UnregisterPlugin(data->luaPlugin); return true; @@ -264,7 +187,9 @@ void RmlGui::Shutdown() if (!RmlInitialized()) { return; } - data->initialized = false; + + Rml::UnregisterPlugin(data->plugin.get()); + data.reset(); // removes all contexts Rml::Shutdown(); @@ -331,14 +256,14 @@ CInputReceiver* RmlGui::GetInputReceiver() return &data->inputReceiver; } -void RmlGui::AddContext(Rml::Context* context) +void RmlGui::OnContextCreate(Rml::Context* context) { CtxLockGuard lock(data->contextMutex); context->SetDimensions({data->winX, data->winY}); data->contexts.push_back(context); } -void RmlGui::RemoveContext(Rml::Context* context) +void RmlGui::OnContextDestroy(Rml::Context* context) { CtxLockGuard lock(data->contextMutex); data->contexts.erase(std::ranges::find(data->contexts, context)); diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index 2e114ec987..bfb3b8eb0d 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -69,8 +69,8 @@ namespace RmlGui void Update(); void RenderFrame(); - void AddContext(Rml::Context* context); - void RemoveContext(Rml::Context* context); + void OnContextCreate(Rml::Context* context); + void OnContextDestroy(Rml::Context* context); void BeginFrame(); void PresentFrame(); diff --git a/rts/Rml/Backends/RmlUi_Include_GL3.h b/rts/Rml/Backends/RmlUi_Include_GL3.h deleted file mode 100644 index 0b270f5d8a..0000000000 --- a/rts/Rml/Backends/RmlUi_Include_GL3.h +++ /dev/null @@ -1,3582 +0,0 @@ -/** - * Loader generated by glad 2.0.0-beta on Fri Mar 11 10:53:06 2022 - * - * Generator: C/C++ - * Specification: gl - * Extensions: 0 - * - * APIs: - * - gl:core=3.3 - * - * Options: - * - ALIAS = False - * - DEBUG = False - * - HEADER_ONLY = True - * - LOADER = True - * - MX = False - * - MX_GLOBAL = False - * - ON_DEMAND = False - * - * Commandline: - * --api='gl:core=3.3' --extensions='' c --header-only --loader - * - * Online: - * http://glad.sh/#api=gl%3Acore%3D3.3&extensions=&generator=c&options=HEADER_ONLY%2CLOADER - * - */ - -#ifndef GLAD_GL_H_ -#define GLAD_GL_H_ - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-id-macro" -#endif -#ifdef __gl_h_ - #error OpenGL (gl.h) header already included (API: gl), remove previous include! -#endif -#define __gl_h_ 1 -#ifdef __gl3_h_ - #error OpenGL (gl3.h) header already included (API: gl), remove previous include! -#endif -#define __gl3_h_ 1 -#ifdef __glext_h_ - #error OpenGL (glext.h) header already included (API: gl), remove previous include! -#endif -#define __glext_h_ 1 -#ifdef __gl3ext_h_ - #error OpenGL (gl3ext.h) header already included (API: gl), remove previous include! -#endif -#define __gl3ext_h_ 1 -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#define GLAD_GL -#define GLAD_OPTION_GL_HEADER_ONLY -#define GLAD_OPTION_GL_LOADER - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef GLAD_PLATFORM_H_ -#define GLAD_PLATFORM_H_ - -#ifndef GLAD_PLATFORM_WIN32 - #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) - #define GLAD_PLATFORM_WIN32 1 - #else - #define GLAD_PLATFORM_WIN32 0 - #endif -#endif - -#ifndef GLAD_PLATFORM_APPLE - #ifdef __APPLE__ - #define GLAD_PLATFORM_APPLE 1 - #else - #define GLAD_PLATFORM_APPLE 0 - #endif -#endif - -#ifndef GLAD_PLATFORM_EMSCRIPTEN - #ifdef __EMSCRIPTEN__ - #define GLAD_PLATFORM_EMSCRIPTEN 1 - #else - #define GLAD_PLATFORM_EMSCRIPTEN 0 - #endif -#endif - -#ifndef GLAD_PLATFORM_UWP - #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) - #ifdef __has_include - #if __has_include() - #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 - #endif - #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ - #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 - #endif - #endif - - #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY - #include - #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) - #define GLAD_PLATFORM_UWP 1 - #endif - #endif - - #ifndef GLAD_PLATFORM_UWP - #define GLAD_PLATFORM_UWP 0 - #endif -#endif - -#ifdef __GNUC__ - #define GLAD_GNUC_EXTENSION __extension__ -#else - #define GLAD_GNUC_EXTENSION -#endif - -#ifndef GLAD_API_CALL - #if defined(GLAD_API_CALL_EXPORT) - #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) - #if defined(GLAD_API_CALL_EXPORT_BUILD) - #if defined(__GNUC__) - #define GLAD_API_CALL __attribute__ ((dllexport)) extern - #else - #define GLAD_API_CALL __declspec(dllexport) extern - #endif - #else - #if defined(__GNUC__) - #define GLAD_API_CALL __attribute__ ((dllimport)) extern - #else - #define GLAD_API_CALL __declspec(dllimport) extern - #endif - #endif - #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) - #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern - #else - #define GLAD_API_CALL extern - #endif - #else - #define GLAD_API_CALL extern - #endif -#endif - -#ifdef APIENTRY - #define GLAD_API_PTR APIENTRY -#elif GLAD_PLATFORM_WIN32 - #define GLAD_API_PTR __stdcall -#else - #define GLAD_API_PTR -#endif - -#ifndef GLAPI -#define GLAPI GLAD_API_CALL -#endif - -#ifndef GLAPIENTRY -#define GLAPIENTRY GLAD_API_PTR -#endif - -#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor) -#define GLAD_VERSION_MAJOR(version) (version / 10000) -#define GLAD_VERSION_MINOR(version) (version % 10000) - -#define GLAD_GENERATOR_VERSION "2.0.0-beta" - -typedef void (*GLADapiproc)(void); - -typedef GLADapiproc (*GLADloadfunc)(const char *name); -typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name); - -typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); -typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); - -#endif /* GLAD_PLATFORM_H_ */ - -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 -#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -#define GL_ALPHA 0x1906 -#define GL_ALREADY_SIGNALED 0x911A -#define GL_ALWAYS 0x0207 -#define GL_AND 0x1501 -#define GL_AND_INVERTED 0x1504 -#define GL_AND_REVERSE 0x1502 -#define GL_ANY_SAMPLES_PASSED 0x8C2F -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_BACK 0x0405 -#define GL_BACK_LEFT 0x0402 -#define GL_BACK_RIGHT 0x0403 -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#define GL_BGRA_INTEGER 0x8D9B -#define GL_BGR_INTEGER 0x8D9A -#define GL_BLEND 0x0BE2 -#define GL_BLEND_COLOR 0x8005 -#define GL_BLEND_DST 0x0BE0 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_EQUATION 0x8009 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_BLEND_EQUATION_RGB 0x8009 -#define GL_BLEND_SRC 0x0BE1 -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLUE 0x1905 -#define GL_BLUE_INTEGER 0x8D96 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_BUFFER_ACCESS 0x88BB -#define GL_BUFFER_ACCESS_FLAGS 0x911F -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_LENGTH 0x9120 -#define GL_BUFFER_MAP_OFFSET 0x9121 -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_BYTE 0x1400 -#define GL_CCW 0x0901 -#define GL_CLAMP_READ_COLOR 0x891C -#define GL_CLAMP_TO_BORDER 0x812D -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_CLEAR 0x1500 -#define GL_CLIP_DISTANCE0 0x3000 -#define GL_CLIP_DISTANCE1 0x3001 -#define GL_CLIP_DISTANCE2 0x3002 -#define GL_CLIP_DISTANCE3 0x3003 -#define GL_CLIP_DISTANCE4 0x3004 -#define GL_CLIP_DISTANCE5 0x3005 -#define GL_CLIP_DISTANCE6 0x3006 -#define GL_CLIP_DISTANCE7 0x3007 -#define GL_COLOR 0x1800 -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_COLOR_ATTACHMENT1 0x8CE1 -#define GL_COLOR_ATTACHMENT10 0x8CEA -#define GL_COLOR_ATTACHMENT11 0x8CEB -#define GL_COLOR_ATTACHMENT12 0x8CEC -#define GL_COLOR_ATTACHMENT13 0x8CED -#define GL_COLOR_ATTACHMENT14 0x8CEE -#define GL_COLOR_ATTACHMENT15 0x8CEF -#define GL_COLOR_ATTACHMENT16 0x8CF0 -#define GL_COLOR_ATTACHMENT17 0x8CF1 -#define GL_COLOR_ATTACHMENT18 0x8CF2 -#define GL_COLOR_ATTACHMENT19 0x8CF3 -#define GL_COLOR_ATTACHMENT2 0x8CE2 -#define GL_COLOR_ATTACHMENT20 0x8CF4 -#define GL_COLOR_ATTACHMENT21 0x8CF5 -#define GL_COLOR_ATTACHMENT22 0x8CF6 -#define GL_COLOR_ATTACHMENT23 0x8CF7 -#define GL_COLOR_ATTACHMENT24 0x8CF8 -#define GL_COLOR_ATTACHMENT25 0x8CF9 -#define GL_COLOR_ATTACHMENT26 0x8CFA -#define GL_COLOR_ATTACHMENT27 0x8CFB -#define GL_COLOR_ATTACHMENT28 0x8CFC -#define GL_COLOR_ATTACHMENT29 0x8CFD -#define GL_COLOR_ATTACHMENT3 0x8CE3 -#define GL_COLOR_ATTACHMENT30 0x8CFE -#define GL_COLOR_ATTACHMENT31 0x8CFF -#define GL_COLOR_ATTACHMENT4 0x8CE4 -#define GL_COLOR_ATTACHMENT5 0x8CE5 -#define GL_COLOR_ATTACHMENT6 0x8CE6 -#define GL_COLOR_ATTACHMENT7 0x8CE7 -#define GL_COLOR_ATTACHMENT8 0x8CE8 -#define GL_COLOR_ATTACHMENT9 0x8CE9 -#define GL_COLOR_BUFFER_BIT 0x00004000 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_LOGIC_OP 0x0BF2 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_COMPARE_REF_TO_TEXTURE 0x884E -#define GL_COMPILE_STATUS 0x8B81 -#define GL_COMPRESSED_RED 0x8225 -#define GL_COMPRESSED_RED_RGTC1 0x8DBB -#define GL_COMPRESSED_RG 0x8226 -#define GL_COMPRESSED_RGB 0x84ED -#define GL_COMPRESSED_RGBA 0x84EE -#define GL_COMPRESSED_RG_RGTC2 0x8DBD -#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC -#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE -#define GL_COMPRESSED_SRGB 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_CONDITION_SATISFIED 0x911C -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_CONSTANT_COLOR 0x8001 -#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 -#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 -#define GL_CONTEXT_FLAGS 0x821E -#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 -#define GL_CONTEXT_PROFILE_MASK 0x9126 -#define GL_COPY 0x1503 -#define GL_COPY_INVERTED 0x150C -#define GL_COPY_READ_BUFFER 0x8F36 -#define GL_COPY_WRITE_BUFFER 0x8F37 -#define GL_CULL_FACE 0x0B44 -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_CURRENT_QUERY 0x8865 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_CW 0x0900 -#define GL_DECR 0x1E03 -#define GL_DECR_WRAP 0x8508 -#define GL_DELETE_STATUS 0x8B80 -#define GL_DEPTH 0x1801 -#define GL_DEPTH24_STENCIL8 0x88F0 -#define GL_DEPTH32F_STENCIL8 0x8CAD -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_DEPTH_CLAMP 0x864F -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_COMPONENT 0x1902 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_DEPTH_COMPONENT32 0x81A7 -#define GL_DEPTH_COMPONENT32F 0x8CAC -#define GL_DEPTH_FUNC 0x0B74 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_STENCIL 0x84F9 -#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A -#define GL_DEPTH_TEST 0x0B71 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DITHER 0x0BD0 -#define GL_DONT_CARE 0x1100 -#define GL_DOUBLE 0x140A -#define GL_DOUBLEBUFFER 0x0C32 -#define GL_DRAW_BUFFER 0x0C01 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_FRAMEBUFFER 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_DST_ALPHA 0x0304 -#define GL_DST_COLOR 0x0306 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_EQUAL 0x0202 -#define GL_EQUIV 0x1509 -#define GL_EXTENSIONS 0x1F03 -#define GL_FALSE 0 -#define GL_FASTEST 0x1101 -#define GL_FILL 0x1B02 -#define GL_FIRST_VERTEX_CONVENTION 0x8E4D -#define GL_FIXED_ONLY 0x891D -#define GL_FLOAT 0x1406 -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT2x3 0x8B65 -#define GL_FLOAT_MAT2x4 0x8B66 -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT3x2 0x8B67 -#define GL_FLOAT_MAT3x4 0x8B68 -#define GL_FLOAT_MAT4 0x8B5C -#define GL_FLOAT_MAT4x2 0x8B69 -#define GL_FLOAT_MAT4x3 0x8B6A -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_FRAMEBUFFER 0x8D40 -#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 -#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 -#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 -#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 -#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 -#define GL_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_DEFAULT 0x8218 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC -#define GL_FRAMEBUFFER_SRGB 0x8DB9 -#define GL_FRAMEBUFFER_UNDEFINED 0x8219 -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD -#define GL_FRONT 0x0404 -#define GL_FRONT_AND_BACK 0x0408 -#define GL_FRONT_FACE 0x0B46 -#define GL_FRONT_LEFT 0x0400 -#define GL_FRONT_RIGHT 0x0401 -#define GL_FUNC_ADD 0x8006 -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_FUNC_SUBTRACT 0x800A -#define GL_GEOMETRY_INPUT_TYPE 0x8917 -#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 -#define GL_GEOMETRY_SHADER 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT 0x8916 -#define GL_GEQUAL 0x0206 -#define GL_GREATER 0x0204 -#define GL_GREEN 0x1904 -#define GL_GREEN_INTEGER 0x8D95 -#define GL_HALF_FLOAT 0x140B -#define GL_INCR 0x1E02 -#define GL_INCR_WRAP 0x8507 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_INT 0x1404 -#define GL_INTERLEAVED_ATTRIBS 0x8C8C -#define GL_INT_2_10_10_10_REV 0x8D9F -#define GL_INT_SAMPLER_1D 0x8DC9 -#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE -#define GL_INT_SAMPLER_2D 0x8DCA -#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF -#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 -#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C -#define GL_INT_SAMPLER_2D_RECT 0x8DCD -#define GL_INT_SAMPLER_3D 0x8DCB -#define GL_INT_SAMPLER_BUFFER 0x8DD0 -#define GL_INT_SAMPLER_CUBE 0x8DCC -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 -#define GL_INVALID_INDEX 0xFFFFFFFF -#define GL_INVALID_OPERATION 0x0502 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVERT 0x150A -#define GL_KEEP 0x1E00 -#define GL_LAST_VERTEX_CONVENTION 0x8E4E -#define GL_LEFT 0x0406 -#define GL_LEQUAL 0x0203 -#define GL_LESS 0x0201 -#define GL_LINE 0x1B01 -#define GL_LINEAR 0x2601 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_LINES 0x0001 -#define GL_LINES_ADJACENCY 0x000A -#define GL_LINE_LOOP 0x0002 -#define GL_LINE_SMOOTH 0x0B20 -#define GL_LINE_SMOOTH_HINT 0x0C52 -#define GL_LINE_STRIP 0x0003 -#define GL_LINE_STRIP_ADJACENCY 0x000B -#define GL_LINE_WIDTH 0x0B21 -#define GL_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_LINE_WIDTH_RANGE 0x0B22 -#define GL_LINK_STATUS 0x8B82 -#define GL_LOGIC_OP_MODE 0x0BF0 -#define GL_LOWER_LEFT 0x8CA1 -#define GL_MAJOR_VERSION 0x821B -#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 -#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 -#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAX 0x8008 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF -#define GL_MAX_CLIP_DISTANCES 0x0D32 -#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF -#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E -#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E -#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 -#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF -#define GL_MAX_INTEGER_SAMPLES 0x9110 -#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 -#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 -#define GL_MAX_SAMPLES 0x8D57 -#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 -#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 -#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 -#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 -#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F -#define GL_MAX_VARYING_COMPONENTS 0x8B4B -#define GL_MAX_VARYING_FLOATS 0x8B4B -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_MIN 0x8007 -#define GL_MINOR_VERSION 0x821C -#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_MULTISAMPLE 0x809D -#define GL_NAND 0x150E -#define GL_NEAREST 0x2600 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_NEVER 0x0200 -#define GL_NICEST 0x1102 -#define GL_NONE 0 -#define GL_NOOP 0x1505 -#define GL_NOR 0x1508 -#define GL_NOTEQUAL 0x0205 -#define GL_NO_ERROR 0 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_NUM_EXTENSIONS 0x821D -#define GL_OBJECT_TYPE 0x9112 -#define GL_ONE 1 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB -#define GL_ONE_MINUS_SRC1_COLOR 0x88FA -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_OR 0x1507 -#define GL_OR_INVERTED 0x150D -#define GL_OR_REVERSE 0x150B -#define GL_OUT_OF_MEMORY 0x0505 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_PACK_LSB_FIRST 0x0D01 -#define GL_PACK_ROW_LENGTH 0x0D02 -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_SKIP_PIXELS 0x0D04 -#define GL_PACK_SKIP_ROWS 0x0D03 -#define GL_PACK_SWAP_BYTES 0x0D00 -#define GL_PIXEL_PACK_BUFFER 0x88EB -#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED -#define GL_PIXEL_UNPACK_BUFFER 0x88EC -#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF -#define GL_POINT 0x1B00 -#define GL_POINTS 0x0000 -#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_POINT_SIZE 0x0B11 -#define GL_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_POINT_SIZE_RANGE 0x0B12 -#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 -#define GL_POLYGON_MODE 0x0B40 -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_POLYGON_OFFSET_FILL 0x8037 -#define GL_POLYGON_OFFSET_LINE 0x2A02 -#define GL_POLYGON_OFFSET_POINT 0x2A01 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_POLYGON_SMOOTH 0x0B41 -#define GL_POLYGON_SMOOTH_HINT 0x0C53 -#define GL_PRIMITIVES_GENERATED 0x8C87 -#define GL_PRIMITIVE_RESTART 0x8F9D -#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E -#define GL_PROGRAM_POINT_SIZE 0x8642 -#define GL_PROVOKING_VERTEX 0x8E4F -#define GL_PROXY_TEXTURE_1D 0x8063 -#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 -#define GL_PROXY_TEXTURE_2D 0x8064 -#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B -#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C -#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 -#define GL_QUERY_BY_REGION_WAIT 0x8E15 -#define GL_QUERY_COUNTER_BITS 0x8864 -#define GL_QUERY_NO_WAIT 0x8E14 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_QUERY_WAIT 0x8E13 -#define GL_R11F_G11F_B10F 0x8C3A -#define GL_R16 0x822A -#define GL_R16F 0x822D -#define GL_R16I 0x8233 -#define GL_R16UI 0x8234 -#define GL_R16_SNORM 0x8F98 -#define GL_R32F 0x822E -#define GL_R32I 0x8235 -#define GL_R32UI 0x8236 -#define GL_R3_G3_B2 0x2A10 -#define GL_R8 0x8229 -#define GL_R8I 0x8231 -#define GL_R8UI 0x8232 -#define GL_R8_SNORM 0x8F94 -#define GL_RASTERIZER_DISCARD 0x8C89 -#define GL_READ_BUFFER 0x0C02 -#define GL_READ_FRAMEBUFFER 0x8CA8 -#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA -#define GL_READ_ONLY 0x88B8 -#define GL_READ_WRITE 0x88BA -#define GL_RED 0x1903 -#define GL_RED_INTEGER 0x8D94 -#define GL_RENDERBUFFER 0x8D41 -#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 -#define GL_RENDERBUFFER_BINDING 0x8CA7 -#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 -#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 -#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 -#define GL_RENDERBUFFER_RED_SIZE 0x8D50 -#define GL_RENDERBUFFER_SAMPLES 0x8CAB -#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERER 0x1F01 -#define GL_REPEAT 0x2901 -#define GL_REPLACE 0x1E01 -#define GL_RG 0x8227 -#define GL_RG16 0x822C -#define GL_RG16F 0x822F -#define GL_RG16I 0x8239 -#define GL_RG16UI 0x823A -#define GL_RG16_SNORM 0x8F99 -#define GL_RG32F 0x8230 -#define GL_RG32I 0x823B -#define GL_RG32UI 0x823C -#define GL_RG8 0x822B -#define GL_RG8I 0x8237 -#define GL_RG8UI 0x8238 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGB 0x1907 -#define GL_RGB10 0x8052 -#define GL_RGB10_A2 0x8059 -#define GL_RGB10_A2UI 0x906F -#define GL_RGB12 0x8053 -#define GL_RGB16 0x8054 -#define GL_RGB16F 0x881B -#define GL_RGB16I 0x8D89 -#define GL_RGB16UI 0x8D77 -#define GL_RGB16_SNORM 0x8F9A -#define GL_RGB32F 0x8815 -#define GL_RGB32I 0x8D83 -#define GL_RGB32UI 0x8D71 -#define GL_RGB4 0x804F -#define GL_RGB5 0x8050 -#define GL_RGB5_A1 0x8057 -#define GL_RGB8 0x8051 -#define GL_RGB8I 0x8D8F -#define GL_RGB8UI 0x8D7D -#define GL_RGB8_SNORM 0x8F96 -#define GL_RGB9_E5 0x8C3D -#define GL_RGBA 0x1908 -#define GL_RGBA12 0x805A -#define GL_RGBA16 0x805B -#define GL_RGBA16F 0x881A -#define GL_RGBA16I 0x8D88 -#define GL_RGBA16UI 0x8D76 -#define GL_RGBA16_SNORM 0x8F9B -#define GL_RGBA2 0x8055 -#define GL_RGBA32F 0x8814 -#define GL_RGBA32I 0x8D82 -#define GL_RGBA32UI 0x8D70 -#define GL_RGBA4 0x8056 -#define GL_RGBA8 0x8058 -#define GL_RGBA8I 0x8D8E -#define GL_RGBA8UI 0x8D7C -#define GL_RGBA8_SNORM 0x8F97 -#define GL_RGBA_INTEGER 0x8D99 -#define GL_RGB_INTEGER 0x8D98 -#define GL_RG_INTEGER 0x8228 -#define GL_RIGHT 0x0407 -#define GL_SAMPLER_1D 0x8B5D -#define GL_SAMPLER_1D_ARRAY 0x8DC0 -#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 -#define GL_SAMPLER_1D_SHADOW 0x8B61 -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_2D_ARRAY 0x8DC1 -#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 -#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 -#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B -#define GL_SAMPLER_2D_RECT 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_BINDING 0x8919 -#define GL_SAMPLER_BUFFER 0x8DC2 -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLES_PASSED 0x8914 -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE 0x809F -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_MASK 0x8E51 -#define GL_SAMPLE_MASK_VALUE 0x8E52 -#define GL_SAMPLE_POSITION 0x8E50 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_SEPARATE_ATTRIBS 0x8C8D -#define GL_SET 0x150F -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_SHADER_TYPE 0x8B4F -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_SHORT 0x1402 -#define GL_SIGNALED 0x9119 -#define GL_SIGNED_NORMALIZED 0x8F9C -#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SRC1_ALPHA 0x8589 -#define GL_SRC1_COLOR 0x88F9 -#define GL_SRC_ALPHA 0x0302 -#define GL_SRC_ALPHA_SATURATE 0x0308 -#define GL_SRC_COLOR 0x0300 -#define GL_SRGB 0x8C40 -#define GL_SRGB8 0x8C41 -#define GL_SRGB8_ALPHA8 0x8C43 -#define GL_SRGB_ALPHA 0x8C42 -#define GL_STATIC_COPY 0x88E6 -#define GL_STATIC_DRAW 0x88E4 -#define GL_STATIC_READ 0x88E5 -#define GL_STENCIL 0x1802 -#define GL_STENCIL_ATTACHMENT 0x8D20 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 -#define GL_STENCIL_BUFFER_BIT 0x00000400 -#define GL_STENCIL_CLEAR_VALUE 0x0B91 -#define GL_STENCIL_FAIL 0x0B94 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_INDEX 0x1901 -#define GL_STENCIL_INDEX1 0x8D46 -#define GL_STENCIL_INDEX16 0x8D49 -#define GL_STENCIL_INDEX4 0x8D47 -#define GL_STENCIL_INDEX8 0x8D48 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_TEST 0x0B90 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_STEREO 0x0C33 -#define GL_STREAM_COPY 0x88E2 -#define GL_STREAM_DRAW 0x88E0 -#define GL_STREAM_READ 0x88E1 -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_SYNC_CONDITION 0x9113 -#define GL_SYNC_FENCE 0x9116 -#define GL_SYNC_FLAGS 0x9115 -#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 -#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 -#define GL_SYNC_STATUS 0x9114 -#define GL_TEXTURE 0x1702 -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_1D_ARRAY 0x8C18 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 -#define GL_TEXTURE_3D 0x806F -#define GL_TEXTURE_ALPHA_SIZE 0x805F -#define GL_TEXTURE_ALPHA_TYPE 0x8C13 -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_BINDING_1D 0x8068 -#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C -#define GL_TEXTURE_BINDING_2D 0x8069 -#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_TEXTURE_BINDING_BUFFER 0x8C2C -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 -#define GL_TEXTURE_BLUE_SIZE 0x805E -#define GL_TEXTURE_BLUE_TYPE 0x8C12 -#define GL_TEXTURE_BORDER_COLOR 0x1004 -#define GL_TEXTURE_BUFFER 0x8C2A -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPRESSED 0x86A1 -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 -#define GL_TEXTURE_COMPRESSION_HINT 0x84EF -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_DEPTH_SIZE 0x884A -#define GL_TEXTURE_DEPTH_TYPE 0x8C16 -#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 -#define GL_TEXTURE_GREEN_SIZE 0x805D -#define GL_TEXTURE_GREEN_TYPE 0x8C11 -#define GL_TEXTURE_HEIGHT 0x1001 -#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 -#define GL_TEXTURE_LOD_BIAS 0x8501 -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_RECTANGLE 0x84F5 -#define GL_TEXTURE_RED_SIZE 0x805C -#define GL_TEXTURE_RED_TYPE 0x8C10 -#define GL_TEXTURE_SAMPLES 0x9106 -#define GL_TEXTURE_SHARED_SIZE 0x8C3F -#define GL_TEXTURE_STENCIL_SIZE 0x88F1 -#define GL_TEXTURE_SWIZZLE_A 0x8E45 -#define GL_TEXTURE_SWIZZLE_B 0x8E44 -#define GL_TEXTURE_SWIZZLE_G 0x8E43 -#define GL_TEXTURE_SWIZZLE_R 0x8E42 -#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 -#define GL_TEXTURE_WIDTH 0x1000 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 -#define GL_TIMEOUT_EXPIRED 0x911B -#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF -#define GL_TIMESTAMP 0x8E28 -#define GL_TIME_ELAPSED 0x88BF -#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 -#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLES_ADJACENCY 0x000C -#define GL_TRIANGLE_FAN 0x0006 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D -#define GL_TRUE 1 -#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 -#define GL_UNIFORM_BLOCK_BINDING 0x8A3F -#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 -#define GL_UNIFORM_BLOCK_INDEX 0x8A3A -#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 -#define GL_UNIFORM_BUFFER 0x8A11 -#define GL_UNIFORM_BUFFER_BINDING 0x8A28 -#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 -#define GL_UNIFORM_BUFFER_SIZE 0x8A2A -#define GL_UNIFORM_BUFFER_START 0x8A29 -#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E -#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D -#define GL_UNIFORM_NAME_LENGTH 0x8A39 -#define GL_UNIFORM_OFFSET 0x8A3B -#define GL_UNIFORM_SIZE 0x8A38 -#define GL_UNIFORM_TYPE 0x8A37 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_UNPACK_LSB_FIRST 0x0CF1 -#define GL_UNPACK_ROW_LENGTH 0x0CF2 -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_SKIP_PIXELS 0x0CF4 -#define GL_UNPACK_SKIP_ROWS 0x0CF3 -#define GL_UNPACK_SWAP_BYTES 0x0CF0 -#define GL_UNSIGNALED 0x9118 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_INT 0x1405 -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_UNSIGNED_INT_24_8 0x84FA -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 -#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 -#define GL_UNSIGNED_INT_VEC2 0x8DC6 -#define GL_UNSIGNED_INT_VEC3 0x8DC7 -#define GL_UNSIGNED_INT_VEC4 0x8DC8 -#define GL_UNSIGNED_NORMALIZED 0x8C17 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_VENDOR 0x1F00 -#define GL_VERSION 0x1F02 -#define GL_VERTEX_ARRAY_BINDING 0x85B5 -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_VIEWPORT 0x0BA2 -#define GL_WAIT_FAILED 0x911D -#define GL_WRITE_ONLY 0x88B9 -#define GL_XOR 0x1506 -#define GL_ZERO 0 - - -#ifndef __khrplatform_h_ -#define __khrplatform_h_ - -/* -** Copyright (c) 2008-2018 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -/* Khronos platform-specific types and definitions. - * - * The master copy of khrplatform.h is maintained in the Khronos EGL - * Registry repository at https://github.com/KhronosGroup/EGL-Registry - * The last semantic modification to khrplatform.h was at commit ID: - * 67a3e0864c2d75ea5287b9f3d2eb74a745936692 - * - * Adopters may modify this file to suit their platform. Adopters are - * encouraged to submit platform specific modifications to the Khronos - * group so that they can be included in future versions of this file. - * Please submit changes by filing pull requests or issues on - * the EGL Registry repository linked above. - * - * - * See the Implementer's Guidelines for information about where this file - * should be located on your system and for more details of its use: - * http://www.khronos.org/registry/implementers_guide.pdf - * - * This file should be included as - * #include - * by Khronos client API header files that use its types and defines. - * - * The types in khrplatform.h should only be used to define API-specific types. - * - * Types defined in khrplatform.h: - * khronos_int8_t signed 8 bit - * khronos_uint8_t unsigned 8 bit - * khronos_int16_t signed 16 bit - * khronos_uint16_t unsigned 16 bit - * khronos_int32_t signed 32 bit - * khronos_uint32_t unsigned 32 bit - * khronos_int64_t signed 64 bit - * khronos_uint64_t unsigned 64 bit - * khronos_intptr_t signed same number of bits as a pointer - * khronos_uintptr_t unsigned same number of bits as a pointer - * khronos_ssize_t signed size - * khronos_usize_t unsigned size - * khronos_float_t signed 32 bit floating point - * khronos_time_ns_t unsigned 64 bit time in nanoseconds - * khronos_utime_nanoseconds_t unsigned time interval or absolute time in - * nanoseconds - * khronos_stime_nanoseconds_t signed time interval in nanoseconds - * khronos_boolean_enum_t enumerated boolean type. This should - * only be used as a base type when a client API's boolean type is - * an enum. Client APIs which use an integer or other type for - * booleans cannot use this as the base type for their boolean. - * - * Tokens defined in khrplatform.h: - * - * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. - * - * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. - * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. - * - * Calling convention macros defined in this file: - * KHRONOS_APICALL - * KHRONOS_GLAD_API_PTR - * KHRONOS_APIATTRIBUTES - * - * These may be used in function prototypes as: - * - * KHRONOS_APICALL void KHRONOS_GLAD_API_PTR funcname( - * int arg1, - * int arg2) KHRONOS_APIATTRIBUTES; - */ - -#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC) -# define KHRONOS_STATIC 1 -#endif - -/*------------------------------------------------------------------------- - * Definition of KHRONOS_APICALL - *------------------------------------------------------------------------- - * This precedes the return type of the function in the function prototype. - */ -#if defined(KHRONOS_STATIC) - /* If the preprocessor constant KHRONOS_STATIC is defined, make the - * header compatible with static linking. */ -# define KHRONOS_APICALL -#elif defined(_WIN32) -# define KHRONOS_APICALL __declspec(dllimport) -#elif defined (__SYMBIAN32__) -# define KHRONOS_APICALL IMPORT_C -#elif defined(__ANDROID__) -# define KHRONOS_APICALL __attribute__((visibility("default"))) -#else -# define KHRONOS_APICALL -#endif - -/*------------------------------------------------------------------------- - * Definition of KHRONOS_GLAD_API_PTR - *------------------------------------------------------------------------- - * This follows the return type of the function and precedes the function - * name in the function prototype. - */ -#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) - /* Win32 but not WinCE */ -# define KHRONOS_GLAD_API_PTR __stdcall -#else -# define KHRONOS_GLAD_API_PTR -#endif - -/*------------------------------------------------------------------------- - * Definition of KHRONOS_APIATTRIBUTES - *------------------------------------------------------------------------- - * This follows the closing parenthesis of the function prototype arguments. - */ -#if defined (__ARMCC_2__) -#define KHRONOS_APIATTRIBUTES __softfp -#else -#define KHRONOS_APIATTRIBUTES -#endif - -/*------------------------------------------------------------------------- - * basic type definitions - *-----------------------------------------------------------------------*/ -#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) - - -/* - * Using - */ -#include -typedef int32_t khronos_int32_t; -typedef uint32_t khronos_uint32_t; -typedef int64_t khronos_int64_t; -typedef uint64_t khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 -/* - * To support platform where unsigned long cannot be used interchangeably with - * inptr_t (e.g. CHERI-extended ISAs), we can use the stdint.h intptr_t. - * Ideally, we could just use (u)intptr_t everywhere, but this could result in - * ABI breakage if khronos_uintptr_t is changed from unsigned long to - * unsigned long long or similar (this results in different C++ name mangling). - * To avoid changes for existing platforms, we restrict usage of intptr_t to - * platforms where the size of a pointer is larger than the size of long. - */ -#if defined(__SIZEOF_LONG__) && defined(__SIZEOF_POINTER__) -#if __SIZEOF_POINTER__ > __SIZEOF_LONG__ -#define KHRONOS_USE_INTPTR_T -#endif -#endif - -#elif defined(__VMS ) || defined(__sgi) - -/* - * Using - */ -#include -typedef int32_t khronos_int32_t; -typedef uint32_t khronos_uint32_t; -typedef int64_t khronos_int64_t; -typedef uint64_t khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif defined(_WIN32) && !defined(__SCITECH_SNAP__) - -/* - * Win32 - */ -typedef __int32 khronos_int32_t; -typedef unsigned __int32 khronos_uint32_t; -typedef __int64 khronos_int64_t; -typedef unsigned __int64 khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif defined(__sun__) || defined(__digital__) - -/* - * Sun or Digital - */ -typedef int khronos_int32_t; -typedef unsigned int khronos_uint32_t; -#if defined(__arch64__) || defined(_LP64) -typedef long int khronos_int64_t; -typedef unsigned long int khronos_uint64_t; -#else -typedef long long int khronos_int64_t; -typedef unsigned long long int khronos_uint64_t; -#endif /* __arch64__ */ -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif 0 - -/* - * Hypothetical platform with no float or int64 support - */ -typedef int khronos_int32_t; -typedef unsigned int khronos_uint32_t; -#define KHRONOS_SUPPORT_INT64 0 -#define KHRONOS_SUPPORT_FLOAT 0 - -#else - -/* - * Generic fallback - */ -#include -typedef int32_t khronos_int32_t; -typedef uint32_t khronos_uint32_t; -typedef int64_t khronos_int64_t; -typedef uint64_t khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#endif - - -/* - * Types that are (so far) the same on all platforms - */ -typedef signed char khronos_int8_t; -typedef unsigned char khronos_uint8_t; -typedef signed short int khronos_int16_t; -typedef unsigned short int khronos_uint16_t; - -/* - * Types that differ between LLP64 and LP64 architectures - in LLP64, - * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears - * to be the only LLP64 architecture in current use. - */ -#ifdef KHRONOS_USE_INTPTR_T -typedef intptr_t khronos_intptr_t; -typedef uintptr_t khronos_uintptr_t; -#elif defined(_WIN64) -typedef signed long long int khronos_intptr_t; -typedef unsigned long long int khronos_uintptr_t; -#else -typedef signed long int khronos_intptr_t; -typedef unsigned long int khronos_uintptr_t; -#endif - -#if defined(_WIN64) -typedef signed long long int khronos_ssize_t; -typedef unsigned long long int khronos_usize_t; -#else -typedef signed long int khronos_ssize_t; -typedef unsigned long int khronos_usize_t; -#endif - -#if KHRONOS_SUPPORT_FLOAT -/* - * Float type - */ -typedef float khronos_float_t; -#endif - -#if KHRONOS_SUPPORT_INT64 -/* Time types - * - * These types can be used to represent a time interval in nanoseconds or - * an absolute Unadjusted System Time. Unadjusted System Time is the number - * of nanoseconds since some arbitrary system event (e.g. since the last - * time the system booted). The Unadjusted System Time is an unsigned - * 64 bit value that wraps back to 0 every 584 years. Time intervals - * may be either signed or unsigned. - */ -typedef khronos_uint64_t khronos_utime_nanoseconds_t; -typedef khronos_int64_t khronos_stime_nanoseconds_t; -#endif - -/* - * Dummy value used to pad enum types to 32 bits. - */ -#ifndef KHRONOS_MAX_ENUM -#define KHRONOS_MAX_ENUM 0x7FFFFFFF -#endif - -/* - * Enumerated boolean type - * - * Values other than zero should be considered to be true. Therefore - * comparisons should not be made against KHRONOS_TRUE. - */ -typedef enum { - KHRONOS_FALSE = 0, - KHRONOS_TRUE = 1, - KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM -} khronos_boolean_enum_t; - -#endif /* __khrplatform_h_ */ -typedef unsigned int GLenum; -typedef unsigned char GLboolean; -typedef unsigned int GLbitfield; -typedef void GLvoid; -typedef khronos_int8_t GLbyte; -typedef khronos_uint8_t GLubyte; -typedef khronos_int16_t GLshort; -typedef khronos_uint16_t GLushort; -typedef int GLint; -typedef unsigned int GLuint; -typedef khronos_int32_t GLclampx; -typedef int GLsizei; -typedef khronos_float_t GLfloat; -typedef khronos_float_t GLclampf; -typedef double GLdouble; -typedef double GLclampd; -typedef void *GLeglClientBufferEXT; -typedef void *GLeglImageOES; -typedef char GLchar; -typedef char GLcharARB; -#ifdef __APPLE__ -typedef void *GLhandleARB; -#else -typedef unsigned int GLhandleARB; -#endif -typedef khronos_uint16_t GLhalf; -typedef khronos_uint16_t GLhalfARB; -typedef khronos_int32_t GLfixed; -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) -typedef khronos_intptr_t GLintptr; -#else -typedef khronos_intptr_t GLintptr; -#endif -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) -typedef khronos_intptr_t GLintptrARB; -#else -typedef khronos_intptr_t GLintptrARB; -#endif -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) -typedef khronos_ssize_t GLsizeiptr; -#else -typedef khronos_ssize_t GLsizeiptr; -#endif -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) -typedef khronos_ssize_t GLsizeiptrARB; -#else -typedef khronos_ssize_t GLsizeiptrARB; -#endif -typedef khronos_int64_t GLint64; -typedef khronos_int64_t GLint64EXT; -typedef khronos_uint64_t GLuint64; -typedef khronos_uint64_t GLuint64EXT; -typedef struct __GLsync *GLsync; -struct _cl_context; -struct _cl_event; -typedef void (GLAD_API_PTR *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -typedef void (GLAD_API_PTR *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -typedef void (GLAD_API_PTR *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -typedef void (GLAD_API_PTR *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); -typedef unsigned short GLhalfNV; -typedef GLintptr GLvdpauSurfaceNV; -typedef void (GLAD_API_PTR *GLVULKANPROCNV)(void); - - -#define GL_VERSION_1_0 1 -GLAD_API_CALL int GLAD_GL_VERSION_1_0; -#define GL_VERSION_1_1 1 -GLAD_API_CALL int GLAD_GL_VERSION_1_1; -#define GL_VERSION_1_2 1 -GLAD_API_CALL int GLAD_GL_VERSION_1_2; -#define GL_VERSION_1_3 1 -GLAD_API_CALL int GLAD_GL_VERSION_1_3; -#define GL_VERSION_1_4 1 -GLAD_API_CALL int GLAD_GL_VERSION_1_4; -#define GL_VERSION_1_5 1 -GLAD_API_CALL int GLAD_GL_VERSION_1_5; -#define GL_VERSION_2_0 1 -GLAD_API_CALL int GLAD_GL_VERSION_2_0; -#define GL_VERSION_2_1 1 -GLAD_API_CALL int GLAD_GL_VERSION_2_1; -#define GL_VERSION_3_0 1 -GLAD_API_CALL int GLAD_GL_VERSION_3_0; -#define GL_VERSION_3_1 1 -GLAD_API_CALL int GLAD_GL_VERSION_3_1; -#define GL_VERSION_3_2 1 -GLAD_API_CALL int GLAD_GL_VERSION_3_2; -#define GL_VERSION_3_3 1 -GLAD_API_CALL int GLAD_GL_VERSION_3_3; - - -typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREPROC)(GLenum texture); -typedef void (GLAD_API_PTR *PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader); -typedef void (GLAD_API_PTR *PFNGLBEGINCONDITIONALRENDERPROC)(GLuint id, GLenum mode); -typedef void (GLAD_API_PTR *PFNGLBEGINQUERYPROC)(GLenum target, GLuint id); -typedef void (GLAD_API_PTR *PFNGLBEGINTRANSFORMFEEDBACKPROC)(GLenum primitiveMode); -typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar * name); -typedef void (GLAD_API_PTR *PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer); -typedef void (GLAD_API_PTR *PFNGLBINDBUFFERBASEPROC)(GLenum target, GLuint index, GLuint buffer); -typedef void (GLAD_API_PTR *PFNGLBINDBUFFERRANGEPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONPROC)(GLuint program, GLuint color, const GLchar * name); -typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)(GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); -typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer); -typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer); -typedef void (GLAD_API_PTR *PFNGLBINDSAMPLERPROC)(GLuint unit, GLuint sampler); -typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture); -typedef void (GLAD_API_PTR *PFNGLBINDVERTEXARRAYPROC)(GLuint array); -typedef void (GLAD_API_PTR *PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONPROC)(GLenum mode); -typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha); -typedef void (GLAD_API_PTR *PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor); -typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef void (GLAD_API_PTR *PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void * data, GLenum usage); -typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void * data); -typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target); -typedef void (GLAD_API_PTR *PFNGLCLAMPCOLORPROC)(GLenum target, GLenum clamp); -typedef void (GLAD_API_PTR *PFNGLCLEARPROC)(GLbitfield mask); -typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFIPROC)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFVPROC)(GLenum buffer, GLint drawbuffer, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERIVPROC)(GLenum buffer, GLint drawbuffer, const GLint * value); -typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERUIVPROC)(GLenum buffer, GLint drawbuffer, const GLuint * value); -typedef void (GLAD_API_PTR *PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHPROC)(GLdouble depth); -typedef void (GLAD_API_PTR *PFNGLCLEARSTENCILPROC)(GLint s); -typedef GLenum (GLAD_API_PTR *PFNGLCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (GLAD_API_PTR *PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -typedef void (GLAD_API_PTR *PFNGLCOLORMASKIPROC)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERPROC)(GLuint shader); -typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void * data); -typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * data); -typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE3DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void * data); -typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * data); -typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data); -typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * data); -typedef void (GLAD_API_PTR *PFNGLCOPYBUFFERSUBDATAPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef GLuint (GLAD_API_PTR *PFNGLCREATEPROGRAMPROC)(void); -typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROC)(GLenum type); -typedef void (GLAD_API_PTR *PFNGLCULLFACEPROC)(GLenum mode); -typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint * buffers); -typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint * framebuffers); -typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPROC)(GLuint program); -typedef void (GLAD_API_PTR *PFNGLDELETEQUERIESPROC)(GLsizei n, const GLuint * ids); -typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint * renderbuffers); -typedef void (GLAD_API_PTR *PFNGLDELETESAMPLERSPROC)(GLsizei count, const GLuint * samplers); -typedef void (GLAD_API_PTR *PFNGLDELETESHADERPROC)(GLuint shader); -typedef void (GLAD_API_PTR *PFNGLDELETESYNCPROC)(GLsync sync); -typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint * textures); -typedef void (GLAD_API_PTR *PFNGLDELETEVERTEXARRAYSPROC)(GLsizei n, const GLuint * arrays); -typedef void (GLAD_API_PTR *PFNGLDEPTHFUNCPROC)(GLenum func); -typedef void (GLAD_API_PTR *PFNGLDEPTHMASKPROC)(GLboolean flag); -typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEPROC)(GLdouble n, GLdouble f); -typedef void (GLAD_API_PTR *PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader); -typedef void (GLAD_API_PTR *PFNGLDISABLEPROC)(GLenum cap); -typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index); -typedef void (GLAD_API_PTR *PFNGLDISABLEIPROC)(GLenum target, GLuint index); -typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count); -typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount); -typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERPROC)(GLenum buf); -typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERSPROC)(GLsizei n, const GLenum * bufs); -typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices); -typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLint basevertex); -typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount); -typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex); -typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices); -typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices, GLint basevertex); -typedef void (GLAD_API_PTR *PFNGLENABLEPROC)(GLenum cap); -typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index); -typedef void (GLAD_API_PTR *PFNGLENABLEIPROC)(GLenum target, GLuint index); -typedef void (GLAD_API_PTR *PFNGLENDCONDITIONALRENDERPROC)(void); -typedef void (GLAD_API_PTR *PFNGLENDQUERYPROC)(GLenum target); -typedef void (GLAD_API_PTR *PFNGLENDTRANSFORMFEEDBACKPROC)(void); -typedef GLsync (GLAD_API_PTR *PFNGLFENCESYNCPROC)(GLenum condition, GLbitfield flags); -typedef void (GLAD_API_PTR *PFNGLFINISHPROC)(void); -typedef void (GLAD_API_PTR *PFNGLFLUSHPROC)(void); -typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length); -typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (GLAD_API_PTR *PFNGLFRONTFACEPROC)(GLenum mode); -typedef void (GLAD_API_PTR *PFNGLGENBUFFERSPROC)(GLsizei n, GLuint * buffers); -typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers); -typedef void (GLAD_API_PTR *PFNGLGENQUERIESPROC)(GLsizei n, GLuint * ids); -typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint * renderbuffers); -typedef void (GLAD_API_PTR *PFNGLGENSAMPLERSPROC)(GLsizei count, GLuint * samplers); -typedef void (GLAD_API_PTR *PFNGLGENTEXTURESPROC)(GLsizei n, GLuint * textures); -typedef void (GLAD_API_PTR *PFNGLGENVERTEXARRAYSPROC)(GLsizei n, GLuint * arrays); -typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPPROC)(GLenum target); -typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); -typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); -typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformBlockName); -typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKIVPROC)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint * params); -typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMNAMEPROC)(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformName); -typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMSIVPROC)(GLuint program, GLsizei uniformCount, const GLuint * uniformIndices, GLenum pname, GLint * params); -typedef void (GLAD_API_PTR *PFNGLGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei * count, GLuint * shaders); -typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONPROC)(GLuint program, const GLchar * name); -typedef void (GLAD_API_PTR *PFNGLGETBOOLEANI_VPROC)(GLenum target, GLuint index, GLboolean * data); -typedef void (GLAD_API_PTR *PFNGLGETBOOLEANVPROC)(GLenum pname, GLboolean * data); -typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERI64VPROC)(GLenum target, GLenum pname, GLint64 * params); -typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); -typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void ** params); -typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, void * data); -typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void * img); -typedef void (GLAD_API_PTR *PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble * data); -typedef GLenum (GLAD_API_PTR *PFNGLGETERRORPROC)(void); -typedef void (GLAD_API_PTR *PFNGLGETFLOATVPROC)(GLenum pname, GLfloat * data); -typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATAINDEXPROC)(GLuint program, const GLchar * name); -typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATALOCATIONPROC)(GLuint program, const GLchar * name); -typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params); -typedef void (GLAD_API_PTR *PFNGLGETINTEGER64I_VPROC)(GLenum target, GLuint index, GLint64 * data); -typedef void (GLAD_API_PTR *PFNGLGETINTEGER64VPROC)(GLenum pname, GLint64 * data); -typedef void (GLAD_API_PTR *PFNGLGETINTEGERI_VPROC)(GLenum target, GLuint index, GLint * data); -typedef void (GLAD_API_PTR *PFNGLGETINTEGERVPROC)(GLenum pname, GLint * data); -typedef void (GLAD_API_PTR *PFNGLGETMULTISAMPLEFVPROC)(GLenum pname, GLuint index, GLfloat * val); -typedef void (GLAD_API_PTR *PFNGLGETPROGRAMINFOLOGPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog); -typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint * params); -typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTI64VPROC)(GLuint id, GLenum pname, GLint64 * params); -typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTIVPROC)(GLuint id, GLenum pname, GLint * params); -typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUI64VPROC)(GLuint id, GLenum pname, GLuint64 * params); -typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUIVPROC)(GLuint id, GLenum pname, GLuint * params); -typedef void (GLAD_API_PTR *PFNGLGETQUERYIVPROC)(GLenum target, GLenum pname, GLint * params); -typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); -typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, GLint * params); -typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, GLuint * params); -typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, GLfloat * params); -typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, GLint * params); -typedef void (GLAD_API_PTR *PFNGLGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog); -typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source); -typedef void (GLAD_API_PTR *PFNGLGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint * params); -typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGPROC)(GLenum name); -typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGIPROC)(GLenum name, GLuint index); -typedef void (GLAD_API_PTR *PFNGLGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei count, GLsizei * length, GLint * values); -typedef void (GLAD_API_PTR *PFNGLGETTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, void * pixels); -typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum target, GLint level, GLenum pname, GLfloat * params); -typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERIVPROC)(GLenum target, GLint level, GLenum pname, GLint * params); -typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, GLint * params); -typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, GLuint * params); -typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); -typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); -typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); -typedef GLuint (GLAD_API_PTR *PFNGLGETUNIFORMBLOCKINDEXPROC)(GLuint program, const GLchar * uniformBlockName); -typedef void (GLAD_API_PTR *PFNGLGETUNIFORMINDICESPROC)(GLuint program, GLsizei uniformCount, const GLchar *const* uniformNames, GLuint * uniformIndices); -typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar * name); -typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat * params); -typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint * params); -typedef void (GLAD_API_PTR *PFNGLGETUNIFORMUIVPROC)(GLuint program, GLint location, GLuint * params); -typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIIVPROC)(GLuint index, GLenum pname, GLint * params); -typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIUIVPROC)(GLuint index, GLenum pname, GLuint * params); -typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void ** pointer); -typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble * params); -typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat * params); -typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint * params); -typedef void (GLAD_API_PTR *PFNGLHINTPROC)(GLenum target, GLenum mode); -typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERPROC)(GLuint buffer); -typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDPROC)(GLenum cap); -typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDIPROC)(GLenum target, GLuint index); -typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer); -typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPROC)(GLuint program); -typedef GLboolean (GLAD_API_PTR *PFNGLISQUERYPROC)(GLuint id); -typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer); -typedef GLboolean (GLAD_API_PTR *PFNGLISSAMPLERPROC)(GLuint sampler); -typedef GLboolean (GLAD_API_PTR *PFNGLISSHADERPROC)(GLuint shader); -typedef GLboolean (GLAD_API_PTR *PFNGLISSYNCPROC)(GLsync sync); -typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREPROC)(GLuint texture); -typedef GLboolean (GLAD_API_PTR *PFNGLISVERTEXARRAYPROC)(GLuint array); -typedef void (GLAD_API_PTR *PFNGLLINEWIDTHPROC)(GLfloat width); -typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMPROC)(GLuint program); -typedef void (GLAD_API_PTR *PFNGLLOGICOPPROC)(GLenum opcode); -typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERPROC)(GLenum target, GLenum access); -typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSPROC)(GLenum mode, const GLint * first, const GLsizei * count, GLsizei drawcount); -typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount); -typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount, const GLint * basevertex); -typedef void (GLAD_API_PTR *PFNGLPIXELSTOREFPROC)(GLenum pname, GLfloat param); -typedef void (GLAD_API_PTR *PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param); -typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param); -typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVPROC)(GLenum pname, const GLfloat * params); -typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIPROC)(GLenum pname, GLint param); -typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIVPROC)(GLenum pname, const GLint * params); -typedef void (GLAD_API_PTR *PFNGLPOINTSIZEPROC)(GLfloat size); -typedef void (GLAD_API_PTR *PFNGLPOLYGONMODEPROC)(GLenum face, GLenum mode); -typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units); -typedef void (GLAD_API_PTR *PFNGLPRIMITIVERESTARTINDEXPROC)(GLuint index); -typedef void (GLAD_API_PTR *PFNGLPROVOKINGVERTEXPROC)(GLenum mode); -typedef void (GLAD_API_PTR *PFNGLQUERYCOUNTERPROC)(GLuint id, GLenum target); -typedef void (GLAD_API_PTR *PFNGLREADBUFFERPROC)(GLenum src); -typedef void (GLAD_API_PTR *PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void * pixels); -typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert); -typedef void (GLAD_API_PTR *PFNGLSAMPLEMASKIPROC)(GLuint maskNumber, GLbitfield mask); -typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, const GLint * param); -typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, const GLuint * param); -typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFPROC)(GLuint sampler, GLenum pname, GLfloat param); -typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, const GLfloat * param); -typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIPROC)(GLuint sampler, GLenum pname, GLint param); -typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, const GLint * param); -typedef void (GLAD_API_PTR *PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar *const* string, const GLint * length); -typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask); -typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCSEPARATEPROC)(GLenum face, GLenum func, GLint ref, GLuint mask); -typedef void (GLAD_API_PTR *PFNGLSTENCILMASKPROC)(GLuint mask); -typedef void (GLAD_API_PTR *PFNGLSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask); -typedef void (GLAD_API_PTR *PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass); -typedef void (GLAD_API_PTR *PFNGLSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (GLAD_API_PTR *PFNGLTEXBUFFERPROC)(GLenum target, GLenum internalformat, GLuint buffer); -typedef void (GLAD_API_PTR *PFNGLTEXIMAGE1DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void * pixels); -typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void * pixels); -typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void * pixels); -typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, const GLint * params); -typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, const GLuint * params); -typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat param); -typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params); -typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); -typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params); -typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); -typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); -typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels); -typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKVARYINGSPROC)(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); -typedef void (GLAD_API_PTR *PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0); -typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORM1IPROC)(GLint location, GLint v0); -typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIPROC)(GLint location, GLuint v0); -typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIVPROC)(GLint location, GLsizei count, const GLuint * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1); -typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1); -typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIPROC)(GLint location, GLuint v0, GLuint v1); -typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIVPROC)(GLint location, GLsizei count, const GLuint * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIVPROC)(GLint location, GLsizei count, const GLuint * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIVPROC)(GLint location, GLsizei count, const GLuint * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORMBLOCKBINDINGPROC)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); -typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); -typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERPROC)(GLenum target); -typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMPROC)(GLuint program); -typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPROC)(GLuint program); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DPROC)(GLuint index, GLdouble x); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SPROC)(GLuint index, GLshort x); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVPROC)(GLuint index, const GLshort * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVPROC)(GLuint index, const GLshort * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVPROC)(GLuint index, const GLshort * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NIVPROC)(GLuint index, const GLint * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4IVPROC)(GLuint index, const GLint * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVPROC)(GLuint index, const GLshort * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVPROC)(GLuint index, const GLushort * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBDIVISORPROC)(GLuint index, GLuint divisor); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IPROC)(GLuint index, GLint x); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IVPROC)(GLuint index, const GLint * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIPROC)(GLuint index, GLuint x); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIVPROC)(GLuint index, const GLuint * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IPROC)(GLuint index, GLint x, GLint y); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IVPROC)(GLuint index, const GLint * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIPROC)(GLuint index, GLuint x, GLuint y); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIVPROC)(GLuint index, const GLuint * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IPROC)(GLuint index, GLint x, GLint y, GLint z); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IVPROC)(GLuint index, const GLint * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIVPROC)(GLuint index, const GLuint * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4BVPROC)(GLuint index, const GLbyte * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IVPROC)(GLuint index, const GLint * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4SVPROC)(GLuint index, const GLshort * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UBVPROC)(GLuint index, const GLubyte * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIVPROC)(GLuint index, const GLuint * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4USVPROC)(GLuint index, const GLushort * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer); -typedef void (GLAD_API_PTR *PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAD_API_PTR *PFNGLWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); - -GLAD_API_CALL PFNGLACTIVETEXTUREPROC glad_glActiveTexture; -#define glActiveTexture glad_glActiveTexture -GLAD_API_CALL PFNGLATTACHSHADERPROC glad_glAttachShader; -#define glAttachShader glad_glAttachShader -GLAD_API_CALL PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender; -#define glBeginConditionalRender glad_glBeginConditionalRender -GLAD_API_CALL PFNGLBEGINQUERYPROC glad_glBeginQuery; -#define glBeginQuery glad_glBeginQuery -GLAD_API_CALL PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback; -#define glBeginTransformFeedback glad_glBeginTransformFeedback -GLAD_API_CALL PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation; -#define glBindAttribLocation glad_glBindAttribLocation -GLAD_API_CALL PFNGLBINDBUFFERPROC glad_glBindBuffer; -#define glBindBuffer glad_glBindBuffer -GLAD_API_CALL PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase; -#define glBindBufferBase glad_glBindBufferBase -GLAD_API_CALL PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange; -#define glBindBufferRange glad_glBindBufferRange -GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation; -#define glBindFragDataLocation glad_glBindFragDataLocation -GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed; -#define glBindFragDataLocationIndexed glad_glBindFragDataLocationIndexed -GLAD_API_CALL PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer; -#define glBindFramebuffer glad_glBindFramebuffer -GLAD_API_CALL PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer; -#define glBindRenderbuffer glad_glBindRenderbuffer -GLAD_API_CALL PFNGLBINDSAMPLERPROC glad_glBindSampler; -#define glBindSampler glad_glBindSampler -GLAD_API_CALL PFNGLBINDTEXTUREPROC glad_glBindTexture; -#define glBindTexture glad_glBindTexture -GLAD_API_CALL PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray; -#define glBindVertexArray glad_glBindVertexArray -GLAD_API_CALL PFNGLBLENDCOLORPROC glad_glBlendColor; -#define glBlendColor glad_glBlendColor -GLAD_API_CALL PFNGLBLENDEQUATIONPROC glad_glBlendEquation; -#define glBlendEquation glad_glBlendEquation -GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate; -#define glBlendEquationSeparate glad_glBlendEquationSeparate -GLAD_API_CALL PFNGLBLENDFUNCPROC glad_glBlendFunc; -#define glBlendFunc glad_glBlendFunc -GLAD_API_CALL PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate; -#define glBlendFuncSeparate glad_glBlendFuncSeparate -GLAD_API_CALL PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer; -#define glBlitFramebuffer glad_glBlitFramebuffer -GLAD_API_CALL PFNGLBUFFERDATAPROC glad_glBufferData; -#define glBufferData glad_glBufferData -GLAD_API_CALL PFNGLBUFFERSUBDATAPROC glad_glBufferSubData; -#define glBufferSubData glad_glBufferSubData -GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus; -#define glCheckFramebufferStatus glad_glCheckFramebufferStatus -GLAD_API_CALL PFNGLCLAMPCOLORPROC glad_glClampColor; -#define glClampColor glad_glClampColor -GLAD_API_CALL PFNGLCLEARPROC glad_glClear; -#define glClear glad_glClear -GLAD_API_CALL PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi; -#define glClearBufferfi glad_glClearBufferfi -GLAD_API_CALL PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv; -#define glClearBufferfv glad_glClearBufferfv -GLAD_API_CALL PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv; -#define glClearBufferiv glad_glClearBufferiv -GLAD_API_CALL PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv; -#define glClearBufferuiv glad_glClearBufferuiv -GLAD_API_CALL PFNGLCLEARCOLORPROC glad_glClearColor; -#define glClearColor glad_glClearColor -GLAD_API_CALL PFNGLCLEARDEPTHPROC glad_glClearDepth; -#define glClearDepth glad_glClearDepth -GLAD_API_CALL PFNGLCLEARSTENCILPROC glad_glClearStencil; -#define glClearStencil glad_glClearStencil -GLAD_API_CALL PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync; -#define glClientWaitSync glad_glClientWaitSync -GLAD_API_CALL PFNGLCOLORMASKPROC glad_glColorMask; -#define glColorMask glad_glColorMask -GLAD_API_CALL PFNGLCOLORMASKIPROC glad_glColorMaski; -#define glColorMaski glad_glColorMaski -GLAD_API_CALL PFNGLCOMPILESHADERPROC glad_glCompileShader; -#define glCompileShader glad_glCompileShader -GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D; -#define glCompressedTexImage1D glad_glCompressedTexImage1D -GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D; -#define glCompressedTexImage2D glad_glCompressedTexImage2D -GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D; -#define glCompressedTexImage3D glad_glCompressedTexImage3D -GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D; -#define glCompressedTexSubImage1D glad_glCompressedTexSubImage1D -GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D; -#define glCompressedTexSubImage2D glad_glCompressedTexSubImage2D -GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D; -#define glCompressedTexSubImage3D glad_glCompressedTexSubImage3D -GLAD_API_CALL PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData; -#define glCopyBufferSubData glad_glCopyBufferSubData -GLAD_API_CALL PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D; -#define glCopyTexImage1D glad_glCopyTexImage1D -GLAD_API_CALL PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D; -#define glCopyTexImage2D glad_glCopyTexImage2D -GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D; -#define glCopyTexSubImage1D glad_glCopyTexSubImage1D -GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D; -#define glCopyTexSubImage2D glad_glCopyTexSubImage2D -GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D; -#define glCopyTexSubImage3D glad_glCopyTexSubImage3D -GLAD_API_CALL PFNGLCREATEPROGRAMPROC glad_glCreateProgram; -#define glCreateProgram glad_glCreateProgram -GLAD_API_CALL PFNGLCREATESHADERPROC glad_glCreateShader; -#define glCreateShader glad_glCreateShader -GLAD_API_CALL PFNGLCULLFACEPROC glad_glCullFace; -#define glCullFace glad_glCullFace -GLAD_API_CALL PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers; -#define glDeleteBuffers glad_glDeleteBuffers -GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers; -#define glDeleteFramebuffers glad_glDeleteFramebuffers -GLAD_API_CALL PFNGLDELETEPROGRAMPROC glad_glDeleteProgram; -#define glDeleteProgram glad_glDeleteProgram -GLAD_API_CALL PFNGLDELETEQUERIESPROC glad_glDeleteQueries; -#define glDeleteQueries glad_glDeleteQueries -GLAD_API_CALL PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers; -#define glDeleteRenderbuffers glad_glDeleteRenderbuffers -GLAD_API_CALL PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers; -#define glDeleteSamplers glad_glDeleteSamplers -GLAD_API_CALL PFNGLDELETESHADERPROC glad_glDeleteShader; -#define glDeleteShader glad_glDeleteShader -GLAD_API_CALL PFNGLDELETESYNCPROC glad_glDeleteSync; -#define glDeleteSync glad_glDeleteSync -GLAD_API_CALL PFNGLDELETETEXTURESPROC glad_glDeleteTextures; -#define glDeleteTextures glad_glDeleteTextures -GLAD_API_CALL PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays; -#define glDeleteVertexArrays glad_glDeleteVertexArrays -GLAD_API_CALL PFNGLDEPTHFUNCPROC glad_glDepthFunc; -#define glDepthFunc glad_glDepthFunc -GLAD_API_CALL PFNGLDEPTHMASKPROC glad_glDepthMask; -#define glDepthMask glad_glDepthMask -GLAD_API_CALL PFNGLDEPTHRANGEPROC glad_glDepthRange; -#define glDepthRange glad_glDepthRange -GLAD_API_CALL PFNGLDETACHSHADERPROC glad_glDetachShader; -#define glDetachShader glad_glDetachShader -GLAD_API_CALL PFNGLDISABLEPROC glad_glDisable; -#define glDisable glad_glDisable -GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray; -#define glDisableVertexAttribArray glad_glDisableVertexAttribArray -GLAD_API_CALL PFNGLDISABLEIPROC glad_glDisablei; -#define glDisablei glad_glDisablei -GLAD_API_CALL PFNGLDRAWARRAYSPROC glad_glDrawArrays; -#define glDrawArrays glad_glDrawArrays -GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced; -#define glDrawArraysInstanced glad_glDrawArraysInstanced -GLAD_API_CALL PFNGLDRAWBUFFERPROC glad_glDrawBuffer; -#define glDrawBuffer glad_glDrawBuffer -GLAD_API_CALL PFNGLDRAWBUFFERSPROC glad_glDrawBuffers; -#define glDrawBuffers glad_glDrawBuffers -GLAD_API_CALL PFNGLDRAWELEMENTSPROC glad_glDrawElements; -#define glDrawElements glad_glDrawElements -GLAD_API_CALL PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex; -#define glDrawElementsBaseVertex glad_glDrawElementsBaseVertex -GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced; -#define glDrawElementsInstanced glad_glDrawElementsInstanced -GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex; -#define glDrawElementsInstancedBaseVertex glad_glDrawElementsInstancedBaseVertex -GLAD_API_CALL PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements; -#define glDrawRangeElements glad_glDrawRangeElements -GLAD_API_CALL PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex; -#define glDrawRangeElementsBaseVertex glad_glDrawRangeElementsBaseVertex -GLAD_API_CALL PFNGLENABLEPROC glad_glEnable; -#define glEnable glad_glEnable -GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray; -#define glEnableVertexAttribArray glad_glEnableVertexAttribArray -GLAD_API_CALL PFNGLENABLEIPROC glad_glEnablei; -#define glEnablei glad_glEnablei -GLAD_API_CALL PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender; -#define glEndConditionalRender glad_glEndConditionalRender -GLAD_API_CALL PFNGLENDQUERYPROC glad_glEndQuery; -#define glEndQuery glad_glEndQuery -GLAD_API_CALL PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback; -#define glEndTransformFeedback glad_glEndTransformFeedback -GLAD_API_CALL PFNGLFENCESYNCPROC glad_glFenceSync; -#define glFenceSync glad_glFenceSync -GLAD_API_CALL PFNGLFINISHPROC glad_glFinish; -#define glFinish glad_glFinish -GLAD_API_CALL PFNGLFLUSHPROC glad_glFlush; -#define glFlush glad_glFlush -GLAD_API_CALL PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange; -#define glFlushMappedBufferRange glad_glFlushMappedBufferRange -GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer; -#define glFramebufferRenderbuffer glad_glFramebufferRenderbuffer -GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture; -#define glFramebufferTexture glad_glFramebufferTexture -GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D; -#define glFramebufferTexture1D glad_glFramebufferTexture1D -GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D; -#define glFramebufferTexture2D glad_glFramebufferTexture2D -GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D; -#define glFramebufferTexture3D glad_glFramebufferTexture3D -GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer; -#define glFramebufferTextureLayer glad_glFramebufferTextureLayer -GLAD_API_CALL PFNGLFRONTFACEPROC glad_glFrontFace; -#define glFrontFace glad_glFrontFace -GLAD_API_CALL PFNGLGENBUFFERSPROC glad_glGenBuffers; -#define glGenBuffers glad_glGenBuffers -GLAD_API_CALL PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers; -#define glGenFramebuffers glad_glGenFramebuffers -GLAD_API_CALL PFNGLGENQUERIESPROC glad_glGenQueries; -#define glGenQueries glad_glGenQueries -GLAD_API_CALL PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers; -#define glGenRenderbuffers glad_glGenRenderbuffers -GLAD_API_CALL PFNGLGENSAMPLERSPROC glad_glGenSamplers; -#define glGenSamplers glad_glGenSamplers -GLAD_API_CALL PFNGLGENTEXTURESPROC glad_glGenTextures; -#define glGenTextures glad_glGenTextures -GLAD_API_CALL PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays; -#define glGenVertexArrays glad_glGenVertexArrays -GLAD_API_CALL PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap; -#define glGenerateMipmap glad_glGenerateMipmap -GLAD_API_CALL PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib; -#define glGetActiveAttrib glad_glGetActiveAttrib -GLAD_API_CALL PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform; -#define glGetActiveUniform glad_glGetActiveUniform -GLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName; -#define glGetActiveUniformBlockName glad_glGetActiveUniformBlockName -GLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv; -#define glGetActiveUniformBlockiv glad_glGetActiveUniformBlockiv -GLAD_API_CALL PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName; -#define glGetActiveUniformName glad_glGetActiveUniformName -GLAD_API_CALL PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv; -#define glGetActiveUniformsiv glad_glGetActiveUniformsiv -GLAD_API_CALL PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders; -#define glGetAttachedShaders glad_glGetAttachedShaders -GLAD_API_CALL PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation; -#define glGetAttribLocation glad_glGetAttribLocation -GLAD_API_CALL PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v; -#define glGetBooleani_v glad_glGetBooleani_v -GLAD_API_CALL PFNGLGETBOOLEANVPROC glad_glGetBooleanv; -#define glGetBooleanv glad_glGetBooleanv -GLAD_API_CALL PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v; -#define glGetBufferParameteri64v glad_glGetBufferParameteri64v -GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv; -#define glGetBufferParameteriv glad_glGetBufferParameteriv -GLAD_API_CALL PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv; -#define glGetBufferPointerv glad_glGetBufferPointerv -GLAD_API_CALL PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData; -#define glGetBufferSubData glad_glGetBufferSubData -GLAD_API_CALL PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage; -#define glGetCompressedTexImage glad_glGetCompressedTexImage -GLAD_API_CALL PFNGLGETDOUBLEVPROC glad_glGetDoublev; -#define glGetDoublev glad_glGetDoublev -GLAD_API_CALL PFNGLGETERRORPROC glad_glGetError; -#define glGetError glad_glGetError -GLAD_API_CALL PFNGLGETFLOATVPROC glad_glGetFloatv; -#define glGetFloatv glad_glGetFloatv -GLAD_API_CALL PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex; -#define glGetFragDataIndex glad_glGetFragDataIndex -GLAD_API_CALL PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation; -#define glGetFragDataLocation glad_glGetFragDataLocation -GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv; -#define glGetFramebufferAttachmentParameteriv glad_glGetFramebufferAttachmentParameteriv -GLAD_API_CALL PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v; -#define glGetInteger64i_v glad_glGetInteger64i_v -GLAD_API_CALL PFNGLGETINTEGER64VPROC glad_glGetInteger64v; -#define glGetInteger64v glad_glGetInteger64v -GLAD_API_CALL PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v; -#define glGetIntegeri_v glad_glGetIntegeri_v -GLAD_API_CALL PFNGLGETINTEGERVPROC glad_glGetIntegerv; -#define glGetIntegerv glad_glGetIntegerv -GLAD_API_CALL PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv; -#define glGetMultisamplefv glad_glGetMultisamplefv -GLAD_API_CALL PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog; -#define glGetProgramInfoLog glad_glGetProgramInfoLog -GLAD_API_CALL PFNGLGETPROGRAMIVPROC glad_glGetProgramiv; -#define glGetProgramiv glad_glGetProgramiv -GLAD_API_CALL PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v; -#define glGetQueryObjecti64v glad_glGetQueryObjecti64v -GLAD_API_CALL PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv; -#define glGetQueryObjectiv glad_glGetQueryObjectiv -GLAD_API_CALL PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v; -#define glGetQueryObjectui64v glad_glGetQueryObjectui64v -GLAD_API_CALL PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv; -#define glGetQueryObjectuiv glad_glGetQueryObjectuiv -GLAD_API_CALL PFNGLGETQUERYIVPROC glad_glGetQueryiv; -#define glGetQueryiv glad_glGetQueryiv -GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv; -#define glGetRenderbufferParameteriv glad_glGetRenderbufferParameteriv -GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv; -#define glGetSamplerParameterIiv glad_glGetSamplerParameterIiv -GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv; -#define glGetSamplerParameterIuiv glad_glGetSamplerParameterIuiv -GLAD_API_CALL PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv; -#define glGetSamplerParameterfv glad_glGetSamplerParameterfv -GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv; -#define glGetSamplerParameteriv glad_glGetSamplerParameteriv -GLAD_API_CALL PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog; -#define glGetShaderInfoLog glad_glGetShaderInfoLog -GLAD_API_CALL PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource; -#define glGetShaderSource glad_glGetShaderSource -GLAD_API_CALL PFNGLGETSHADERIVPROC glad_glGetShaderiv; -#define glGetShaderiv glad_glGetShaderiv -GLAD_API_CALL PFNGLGETSTRINGPROC glad_glGetString; -#define glGetString glad_glGetString -GLAD_API_CALL PFNGLGETSTRINGIPROC glad_glGetStringi; -#define glGetStringi glad_glGetStringi -GLAD_API_CALL PFNGLGETSYNCIVPROC glad_glGetSynciv; -#define glGetSynciv glad_glGetSynciv -GLAD_API_CALL PFNGLGETTEXIMAGEPROC glad_glGetTexImage; -#define glGetTexImage glad_glGetTexImage -GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv; -#define glGetTexLevelParameterfv glad_glGetTexLevelParameterfv -GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv; -#define glGetTexLevelParameteriv glad_glGetTexLevelParameteriv -GLAD_API_CALL PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv; -#define glGetTexParameterIiv glad_glGetTexParameterIiv -GLAD_API_CALL PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv; -#define glGetTexParameterIuiv glad_glGetTexParameterIuiv -GLAD_API_CALL PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv; -#define glGetTexParameterfv glad_glGetTexParameterfv -GLAD_API_CALL PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv; -#define glGetTexParameteriv glad_glGetTexParameteriv -GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying; -#define glGetTransformFeedbackVarying glad_glGetTransformFeedbackVarying -GLAD_API_CALL PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex; -#define glGetUniformBlockIndex glad_glGetUniformBlockIndex -GLAD_API_CALL PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices; -#define glGetUniformIndices glad_glGetUniformIndices -GLAD_API_CALL PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation; -#define glGetUniformLocation glad_glGetUniformLocation -GLAD_API_CALL PFNGLGETUNIFORMFVPROC glad_glGetUniformfv; -#define glGetUniformfv glad_glGetUniformfv -GLAD_API_CALL PFNGLGETUNIFORMIVPROC glad_glGetUniformiv; -#define glGetUniformiv glad_glGetUniformiv -GLAD_API_CALL PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv; -#define glGetUniformuiv glad_glGetUniformuiv -GLAD_API_CALL PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv; -#define glGetVertexAttribIiv glad_glGetVertexAttribIiv -GLAD_API_CALL PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv; -#define glGetVertexAttribIuiv glad_glGetVertexAttribIuiv -GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv; -#define glGetVertexAttribPointerv glad_glGetVertexAttribPointerv -GLAD_API_CALL PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv; -#define glGetVertexAttribdv glad_glGetVertexAttribdv -GLAD_API_CALL PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv; -#define glGetVertexAttribfv glad_glGetVertexAttribfv -GLAD_API_CALL PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv; -#define glGetVertexAttribiv glad_glGetVertexAttribiv -GLAD_API_CALL PFNGLHINTPROC glad_glHint; -#define glHint glad_glHint -GLAD_API_CALL PFNGLISBUFFERPROC glad_glIsBuffer; -#define glIsBuffer glad_glIsBuffer -GLAD_API_CALL PFNGLISENABLEDPROC glad_glIsEnabled; -#define glIsEnabled glad_glIsEnabled -GLAD_API_CALL PFNGLISENABLEDIPROC glad_glIsEnabledi; -#define glIsEnabledi glad_glIsEnabledi -GLAD_API_CALL PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer; -#define glIsFramebuffer glad_glIsFramebuffer -GLAD_API_CALL PFNGLISPROGRAMPROC glad_glIsProgram; -#define glIsProgram glad_glIsProgram -GLAD_API_CALL PFNGLISQUERYPROC glad_glIsQuery; -#define glIsQuery glad_glIsQuery -GLAD_API_CALL PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer; -#define glIsRenderbuffer glad_glIsRenderbuffer -GLAD_API_CALL PFNGLISSAMPLERPROC glad_glIsSampler; -#define glIsSampler glad_glIsSampler -GLAD_API_CALL PFNGLISSHADERPROC glad_glIsShader; -#define glIsShader glad_glIsShader -GLAD_API_CALL PFNGLISSYNCPROC glad_glIsSync; -#define glIsSync glad_glIsSync -GLAD_API_CALL PFNGLISTEXTUREPROC glad_glIsTexture; -#define glIsTexture glad_glIsTexture -GLAD_API_CALL PFNGLISVERTEXARRAYPROC glad_glIsVertexArray; -#define glIsVertexArray glad_glIsVertexArray -GLAD_API_CALL PFNGLLINEWIDTHPROC glad_glLineWidth; -#define glLineWidth glad_glLineWidth -GLAD_API_CALL PFNGLLINKPROGRAMPROC glad_glLinkProgram; -#define glLinkProgram glad_glLinkProgram -GLAD_API_CALL PFNGLLOGICOPPROC glad_glLogicOp; -#define glLogicOp glad_glLogicOp -GLAD_API_CALL PFNGLMAPBUFFERPROC glad_glMapBuffer; -#define glMapBuffer glad_glMapBuffer -GLAD_API_CALL PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange; -#define glMapBufferRange glad_glMapBufferRange -GLAD_API_CALL PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays; -#define glMultiDrawArrays glad_glMultiDrawArrays -GLAD_API_CALL PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements; -#define glMultiDrawElements glad_glMultiDrawElements -GLAD_API_CALL PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex; -#define glMultiDrawElementsBaseVertex glad_glMultiDrawElementsBaseVertex -GLAD_API_CALL PFNGLPIXELSTOREFPROC glad_glPixelStoref; -#define glPixelStoref glad_glPixelStoref -GLAD_API_CALL PFNGLPIXELSTOREIPROC glad_glPixelStorei; -#define glPixelStorei glad_glPixelStorei -GLAD_API_CALL PFNGLPOINTPARAMETERFPROC glad_glPointParameterf; -#define glPointParameterf glad_glPointParameterf -GLAD_API_CALL PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv; -#define glPointParameterfv glad_glPointParameterfv -GLAD_API_CALL PFNGLPOINTPARAMETERIPROC glad_glPointParameteri; -#define glPointParameteri glad_glPointParameteri -GLAD_API_CALL PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv; -#define glPointParameteriv glad_glPointParameteriv -GLAD_API_CALL PFNGLPOINTSIZEPROC glad_glPointSize; -#define glPointSize glad_glPointSize -GLAD_API_CALL PFNGLPOLYGONMODEPROC glad_glPolygonMode; -#define glPolygonMode glad_glPolygonMode -GLAD_API_CALL PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset; -#define glPolygonOffset glad_glPolygonOffset -GLAD_API_CALL PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex; -#define glPrimitiveRestartIndex glad_glPrimitiveRestartIndex -GLAD_API_CALL PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex; -#define glProvokingVertex glad_glProvokingVertex -GLAD_API_CALL PFNGLQUERYCOUNTERPROC glad_glQueryCounter; -#define glQueryCounter glad_glQueryCounter -GLAD_API_CALL PFNGLREADBUFFERPROC glad_glReadBuffer; -#define glReadBuffer glad_glReadBuffer -GLAD_API_CALL PFNGLREADPIXELSPROC glad_glReadPixels; -#define glReadPixels glad_glReadPixels -GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage; -#define glRenderbufferStorage glad_glRenderbufferStorage -GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample; -#define glRenderbufferStorageMultisample glad_glRenderbufferStorageMultisample -GLAD_API_CALL PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage; -#define glSampleCoverage glad_glSampleCoverage -GLAD_API_CALL PFNGLSAMPLEMASKIPROC glad_glSampleMaski; -#define glSampleMaski glad_glSampleMaski -GLAD_API_CALL PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv; -#define glSamplerParameterIiv glad_glSamplerParameterIiv -GLAD_API_CALL PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv; -#define glSamplerParameterIuiv glad_glSamplerParameterIuiv -GLAD_API_CALL PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf; -#define glSamplerParameterf glad_glSamplerParameterf -GLAD_API_CALL PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv; -#define glSamplerParameterfv glad_glSamplerParameterfv -GLAD_API_CALL PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri; -#define glSamplerParameteri glad_glSamplerParameteri -GLAD_API_CALL PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv; -#define glSamplerParameteriv glad_glSamplerParameteriv -GLAD_API_CALL PFNGLSCISSORPROC glad_glScissor; -#define glScissor glad_glScissor -GLAD_API_CALL PFNGLSHADERSOURCEPROC glad_glShaderSource; -#define glShaderSource glad_glShaderSource -GLAD_API_CALL PFNGLSTENCILFUNCPROC glad_glStencilFunc; -#define glStencilFunc glad_glStencilFunc -GLAD_API_CALL PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate; -#define glStencilFuncSeparate glad_glStencilFuncSeparate -GLAD_API_CALL PFNGLSTENCILMASKPROC glad_glStencilMask; -#define glStencilMask glad_glStencilMask -GLAD_API_CALL PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate; -#define glStencilMaskSeparate glad_glStencilMaskSeparate -GLAD_API_CALL PFNGLSTENCILOPPROC glad_glStencilOp; -#define glStencilOp glad_glStencilOp -GLAD_API_CALL PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate; -#define glStencilOpSeparate glad_glStencilOpSeparate -GLAD_API_CALL PFNGLTEXBUFFERPROC glad_glTexBuffer; -#define glTexBuffer glad_glTexBuffer -GLAD_API_CALL PFNGLTEXIMAGE1DPROC glad_glTexImage1D; -#define glTexImage1D glad_glTexImage1D -GLAD_API_CALL PFNGLTEXIMAGE2DPROC glad_glTexImage2D; -#define glTexImage2D glad_glTexImage2D -GLAD_API_CALL PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample; -#define glTexImage2DMultisample glad_glTexImage2DMultisample -GLAD_API_CALL PFNGLTEXIMAGE3DPROC glad_glTexImage3D; -#define glTexImage3D glad_glTexImage3D -GLAD_API_CALL PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample; -#define glTexImage3DMultisample glad_glTexImage3DMultisample -GLAD_API_CALL PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv; -#define glTexParameterIiv glad_glTexParameterIiv -GLAD_API_CALL PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv; -#define glTexParameterIuiv glad_glTexParameterIuiv -GLAD_API_CALL PFNGLTEXPARAMETERFPROC glad_glTexParameterf; -#define glTexParameterf glad_glTexParameterf -GLAD_API_CALL PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv; -#define glTexParameterfv glad_glTexParameterfv -GLAD_API_CALL PFNGLTEXPARAMETERIPROC glad_glTexParameteri; -#define glTexParameteri glad_glTexParameteri -GLAD_API_CALL PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv; -#define glTexParameteriv glad_glTexParameteriv -GLAD_API_CALL PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D; -#define glTexSubImage1D glad_glTexSubImage1D -GLAD_API_CALL PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D; -#define glTexSubImage2D glad_glTexSubImage2D -GLAD_API_CALL PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D; -#define glTexSubImage3D glad_glTexSubImage3D -GLAD_API_CALL PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings; -#define glTransformFeedbackVaryings glad_glTransformFeedbackVaryings -GLAD_API_CALL PFNGLUNIFORM1FPROC glad_glUniform1f; -#define glUniform1f glad_glUniform1f -GLAD_API_CALL PFNGLUNIFORM1FVPROC glad_glUniform1fv; -#define glUniform1fv glad_glUniform1fv -GLAD_API_CALL PFNGLUNIFORM1IPROC glad_glUniform1i; -#define glUniform1i glad_glUniform1i -GLAD_API_CALL PFNGLUNIFORM1IVPROC glad_glUniform1iv; -#define glUniform1iv glad_glUniform1iv -GLAD_API_CALL PFNGLUNIFORM1UIPROC glad_glUniform1ui; -#define glUniform1ui glad_glUniform1ui -GLAD_API_CALL PFNGLUNIFORM1UIVPROC glad_glUniform1uiv; -#define glUniform1uiv glad_glUniform1uiv -GLAD_API_CALL PFNGLUNIFORM2FPROC glad_glUniform2f; -#define glUniform2f glad_glUniform2f -GLAD_API_CALL PFNGLUNIFORM2FVPROC glad_glUniform2fv; -#define glUniform2fv glad_glUniform2fv -GLAD_API_CALL PFNGLUNIFORM2IPROC glad_glUniform2i; -#define glUniform2i glad_glUniform2i -GLAD_API_CALL PFNGLUNIFORM2IVPROC glad_glUniform2iv; -#define glUniform2iv glad_glUniform2iv -GLAD_API_CALL PFNGLUNIFORM2UIPROC glad_glUniform2ui; -#define glUniform2ui glad_glUniform2ui -GLAD_API_CALL PFNGLUNIFORM2UIVPROC glad_glUniform2uiv; -#define glUniform2uiv glad_glUniform2uiv -GLAD_API_CALL PFNGLUNIFORM3FPROC glad_glUniform3f; -#define glUniform3f glad_glUniform3f -GLAD_API_CALL PFNGLUNIFORM3FVPROC glad_glUniform3fv; -#define glUniform3fv glad_glUniform3fv -GLAD_API_CALL PFNGLUNIFORM3IPROC glad_glUniform3i; -#define glUniform3i glad_glUniform3i -GLAD_API_CALL PFNGLUNIFORM3IVPROC glad_glUniform3iv; -#define glUniform3iv glad_glUniform3iv -GLAD_API_CALL PFNGLUNIFORM3UIPROC glad_glUniform3ui; -#define glUniform3ui glad_glUniform3ui -GLAD_API_CALL PFNGLUNIFORM3UIVPROC glad_glUniform3uiv; -#define glUniform3uiv glad_glUniform3uiv -GLAD_API_CALL PFNGLUNIFORM4FPROC glad_glUniform4f; -#define glUniform4f glad_glUniform4f -GLAD_API_CALL PFNGLUNIFORM4FVPROC glad_glUniform4fv; -#define glUniform4fv glad_glUniform4fv -GLAD_API_CALL PFNGLUNIFORM4IPROC glad_glUniform4i; -#define glUniform4i glad_glUniform4i -GLAD_API_CALL PFNGLUNIFORM4IVPROC glad_glUniform4iv; -#define glUniform4iv glad_glUniform4iv -GLAD_API_CALL PFNGLUNIFORM4UIPROC glad_glUniform4ui; -#define glUniform4ui glad_glUniform4ui -GLAD_API_CALL PFNGLUNIFORM4UIVPROC glad_glUniform4uiv; -#define glUniform4uiv glad_glUniform4uiv -GLAD_API_CALL PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding; -#define glUniformBlockBinding glad_glUniformBlockBinding -GLAD_API_CALL PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv; -#define glUniformMatrix2fv glad_glUniformMatrix2fv -GLAD_API_CALL PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv; -#define glUniformMatrix2x3fv glad_glUniformMatrix2x3fv -GLAD_API_CALL PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv; -#define glUniformMatrix2x4fv glad_glUniformMatrix2x4fv -GLAD_API_CALL PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv; -#define glUniformMatrix3fv glad_glUniformMatrix3fv -GLAD_API_CALL PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv; -#define glUniformMatrix3x2fv glad_glUniformMatrix3x2fv -GLAD_API_CALL PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv; -#define glUniformMatrix3x4fv glad_glUniformMatrix3x4fv -GLAD_API_CALL PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv; -#define glUniformMatrix4fv glad_glUniformMatrix4fv -GLAD_API_CALL PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv; -#define glUniformMatrix4x2fv glad_glUniformMatrix4x2fv -GLAD_API_CALL PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv; -#define glUniformMatrix4x3fv glad_glUniformMatrix4x3fv -GLAD_API_CALL PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer; -#define glUnmapBuffer glad_glUnmapBuffer -GLAD_API_CALL PFNGLUSEPROGRAMPROC glad_glUseProgram; -#define glUseProgram glad_glUseProgram -GLAD_API_CALL PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram; -#define glValidateProgram glad_glValidateProgram -GLAD_API_CALL PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d; -#define glVertexAttrib1d glad_glVertexAttrib1d -GLAD_API_CALL PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv; -#define glVertexAttrib1dv glad_glVertexAttrib1dv -GLAD_API_CALL PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f; -#define glVertexAttrib1f glad_glVertexAttrib1f -GLAD_API_CALL PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv; -#define glVertexAttrib1fv glad_glVertexAttrib1fv -GLAD_API_CALL PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s; -#define glVertexAttrib1s glad_glVertexAttrib1s -GLAD_API_CALL PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv; -#define glVertexAttrib1sv glad_glVertexAttrib1sv -GLAD_API_CALL PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d; -#define glVertexAttrib2d glad_glVertexAttrib2d -GLAD_API_CALL PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv; -#define glVertexAttrib2dv glad_glVertexAttrib2dv -GLAD_API_CALL PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f; -#define glVertexAttrib2f glad_glVertexAttrib2f -GLAD_API_CALL PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv; -#define glVertexAttrib2fv glad_glVertexAttrib2fv -GLAD_API_CALL PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s; -#define glVertexAttrib2s glad_glVertexAttrib2s -GLAD_API_CALL PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv; -#define glVertexAttrib2sv glad_glVertexAttrib2sv -GLAD_API_CALL PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d; -#define glVertexAttrib3d glad_glVertexAttrib3d -GLAD_API_CALL PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv; -#define glVertexAttrib3dv glad_glVertexAttrib3dv -GLAD_API_CALL PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f; -#define glVertexAttrib3f glad_glVertexAttrib3f -GLAD_API_CALL PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv; -#define glVertexAttrib3fv glad_glVertexAttrib3fv -GLAD_API_CALL PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s; -#define glVertexAttrib3s glad_glVertexAttrib3s -GLAD_API_CALL PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv; -#define glVertexAttrib3sv glad_glVertexAttrib3sv -GLAD_API_CALL PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv; -#define glVertexAttrib4Nbv glad_glVertexAttrib4Nbv -GLAD_API_CALL PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv; -#define glVertexAttrib4Niv glad_glVertexAttrib4Niv -GLAD_API_CALL PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv; -#define glVertexAttrib4Nsv glad_glVertexAttrib4Nsv -GLAD_API_CALL PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub; -#define glVertexAttrib4Nub glad_glVertexAttrib4Nub -GLAD_API_CALL PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv; -#define glVertexAttrib4Nubv glad_glVertexAttrib4Nubv -GLAD_API_CALL PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv; -#define glVertexAttrib4Nuiv glad_glVertexAttrib4Nuiv -GLAD_API_CALL PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv; -#define glVertexAttrib4Nusv glad_glVertexAttrib4Nusv -GLAD_API_CALL PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv; -#define glVertexAttrib4bv glad_glVertexAttrib4bv -GLAD_API_CALL PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d; -#define glVertexAttrib4d glad_glVertexAttrib4d -GLAD_API_CALL PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv; -#define glVertexAttrib4dv glad_glVertexAttrib4dv -GLAD_API_CALL PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f; -#define glVertexAttrib4f glad_glVertexAttrib4f -GLAD_API_CALL PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv; -#define glVertexAttrib4fv glad_glVertexAttrib4fv -GLAD_API_CALL PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv; -#define glVertexAttrib4iv glad_glVertexAttrib4iv -GLAD_API_CALL PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s; -#define glVertexAttrib4s glad_glVertexAttrib4s -GLAD_API_CALL PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv; -#define glVertexAttrib4sv glad_glVertexAttrib4sv -GLAD_API_CALL PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv; -#define glVertexAttrib4ubv glad_glVertexAttrib4ubv -GLAD_API_CALL PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv; -#define glVertexAttrib4uiv glad_glVertexAttrib4uiv -GLAD_API_CALL PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv; -#define glVertexAttrib4usv glad_glVertexAttrib4usv -GLAD_API_CALL PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor; -#define glVertexAttribDivisor glad_glVertexAttribDivisor -GLAD_API_CALL PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i; -#define glVertexAttribI1i glad_glVertexAttribI1i -GLAD_API_CALL PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv; -#define glVertexAttribI1iv glad_glVertexAttribI1iv -GLAD_API_CALL PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui; -#define glVertexAttribI1ui glad_glVertexAttribI1ui -GLAD_API_CALL PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv; -#define glVertexAttribI1uiv glad_glVertexAttribI1uiv -GLAD_API_CALL PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i; -#define glVertexAttribI2i glad_glVertexAttribI2i -GLAD_API_CALL PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv; -#define glVertexAttribI2iv glad_glVertexAttribI2iv -GLAD_API_CALL PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui; -#define glVertexAttribI2ui glad_glVertexAttribI2ui -GLAD_API_CALL PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv; -#define glVertexAttribI2uiv glad_glVertexAttribI2uiv -GLAD_API_CALL PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i; -#define glVertexAttribI3i glad_glVertexAttribI3i -GLAD_API_CALL PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv; -#define glVertexAttribI3iv glad_glVertexAttribI3iv -GLAD_API_CALL PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui; -#define glVertexAttribI3ui glad_glVertexAttribI3ui -GLAD_API_CALL PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv; -#define glVertexAttribI3uiv glad_glVertexAttribI3uiv -GLAD_API_CALL PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv; -#define glVertexAttribI4bv glad_glVertexAttribI4bv -GLAD_API_CALL PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i; -#define glVertexAttribI4i glad_glVertexAttribI4i -GLAD_API_CALL PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv; -#define glVertexAttribI4iv glad_glVertexAttribI4iv -GLAD_API_CALL PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv; -#define glVertexAttribI4sv glad_glVertexAttribI4sv -GLAD_API_CALL PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv; -#define glVertexAttribI4ubv glad_glVertexAttribI4ubv -GLAD_API_CALL PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui; -#define glVertexAttribI4ui glad_glVertexAttribI4ui -GLAD_API_CALL PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv; -#define glVertexAttribI4uiv glad_glVertexAttribI4uiv -GLAD_API_CALL PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv; -#define glVertexAttribI4usv glad_glVertexAttribI4usv -GLAD_API_CALL PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer; -#define glVertexAttribIPointer glad_glVertexAttribIPointer -GLAD_API_CALL PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui; -#define glVertexAttribP1ui glad_glVertexAttribP1ui -GLAD_API_CALL PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv; -#define glVertexAttribP1uiv glad_glVertexAttribP1uiv -GLAD_API_CALL PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui; -#define glVertexAttribP2ui glad_glVertexAttribP2ui -GLAD_API_CALL PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv; -#define glVertexAttribP2uiv glad_glVertexAttribP2uiv -GLAD_API_CALL PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui; -#define glVertexAttribP3ui glad_glVertexAttribP3ui -GLAD_API_CALL PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv; -#define glVertexAttribP3uiv glad_glVertexAttribP3uiv -GLAD_API_CALL PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui; -#define glVertexAttribP4ui glad_glVertexAttribP4ui -GLAD_API_CALL PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv; -#define glVertexAttribP4uiv glad_glVertexAttribP4uiv -GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer; -#define glVertexAttribPointer glad_glVertexAttribPointer -GLAD_API_CALL PFNGLVIEWPORTPROC glad_glViewport; -#define glViewport glad_glViewport -GLAD_API_CALL PFNGLWAITSYNCPROC glad_glWaitSync; -#define glWaitSync glad_glWaitSync - - - - - -GLAD_API_CALL int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr); -GLAD_API_CALL int gladLoadGL( GLADloadfunc load); - - -#ifdef GLAD_GL - -GLAD_API_CALL int gladLoaderLoadGL(void); -GLAD_API_CALL void gladLoaderUnloadGL(void); - -#endif - -#ifdef __cplusplus -} -#endif -#endif - -/* Source */ -#ifdef GLAD_GL_IMPLEMENTATION -#include -#include -#include - -#ifndef GLAD_IMPL_UTIL_C_ -#define GLAD_IMPL_UTIL_C_ - -#ifdef _MSC_VER -#define GLAD_IMPL_UTIL_SSCANF sscanf_s -#else -#define GLAD_IMPL_UTIL_SSCANF sscanf -#endif - -#endif /* GLAD_IMPL_UTIL_C_ */ - -#ifdef __cplusplus -extern "C" { -#endif - - - -int GLAD_GL_VERSION_1_0 = 0; -int GLAD_GL_VERSION_1_1 = 0; -int GLAD_GL_VERSION_1_2 = 0; -int GLAD_GL_VERSION_1_3 = 0; -int GLAD_GL_VERSION_1_4 = 0; -int GLAD_GL_VERSION_1_5 = 0; -int GLAD_GL_VERSION_2_0 = 0; -int GLAD_GL_VERSION_2_1 = 0; -int GLAD_GL_VERSION_3_0 = 0; -int GLAD_GL_VERSION_3_1 = 0; -int GLAD_GL_VERSION_3_2 = 0; -int GLAD_GL_VERSION_3_3 = 0; - - - -PFNGLACTIVETEXTUREPROC glad_glActiveTexture = NULL; -PFNGLATTACHSHADERPROC glad_glAttachShader = NULL; -PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender = NULL; -PFNGLBEGINQUERYPROC glad_glBeginQuery = NULL; -PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback = NULL; -PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation = NULL; -PFNGLBINDBUFFERPROC glad_glBindBuffer = NULL; -PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase = NULL; -PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange = NULL; -PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation = NULL; -PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed = NULL; -PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer = NULL; -PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer = NULL; -PFNGLBINDSAMPLERPROC glad_glBindSampler = NULL; -PFNGLBINDTEXTUREPROC glad_glBindTexture = NULL; -PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray = NULL; -PFNGLBLENDCOLORPROC glad_glBlendColor = NULL; -PFNGLBLENDEQUATIONPROC glad_glBlendEquation = NULL; -PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate = NULL; -PFNGLBLENDFUNCPROC glad_glBlendFunc = NULL; -PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate = NULL; -PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer = NULL; -PFNGLBUFFERDATAPROC glad_glBufferData = NULL; -PFNGLBUFFERSUBDATAPROC glad_glBufferSubData = NULL; -PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus = NULL; -PFNGLCLAMPCOLORPROC glad_glClampColor = NULL; -PFNGLCLEARPROC glad_glClear = NULL; -PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi = NULL; -PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv = NULL; -PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv = NULL; -PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv = NULL; -PFNGLCLEARCOLORPROC glad_glClearColor = NULL; -PFNGLCLEARDEPTHPROC glad_glClearDepth = NULL; -PFNGLCLEARSTENCILPROC glad_glClearStencil = NULL; -PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync = NULL; -PFNGLCOLORMASKPROC glad_glColorMask = NULL; -PFNGLCOLORMASKIPROC glad_glColorMaski = NULL; -PFNGLCOMPILESHADERPROC glad_glCompileShader = NULL; -PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D = NULL; -PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D = NULL; -PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D = NULL; -PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData = NULL; -PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D = NULL; -PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D = NULL; -PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D = NULL; -PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D = NULL; -PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D = NULL; -PFNGLCREATEPROGRAMPROC glad_glCreateProgram = NULL; -PFNGLCREATESHADERPROC glad_glCreateShader = NULL; -PFNGLCULLFACEPROC glad_glCullFace = NULL; -PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers = NULL; -PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers = NULL; -PFNGLDELETEPROGRAMPROC glad_glDeleteProgram = NULL; -PFNGLDELETEQUERIESPROC glad_glDeleteQueries = NULL; -PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers = NULL; -PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers = NULL; -PFNGLDELETESHADERPROC glad_glDeleteShader = NULL; -PFNGLDELETESYNCPROC glad_glDeleteSync = NULL; -PFNGLDELETETEXTURESPROC glad_glDeleteTextures = NULL; -PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays = NULL; -PFNGLDEPTHFUNCPROC glad_glDepthFunc = NULL; -PFNGLDEPTHMASKPROC glad_glDepthMask = NULL; -PFNGLDEPTHRANGEPROC glad_glDepthRange = NULL; -PFNGLDETACHSHADERPROC glad_glDetachShader = NULL; -PFNGLDISABLEPROC glad_glDisable = NULL; -PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray = NULL; -PFNGLDISABLEIPROC glad_glDisablei = NULL; -PFNGLDRAWARRAYSPROC glad_glDrawArrays = NULL; -PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced = NULL; -PFNGLDRAWBUFFERPROC glad_glDrawBuffer = NULL; -PFNGLDRAWBUFFERSPROC glad_glDrawBuffers = NULL; -PFNGLDRAWELEMENTSPROC glad_glDrawElements = NULL; -PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex = NULL; -PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced = NULL; -PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex = NULL; -PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements = NULL; -PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex = NULL; -PFNGLENABLEPROC glad_glEnable = NULL; -PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray = NULL; -PFNGLENABLEIPROC glad_glEnablei = NULL; -PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender = NULL; -PFNGLENDQUERYPROC glad_glEndQuery = NULL; -PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback = NULL; -PFNGLFENCESYNCPROC glad_glFenceSync = NULL; -PFNGLFINISHPROC glad_glFinish = NULL; -PFNGLFLUSHPROC glad_glFlush = NULL; -PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange = NULL; -PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer = NULL; -PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture = NULL; -PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D = NULL; -PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D = NULL; -PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D = NULL; -PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer = NULL; -PFNGLFRONTFACEPROC glad_glFrontFace = NULL; -PFNGLGENBUFFERSPROC glad_glGenBuffers = NULL; -PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers = NULL; -PFNGLGENQUERIESPROC glad_glGenQueries = NULL; -PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers = NULL; -PFNGLGENSAMPLERSPROC glad_glGenSamplers = NULL; -PFNGLGENTEXTURESPROC glad_glGenTextures = NULL; -PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays = NULL; -PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap = NULL; -PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib = NULL; -PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform = NULL; -PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName = NULL; -PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv = NULL; -PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName = NULL; -PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv = NULL; -PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders = NULL; -PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation = NULL; -PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v = NULL; -PFNGLGETBOOLEANVPROC glad_glGetBooleanv = NULL; -PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v = NULL; -PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv = NULL; -PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv = NULL; -PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData = NULL; -PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage = NULL; -PFNGLGETDOUBLEVPROC glad_glGetDoublev = NULL; -PFNGLGETERRORPROC glad_glGetError = NULL; -PFNGLGETFLOATVPROC glad_glGetFloatv = NULL; -PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex = NULL; -PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation = NULL; -PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv = NULL; -PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v = NULL; -PFNGLGETINTEGER64VPROC glad_glGetInteger64v = NULL; -PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v = NULL; -PFNGLGETINTEGERVPROC glad_glGetIntegerv = NULL; -PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv = NULL; -PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog = NULL; -PFNGLGETPROGRAMIVPROC glad_glGetProgramiv = NULL; -PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v = NULL; -PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv = NULL; -PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v = NULL; -PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv = NULL; -PFNGLGETQUERYIVPROC glad_glGetQueryiv = NULL; -PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv = NULL; -PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv = NULL; -PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv = NULL; -PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv = NULL; -PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv = NULL; -PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog = NULL; -PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource = NULL; -PFNGLGETSHADERIVPROC glad_glGetShaderiv = NULL; -PFNGLGETSTRINGPROC glad_glGetString = NULL; -PFNGLGETSTRINGIPROC glad_glGetStringi = NULL; -PFNGLGETSYNCIVPROC glad_glGetSynciv = NULL; -PFNGLGETTEXIMAGEPROC glad_glGetTexImage = NULL; -PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv = NULL; -PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv = NULL; -PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv = NULL; -PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv = NULL; -PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv = NULL; -PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv = NULL; -PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying = NULL; -PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex = NULL; -PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices = NULL; -PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation = NULL; -PFNGLGETUNIFORMFVPROC glad_glGetUniformfv = NULL; -PFNGLGETUNIFORMIVPROC glad_glGetUniformiv = NULL; -PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv = NULL; -PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv = NULL; -PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv = NULL; -PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv = NULL; -PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv = NULL; -PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv = NULL; -PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv = NULL; -PFNGLHINTPROC glad_glHint = NULL; -PFNGLISBUFFERPROC glad_glIsBuffer = NULL; -PFNGLISENABLEDPROC glad_glIsEnabled = NULL; -PFNGLISENABLEDIPROC glad_glIsEnabledi = NULL; -PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer = NULL; -PFNGLISPROGRAMPROC glad_glIsProgram = NULL; -PFNGLISQUERYPROC glad_glIsQuery = NULL; -PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer = NULL; -PFNGLISSAMPLERPROC glad_glIsSampler = NULL; -PFNGLISSHADERPROC glad_glIsShader = NULL; -PFNGLISSYNCPROC glad_glIsSync = NULL; -PFNGLISTEXTUREPROC glad_glIsTexture = NULL; -PFNGLISVERTEXARRAYPROC glad_glIsVertexArray = NULL; -PFNGLLINEWIDTHPROC glad_glLineWidth = NULL; -PFNGLLINKPROGRAMPROC glad_glLinkProgram = NULL; -PFNGLLOGICOPPROC glad_glLogicOp = NULL; -PFNGLMAPBUFFERPROC glad_glMapBuffer = NULL; -PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange = NULL; -PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays = NULL; -PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements = NULL; -PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex = NULL; -PFNGLPIXELSTOREFPROC glad_glPixelStoref = NULL; -PFNGLPIXELSTOREIPROC glad_glPixelStorei = NULL; -PFNGLPOINTPARAMETERFPROC glad_glPointParameterf = NULL; -PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv = NULL; -PFNGLPOINTPARAMETERIPROC glad_glPointParameteri = NULL; -PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv = NULL; -PFNGLPOINTSIZEPROC glad_glPointSize = NULL; -PFNGLPOLYGONMODEPROC glad_glPolygonMode = NULL; -PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset = NULL; -PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex = NULL; -PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex = NULL; -PFNGLQUERYCOUNTERPROC glad_glQueryCounter = NULL; -PFNGLREADBUFFERPROC glad_glReadBuffer = NULL; -PFNGLREADPIXELSPROC glad_glReadPixels = NULL; -PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage = NULL; -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample = NULL; -PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage = NULL; -PFNGLSAMPLEMASKIPROC glad_glSampleMaski = NULL; -PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv = NULL; -PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv = NULL; -PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf = NULL; -PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv = NULL; -PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri = NULL; -PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv = NULL; -PFNGLSCISSORPROC glad_glScissor = NULL; -PFNGLSHADERSOURCEPROC glad_glShaderSource = NULL; -PFNGLSTENCILFUNCPROC glad_glStencilFunc = NULL; -PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate = NULL; -PFNGLSTENCILMASKPROC glad_glStencilMask = NULL; -PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate = NULL; -PFNGLSTENCILOPPROC glad_glStencilOp = NULL; -PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate = NULL; -PFNGLTEXBUFFERPROC glad_glTexBuffer = NULL; -PFNGLTEXIMAGE1DPROC glad_glTexImage1D = NULL; -PFNGLTEXIMAGE2DPROC glad_glTexImage2D = NULL; -PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample = NULL; -PFNGLTEXIMAGE3DPROC glad_glTexImage3D = NULL; -PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample = NULL; -PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv = NULL; -PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv = NULL; -PFNGLTEXPARAMETERFPROC glad_glTexParameterf = NULL; -PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv = NULL; -PFNGLTEXPARAMETERIPROC glad_glTexParameteri = NULL; -PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv = NULL; -PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D = NULL; -PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D = NULL; -PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D = NULL; -PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings = NULL; -PFNGLUNIFORM1FPROC glad_glUniform1f = NULL; -PFNGLUNIFORM1FVPROC glad_glUniform1fv = NULL; -PFNGLUNIFORM1IPROC glad_glUniform1i = NULL; -PFNGLUNIFORM1IVPROC glad_glUniform1iv = NULL; -PFNGLUNIFORM1UIPROC glad_glUniform1ui = NULL; -PFNGLUNIFORM1UIVPROC glad_glUniform1uiv = NULL; -PFNGLUNIFORM2FPROC glad_glUniform2f = NULL; -PFNGLUNIFORM2FVPROC glad_glUniform2fv = NULL; -PFNGLUNIFORM2IPROC glad_glUniform2i = NULL; -PFNGLUNIFORM2IVPROC glad_glUniform2iv = NULL; -PFNGLUNIFORM2UIPROC glad_glUniform2ui = NULL; -PFNGLUNIFORM2UIVPROC glad_glUniform2uiv = NULL; -PFNGLUNIFORM3FPROC glad_glUniform3f = NULL; -PFNGLUNIFORM3FVPROC glad_glUniform3fv = NULL; -PFNGLUNIFORM3IPROC glad_glUniform3i = NULL; -PFNGLUNIFORM3IVPROC glad_glUniform3iv = NULL; -PFNGLUNIFORM3UIPROC glad_glUniform3ui = NULL; -PFNGLUNIFORM3UIVPROC glad_glUniform3uiv = NULL; -PFNGLUNIFORM4FPROC glad_glUniform4f = NULL; -PFNGLUNIFORM4FVPROC glad_glUniform4fv = NULL; -PFNGLUNIFORM4IPROC glad_glUniform4i = NULL; -PFNGLUNIFORM4IVPROC glad_glUniform4iv = NULL; -PFNGLUNIFORM4UIPROC glad_glUniform4ui = NULL; -PFNGLUNIFORM4UIVPROC glad_glUniform4uiv = NULL; -PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding = NULL; -PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv = NULL; -PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv = NULL; -PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv = NULL; -PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv = NULL; -PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv = NULL; -PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv = NULL; -PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv = NULL; -PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv = NULL; -PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv = NULL; -PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer = NULL; -PFNGLUSEPROGRAMPROC glad_glUseProgram = NULL; -PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram = NULL; -PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d = NULL; -PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv = NULL; -PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f = NULL; -PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv = NULL; -PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s = NULL; -PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv = NULL; -PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d = NULL; -PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv = NULL; -PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f = NULL; -PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv = NULL; -PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s = NULL; -PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv = NULL; -PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d = NULL; -PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv = NULL; -PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f = NULL; -PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv = NULL; -PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s = NULL; -PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv = NULL; -PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv = NULL; -PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv = NULL; -PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv = NULL; -PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub = NULL; -PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv = NULL; -PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv = NULL; -PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv = NULL; -PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv = NULL; -PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d = NULL; -PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv = NULL; -PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f = NULL; -PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv = NULL; -PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv = NULL; -PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s = NULL; -PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv = NULL; -PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv = NULL; -PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv = NULL; -PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv = NULL; -PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor = NULL; -PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i = NULL; -PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv = NULL; -PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui = NULL; -PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv = NULL; -PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i = NULL; -PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv = NULL; -PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui = NULL; -PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv = NULL; -PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i = NULL; -PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv = NULL; -PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui = NULL; -PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv = NULL; -PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv = NULL; -PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i = NULL; -PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv = NULL; -PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv = NULL; -PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv = NULL; -PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui = NULL; -PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv = NULL; -PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv = NULL; -PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer = NULL; -PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui = NULL; -PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv = NULL; -PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui = NULL; -PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv = NULL; -PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui = NULL; -PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv = NULL; -PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui = NULL; -PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv = NULL; -PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer = NULL; -PFNGLVIEWPORTPROC glad_glViewport = NULL; -PFNGLWAITSYNCPROC glad_glWaitSync = NULL; - - -static void glad_gl_load_GL_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) { - if(!GLAD_GL_VERSION_1_0) return; - glad_glBlendFunc = (PFNGLBLENDFUNCPROC) load(userptr, "glBlendFunc"); - glad_glClear = (PFNGLCLEARPROC) load(userptr, "glClear"); - glad_glClearColor = (PFNGLCLEARCOLORPROC) load(userptr, "glClearColor"); - glad_glClearDepth = (PFNGLCLEARDEPTHPROC) load(userptr, "glClearDepth"); - glad_glClearStencil = (PFNGLCLEARSTENCILPROC) load(userptr, "glClearStencil"); - glad_glColorMask = (PFNGLCOLORMASKPROC) load(userptr, "glColorMask"); - glad_glCullFace = (PFNGLCULLFACEPROC) load(userptr, "glCullFace"); - glad_glDepthFunc = (PFNGLDEPTHFUNCPROC) load(userptr, "glDepthFunc"); - glad_glDepthMask = (PFNGLDEPTHMASKPROC) load(userptr, "glDepthMask"); - glad_glDepthRange = (PFNGLDEPTHRANGEPROC) load(userptr, "glDepthRange"); - glad_glDisable = (PFNGLDISABLEPROC) load(userptr, "glDisable"); - glad_glDrawBuffer = (PFNGLDRAWBUFFERPROC) load(userptr, "glDrawBuffer"); - glad_glEnable = (PFNGLENABLEPROC) load(userptr, "glEnable"); - glad_glFinish = (PFNGLFINISHPROC) load(userptr, "glFinish"); - glad_glFlush = (PFNGLFLUSHPROC) load(userptr, "glFlush"); - glad_glFrontFace = (PFNGLFRONTFACEPROC) load(userptr, "glFrontFace"); - glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(userptr, "glGetBooleanv"); - glad_glGetDoublev = (PFNGLGETDOUBLEVPROC) load(userptr, "glGetDoublev"); - glad_glGetError = (PFNGLGETERRORPROC) load(userptr, "glGetError"); - glad_glGetFloatv = (PFNGLGETFLOATVPROC) load(userptr, "glGetFloatv"); - glad_glGetIntegerv = (PFNGLGETINTEGERVPROC) load(userptr, "glGetIntegerv"); - glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); - glad_glGetTexImage = (PFNGLGETTEXIMAGEPROC) load(userptr, "glGetTexImage"); - glad_glGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC) load(userptr, "glGetTexLevelParameterfv"); - glad_glGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC) load(userptr, "glGetTexLevelParameteriv"); - glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(userptr, "glGetTexParameterfv"); - glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(userptr, "glGetTexParameteriv"); - glad_glHint = (PFNGLHINTPROC) load(userptr, "glHint"); - glad_glIsEnabled = (PFNGLISENABLEDPROC) load(userptr, "glIsEnabled"); - glad_glLineWidth = (PFNGLLINEWIDTHPROC) load(userptr, "glLineWidth"); - glad_glLogicOp = (PFNGLLOGICOPPROC) load(userptr, "glLogicOp"); - glad_glPixelStoref = (PFNGLPIXELSTOREFPROC) load(userptr, "glPixelStoref"); - glad_glPixelStorei = (PFNGLPIXELSTOREIPROC) load(userptr, "glPixelStorei"); - glad_glPointSize = (PFNGLPOINTSIZEPROC) load(userptr, "glPointSize"); - glad_glPolygonMode = (PFNGLPOLYGONMODEPROC) load(userptr, "glPolygonMode"); - glad_glReadBuffer = (PFNGLREADBUFFERPROC) load(userptr, "glReadBuffer"); - glad_glReadPixels = (PFNGLREADPIXELSPROC) load(userptr, "glReadPixels"); - glad_glScissor = (PFNGLSCISSORPROC) load(userptr, "glScissor"); - glad_glStencilFunc = (PFNGLSTENCILFUNCPROC) load(userptr, "glStencilFunc"); - glad_glStencilMask = (PFNGLSTENCILMASKPROC) load(userptr, "glStencilMask"); - glad_glStencilOp = (PFNGLSTENCILOPPROC) load(userptr, "glStencilOp"); - glad_glTexImage1D = (PFNGLTEXIMAGE1DPROC) load(userptr, "glTexImage1D"); - glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC) load(userptr, "glTexImage2D"); - glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC) load(userptr, "glTexParameterf"); - glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC) load(userptr, "glTexParameterfv"); - glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC) load(userptr, "glTexParameteri"); - glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC) load(userptr, "glTexParameteriv"); - glad_glViewport = (PFNGLVIEWPORTPROC) load(userptr, "glViewport"); -} -static void glad_gl_load_GL_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) { - if(!GLAD_GL_VERSION_1_1) return; - glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture"); - glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC) load(userptr, "glCopyTexImage1D"); - glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D"); - glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC) load(userptr, "glCopyTexSubImage1D"); - glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D"); - glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(userptr, "glDeleteTextures"); - glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays"); - glad_glDrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements"); - glad_glGenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures"); - glad_glIsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture"); - glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC) load(userptr, "glPolygonOffset"); - glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) load(userptr, "glTexSubImage1D"); - glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D"); -} -static void glad_gl_load_GL_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) { - if(!GLAD_GL_VERSION_1_2) return; - glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) load(userptr, "glCopyTexSubImage3D"); - glad_glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC) load(userptr, "glDrawRangeElements"); - glad_glTexImage3D = (PFNGLTEXIMAGE3DPROC) load(userptr, "glTexImage3D"); - glad_glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC) load(userptr, "glTexSubImage3D"); -} -static void glad_gl_load_GL_VERSION_1_3( GLADuserptrloadfunc load, void* userptr) { - if(!GLAD_GL_VERSION_1_3) return; - glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture"); - glad_glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC) load(userptr, "glCompressedTexImage1D"); - glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) load(userptr, "glCompressedTexImage2D"); - glad_glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC) load(userptr, "glCompressedTexImage3D"); - glad_glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) load(userptr, "glCompressedTexSubImage1D"); - glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) load(userptr, "glCompressedTexSubImage2D"); - glad_glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) load(userptr, "glCompressedTexSubImage3D"); - glad_glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC) load(userptr, "glGetCompressedTexImage"); - glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC) load(userptr, "glSampleCoverage"); -} -static void glad_gl_load_GL_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) { - if(!GLAD_GL_VERSION_1_4) return; - glad_glBlendColor = (PFNGLBLENDCOLORPROC) load(userptr, "glBlendColor"); - glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation"); - glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate"); - glad_glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC) load(userptr, "glMultiDrawArrays"); - glad_glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC) load(userptr, "glMultiDrawElements"); - glad_glPointParameterf = (PFNGLPOINTPARAMETERFPROC) load(userptr, "glPointParameterf"); - glad_glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC) load(userptr, "glPointParameterfv"); - glad_glPointParameteri = (PFNGLPOINTPARAMETERIPROC) load(userptr, "glPointParameteri"); - glad_glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC) load(userptr, "glPointParameteriv"); -} -static void glad_gl_load_GL_VERSION_1_5( GLADuserptrloadfunc load, void* userptr) { - if(!GLAD_GL_VERSION_1_5) return; - glad_glBeginQuery = (PFNGLBEGINQUERYPROC) load(userptr, "glBeginQuery"); - glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer"); - glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData"); - glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData"); - glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers"); - glad_glDeleteQueries = (PFNGLDELETEQUERIESPROC) load(userptr, "glDeleteQueries"); - glad_glEndQuery = (PFNGLENDQUERYPROC) load(userptr, "glEndQuery"); - glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers"); - glad_glGenQueries = (PFNGLGENQUERIESPROC) load(userptr, "glGenQueries"); - glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv"); - glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC) load(userptr, "glGetBufferPointerv"); - glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC) load(userptr, "glGetBufferSubData"); - glad_glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC) load(userptr, "glGetQueryObjectiv"); - glad_glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC) load(userptr, "glGetQueryObjectuiv"); - glad_glGetQueryiv = (PFNGLGETQUERYIVPROC) load(userptr, "glGetQueryiv"); - glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer"); - glad_glIsQuery = (PFNGLISQUERYPROC) load(userptr, "glIsQuery"); - glad_glMapBuffer = (PFNGLMAPBUFFERPROC) load(userptr, "glMapBuffer"); - glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC) load(userptr, "glUnmapBuffer"); -} -static void glad_gl_load_GL_VERSION_2_0( GLADuserptrloadfunc load, void* userptr) { - if(!GLAD_GL_VERSION_2_0) return; - glad_glAttachShader = (PFNGLATTACHSHADERPROC) load(userptr, "glAttachShader"); - glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) load(userptr, "glBindAttribLocation"); - glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) load(userptr, "glBlendEquationSeparate"); - glad_glCompileShader = (PFNGLCOMPILESHADERPROC) load(userptr, "glCompileShader"); - glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC) load(userptr, "glCreateProgram"); - glad_glCreateShader = (PFNGLCREATESHADERPROC) load(userptr, "glCreateShader"); - glad_glDeleteProgram = (PFNGLDELETEPROGRAMPROC) load(userptr, "glDeleteProgram"); - glad_glDeleteShader = (PFNGLDELETESHADERPROC) load(userptr, "glDeleteShader"); - glad_glDetachShader = (PFNGLDETACHSHADERPROC) load(userptr, "glDetachShader"); - glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray"); - glad_glDrawBuffers = (PFNGLDRAWBUFFERSPROC) load(userptr, "glDrawBuffers"); - glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray"); - glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) load(userptr, "glGetActiveAttrib"); - glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) load(userptr, "glGetActiveUniform"); - glad_glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC) load(userptr, "glGetAttachedShaders"); - glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) load(userptr, "glGetAttribLocation"); - glad_glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) load(userptr, "glGetProgramInfoLog"); - glad_glGetProgramiv = (PFNGLGETPROGRAMIVPROC) load(userptr, "glGetProgramiv"); - glad_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) load(userptr, "glGetShaderInfoLog"); - glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC) load(userptr, "glGetShaderSource"); - glad_glGetShaderiv = (PFNGLGETSHADERIVPROC) load(userptr, "glGetShaderiv"); - glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) load(userptr, "glGetUniformLocation"); - glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC) load(userptr, "glGetUniformfv"); - glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC) load(userptr, "glGetUniformiv"); - glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv"); - glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv"); - glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv"); - glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv"); - glad_glIsProgram = (PFNGLISPROGRAMPROC) load(userptr, "glIsProgram"); - glad_glIsShader = (PFNGLISSHADERPROC) load(userptr, "glIsShader"); - glad_glLinkProgram = (PFNGLLINKPROGRAMPROC) load(userptr, "glLinkProgram"); - glad_glShaderSource = (PFNGLSHADERSOURCEPROC) load(userptr, "glShaderSource"); - glad_glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC) load(userptr, "glStencilFuncSeparate"); - glad_glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC) load(userptr, "glStencilMaskSeparate"); - glad_glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC) load(userptr, "glStencilOpSeparate"); - glad_glUniform1f = (PFNGLUNIFORM1FPROC) load(userptr, "glUniform1f"); - glad_glUniform1fv = (PFNGLUNIFORM1FVPROC) load(userptr, "glUniform1fv"); - glad_glUniform1i = (PFNGLUNIFORM1IPROC) load(userptr, "glUniform1i"); - glad_glUniform1iv = (PFNGLUNIFORM1IVPROC) load(userptr, "glUniform1iv"); - glad_glUniform2f = (PFNGLUNIFORM2FPROC) load(userptr, "glUniform2f"); - glad_glUniform2fv = (PFNGLUNIFORM2FVPROC) load(userptr, "glUniform2fv"); - glad_glUniform2i = (PFNGLUNIFORM2IPROC) load(userptr, "glUniform2i"); - glad_glUniform2iv = (PFNGLUNIFORM2IVPROC) load(userptr, "glUniform2iv"); - glad_glUniform3f = (PFNGLUNIFORM3FPROC) load(userptr, "glUniform3f"); - glad_glUniform3fv = (PFNGLUNIFORM3FVPROC) load(userptr, "glUniform3fv"); - glad_glUniform3i = (PFNGLUNIFORM3IPROC) load(userptr, "glUniform3i"); - glad_glUniform3iv = (PFNGLUNIFORM3IVPROC) load(userptr, "glUniform3iv"); - glad_glUniform4f = (PFNGLUNIFORM4FPROC) load(userptr, "glUniform4f"); - glad_glUniform4fv = (PFNGLUNIFORM4FVPROC) load(userptr, "glUniform4fv"); - glad_glUniform4i = (PFNGLUNIFORM4IPROC) load(userptr, "glUniform4i"); - glad_glUniform4iv = (PFNGLUNIFORM4IVPROC) load(userptr, "glUniform4iv"); - glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) load(userptr, "glUniformMatrix2fv"); - glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) load(userptr, "glUniformMatrix3fv"); - glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) load(userptr, "glUniformMatrix4fv"); - glad_glUseProgram = (PFNGLUSEPROGRAMPROC) load(userptr, "glUseProgram"); - glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) load(userptr, "glValidateProgram"); - glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d"); - glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv"); - glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f"); - glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv"); - glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s"); - glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv"); - glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d"); - glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv"); - glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f"); - glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv"); - glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s"); - glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv"); - glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d"); - glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv"); - glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f"); - glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv"); - glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s"); - glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv"); - glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load(userptr, "glVertexAttrib4Nbv"); - glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load(userptr, "glVertexAttrib4Niv"); - glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load(userptr, "glVertexAttrib4Nsv"); - glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub"); - glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv"); - glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load(userptr, "glVertexAttrib4Nuiv"); - glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load(userptr, "glVertexAttrib4Nusv"); - glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load(userptr, "glVertexAttrib4bv"); - glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d"); - glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv"); - glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f"); - glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv"); - glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load(userptr, "glVertexAttrib4iv"); - glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s"); - glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv"); - glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load(userptr, "glVertexAttrib4ubv"); - glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load(userptr, "glVertexAttrib4uiv"); - glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load(userptr, "glVertexAttrib4usv"); - glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer"); -} -static void glad_gl_load_GL_VERSION_2_1( GLADuserptrloadfunc load, void* userptr) { - if(!GLAD_GL_VERSION_2_1) return; - glad_glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC) load(userptr, "glUniformMatrix2x3fv"); - glad_glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC) load(userptr, "glUniformMatrix2x4fv"); - glad_glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC) load(userptr, "glUniformMatrix3x2fv"); - glad_glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC) load(userptr, "glUniformMatrix3x4fv"); - glad_glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC) load(userptr, "glUniformMatrix4x2fv"); - glad_glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC) load(userptr, "glUniformMatrix4x3fv"); -} -static void glad_gl_load_GL_VERSION_3_0( GLADuserptrloadfunc load, void* userptr) { - if(!GLAD_GL_VERSION_3_0) return; - glad_glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC) load(userptr, "glBeginConditionalRender"); - glad_glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC) load(userptr, "glBeginTransformFeedback"); - glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase"); - glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange"); - glad_glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC) load(userptr, "glBindFragDataLocation"); - glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load(userptr, "glBindFramebuffer"); - glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) load(userptr, "glBindRenderbuffer"); - glad_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) load(userptr, "glBindVertexArray"); - glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer"); - glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus"); - glad_glClampColor = (PFNGLCLAMPCOLORPROC) load(userptr, "glClampColor"); - glad_glClearBufferfi = (PFNGLCLEARBUFFERFIPROC) load(userptr, "glClearBufferfi"); - glad_glClearBufferfv = (PFNGLCLEARBUFFERFVPROC) load(userptr, "glClearBufferfv"); - glad_glClearBufferiv = (PFNGLCLEARBUFFERIVPROC) load(userptr, "glClearBufferiv"); - glad_glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC) load(userptr, "glClearBufferuiv"); - glad_glColorMaski = (PFNGLCOLORMASKIPROC) load(userptr, "glColorMaski"); - glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers"); - glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers"); - glad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) load(userptr, "glDeleteVertexArrays"); - glad_glDisablei = (PFNGLDISABLEIPROC) load(userptr, "glDisablei"); - glad_glEnablei = (PFNGLENABLEIPROC) load(userptr, "glEnablei"); - glad_glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC) load(userptr, "glEndConditionalRender"); - glad_glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC) load(userptr, "glEndTransformFeedback"); - glad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) load(userptr, "glFlushMappedBufferRange"); - glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer"); - glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(userptr, "glFramebufferTexture1D"); - glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D"); - glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(userptr, "glFramebufferTexture3D"); - glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer"); - glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers"); - glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers"); - glad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) load(userptr, "glGenVertexArrays"); - glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap"); - glad_glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC) load(userptr, "glGetBooleani_v"); - glad_glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC) load(userptr, "glGetFragDataLocation"); - glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv"); - glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v"); - glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv"); - glad_glGetStringi = (PFNGLGETSTRINGIPROC) load(userptr, "glGetStringi"); - glad_glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC) load(userptr, "glGetTexParameterIiv"); - glad_glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC) load(userptr, "glGetTexParameterIuiv"); - glad_glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) load(userptr, "glGetTransformFeedbackVarying"); - glad_glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC) load(userptr, "glGetUniformuiv"); - glad_glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC) load(userptr, "glGetVertexAttribIiv"); - glad_glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC) load(userptr, "glGetVertexAttribIuiv"); - glad_glIsEnabledi = (PFNGLISENABLEDIPROC) load(userptr, "glIsEnabledi"); - glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer"); - glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer"); - glad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC) load(userptr, "glIsVertexArray"); - glad_glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) load(userptr, "glMapBufferRange"); - glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage"); - glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample"); - glad_glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC) load(userptr, "glTexParameterIiv"); - glad_glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC) load(userptr, "glTexParameterIuiv"); - glad_glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC) load(userptr, "glTransformFeedbackVaryings"); - glad_glUniform1ui = (PFNGLUNIFORM1UIPROC) load(userptr, "glUniform1ui"); - glad_glUniform1uiv = (PFNGLUNIFORM1UIVPROC) load(userptr, "glUniform1uiv"); - glad_glUniform2ui = (PFNGLUNIFORM2UIPROC) load(userptr, "glUniform2ui"); - glad_glUniform2uiv = (PFNGLUNIFORM2UIVPROC) load(userptr, "glUniform2uiv"); - glad_glUniform3ui = (PFNGLUNIFORM3UIPROC) load(userptr, "glUniform3ui"); - glad_glUniform3uiv = (PFNGLUNIFORM3UIVPROC) load(userptr, "glUniform3uiv"); - glad_glUniform4ui = (PFNGLUNIFORM4UIPROC) load(userptr, "glUniform4ui"); - glad_glUniform4uiv = (PFNGLUNIFORM4UIVPROC) load(userptr, "glUniform4uiv"); - glad_glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC) load(userptr, "glVertexAttribI1i"); - glad_glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC) load(userptr, "glVertexAttribI1iv"); - glad_glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC) load(userptr, "glVertexAttribI1ui"); - glad_glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC) load(userptr, "glVertexAttribI1uiv"); - glad_glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC) load(userptr, "glVertexAttribI2i"); - glad_glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC) load(userptr, "glVertexAttribI2iv"); - glad_glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC) load(userptr, "glVertexAttribI2ui"); - glad_glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC) load(userptr, "glVertexAttribI2uiv"); - glad_glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC) load(userptr, "glVertexAttribI3i"); - glad_glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC) load(userptr, "glVertexAttribI3iv"); - glad_glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC) load(userptr, "glVertexAttribI3ui"); - glad_glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC) load(userptr, "glVertexAttribI3uiv"); - glad_glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC) load(userptr, "glVertexAttribI4bv"); - glad_glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC) load(userptr, "glVertexAttribI4i"); - glad_glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC) load(userptr, "glVertexAttribI4iv"); - glad_glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC) load(userptr, "glVertexAttribI4sv"); - glad_glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC) load(userptr, "glVertexAttribI4ubv"); - glad_glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC) load(userptr, "glVertexAttribI4ui"); - glad_glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC) load(userptr, "glVertexAttribI4uiv"); - glad_glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC) load(userptr, "glVertexAttribI4usv"); - glad_glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC) load(userptr, "glVertexAttribIPointer"); -} -static void glad_gl_load_GL_VERSION_3_1( GLADuserptrloadfunc load, void* userptr) { - if(!GLAD_GL_VERSION_3_1) return; - glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase"); - glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange"); - glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) load(userptr, "glCopyBufferSubData"); - glad_glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC) load(userptr, "glDrawArraysInstanced"); - glad_glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC) load(userptr, "glDrawElementsInstanced"); - glad_glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) load(userptr, "glGetActiveUniformBlockName"); - glad_glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC) load(userptr, "glGetActiveUniformBlockiv"); - glad_glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC) load(userptr, "glGetActiveUniformName"); - glad_glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC) load(userptr, "glGetActiveUniformsiv"); - glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v"); - glad_glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC) load(userptr, "glGetUniformBlockIndex"); - glad_glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC) load(userptr, "glGetUniformIndices"); - glad_glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC) load(userptr, "glPrimitiveRestartIndex"); - glad_glTexBuffer = (PFNGLTEXBUFFERPROC) load(userptr, "glTexBuffer"); - glad_glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC) load(userptr, "glUniformBlockBinding"); -} -static void glad_gl_load_GL_VERSION_3_2( GLADuserptrloadfunc load, void* userptr) { - if(!GLAD_GL_VERSION_3_2) return; - glad_glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) load(userptr, "glClientWaitSync"); - glad_glDeleteSync = (PFNGLDELETESYNCPROC) load(userptr, "glDeleteSync"); - glad_glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glDrawElementsBaseVertex"); - glad_glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) load(userptr, "glDrawElementsInstancedBaseVertex"); - glad_glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) load(userptr, "glDrawRangeElementsBaseVertex"); - glad_glFenceSync = (PFNGLFENCESYNCPROC) load(userptr, "glFenceSync"); - glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(userptr, "glFramebufferTexture"); - glad_glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC) load(userptr, "glGetBufferParameteri64v"); - glad_glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC) load(userptr, "glGetInteger64i_v"); - glad_glGetInteger64v = (PFNGLGETINTEGER64VPROC) load(userptr, "glGetInteger64v"); - glad_glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) load(userptr, "glGetMultisamplefv"); - glad_glGetSynciv = (PFNGLGETSYNCIVPROC) load(userptr, "glGetSynciv"); - glad_glIsSync = (PFNGLISSYNCPROC) load(userptr, "glIsSync"); - glad_glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glMultiDrawElementsBaseVertex"); - glad_glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC) load(userptr, "glProvokingVertex"); - glad_glSampleMaski = (PFNGLSAMPLEMASKIPROC) load(userptr, "glSampleMaski"); - glad_glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) load(userptr, "glTexImage2DMultisample"); - glad_glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) load(userptr, "glTexImage3DMultisample"); - glad_glWaitSync = (PFNGLWAITSYNCPROC) load(userptr, "glWaitSync"); -} -static void glad_gl_load_GL_VERSION_3_3( GLADuserptrloadfunc load, void* userptr) { - if(!GLAD_GL_VERSION_3_3) return; - glad_glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) load(userptr, "glBindFragDataLocationIndexed"); - glad_glBindSampler = (PFNGLBINDSAMPLERPROC) load(userptr, "glBindSampler"); - glad_glDeleteSamplers = (PFNGLDELETESAMPLERSPROC) load(userptr, "glDeleteSamplers"); - glad_glGenSamplers = (PFNGLGENSAMPLERSPROC) load(userptr, "glGenSamplers"); - glad_glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC) load(userptr, "glGetFragDataIndex"); - glad_glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC) load(userptr, "glGetQueryObjecti64v"); - glad_glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC) load(userptr, "glGetQueryObjectui64v"); - glad_glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC) load(userptr, "glGetSamplerParameterIiv"); - glad_glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC) load(userptr, "glGetSamplerParameterIuiv"); - glad_glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC) load(userptr, "glGetSamplerParameterfv"); - glad_glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC) load(userptr, "glGetSamplerParameteriv"); - glad_glIsSampler = (PFNGLISSAMPLERPROC) load(userptr, "glIsSampler"); - glad_glQueryCounter = (PFNGLQUERYCOUNTERPROC) load(userptr, "glQueryCounter"); - glad_glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC) load(userptr, "glSamplerParameterIiv"); - glad_glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC) load(userptr, "glSamplerParameterIuiv"); - glad_glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC) load(userptr, "glSamplerParameterf"); - glad_glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC) load(userptr, "glSamplerParameterfv"); - glad_glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC) load(userptr, "glSamplerParameteri"); - glad_glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC) load(userptr, "glSamplerParameteriv"); - glad_glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC) load(userptr, "glVertexAttribDivisor"); - glad_glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC) load(userptr, "glVertexAttribP1ui"); - glad_glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC) load(userptr, "glVertexAttribP1uiv"); - glad_glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC) load(userptr, "glVertexAttribP2ui"); - glad_glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC) load(userptr, "glVertexAttribP2uiv"); - glad_glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC) load(userptr, "glVertexAttribP3ui"); - glad_glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC) load(userptr, "glVertexAttribP3uiv"); - glad_glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC) load(userptr, "glVertexAttribP4ui"); - glad_glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC) load(userptr, "glVertexAttribP4uiv"); -} - - - -#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0) -#define GLAD_GL_IS_SOME_NEW_VERSION 1 -#else -#define GLAD_GL_IS_SOME_NEW_VERSION 0 -#endif - -static int glad_gl_get_extensions( int version, const char **out_exts, unsigned int *out_num_exts_i, char ***out_exts_i) { -#if GLAD_GL_IS_SOME_NEW_VERSION - if(GLAD_VERSION_MAJOR(version) < 3) { -#else - (void) version; - (void) out_num_exts_i; - (void) out_exts_i; -#endif - if (glad_glGetString == NULL) { - return 0; - } - *out_exts = (const char *)glad_glGetString(GL_EXTENSIONS); -#if GLAD_GL_IS_SOME_NEW_VERSION - } else { - unsigned int index = 0; - unsigned int num_exts_i = 0; - char **exts_i = NULL; - if (glad_glGetStringi == NULL || glad_glGetIntegerv == NULL) { - return 0; - } - glad_glGetIntegerv(GL_NUM_EXTENSIONS, (int*) &num_exts_i); - if (num_exts_i > 0) { - exts_i = (char **) malloc(num_exts_i * (sizeof *exts_i)); - } - if (exts_i == NULL) { - return 0; - } - for(index = 0; index < num_exts_i; index++) { - const char *gl_str_tmp = (const char*) glad_glGetStringi(GL_EXTENSIONS, index); - size_t len = strlen(gl_str_tmp) + 1; - - char *local_str = (char*) malloc(len * sizeof(char)); - if(local_str != NULL) { - memcpy(local_str, gl_str_tmp, len * sizeof(char)); - } - - exts_i[index] = local_str; - } - - *out_num_exts_i = num_exts_i; - *out_exts_i = exts_i; - } -#endif - return 1; -} -static void glad_gl_free_extensions(char **exts_i, unsigned int num_exts_i) { - if (exts_i != NULL) { - unsigned int index; - for(index = 0; index < num_exts_i; index++) { - free((void *) (exts_i[index])); - } - free((void *)exts_i); - exts_i = NULL; - } -} -static int glad_gl_has_extension(int version, const char *exts, unsigned int num_exts_i, char **exts_i, const char *ext) { - if(GLAD_VERSION_MAJOR(version) < 3 || !GLAD_GL_IS_SOME_NEW_VERSION) { - const char *extensions; - const char *loc; - const char *terminator; - extensions = exts; - if(extensions == NULL || ext == NULL) { - return 0; - } - while(1) { - loc = strstr(extensions, ext); - if(loc == NULL) { - return 0; - } - terminator = loc + strlen(ext); - if((loc == extensions || *(loc - 1) == ' ') && - (*terminator == ' ' || *terminator == '\0')) { - return 1; - } - extensions = terminator; - } - } else { - unsigned int index; - for(index = 0; index < num_exts_i; index++) { - const char *e = exts_i[index]; - if(strcmp(e, ext) == 0) { - return 1; - } - } - } - return 0; -} - -static GLADapiproc glad_gl_get_proc_from_userptr(void *userptr, const char* name) { - return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); -} - -static int glad_gl_find_extensions_gl( int version) { - const char *exts = NULL; - unsigned int num_exts_i = 0; - char **exts_i = NULL; - if (!glad_gl_get_extensions(version, &exts, &num_exts_i, &exts_i)) return 0; - - (void) glad_gl_has_extension; - - glad_gl_free_extensions(exts_i, num_exts_i); - - return 1; -} - -static int glad_gl_find_core_gl(void) { - int i; - const char* version; - const char* prefixes[] = { - "OpenGL ES-CM ", - "OpenGL ES-CL ", - "OpenGL ES ", - "OpenGL SC ", - NULL - }; - int major = 0; - int minor = 0; - version = (const char*) glad_glGetString(GL_VERSION); - if (!version) return 0; - for (i = 0; prefixes[i]; i++) { - const size_t length = strlen(prefixes[i]); - if (strncmp(version, prefixes[i], length) == 0) { - version += length; - break; - } - } - - GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor); - - GLAD_GL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; - GLAD_GL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1; - GLAD_GL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1; - GLAD_GL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1; - GLAD_GL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1; - GLAD_GL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1; - GLAD_GL_VERSION_2_0 = (major == 2 && minor >= 0) || major > 2; - GLAD_GL_VERSION_2_1 = (major == 2 && minor >= 1) || major > 2; - GLAD_GL_VERSION_3_0 = (major == 3 && minor >= 0) || major > 3; - GLAD_GL_VERSION_3_1 = (major == 3 && minor >= 1) || major > 3; - GLAD_GL_VERSION_3_2 = (major == 3 && minor >= 2) || major > 3; - GLAD_GL_VERSION_3_3 = (major == 3 && minor >= 3) || major > 3; - - return GLAD_MAKE_VERSION(major, minor); -} - -int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr) { - int version; - - glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); - if(glad_glGetString == NULL) return 0; - if(glad_glGetString(GL_VERSION) == NULL) return 0; - version = glad_gl_find_core_gl(); - - glad_gl_load_GL_VERSION_1_0(load, userptr); - glad_gl_load_GL_VERSION_1_1(load, userptr); - glad_gl_load_GL_VERSION_1_2(load, userptr); - glad_gl_load_GL_VERSION_1_3(load, userptr); - glad_gl_load_GL_VERSION_1_4(load, userptr); - glad_gl_load_GL_VERSION_1_5(load, userptr); - glad_gl_load_GL_VERSION_2_0(load, userptr); - glad_gl_load_GL_VERSION_2_1(load, userptr); - glad_gl_load_GL_VERSION_3_0(load, userptr); - glad_gl_load_GL_VERSION_3_1(load, userptr); - glad_gl_load_GL_VERSION_3_2(load, userptr); - glad_gl_load_GL_VERSION_3_3(load, userptr); - - if (!glad_gl_find_extensions_gl(version)) return 0; - - - - return version; -} - - -int gladLoadGL( GLADloadfunc load) { - return gladLoadGLUserPtr( glad_gl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); -} - - - - - -#ifdef GLAD_GL - -#ifndef GLAD_LOADER_LIBRARY_C_ -#define GLAD_LOADER_LIBRARY_C_ - -#include -#include - -#if GLAD_PLATFORM_WIN32 -#include -#else -#include -#endif - - -static void* glad_get_dlopen_handle(const char *lib_names[], int length) { - void *handle = NULL; - int i; - - for (i = 0; i < length; ++i) { -#if GLAD_PLATFORM_WIN32 - #if GLAD_PLATFORM_UWP - size_t buffer_size = (strlen(lib_names[i]) + 1) * sizeof(WCHAR); - LPWSTR buffer = (LPWSTR) malloc(buffer_size); - if (buffer != NULL) { - int ret = MultiByteToWideChar(CP_ACP, 0, lib_names[i], -1, buffer, buffer_size); - if (ret != 0) { - handle = (void*) LoadPackagedLibrary(buffer, 0); - } - free((void*) buffer); - } - #else - handle = (void*) LoadLibraryA(lib_names[i]); - #endif -#else - handle = dlopen(lib_names[i], RTLD_LAZY | RTLD_LOCAL); -#endif - if (handle != NULL) { - return handle; - } - } - - return NULL; -} - -static void glad_close_dlopen_handle(void* handle) { - if (handle != NULL) { -#if GLAD_PLATFORM_WIN32 - FreeLibrary((HMODULE) handle); -#else - dlclose(handle); -#endif - } -} - -static GLADapiproc glad_dlsym_handle(void* handle, const char *name) { - if (handle == NULL) { - return NULL; - } - -#if GLAD_PLATFORM_WIN32 - return (GLADapiproc) GetProcAddress((HMODULE) handle, name); -#else - return GLAD_GNUC_EXTENSION (GLADapiproc) dlsym(handle, name); -#endif -} - -#endif /* GLAD_LOADER_LIBRARY_C_ */ - -typedef void* (GLAD_API_PTR *GLADglprocaddrfunc)(const char*); -struct _glad_gl_userptr { - void *handle; - GLADglprocaddrfunc gl_get_proc_address_ptr; -}; - -static GLADapiproc glad_gl_get_proc(void *vuserptr, const char *name) { - struct _glad_gl_userptr userptr = *(struct _glad_gl_userptr*) vuserptr; - GLADapiproc result = NULL; - - if(userptr.gl_get_proc_address_ptr != NULL) { - result = GLAD_GNUC_EXTENSION (GLADapiproc) userptr.gl_get_proc_address_ptr(name); - } - if(result == NULL) { - result = glad_dlsym_handle(userptr.handle, name); - } - - return result; -} - -static void* _gl_handle = NULL; - -static void* glad_gl_dlopen_handle(void) { -#if GLAD_PLATFORM_APPLE - static const char *NAMES[] = { - "../Frameworks/OpenGL.framework/OpenGL", - "/Library/Frameworks/OpenGL.framework/OpenGL", - "/System/Library/Frameworks/OpenGL.framework/OpenGL", - "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL" - }; -#elif GLAD_PLATFORM_WIN32 - static const char *NAMES[] = {"opengl32.dll"}; -#else - static const char *NAMES[] = { - #if defined(__CYGWIN__) - "libGL-1.so", - #endif - "libGL.so.1", - "libGL.so" - }; -#endif - - if (_gl_handle == NULL) { - _gl_handle = glad_get_dlopen_handle(NAMES, sizeof(NAMES) / sizeof(NAMES[0])); - } - - return _gl_handle; -} - -static struct _glad_gl_userptr glad_gl_build_userptr(void *handle) { - struct _glad_gl_userptr userptr; - - userptr.handle = handle; -#if GLAD_PLATFORM_APPLE || defined(__HAIKU__) - userptr.gl_get_proc_address_ptr = NULL; -#elif GLAD_PLATFORM_WIN32 - userptr.gl_get_proc_address_ptr = - (GLADglprocaddrfunc) glad_dlsym_handle(handle, "wglGetProcAddress"); -#else - userptr.gl_get_proc_address_ptr = - (GLADglprocaddrfunc) glad_dlsym_handle(handle, "glXGetProcAddressARB"); -#endif - - return userptr; -} - -int gladLoaderLoadGL(void) { - int version = 0; - void *handle; - int did_load = 0; - struct _glad_gl_userptr userptr; - - did_load = _gl_handle == NULL; - handle = glad_gl_dlopen_handle(); - if (handle) { - userptr = glad_gl_build_userptr(handle); - - version = gladLoadGLUserPtr(glad_gl_get_proc, &userptr); - - if (did_load) { - gladLoaderUnloadGL(); - } - } - - return version; -} - - - -void gladLoaderUnloadGL(void) { - if (_gl_handle != NULL) { - glad_close_dlopen_handle(_gl_handle); - _gl_handle = NULL; - } -} - -#endif /* GLAD_GL */ - -#ifdef __cplusplus -} -#endif - -#endif /* GLAD_GL_IMPLEMENTATION */ - diff --git a/rts/Rml/Backends/RmlUi_Renderer_GL3.cpp b/rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.cpp similarity index 63% rename from rts/Rml/Backends/RmlUi_Renderer_GL3.cpp rename to rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.cpp index 0ecdc8ee14..b45978714e 100644 --- a/rts/Rml/Backends/RmlUi_Renderer_GL3.cpp +++ b/rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.cpp @@ -28,7 +28,7 @@ * */ -#include "RmlUi_Renderer_GL3.h" +#include "RmlUi_Renderer_GL3_Spring.h" #include #include #include @@ -36,24 +36,14 @@ #include #if defined(RMLUI_PLATFORM_WIN32) && !defined(__MINGW32__) - // function call missing argument list - #pragma warning(disable : 4551) - // unreferenced local function has been removed - #pragma warning(disable : 4505) +// function call missing argument list +#pragma warning(disable : 4551) +// unreferenced local function has been removed +#pragma warning(disable : 4505) #endif -// #if defined RMLUI_PLATFORM_EMSCRIPTEN -// #define RMLUI_SHADER_HEADER "#version 300 es\nprecision highp float;\n" -// #include -// #elif defined RMLUI_GL3_CUSTOM_LOADER -// #define RMLUI_SHADER_HEADER "#version 300\n" -// #include RMLUI_GL3_CUSTOM_LOADER -// #else -// #define RMLUI_SHADER_HEADER "#version 130\n" -// #define GLAD_GL_IMPLEMENTATION -// #include "RmlUi_Include_GL3.h" -// #endif #include "Rendering/GL/myGL.h" +#include "Rendering/Textures/Bitmap.h" #define RMLUI_SHADER_HEADER "#version 130\n" static const char* shader_main_vertex = RMLUI_SHADER_HEADER R"( @@ -101,13 +91,16 @@ void main() { } )"; -namespace Gfx { +namespace Gfx +{ enum class ProgramUniform { Translate, Transform, Tex, Count }; -static const char* const program_uniform_names[(size_t)ProgramUniform::Count] = {"_translate", "_transform", "_tex"}; +static const char* const program_uniform_names[(size_t)ProgramUniform::Count] = { + "_translate", "_transform", "_tex"}; enum class VertexAttribute { Position, Color0, TexCoord0, Count }; -static const char* const vertex_attribute_names[(size_t)VertexAttribute::Count] = {"inPosition", "inColor0", "inTexCoord0"}; +static const char* const vertex_attribute_names[(size_t)VertexAttribute::Count] = { + "inPosition", "inColor0", "inTexCoord0"}; struct CompiledGeometryData { Rml::TextureHandle texture; @@ -134,20 +127,21 @@ static void CheckGLError(const char* operation_name) { #ifdef RMLUI_DEBUG GLenum error_code = glGetError(); - if (error_code != GL_NO_ERROR) - { - static const Rml::Pair error_names[] = {{GL_INVALID_ENUM, "GL_INVALID_ENUM"}, {GL_INVALID_VALUE, "GL_INVALID_VALUE"}, - {GL_INVALID_OPERATION, "GL_INVALID_OPERATION"}, {GL_OUT_OF_MEMORY, "GL_OUT_OF_MEMORY"}}; + if (error_code != GL_NO_ERROR) { + static const Rml::Pair error_names[] = { + {GL_INVALID_ENUM, "GL_INVALID_ENUM"}, + {GL_INVALID_VALUE, "GL_INVALID_VALUE"}, + {GL_INVALID_OPERATION, "GL_INVALID_OPERATION"}, + {GL_OUT_OF_MEMORY, "GL_OUT_OF_MEMORY"}}; const char* error_str = "''"; - for (auto& err : error_names) - { - if (err.first == error_code) - { + for (auto& err : error_names) { + if (err.first == error_code) { error_str = err.second; break; } } - Rml::Log::Message(Rml::Log::LT_ERROR, "OpenGL error during %s. Error code 0x%x (%s).", operation_name, error_code, error_str); + Rml::Log::Message(Rml::Log::LT_ERROR, "OpenGL error during %s. Error code 0x%x (%s).", + operation_name, error_code, error_str); } #endif (void)operation_name; @@ -163,14 +157,14 @@ static GLuint CreateShader(GLenum shader_type, const char* code_string) GLint status = 0; glGetShaderiv(id, GL_COMPILE_STATUS, &status); - if (status == GL_FALSE) - { + if (status == GL_FALSE) { GLint info_log_length = 0; glGetShaderiv(id, GL_INFO_LOG_LENGTH, &info_log_length); char* info_log_string = new char[info_log_length + 1]; glGetShaderInfoLog(id, info_log_length, NULL, info_log_string); - Rml::Log::Message(Rml::Log::LT_ERROR, "Compile failure in OpenGL shader: %s", info_log_string); + Rml::Log::Message(Rml::Log::LT_ERROR, "Compile failure in OpenGL shader: %s", + info_log_string); delete[] info_log_string; glDeleteShader(id); return 0; @@ -183,8 +177,7 @@ static GLuint CreateShader(GLenum shader_type, const char* code_string) static void BindAttribLocations(GLuint program) { - for (GLuint i = 0; i < (GLuint)VertexAttribute::Count; i++) - { + for (GLuint i = 0; i < (GLuint)VertexAttribute::Count; i++) { glBindAttribLocation(program, i, vertex_attribute_names[i]); } CheckGLError("BindAttribLocations"); @@ -207,14 +200,14 @@ static bool CreateProgram(GLuint vertex_shader, GLuint fragment_shader, ProgramD GLint status = 0; glGetProgramiv(id, GL_LINK_STATUS, &status); - if (status == GL_FALSE) - { + if (status == GL_FALSE) { GLint info_log_length = 0; glGetProgramiv(id, GL_INFO_LOG_LENGTH, &info_log_length); char* info_log_string = new char[info_log_length + 1]; glGetProgramInfoLog(id, info_log_length, NULL, info_log_string); - Rml::Log::Message(Rml::Log::LT_ERROR, "OpenGL program linking failure: %s", info_log_string); + Rml::Log::Message(Rml::Log::LT_ERROR, "OpenGL program linking failure: %s", + info_log_string); delete[] info_log_string; glDeleteProgram(id); return false; @@ -229,8 +222,7 @@ static bool CreateProgram(GLuint vertex_shader, GLuint fragment_shader, ProgramD constexpr size_t name_size = 64; GLchar name_buf[name_size] = ""; - for (int unif = 0; unif < num_active_uniforms; ++unif) - { + for (int unif = 0; unif < num_active_uniforms; ++unif) { GLint array_size = 0; GLenum type = 0; GLsizei actual_length = 0; @@ -239,23 +231,19 @@ static bool CreateProgram(GLuint vertex_shader, GLuint fragment_shader, ProgramD // See if we have the name in our pre-defined name list. ProgramUniform program_uniform = ProgramUniform::Count; - for (int i = 0; i < (int)ProgramUniform::Count; i++) - { + for (int i = 0; i < (int)ProgramUniform::Count; i++) { const char* uniform_name = program_uniform_names[i]; - if (strcmp(name_buf, uniform_name) == 0) - { + if (strcmp(name_buf, uniform_name) == 0) { program_uniform = (ProgramUniform)i; break; } } - if ((size_t)program_uniform < (size_t)ProgramUniform::Count) - { + if ((size_t)program_uniform < (size_t)ProgramUniform::Count) { out_program.uniform_locations[(size_t)program_uniform] = location; - } - else - { - Rml::Log::Message(Rml::Log::LT_ERROR, "OpenGL program uses unknown uniform '%s'.", name_buf); + } else { + Rml::Log::Message(Rml::Log::LT_ERROR, "OpenGL program uses unknown uniform '%s'.", + name_buf); return false; } } @@ -273,32 +261,31 @@ static bool CreateShaders(ShadersData& out_shaders) GLuint& main_fragment_texture = out_shaders.shader_main_fragment_texture; main_vertex = CreateShader(GL_VERTEX_SHADER, shader_main_vertex); - if (!main_vertex) - { - Rml::Log::Message(Rml::Log::LT_ERROR, "Could not create OpenGL shader: 'shader_main_vertex'."); + if (!main_vertex) { + Rml::Log::Message(Rml::Log::LT_ERROR, + "Could not create OpenGL shader: 'shader_main_vertex'."); return false; } main_fragment_color = CreateShader(GL_FRAGMENT_SHADER, shader_main_fragment_color); - if (!main_fragment_color) - { - Rml::Log::Message(Rml::Log::LT_ERROR, "Could not create OpenGL shader: 'shader_main_fragment_color'."); + if (!main_fragment_color) { + Rml::Log::Message(Rml::Log::LT_ERROR, + "Could not create OpenGL shader: 'shader_main_fragment_color'."); return false; } main_fragment_texture = CreateShader(GL_FRAGMENT_SHADER, shader_main_fragment_texture); - if (!main_fragment_texture) - { - Rml::Log::Message(Rml::Log::LT_ERROR, "Could not create OpenGL shader: 'shader_main_fragment_texture'."); + if (!main_fragment_texture) { + Rml::Log::Message(Rml::Log::LT_ERROR, + "Could not create OpenGL shader: 'shader_main_fragment_texture'."); return false; } - if (!CreateProgram(main_vertex, main_fragment_color, out_shaders.program_color)) - { + if (!CreateProgram(main_vertex, main_fragment_color, out_shaders.program_color)) { Rml::Log::Message(Rml::Log::LT_ERROR, "Could not create OpenGL program: 'program_color'."); return false; } - if (!CreateProgram(main_vertex, main_fragment_texture, out_shaders.program_texture)) - { - Rml::Log::Message(Rml::Log::LT_ERROR, "Could not create OpenGL program: 'program_texture'."); + if (!CreateProgram(main_vertex, main_fragment_texture, out_shaders.program_texture)) { + Rml::Log::Message(Rml::Log::LT_ERROR, + "Could not create OpenGL program: 'program_texture'."); return false; } @@ -317,9 +304,9 @@ static void DestroyShaders(ShadersData& shaders) shaders = {}; } -} // namespace Gfx +} // namespace Gfx -RenderInterface_GL3::RenderInterface_GL3() +RenderInterface_GL3_Spring::RenderInterface_GL3_Spring() { shaders = Rml::MakeUnique(); @@ -327,19 +314,19 @@ RenderInterface_GL3::RenderInterface_GL3() shaders.reset(); } -RenderInterface_GL3::~RenderInterface_GL3() +RenderInterface_GL3_Spring::~RenderInterface_GL3_Spring() { if (shaders) Gfx::DestroyShaders(*shaders); } -void RenderInterface_GL3::SetViewport(int width, int height) +void RenderInterface_GL3_Spring::SetViewport(int width, int height) { viewport_width = width; viewport_height = height; } -void RenderInterface_GL3::BeginFrame() +void RenderInterface_GL3_Spring::BeginFrame() { RMLUI_ASSERT(viewport_width >= 0 && viewport_height >= 0); @@ -395,11 +382,12 @@ void RenderInterface_GL3::BeginFrame() glStencilMask(GLuint(-1)); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); - projection = Rml::Matrix4f::ProjectOrtho(0, (float)viewport_width, (float)viewport_height, 0, -10000, 10000); + projection = Rml::Matrix4f::ProjectOrtho(0, (float)viewport_width, (float)viewport_height, 0, + -10000, 10000); SetTransform(nullptr); } -void RenderInterface_GL3::EndFrame() +void RenderInterface_GL3_Spring::EndFrame() { // Restore GL state. if (glstate_backup.enable_cull_face) @@ -422,48 +410,59 @@ void RenderInterface_GL3::EndFrame() else glDisable(GL_SCISSOR_TEST); - glViewport(glstate_backup.viewport[0], glstate_backup.viewport[1], glstate_backup.viewport[2], glstate_backup.viewport[3]); - glScissor(glstate_backup.scissor[0], glstate_backup.scissor[1], glstate_backup.scissor[2], glstate_backup.scissor[3]); + glViewport(glstate_backup.viewport[0], glstate_backup.viewport[1], glstate_backup.viewport[2], + glstate_backup.viewport[3]); + glScissor(glstate_backup.scissor[0], glstate_backup.scissor[1], glstate_backup.scissor[2], + glstate_backup.scissor[3]); glClearStencil(glstate_backup.stencil_clear_value); - glClearColor(glstate_backup.color_clear_value[0], glstate_backup.color_clear_value[1], glstate_backup.color_clear_value[2], - glstate_backup.color_clear_value[3]); + glClearColor(glstate_backup.color_clear_value[0], glstate_backup.color_clear_value[1], + glstate_backup.color_clear_value[2], glstate_backup.color_clear_value[3]); glBlendEquationSeparate(glstate_backup.blend_equation_rgb, glstate_backup.blend_equation_alpha); - glBlendFuncSeparate(glstate_backup.blend_src_rgb, glstate_backup.blend_dst_rgb, glstate_backup.blend_src_alpha, glstate_backup.blend_dst_alpha); + glBlendFuncSeparate(glstate_backup.blend_src_rgb, glstate_backup.blend_dst_rgb, + glstate_backup.blend_src_alpha, glstate_backup.blend_dst_alpha); - glStencilFuncSeparate(GL_FRONT, glstate_backup.stencil_front.func, glstate_backup.stencil_front.ref, glstate_backup.stencil_front.value_mask); + glStencilFuncSeparate(GL_FRONT, glstate_backup.stencil_front.func, + glstate_backup.stencil_front.ref, + glstate_backup.stencil_front.value_mask); glStencilMaskSeparate(GL_FRONT, glstate_backup.stencil_front.writemask); - glStencilOpSeparate(GL_FRONT, glstate_backup.stencil_front.fail, glstate_backup.stencil_front.pass_depth_fail, - glstate_backup.stencil_front.pass_depth_pass); + glStencilOpSeparate(GL_FRONT, glstate_backup.stencil_front.fail, + glstate_backup.stencil_front.pass_depth_fail, + glstate_backup.stencil_front.pass_depth_pass); - glStencilFuncSeparate(GL_BACK, glstate_backup.stencil_back.func, glstate_backup.stencil_back.ref, glstate_backup.stencil_back.value_mask); + glStencilFuncSeparate(GL_BACK, glstate_backup.stencil_back.func, + glstate_backup.stencil_back.ref, glstate_backup.stencil_back.value_mask); glStencilMaskSeparate(GL_BACK, glstate_backup.stencil_back.writemask); - glStencilOpSeparate(GL_BACK, glstate_backup.stencil_back.fail, glstate_backup.stencil_back.pass_depth_fail, - glstate_backup.stencil_back.pass_depth_pass); + glStencilOpSeparate(GL_BACK, glstate_backup.stencil_back.fail, + glstate_backup.stencil_back.pass_depth_fail, + glstate_backup.stencil_back.pass_depth_pass); } -void RenderInterface_GL3::Clear() +void RenderInterface_GL3_Spring::Clear() { glClearStencil(0); glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); } -void RenderInterface_GL3::RenderGeometry(Rml::Vertex* vertices, int num_vertices, int* indices, int num_indices, const Rml::TextureHandle texture, - const Rml::Vector2f& translation) +void RenderInterface_GL3_Spring::RenderGeometry(Rml::Vertex* vertices, int num_vertices, int* indices, + int num_indices, const Rml::TextureHandle texture, + const Rml::Vector2f& translation) { - Rml::CompiledGeometryHandle geometry = CompileGeometry(vertices, num_vertices, indices, num_indices, texture); + Rml::CompiledGeometryHandle geometry = + CompileGeometry(vertices, num_vertices, indices, num_indices, texture); - if (geometry) - { + if (geometry) { RenderCompiledGeometry(geometry, translation); ReleaseCompiledGeometry(geometry); } } -Rml::CompiledGeometryHandle RenderInterface_GL3::CompileGeometry(Rml::Vertex* vertices, int num_vertices, int* indices, int num_indices, - Rml::TextureHandle texture) +Rml::CompiledGeometryHandle RenderInterface_GL3_Spring::CompileGeometry(Rml::Vertex* vertices, + int num_vertices, int* indices, + int num_indices, + Rml::TextureHandle texture) { constexpr GLenum draw_usage = GL_STATIC_DRAW; @@ -477,22 +476,24 @@ Rml::CompiledGeometryHandle RenderInterface_GL3::CompileGeometry(Rml::Vertex* ve glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo); - glBufferData(GL_ARRAY_BUFFER, sizeof(Rml::Vertex) * num_vertices, (const void*)vertices, draw_usage); + glBufferData(GL_ARRAY_BUFFER, sizeof(Rml::Vertex) * num_vertices, (const void*)vertices, + draw_usage); glEnableVertexAttribArray((GLuint)Gfx::VertexAttribute::Position); - glVertexAttribPointer((GLuint)Gfx::VertexAttribute::Position, 2, GL_FLOAT, GL_FALSE, sizeof(Rml::Vertex), - (const GLvoid*)(offsetof(Rml::Vertex, position))); + glVertexAttribPointer((GLuint)Gfx::VertexAttribute::Position, 2, GL_FLOAT, GL_FALSE, + sizeof(Rml::Vertex), (const GLvoid*)(offsetof(Rml::Vertex, position))); glEnableVertexAttribArray((GLuint)Gfx::VertexAttribute::Color0); - glVertexAttribPointer((GLuint)Gfx::VertexAttribute::Color0, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Rml::Vertex), - (const GLvoid*)(offsetof(Rml::Vertex, colour))); + glVertexAttribPointer((GLuint)Gfx::VertexAttribute::Color0, 4, GL_UNSIGNED_BYTE, GL_TRUE, + sizeof(Rml::Vertex), (const GLvoid*)(offsetof(Rml::Vertex, colour))); glEnableVertexAttribArray((GLuint)Gfx::VertexAttribute::TexCoord0); - glVertexAttribPointer((GLuint)Gfx::VertexAttribute::TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(Rml::Vertex), - (const GLvoid*)(offsetof(Rml::Vertex, tex_coord))); + glVertexAttribPointer((GLuint)Gfx::VertexAttribute::TexCoord0, 2, GL_FLOAT, GL_FALSE, + sizeof(Rml::Vertex), (const GLvoid*)(offsetof(Rml::Vertex, tex_coord))); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int) * num_indices, (const void*)indices, draw_usage); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int) * num_indices, (const void*)indices, + draw_usage); glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); @@ -509,24 +510,30 @@ Rml::CompiledGeometryHandle RenderInterface_GL3::CompileGeometry(Rml::Vertex* ve return (Rml::CompiledGeometryHandle)geometry; } -void RenderInterface_GL3::RenderCompiledGeometry(Rml::CompiledGeometryHandle handle, const Rml::Vector2f& translation) +void RenderInterface_GL3_Spring::RenderCompiledGeometry(Rml::CompiledGeometryHandle handle, + const Rml::Vector2f& translation) { Gfx::CompiledGeometryData* geometry = (Gfx::CompiledGeometryData*)handle; - if (geometry->texture) - { + if (geometry->texture) { glUseProgram(shaders->program_texture.id); if (geometry->texture != TextureEnableWithoutBinding) glBindTexture(GL_TEXTURE_2D, (GLuint)geometry->texture); - SubmitTransformUniform(ProgramId::Texture, shaders->program_texture.uniform_locations[(size_t)Gfx::ProgramUniform::Transform]); - glUniform2fv(shaders->program_texture.uniform_locations[(size_t)Gfx::ProgramUniform::Translate], 1, &translation.x); - } - else - { + SubmitTransformUniform( + ProgramId::Texture, + shaders->program_texture.uniform_locations[(size_t)Gfx::ProgramUniform::Transform]); + glUniform2fv( + shaders->program_texture.uniform_locations[(size_t)Gfx::ProgramUniform::Translate], 1, + &translation.x); + } else { glUseProgram(shaders->program_color.id); glBindTexture(GL_TEXTURE_2D, 0); - SubmitTransformUniform(ProgramId::Color, shaders->program_color.uniform_locations[(size_t)Gfx::ProgramUniform::Transform]); - glUniform2fv(shaders->program_color.uniform_locations[(size_t)Gfx::ProgramUniform::Translate], 1, &translation.x); + SubmitTransformUniform( + ProgramId::Color, + shaders->program_color.uniform_locations[(size_t)Gfx::ProgramUniform::Transform]); + glUniform2fv( + shaders->program_color.uniform_locations[(size_t)Gfx::ProgramUniform::Translate], 1, + &translation.x); } glBindVertexArray(geometry->vao); @@ -539,7 +546,7 @@ void RenderInterface_GL3::RenderCompiledGeometry(Rml::CompiledGeometryHandle han Gfx::CheckGLError("RenderCompiledGeometry"); } -void RenderInterface_GL3::ReleaseCompiledGeometry(Rml::CompiledGeometryHandle handle) +void RenderInterface_GL3_Spring::ReleaseCompiledGeometry(Rml::CompiledGeometryHandle handle) { Gfx::CompiledGeometryData* geometry = (Gfx::CompiledGeometryData*)handle; @@ -550,15 +557,14 @@ void RenderInterface_GL3::ReleaseCompiledGeometry(Rml::CompiledGeometryHandle ha delete geometry; } -void RenderInterface_GL3::EnableScissorRegion(bool enable) +void RenderInterface_GL3_Spring::EnableScissorRegion(bool enable) { ScissoringState new_state = ScissoringState::Disable; if (enable) new_state = (transform_active ? ScissoringState::Stencil : ScissoringState::Scissor); - if (new_state != scissoring_state) - { + if (new_state != scissoring_state) { // Disable old if (scissoring_state == ScissoringState::Scissor) glDisable(GL_SCISSOR_TEST); @@ -575,10 +581,9 @@ void RenderInterface_GL3::EnableScissorRegion(bool enable) } } -void RenderInterface_GL3::SetScissorRegion(int x, int y, int width, int height) +void RenderInterface_GL3_Spring::SetScissorRegion(int x, int y, int width, int height) { - if (transform_active) - { + if (transform_active) { const float left = float(x); const float right = float(x + width); const float top = float(y); @@ -602,128 +607,35 @@ void RenderInterface_GL3::SetScissorRegion(int x, int y, int width, int height) glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glStencilFunc(GL_EQUAL, 1, GLuint(-1)); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - } - else - { + } else { glScissor(x, viewport_height - (y + height), width, height); } } -// Set to byte packing, or the compiler will expand our struct, which means it won't read correctly from file -#pragma pack(1) -struct TGAHeader { - char idLength; - char colourMapType; - char dataType; - short int colourMapOrigin; - short int colourMapLength; - char colourMapDepth; - short int xOrigin; - short int yOrigin; - short int width; - short int height; - char bitsPerPixel; - char imageDescriptor; -}; // Restore packing #pragma pack() -bool RenderInterface_GL3::LoadTexture(Rml::TextureHandle& texture_handle, Rml::Vector2i& texture_dimensions, const Rml::String& source) +bool RenderInterface_GL3_Spring::LoadTexture(Rml::TextureHandle& texture_handle, + Rml::Vector2i& texture_dimensions, + const Rml::String& source) override { - Rml::FileInterface* file_interface = Rml::GetFileInterface(); - Rml::FileHandle file_handle = file_interface->Open(source); - if (!file_handle) - { - return false; - } - - file_interface->Seek(file_handle, 0, SEEK_END); - size_t buffer_size = file_interface->Tell(file_handle); - file_interface->Seek(file_handle, 0, SEEK_SET); - - if (buffer_size <= sizeof(TGAHeader)) - { - Rml::Log::Message(Rml::Log::LT_ERROR, "Texture file size is smaller than TGAHeader, file is not a valid TGA image."); - file_interface->Close(file_handle); - return false; - } - - using Rml::byte; - byte* buffer = new byte[buffer_size]; - file_interface->Read(buffer, buffer_size, file_handle); - file_interface->Close(file_handle); - - TGAHeader header; - memcpy(&header, buffer, sizeof(TGAHeader)); - - int color_mode = header.bitsPerPixel / 8; - int image_size = header.width * header.height * 4; // We always make 32bit textures - - if (header.dataType != 2) - { - Rml::Log::Message(Rml::Log::LT_ERROR, "Only 24/32bit uncompressed TGAs are supported."); - delete[] buffer; - return false; - } - - // Ensure we have at least 3 colors - if (color_mode < 3) - { - Rml::Log::Message(Rml::Log::LT_ERROR, "Only 24 and 32bit textures are supported."); - delete[] buffer; + CBitmap bmp; + if (!bmp.Load(source)) { return false; } - - const byte* image_src = buffer + sizeof(TGAHeader); - byte* image_dest = new byte[image_size]; - - // Targa is BGR, swap to RGB and flip Y axis - for (long y = 0; y < header.height; y++) - { - long read_index = y * header.width * color_mode; - long write_index = ((header.imageDescriptor & 32) != 0) ? read_index : (header.height - y - 1) * header.width * 4; - for (long x = 0; x < header.width; x++) - { - image_dest[write_index] = image_src[read_index + 2]; - image_dest[write_index + 1] = image_src[read_index + 1]; - image_dest[write_index + 2] = image_src[read_index]; - if (color_mode == 4) - { - const int alpha = image_src[read_index + 3]; -#ifdef RMLUI_SRGB_PREMULTIPLIED_ALPHA - image_dest[write_index + 0] = (image_dest[write_index + 0] * alpha) / 255; - image_dest[write_index + 1] = (image_dest[write_index + 1] * alpha) / 255; - image_dest[write_index + 2] = (image_dest[write_index + 2] * alpha) / 255; -#endif - image_dest[write_index + 3] = (byte)alpha; - } - else - { - image_dest[write_index + 3] = 255; - } - - write_index += 4; - read_index += color_mode; - } - } - - texture_dimensions.x = header.width; - texture_dimensions.y = header.height; - - bool success = GenerateTexture(texture_handle, image_dest, texture_dimensions); - - delete[] image_dest; - delete[] buffer; - - return success; + texture_dimensions.x = bmp.xsize; + texture_dimensions.y = bmp.ysize; + texture_handle = bmp.CreateTexture(); + return texture_handle != 0; } -bool RenderInterface_GL3::GenerateTexture(Rml::TextureHandle& texture_handle, const Rml::byte* source, const Rml::Vector2i& source_dimensions) +bool RenderInterface_GL3_Spring::GenerateTexture(Rml::TextureHandle& texture_handle, + const Rml::byte* source, + const Rml::Vector2i& source_dimensions) { GLuint texture_id = 0; glGenTextures(1, &texture_id); - if (texture_id == 0) - { + if (texture_id == 0) { Rml::Log::Message(Rml::Log::LT_ERROR, "Failed to generate texture."); return false; } @@ -731,7 +643,8 @@ bool RenderInterface_GL3::GenerateTexture(Rml::TextureHandle& texture_handle, co glBindTexture(GL_TEXTURE_2D, texture_id); GLint internal_format = GL_RGBA8; - glTexImage2D(GL_TEXTURE_2D, 0, internal_format, source_dimensions.x, source_dimensions.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, source); + glTexImage2D(GL_TEXTURE_2D, 0, internal_format, source_dimensions.x, source_dimensions.y, 0, + GL_RGBA, GL_UNSIGNED_BYTE, source); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -745,51 +658,22 @@ bool RenderInterface_GL3::GenerateTexture(Rml::TextureHandle& texture_handle, co return true; } -void RenderInterface_GL3::ReleaseTexture(Rml::TextureHandle texture_handle) +void RenderInterface_GL3_Spring::ReleaseTexture(Rml::TextureHandle texture_handle) { glDeleteTextures(1, (GLuint*)&texture_handle); } -void RenderInterface_GL3::SetTransform(const Rml::Matrix4f* new_transform) +void RenderInterface_GL3_Spring::SetTransform(const Rml::Matrix4f* new_transform) { transform_active = (new_transform != nullptr); transform = projection * (new_transform ? *new_transform : Rml::Matrix4f::Identity()); transform_dirty_state = ProgramId::All; } -void RenderInterface_GL3::SubmitTransformUniform(ProgramId program_id, int uniform_location) +void RenderInterface_GL3_Spring::SubmitTransformUniform(ProgramId program_id, int uniform_location) { - if ((int)program_id & (int)transform_dirty_state) - { + if ((int)program_id & (int)transform_dirty_state) { glUniformMatrix4fv(uniform_location, 1, false, transform.data()); transform_dirty_state = ProgramId((int)transform_dirty_state & ~(int)program_id); } } - -bool RmlGL3::Initialize(Rml::String* out_message) -{ -// #if defined RMLUI_PLATFORM_EMSCRIPTEN -// if (out_message) -// *out_message = "Started Emscripten WebGL renderer."; -// #elif !defined RMLUI_GL3_CUSTOM_LOADER -// const int gl_version = gladLoaderLoadGL(); -// if (gl_version == 0) -// { -// if (out_message) -// *out_message = "Failed to initialize OpenGL context."; -// return false; -// } - -// if (out_message) -// *out_message = Rml::CreateString(128, "Loaded OpenGL %d.%d.", GLAD_VERSION_MAJOR(gl_version), GLAD_VERSION_MINOR(gl_version)); -// #endif - - return true; -} - -void RmlGL3::Shutdown() -{ -#if !defined RMLUI_PLATFORM_EMSCRIPTEN && !defined RMLUI_GL3_CUSTOM_LOADER - // gladLoaderUnloadGL(); -#endif -} diff --git a/rts/Rml/Backends/RmlUi_Renderer_GL3.h b/rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.h similarity index 89% rename from rts/Rml/Backends/RmlUi_Renderer_GL3.h rename to rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.h index 2401d8e230..8fd34bc6ef 100644 --- a/rts/Rml/Backends/RmlUi_Renderer_GL3.h +++ b/rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.h @@ -28,20 +28,20 @@ * */ -#ifndef RMLUI_BACKENDS_RENDERER_GL3_H -#define RMLUI_BACKENDS_RENDERER_GL3_H +#ifndef RMLUI_BACKENDS_RENDERER_GL3_SPRING_H +#define RMLUI_BACKENDS_RENDERER_GL3_SPRING_H #include #include namespace Gfx { -struct ShadersData; + struct ShadersData; } -class RenderInterface_GL3 : public Rml::RenderInterface { +class RenderInterface_GL3_Spring : public Rml::RenderInterface { public: - RenderInterface_GL3(); - ~RenderInterface_GL3(); + RenderInterface_GL3_Spring(); + ~RenderInterface_GL3_Spring(); // Returns true if the renderer was successfully constructed. explicit operator bool() const { return static_cast(shaders); } @@ -128,17 +128,4 @@ class RenderInterface_GL3 : public Rml::RenderInterface { GLStateBackup glstate_backup = {}; }; -/** - Helper functions for the OpenGL 3 renderer. - */ -namespace RmlGL3 { - -// Loads OpenGL functions. Optionally, the out message describes the loaded GL version or an error message on failure. -bool Initialize(Rml::String* out_message = nullptr); - -// Unloads OpenGL functions. -void Shutdown(); - -} // namespace RmlGL3 - #endif diff --git a/rts/Rml/Backends/RmlUi_SystemInterface.h b/rts/Rml/Backends/RmlUi_SystemInterface.h index d057839032..054dd9cdbb 100644 --- a/rts/Rml/Backends/RmlUi_SystemInterface.h +++ b/rts/Rml/Backends/RmlUi_SystemInterface.h @@ -34,7 +34,6 @@ #include -#include "Game/UI/MouseHandler.h" #include #include #include diff --git a/rts/Rml/Backends/RmlUi_VFSFileInterface.cpp b/rts/Rml/Backends/RmlUi_VFSFileInterface.cpp new file mode 100644 index 0000000000..e89d45a514 --- /dev/null +++ b/rts/Rml/Backends/RmlUi_VFSFileInterface.cpp @@ -0,0 +1,56 @@ +// This file is part of the Spring engine (GPL v2 or later), see LICENSE.html + +#include "RmlUi_VFSFileInterface.h" + +#include "System/FileSystem/FileHandler.h" + +VFSFileInterface::VFSFileInterface() +{ +} + +Rml::FileHandle VFSFileInterface::Open(const Rml::String& path) +{ + const std::string mode = SPRING_VFS_RAW_FIRST; + CFileHandler* fh = new CFileHandler(path, mode); + if (!fh->FileExists()) { + delete fh; + return (Rml::FileHandle) nullptr; + } + return (Rml::FileHandle)fh; +} + +void VFSFileInterface::Close(Rml::FileHandle file) +{ + ((CFileHandler*)file)->Close(); + delete (CFileHandler*)file; +} + +size_t VFSFileInterface::Read(void* buffer, size_t size, Rml::FileHandle file) +{ + return ((CFileHandler*)file)->Read(buffer, size); +} + +bool VFSFileInterface::Seek(Rml::FileHandle file, long offset, int origin) +{ + std::ios_base::seekdir seekdir; + switch (origin) { + case SEEK_CUR: + seekdir = std::ios_base::cur; + break; + case SEEK_END: + seekdir = std::ios_base::end; + break; + case SEEK_SET: + default: + seekdir = std::ios_base::beg; + break; + } + ((CFileHandler*)file)->Seek(offset, seekdir); + // Doesn't seem like the result of this function is ever actually checked + return true; +} + +size_t VFSFileInterface::Tell(Rml::FileHandle file) +{ + return ((CFileHandler*)file)->GetPos(); +} \ No newline at end of file diff --git a/rts/Rml/Backends/RmlUi_VFSFileInterface.h b/rts/Rml/Backends/RmlUi_VFSFileInterface.h new file mode 100644 index 0000000000..e43f1dd3eb --- /dev/null +++ b/rts/Rml/Backends/RmlUi_VFSFileInterface.h @@ -0,0 +1,19 @@ +// This file is part of the Spring engine (GPL v2 or later), see LICENSE.html + +#ifndef RMLUI_VFSFILEINTERFACE_H +#define RMLUI_VFSFILEINTERFACE_H + +#include "RmlUi/Core/FileInterface.h" +#include "RmlUi/Core/Types.h" + +class VFSFileInterface : public Rml::FileInterface +{ +public: + VFSFileInterface(); + Rml::FileHandle Open(const Rml::String& path) override; + void Close(Rml::FileHandle file) override; + size_t Read(void* buffer, size_t size, Rml::FileHandle file) override; + bool Seek(Rml::FileHandle file, long offset, int origin) override; + size_t Tell(Rml::FileHandle file) override; +}; +#endif // RMLUI_VFSFILEINTERFACE_H diff --git a/rts/Rml/CMakeLists.txt b/rts/Rml/CMakeLists.txt index 14fdcc818d..e03a09b4aa 100644 --- a/rts/Rml/CMakeLists.txt +++ b/rts/Rml/CMakeLists.txt @@ -1,6 +1,7 @@ set(sources_engine_Rml "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_Backend.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_SystemInterface.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_Renderer_GL3.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_Renderer_GL3_Spring.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_VFSFileInterface.cpp" PARENT_SCOPE ) From 0af0f4212fb164eceec9e0bbb35e3e07ea5b8943 Mon Sep 17 00:00:00 2001 From: ChrisClark13 Date: Sun, 28 Jan 2024 19:53:44 -0700 Subject: [PATCH 52/58] left some mess in, sorry --- rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.cpp b/rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.cpp index b45978714e..f8e904a040 100644 --- a/rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.cpp +++ b/rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.cpp @@ -612,12 +612,9 @@ void RenderInterface_GL3_Spring::SetScissorRegion(int x, int y, int width, int h } } -// Restore packing -#pragma pack() - bool RenderInterface_GL3_Spring::LoadTexture(Rml::TextureHandle& texture_handle, Rml::Vector2i& texture_dimensions, - const Rml::String& source) override + const Rml::String& source) { CBitmap bmp; if (!bmp.Load(source)) { From 8ac855fb0539f703ec38d03744fef5816676081b Mon Sep 17 00:00:00 2001 From: ChrisClark13 Date: Sat, 27 Jan 2024 13:16:35 -0700 Subject: [PATCH 53/58] create new element which hooks into the existing LuaOpenGL/Texture code to be able to reuse already made textures --- rts/Rml/Backends/RmlUi_Backend.cpp | 22 +- rts/Rml/Backends/RmlUi_Backend.h | 1 + rts/Rml/CMakeLists.txt | 1 + rts/Rml/Elements/ElementLuaTexture.cpp | 294 +++++++++++++++++++++++++ rts/Rml/Elements/ElementLuaTexture.h | 124 +++++++++++ 5 files changed, 439 insertions(+), 3 deletions(-) create mode 100644 rts/Rml/Elements/ElementLuaTexture.cpp create mode 100644 rts/Rml/Elements/ElementLuaTexture.h diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index d1a98f133d..2f6c1fc980 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -40,6 +40,7 @@ #include "Lua/LuaUI.h" #include "Rendering/Textures/Bitmap.h" #include "Rml/RmlInputReceiver.h" +#include "Rml/Elements/ElementLuaTexture.h" #include "RmlUi_Backend.h" #include "RmlUi_Renderer_GL3_Spring.h" #include "RmlUi_SystemInterface.h" @@ -115,6 +116,8 @@ struct BackendData { Rml::UniquePtr plugin; Rml::SolLua::SolLuaPlugin* luaPlugin = nullptr; CtxMutex contextMutex; + + Rml::UniquePtr> element_lua_texture; }; static Rml::UniquePtr data; @@ -148,9 +151,12 @@ bool RmlGui::Initialize(SDL_Window* target_window, SDL_GLContext target_glcontex Rml::Initialise(); - Rml::LoadFontFace("fonts/FreeSansBold.otf", true); - data->inputCon = input.AddHandler(&RmlGui::ProcessEvent); - data->initialized = true; + Rml::LoadFontFace("fonts/FreeSansBold.otf", true); + data->inputCon = input.AddHandler(&RmlGui::ProcessEvent); + data->initialized = true; + + data->element_lua_texture = Rml::MakeUnique>(); + Rml::Factory::RegisterElementInstancer("texture", data->element_lua_texture.get()); data->plugin = Rml::MakeUnique(OnContextCreate, OnContextDestroy); Rml::RegisterPlugin(data->plugin.get()); @@ -462,3 +468,13 @@ bool RmlGui::ProcessEvent(const SDL_Event& event) } return result; } + +lua_State* RmlGui::GetLuaState() +{ + if (!RmlInitialized()) + { + return nullptr; + } + + return data->ls; +} diff --git a/rts/Rml/Backends/RmlUi_Backend.h b/rts/Rml/Backends/RmlUi_Backend.h index bfb3b8eb0d..a510e317f9 100644 --- a/rts/Rml/Backends/RmlUi_Backend.h +++ b/rts/Rml/Backends/RmlUi_Backend.h @@ -65,6 +65,7 @@ namespace RmlGui bool IsMouseInteractingWith(); const std::string& GetMouseCursor(); CInputReceiver* GetInputReceiver(); + lua_State* GetLuaState(); void Update(); void RenderFrame(); diff --git a/rts/Rml/CMakeLists.txt b/rts/Rml/CMakeLists.txt index e03a09b4aa..626de0f70d 100644 --- a/rts/Rml/CMakeLists.txt +++ b/rts/Rml/CMakeLists.txt @@ -3,5 +3,6 @@ set(sources_engine_Rml "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_SystemInterface.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_Renderer_GL3_Spring.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Backends/RmlUi_VFSFileInterface.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Elements/ElementLuaTexture.cpp" PARENT_SCOPE ) diff --git a/rts/Rml/Elements/ElementLuaTexture.cpp b/rts/Rml/Elements/ElementLuaTexture.cpp new file mode 100644 index 0000000000..e96bc97ae6 --- /dev/null +++ b/rts/Rml/Elements/ElementLuaTexture.cpp @@ -0,0 +1,294 @@ +/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ + +// +// Created by ChrisFloofyKitsune on 1/27/2024. +// + +/* + * This source file is based on the ElementLuaTexture.cpp file of RmlUi, the HTML/CSS Interface Middleware + * + * For the latest information, see http://github.com/mikke89/RmlUi + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * Copyright (c) 2019-2023 The RmlUi Team, and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "ElementLuaTexture.h" + +#include "Lua/LuaOpenGLUtils.h" +#include "Rml/Backends/RmlUi_Backend.h" +#include "RmlUi/Core/ComputedValues.h" +#include "RmlUi/Core/ElementUtilities.h" +#include "RmlUi/Core/GeometryUtilities.h" +#include "RmlUi/Core/PropertyIdSet.h" + +#include + +namespace RmlGui +{ + ElementLuaTexture::ElementLuaTexture(const Rml::String& tag) : + Element(tag), dimensions(-1, -1), rect_source(RectSource::None) + { + dimensions_scale = 1.0f; + geometry_dirty = false; + texture_dirty = true; + } + + ElementLuaTexture::~ElementLuaTexture() = default; + + bool ElementLuaTexture::GetIntrinsicDimensions(Rml::Vector2f& _dimensions, float& _ratio) + { + // Check if we need to reload the texture. + if (texture_dirty) + LoadTexture(); + + // Calculate the x dimension. + if (HasAttribute("width")) + dimensions.x = GetAttribute("width", -1); + else if (rect_source == RectSource::None) + dimensions.x = (float)texture.GetDimensions().x; + else + dimensions.x = rect.Width(); + + // Calculate the y dimension. + if (HasAttribute("height")) + dimensions.y = GetAttribute("height", -1); + else if (rect_source == RectSource::None) + dimensions.y = (float)texture.GetDimensions().y; + else + dimensions.y = rect.Height(); + + dimensions *= dimensions_scale; + + // Return the calculated dimensions. If this changes the size of the element, it will result in + // a call to 'onresize' below which will regenerate the geometry. + _dimensions = dimensions; + _ratio = dimensions.x / dimensions.y; + + return true; + } + + void ElementLuaTexture::OnRender() + { + // Regenerate the geometry if required (this will be set if 'rect' changes but does not result in a resize). + if (geometry_dirty) + GenerateGeometry(); + + // Render the geometry beginning at this element's content region. + geometry.Render(GetAbsoluteOffset(Rml::BoxArea::Content).Round()); + } + + void ElementLuaTexture::OnAttributeChange(const Rml::ElementAttributes& changed_attributes) + { + // Call through to the base element's OnAttributeChange(). + Element::OnAttributeChange(changed_attributes); + + bool dirty_layout = false; + + // Check for a changed 'src' attribute. If this changes, the old texture handle is released, + // forcing a reload when the layout is regenerated. + if (changed_attributes.find("src") != changed_attributes.end()) + { + texture_dirty = true; + dirty_layout = true; + } + + // Check for a changed 'width' attribute. If this changes, a layout is forced which will + // recalculate the dimensions. + if (changed_attributes.find("width") != changed_attributes.end() + || changed_attributes.find("height") !=changed_attributes.end()) + { + dirty_layout = true; + } + + // Check for a change to the 'rect' attribute. If this changes, the coordinates are + // recomputed and a layout forced. If a sprite is set to source, then that will override any attribute. + if (changed_attributes.find("rect") != changed_attributes.end()) + { + UpdateRect(); + + // Rectangle has changed; this will most likely result in a size change, so we need to force a layout. + dirty_layout = true; + } + + if (dirty_layout) + DirtyLayout(); + } + + void ElementLuaTexture::OnPropertyChange(const Rml::PropertyIdSet& changed_properties) + { + Element::OnPropertyChange(changed_properties); + + if (changed_properties.Contains(Rml::PropertyId::ImageColor) || changed_properties.Contains(Rml::PropertyId::Opacity)) + { + GenerateGeometry(); + } + } + + void ElementLuaTexture::OnChildAdd(Element* child) + { + // Load the texture once we have attached to the document so that it can immediately be found during the call to `Rml::GetTextureSourceList`. The + // texture won't actually be loaded from the backend before it is shown. However, only do this if we have an active context so that the dp-ratio + // can be retrieved. If there is no context now the texture loading will be deferred until the next layout update. + if (child == this && texture_dirty && GetContext()) + { + LoadTexture(); + } + } + + void ElementLuaTexture::OnResize() + { + GenerateGeometry(); + } + + void ElementLuaTexture::OnDpRatioChange() + { + texture_dirty = true; + DirtyLayout(); + } + + void ElementLuaTexture::GenerateGeometry() + { + // Release the old geometry before specifying the new vertices. + geometry.Release(true); + + Rml::Vector& vertices = geometry.GetVertices(); + Rml::Vector& indices = geometry.GetIndices(); + + vertices.resize(4); + indices.resize(6); + + // Generate the texture coordinates. + Rml::Vector2f texcoords[2]; + if (rect_source != RectSource::None) + { + const auto texture_dimensions = Rml::Vector2f(Rml::Math::Max(texture.GetDimensions(), Rml::Vector2i(1))); + texcoords[0] = rect.TopLeft() / texture_dimensions; + texcoords[1] = rect.BottomRight() / texture_dimensions; + } + else + { + texcoords[0] = Rml::Vector2f(0, 0); + texcoords[1] = Rml::Vector2f(1, 1); + } + + const Rml::ComputedValues& computed = GetComputedValues(); + + float opacity = computed.opacity(); + Rml::Colourb quad_colour = computed.image_color(); + quad_colour.alpha = (Rml::byte)(opacity * (float)quad_colour.alpha); + + Rml::Vector2f quad_size = GetBox().GetSize(Rml::BoxArea::Content).Round(); + + Rml::GeometryUtilities::GenerateQuad( + &vertices[0], &indices[0], + Rml::Vector2f(0, 0), quad_size, quad_colour, + texcoords[0], texcoords[1] + ); + + geometry_dirty = false; + } + + bool ElementLuaTexture::LoadTexture() + { + texture_dirty = false; + geometry_dirty = true; + dimensions_scale = 1.0f; + + const float dp_ratio = Rml::ElementUtilities::GetDensityIndependentPixelRatio(this); + + const auto source_name = GetAttribute("src", ""); + if (source_name.empty()) + { + texture = Rml::Texture(); + rect_source = RectSource::None; + return false; + } + + const Rml::TextureCallback callback = []( + const auto _, const Rml::String& name, Rml::TextureHandle& out_handle, Rml::Vector2i& out_dimensions + ) -> bool + { + LuaMatTexture texUnit; + if (!LuaOpenGLUtils::ParseTextureImage(RmlGui::GetLuaState(), texUnit, name)) + return false; + + out_handle = texUnit.GetTextureID(); + texturesToNotDelete.insert(out_handle); + + const auto [width, height, _z] = texUnit.GetSize(); + out_dimensions.x = width; + out_dimensions.y = height; + + return true; + }; + + + texture.Set(source_name, callback); + + dimensions_scale = dp_ratio; + + // Set the texture onto our geometry object. + geometry.SetTexture(&texture); + + return true; + } + + void ElementLuaTexture::UpdateRect() + { + bool valid_rect = false; + + if (const auto rect_string = GetAttribute("rect", ""); !rect_string.empty()) + { + Rml::StringList coords_list; + Rml::StringUtilities::ExpandString(coords_list, rect_string, ' '); + + if (coords_list.size() != 4) + { + Rml::Log::Message( + Rml::Log::LT_WARNING, + "Element '%s' has an invalid 'rect' attribute; rect requires 4 space-separated values, found %zu.", + GetAddress().c_str(), coords_list.size() + ); + } + else + { + const Rml::Vector2f position = { + Rml::FromString(coords_list[0], 0.f), Rml::FromString(coords_list[1], 0.f) + }; + const Rml::Vector2f size = {Rml::FromString(coords_list[2], 0.f), Rml::FromString(coords_list[3], 0.f)}; + rect = Rml::Rectanglef::FromPositionSize(position, size); + + // We have new, valid coordinates; force the geometry to be regenerated. + valid_rect = true; + geometry_dirty = true; + rect_source = RectSource::Attribute; + } + } + + if (!valid_rect) + { + rect = {}; + rect_source = RectSource::None; + } + } +} // namespace RmlGui diff --git a/rts/Rml/Elements/ElementLuaTexture.h b/rts/Rml/Elements/ElementLuaTexture.h new file mode 100644 index 0000000000..8fcbd9444b --- /dev/null +++ b/rts/Rml/Elements/ElementLuaTexture.h @@ -0,0 +1,124 @@ +/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ + +// +// Created by ChrisFloofyKitsune on 1/27/2024. +// + +/* + * This source file is based on the ElementImage.h file of RmlUi, the HTML/CSS Interface Middleware + * + * For the latest information, see http://github.com/mikke89/RmlUi + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * Copyright (c) 2019-2023 The RmlUi Team, and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ELEMENTLUATEXTURE_H +#define ELEMENTLUATEXTURE_H +#include + +#include "RmlUi/Core/Element.h" +#include "RmlUi/Core/Geometry.h" +#include "RmlUi/Core/Texture.h" + +namespace RmlGui +{ + /// The 'LuaTexture' element can render texures created/used in the Lua environment. + /// + /// The 'src' attribute is used to specify what texture to load + /// See LuaOpenGLUtils::ParseTextureImage on how to format this special string + /// + /// See Rml::ElementImage for use of width/height/rect params + /// https://mikke89.github.io/RmlUiDoc/pages/rml/images.html + /// + /// @author ChrisFloofyKitsune + class ElementLuaTexture : public Rml::Element + { + public: + RMLUI_RTTI_DefineWithParent(ElementLuaTexture, Element) + + /// Constructs a new ElementLuaTexture. This should not be called directly; use the Factory instead. + /// @param[in] tag The tag the element was declared as in RML. + ElementLuaTexture(const Rml::String& tag); + virtual ~ElementLuaTexture(); + + /// Returns the element's inherent size. + bool GetIntrinsicDimensions(Rml::Vector2f& dimensions, float& ratio) override; + + static inline std::unordered_set texturesToNotDelete{}; + + protected: + /// Renders the image. + void OnRender() override; + + /// Regenerates the element's geometry. + void OnResize() override; + + /// Our intrinsic dimensions may change with the dp-ratio. + void OnDpRatioChange() override; + + /// Checks for changes to the image's source or dimensions. + /// @param[in] changed_attributes A list of attributes changed on the element. + void OnAttributeChange(const Rml::ElementAttributes& changed_attributes) override; + + /// Called when properties on the element are changed. + /// @param[in] changed_properties The properties changed on the element. + void OnPropertyChange(const Rml::PropertyIdSet& changed_properties) override; + + /// Detect when we have been added to the document. + void OnChildAdd(Element* child) override; + + private: + // Generates the element's geometry. + void GenerateGeometry(); + + // Loads the element's texture, as specified by the 'src' attribute. + bool LoadTexture(); + + // Loads the rect value from the element's attribute + void UpdateRect(); + + // The texture this element is rendering from. + Rml::Texture texture; + + // True if we need to refetch the texture's source from the element's attributes. + bool texture_dirty; + + // A factor which scales the intrinsic dimensions based on the dp-ratio and image scale. + float dimensions_scale; + + // The element's computed intrinsic dimensions. If either of these values are set to -1, then + // that dimension has not been computed yet. + Rml::Vector2f dimensions; + + // The rectangle extracted from the 'rect' attribute. The rect_source will be None if + // these have not been specified or are invalid. + Rml::Rectanglef rect; + enum class RectSource { None, Attribute } rect_source; + + // The geometry used to render this element. + Rml::Geometry geometry; + bool geometry_dirty; + }; +} // namespace RmlGui + +#endif //ELEMENTLUATEXTURE_H From c6d8c9a8d991347b3e4ab7b2cf6fec05ac74cbf4 Mon Sep 17 00:00:00 2001 From: ChrisClark13 Date: Sat, 27 Jan 2024 13:16:35 -0700 Subject: [PATCH 54/58] create new element which hooks into the existing LuaOpenGL/Texture code to be able to reuse already made textures --- rts/Rml/Backends/RmlUi_Backend.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index 2f6c1fc980..77996ba7d0 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -41,6 +41,7 @@ #include "Rendering/Textures/Bitmap.h" #include "Rml/RmlInputReceiver.h" #include "Rml/Elements/ElementLuaTexture.h" +#include "Rml/Elements/ElementLuaTexture.h" #include "RmlUi_Backend.h" #include "RmlUi_Renderer_GL3_Spring.h" #include "RmlUi_SystemInterface.h" From 7d310ed1f19ddba353dd6946b6467419ae893007 Mon Sep 17 00:00:00 2001 From: ChrisClark13 Date: Mon, 29 Jan 2024 00:11:19 -0700 Subject: [PATCH 55/58] what if we just kept the texture handle away from Rml --- .../Backends/RmlUi_Renderer_GL3_Spring.cpp | 4 + rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.h | 3 + rts/Rml/Elements/ElementLuaTexture.cpp | 498 +++++++++--------- rts/Rml/Elements/ElementLuaTexture.h | 7 +- 4 files changed, 260 insertions(+), 252 deletions(-) diff --git a/rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.cpp b/rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.cpp index f8e904a040..86c2335f34 100644 --- a/rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.cpp +++ b/rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.cpp @@ -657,6 +657,10 @@ bool RenderInterface_GL3_Spring::GenerateTexture(Rml::TextureHandle& texture_han void RenderInterface_GL3_Spring::ReleaseTexture(Rml::TextureHandle texture_handle) { + // Something was using a texture loaded/managed outside of Rml. Do nothing. + if (texture_handle == TextureEnableWithoutBinding) + return; + glDeleteTextures(1, (GLuint*)&texture_handle); } diff --git a/rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.h b/rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.h index 8fd34bc6ef..8351348676 100644 --- a/rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.h +++ b/rts/Rml/Backends/RmlUi_Renderer_GL3_Spring.h @@ -76,6 +76,9 @@ class RenderInterface_GL3_Spring : public Rml::RenderInterface { void SetTransform(const Rml::Matrix4f* transform) override; // Can be passed to RenderGeometry() to enable texture rendering without changing the bound texture. + // Can used as the output of a TextureCallback to signal that this texture is externally managed. + // In that case, you will need to keep a reference to the texture + // you want and bind it before rendering the geometry. static const Rml::TextureHandle TextureEnableWithoutBinding = Rml::TextureHandle(-1); private: diff --git a/rts/Rml/Elements/ElementLuaTexture.cpp b/rts/Rml/Elements/ElementLuaTexture.cpp index e96bc97ae6..c4c6f1c636 100644 --- a/rts/Rml/Elements/ElementLuaTexture.cpp +++ b/rts/Rml/Elements/ElementLuaTexture.cpp @@ -5,7 +5,8 @@ // /* - * This source file is based on the ElementLuaTexture.cpp file of RmlUi, the HTML/CSS Interface Middleware + * This source file is based on the ElementLuaTexture.cpp file of RmlUi, the HTML/CSS Interface + * Middleware * * For the latest information, see http://github.com/mikke89/RmlUi * @@ -36,259 +37,256 @@ #include "Lua/LuaOpenGLUtils.h" #include "Rml/Backends/RmlUi_Backend.h" +#include "Rml/Backends/RmlUi_Renderer_GL3_Spring.h" +#include "Rendering/GL/myGL.h" + #include "RmlUi/Core/ComputedValues.h" #include "RmlUi/Core/ElementUtilities.h" #include "RmlUi/Core/GeometryUtilities.h" #include "RmlUi/Core/PropertyIdSet.h" - -#include +#include "RmlUi/Source/Core/TextureResource.h" namespace RmlGui { - ElementLuaTexture::ElementLuaTexture(const Rml::String& tag) : - Element(tag), dimensions(-1, -1), rect_source(RectSource::None) - { - dimensions_scale = 1.0f; - geometry_dirty = false; - texture_dirty = true; - } - - ElementLuaTexture::~ElementLuaTexture() = default; - - bool ElementLuaTexture::GetIntrinsicDimensions(Rml::Vector2f& _dimensions, float& _ratio) - { - // Check if we need to reload the texture. - if (texture_dirty) - LoadTexture(); - - // Calculate the x dimension. - if (HasAttribute("width")) - dimensions.x = GetAttribute("width", -1); - else if (rect_source == RectSource::None) - dimensions.x = (float)texture.GetDimensions().x; - else - dimensions.x = rect.Width(); - - // Calculate the y dimension. - if (HasAttribute("height")) - dimensions.y = GetAttribute("height", -1); - else if (rect_source == RectSource::None) - dimensions.y = (float)texture.GetDimensions().y; - else - dimensions.y = rect.Height(); - - dimensions *= dimensions_scale; - - // Return the calculated dimensions. If this changes the size of the element, it will result in - // a call to 'onresize' below which will regenerate the geometry. - _dimensions = dimensions; - _ratio = dimensions.x / dimensions.y; - - return true; - } - - void ElementLuaTexture::OnRender() - { - // Regenerate the geometry if required (this will be set if 'rect' changes but does not result in a resize). - if (geometry_dirty) - GenerateGeometry(); - - // Render the geometry beginning at this element's content region. - geometry.Render(GetAbsoluteOffset(Rml::BoxArea::Content).Round()); - } - - void ElementLuaTexture::OnAttributeChange(const Rml::ElementAttributes& changed_attributes) - { - // Call through to the base element's OnAttributeChange(). - Element::OnAttributeChange(changed_attributes); - - bool dirty_layout = false; - - // Check for a changed 'src' attribute. If this changes, the old texture handle is released, - // forcing a reload when the layout is regenerated. - if (changed_attributes.find("src") != changed_attributes.end()) - { - texture_dirty = true; - dirty_layout = true; - } - - // Check for a changed 'width' attribute. If this changes, a layout is forced which will - // recalculate the dimensions. - if (changed_attributes.find("width") != changed_attributes.end() - || changed_attributes.find("height") !=changed_attributes.end()) - { - dirty_layout = true; - } - - // Check for a change to the 'rect' attribute. If this changes, the coordinates are - // recomputed and a layout forced. If a sprite is set to source, then that will override any attribute. - if (changed_attributes.find("rect") != changed_attributes.end()) - { - UpdateRect(); - - // Rectangle has changed; this will most likely result in a size change, so we need to force a layout. - dirty_layout = true; - } - - if (dirty_layout) - DirtyLayout(); - } - - void ElementLuaTexture::OnPropertyChange(const Rml::PropertyIdSet& changed_properties) - { - Element::OnPropertyChange(changed_properties); - - if (changed_properties.Contains(Rml::PropertyId::ImageColor) || changed_properties.Contains(Rml::PropertyId::Opacity)) - { - GenerateGeometry(); - } - } - - void ElementLuaTexture::OnChildAdd(Element* child) - { - // Load the texture once we have attached to the document so that it can immediately be found during the call to `Rml::GetTextureSourceList`. The - // texture won't actually be loaded from the backend before it is shown. However, only do this if we have an active context so that the dp-ratio - // can be retrieved. If there is no context now the texture loading will be deferred until the next layout update. - if (child == this && texture_dirty && GetContext()) - { - LoadTexture(); - } - } - - void ElementLuaTexture::OnResize() - { - GenerateGeometry(); - } - - void ElementLuaTexture::OnDpRatioChange() - { - texture_dirty = true; - DirtyLayout(); - } - - void ElementLuaTexture::GenerateGeometry() - { - // Release the old geometry before specifying the new vertices. - geometry.Release(true); - - Rml::Vector& vertices = geometry.GetVertices(); - Rml::Vector& indices = geometry.GetIndices(); - - vertices.resize(4); - indices.resize(6); - - // Generate the texture coordinates. - Rml::Vector2f texcoords[2]; - if (rect_source != RectSource::None) - { - const auto texture_dimensions = Rml::Vector2f(Rml::Math::Max(texture.GetDimensions(), Rml::Vector2i(1))); - texcoords[0] = rect.TopLeft() / texture_dimensions; - texcoords[1] = rect.BottomRight() / texture_dimensions; - } - else - { - texcoords[0] = Rml::Vector2f(0, 0); - texcoords[1] = Rml::Vector2f(1, 1); - } - - const Rml::ComputedValues& computed = GetComputedValues(); - - float opacity = computed.opacity(); - Rml::Colourb quad_colour = computed.image_color(); - quad_colour.alpha = (Rml::byte)(opacity * (float)quad_colour.alpha); - - Rml::Vector2f quad_size = GetBox().GetSize(Rml::BoxArea::Content).Round(); - - Rml::GeometryUtilities::GenerateQuad( - &vertices[0], &indices[0], - Rml::Vector2f(0, 0), quad_size, quad_colour, - texcoords[0], texcoords[1] - ); - - geometry_dirty = false; - } - - bool ElementLuaTexture::LoadTexture() - { - texture_dirty = false; - geometry_dirty = true; - dimensions_scale = 1.0f; - - const float dp_ratio = Rml::ElementUtilities::GetDensityIndependentPixelRatio(this); - - const auto source_name = GetAttribute("src", ""); - if (source_name.empty()) - { - texture = Rml::Texture(); - rect_source = RectSource::None; - return false; - } - - const Rml::TextureCallback callback = []( - const auto _, const Rml::String& name, Rml::TextureHandle& out_handle, Rml::Vector2i& out_dimensions - ) -> bool - { - LuaMatTexture texUnit; - if (!LuaOpenGLUtils::ParseTextureImage(RmlGui::GetLuaState(), texUnit, name)) - return false; - - out_handle = texUnit.GetTextureID(); - texturesToNotDelete.insert(out_handle); - - const auto [width, height, _z] = texUnit.GetSize(); - out_dimensions.x = width; - out_dimensions.y = height; - - return true; - }; - - - texture.Set(source_name, callback); - - dimensions_scale = dp_ratio; - - // Set the texture onto our geometry object. - geometry.SetTexture(&texture); - - return true; - } - - void ElementLuaTexture::UpdateRect() - { - bool valid_rect = false; - - if (const auto rect_string = GetAttribute("rect", ""); !rect_string.empty()) - { - Rml::StringList coords_list; - Rml::StringUtilities::ExpandString(coords_list, rect_string, ' '); - - if (coords_list.size() != 4) - { - Rml::Log::Message( - Rml::Log::LT_WARNING, - "Element '%s' has an invalid 'rect' attribute; rect requires 4 space-separated values, found %zu.", - GetAddress().c_str(), coords_list.size() - ); - } - else - { - const Rml::Vector2f position = { - Rml::FromString(coords_list[0], 0.f), Rml::FromString(coords_list[1], 0.f) - }; - const Rml::Vector2f size = {Rml::FromString(coords_list[2], 0.f), Rml::FromString(coords_list[3], 0.f)}; - rect = Rml::Rectanglef::FromPositionSize(position, size); - - // We have new, valid coordinates; force the geometry to be regenerated. - valid_rect = true; - geometry_dirty = true; - rect_source = RectSource::Attribute; - } - } - - if (!valid_rect) - { - rect = {}; - rect_source = RectSource::None; - } - } -} // namespace RmlGui +ElementLuaTexture::ElementLuaTexture(const Rml::String& tag) + : Element(tag) + , dimensions(-1, -1) + , rect_source(RectSource::None) +{ + dimensions_scale = 1.0f; + geometry_dirty = false; + texture_dirty = true; + luaTextureHandle = 0; +} + +ElementLuaTexture::~ElementLuaTexture() = default; + +bool ElementLuaTexture::GetIntrinsicDimensions(Rml::Vector2f& _dimensions, float& _ratio) +{ + // Check if we need to reload the texture. + if (texture_dirty) + LoadTexture(); + + // Calculate the x dimension. + if (HasAttribute("width")) + dimensions.x = GetAttribute("width", -1); + else if (rect_source == RectSource::None) + dimensions.x = (float)texture.GetDimensions().x; + else + dimensions.x = rect.Width(); + + // Calculate the y dimension. + if (HasAttribute("height")) + dimensions.y = GetAttribute("height", -1); + else if (rect_source == RectSource::None) + dimensions.y = (float)texture.GetDimensions().y; + else + dimensions.y = rect.Height(); + + dimensions *= dimensions_scale; + + // Return the calculated dimensions. If this changes the size of the element, it will result in + // a call to 'onresize' below which will regenerate the geometry. + _dimensions = dimensions; + _ratio = dimensions.x / dimensions.y; + + return true; +} + +void ElementLuaTexture::OnRender() +{ + glBindTexture(GL_TEXTURE_2D, luaTextureHandle); + // Regenerate the geometry if required (this will be set if 'rect' changes but does not result + // in a resize). + if (geometry_dirty) + GenerateGeometry(); + + // Render the geometry beginning at this element's content region. + geometry.Render(GetAbsoluteOffset(Rml::BoxArea::Content).Round()); +} + +void ElementLuaTexture::OnAttributeChange(const Rml::ElementAttributes& changed_attributes) +{ + // Call through to the base element's OnAttributeChange(). + Element::OnAttributeChange(changed_attributes); + + bool dirty_layout = false; + + // Check for a changed 'src' attribute. If this changes, the old texture handle is released, + // forcing a reload when the layout is regenerated. + if (changed_attributes.find("src") != changed_attributes.end()) { + texture_dirty = true; + dirty_layout = true; + } + + // Check for a changed 'width' attribute. If this changes, a layout is forced which will + // recalculate the dimensions. + if (changed_attributes.find("width") != changed_attributes.end() || + changed_attributes.find("height") != changed_attributes.end()) { + dirty_layout = true; + } + + // Check for a change to the 'rect' attribute. If this changes, the coordinates are + // recomputed and a layout forced. If a sprite is set to source, then that will override any + // attribute. + if (changed_attributes.find("rect") != changed_attributes.end()) { + UpdateRect(); + + // Rectangle has changed; this will most likely result in a size change, so we need to force + // a layout. + dirty_layout = true; + } + + if (dirty_layout) + DirtyLayout(); +} + +void ElementLuaTexture::OnPropertyChange(const Rml::PropertyIdSet& changed_properties) +{ + Element::OnPropertyChange(changed_properties); + + if (changed_properties.Contains(Rml::PropertyId::ImageColor) || + changed_properties.Contains(Rml::PropertyId::Opacity)) { + GenerateGeometry(); + } +} + +void ElementLuaTexture::OnChildAdd(Element* child) +{ + // Load the texture once we have attached to the document so that it can immediately be found + // during the call to `Rml::GetTextureSourceList`. The texture won't actually be loaded from the + // backend before it is shown. However, only do this if we have an active context so that the + // dp-ratio can be retrieved. If there is no context now the texture loading will be deferred + // until the next layout update. + if (child == this && texture_dirty && GetContext()) { + LoadTexture(); + } +} + +void ElementLuaTexture::OnResize() +{ + GenerateGeometry(); +} + +void ElementLuaTexture::OnDpRatioChange() +{ + texture_dirty = true; + DirtyLayout(); +} + +void ElementLuaTexture::GenerateGeometry() +{ + // Release the old geometry before specifying the new vertices. + geometry.Release(true); + + Rml::Vector& vertices = geometry.GetVertices(); + Rml::Vector& indices = geometry.GetIndices(); + + vertices.resize(4); + indices.resize(6); + + // Generate the texture coordinates. + Rml::Vector2f texcoords[2]; + if (rect_source != RectSource::None) { + const auto texture_dimensions = + Rml::Vector2f(Rml::Math::Max(texture.GetDimensions(), Rml::Vector2i(1))); + texcoords[0] = rect.TopLeft() / texture_dimensions; + texcoords[1] = rect.BottomRight() / texture_dimensions; + } else { + texcoords[0] = Rml::Vector2f(0, 0); + texcoords[1] = Rml::Vector2f(1, 1); + } + + const Rml::ComputedValues& computed = GetComputedValues(); + + float opacity = computed.opacity(); + Rml::Colourb quad_colour = computed.image_color(); + quad_colour.alpha = (Rml::byte)(opacity * (float)quad_colour.alpha); + + Rml::Vector2f quad_size = GetBox().GetSize(Rml::BoxArea::Content).Round(); + + Rml::GeometryUtilities::GenerateQuad(&vertices[0], &indices[0], Rml::Vector2f(0, 0), quad_size, + quad_colour, texcoords[0], texcoords[1]); + + geometry_dirty = false; +} + +bool ElementLuaTexture::LoadTexture() +{ + texture_dirty = false; + geometry_dirty = true; + dimensions_scale = 1.0f; + + const float dp_ratio = Rml::ElementUtilities::GetDensityIndependentPixelRatio(this); + + const auto source_name = GetAttribute("src", ""); + if (source_name.empty()) { + texture = Rml::Texture(); + rect_source = RectSource::None; + return false; + } + + const Rml::TextureCallback callback = [this](const auto _renderInterface, const Rml::String& name, + Rml::TextureHandle& out_handle, + Rml::Vector2i& out_dimensions) mutable -> bool { + LuaMatTexture texUnit; + if (!LuaOpenGLUtils::ParseTextureImage(RmlGui::GetLuaState(), texUnit, name)) { + luaTextureHandle = 0; + return false; + } + + // Don't give Rml handles to external textures + out_handle = RenderInterface_GL3_Spring::TextureEnableWithoutBinding; + luaTextureHandle = texUnit.GetTextureID(); + + const auto [width, height, _z] = texUnit.GetSize(); + out_dimensions.x = width; + out_dimensions.y = height; + + return true; + }; + + texture.Set(source_name, callback); + + dimensions_scale = dp_ratio; + + // Set the texture onto our geometry object. + geometry.SetTexture(&texture); + + return true; +} + +void ElementLuaTexture::UpdateRect() +{ + bool valid_rect = false; + + if (const auto rect_string = GetAttribute("rect", ""); !rect_string.empty()) { + Rml::StringList coords_list; + Rml::StringUtilities::ExpandString(coords_list, rect_string, ' '); + + if (coords_list.size() != 4) { + Rml::Log::Message(Rml::Log::LT_WARNING, + "Element '%s' has an invalid 'rect' attribute; rect requires 4 " + "space-separated values, found %zu.", + GetAddress().c_str(), coords_list.size()); + } else { + const Rml::Vector2f position = {Rml::FromString(coords_list[0], 0.f), + Rml::FromString(coords_list[1], 0.f)}; + const Rml::Vector2f size = {Rml::FromString(coords_list[2], 0.f), + Rml::FromString(coords_list[3], 0.f)}; + rect = Rml::Rectanglef::FromPositionSize(position, size); + + // We have new, valid coordinates; force the geometry to be regenerated. + valid_rect = true; + geometry_dirty = true; + rect_source = RectSource::Attribute; + } + } + + if (!valid_rect) { + rect = {}; + rect_source = RectSource::None; + } +} + +} // namespace RmlGui diff --git a/rts/Rml/Elements/ElementLuaTexture.h b/rts/Rml/Elements/ElementLuaTexture.h index 8fcbd9444b..119bb62d39 100644 --- a/rts/Rml/Elements/ElementLuaTexture.h +++ b/rts/Rml/Elements/ElementLuaTexture.h @@ -64,8 +64,6 @@ namespace RmlGui /// Returns the element's inherent size. bool GetIntrinsicDimensions(Rml::Vector2f& dimensions, float& ratio) override; - static inline std::unordered_set texturesToNotDelete{}; - protected: /// Renders the image. void OnRender() override; @@ -98,8 +96,13 @@ namespace RmlGui void UpdateRect(); // The texture this element is rendering from. + // The Texture Handle of this should always be + // RenderInterface_GL3_Spring::TextureEnableWithoutBinding (aka Rml::TextureHandle(-1)) Rml::Texture texture; + // Handle to the externally provided texture to be used + Rml::TextureHandle luaTextureHandle; + // True if we need to refetch the texture's source from the element's attributes. bool texture_dirty; From 74fa13375f821176bb5b7a9f7a626abd628e06ca Mon Sep 17 00:00:00 2001 From: ChrisClark13 Date: Mon, 29 Jan 2024 00:25:09 -0700 Subject: [PATCH 56/58] clearer and more readable element tag name --- rts/Rml/Backends/RmlUi_Backend.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index 77996ba7d0..b1ea9c049a 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -157,7 +157,7 @@ bool RmlGui::Initialize(SDL_Window* target_window, SDL_GLContext target_glcontex data->initialized = true; data->element_lua_texture = Rml::MakeUnique>(); - Rml::Factory::RegisterElementInstancer("texture", data->element_lua_texture.get()); + Rml::Factory::RegisterElementInstancer("lua-texture", data->element_lua_texture.get()); data->plugin = Rml::MakeUnique(OnContextCreate, OnContextDestroy); Rml::RegisterPlugin(data->plugin.get()); From 3f8cb988a47c8dc06fda3a3e2dbc8e07c4f5a7b8 Mon Sep 17 00:00:00 2001 From: loveridge Date: Tue, 30 Jan 2024 09:32:15 -0700 Subject: [PATCH 57/58] Remove unnecessary includes --- rts/Lua/LuaUI.h | 1 - rts/System/Input/MouseInput.cpp | 1 - rts/System/SpringApp.cpp | 11 +++-------- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/rts/Lua/LuaUI.h b/rts/Lua/LuaUI.h index 07e495fa75..5ecc1406f7 100644 --- a/rts/Lua/LuaUI.h +++ b/rts/Lua/LuaUI.h @@ -6,7 +6,6 @@ #include #include -#include #include "LuaHandle.h" #include "System/UnorderedMap.hpp" diff --git a/rts/System/Input/MouseInput.cpp b/rts/System/Input/MouseInput.cpp index 7aabf166cb..450c22eebf 100644 --- a/rts/System/Input/MouseInput.cpp +++ b/rts/System/Input/MouseInput.cpp @@ -26,7 +26,6 @@ #include "Rendering/GlobalRendering.h" #include "System/MainDefines.h" #include "System/SafeUtil.h" -#include #include diff --git a/rts/System/SpringApp.cpp b/rts/System/SpringApp.cpp index eddd8ed9a2..956fe6dfab 100644 --- a/rts/System/SpringApp.cpp +++ b/rts/System/SpringApp.cpp @@ -6,10 +6,6 @@ #include #include -// Include before other headers that define a bunch of macros that break stuff. -#include -#include - #include #include @@ -106,6 +102,8 @@ #include "Game/SyncedGameCommands.h" #include "lib/luasocket/src/restrictions.h" + + CONFIG(unsigned, SetCoreAffinity).defaultValue(0).safemodeValue(1).description("Defines a bitmask indicating which CPU cores the main-thread should use."); CONFIG(unsigned, TextureMemPoolSize).defaultValue(512).minimumValue(0).description("Set to 0 to disable, otherwise specify a predefined memory to serve Bitmap allocation requests"); CONFIG(bool, UseLuaMemPools).defaultValue(true).description("Whether Lua VM memory allocations are made from pools."); @@ -219,6 +217,7 @@ SpringApp::~SpringApp() spring_clock::PopTickRate(); } + /** * @brief Initializes the SpringApp instance * @return whether initialization was successful @@ -282,8 +281,6 @@ bool SpringApp::Init() // GUIs #ifndef HEADLESS agui::gui = new agui::Gui(); - - #endif keyCodes.Reset(); scanCodes.Reset(); @@ -296,8 +293,6 @@ bool SpringApp::Init() CLuaSocketRestrictions::InitStatic(); LuaVFSDownload::Init(); - - // Create CGameSetup and CPreGame objects Startup(); return true; From 67622515f0b03f33b9a268ad83c097825347d301 Mon Sep 17 00:00:00 2001 From: loveridge Date: Tue, 30 Jan 2024 09:43:51 -0700 Subject: [PATCH 58/58] formatting --- rts/Rml/Backends/RmlUi_Backend.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rts/Rml/Backends/RmlUi_Backend.cpp b/rts/Rml/Backends/RmlUi_Backend.cpp index b1ea9c049a..26ba8f8d6b 100644 --- a/rts/Rml/Backends/RmlUi_Backend.cpp +++ b/rts/Rml/Backends/RmlUi_Backend.cpp @@ -152,12 +152,12 @@ bool RmlGui::Initialize(SDL_Window* target_window, SDL_GLContext target_glcontex Rml::Initialise(); - Rml::LoadFontFace("fonts/FreeSansBold.otf", true); - data->inputCon = input.AddHandler(&RmlGui::ProcessEvent); - data->initialized = true; + Rml::LoadFontFace("fonts/FreeSansBold.otf", true); + data->inputCon = input.AddHandler(&RmlGui::ProcessEvent); + data->initialized = true; - data->element_lua_texture = Rml::MakeUnique>(); - Rml::Factory::RegisterElementInstancer("lua-texture", data->element_lua_texture.get()); + data->element_lua_texture = Rml::MakeUnique>(); + Rml::Factory::RegisterElementInstancer("lua-texture", data->element_lua_texture.get()); data->plugin = Rml::MakeUnique(OnContextCreate, OnContextDestroy); Rml::RegisterPlugin(data->plugin.get());

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 Udks7C@tk@$-)rF;p=td80#C{dCIA2c diff --git a/cont/LuaUI/Rml/LatoLatin-Regular.ttf b/cont/LuaUI/Rml/LatoLatin-Regular.ttf deleted file mode 100644 index bcc57780d8f007bfc2106a89876f44cb56936e6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148540 zcmdSCcVHaF^#DAx{?Q}4~{&9)@Vwz@4>xqvIiy%)fy*nqKd z!Ny?DvH@dEu_2*^5Ly}}-~^J8W z;0}Q_<`2J5uE6g`Bu2}D_Y{gosb~c>xd#djcNu0Sz6-Gku`5{(v<(rC^d;0nSph8t zOHmX1g>e3$qc{J0UJ{p3FV4SNs{Mij)@5by=y zKw&G8h%HB~xMcV`D?`t+>1Z}z{)L_uVMH^V(6fA*5BHu%v)FIpx(J0+N$6QB8FkXt zD1>!D8ybocg_5JV0NO%3zHI@TC4wT^g4&sL(B?^az5vZ;{si?LRLGZyk%75{9PCTz z1YZCri5^9QEnZ259>Qs-VKqUiwZ{kAI5hQ$c7u{x`Y<__CP&9a@Z^K%Mvu>Z3kF zolyGlQ>YDaZlh9AH|0WW=~n1>1{}AeBK!?{8s9({NuBx&x&!!hLF7W~>HAOt)Ze8f zXfdTjtx)o)ZuAV4T&finLn)*i&>CoSJ1O+XsE1vJN};|P%1W?&cT#^scd~b(X3-8b zS9B-pA%*=tYNm5gi?5v?j-60;K}mv=3?&UpHk9K~Wr zTOPso5j#ih7;n3X{qhyi1F&7gpM(9{2FF*Rd?1_;{|b(uLV1qZF_5D!DBBpn4f7v~ zE&HBAY#NlMP&WE)oBzn$wVxw9v1fdF8^w*($u-}(xCHDRDMcu5q(0`Hw|jp3H}Tkt zHW7O`wh+7MFZ2$SMQkJ~?7b*oGz;~!YIK2l7Da(L(?X$QeKUOoKZheY7g2#k-pO=N zj+6ai0^x`MD0CA20{ssC28+=<=xuZbT}7{<8ImIfQX)0dAT0_(p(q>~z%MW%Gk79a6pP|e zJW4=z^a{F!UPW)A7tuE4KuIVWxsV5Cpcd4MW} zfHs1rZ$>{s7tv4A&w>1CY(o;9h%0a%?!-&+61)uGhL?kHmV(#eJMf)&1Kx}G;C=XR zd(-pxZt03Bl$>0x*gLR>sTLqCHeAG|*J`QV=rx^{-|9e%EDy><(@lKq9ci~Jl1J;mjI2YfA^YJ~n0PjaCGz%A^*|-Sr z#>MymF2VQ0JXDJB!)5q>q(?nC5@c3~x^X#v09WD%@f3UzzlXxmTwITj;s*REZp6ok z9l%ZaIG%=2;;Hxqo{k^G&G;0u!0gw8Pve>R2|NSchGNj|xC0w-7ruhK@m1V|U%|cj zRb)eV;y(NuUVz`k3-KcS7VgJyVXJw@Kv)EQ%M|jb1dhxunHtth|Wi z^_5;xV{5ZFHQXE9(%x&_IknkK#dJI;K@!x}W$6qznY^gQi;6781E6t5?S&36wtJ23 zy$&yBH+CDnFV}e)YwJKP4lF9^DruO}Y_gcbcQzZnb#=`qZ+=U-(VI?c=`AhBb3&tz zZf`7H@|_vIN#uSKY58(pvk{Qk*GIO?Cb(W?+-ckiu+Js2F+f&*b9-HQM?*`qr3LQhH#Wnqa6*)?XNQ-yd&NZw17I$A z)`;NLQfL7dTM9e8RA;XjcL97a8}IOn?M8xRP*K-K26aLcKr_F+g*0g|=8=@x2gE_B zsH8C7G{Wov`*`LD3Q%wYpil%9w;M}#S~|!;@SH;7gqvPtI3VfA(o4r!I*NrZf^PA+ zHyWOThet>o`;e5#jHPfOD3C5`HicVEE%7FYS7tv)Q6=8)j$(&bZU+L4Mz6G}g3tvO zOJR#wM$Q`GOa^BTuL8gX^DHp}2f6@lue_+;xU=2pl>^fp-e7xWQ}a2dySOFVE9ni&>q$rx&d`_W&@#`q`DiVm0g6I~Wlae19{CKerMuLv1 zYd%LL7noJJ6NZ;`8*j3}WBz)$aGyK^vQO@|03~IBe_1;W;<%x@#Q>f|NNoWY7kN?c z04N|Y4Qe|mCsoqa>{VC_jV0b75XwO4xV_NW4&6T;9E`!YDlFXDeoiGy@ZOdXZU#1K zfHrl4!>hHQ!{n#~K9i%~evT%`5c@fX97FBrSaJ-rpA(T|xc!`%93$-KB;*)rKNmob zadxBAi)T8#@qA^8!<)cYmO8u!JMzjB{$Jo21vnZ2wh?e7M-$*kj%L7-94&w&IYtAH zn^ z5SM|pO{z+kj&ut#W8d2XM9JYz8W|p}^CrfhW3jfR8O#tFgygZDx%qaA-I&JX>w7`jgeQHZ9R#~0-Qi8MJN4NPult9Zf)I8= za}Nv&(#05^#xkP3z{)8*ca~Yoz*sbcSqHNS8tukdtAYO0!OG}BLEwMBi8r7qp=YPl zVl-y&1XvlPw~bB#hL-`D(8}m-C;FaW-+Z1j(#G)fl$8!^DI_*f0@f7zgB~rVpnWi! z<5dat9w!LKo+@hZws`5Hj&3kRR8dDb)Z1G?cPBp60VsiCwv=|Hhg+bBQlJYCd@lfR zl1=~-Vk{Xj0Kj_|1PV<11WW*82Rt0ZBLTlK(-12++80PfCgA}%!CuztsHxd$%!av9I8+j@l>lFjr7*4e`BY^m;^?ge zwpQB*z|KIW1}d0TYV8A~%N!pM~ z7imK(-J}hv^w_a~UNw7qyX+?ZZTzCm$Nf-sd zRY~C`lrPlj?&5RNczZo~m)o1qkuxhfyChkUFq6N%3tTL?2u^g%d6@)D<1gajEna31 z%ofGx*zRI7Gu`y}EX0gvD3^An7$~hq&M2_OX3b^NQmq!VoU)j0>QuMy9-LXRNon#xxgMHPT5%-p84 zMk+1&GtxbESqat{ecx?nS3;~aGuD-@(y4TVHxl!ehB&=G)}YK|j$fbSX6@j-i-4|T zz!{==z){+XZ6Yy^0V5l2qUEsk#4g(Vhd^DRR`&<`%za@-$=0Dewu;Q5_fa{oQW~l( zti)FD9=bI2e_aAfmKYcfrRJ;jF~DcW#( zB_}#$Et#FMcmpS6dO3Y`{tWk>w;fDv-!(n0qp3)1II(rceG9S(|1p{k@+oIeLu?Y^ zlqd*oSj6I}`94l+=T{`~?mOuI^mS3IU+0+s!vnAQ8?|Ejm%5Fq(Q2jKqY?**&0*H4z%>C&U&hRX zw>gvNa9{LS{et9e{@QYVb)kEj6(#x0| zT+rd62jF>v<1CQ-B9MDxb(93jXscha3=|Q2o0A@udbdXj1}O)#MGL;U=Sl8wKbbe@ zMI3x;>OE`cIX$wt(2(4gRgJ4&-C0q+@2xw#AFTL9t*6cneOOb?Oa5^zzcMd0u_(S- z6Qq#G#)Q@Ge|O`yU*22eh{ajDUE$;{?#LV*u*vaYp{{ zf8Y3ufMev#ATjzmDFh~u2VTX)L?%E1uey2_&M@la9>+h2ngJS(j48o!{8-|j`^GZu zYWOV&@Fr6W@I!|GNu2=rgc4%q%(h(Y$;DuUh|Nh;x~LOb%T6uqnnQ^wN~=?4r4-IB zjk$`yT>0Xr(ul~62&GmP+q9{bK087On+WiX01s@32LhZ~7%&GbswXy%vO&l;fw0GTv6k<-LaV9ojxkAUlh(?5IhVBoE3JkDB47IR9 zia;tOR6Eqq^9OXE{tRj`bHsptxRmr~gYRECc8ooE15#F)SONyaeWh?;oR*r0p;e4l zBW9Hh9(@1#kYiWyh6wJ#W5=kt*;^xmrcrMV?S6HWDd-Ys0h%CFAoTGHWR+kJhEd;# z!5Ro-CfW(G!6FcXVA{l@1Z=ipotDrCW*p3^9{34NaEW$4PE(vlpBRy-=K@8K?+c5N z;V-57z(Ac0|5+LtMkI}i)Fy=vu6H=-&1sGspRxx7^@DpuQp3a3Lg*#>K%q}wUdeb7 z-LMgh&G!cC1FTI0(e2PjDF$DmsK>iyD!E)j=TI~O9;{~4LzA?Fa6*e^fj8a=OV-if z5}4c}9wxCHN?r)S;QM62or5RoA*OcCw4@rlTBMW7;;mDs556|Bw?z$G+tZZl8l6l& zXMP&vnxtdkAqDo}U+kw~57ZEK_Sx()Cc$sI$4rClr@Z|>%ncHQikZWsR(#pzE#>7~ zE-&+2@~^MXpMMq0jvmFbR~9UIh5P#G=J)Qdsk!^T&70r7ySn;rl1rR5ydV1i5c~ig zN(UJc#6H!U2)q>R5R9VVx&ynxLM34Jh|SXJfl*nQ3SRyY>9rucIs3qLf=6Wu-8`qC zM|J+?x^8V&WX((cYj}j0z0p{&F&eu+DFqZZuY04sK0bjUwe9^W^iMmvznwYC0p=-* z+YOBPqKJpP&P#o;jMglFx;UrFpd&yoOR-d%yY$j2j?Ez*dg5WER~6!mHT>4W;$ z+|w)a^H-dn+jn|pLBYz?>~TDJyoo!y_iv}#+D`p#?@_LaZX2p2v&(^+{qJwy{QiO3 z+5_aczb5eTmn*k`Vf8U|+sZF}-jr|dWxz-RAIaRy<75RjSNohOUgN1*jdxDBpMK)c zf8PGa=7Q2~uWkJE6>7jk*SJPigz2%d#%|5BSv0W32Rn`e2+4Ic9>j4cvy&v*C1j92*FJLrc zG);b|RHvtkn>I|hpE~sc-T6dXD7RZ_i`#z%-@E;%8*-CoY-)@Nr#_9VoSV0Pgua3DadP&!LGN(#D)%vl|4HmvE$%3pJS>F&?!(_0~p)kjpE!p*n*|q6$c2CplmRToOm-b9+3sPtym8-Ruv}YAGrrYA& z(>Bbm+PkQ*s$9U8dyvPqby8fv$9Kj56A@|M`)8>p^C?~+iPS6lQ^}j znC`~!CmF^E=6z;8$b=YZCeDc|&BUzdlCE%xOegc78-dJ!j`6&KwJoy`+7YMT?}Md* z?+2<+y@X4-OINsyxLkOOo4I7jK>cwEK6VTq#^}WGmn=*_M00s-0`nt33pmOAuLS*| zuC?s$a9ye0|H0#!sDF) z@poLoS?*pofMo+&ZvR=X;AohI#j#?UNUR9J_0VNH!J#fdA!emw9LEYcFeSm!8clTY zjpuo6BEoYmmb@_fGi4;;77>JVea+M({C_;(L0*s+&sH~x%P+9b> zP|eW$mYk@l91G=8MgY7tfVT|b$pM~5OdM+xioitVmuUunNxN>m9VDS0gMVg1*m_gc zjXj5}f+J+i?S}!A0GT><9-u?98mW)sDggUp(2{S=dsLs8@vr;MbX` zl;Zf<%owFQI>ku!*Vm=5-&cz=E()g-Srt=74a}~PcK<{kI8*@Wy9XN*}!K?b zRp9sQ>v~(8d-GR6)gKqxx~`8>t|G?G|~#Viu1`3WW~E^sPg*#PUI{N&q8_dT%fj_Dgb`A7R& z_I0OaFL|`5dxtAPVqJFr--YfsU%&KJ-IOgA&BYroE?e{FzS_!?HY;=hy3;iL6}^LD z`FPT}d7O_Oxk!jH z)wyN!kLA$?LDEn|Xj=E)=C*wut|)7ivLG(grYhZXb?uUucY(t2{lnZ$`Y!=Wzc-FV z`yB`{GDH{seycF*dU{93Nn!S_O^T~D1Pd`FU3`2~RowLb^Rs~eON``eM^a;}dSy#eLN!FD#M0)_2=^!_Ad0b#tACC)$NW)FYq(Rsr&82nG=CL^8 z(gOsm{Kv*(^^boH9H71^a=-k1*Uo9Sx+!$qjU6#-YuoeJy|}Lb#hul8=|f9?`&+=F zVfbs1-L0@LD-^r}k8>n0gAHI_iR22Fl!z0|e`1@}orkS9C+sDJWv@rC6NxEX*|G*F z9h_F#nOnKE%I2)=!K1>4hA z=AiP}aB+Net|BLCb%xSJSP67Al5qvOl#uAZV1dYNI7Syp{C|wy(bFzVQG3q%dsWmW zQ(IrZr|;Z`@`BagMKc~;lCKIKnn5QvEiW(XC{0xAq*Pz-oXWU+H*+z>7L@IHbJM(w z+p2Sxon8g?PVu0y4x|8s|NY!A{M)Mun-p zPpmDy6@DqM`}RDw53E%3t(r!;d7-SYKD1!BEL@&PsPAj^_SI&y=xR&6LjR z+h!(dT0)o*cXPqa4TDDn{v-~6C3>6v75D%kZ{wkZ7AhyPmrmfFzsqsPmG3`w>C@{I z>gt=*ZnmWHZShr$%FP5PYQw0>_2JjpdT4Q;SS%iTbb^^JmMR>ziwYV6P=E86gzn54ZW>bGJiKl~zz2oHTPF+7to?3_pR zAK90XapJg>oE1f!8!!U=D8JjU3pcel-<9> zX^IRhD;7w~UJ;}ZS`#2vuGNOD`Q)Upt1Tzb1a<~X+81mUsAKMy1Z|cCsW+>!1m=Iz z|C7+a1>J?e^MH4W<&7jiZMRfHbu5NPLt^6%|j?(qqrBU%Lf~BwkMNKgrW|V3aQ3 z^@IHN`$n&m@rJxrHpo=g*ip#klg(pgYV4Y4Oca6W#N@K38Nap>mPNJMj$4c1*d+`f zP{{1D`owZXE{VK+ue3}e9)iSA6bE7-fLEespxrYTCZTvBq)6bW$z!={m8e)4;}OelKnybUMA7*HJU*KR+e&xbgTc z)rCDe0l(Ki{Jgwb{xDJ6?E$KQlHL+CQKG5mx!g%nTzK{ct)Am#iu-U_=B%Q*f-dnm z@;WR|1(`}g1wVx41f?eEO{Ulruzh2kVgMW2bCc@&c(zU)YJ%-p?dS7KF!tgYz}<}M zc)h=iS?t$;u^g@w{U@=`3Hp9({l7_WZZ-&nYW7v4(Yjco*|9o3X!y-W;lHmCqws^g z_|bOahuH(93pPS*8pD$V%+itTnlab!Bi9AnA$l70r{Q}?|9>(jKVGktlN*>MuIWds z+pR2)V0HZVfynn5oAV>bnKwi~G=!6?++^Yl?B@A>fS>;%^E5hR-o##BVoBdWg|{-yH$KSet8oMdwg&`IcuGBeM)3ENxdXiIgjsVuF5hoE zZ$|FNkN8ap|Hy%!gaToN2~UZg^@5KGJJQC}0V!SBNidQ{7x|Ltko5KC&?og^1wYWK z30L5Jc~sa@ZdZ7eDpH1bKcY8Dx$}xhgX>lA74qF+#f+)8Cl@{;a0;l;`II~YWbn! zb&-*<7ZAk$$J48WVG@=T#QTL+4zGExxev{)-dD8hoO@y1#$8y&L2-qa!C*`&*=R6wF?U(xCT_rlnXyUCjOR_lOCu=3HJ z2yxsJSodduuqsD30{UGr=y|M1KF)JdljJz0qnLo)q{ujfMiLMtN_B25U9o{nI6q04 z;198kR@sW9>Gq)``MC;}LJ}}FA$jXMY5}bBCW{~7EQOjow!vqchW{yk0r0H-LH>~u)S{zOAj^RGaO^%2&XeElkw8V`iD}l^gN#OW6h>s2*)yh$# z`K2wa339pp^k<9+@*5U-W7(e_hBXR_QbIh5f&7y{=b_eW6tD+{w{yZ}Uow}(>)eoD zAP%MPz-NTMa5tn!ESbMxNo0BhUJ+k5t8YO{dYPqsVMY1U+W4pAmzguVcQ=&f8O>Sk zkmrT$?CNui7oS|@nbqJ(3pOPgE1NQU_cRqQO~hXs+?9@*ix$mvRJsjAAI3Ptf3@% zzpJfc)l_FB$qm7#IQq8`6D7M~eZe3QyOE_l1kcAWe9zO1Zd#gOfxV@V5jf&di1S7R zB;vJFkdGjHI$R(LE+JDi1}+u7QEF1&CY9c%G)eFH@<`x>ZbX3rnmsDj9!&sN3{IV- zON58NhCY7-xI^4*GTepeEtn0Qmw%*}#2p6u7C_u#;LxD~B2x79;wDeeo@qmOQT}N|r=qUuhcrkk(Bm_2xU|@-Qg13mL4E#oGNel~fm^B)+BP=Y@qNTqX z45GimxnT~AMq}Zx!4ak*3gy6lvr_<1O*{_uNQ9T)Bu%MF5S))!-n;|ti?JO*hev!H z(vk-h#IAb@(~%0A9r7 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�p8T)6I% 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