Skip to content

Instantly share code, notes, and snippets.

@Gnimuc
Created April 1, 2019 02:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Gnimuc/b9308bb8ed0a81b4fe1e76d706837f3d to your computer and use it in GitHub Desktop.
Save Gnimuc/b9308bb8ed0a81b4fe1e76d706837f3d to your computer and use it in GitHub Desktop.
using CImGui
using CImGui.LibCImGui
using CImGui.GLFWBackend
using CImGui.OpenGLBackend
using GLFW, ModernGL
using CSyntax
using Printf
@static if Sys.isapple()
# OpenGL 3.2 + GLSL 150
const glsl_version = "#version 150"
GLFW.WindowHint(GLFW.CONTEXT_VERSION_MAJOR, 3)
GLFW.WindowHint(GLFW.CONTEXT_VERSION_MINOR, 2)
GLFW.WindowHint(GLFW.OPENGL_PROFILE, GLFW.OPENGL_CORE_PROFILE) # 3.2+ only
GLFW.WindowHint(GLFW.OPENGL_FORWARD_COMPAT, GL_TRUE) # required on Mac
else
# OpenGL 3.0 + GLSL 130
const glsl_version = "#version 130"
GLFW.WindowHint(GLFW.CONTEXT_VERSION_MAJOR, 3)
GLFW.WindowHint(GLFW.CONTEXT_VERSION_MINOR, 0)
# GLFW.WindowHint(GLFW.OPENGL_PROFILE, GLFW.OPENGL_CORE_PROFILE) # 3.2+ only
# GLFW.WindowHint(GLFW.OPENGL_FORWARD_COMPAT, GL_TRUE) # 3.0+ only
end
# setup GLFW error callback
error_callback(err::GLFW.GLFWError) = @error "GLFW ERROR: code $(err.code) msg: $(err.description)"
GLFW.SetErrorCallback(error_callback)
# first window and its context
window1 = GLFW.CreateWindow(1280, 720, "Demo")
@assert window1 != C_NULL
GLFW.MakeContextCurrent(window1)
ctx1 = CImGui.CreateContext()
CImGui.StyleColorsDark()
ImGui_ImplGlfw_InitForOpenGL(window1, true)
ImGui_ImplOpenGL3_Init()
# second window and its context
window2 = GLFW.CreateWindow(800, 600, "Demo2")
@assert window2 != C_NULL
GLFW.MakeContextCurrent(window2)
ctx2 = CImGui.CreateContext()
CImGui.SetCurrentContext(ctx2) # swap context
CImGui.StyleColorsLight()
ImGui_ImplGlfw_InitForOpenGL(window2, true)
ImGui_ImplOpenGL3_Init()
show_demo_window = true
show_another_window = false
counter = 0
f = Cfloat(0.0)
clear_color = Cfloat[0.45, 0.55, 0.60, 1.00]
while !GLFW.WindowShouldClose(window1) || !GLFW.WindowShouldClose(window2)
# oh my global scope
global show_demo_window; global show_another_window
global counter; global f; global clear_color;
GLFW.MakeContextCurrent(window1)
CImGui.SetCurrentContext(ctx1)
GLFW.PollEvents()
# append ctx1's frame
ImGui_ImplOpenGL3_NewFrame()
ImGui_ImplGlfw_NewFrame(window1)
CImGui.NewFrame()
# show the big demo window
show_demo_window && @c igShowDemoWindow(&show_demo_window)
# render window1
CImGui.Render()
GLFW.MakeContextCurrent(window1)
display_w, display_h = GLFW.GetFramebufferSize(window1)
glViewport(0, 0, display_w, display_h)
glClearColor(clear_color...)
glClear(GL_COLOR_BUFFER_BIT)
ImGui_ImplOpenGL3_RenderDrawData(igGetDrawData())
GLFW.SwapBuffers(window1)
# window 2
GLFW.MakeContextCurrent(window2)
CImGui.SetCurrentContext(ctx2)
GLFW.PollEvents()
# append ctx2's frame
ImGui_ImplOpenGL3_NewFrame()
ImGui_ImplGlfw_NewFrame(window2)
CImGui.NewFrame()
# show a simple window that we create ourselves.
# we use a Begin/End pair to created a named window.
CImGui.Begin("Hello, world!") # create a window called "Hello, world!" and append into it.
CImGui.Text("This is some useful text.") # display some text
@c CImGui.Checkbox("Demo Window", &show_demo_window) # edit bools storing our window open/close state
@c CImGui.Checkbox("Another Window", &show_another_window)
@c CImGui.SliderFloat("float", &f, 0, 1) # edit 1 float using a slider from 0 to 1
CImGui.ColorEdit3("clear color", clear_color) # edit 3 floats representing a color
CImGui.Button("Button") && (counter += 1)
CImGui.SameLine()
CImGui.Text("counter = $counter")
CImGui.Text(@sprintf("Application average %.3f ms/frame (%.1f FPS)", 1000 / ImGuiIO_Get_Framerate(CImGui.GetIO()), ImGuiIO_Get_Framerate(CImGui.GetIO())))
CImGui.End()
CImGui.Render()
GLFW.MakeContextCurrent(window2)
display_w, display_h = GLFW.GetFramebufferSize(window2)
glViewport(0, 0, display_w, display_h)
glClearColor(clear_color...)
glClear(GL_COLOR_BUFFER_BIT)
ImGui_ImplOpenGL3_RenderDrawData(igGetDrawData())
GLFW.MakeContextCurrent(window2)
GLFW.SwapBuffers(window2)
end
# cleanup
ImGui_ImplOpenGL3_Shutdown()
ImGui_ImplGlfw_Shutdown()
CImGui.DestroyContext(ctx1)
CImGui.DestroyContext(ctx2)
GLFW.DestroyWindow(window1)
GLFW.DestroyWindow(window2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment