{"id":16733286,"url":"https://github.com/krasjet/imgui_juce","last_synced_at":"2025-03-17T01:31:48.225Z","repository":{"id":62621657,"uuid":"552227155","full_name":"Krasjet/imgui_juce","owner":"Krasjet","description":"JUCE backend for Dear ImGui","archived":false,"fork":false,"pushed_at":"2024-06-06T05:45:41.000Z","size":361,"stargazers_count":41,"open_issues_count":0,"forks_count":4,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-16T07:11:22.463Z","etag":null,"topics":["audio","cpp","gui","imgui","juce","juce-framework","opengl","vst","vst3"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Krasjet.png","metadata":{"files":{"readme":"README","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-10-16T05:13:36.000Z","updated_at":"2025-03-07T13:58:10.000Z","dependencies_parsed_at":"2024-01-06T13:08:30.125Z","dependency_job_id":"15e49775-2423-44a1-9057-ae393f0ed9bf","html_url":"https://github.com/Krasjet/imgui_juce","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Krasjet%2Fimgui_juce","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Krasjet%2Fimgui_juce/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Krasjet%2Fimgui_juce/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Krasjet%2Fimgui_juce/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Krasjet","download_url":"https://codeload.github.com/Krasjet/imgui_juce/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243958330,"owners_count":20374842,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audio","cpp","gui","imgui","juce","juce-framework","opengl","vst","vst3"],"created_at":"2024-10-12T23:49:18.877Z","updated_at":"2025-03-17T01:31:47.507Z","avatar_url":"https://github.com/Krasjet.png","language":"C++","readme":"imgui_juce\n==========\n\nJUCE [1] backend for Dear ImGui [2].\n\nI don't recommend using JUCE for prototyping DSP code, but\nif you have no better options, using ImGui with this library\nshould make your life a lot easier.\n\nPros:\n  + No more listener/attachment/callback bullshit (you won't\n    believe how many layers of callbacks are used just to\n    set a single parameter using APVTS's SliderAttachment).\n\n    You can write declarative code for GUI now:\n\n        ImGui::Text(\"Hello, world %d\", 123);\n        if (ImGui::Button(\"Save\"))\n          DoStuff();\n\n  + No more GUI layout positioning bullshit. Spend your time\n    on DSP code.\n\n  + It's much easier now to integrate custom non-float\n    parameters into your plugin.\n\n  + There are a ton of useful extensions for ImGui you can\n    use for easier debugging. See imnodes [3], implot [4],\n    and the list on ImGui wiki [5].\n\n  + You can mix JUCE GUI components and ImGui. ImGui only\n    needs a Component for mouse/keyboard input and a\n    OpenGLContext for rendering. You can, for example, only\n    enable the ImGui component for debugging and disable it\n    in the final release.\n\nCons:\n  - GUI is recomputed each frame at 60 FPS, probably less\n    efficient than JUCE, but at least it's using OpenGL.\n\n  - JUCE's keypress callbacks are extremely inefficient for\n    ImGui, though you can disable it by setting\n\n        setWantsKeyboardFocus(false);\n\n  - Component and layout can be less customizable than JUCE.\n    You probably only want to use it for prototyping.\n\n  - Slider skew not supported by default. You need to write\n    your own component for that (contributions welcome).\n    ImGui do have logarithmic slider built-in though.\n\n  - You need a patched version of ImGui for use in audio\n    plugins (see Note below).\n\nUsage\n-----\n\nThe backend exposes three functions\n\n    #include \u003cimgui_impl_juce/imgui_impl_juce.h\u003e\n\n    void ImGui_ImplJuce_Init(juce::Component\u0026, juce::OpenGLContext\u0026);\n    void ImGui_ImplJuce_Shutdown();\n    void ImGui_ImplJuce_NewFrame();\n\nYou need to create a juce::OpenGLRenderer and call the three\nfunctions in\n\n    void newOpenGLContextCreated();\n    void openGLContextClosing();\n    void renderOpenGL();\n\nrespectively. See\n\n    ./examples/mwe/src/ImGuiComponent.h\n\nfor a complete minimal working example.\n\nIf you need an audio plugin example, see\n\n    ./examples/sine/\n\nCMake Usage\n-----------\n\nIf you are using CMake, call `add_subdirectory` on the\ncurrent directory after JUCE directory is added. Then link\nyour application target to `imgui_imple_juce`. For example,\n\n    target_link_libraries(app\n      # other stuff libs\n      PRIVATE\n        imgui_impl_juce)\n\nSee\n\n    ./examples/mwe/CMakeLists.txt\n\nfor a complete example.\n\nNote\n----\n\nBy default ImGui only support a single instance running\nbecause it uses a global state\n\n    ImGuiContext* GImGui = NULL;\n\nThis is probably fine if you are writing a GUI application,\nbut if you are writing an audio plugin, the plugin will\ncrash if you add multiple instances of the plugin in DAW and\nopen two GUIs at the same time.\n\nYou need to patch ImGui and make the global state thread local\n\n    thread_local ImGuiContext* GImGui = NULL;\n\nin order to support multiple instances of ImGui running at\nthe same time on different threads. See\n\n    ./examples/sine/patches/imgui/multi_instance.patch\n\nfor details.\n\nYou need a similar patch if you want to use imnodes or\nImPlot in your plugin. For a ImPlot example, see\n\n    ./examples/scope/patches/implot/multi_instance.patch\n\nLicense\n-------\n\nThe imgui_juce library is licensed under the GNU Lesser\nGeneral Public License v3.0 (LGPLv3).\n\nExamples are placed under public domain.\n\nDonate\n------\n\nIf this library saves valuable development time for you,\nconsider donate to support this project:\n\n    https://ko-fi.com/krjst\n\n--------------------------\n\n[1]: https://github.com/juce-framework/JUCE\n[2]: https://github.com/ocornut/imgui\n[3]: https://github.com/Nelarius/imnodes\n[4]: https://github.com/epezent/implot\n[5]: https://github.com/ocornut/imgui/wiki/Useful-Extensions\n","funding_links":["https://ko-fi.com/krjst"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrasjet%2Fimgui_juce","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkrasjet%2Fimgui_juce","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrasjet%2Fimgui_juce/lists"}