diff options
| -rw-r--r-- | build.zig | 37 | ||||
| -rw-r--r-- | imgui.zig | 1 | ||||
| -rw-r--r-- | src/debug_gl.zig | 4 | ||||
| -rw-r--r-- | src/demo.zig | 25 | ||||
| -rw-r--r-- | src/gl3_impl.zig | 10 | ||||
| -rw-r--r-- | src/glfw_impl.zig | 6 | ||||
| -rw-r--r-- | src/main.zig | 145 |
7 files changed, 136 insertions, 92 deletions
@@ -2,22 +2,29 @@ const Builder = @import("std").build.Builder; const builtin = @import("builtin"); pub fn build(b: *Builder) void { - const target = b.standardTargetOptions(.{}); - const mode = b.standardReleaseOptions(); - const windows = b.option(bool, "windows", "create windows build") orelse false; + const mode = b.standardReleaseOptions(); - var exe = b.addExecutable("test", "src/main.zig"); - exe.setBuildMode(mode); + const lib = b.addStaticLibrary("imgui", "src/main.zig"); + lib.setBuildMode(mode); + lib.linkSystemLibrary("c"); + lib.linkSystemLibrary("glfw"); + lib.linkSystemLibrary("epoxy"); + lib.addIncludeDir("cimgui"); + lib.linkSystemLibraryName("cimgui/cimgui.so"); + lib.install(); - exe.linkSystemLibrary("c"); - exe.linkSystemLibrary("glfw"); - exe.linkSystemLibrary("epoxy"); - exe.addIncludeDir("cimgui"); - exe.linkSystemLibraryName("cimgui/cimgui.so"); - exe.install(); + var exe = b.addExecutable("demo", "src/demo.zig"); + exe.setBuildMode(mode); - const play = b.step("play", "Play the game"); - const run = exe.run(); - run.step.dependOn(b.getInstallStep()); - play.dependOn(&run.step); + exe.linkSystemLibrary("c"); + exe.linkSystemLibrary("glfw"); + exe.linkSystemLibrary("epoxy"); + exe.addIncludeDir("cimgui"); + exe.linkSystemLibraryName("cimgui/cimgui.so"); + exe.install(); + + const demo = b.step("demo", "Run the demo"); + const run = exe.run(); + run.step.dependOn(b.getInstallStep()); + demo.dependOn(&run.step); } diff --git a/imgui.zig b/imgui.zig new file mode 100644 index 0000000..6d80481 --- /dev/null +++ b/imgui.zig @@ -0,0 +1 @@ +pub usingnamespace @import("./src/main.zig"); diff --git a/src/debug_gl.zig b/src/debug_gl.zig index debf51d..1567e7c 100644 --- a/src/debug_gl.zig +++ b/src/debug_gl.zig @@ -4,10 +4,10 @@ const os = std.os; const panic = std.debug.panic; const builtin = @import("builtin"); -pub const is_on = if (builtin.mode == builtin.Mode.ReleaseFast) c.GL_FALSE else c.GL_TRUE; +pub const is_on = if (builtin.mode == .ReleaseFast) c.GL_FALSE else c.GL_TRUE; pub fn assertNoError() void { - if (builtin.mode != builtin.Mode.ReleaseFast) { + if (builtin.mode != .ReleaseFast) { const err = c.glGetError(); if (err != c.GL_NO_ERROR) { panic("GL error: {}\n", err); diff --git a/src/demo.zig b/src/demo.zig new file mode 100644 index 0000000..cf27a2c --- /dev/null +++ b/src/demo.zig @@ -0,0 +1,25 @@ +const ig = @import("main.zig"); + +pub fn main() !void { + const window = ig.Window.init(); + + // const start_time = c.glfwGetTime(); + // var prev_time = start_time; + var show_demo = false; + + while (!window.shouldClose()) { + try window.beginFrame(); + + // main part + if (show_demo) + ig.igShowDemoWindow(null); + + if (ig.igBegin("yolozwek", null, 0)) { + ig.igText("Hello World :)"); + _ = ig.igCheckbox("Demo window", &show_demo); + ig.igEnd(); + } + + window.endFrame(); + } +} diff --git a/src/gl3_impl.zig b/src/gl3_impl.zig index 27212ff..8f84d8b 100644 --- a/src/gl3_impl.zig +++ b/src/gl3_impl.zig @@ -155,11 +155,11 @@ fn CheckThing(comptime thingType: CheckableThing, handle: c.GLuint, desc: []cons var buf: [1024]u8 = undefined; var length: c.GLsizei = undefined; getInfoLogFunc(handle, buf.len, &length, &buf[0]); - debug.warn("{}\n", .{buf[0..@intCast(usize, length)]}); + debug.warn("{s}\n", .{buf[0..@intCast(usize, length)]}); } if (@intCast(c.GLboolean, status) == c.GL_FALSE) { - debug.warn("ERROR: CreateDeviceObjects: failed to compile/link {}! (with GLSL '{}')\n", .{ desc, g_GlslVersionString }); + debug.warn("ERROR: CreateDeviceObjects: failed to compile/link {s}! (with GLSL '{s}')\n", .{ desc, g_GlslVersionString }); return error.ShaderLinkError; } } @@ -443,7 +443,7 @@ fn SetupRenderState(draw_data: *c.ImDrawData, fb_width: i32, fb_height: i32, ver c.glEnableVertexAttribArray(@intCast(c.GLuint, g_AttribLocationVtxPos)); c.glEnableVertexAttribArray(@intCast(c.GLuint, g_AttribLocationVtxUV)); c.glEnableVertexAttribArray(@intCast(c.GLuint, g_AttribLocationVtxColor)); - c.glVertexAttribPointer(@intCast(c.GLuint, g_AttribLocationVtxPos), 2, c.GL_FLOAT, c.GL_FALSE, @sizeOf(c.ImDrawVert), @intToPtr(?*c.GLvoid, @byteOffsetOf(c.ImDrawVert, "pos"))); - c.glVertexAttribPointer(@intCast(c.GLuint, g_AttribLocationVtxUV), 2, c.GL_FLOAT, c.GL_FALSE, @sizeOf(c.ImDrawVert), @intToPtr(?*c.GLvoid, @byteOffsetOf(c.ImDrawVert, "uv"))); - c.glVertexAttribPointer(@intCast(c.GLuint, g_AttribLocationVtxColor), 4, c.GL_UNSIGNED_BYTE, c.GL_TRUE, @sizeOf(c.ImDrawVert), @intToPtr(?*c.GLvoid, @byteOffsetOf(c.ImDrawVert, "col"))); + c.glVertexAttribPointer(@intCast(c.GLuint, g_AttribLocationVtxPos), 2, c.GL_FLOAT, c.GL_FALSE, @sizeOf(c.ImDrawVert), @intToPtr(?*c.GLvoid, @offsetOf(c.ImDrawVert, "pos"))); + c.glVertexAttribPointer(@intCast(c.GLuint, g_AttribLocationVtxUV), 2, c.GL_FLOAT, c.GL_FALSE, @sizeOf(c.ImDrawVert), @intToPtr(?*c.GLvoid, @offsetOf(c.ImDrawVert, "uv"))); + c.glVertexAttribPointer(@intCast(c.GLuint, g_AttribLocationVtxColor), 4, c.GL_UNSIGNED_BYTE, c.GL_TRUE, @sizeOf(c.ImDrawVert), @intToPtr(?*c.GLvoid, @offsetOf(c.ImDrawVert, "col"))); } diff --git a/src/glfw_impl.zig b/src/glfw_impl.zig index 7d28e08..439c749 100644 --- a/src/glfw_impl.zig +++ b/src/glfw_impl.zig @@ -35,7 +35,7 @@ pub fn Init(window: *c.GLFWwindow, install_callbacks: bool, client_api: ClientAp io.*.BackendFlags |= c.ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used) if (false) io.*.BackendFlags |= c.ImGuiBackendFlags_PlatformHasViewports; // We can create multi-viewports on the Platform side (optional) if (false and @hasField(c, "GLFW_HAS_GLFW_HOVERED") and builtin.os == builtin.Os.windows) { - io.*.BackendFlags |= ImGuiBackendFlags_HasMouseHoveredViewport; // We can set io.MouseHoveredViewport correctly (optional, not easy) + io.*.BackendFlags |= c.ImGuiBackendFlags_HasMouseHoveredViewport; // We can set io.MouseHoveredViewport correctly (optional, not easy) } io.*.BackendPlatformName = "imgui_impl_glfw.zig"; @@ -166,8 +166,8 @@ fn UpdateMonitors() void { var w: c_int = undefined; var h: c_int = undefined; c.glfwGetMonitorWorkarea(glfw_monitor, &x, &y, &w, &h); - monitor.*.WorkPos = ImVec2{ .x = @intToFloat(f32, x), .y = @intToFloat(f32, y) }; - monitor.*.WorkSize = ImVec2{ .x = @intToFloat(f32, w), .y = @intToFloat(f32, h) }; + monitor.*.WorkPos = c.ImVec2{ .x = @intToFloat(f32, x), .y = @intToFloat(f32, y) }; + monitor.*.WorkSize = c.ImVec2{ .x = @intToFloat(f32, w), .y = @intToFloat(f32, h) }; } if (false and c.GLFW_HAS_PER_MONITOR_DPI) { // Warning: the validity of monitor DPI information on Windows depends on the application DPI awareness settings, diff --git a/src/main.zig b/src/main.zig index ba1c92e..e3eb3dd 100644 --- a/src/main.zig +++ b/src/main.zig @@ -7,92 +7,103 @@ 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 { - panic("Error: {}\n", .{ description }); + _ = err; + panic("Error: {s}\n", .{description}); } -var window: *c.GLFWwindow = undefined; - -fn handleStuff(path: [*c]const u8, x: i32, y: i32) callconv(.C) bool { - return true; -} - -pub fn main() !void { - _ = c.glfwSetErrorCallback(errorCallback); - - if (c.glfwInit() == c.GL_FALSE) { - panic("GLFW init failure\n", .{}); - } - defer 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; - window = c.glfwCreateWindow(window_width, window_height, "ImGUI Test", null, null) orelse { - panic("unable to create window\n", .{}); - }; - defer c.glfwDestroyWindow(window); - - c.glfwMakeContextCurrent(window); - c.glfwSwapInterval(1); - - const context = c.igCreateContext(null); - defer 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 (false and io.*.ConfigFlags & @enumToInt(c.ImGuiConfigFlags_ViewportsEnable) != 0) { - style.*.WindowRounding = 0.0; - style.*.Colors[@enumToInt(c.ImGuiCol_WindowBg)].w = 1.0; +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, + }; } - glfw_impl.Init(window, true, glfw_impl.ClientApi.OpenGL); - defer glfw_impl.Shutdown(); + pub fn deinit(self: *const Window) void { + gl3_impl.Shutdown(); + glfw_impl.Shutdown(); + c.igDestroyContext(self.context); + c.glfwDestroyWindow(self.window); + c.glfwTerminate(); + } - gl3_impl.Init(); // #version 150 - defer gl3_impl.Shutdown(); + pub fn shouldClose(self: *const Window) bool { + return c.glfwWindowShouldClose(self.window) == c.GL_TRUE; + } - const start_time = c.glfwGetTime(); - var prev_time = start_time; + pub fn beginFrame(self: *const Window) !void { + _ = self; - while (c.glfwWindowShouldClose(window) == c.GL_FALSE) { c.glfwPollEvents(); try gl3_impl.NewFrame(); glfw_impl.NewFrame(); c.igNewFrame(); + } - // main part - c.igShowDemoWindow(null); - + pub fn endFrame(self: *const Window) void { c.igRender(); var w: c_int = undefined; var h: c_int = undefined; - c.glfwGetFramebufferSize(window, &w, &h); + 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()); - // const now_time = c.glfwGetTime(); - // const elapsed = now_time - prev_time; - // prev_time = now_time; - // nextFrame(t, elapsed); - // draw(t, @This()); - - c.glfwSwapBuffers(window); + c.glfwSwapBuffers(self.window); } -} +}; |
