/// this is a port of cimgui/imgui/examples/example_glfw_opengl3/main.cpp
const c = @import("c.zig");
const std = @import("std");
const panic = std.debug.panic;
const debug_gl = @import("debug_gl.zig");
const glfw_impl = @import("glfw_impl.zig");
const gl3_impl = @import("gl3_impl.zig");
fn errorCallback(err: c_int, description: [*c]const u8) callconv(.C) void {
_ = err;
panic("Error: {s}\n", .{description});
}
pub usingnamespace c;
pub const Window = struct {
window: *c.GLFWwindow,
context: *c.ImGuiContext,
pub fn init() Window {
_ = c.glfwSetErrorCallback(errorCallback);
if (c.glfwInit() == c.GL_FALSE) {
panic("GLFW init failure\n", .{});
}
errdefer c.glfwTerminate();
c.glfwWindowHint(c.GLFW_CONTEXT_VERSION_MAJOR, 3);
c.glfwWindowHint(c.GLFW_CONTEXT_VERSION_MINOR, 2);
c.glfwWindowHint(c.GLFW_OPENGL_FORWARD_COMPAT, c.GL_TRUE);
c.glfwWindowHint(c.GLFW_OPENGL_DEBUG_CONTEXT, debug_gl.is_on);
c.glfwWindowHint(c.GLFW_OPENGL_PROFILE, c.GLFW_OPENGL_CORE_PROFILE);
// c.glfwWindowHint(c.GLFW_DEPTH_BITS, 0);
// c.glfwWindowHint(c.GLFW_STENCIL_BITS, 8);
c.glfwWindowHint(c.GLFW_RESIZABLE, c.GL_TRUE);
const window_width = 640;
const window_height = 480;
const window = c.glfwCreateWindow(window_width, window_height, "ImGUI Test", null, null) orelse {
panic("unable to create window\n", .{});
};
errdefer c.glfwDestroyWindow(window);
c.glfwMakeContextCurrent(window);
c.glfwSwapInterval(1);
const context = c.igCreateContext(null) orelse panic("ImGui init failure\n", .{});
errdefer c.igDestroyContext(context);
const io = c.igGetIO();
io.*.ConfigFlags |= c.ImGuiConfigFlags_NavEnableKeyboard;
io.*.ConfigFlags |= c.ImGuiConfigFlags_DockingEnable;
// io.*.ConfigFlags |= c.ImGuiConfigFlags_ViewportsEnable;
const style = c.igGetStyle();
c.igStyleColorsDark(style);
if (io.*.ConfigFlags & c.ImGuiConfigFlags_ViewportsEnable != 0) {
style.*.WindowRounding = 0.0;
style.*.Colors[c.ImGuiCol_WindowBg].w = 1.0;
}
glfw_impl.Init(window, true, glfw_impl.ClientApi.OpenGL);
errdefer glfw_impl.Shutdown();
gl3_impl.Init();
errdefer gl3_impl.Shutdown();
return .{
.window = window,
.context = context,
};
}
pub fn deinit(self: *const Window) void {
gl3_impl.Shutdown();
glfw_impl.Shutdown();
c.igDestroyContext(self.context);
c.glfwDestroyWindow(self.window);
c.glfwTerminate();
}
pub fn shouldClose(self: *const Window) bool {
return c.glfwWindowShouldClose(self.window) == c.GL_TRUE;
}
pub fn beginFrame(self: *const Window) !void {
_ = self;
c.glfwPollEvents();
try gl3_impl.NewFrame();
glfw_impl.NewFrame();
c.igNewFrame();
}
pub fn endFrame(self: *const Window) void {
c.igRender();
var w: c_int = undefined;
var h: c_int = undefined;
c.glfwGetFramebufferSize(self.window, &w, &h);
c.glViewport(0, 0, w, h);
c.glClearColor(0.0, 0.0, 0.0, 0.0);
c.glClear(c.GL_COLOR_BUFFER_BIT);
gl3_impl.RenderDrawData(c.igGetDrawData());
c.glfwSwapBuffers(self.window);
}
};