| @@ -39,6 +39,15 @@ | |||
| "tags": [ | |||
| "Visual" | |||
| ] | |||
| }, | |||
| { | |||
| "slug": "Ildaeil", | |||
| "disabled": false, | |||
| "name": "Ildaeil Plugin Host", | |||
| "description": "A plugin host within Cardinal for loading any FX", | |||
| "tags": [ | |||
| "Utility" | |||
| ] | |||
| } | |||
| ] | |||
| } | |||
| @@ -0,0 +1,21 @@ | |||
| The MIT License (MIT) | |||
| Copyright (c) 2014-2021 Omar Cornut | |||
| 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. | |||
| @@ -0,0 +1,3 @@ | |||
| Taken from https://github.com/ocornut/imgui master branch with commit ddddabdccfdafffd8664fb4e29230dc4f848137e | |||
| Files are used as-is except a few parts in the code disabled by a `#ifndef IMGUI_DPF_BACKEND` condition. | |||
| @@ -0,0 +1,123 @@ | |||
| //----------------------------------------------------------------------------- | |||
| // COMPILE-TIME OPTIONS FOR DEAR IMGUI | |||
| // Runtime options (clipboard callbacks, enabling various features, etc.) can generally be set via the ImGuiIO structure. | |||
| // You can use ImGui::SetAllocatorFunctions() before calling ImGui::CreateContext() to rewire memory allocation functions. | |||
| //----------------------------------------------------------------------------- | |||
| // A) You may edit imconfig.h (and not overwrite it when updating Dear ImGui, or maintain a patch/rebased branch with your modifications to it) | |||
| // B) or '#define IMGUI_USER_CONFIG "my_imgui_config.h"' in your project and then add directives in your own file without touching this template. | |||
| //----------------------------------------------------------------------------- | |||
| // You need to make sure that configuration settings are defined consistently _everywhere_ Dear ImGui is used, which include the imgui*.cpp | |||
| // files but also _any_ of your code that uses Dear ImGui. This is because some compile-time options have an affect on data structures. | |||
| // Defining those options in imconfig.h will ensure every compilation unit gets to see the same data structure layouts. | |||
| // Call IMGUI_CHECKVERSION() from your .cpp files to verify that the data structures your files are using are matching the ones imgui.cpp is using. | |||
| //----------------------------------------------------------------------------- | |||
| #pragma once | |||
| //---- Define assertion handler. Defaults to calling assert(). | |||
| // If your macro uses multiple statements, make sure is enclosed in a 'do { .. } while (0)' block so it can be used as a single statement. | |||
| //#define IM_ASSERT(_EXPR) MyAssert(_EXPR) | |||
| //#define IM_ASSERT(_EXPR) ((void)(_EXPR)) // Disable asserts | |||
| //---- Define attributes of all API symbols declarations, e.g. for DLL under Windows | |||
| // Using Dear ImGui via a shared library is not recommended, because of function call overhead and because we don't guarantee backward nor forward ABI compatibility. | |||
| // DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions() | |||
| // for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for more details. | |||
| //#define IMGUI_API __declspec( dllexport ) | |||
| //#define IMGUI_API __declspec( dllimport ) | |||
| //---- Don't define obsolete functions/enums/behaviors. Consider enabling from time to time after updating to avoid using soon-to-be obsolete function/names. | |||
| //#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS | |||
| //---- Disable all of Dear ImGui or don't implement standard windows. | |||
| // It is very strongly recommended to NOT disable the demo windows during development. Please read comments in imgui_demo.cpp. | |||
| //#define IMGUI_DISABLE // Disable everything: all headers and source files will be empty. | |||
| //#define IMGUI_DISABLE_DEMO_WINDOWS // Disable demo windows: ShowDemoWindow()/ShowStyleEditor() will be empty. Not recommended. | |||
| //#define IMGUI_DISABLE_METRICS_WINDOW // Disable metrics/debugger window: ShowMetricsWindow() will be empty. | |||
| //---- Don't implement some functions to reduce linkage requirements. | |||
| //#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS // [Win32] Don't implement default clipboard handler. Won't use and link with OpenClipboard/GetClipboardData/CloseClipboard etc. (user32.lib/.a, kernel32.lib/.a) | |||
| //#define IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with Visual Studio] Implement default IME handler (require imm32.lib/.a, auto-link for Visual Studio, -limm32 on command-line for MinGW) | |||
| //#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with non-Visual Studio compilers] Don't implement default IME handler (won't require imm32.lib/.a) | |||
| //#define IMGUI_DISABLE_WIN32_FUNCTIONS // [Win32] Won't use and link with any Win32 function (clipboard, ime). | |||
| //#define IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS // [OSX] Implement default OSX clipboard handler (need to link with '-framework ApplicationServices', this is why this is not the default). | |||
| //#define IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS // Don't implement ImFormatString/ImFormatStringV so you can implement them yourself (e.g. if you don't want to link with vsnprintf) | |||
| //#define IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS // Don't implement ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 so you can implement them yourself. | |||
| //#define IMGUI_DISABLE_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle at all (replace them with dummies) | |||
| //#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle so you can implement them yourself if you don't want to link with fopen/fclose/fread/fwrite. This will also disable the LogToTTY() function. | |||
| //#define IMGUI_DISABLE_DEFAULT_ALLOCATORS // Don't implement default allocators calling malloc()/free() to avoid linking with them. You will need to call ImGui::SetAllocatorFunctions(). | |||
| //#define IMGUI_DISABLE_SSE // Disable use of SSE intrinsics even if available | |||
| //---- Include imgui_user.h at the end of imgui.h as a convenience | |||
| //#define IMGUI_INCLUDE_IMGUI_USER_H | |||
| //---- Pack colors to BGRA8 instead of RGBA8 (to avoid converting from one to another) | |||
| //#define IMGUI_USE_BGRA_PACKED_COLOR | |||
| //---- Use 32-bit for ImWchar (default is 16-bit) to support unicode planes 1-16. (e.g. point beyond 0xFFFF like emoticons, dingbats, symbols, shapes, ancient languages, etc...) | |||
| //#define IMGUI_USE_WCHAR32 | |||
| //---- Avoid multiple STB libraries implementations, or redefine path/filenames to prioritize another version | |||
| // By default the embedded implementations are declared static and not available outside of Dear ImGui sources files. | |||
| //#define IMGUI_STB_TRUETYPE_FILENAME "my_folder/stb_truetype.h" | |||
| //#define IMGUI_STB_RECT_PACK_FILENAME "my_folder/stb_rect_pack.h" | |||
| //#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION | |||
| //#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION | |||
| //---- Use stb_printf's faster implementation of vsnprintf instead of the one from libc (unless IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS is defined) | |||
| // Requires 'stb_sprintf.h' to be available in the include path. Compatibility checks of arguments and formats done by clang and GCC will be disabled in order to support the extra formats provided by STB sprintf. | |||
| // #define IMGUI_USE_STB_SPRINTF | |||
| //---- Use FreeType to build and rasterize the font atlas (instead of stb_truetype which is embedded by default in Dear ImGui) | |||
| // Requires FreeType headers to be available in the include path. Requires program to be compiled with 'misc/freetype/imgui_freetype.cpp' (in this repository) + the FreeType library (not provided). | |||
| // On Windows you may use vcpkg with 'vcpkg install freetype --triplet=x64-windows' + 'vcpkg integrate install'. | |||
| //#define IMGUI_ENABLE_FREETYPE | |||
| //---- Use stb_truetype to build and rasterize the font atlas (default) | |||
| // The only purpose of this define is if you want force compilation of the stb_truetype backend ALONG with the FreeType backend. | |||
| //#define IMGUI_ENABLE_STB_TRUETYPE | |||
| //---- Define constructor and implicit cast operators to convert back<>forth between your math types and ImVec2/ImVec4. | |||
| // This will be inlined as part of ImVec2 and ImVec4 class declarations. | |||
| /* | |||
| #define IM_VEC2_CLASS_EXTRA \ | |||
| ImVec2(const MyVec2& f) { x = f.x; y = f.y; } \ | |||
| operator MyVec2() const { return MyVec2(x,y); } | |||
| #define IM_VEC4_CLASS_EXTRA \ | |||
| ImVec4(const MyVec4& f) { x = f.x; y = f.y; z = f.z; w = f.w; } \ | |||
| operator MyVec4() const { return MyVec4(x,y,z,w); } | |||
| */ | |||
| //---- Use 32-bit vertex indices (default is 16-bit) is one way to allow large meshes with more than 64K vertices. | |||
| // Your renderer backend will need to support it (most example renderer backends support both 16/32-bit indices). | |||
| // Another way to allow large meshes while keeping 16-bit indices is to handle ImDrawCmd::VtxOffset in your renderer. | |||
| // Read about ImGuiBackendFlags_RendererHasVtxOffset for details. | |||
| //#define ImDrawIdx unsigned int | |||
| //---- Override ImDrawCallback signature (will need to modify renderer backends accordingly) | |||
| //struct ImDrawList; | |||
| //struct ImDrawCmd; | |||
| //typedef void (*MyImDrawCallback)(const ImDrawList* draw_list, const ImDrawCmd* cmd, void* my_renderer_user_data); | |||
| //#define ImDrawCallback MyImDrawCallback | |||
| //---- Debug Tools: Macro to break in Debugger | |||
| // (use 'Metrics->Tools->Item Picker' to pick widgets with the mouse and break into them for easy debugging.) | |||
| //#define IM_DEBUG_BREAK IM_ASSERT(0) | |||
| //#define IM_DEBUG_BREAK __debugbreak() | |||
| //---- Debug Tools: Have the Item Picker break in the ItemAdd() function instead of ItemHoverable(), | |||
| // (which comes earlier in the code, will catch a few extra items, allow picking items other than Hovered one.) | |||
| // This adds a small runtime cost which is why it is not enabled by default. | |||
| //#define IMGUI_DEBUG_TOOL_ITEM_PICKER_EX | |||
| //---- Debug Tools: Enable slower asserts | |||
| //#define IMGUI_DEBUG_PARANOID | |||
| //---- Tip: You can add extra functions within the ImGui:: namespace, here or in your own headers files. | |||
| /* | |||
| namespace ImGui | |||
| { | |||
| void MyFunction(const char* name, const MyMatrix44& v); | |||
| } | |||
| */ | |||
| @@ -0,0 +1,290 @@ | |||
| // dear imgui: Renderer Backend for OpenGL2 (legacy OpenGL, fixed pipeline) | |||
| // This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..) | |||
| // Implemented features: | |||
| // [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID! | |||
| // You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. | |||
| // Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. | |||
| // If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. | |||
| // Read online: https://github.com/ocornut/imgui/tree/master/docs | |||
| // **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)** | |||
| // **Prefer using the code in imgui_impl_opengl3.cpp** | |||
| // This code is mostly provided as a reference to learn how ImGui integration works, because it is shorter to read. | |||
| // If your code is using GL3+ context or any semi modern OpenGL calls, using this is likely to make everything more | |||
| // complicated, will require your code to reset every single OpenGL attributes to their initial state, and might | |||
| // confuse your GPU driver. | |||
| // The GL2 code is unable to reset attributes or even call e.g. "glUseProgram(0)" because they don't exist in that API. | |||
| // CHANGELOG | |||
| // (minor and older changes stripped away, please see git history for details) | |||
| // 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). | |||
| // 2021-05-19: OpenGL: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement) | |||
| // 2021-01-03: OpenGL: Backup, setup and restore GL_SHADE_MODEL state, disable GL_STENCIL_TEST and disable GL_NORMAL_ARRAY client state to increase compatibility with legacy OpenGL applications. | |||
| // 2020-01-23: OpenGL: Backup, setup and restore GL_TEXTURE_ENV to increase compatibility with legacy OpenGL applications. | |||
| // 2019-04-30: OpenGL: Added support for special ImDrawCallback_ResetRenderState callback to reset render state. | |||
| // 2019-02-11: OpenGL: Projecting clipping rectangles correctly using draw_data->FramebufferScale to allow multi-viewports for retina display. | |||
| // 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window. | |||
| // 2018-08-03: OpenGL: Disabling/restoring GL_LIGHTING and GL_COLOR_MATERIAL to increase compatibility with legacy OpenGL applications. | |||
| // 2018-06-08: Misc: Extracted imgui_impl_opengl2.cpp/.h away from the old combined GLFW/SDL+OpenGL2 examples. | |||
| // 2018-06-08: OpenGL: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle. | |||
| // 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplOpenGL2_RenderDrawData() in the .h file so you can call it yourself. | |||
| // 2017-09-01: OpenGL: Save and restore current polygon mode. | |||
| // 2016-09-10: OpenGL: Uploading font texture as RGBA32 to increase compatibility with users shaders (not ideal). | |||
| // 2016-09-05: OpenGL: Fixed save and restore of current scissor rectangle. | |||
| #include "imgui.h" | |||
| #include "imgui_impl_opengl2.h" | |||
| #if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier | |||
| #include <stddef.h> // intptr_t | |||
| #else | |||
| #include <stdint.h> // intptr_t | |||
| #endif | |||
| // Include OpenGL header (without an OpenGL loader) requires a bit of fiddling | |||
| #if defined(_WIN32) && !defined(APIENTRY) | |||
| #define APIENTRY __stdcall // It is customary to use APIENTRY for OpenGL function pointer declarations on all platforms. Additionally, the Windows OpenGL header needs APIENTRY. | |||
| #endif | |||
| #if defined(_WIN32) && !defined(WINGDIAPI) | |||
| #define WINGDIAPI __declspec(dllimport) // Some Windows OpenGL headers need this | |||
| #endif | |||
| #if defined(__APPLE__) | |||
| #define GL_SILENCE_DEPRECATION 1 | |||
| #include <OpenGL/gl.h> | |||
| #else | |||
| #include <GL/gl.h> | |||
| #endif | |||
| struct ImGui_ImplOpenGL2_Data | |||
| { | |||
| GLuint FontTexture; | |||
| ImGui_ImplOpenGL2_Data() { memset(this, 0, sizeof(*this)); } | |||
| }; | |||
| // Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts | |||
| // It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. | |||
| static ImGui_ImplOpenGL2_Data* ImGui_ImplOpenGL2_GetBackendData() | |||
| { | |||
| return ImGui::GetCurrentContext() ? (ImGui_ImplOpenGL2_Data*)ImGui::GetIO().BackendRendererUserData : NULL; | |||
| } | |||
| // Functions | |||
| bool ImGui_ImplOpenGL2_Init() | |||
| { | |||
| ImGuiIO& io = ImGui::GetIO(); | |||
| IM_ASSERT(io.BackendRendererUserData == NULL && "Already initialized a renderer backend!"); | |||
| // Setup backend capabilities flags | |||
| ImGui_ImplOpenGL2_Data* bd = IM_NEW(ImGui_ImplOpenGL2_Data)(); | |||
| io.BackendRendererUserData = (void*)bd; | |||
| io.BackendRendererName = "imgui_impl_opengl2"; | |||
| return true; | |||
| } | |||
| void ImGui_ImplOpenGL2_Shutdown() | |||
| { | |||
| ImGuiIO& io = ImGui::GetIO(); | |||
| ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData(); | |||
| ImGui_ImplOpenGL2_DestroyDeviceObjects(); | |||
| io.BackendRendererName = NULL; | |||
| io.BackendRendererUserData = NULL; | |||
| IM_DELETE(bd); | |||
| } | |||
| void ImGui_ImplOpenGL2_NewFrame() | |||
| { | |||
| ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData(); | |||
| IM_ASSERT(bd != NULL && "Did you call ImGui_ImplOpenGL2_Init()?"); | |||
| if (!bd->FontTexture) | |||
| ImGui_ImplOpenGL2_CreateDeviceObjects(); | |||
| } | |||
| static void ImGui_ImplOpenGL2_SetupRenderState(ImDrawData* draw_data, int fb_width, int fb_height) | |||
| { | |||
| // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers, polygon fill. | |||
| glEnable(GL_BLEND); | |||
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | |||
| //glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); // In order to composite our output buffer we need to preserve alpha | |||
| glDisable(GL_CULL_FACE); | |||
| glDisable(GL_DEPTH_TEST); | |||
| glDisable(GL_STENCIL_TEST); | |||
| glDisable(GL_LIGHTING); | |||
| glDisable(GL_COLOR_MATERIAL); | |||
| glEnable(GL_SCISSOR_TEST); | |||
| glEnableClientState(GL_VERTEX_ARRAY); | |||
| glEnableClientState(GL_TEXTURE_COORD_ARRAY); | |||
| glEnableClientState(GL_COLOR_ARRAY); | |||
| glDisableClientState(GL_NORMAL_ARRAY); | |||
| glEnable(GL_TEXTURE_2D); | |||
| glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); | |||
| glShadeModel(GL_SMOOTH); | |||
| glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); | |||
| #ifndef IMGUI_DPF_BACKEND | |||
| // If you are using this code with non-legacy OpenGL header/contexts (which you should not, prefer using imgui_impl_opengl3.cpp!!), | |||
| // you may need to backup/reset/restore other state, e.g. for current shader using the commented lines below. | |||
| // (DO NOT MODIFY THIS FILE! Add the code in your calling function) | |||
| // GLint last_program; | |||
| // glGetIntegerv(GL_CURRENT_PROGRAM, &last_program); | |||
| // glUseProgram(0); | |||
| // ImGui_ImplOpenGL2_RenderDrawData(...); | |||
| // glUseProgram(last_program) | |||
| // There are potentially many more states you could need to clear/setup that we can't access from default headers. | |||
| // e.g. glBindBuffer(GL_ARRAY_BUFFER, 0), glDisable(GL_TEXTURE_CUBE_MAP). | |||
| // Setup viewport, orthographic projection matrix | |||
| // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps. | |||
| glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height); | |||
| glMatrixMode(GL_PROJECTION); | |||
| glPushMatrix(); | |||
| glLoadIdentity(); | |||
| glOrtho(draw_data->DisplayPos.x, draw_data->DisplayPos.x + draw_data->DisplaySize.x, draw_data->DisplayPos.y + draw_data->DisplaySize.y, draw_data->DisplayPos.y, -1.0f, +1.0f); | |||
| glMatrixMode(GL_MODELVIEW); | |||
| glPushMatrix(); | |||
| glLoadIdentity(); | |||
| #else | |||
| IM_UNUSED(draw_data); | |||
| IM_UNUSED(fb_width); | |||
| IM_UNUSED(fb_height); | |||
| #endif | |||
| } | |||
| // OpenGL2 Render function. | |||
| // Note that this implementation is little overcomplicated because we are saving/setting up/restoring every OpenGL state explicitly. | |||
| // This is in order to be able to run within an OpenGL engine that doesn't do so. | |||
| void ImGui_ImplOpenGL2_RenderDrawData(ImDrawData* draw_data) | |||
| { | |||
| // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates) | |||
| int fb_width = (int)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x); | |||
| int fb_height = (int)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y); | |||
| if (fb_width == 0 || fb_height == 0) | |||
| return; | |||
| // Backup GL state | |||
| GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture); | |||
| GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode); | |||
| GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport); | |||
| GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box); | |||
| GLint last_shade_model; glGetIntegerv(GL_SHADE_MODEL, &last_shade_model); | |||
| GLint last_tex_env_mode; glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &last_tex_env_mode); | |||
| glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT); | |||
| // Setup desired GL state | |||
| ImGui_ImplOpenGL2_SetupRenderState(draw_data, fb_width, fb_height); | |||
| // Will project scissor/clipping rectangles into framebuffer space | |||
| ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports | |||
| ImVec2 clip_scale = draw_data->FramebufferScale; // (1,1) unless using retina display which are often (2,2) | |||
| // Render command lists | |||
| for (int n = 0; n < draw_data->CmdListsCount; n++) | |||
| { | |||
| const ImDrawList* cmd_list = draw_data->CmdLists[n]; | |||
| const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data; | |||
| const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; | |||
| glVertexPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, pos))); | |||
| glTexCoordPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, uv))); | |||
| glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, col))); | |||
| for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) | |||
| { | |||
| const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; | |||
| if (pcmd->UserCallback) | |||
| { | |||
| // User callback, registered via ImDrawList::AddCallback() | |||
| // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) | |||
| if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) | |||
| ImGui_ImplOpenGL2_SetupRenderState(draw_data, fb_width, fb_height); | |||
| else | |||
| pcmd->UserCallback(cmd_list, pcmd); | |||
| } | |||
| else | |||
| { | |||
| // Project scissor/clipping rectangles into framebuffer space | |||
| ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y); | |||
| ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y); | |||
| if (clip_max.x < clip_min.x || clip_max.y < clip_min.y) | |||
| continue; | |||
| // Apply scissor/clipping rectangle (Y is inverted in OpenGL) | |||
| glScissor((int)clip_min.x, (int)(fb_height - clip_max.y), (int)(clip_max.x - clip_min.x), (int)(clip_max.y - clip_min.y)); | |||
| // Bind texture, Draw | |||
| glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID()); | |||
| glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer); | |||
| } | |||
| idx_buffer += pcmd->ElemCount; | |||
| } | |||
| } | |||
| // Restore modified GL state | |||
| glDisableClientState(GL_COLOR_ARRAY); | |||
| glDisableClientState(GL_TEXTURE_COORD_ARRAY); | |||
| glDisableClientState(GL_VERTEX_ARRAY); | |||
| glBindTexture(GL_TEXTURE_2D, (GLuint)last_texture); | |||
| glMatrixMode(GL_MODELVIEW); | |||
| glPopMatrix(); | |||
| glMatrixMode(GL_PROJECTION); | |||
| glPopMatrix(); | |||
| glPopAttrib(); | |||
| glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]); glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1]); | |||
| glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]); | |||
| glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]); | |||
| glShadeModel(last_shade_model); | |||
| glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, last_tex_env_mode); | |||
| } | |||
| bool ImGui_ImplOpenGL2_CreateFontsTexture() | |||
| { | |||
| // Build texture atlas | |||
| ImGuiIO& io = ImGui::GetIO(); | |||
| ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData(); | |||
| unsigned char* pixels; | |||
| int width, height; | |||
| io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); // Load as RGBA 32-bit (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory. | |||
| // Upload texture to graphics system | |||
| GLint last_texture; | |||
| glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture); | |||
| glGenTextures(1, &bd->FontTexture); | |||
| glBindTexture(GL_TEXTURE_2D, bd->FontTexture); | |||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | |||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | |||
| glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); | |||
| glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); | |||
| // Store our identifier | |||
| io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontTexture); | |||
| // Restore state | |||
| glBindTexture(GL_TEXTURE_2D, last_texture); | |||
| return true; | |||
| } | |||
| void ImGui_ImplOpenGL2_DestroyFontsTexture() | |||
| { | |||
| ImGuiIO& io = ImGui::GetIO(); | |||
| ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData(); | |||
| if (bd->FontTexture) | |||
| { | |||
| glDeleteTextures(1, &bd->FontTexture); | |||
| io.Fonts->SetTexID(0); | |||
| bd->FontTexture = 0; | |||
| } | |||
| } | |||
| bool ImGui_ImplOpenGL2_CreateDeviceObjects() | |||
| { | |||
| return ImGui_ImplOpenGL2_CreateFontsTexture(); | |||
| } | |||
| void ImGui_ImplOpenGL2_DestroyDeviceObjects() | |||
| { | |||
| ImGui_ImplOpenGL2_DestroyFontsTexture(); | |||
| } | |||
| @@ -0,0 +1,32 @@ | |||
| // dear imgui: Renderer Backend for OpenGL2 (legacy OpenGL, fixed pipeline) | |||
| // This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..) | |||
| // Implemented features: | |||
| // [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID! | |||
| // You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. | |||
| // Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. | |||
| // If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. | |||
| // Read online: https://github.com/ocornut/imgui/tree/master/docs | |||
| // **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)** | |||
| // **Prefer using the code in imgui_impl_opengl3.cpp** | |||
| // This code is mostly provided as a reference to learn how ImGui integration works, because it is shorter to read. | |||
| // If your code is using GL3+ context or any semi modern OpenGL calls, using this is likely to make everything more | |||
| // complicated, will require your code to reset every single OpenGL attributes to their initial state, and might | |||
| // confuse your GPU driver. | |||
| // The GL2 code is unable to reset attributes or even call e.g. "glUseProgram(0)" because they don't exist in that API. | |||
| #pragma once | |||
| #include "imgui.h" // IMGUI_IMPL_API | |||
| IMGUI_IMPL_API bool ImGui_ImplOpenGL2_Init(); | |||
| IMGUI_IMPL_API void ImGui_ImplOpenGL2_Shutdown(); | |||
| IMGUI_IMPL_API void ImGui_ImplOpenGL2_NewFrame(); | |||
| IMGUI_IMPL_API void ImGui_ImplOpenGL2_RenderDrawData(ImDrawData* draw_data); | |||
| // Called by Init/NewFrame/Shutdown | |||
| IMGUI_IMPL_API bool ImGui_ImplOpenGL2_CreateFontsTexture(); | |||
| IMGUI_IMPL_API void ImGui_ImplOpenGL2_DestroyFontsTexture(); | |||
| IMGUI_IMPL_API bool ImGui_ImplOpenGL2_CreateDeviceObjects(); | |||
| IMGUI_IMPL_API void ImGui_ImplOpenGL2_DestroyDeviceObjects(); | |||
| @@ -0,0 +1,639 @@ | |||
| // [DEAR IMGUI] | |||
| // This is a slightly modified version of stb_rect_pack.h 1.00. | |||
| // Those changes would need to be pushed into nothings/stb: | |||
| // - Added STBRP__CDECL | |||
| // Grep for [DEAR IMGUI] to find the changes. | |||
| // stb_rect_pack.h - v1.00 - public domain - rectangle packing | |||
| // Sean Barrett 2014 | |||
| // | |||
| // Useful for e.g. packing rectangular textures into an atlas. | |||
| // Does not do rotation. | |||
| // | |||
| // Not necessarily the awesomest packing method, but better than | |||
| // the totally naive one in stb_truetype (which is primarily what | |||
| // this is meant to replace). | |||
| // | |||
| // Has only had a few tests run, may have issues. | |||
| // | |||
| // More docs to come. | |||
| // | |||
| // No memory allocations; uses qsort() and assert() from stdlib. | |||
| // Can override those by defining STBRP_SORT and STBRP_ASSERT. | |||
| // | |||
| // This library currently uses the Skyline Bottom-Left algorithm. | |||
| // | |||
| // Please note: better rectangle packers are welcome! Please | |||
| // implement them to the same API, but with a different init | |||
| // function. | |||
| // | |||
| // Credits | |||
| // | |||
| // Library | |||
| // Sean Barrett | |||
| // Minor features | |||
| // Martins Mozeiko | |||
| // github:IntellectualKitty | |||
| // | |||
| // Bugfixes / warning fixes | |||
| // Jeremy Jaussaud | |||
| // Fabian Giesen | |||
| // | |||
| // Version history: | |||
| // | |||
| // 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles | |||
| // 0.99 (2019-02-07) warning fixes | |||
| // 0.11 (2017-03-03) return packing success/fail result | |||
| // 0.10 (2016-10-25) remove cast-away-const to avoid warnings | |||
| // 0.09 (2016-08-27) fix compiler warnings | |||
| // 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0) | |||
| // 0.07 (2015-09-13) fix bug with empty rects (w=0 or h=0) | |||
| // 0.06 (2015-04-15) added STBRP_SORT to allow replacing qsort | |||
| // 0.05: added STBRP_ASSERT to allow replacing assert | |||
| // 0.04: fixed minor bug in STBRP_LARGE_RECTS support | |||
| // 0.01: initial release | |||
| // | |||
| // LICENSE | |||
| // | |||
| // See end of file for license information. | |||
| ////////////////////////////////////////////////////////////////////////////// | |||
| // | |||
| // INCLUDE SECTION | |||
| // | |||
| #ifndef STB_INCLUDE_STB_RECT_PACK_H | |||
| #define STB_INCLUDE_STB_RECT_PACK_H | |||
| #define STB_RECT_PACK_VERSION 1 | |||
| #ifdef STBRP_STATIC | |||
| #define STBRP_DEF static | |||
| #else | |||
| #define STBRP_DEF extern | |||
| #endif | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| typedef struct stbrp_context stbrp_context; | |||
| typedef struct stbrp_node stbrp_node; | |||
| typedef struct stbrp_rect stbrp_rect; | |||
| #ifdef STBRP_LARGE_RECTS | |||
| typedef int stbrp_coord; | |||
| #else | |||
| typedef unsigned short stbrp_coord; | |||
| #endif | |||
| STBRP_DEF int stbrp_pack_rects (stbrp_context *context, stbrp_rect *rects, int num_rects); | |||
| // Assign packed locations to rectangles. The rectangles are of type | |||
| // 'stbrp_rect' defined below, stored in the array 'rects', and there | |||
| // are 'num_rects' many of them. | |||
| // | |||
| // Rectangles which are successfully packed have the 'was_packed' flag | |||
| // set to a non-zero value and 'x' and 'y' store the minimum location | |||
| // on each axis (i.e. bottom-left in cartesian coordinates, top-left | |||
| // if you imagine y increasing downwards). Rectangles which do not fit | |||
| // have the 'was_packed' flag set to 0. | |||
| // | |||
| // You should not try to access the 'rects' array from another thread | |||
| // while this function is running, as the function temporarily reorders | |||
| // the array while it executes. | |||
| // | |||
| // To pack into another rectangle, you need to call stbrp_init_target | |||
| // again. To continue packing into the same rectangle, you can call | |||
| // this function again. Calling this multiple times with multiple rect | |||
| // arrays will probably produce worse packing results than calling it | |||
| // a single time with the full rectangle array, but the option is | |||
| // available. | |||
| // | |||
| // The function returns 1 if all of the rectangles were successfully | |||
| // packed and 0 otherwise. | |||
| struct stbrp_rect | |||
| { | |||
| // reserved for your use: | |||
| int id; | |||
| // input: | |||
| stbrp_coord w, h; | |||
| // output: | |||
| stbrp_coord x, y; | |||
| int was_packed; // non-zero if valid packing | |||
| }; // 16 bytes, nominally | |||
| STBRP_DEF void stbrp_init_target (stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes); | |||
| // Initialize a rectangle packer to: | |||
| // pack a rectangle that is 'width' by 'height' in dimensions | |||
| // using temporary storage provided by the array 'nodes', which is 'num_nodes' long | |||
| // | |||
| // You must call this function every time you start packing into a new target. | |||
| // | |||
| // There is no "shutdown" function. The 'nodes' memory must stay valid for | |||
| // the following stbrp_pack_rects() call (or calls), but can be freed after | |||
| // the call (or calls) finish. | |||
| // | |||
| // Note: to guarantee best results, either: | |||
| // 1. make sure 'num_nodes' >= 'width' | |||
| // or 2. call stbrp_allow_out_of_mem() defined below with 'allow_out_of_mem = 1' | |||
| // | |||
| // If you don't do either of the above things, widths will be quantized to multiples | |||
| // of small integers to guarantee the algorithm doesn't run out of temporary storage. | |||
| // | |||
| // If you do #2, then the non-quantized algorithm will be used, but the algorithm | |||
| // may run out of temporary storage and be unable to pack some rectangles. | |||
| STBRP_DEF void stbrp_setup_allow_out_of_mem (stbrp_context *context, int allow_out_of_mem); | |||
| // Optionally call this function after init but before doing any packing to | |||
| // change the handling of the out-of-temp-memory scenario, described above. | |||
| // If you call init again, this will be reset to the default (false). | |||
| STBRP_DEF void stbrp_setup_heuristic (stbrp_context *context, int heuristic); | |||
| // Optionally select which packing heuristic the library should use. Different | |||
| // heuristics will produce better/worse results for different data sets. | |||
| // If you call init again, this will be reset to the default. | |||
| enum | |||
| { | |||
| STBRP_HEURISTIC_Skyline_default=0, | |||
| STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default, | |||
| STBRP_HEURISTIC_Skyline_BF_sortHeight | |||
| }; | |||
| ////////////////////////////////////////////////////////////////////////////// | |||
| // | |||
| // the details of the following structures don't matter to you, but they must | |||
| // be visible so you can handle the memory allocations for them | |||
| struct stbrp_node | |||
| { | |||
| stbrp_coord x,y; | |||
| stbrp_node *next; | |||
| }; | |||
| struct stbrp_context | |||
| { | |||
| int width; | |||
| int height; | |||
| int align; | |||
| int init_mode; | |||
| int heuristic; | |||
| int num_nodes; | |||
| stbrp_node *active_head; | |||
| stbrp_node *free_head; | |||
| stbrp_node extra[2]; // we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2' | |||
| }; | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif | |||
| ////////////////////////////////////////////////////////////////////////////// | |||
| // | |||
| // IMPLEMENTATION SECTION | |||
| // | |||
| #ifdef STB_RECT_PACK_IMPLEMENTATION | |||
| #ifndef STBRP_SORT | |||
| #include <stdlib.h> | |||
| #define STBRP_SORT qsort | |||
| #endif | |||
| #ifndef STBRP_ASSERT | |||
| #include <assert.h> | |||
| #define STBRP_ASSERT assert | |||
| #endif | |||
| // [DEAR IMGUI] Added STBRP__CDECL | |||
| #ifdef _MSC_VER | |||
| #define STBRP__NOTUSED(v) (void)(v) | |||
| #define STBRP__CDECL __cdecl | |||
| #else | |||
| #define STBRP__NOTUSED(v) (void)sizeof(v) | |||
| #define STBRP__CDECL | |||
| #endif | |||
| enum | |||
| { | |||
| STBRP__INIT_skyline = 1 | |||
| }; | |||
| STBRP_DEF void stbrp_setup_heuristic(stbrp_context *context, int heuristic) | |||
| { | |||
| switch (context->init_mode) { | |||
| case STBRP__INIT_skyline: | |||
| STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight); | |||
| context->heuristic = heuristic; | |||
| break; | |||
| default: | |||
| STBRP_ASSERT(0); | |||
| } | |||
| } | |||
| STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context *context, int allow_out_of_mem) | |||
| { | |||
| if (allow_out_of_mem) | |||
| // if it's ok to run out of memory, then don't bother aligning them; | |||
| // this gives better packing, but may fail due to OOM (even though | |||
| // the rectangles easily fit). @TODO a smarter approach would be to only | |||
| // quantize once we've hit OOM, then we could get rid of this parameter. | |||
| context->align = 1; | |||
| else { | |||
| // if it's not ok to run out of memory, then quantize the widths | |||
| // so that num_nodes is always enough nodes. | |||
| // | |||
| // I.e. num_nodes * align >= width | |||
| // align >= width / num_nodes | |||
| // align = ceil(width/num_nodes) | |||
| context->align = (context->width + context->num_nodes-1) / context->num_nodes; | |||
| } | |||
| } | |||
| STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes) | |||
| { | |||
| int i; | |||
| #ifndef STBRP_LARGE_RECTS | |||
| STBRP_ASSERT(width <= 0xffff && height <= 0xffff); | |||
| #endif | |||
| for (i=0; i < num_nodes-1; ++i) | |||
| nodes[i].next = &nodes[i+1]; | |||
| nodes[i].next = NULL; | |||
| context->init_mode = STBRP__INIT_skyline; | |||
| context->heuristic = STBRP_HEURISTIC_Skyline_default; | |||
| context->free_head = &nodes[0]; | |||
| context->active_head = &context->extra[0]; | |||
| context->width = width; | |||
| context->height = height; | |||
| context->num_nodes = num_nodes; | |||
| stbrp_setup_allow_out_of_mem(context, 0); | |||
| // node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly) | |||
| context->extra[0].x = 0; | |||
| context->extra[0].y = 0; | |||
| context->extra[0].next = &context->extra[1]; | |||
| context->extra[1].x = (stbrp_coord) width; | |||
| #ifdef STBRP_LARGE_RECTS | |||
| context->extra[1].y = (1<<30); | |||
| #else | |||
| context->extra[1].y = 65535; | |||
| #endif | |||
| context->extra[1].next = NULL; | |||
| } | |||
| // find minimum y position if it starts at x1 | |||
| static int stbrp__skyline_find_min_y(stbrp_context *c, stbrp_node *first, int x0, int width, int *pwaste) | |||
| { | |||
| stbrp_node *node = first; | |||
| int x1 = x0 + width; | |||
| int min_y, visited_width, waste_area; | |||
| STBRP__NOTUSED(c); | |||
| STBRP_ASSERT(first->x <= x0); | |||
| #if 0 | |||
| // skip in case we're past the node | |||
| while (node->next->x <= x0) | |||
| ++node; | |||
| #else | |||
| STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency | |||
| #endif | |||
| STBRP_ASSERT(node->x <= x0); | |||
| min_y = 0; | |||
| waste_area = 0; | |||
| visited_width = 0; | |||
| while (node->x < x1) { | |||
| if (node->y > min_y) { | |||
| // raise min_y higher. | |||
| // we've accounted for all waste up to min_y, | |||
| // but we'll now add more waste for everything we've visted | |||
| waste_area += visited_width * (node->y - min_y); | |||
| min_y = node->y; | |||
| // the first time through, visited_width might be reduced | |||
| if (node->x < x0) | |||
| visited_width += node->next->x - x0; | |||
| else | |||
| visited_width += node->next->x - node->x; | |||
| } else { | |||
| // add waste area | |||
| int under_width = node->next->x - node->x; | |||
| if (under_width + visited_width > width) | |||
| under_width = width - visited_width; | |||
| waste_area += under_width * (min_y - node->y); | |||
| visited_width += under_width; | |||
| } | |||
| node = node->next; | |||
| } | |||
| *pwaste = waste_area; | |||
| return min_y; | |||
| } | |||
| typedef struct | |||
| { | |||
| int x,y; | |||
| stbrp_node **prev_link; | |||
| } stbrp__findresult; | |||
| static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int width, int height) | |||
| { | |||
| int best_waste = (1<<30), best_x, best_y = (1 << 30); | |||
| stbrp__findresult fr; | |||
| stbrp_node **prev, *node, *tail, **best = NULL; | |||
| // align to multiple of c->align | |||
| width = (width + c->align - 1); | |||
| width -= width % c->align; | |||
| STBRP_ASSERT(width % c->align == 0); | |||
| // if it can't possibly fit, bail immediately | |||
| if (width > c->width || height > c->height) { | |||
| fr.prev_link = NULL; | |||
| fr.x = fr.y = 0; | |||
| return fr; | |||
| } | |||
| node = c->active_head; | |||
| prev = &c->active_head; | |||
| while (node->x + width <= c->width) { | |||
| int y,waste; | |||
| y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste); | |||
| if (c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) { // actually just want to test BL | |||
| // bottom left | |||
| if (y < best_y) { | |||
| best_y = y; | |||
| best = prev; | |||
| } | |||
| } else { | |||
| // best-fit | |||
| if (y + height <= c->height) { | |||
| // can only use it if it first vertically | |||
| if (y < best_y || (y == best_y && waste < best_waste)) { | |||
| best_y = y; | |||
| best_waste = waste; | |||
| best = prev; | |||
| } | |||
| } | |||
| } | |||
| prev = &node->next; | |||
| node = node->next; | |||
| } | |||
| best_x = (best == NULL) ? 0 : (*best)->x; | |||
| // if doing best-fit (BF), we also have to try aligning right edge to each node position | |||
| // | |||
| // e.g, if fitting | |||
| // | |||
| // ____________________ | |||
| // |____________________| | |||
| // | |||
| // into | |||
| // | |||
| // | | | |||
| // | ____________| | |||
| // |____________| | |||
| // | |||
| // then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned | |||
| // | |||
| // This makes BF take about 2x the time | |||
| if (c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) { | |||
| tail = c->active_head; | |||
| node = c->active_head; | |||
| prev = &c->active_head; | |||
| // find first node that's admissible | |||
| while (tail->x < width) | |||
| tail = tail->next; | |||
| while (tail) { | |||
| int xpos = tail->x - width; | |||
| int y,waste; | |||
| STBRP_ASSERT(xpos >= 0); | |||
| // find the left position that matches this | |||
| while (node->next->x <= xpos) { | |||
| prev = &node->next; | |||
| node = node->next; | |||
| } | |||
| STBRP_ASSERT(node->next->x > xpos && node->x <= xpos); | |||
| y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste); | |||
| if (y + height <= c->height) { | |||
| if (y <= best_y) { | |||
| if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) { | |||
| best_x = xpos; | |||
| STBRP_ASSERT(y <= best_y); | |||
| best_y = y; | |||
| best_waste = waste; | |||
| best = prev; | |||
| } | |||
| } | |||
| } | |||
| tail = tail->next; | |||
| } | |||
| } | |||
| fr.prev_link = best; | |||
| fr.x = best_x; | |||
| fr.y = best_y; | |||
| return fr; | |||
| } | |||
| static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context *context, int width, int height) | |||
| { | |||
| // find best position according to heuristic | |||
| stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height); | |||
| stbrp_node *node, *cur; | |||
| // bail if: | |||
| // 1. it failed | |||
| // 2. the best node doesn't fit (we don't always check this) | |||
| // 3. we're out of memory | |||
| if (res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) { | |||
| res.prev_link = NULL; | |||
| return res; | |||
| } | |||
| // on success, create new node | |||
| node = context->free_head; | |||
| node->x = (stbrp_coord) res.x; | |||
| node->y = (stbrp_coord) (res.y + height); | |||
| context->free_head = node->next; | |||
| // insert the new node into the right starting point, and | |||
| // let 'cur' point to the remaining nodes needing to be | |||
| // stiched back in | |||
| cur = *res.prev_link; | |||
| if (cur->x < res.x) { | |||
| // preserve the existing one, so start testing with the next one | |||
| stbrp_node *next = cur->next; | |||
| cur->next = node; | |||
| cur = next; | |||
| } else { | |||
| *res.prev_link = node; | |||
| } | |||
| // from here, traverse cur and free the nodes, until we get to one | |||
| // that shouldn't be freed | |||
| while (cur->next && cur->next->x <= res.x + width) { | |||
| stbrp_node *next = cur->next; | |||
| // move the current node to the free list | |||
| cur->next = context->free_head; | |||
| context->free_head = cur; | |||
| cur = next; | |||
| } | |||
| // stitch the list back in | |||
| node->next = cur; | |||
| if (cur->x < res.x + width) | |||
| cur->x = (stbrp_coord) (res.x + width); | |||
| #ifdef _DEBUG | |||
| cur = context->active_head; | |||
| while (cur->x < context->width) { | |||
| STBRP_ASSERT(cur->x < cur->next->x); | |||
| cur = cur->next; | |||
| } | |||
| STBRP_ASSERT(cur->next == NULL); | |||
| { | |||
| int count=0; | |||
| cur = context->active_head; | |||
| while (cur) { | |||
| cur = cur->next; | |||
| ++count; | |||
| } | |||
| cur = context->free_head; | |||
| while (cur) { | |||
| cur = cur->next; | |||
| ++count; | |||
| } | |||
| STBRP_ASSERT(count == context->num_nodes+2); | |||
| } | |||
| #endif | |||
| return res; | |||
| } | |||
| // [DEAR IMGUI] Added STBRP__CDECL | |||
| static int STBRP__CDECL rect_height_compare(const void *a, const void *b) | |||
| { | |||
| const stbrp_rect *p = (const stbrp_rect *) a; | |||
| const stbrp_rect *q = (const stbrp_rect *) b; | |||
| if (p->h > q->h) | |||
| return -1; | |||
| if (p->h < q->h) | |||
| return 1; | |||
| return (p->w > q->w) ? -1 : (p->w < q->w); | |||
| } | |||
| // [DEAR IMGUI] Added STBRP__CDECL | |||
| static int STBRP__CDECL rect_original_order(const void *a, const void *b) | |||
| { | |||
| const stbrp_rect *p = (const stbrp_rect *) a; | |||
| const stbrp_rect *q = (const stbrp_rect *) b; | |||
| return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed); | |||
| } | |||
| #ifdef STBRP_LARGE_RECTS | |||
| #define STBRP__MAXVAL 0xffffffff | |||
| #else | |||
| #define STBRP__MAXVAL 0xffff | |||
| #endif | |||
| STBRP_DEF int stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects) | |||
| { | |||
| int i, all_rects_packed = 1; | |||
| // we use the 'was_packed' field internally to allow sorting/unsorting | |||
| for (i=0; i < num_rects; ++i) { | |||
| rects[i].was_packed = i; | |||
| } | |||
| // sort according to heuristic | |||
| STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare); | |||
| for (i=0; i < num_rects; ++i) { | |||
| if (rects[i].w == 0 || rects[i].h == 0) { | |||
| rects[i].x = rects[i].y = 0; // empty rect needs no space | |||
| } else { | |||
| stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h); | |||
| if (fr.prev_link) { | |||
| rects[i].x = (stbrp_coord) fr.x; | |||
| rects[i].y = (stbrp_coord) fr.y; | |||
| } else { | |||
| rects[i].x = rects[i].y = STBRP__MAXVAL; | |||
| } | |||
| } | |||
| } | |||
| // unsort | |||
| STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order); | |||
| // set was_packed flags and all_rects_packed status | |||
| for (i=0; i < num_rects; ++i) { | |||
| rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL); | |||
| if (!rects[i].was_packed) | |||
| all_rects_packed = 0; | |||
| } | |||
| // return the all_rects_packed status | |||
| return all_rects_packed; | |||
| } | |||
| #endif | |||
| /* | |||
| ------------------------------------------------------------------------------ | |||
| This software is available under 2 licenses -- choose whichever you prefer. | |||
| ------------------------------------------------------------------------------ | |||
| ALTERNATIVE A - MIT License | |||
| Copyright (c) 2017 Sean Barrett | |||
| 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. | |||
| ------------------------------------------------------------------------------ | |||
| ALTERNATIVE B - Public Domain (www.unlicense.org) | |||
| This is free and unencumbered software released into the public domain. | |||
| Anyone is free to copy, modify, publish, use, compile, sell, or distribute this | |||
| software, either in source code form or as a compiled binary, for any purpose, | |||
| commercial or non-commercial, and by any means. | |||
| In jurisdictions that recognize copyright laws, the author or authors of this | |||
| software dedicate any and all copyright interest in the software to the public | |||
| domain. We make this dedication for the benefit of the public at large and to | |||
| the detriment of our heirs and successors. We intend this dedication to be an | |||
| overt act of relinquishment in perpetuity of all present and future rights to | |||
| this software under copyright law. | |||
| 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 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. | |||
| ------------------------------------------------------------------------------ | |||
| */ | |||
| @@ -0,0 +1,81 @@ | |||
| /* | |||
| * DISTRHO Cardinal Plugin | |||
| * Copyright (C) 2021 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 3 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the LICENSE file. | |||
| */ | |||
| #include "ImGuiWidget.hpp" | |||
| #define BUFFER_SIZE 128 | |||
| struct IldaeilModule : Module { | |||
| enum ParamIds { | |||
| NUM_PARAMS | |||
| }; | |||
| enum InputIds { | |||
| INPUT1, | |||
| INPUT2, | |||
| NUM_INPUTS | |||
| }; | |||
| enum OutputIds { | |||
| OUTPUT1, | |||
| OUTPUT2, | |||
| NUM_OUTPUTS | |||
| }; | |||
| enum LightIds { | |||
| NUM_LIGHTS | |||
| }; | |||
| IldaeilModule() { | |||
| config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | |||
| } | |||
| void process(const ProcessArgs&) override { | |||
| } | |||
| }; | |||
| struct IldaeilWidget : ImGuiWidget { | |||
| IldaeilModule* const module; | |||
| IldaeilWidget(IldaeilModule* const m, const float w, const float h) | |||
| : ImGuiWidget(w, h), | |||
| module(m) {} | |||
| }; | |||
| struct IldaeilModuleWidget : ModuleWidget { | |||
| IldaeilWidget* ildaeilWidget = nullptr; | |||
| IldaeilModuleWidget(IldaeilModule* const module) | |||
| { | |||
| setModule(module); | |||
| setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/glBars.svg"))); | |||
| ildaeilWidget = new IldaeilWidget(module, box.size.x - 2 * RACK_GRID_WIDTH, box.size.y); | |||
| ildaeilWidget->box.pos = Vec(2 * RACK_GRID_WIDTH, 0); | |||
| ildaeilWidget->box.size = Vec(box.size.x - 2 * RACK_GRID_WIDTH, box.size.y); | |||
| addChild(ildaeilWidget); | |||
| addChild(createWidget<ScrewSilver>(Vec(0, 0))); | |||
| addChild(createWidget<ScrewSilver>(Vec(0, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); | |||
| addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0))); | |||
| addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); | |||
| addInput(createInput<PJ301MPort>(Vec(3, 54), module, IldaeilModule::INPUT1)); | |||
| addInput(createInput<PJ301MPort>(Vec(3, 54 + 30), module, IldaeilModule::INPUT2)); | |||
| addInput(createOutput<PJ301MPort>(Vec(3, 54 + 60), module, IldaeilModule::OUTPUT1)); | |||
| addInput(createOutput<PJ301MPort>(Vec(3, 54 + 90), module, IldaeilModule::OUTPUT2)); | |||
| } | |||
| }; | |||
| Model* modelIldaeil = createModel<IldaeilModule, IldaeilModuleWidget>("Ildaeil"); | |||
| @@ -0,0 +1,165 @@ | |||
| /* | |||
| * Dear ImGui for DPF, converted to VCV | |||
| * Copyright (C) 2021 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2021 Jean Pierre Cimalando <jp-dev@inbox.ru> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| * permission notice appear in all copies. | |||
| * | |||
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD | |||
| * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN | |||
| * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |||
| * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | |||
| * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | |||
| * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
| */ | |||
| #include "ImGuiWidget.hpp" | |||
| #ifndef DGL_NO_SHARED_RESOURCES | |||
| # include "../../../dpf/dgl/src/Resources.hpp" | |||
| #endif | |||
| #include "DearImGui/imgui.h" | |||
| #include "DearImGui/imgui_impl_opengl2.h" | |||
| struct ImGuiWidget::PrivateData { | |||
| ImGuiContext* context; | |||
| PrivateData(const float width, const float height, const double scaleFactor = 1.0) | |||
| { | |||
| IMGUI_CHECKVERSION(); | |||
| context = ImGui::CreateContext(); | |||
| ImGui::SetCurrentContext(context); | |||
| ImGuiIO& io(ImGui::GetIO()); | |||
| io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; | |||
| io.DisplaySize.x = width; | |||
| io.DisplaySize.y = height; | |||
| // not needed, we handle this ourselves | |||
| // io.DisplayFramebufferScale = ImVec2(scaleFactor, scaleFactor); | |||
| io.IniFilename = nullptr; | |||
| ImGuiStyle& style(ImGui::GetStyle()); | |||
| style.ScaleAllSizes(scaleFactor); | |||
| #ifndef DGL_NO_SHARED_RESOURCES | |||
| using namespace dpf_resources; | |||
| ImFontConfig fc; | |||
| fc.FontDataOwnedByAtlas = false; | |||
| fc.OversampleH = 1; | |||
| fc.OversampleV = 1; | |||
| fc.PixelSnapH = true; | |||
| io.Fonts->AddFontFromMemoryTTF((void*)dejavusans_ttf, dejavusans_ttf_size, 13.0f * scaleFactor, &fc); | |||
| io.Fonts->Build(); | |||
| #endif | |||
| io.KeyMap[ImGuiKey_Tab] = '\t'; | |||
| /* | |||
| io.KeyMap[ImGuiKey_LeftArrow] = 0xff + kKeyLeft - kKeyF1; | |||
| io.KeyMap[ImGuiKey_RightArrow] = 0xff + kKeyRight - kKeyF1; | |||
| io.KeyMap[ImGuiKey_UpArrow] = 0xff + kKeyUp - kKeyF1; | |||
| io.KeyMap[ImGuiKey_DownArrow] = 0xff + kKeyDown - kKeyF1; | |||
| io.KeyMap[ImGuiKey_PageUp] = 0xff + kKeyPageUp - kKeyF1; | |||
| io.KeyMap[ImGuiKey_PageDown] = 0xff + kKeyPageDown - kKeyF1; | |||
| io.KeyMap[ImGuiKey_Home] = 0xff + kKeyHome - kKeyF1; | |||
| io.KeyMap[ImGuiKey_End] = 0xff + kKeyEnd - kKeyF1; | |||
| io.KeyMap[ImGuiKey_Insert] = 0xff + kKeyInsert - kKeyF1; | |||
| io.KeyMap[ImGuiKey_Delete] = kKeyDelete; | |||
| io.KeyMap[ImGuiKey_Backspace] = kKeyBackspace; | |||
| */ | |||
| io.KeyMap[ImGuiKey_Space] = ' '; | |||
| io.KeyMap[ImGuiKey_Enter] = '\r'; | |||
| /* | |||
| io.KeyMap[ImGuiKey_Escape] = kKeyEscape; | |||
| // io.KeyMap[ImGuiKey_KeyPadEnter] = '\n'; | |||
| */ | |||
| io.KeyMap[ImGuiKey_A] = 'a'; | |||
| io.KeyMap[ImGuiKey_C] = 'c'; | |||
| io.KeyMap[ImGuiKey_V] = 'v'; | |||
| io.KeyMap[ImGuiKey_X] = 'x'; | |||
| io.KeyMap[ImGuiKey_Y] = 'y'; | |||
| io.KeyMap[ImGuiKey_Z] = 'z'; | |||
| ImGui_ImplOpenGL2_Init(); | |||
| } | |||
| ~PrivateData() | |||
| { | |||
| ImGui::SetCurrentContext(context); | |||
| ImGui_ImplOpenGL2_Shutdown(); | |||
| ImGui::DestroyContext(context); | |||
| } | |||
| }; | |||
| ImGuiWidget::ImGuiWidget(const float width, const float height) | |||
| : imData(new PrivateData(width, height)) | |||
| { | |||
| } | |||
| ImGuiWidget::~ImGuiWidget() | |||
| { | |||
| delete imData; | |||
| } | |||
| void ImGuiWidget::drawFramebuffer() | |||
| { | |||
| // const math::Vec fbSize = getFramebufferSize(); | |||
| // glMatrixMode(GL_PROJECTION); | |||
| // glLoadIdentity(); | |||
| // glOrtho(0.0, fbSize.x, fbSize.y, 0.0, 0.0, 1.0); | |||
| // glViewport(0.0, 0.0, fbSize.x, fbSize.y); | |||
| // glMatrixMode(GL_MODELVIEW); | |||
| // glLoadIdentity(); | |||
| // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); | |||
| ImGui::SetCurrentContext(imData->context); | |||
| ImGui_ImplOpenGL2_NewFrame(); | |||
| ImGui::NewFrame(); | |||
| ImGui::SetNextWindowPos(ImVec2(0, 0)); | |||
| ImGui::SetNextWindowSize(ImVec2(box.size.x, box.size.y)); | |||
| ImGui::ShowDemoWindow(); | |||
| ImGui::Render(); | |||
| if (ImDrawData* const data = ImGui::GetDrawData()) | |||
| { | |||
| // data->DisplayPos.x = -imData->getDisplayX(); | |||
| // data->DisplayPos.y = imData->getDisplayY(); | |||
| data->DisplayPos.x = 0; | |||
| data->DisplayPos.y = 0; | |||
| ImGui_ImplOpenGL2_RenderDrawData(data); | |||
| } | |||
| } | |||
| void ImGuiWidget::onHover(const HoverEvent& e) | |||
| { | |||
| ImGui::SetCurrentContext(imData->context); | |||
| ImGuiIO& io(ImGui::GetIO()); | |||
| io.MousePos.x = e.pos.x; | |||
| io.MousePos.y = e.pos.y; | |||
| } | |||
| void ImGuiWidget::onButton(const ButtonEvent& e) | |||
| { | |||
| ImGui::SetCurrentContext(imData->context); | |||
| ImGuiIO& io(ImGui::GetIO()); | |||
| switch (e.button) | |||
| { | |||
| case GLFW_MOUSE_BUTTON_LEFT: | |||
| io.MouseDown[0] = e.action; | |||
| break; | |||
| case GLFW_MOUSE_BUTTON_MIDDLE: | |||
| io.MouseDown[1] = e.action; | |||
| break; | |||
| case GLFW_MOUSE_BUTTON_RIGHT: | |||
| io.MouseDown[2] = e.action; | |||
| break; | |||
| } | |||
| } | |||
| @@ -0,0 +1,32 @@ | |||
| /* | |||
| * Dear ImGui for DPF, converted to VCV | |||
| * Copyright (C) 2021 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2021 Jean Pierre Cimalando <jp-dev@inbox.ru> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| * permission notice appear in all copies. | |||
| * | |||
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD | |||
| * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN | |||
| * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |||
| * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | |||
| * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | |||
| * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
| */ | |||
| #pragma once | |||
| #include "plugin.hpp" | |||
| struct ImGuiWidget : OpenGlWidget { | |||
| struct PrivateData; | |||
| PrivateData* const imData; | |||
| ImGuiWidget(float width, float height); | |||
| ~ImGuiWidget() override; | |||
| void drawFramebuffer() override; | |||
| void onHover(const HoverEvent& e) override; | |||
| void onButton(const ButtonEvent& e) override; | |||
| }; | |||
| @@ -24,5 +24,6 @@ using namespace rack; | |||
| extern Plugin* pluginInstance; | |||
| extern Model* modelGlBars; | |||
| extern Model* modelIldaeil; | |||
| extern Model* modelHostParameters; | |||
| extern Model* modelHostTime; | |||
| @@ -178,6 +178,7 @@ PLUGIN_FILES = plugins.cpp | |||
| # Cardinal (built-in) | |||
| PLUGIN_FILES += $(wildcard Cardinal/src/*.cpp) | |||
| PLUGIN_FILES += $(wildcard Cardinal/src/*/*.cpp) | |||
| ifneq ($(NOPLUGINS),true) | |||
| # -------------------------------------------------------------- | |||
| @@ -406,6 +406,7 @@ static void initStatic__Cardinal() | |||
| if (spl.ok()) | |||
| { | |||
| p->addModel(modelGlBars); | |||
| p->addModel(modelIldaeil); | |||
| p->addModel(modelHostParameters); | |||
| p->addModel(modelHostTime); | |||
| } | |||