Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
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
ImGui_ImplOpenGL3_Shutdown()
ImGui_ImplGlfw_Shutdown()
CImGui.DestroyContext(ctx)
GLMakie.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)
x = rand(10);
y = rand(10);
colors = rand(10);
scene = scatter(x, y, color = colors)
# replace renderloop
#GLMakie.opengl_renderloop[] = imgui_renderloop
# new version
screen = AbstractPlotting.backend_display(GLMakie.GLBackend(), scene)
set_window_config!(renderloop=imgui_renderloop)
screen
@Gnimuc
Copy link

Gnimuc commented Sep 5, 2020

Better to free resources here:

finally
    ImGui_ImplOpenGL3_Shutdown()
    ImGui_ImplGlfw_Shutdown()
    CImGui.DestroyContext(ctx)
    destroy!(screen)
end

@SteffenPL
Copy link
Author

SteffenPL commented Sep 5, 2020

I updated the code snippet.

@nicknikolov
Copy link

nicknikolov commented Oct 24, 2020

What's a good way to pass my custom prerender in the draw loop? E.g. something like
https://github.com/Gnimuc/CImGui.jl/blob/master/examples/Renderer.jl

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