Skip to content

Instantly share code, notes, and snippets.

@Gnimuc
Last active April 16, 2022 03:46
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Gnimuc/5a1e4942784cfc3558e2ee50b7bee84d to your computer and use it in GitHub Desktop.
Save Gnimuc/5a1e4942784cfc3558e2ee50b7bee84d to your computer and use it in GitHub Desktop.
using CImGui
using CImGui.GLFWBackend
using CImGui.OpenGLBackend
using CImGui.GLFWBackend.GLFW
using CImGui.OpenGLBackend.ModernGL
using AbstractPlotting
using GLMakie
import GLMakie: make_context_current, render_frame, to_native, Screen

# add ImGui rendering pass to GLMakie's rendering loop
function imgui_renderloop(screen::Screen; framerate = 1/30, prerender = () -> nothing)
    try
        while isopen(screen)
            # Somehow errors get sometimes ignored, so we at least print them here
            try
                t = time()
                GLFW.PollEvents() # GLFW poll

                # create new cimgui frame
                ImGui_ImplOpenGL3_NewFrame()
                ImGui_ImplGlfw_NewFrame(to_native(screen))
                CImGui.NewFrame()
                # create UIs
                CImGui.ShowDemoWindow(Ref(true))
                # produce GUI "meshes"
                CImGui.Render()

                prerender()
                make_context_current(screen)
                render_frame(screen)
                # render imgui over plots
                ImGui_ImplOpenGL3_RenderDrawData(CImGui.GetDrawData())
                make_context_current(screen)
                GLFW.SwapBuffers(to_native(screen))
                diff = framerate - (time() - t)
                if diff > 0
                    sleep(diff)
                else # if we don't sleep, we need to yield explicitely
                    yield()
                end
            catch e
                @error "Error in renderloop!" exception=e
                rethrow(e)
            end
        end
    catch e
        @error "Error in renderloop!" exception=e
        rethrow(e)
    finally
        destroy!(screen)
    end
    return
end

# init CImGui
ctx = CImGui.CreateContext()
CImGui.StyleColorsDark()
ImGui_ImplGlfw_InitForOpenGL(GLMakie.to_native(GLMakie.global_gl_screen()), true)
ImGui_ImplOpenGL3_Init(150)

# replace renderloop
GLMakie.opengl_renderloop[] = imgui_renderloop

x = rand(10);
y = rand(10);
colors = rand(10);
scene = scatter(x, y, color = colors)
@Gnimuc
Copy link
Author

Gnimuc commented Aug 12, 2019

Screen Shot 2019-08-12 at 23 54 38

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment