From 904528a87e156a5fd3b79fa5519e1fa888238c1f Mon Sep 17 00:00:00 2001 From: Connor Rowland Date: Sat, 15 Feb 2025 18:29:42 -0800 Subject: [PATCH 1/9] Install libraries to module instead of build --- build.zig | 139 +++++++++++++++++++++++++++--------------------------- 1 file changed, 69 insertions(+), 70 deletions(-) diff --git a/build.zig b/build.zig index 3d56896..79207f4 100644 --- a/build.zig +++ b/build.zig @@ -67,7 +67,7 @@ pub fn build(b: *std.Build) void { const options_module = options_step.createModule(); - _ = b.addModule("root", .{ + const mod = b.addModule("root", .{ .root_source_file = b.path("src/gui.zig"), .imports = &.{ .{ .name = "zgui_options", .module = options_module }, @@ -111,33 +111,33 @@ pub fn build(b: *std.Build) void { .optimize = optimize, }); - b.installArtifact(imgui); + mod.linkLibrary(imgui); const emscripten = target.result.os.tag == .emscripten; if (emscripten) { - imgui.root_module.addCMacro("__EMSCRIPTEN__", ""); + mod.addCMacro("__EMSCRIPTEN__", ""); // TODO: read from enviroment or `emcc --version` - imgui.root_module.addCMacro("__EMSCRIPTEN_major__", "3"); - imgui.root_module.addCMacro("__EMSCRIPTEN_minor__", "1"); - imgui.root_module.stack_protector = false; - //imgui.root_module.disable_stack_probing = true; + mod.addCMacro("__EMSCRIPTEN_major__", "3"); + mod.addCMacro("__EMSCRIPTEN_minor__", "1"); + mod.stack_protector = false; + //mod.disable_stack_probing = true; } - imgui.addIncludePath(b.path("libs")); - imgui.addIncludePath(b.path("libs/imgui")); + mod.addIncludePath(b.path("libs")); + mod.addIncludePath(b.path("libs/imgui")); if (!emscripten) { - imgui.linkLibC(); + mod.link_libc = true; if (target.result.abi != .msvc) - imgui.linkLibCpp(); + mod.link_libcpp = true; } - imgui.addCSourceFile(.{ + mod.addCSourceFile(.{ .file = b.path("src/zgui.cpp"), .flags = cflags, }); - imgui.addCSourceFiles(.{ + mod.addCSourceFiles(.{ .files = &.{ "libs/imgui/imgui.cpp", "libs/imgui/imgui_widgets.cpp", @@ -150,28 +150,28 @@ pub fn build(b: *std.Build) void { if (options.with_freetype) { if (b.lazyDependency("freetype", .{})) |freetype| { - imgui.linkLibrary(freetype.artifact("freetype")); + mod.linkLibrary(freetype.artifact("freetype")); } - imgui.addCSourceFile(.{ + mod.addCSourceFile(.{ .file = b.path("libs/imgui/misc/freetype/imgui_freetype.cpp"), .flags = cflags, }); - imgui.root_module.addCMacro("IMGUI_ENABLE_FREETYPE", "1"); + mod.addCMacro("IMGUI_ENABLE_FREETYPE", "1"); } if (options.use_wchar32) { - imgui.root_module.addCMacro("IMGUI_USE_WCHAR32", "1"); + mod.addCMacro("IMGUI_USE_WCHAR32", "1"); } if (options.with_implot) { - imgui.addIncludePath(b.path("libs/implot")); + mod.addIncludePath(b.path("libs/implot")); - imgui.addCSourceFile(.{ + mod.addCSourceFile(.{ .file = b.path("src/zplot.cpp"), .flags = cflags, }); - imgui.addCSourceFiles(.{ + mod.addCSourceFiles(.{ .files = &.{ "libs/implot/implot_demo.cpp", "libs/implot/implot.cpp", @@ -182,14 +182,14 @@ pub fn build(b: *std.Build) void { } if (options.with_gizmo) { - imgui.addIncludePath(b.path("libs/imguizmo/")); + mod.addIncludePath(b.path("libs/imguizmo/")); - imgui.addCSourceFile(.{ + mod.addCSourceFile(.{ .file = b.path("src/zgizmo.cpp"), .flags = cflags, }); - imgui.addCSourceFiles(.{ + mod.addCSourceFiles(.{ .files = &.{ "libs/imguizmo/ImGuizmo.cpp", }, @@ -198,36 +198,36 @@ pub fn build(b: *std.Build) void { } if (options.with_node_editor) { - imgui.addCSourceFile(.{ + mod.addCSourceFile(.{ .file = b.path("src/znode_editor.cpp"), .flags = cflags, }); - imgui.addCSourceFile(.{ .file = b.path("libs/node_editor/crude_json.cpp"), .flags = cflags }); - imgui.addCSourceFile(.{ .file = b.path("libs/node_editor/imgui_canvas.cpp"), .flags = cflags }); - imgui.addCSourceFile(.{ .file = b.path("libs/node_editor/imgui_node_editor_api.cpp"), .flags = cflags }); - imgui.addCSourceFile(.{ .file = b.path("libs/node_editor/imgui_node_editor.cpp"), .flags = cflags }); + mod.addCSourceFile(.{ .file = b.path("libs/node_editor/crude_json.cpp"), .flags = cflags }); + mod.addCSourceFile(.{ .file = b.path("libs/node_editor/imgui_canvas.cpp"), .flags = cflags }); + mod.addCSourceFile(.{ .file = b.path("libs/node_editor/imgui_node_editor_api.cpp"), .flags = cflags }); + mod.addCSourceFile(.{ .file = b.path("libs/node_editor/imgui_node_editor.cpp"), .flags = cflags }); } if (options.with_te) { - imgui.addCSourceFile(.{ + mod.addCSourceFile(.{ .file = b.path("src/zte.cpp"), .flags = cflags, }); - imgui.root_module.addCMacro("IMGUI_ENABLE_TEST_ENGINE", ""); - imgui.root_module.addCMacro("IMGUI_TEST_ENGINE_ENABLE_COROUTINE_STDTHREAD_IMPL", "1"); + mod.addCMacro("IMGUI_ENABLE_TEST_ENGINE", ""); + mod.addCMacro("IMGUI_TEST_ENGINE_ENABLE_COROUTINE_STDTHREAD_IMPL", "1"); - imgui.addIncludePath(b.path("libs/imgui_test_engine/")); + mod.addIncludePath(b.path("libs/imgui_test_engine/")); - imgui.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_capture_tool.cpp"), .flags = cflags }); - imgui.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_context.cpp"), .flags = cflags }); - imgui.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_coroutine.cpp"), .flags = cflags }); - imgui.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_engine.cpp"), .flags = cflags }); - imgui.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_exporters.cpp"), .flags = cflags }); - imgui.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_perftool.cpp"), .flags = cflags }); - imgui.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_ui.cpp"), .flags = cflags }); - imgui.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_utils.cpp"), .flags = cflags }); + mod.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_capture_tool.cpp"), .flags = cflags }); + mod.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_context.cpp"), .flags = cflags }); + mod.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_coroutine.cpp"), .flags = cflags }); + mod.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_engine.cpp"), .flags = cflags }); + mod.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_exporters.cpp"), .flags = cflags }); + mod.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_perftool.cpp"), .flags = cflags }); + mod.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_ui.cpp"), .flags = cflags }); + mod.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_utils.cpp"), .flags = cflags }); // TODO: Workaround because zig on win64 doesn have phtreads // TODO: Implement corutine in zig can solve this @@ -267,27 +267,26 @@ pub fn build(b: *std.Build) void { winpthreads.addIncludePath(b.path("libs/winpthreads/include")); winpthreads.addIncludePath(b.path("libs/winpthreads/src")); winpthreads.linkLibC(); - b.installArtifact(winpthreads); - imgui.linkLibrary(winpthreads); - imgui.addSystemIncludePath(b.path("libs/winpthreads/include")); + mod.linkLibrary(winpthreads); + mod.addSystemIncludePath(b.path("libs/winpthreads/include")); } } switch (options.backend) { .glfw_wgpu => { if (emscripten) { - imgui.addSystemIncludePath(.{ + mod.addSystemIncludePath(.{ .cwd_relative = b.pathJoin(&.{ b.sysroot.?, "include" }), }); } else { if (b.lazyDependency("zglfw", .{})) |zglfw| { - imgui.addIncludePath(zglfw.path("libs/glfw/include")); + mod.addIncludePath(zglfw.path("libs/glfw/include")); } if (b.lazyDependency("zgpu", .{})) |zgpu| { - imgui.addIncludePath(zgpu.path("libs/dawn/include")); + mod.addIncludePath(zgpu.path("libs/dawn/include")); } } - imgui.addCSourceFiles(.{ + mod.addCSourceFiles(.{ .files = &.{ "libs/imgui/backends/imgui_impl_glfw.cpp", "libs/imgui/backends/imgui_impl_wgpu.cpp", @@ -297,9 +296,9 @@ pub fn build(b: *std.Build) void { }, .glfw_opengl3 => { if (b.lazyDependency("zglfw", .{})) |zglfw| { - imgui.addIncludePath(zglfw.path("libs/glfw/include")); + mod.addIncludePath(zglfw.path("libs/glfw/include")); } - imgui.addCSourceFiles(.{ + mod.addCSourceFiles(.{ .files = &.{ "libs/imgui/backends/imgui_impl_glfw.cpp", "libs/imgui/backends/imgui_impl_opengl3.cpp", @@ -309,39 +308,39 @@ pub fn build(b: *std.Build) void { }, .glfw_dx12 => { if (b.lazyDependency("zglfw", .{})) |zglfw| { - imgui.addIncludePath(zglfw.path("libs/glfw/include")); + mod.addIncludePath(zglfw.path("libs/glfw/include")); } - imgui.addCSourceFiles(.{ + mod.addCSourceFiles(.{ .files = &.{ "libs/imgui/backends/imgui_impl_glfw.cpp", "libs/imgui/backends/imgui_impl_dx12.cpp", }, .flags = cflags, }); - imgui.linkSystemLibrary("d3dcompiler_47"); + mod.linkSystemLibrary("d3dcompiler_47"); }, .win32_dx12 => { - imgui.addCSourceFiles(.{ + mod.addCSourceFiles(.{ .files = &.{ "libs/imgui/backends/imgui_impl_win32.cpp", "libs/imgui/backends/imgui_impl_dx12.cpp", }, .flags = cflags, }); - imgui.linkSystemLibrary("d3dcompiler_47"); - imgui.linkSystemLibrary("dwmapi"); + mod.linkSystemLibrary("d3dcompiler_47"); + mod.linkSystemLibrary("dwmapi"); switch (target.result.abi) { - .msvc => imgui.linkSystemLibrary("Gdi32"), - .gnu => imgui.linkSystemLibrary("gdi32"), + .msvc => mod.linkSystemLibrary("Gdi32"), + .gnu => mod.linkSystemLibrary("gdi32"), else => {}, } }, .glfw_vulkan => { if (b.lazyDependency("zglfw", .{})) |zglfw| { - imgui.addIncludePath(zglfw.path("libs/glfw/include")); + mod.addIncludePath(zglfw.path("libs/glfw/include")); } - imgui.addCSourceFiles(.{ + mod.addCSourceFiles(.{ .files = &.{ "libs/imgui/backends/imgui_impl_glfw.cpp", "libs/imgui/backends/imgui_impl_vulkan.cpp", @@ -351,9 +350,9 @@ pub fn build(b: *std.Build) void { }, .glfw => { if (b.lazyDependency("zglfw", .{})) |zglfw| { - imgui.addIncludePath(zglfw.path("libs/glfw/include")); + mod.addIncludePath(zglfw.path("libs/glfw/include")); } - imgui.addCSourceFiles(.{ + mod.addCSourceFiles(.{ .files = &.{ "libs/imgui/backends/imgui_impl_glfw.cpp", }, @@ -362,9 +361,9 @@ pub fn build(b: *std.Build) void { }, .sdl2_opengl3 => { if (b.lazyDependency("zsdl", .{})) |zsdl| { - imgui.addIncludePath(zsdl.path("libs/sdl2/include")); + mod.addIncludePath(zsdl.path("libs/sdl2/include")); } - imgui.addCSourceFiles(.{ + mod.addCSourceFiles(.{ .files = &.{ "libs/imgui/backends/imgui_impl_sdl2.cpp", "libs/imgui/backends/imgui_impl_opengl3.cpp", @@ -373,11 +372,11 @@ pub fn build(b: *std.Build) void { }); }, .osx_metal => { - imgui.linkFramework("Foundation"); - imgui.linkFramework("Metal"); - imgui.linkFramework("Cocoa"); - imgui.linkFramework("QuartzCore"); - imgui.addCSourceFiles(.{ + mod.linkFramework("Foundation"); + mod.linkFramework("Metal"); + mod.linkFramework("Cocoa"); + mod.linkFramework("QuartzCore"); + mod.addCSourceFiles(.{ .files = &.{ "libs/imgui/backends/imgui_impl_osx.mm", "libs/imgui/backends/imgui_impl_metal.mm", @@ -390,8 +389,8 @@ pub fn build(b: *std.Build) void { if (target.result.os.tag == .macos) { if (b.lazyDependency("system_sdk", .{})) |system_sdk| { - imgui.addSystemIncludePath(system_sdk.path("macos12/usr/include")); - imgui.addFrameworkPath(system_sdk.path("macos12/System/Library/Frameworks")); + mod.addSystemIncludePath(system_sdk.path("macos12/usr/include")); + mod.addFrameworkPath(system_sdk.path("macos12/System/Library/Frameworks")); } } From 3aa63cde09694bc3416d420ad28e2a128448e562 Mon Sep 17 00:00:00 2001 From: Connor Rowland Date: Sat, 15 Feb 2025 18:55:32 -0800 Subject: [PATCH 2/9] System library options needed --- build.zig | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/build.zig b/build.zig index 79207f4..2f86c68 100644 --- a/build.zig +++ b/build.zig @@ -317,7 +317,7 @@ pub fn build(b: *std.Build) void { }, .flags = cflags, }); - mod.linkSystemLibrary("d3dcompiler_47"); + mod.linkSystemLibrary("d3dcompiler_47", .{}); }, .win32_dx12 => { mod.addCSourceFiles(.{ @@ -327,11 +327,11 @@ pub fn build(b: *std.Build) void { }, .flags = cflags, }); - mod.linkSystemLibrary("d3dcompiler_47"); - mod.linkSystemLibrary("dwmapi"); + mod.linkSystemLibrary("d3dcompiler_47", .{}); + mod.linkSystemLibrary("dwmapi", .{}); switch (target.result.abi) { - .msvc => mod.linkSystemLibrary("Gdi32"), - .gnu => mod.linkSystemLibrary("gdi32"), + .msvc => mod.linkSystemLibrary("Gdi32", .{}), + .gnu => mod.linkSystemLibrary("gdi32", .{}), else => {}, } }, From 98ce0f8e135c1403bc098e233a71b0fa9046de49 Mon Sep 17 00:00:00 2001 From: Connor Rowland Date: Sat, 15 Feb 2025 18:57:16 -0800 Subject: [PATCH 3/9] LinkFramework needs options --- build.zig | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build.zig b/build.zig index 2f86c68..f98f79b 100644 --- a/build.zig +++ b/build.zig @@ -372,10 +372,10 @@ pub fn build(b: *std.Build) void { }); }, .osx_metal => { - mod.linkFramework("Foundation"); - mod.linkFramework("Metal"); - mod.linkFramework("Cocoa"); - mod.linkFramework("QuartzCore"); + mod.linkFramework("Foundation", .{}); + mod.linkFramework("Metal", .{}); + mod.linkFramework("Cocoa", .{}); + mod.linkFramework("QuartzCore", .{}); mod.addCSourceFiles(.{ .files = &.{ "libs/imgui/backends/imgui_impl_osx.mm", From 2df4448131f31253b81e08f58cf89c1caba5ea1e Mon Sep 17 00:00:00 2001 From: Connor Rowland Date: Wed, 19 Feb 2025 16:07:53 -0800 Subject: [PATCH 4/9] Remove libs and a C macro --- build.zig | 41 ++++--------------------- libs/imgui/backends/imgui_impl_wgpu.cpp | 15 --------- libs/imgui/backends/imgui_impl_wgpu.h | 3 -- 3 files changed, 6 insertions(+), 53 deletions(-) diff --git a/build.zig b/build.zig index f98f79b..fdcf9ab 100644 --- a/build.zig +++ b/build.zig @@ -87,45 +87,16 @@ pub fn build(b: *std.Build) void { "-Wno-availability", }; - const imgui = if (options.shared) blk: { - const lib = b.addSharedLibrary(.{ - .name = "imgui", - .target = target, - .optimize = optimize, - }); - - if (target.result.os.tag == .windows) { - lib.root_module.addCMacro("IMGUI_API", "__declspec(dllexport)"); - lib.root_module.addCMacro("IMPLOT_API", "__declspec(dllexport)"); - lib.root_module.addCMacro("ZGUI_API", "__declspec(dllexport)"); - } - - if (target.result.os.tag == .macos) { - lib.linker_allow_shlib_undefined = true; - } - - break :blk lib; - } else b.addStaticLibrary(.{ - .name = "imgui", - .target = target, - .optimize = optimize, - }); - - mod.linkLibrary(imgui); - - const emscripten = target.result.os.tag == .emscripten; - if (emscripten) { - mod.addCMacro("__EMSCRIPTEN__", ""); - // TODO: read from enviroment or `emcc --version` - mod.addCMacro("__EMSCRIPTEN_major__", "3"); - mod.addCMacro("__EMSCRIPTEN_minor__", "1"); - mod.stack_protector = false; - //mod.disable_stack_probing = true; + if (target.result.os.tag == .windows) { + mod.addCMacro("IMGUI_API", "__declspec(dllexport)"); + mod.addCMacro("IMPLOT_API", "__declspec(dllexport)"); + mod.addCMacro("ZGUI_API", "__declspec(dllexport)"); } mod.addIncludePath(b.path("libs")); mod.addIncludePath(b.path("libs/imgui")); + const emscripten = target.result.os.tag == .emscripten; if (!emscripten) { mod.link_libc = true; if (target.result.abi != .msvc) @@ -405,7 +376,7 @@ pub fn build(b: *std.Build) void { b.installArtifact(tests); tests.root_module.addImport("zgui_options", options_module); - tests.linkLibrary(imgui); + tests.root_module.addImport("zgui", mod); test_step.dependOn(&b.addRunArtifact(tests).step); } diff --git a/libs/imgui/backends/imgui_impl_wgpu.cpp b/libs/imgui/backends/imgui_impl_wgpu.cpp index b565c4d..e43dfd5 100644 --- a/libs/imgui/backends/imgui_impl_wgpu.cpp +++ b/libs/imgui/backends/imgui_impl_wgpu.cpp @@ -45,19 +45,6 @@ // When targeting native platforms (i.e. NOT emscripten), one of IMGUI_IMPL_WEBGPU_BACKEND_DAWN // or IMGUI_IMPL_WEBGPU_BACKEND_WGPU must be provided. See imgui_impl_wgpu.h for more details. -// FIX(zig-gamedev) -#define IMGUI_IMPL_WEBGPU_BACKEND_WGPU - -#ifndef __EMSCRIPTEN__ - #if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) == defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) - #error exactly one of IMGUI_IMPL_WEBGPU_BACKEND_DAWN or IMGUI_IMPL_WEBGPU_BACKEND_WGPU must be defined! - #endif -#else - #if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) || defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) - #error neither IMGUI_IMPL_WEBGPU_BACKEND_DAWN nor IMGUI_IMPL_WEBGPU_BACKEND_WGPU may be defined if targeting emscripten! - #endif -#endif - #include "imgui.h" #ifndef IMGUI_DISABLE @@ -836,8 +823,6 @@ bool ImGui_ImplWGPU_Init(ImGui_ImplWGPU_InitInfo* init_info) io.BackendRendererName = "imgui_impl_webgpu_emscripten"; #elif defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) io.BackendRendererName = "imgui_impl_webgpu_dawn"; -#elif defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) - io.BackendRendererName = "imgui_impl_webgpu_wgpu"; #else io.BackendRendererName = "imgui_impl_webgpu"; #endif diff --git a/libs/imgui/backends/imgui_impl_wgpu.h b/libs/imgui/backends/imgui_impl_wgpu.h index 0457a63..a8edb90 100644 --- a/libs/imgui/backends/imgui_impl_wgpu.h +++ b/libs/imgui/backends/imgui_impl_wgpu.h @@ -8,9 +8,6 @@ // This requirement will be removed once WebGPU stabilizes and backends converge on a unified interface. //#define IMGUI_IMPL_WEBGPU_BACKEND_DAWN -// FIX(zig-gamedev) -#define IMGUI_IMPL_WEBGPU_BACKEND_WGPU - // Implemented features: // [X] Renderer: User texture binding. Use 'WGPUTextureView' as ImTextureID. Read the FAQ about ImTextureID! // [X] Renderer: Large meshes support (64k+ vertices) even with 16-bit indices (ImGuiBackendFlags_RendererHasVtxOffset). From 7d0cc809e3ec05d431779f48130cbe7ca3c02dcf Mon Sep 17 00:00:00 2001 From: Connor Rowland Date: Fri, 21 Feb 2025 14:42:38 -0800 Subject: [PATCH 5/9] Emscripten has different imgui #define --- build.zig | 21 ++++++++++++++------- libs/imgui/backends/imgui_impl_wgpu.cpp | 10 ++++++++++ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/build.zig b/build.zig index fdcf9ab..317ca4c 100644 --- a/build.zig +++ b/build.zig @@ -249,6 +249,13 @@ pub fn build(b: *std.Build) void { mod.addSystemIncludePath(.{ .cwd_relative = b.pathJoin(&.{ b.sysroot.?, "include" }), }); + mod.addCSourceFiles(.{ + .files = &.{ + "libs/imgui/backends/imgui_impl_glfw.cpp", + "libs/imgui/backends/imgui_impl_wgpu.cpp", + }, + .flags = cflags, + }); } else { if (b.lazyDependency("zglfw", .{})) |zglfw| { mod.addIncludePath(zglfw.path("libs/glfw/include")); @@ -256,14 +263,14 @@ pub fn build(b: *std.Build) void { if (b.lazyDependency("zgpu", .{})) |zgpu| { mod.addIncludePath(zgpu.path("libs/dawn/include")); } + mod.addCSourceFiles(.{ + .files = &.{ + "libs/imgui/backends/imgui_impl_glfw.cpp", + "libs/imgui/backends/imgui_impl_wgpu.cpp", + }, + .flags = &(cflags.* ++ .{"-DIMGUI_IMPL_WEBGPU_BACKEND_WGPU"}), + }); } - mod.addCSourceFiles(.{ - .files = &.{ - "libs/imgui/backends/imgui_impl_glfw.cpp", - "libs/imgui/backends/imgui_impl_wgpu.cpp", - }, - .flags = cflags, - }); }, .glfw_opengl3 => { if (b.lazyDependency("zglfw", .{})) |zglfw| { diff --git a/libs/imgui/backends/imgui_impl_wgpu.cpp b/libs/imgui/backends/imgui_impl_wgpu.cpp index e43dfd5..26427ff 100644 --- a/libs/imgui/backends/imgui_impl_wgpu.cpp +++ b/libs/imgui/backends/imgui_impl_wgpu.cpp @@ -45,6 +45,16 @@ // When targeting native platforms (i.e. NOT emscripten), one of IMGUI_IMPL_WEBGPU_BACKEND_DAWN // or IMGUI_IMPL_WEBGPU_BACKEND_WGPU must be provided. See imgui_impl_wgpu.h for more details. +#ifndef __EMSCRIPTEN__ + #if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) == defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) + #error exactly one of IMGUI_IMPL_WEBGPU_BACKEND_DAWN or IMGUI_IMPL_WEBGPU_BACKEND_WGPU must be defined! + #endif +#else + #if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) || defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) + #error neither IMGUI_IMPL_WEBGPU_BACKEND_DAWN nor IMGUI_IMPL_WEBGPU_BACKEND_WGPU may be defined if targeting emscripten! + #endif +#endif + #include "imgui.h" #ifndef IMGUI_DISABLE From 4be70f20f44ed31d5b27ed73bf6df750d754409a Mon Sep 17 00:00:00 2001 From: Connor Rowland Date: Fri, 21 Feb 2025 16:00:15 -0800 Subject: [PATCH 6/9] Rename mod to imgui --- build.zig | 136 +++++++++++++++++++++++++++--------------------------- 1 file changed, 68 insertions(+), 68 deletions(-) diff --git a/build.zig b/build.zig index 317ca4c..f61347a 100644 --- a/build.zig +++ b/build.zig @@ -67,7 +67,7 @@ pub fn build(b: *std.Build) void { const options_module = options_step.createModule(); - const mod = b.addModule("root", .{ + const imgui = b.addModule("root", .{ .root_source_file = b.path("src/gui.zig"), .imports = &.{ .{ .name = "zgui_options", .module = options_module }, @@ -88,27 +88,27 @@ pub fn build(b: *std.Build) void { }; if (target.result.os.tag == .windows) { - mod.addCMacro("IMGUI_API", "__declspec(dllexport)"); - mod.addCMacro("IMPLOT_API", "__declspec(dllexport)"); - mod.addCMacro("ZGUI_API", "__declspec(dllexport)"); + imgui.addCMacro("IMGUI_API", "__declspec(dllexport)"); + imgui.addCMacro("IMPLOT_API", "__declspec(dllexport)"); + imgui.addCMacro("ZGUI_API", "__declspec(dllexport)"); } - mod.addIncludePath(b.path("libs")); - mod.addIncludePath(b.path("libs/imgui")); + imgui.addIncludePath(b.path("libs")); + imgui.addIncludePath(b.path("libs/imgui")); const emscripten = target.result.os.tag == .emscripten; if (!emscripten) { - mod.link_libc = true; + imgui.link_libc = true; if (target.result.abi != .msvc) - mod.link_libcpp = true; + imgui.link_libcpp = true; } - mod.addCSourceFile(.{ + imgui.addCSourceFile(.{ .file = b.path("src/zgui.cpp"), .flags = cflags, }); - mod.addCSourceFiles(.{ + imgui.addCSourceFiles(.{ .files = &.{ "libs/imgui/imgui.cpp", "libs/imgui/imgui_widgets.cpp", @@ -121,28 +121,28 @@ pub fn build(b: *std.Build) void { if (options.with_freetype) { if (b.lazyDependency("freetype", .{})) |freetype| { - mod.linkLibrary(freetype.artifact("freetype")); + imgui.linkLibrary(freetype.artifact("freetype")); } - mod.addCSourceFile(.{ + imgui.addCSourceFile(.{ .file = b.path("libs/imgui/misc/freetype/imgui_freetype.cpp"), .flags = cflags, }); - mod.addCMacro("IMGUI_ENABLE_FREETYPE", "1"); + imgui.addCMacro("IMGUI_ENABLE_FREETYPE", "1"); } if (options.use_wchar32) { - mod.addCMacro("IMGUI_USE_WCHAR32", "1"); + imgui.addCMacro("IMGUI_USE_WCHAR32", "1"); } if (options.with_implot) { - mod.addIncludePath(b.path("libs/implot")); + imgui.addIncludePath(b.path("libs/implot")); - mod.addCSourceFile(.{ + imgui.addCSourceFile(.{ .file = b.path("src/zplot.cpp"), .flags = cflags, }); - mod.addCSourceFiles(.{ + imgui.addCSourceFiles(.{ .files = &.{ "libs/implot/implot_demo.cpp", "libs/implot/implot.cpp", @@ -153,14 +153,14 @@ pub fn build(b: *std.Build) void { } if (options.with_gizmo) { - mod.addIncludePath(b.path("libs/imguizmo/")); + imgui.addIncludePath(b.path("libs/imguizmo/")); - mod.addCSourceFile(.{ + imgui.addCSourceFile(.{ .file = b.path("src/zgizmo.cpp"), .flags = cflags, }); - mod.addCSourceFiles(.{ + imgui.addCSourceFiles(.{ .files = &.{ "libs/imguizmo/ImGuizmo.cpp", }, @@ -169,36 +169,36 @@ pub fn build(b: *std.Build) void { } if (options.with_node_editor) { - mod.addCSourceFile(.{ + imgui.addCSourceFile(.{ .file = b.path("src/znode_editor.cpp"), .flags = cflags, }); - mod.addCSourceFile(.{ .file = b.path("libs/node_editor/crude_json.cpp"), .flags = cflags }); - mod.addCSourceFile(.{ .file = b.path("libs/node_editor/imgui_canvas.cpp"), .flags = cflags }); - mod.addCSourceFile(.{ .file = b.path("libs/node_editor/imgui_node_editor_api.cpp"), .flags = cflags }); - mod.addCSourceFile(.{ .file = b.path("libs/node_editor/imgui_node_editor.cpp"), .flags = cflags }); + imgui.addCSourceFile(.{ .file = b.path("libs/node_editor/crude_json.cpp"), .flags = cflags }); + imgui.addCSourceFile(.{ .file = b.path("libs/node_editor/imgui_canvas.cpp"), .flags = cflags }); + imgui.addCSourceFile(.{ .file = b.path("libs/node_editor/imgui_node_editor_api.cpp"), .flags = cflags }); + imgui.addCSourceFile(.{ .file = b.path("libs/node_editor/imgui_node_editor.cpp"), .flags = cflags }); } if (options.with_te) { - mod.addCSourceFile(.{ + imgui.addCSourceFile(.{ .file = b.path("src/zte.cpp"), .flags = cflags, }); - mod.addCMacro("IMGUI_ENABLE_TEST_ENGINE", ""); - mod.addCMacro("IMGUI_TEST_ENGINE_ENABLE_COROUTINE_STDTHREAD_IMPL", "1"); + imgui.addCMacro("IMGUI_ENABLE_TEST_ENGINE", ""); + imgui.addCMacro("IMGUI_TEST_ENGINE_ENABLE_COROUTINE_STDTHREAD_IMPL", "1"); - mod.addIncludePath(b.path("libs/imgui_test_engine/")); + imgui.addIncludePath(b.path("libs/imgui_test_engine/")); - mod.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_capture_tool.cpp"), .flags = cflags }); - mod.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_context.cpp"), .flags = cflags }); - mod.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_coroutine.cpp"), .flags = cflags }); - mod.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_engine.cpp"), .flags = cflags }); - mod.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_exporters.cpp"), .flags = cflags }); - mod.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_perftool.cpp"), .flags = cflags }); - mod.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_ui.cpp"), .flags = cflags }); - mod.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_utils.cpp"), .flags = cflags }); + imgui.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_capture_tool.cpp"), .flags = cflags }); + imgui.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_context.cpp"), .flags = cflags }); + imgui.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_coroutine.cpp"), .flags = cflags }); + imgui.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_engine.cpp"), .flags = cflags }); + imgui.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_exporters.cpp"), .flags = cflags }); + imgui.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_perftool.cpp"), .flags = cflags }); + imgui.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_ui.cpp"), .flags = cflags }); + imgui.addCSourceFile(.{ .file = b.path("libs/imgui_test_engine/imgui_te_utils.cpp"), .flags = cflags }); // TODO: Workaround because zig on win64 doesn have phtreads // TODO: Implement corutine in zig can solve this @@ -238,18 +238,18 @@ pub fn build(b: *std.Build) void { winpthreads.addIncludePath(b.path("libs/winpthreads/include")); winpthreads.addIncludePath(b.path("libs/winpthreads/src")); winpthreads.linkLibC(); - mod.linkLibrary(winpthreads); - mod.addSystemIncludePath(b.path("libs/winpthreads/include")); + imgui.linkLibrary(winpthreads); + imgui.addSystemIncludePath(b.path("libs/winpthreads/include")); } } switch (options.backend) { .glfw_wgpu => { if (emscripten) { - mod.addSystemIncludePath(.{ + imgui.addSystemIncludePath(.{ .cwd_relative = b.pathJoin(&.{ b.sysroot.?, "include" }), }); - mod.addCSourceFiles(.{ + imgui.addCSourceFiles(.{ .files = &.{ "libs/imgui/backends/imgui_impl_glfw.cpp", "libs/imgui/backends/imgui_impl_wgpu.cpp", @@ -258,12 +258,12 @@ pub fn build(b: *std.Build) void { }); } else { if (b.lazyDependency("zglfw", .{})) |zglfw| { - mod.addIncludePath(zglfw.path("libs/glfw/include")); + imgui.addIncludePath(zglfw.path("libs/glfw/include")); } if (b.lazyDependency("zgpu", .{})) |zgpu| { - mod.addIncludePath(zgpu.path("libs/dawn/include")); + imgui.addIncludePath(zgpu.path("libs/dawn/include")); } - mod.addCSourceFiles(.{ + imgui.addCSourceFiles(.{ .files = &.{ "libs/imgui/backends/imgui_impl_glfw.cpp", "libs/imgui/backends/imgui_impl_wgpu.cpp", @@ -274,9 +274,9 @@ pub fn build(b: *std.Build) void { }, .glfw_opengl3 => { if (b.lazyDependency("zglfw", .{})) |zglfw| { - mod.addIncludePath(zglfw.path("libs/glfw/include")); + imgui.addIncludePath(zglfw.path("libs/glfw/include")); } - mod.addCSourceFiles(.{ + imgui.addCSourceFiles(.{ .files = &.{ "libs/imgui/backends/imgui_impl_glfw.cpp", "libs/imgui/backends/imgui_impl_opengl3.cpp", @@ -286,39 +286,39 @@ pub fn build(b: *std.Build) void { }, .glfw_dx12 => { if (b.lazyDependency("zglfw", .{})) |zglfw| { - mod.addIncludePath(zglfw.path("libs/glfw/include")); + imgui.addIncludePath(zglfw.path("libs/glfw/include")); } - mod.addCSourceFiles(.{ + imgui.addCSourceFiles(.{ .files = &.{ "libs/imgui/backends/imgui_impl_glfw.cpp", "libs/imgui/backends/imgui_impl_dx12.cpp", }, .flags = cflags, }); - mod.linkSystemLibrary("d3dcompiler_47", .{}); + imgui.linkSystemLibrary("d3dcompiler_47", .{}); }, .win32_dx12 => { - mod.addCSourceFiles(.{ + imgui.addCSourceFiles(.{ .files = &.{ "libs/imgui/backends/imgui_impl_win32.cpp", "libs/imgui/backends/imgui_impl_dx12.cpp", }, .flags = cflags, }); - mod.linkSystemLibrary("d3dcompiler_47", .{}); - mod.linkSystemLibrary("dwmapi", .{}); + imgui.linkSystemLibrary("d3dcompiler_47", .{}); + imgui.linkSystemLibrary("dwmapi", .{}); switch (target.result.abi) { - .msvc => mod.linkSystemLibrary("Gdi32", .{}), - .gnu => mod.linkSystemLibrary("gdi32", .{}), + .msvc => imgui.linkSystemLibrary("Gdi32", .{}), + .gnu => imgui.linkSystemLibrary("gdi32", .{}), else => {}, } }, .glfw_vulkan => { if (b.lazyDependency("zglfw", .{})) |zglfw| { - mod.addIncludePath(zglfw.path("libs/glfw/include")); + imgui.addIncludePath(zglfw.path("libs/glfw/include")); } - mod.addCSourceFiles(.{ + imgui.addCSourceFiles(.{ .files = &.{ "libs/imgui/backends/imgui_impl_glfw.cpp", "libs/imgui/backends/imgui_impl_vulkan.cpp", @@ -328,9 +328,9 @@ pub fn build(b: *std.Build) void { }, .glfw => { if (b.lazyDependency("zglfw", .{})) |zglfw| { - mod.addIncludePath(zglfw.path("libs/glfw/include")); + imgui.addIncludePath(zglfw.path("libs/glfw/include")); } - mod.addCSourceFiles(.{ + imgui.addCSourceFiles(.{ .files = &.{ "libs/imgui/backends/imgui_impl_glfw.cpp", }, @@ -339,9 +339,9 @@ pub fn build(b: *std.Build) void { }, .sdl2_opengl3 => { if (b.lazyDependency("zsdl", .{})) |zsdl| { - mod.addIncludePath(zsdl.path("libs/sdl2/include")); + imgui.addIncludePath(zsdl.path("libs/sdl2/include")); } - mod.addCSourceFiles(.{ + imgui.addCSourceFiles(.{ .files = &.{ "libs/imgui/backends/imgui_impl_sdl2.cpp", "libs/imgui/backends/imgui_impl_opengl3.cpp", @@ -350,11 +350,11 @@ pub fn build(b: *std.Build) void { }); }, .osx_metal => { - mod.linkFramework("Foundation", .{}); - mod.linkFramework("Metal", .{}); - mod.linkFramework("Cocoa", .{}); - mod.linkFramework("QuartzCore", .{}); - mod.addCSourceFiles(.{ + imgui.linkFramework("Foundation", .{}); + imgui.linkFramework("Metal", .{}); + imgui.linkFramework("Cocoa", .{}); + imgui.linkFramework("QuartzCore", .{}); + imgui.addCSourceFiles(.{ .files = &.{ "libs/imgui/backends/imgui_impl_osx.mm", "libs/imgui/backends/imgui_impl_metal.mm", @@ -367,8 +367,8 @@ pub fn build(b: *std.Build) void { if (target.result.os.tag == .macos) { if (b.lazyDependency("system_sdk", .{})) |system_sdk| { - mod.addSystemIncludePath(system_sdk.path("macos12/usr/include")); - mod.addFrameworkPath(system_sdk.path("macos12/System/Library/Frameworks")); + imgui.addSystemIncludePath(system_sdk.path("macos12/usr/include")); + imgui.addFrameworkPath(system_sdk.path("macos12/System/Library/Frameworks")); } } @@ -383,7 +383,7 @@ pub fn build(b: *std.Build) void { b.installArtifact(tests); tests.root_module.addImport("zgui_options", options_module); - tests.root_module.addImport("zgui", mod); + tests.root_module.addImport("zgui", imgui); test_step.dependOn(&b.addRunArtifact(tests).step); } From 3a5f93b895687f39021901bed2400f2b5f932850 Mon Sep 17 00:00:00 2001 From: Connor Rowland Date: Fri, 21 Feb 2025 17:52:40 -0800 Subject: [PATCH 7/9] Static/Shared Library settings --- build.zig | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/build.zig b/build.zig index f61347a..6848cce 100644 --- a/build.zig +++ b/build.zig @@ -87,11 +87,15 @@ pub fn build(b: *std.Build) void { "-Wno-availability", }; - if (target.result.os.tag == .windows) { - imgui.addCMacro("IMGUI_API", "__declspec(dllexport)"); - imgui.addCMacro("IMPLOT_API", "__declspec(dllexport)"); - imgui.addCMacro("ZGUI_API", "__declspec(dllexport)"); - } + //Shared Library details + //if (target.result.os.tag == .macos) { + // lib.linker_allow_shlib_undefined = true; + //} + //if (target.result.os.tag == .windows) { + // imgui.addCMacro("IMGUI_API", "__declspec(dllexport)"); + // imgui.addCMacro("IMPLOT_API", "__declspec(dllexport)"); + // imgui.addCMacro("ZGUI_API", "__declspec(dllexport)"); + //} imgui.addIncludePath(b.path("libs")); imgui.addIncludePath(b.path("libs/imgui")); From 044e4a721cee353fe053f559c1d58caf0b7d34a3 Mon Sep 17 00:00:00 2001 From: Connor Rowland Date: Fri, 21 Feb 2025 17:54:03 -0800 Subject: [PATCH 8/9] Update README --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index f6af9b8..d79baf9 100644 --- a/README.md +++ b/README.md @@ -35,8 +35,7 @@ pub fn build(b: *std.Build) void { .with_implot = true, }); exe.root_module.addImport("zgui", zgui.module("root")); - exe.linkLibrary(zgui.artifact("imgui")); - + { // Needed for glfw/wgpu rendering backend const zglfw = b.dependency("zglfw", .{}); exe.root_module.addImport("zglfw", zglfw.module("root")); From d1c288a52490e8da52c3888b6c7f26f7b2c45d71 Mon Sep 17 00:00:00 2001 From: Connor Rowland Date: Fri, 21 Feb 2025 21:37:09 -0800 Subject: [PATCH 9/9] Imgui has u64 texture id --- src/gui.zig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui.zig b/src/gui.zig index a2a7e73..ca4e0b1 100644 --- a/src/gui.zig +++ b/src/gui.zig @@ -1678,7 +1678,7 @@ const ImageButton = struct { pub fn imageButton(str_id: [:0]const u8, user_texture_id: TextureIdent, args: ImageButton) bool { return zguiImageButton( str_id, - user_texture_id, + @intFromPtr(user_texture_id), args.w, args.h, &args.uv0, @@ -1689,7 +1689,7 @@ pub fn imageButton(str_id: [:0]const u8, user_texture_id: TextureIdent, args: Im } extern fn zguiImageButton( str_id: [*:0]const u8, - user_texture_id: TextureIdent, + user_texture_id: u64, w: f32, h: f32, uv0: *const [2]f32,