Closed samrat closed 2 months ago
sokol_imgui.h doesn't have zig bindings yet, but I need to get back to the zig bindings anyway before the zig 0.10.0 release. Maybe I can at least get a quick and dirty version into sokol-zig (you'd still need to figure out how to bind with imgui.h though, but maybe there are already existing solutions).
👋 I found some related links, I thought I would drop them here. Sorry if this is noise. (Thanks for sokol-zig, it's been a fun playground for me!)
Sorry to bump this, any updates on this thread?
One more bindings project to add on the above list: https://github.com/nurpax/zig-imgui
I try to keep it up to date with sokol and zig-devel. Zig moves fast so there's been a lot of churn and I think it's once again broken against latest zig master. But should get fixed soonish.
Sorry to bump this, any updates on this thread?
For anyone who might be interested, I ended up adding all the sokol files in my zig project.
Build them with zig, and @cImport
for zig to consume.
No extra layer, not like how this binding does.
In short: I did it manually since Zig can use C library with sources relatively easy.
One more bindings project to add on the above list: https://github.com/nurpax/zig-imgui
This is great!
You might also try adding cimgui
and imgui
to the zon
file if you look at zig-devel (master version). Avoidance of ugly git sub-modules!!! :fearful:
You might also try adding
cimgui
andimgui
to thezon
file if you look at zig-devel (master version). Avoidance of ugly git sub-modules!!! :fearful:
It doesn't use git submodulea but subtree, so at least most people will know how to clone it. 😀
But it definitely should be updated for the package manager. I think I'll look into updating it when sokol zig is released as a package.
Btw @nurpax, I was considering dropping support for the "old" way of using sokol-zig via git submodule (etc...) and importing the build.zig directly, because that could get rid of a couple of things like the optional prefix path.
Using sokol-zig would then look like this (if you don't use wasm-emscripten you can ignore the bottom half of the file, and in that case the const sokol = @import("sokol")
also isn't necessary.
https://github.com/floooh/pacman.zig/blob/zig-0.12.0/build.zig
I thought that the recent breaking API changes in the zig build system would be a good opportunity to switch over to the package manager completely since people need to touch their build files anyway.
I think it makes sense to drop support for the old style! IIRC in my use of sokol I have essentially duplicated the sokol build.zig on my side but I'd prefer to cut over to .zon style usage. My released zig sokol/imgui stuff is probably not used by anyone else than me so as far as I'm concerned, feel free to break the build as much ss you need. (The build breaks will continue until morale improves, as they say 😀)
Looking forward to adding all the utils head! Like sokol_nuklear too :)
I'd been working on trying to get a nice way of compiling ImGui + ImPlot for WASM (amongst other targets), and found that using sokol was the easiest way to do it at the moment. In case it's useful, I've made it available here https://github.com/fjebaker/zig-sokol-imgui-wasm
I used this repo's binding along with the sokol_imgui.h
header and my own wrapper around imgui and implot. It works but the build is a little clunky; e.g. for WASM things you need to reach into various parts of sokol-zig's build.zig
to get libraries linked against emscripten.
I'll see if I can easily add sokol_imgui.h to the official bindings, and then cobble together a little demo outside the sokol-zig repo (the main reason I hadn't done that so far is that I didn't want to add a Dear ImGui dependency to the sokol-zig repository for a sample, but now with the Zig package manager it's easier to do this in a separate repo.
Bah, I'm running into LazyPath
problems in build.zig again.
Need to figure out how to build the sokol C library with a cimgui dependency without actually adding a cimgui dependency to sokol-zig. I thought I could simply do that by calling buildSokolLib() function in the sokol-zig build.zig file directly from a top-level build.zig, but then it doesn't find the sokol C source files since the build system thinks they are in the top-level project instead of the Zig package cache. And so far I'm failing at constructing a valid LazyPath which points into the Zig cache, but also isn't an absolute path (since that's forbidden by the build system).
Ah, nvm, I just need to pass the sokol-dependency builder to that function...
Hmm ok, next problem: cimgui can't be used via build.zig.zon, because it includes imgui as submodule :/
Guess I'll need to copy the cimgui sources into the sample project.
@floooh I have cimgui and cimplot bindings for zig here https://github.com/fjebaker/zig-imgui-implot/blob/main/build.zig
This was originally only for Zig's Mach engine, but it doesn't depend on it, and thanks to Zig's lazy package manager you can just grab the cimgui
and cimplot
artifacts and includes in downstream projects.
Does that help?
I have an example of using these with sokol
here
https://github.com/fjebaker/zig-sokol-imgui-wasm/blob/5cec07ba01df3736fab2b6c7a8da8f3d0c3f40cd/build.zig#L40-L46
The difficulty I was having was getting the emscripten functions that do the linker step for targeting WASM explicitly, but if you don't need that the build.zig script is actually quite well contained. I only needed to add the sokol_imgui.h
header with a tiny sokol_imgui.c
to build the sokol imgui implementation, but that could be upstreamed?
I think I have a solution now that's somewhat flexible and decouples the sokol-zig package from the cimgui dependency (just need to write a couple of readmes and changelogs, and merge everything).
The only change to sokol-zig is a flag which instructs the buildLibSokol()
to include sokol_imgui.c in the build:
...this wouldn't compile though because the cimgui.h header cannot be found. It's the toplevel build.zig's responsibility to add a header search path to the lib_sokol compile step, this means that sokol needs to be integrated 'manually' by calling buildLibSokol()
manually like this:
cimgui itself had to be included directly into the toplevel project, the package manager doesn't work with git submodules.
I haven't looked into Emscripten support yet, the initial version of the sample will only work on native platforms.
Sample code looks like this btw:
https://github.com/floooh/sokol-zig-imgui-sample/blob/main/src/main.zig
PS: will probably wrap up everything tomorrow.
...ok I found a "package manager friendly way" to inject the cimgui header search path into the sokol C library compile step :)
...and more build system goodness curtesy of @geoot: https://github.com/floooh/sokol-zig-imgui-sample/pull/1
Ok, all merged now.
Sample project is here: https://github.com/floooh/sokol-zig-imgui-sample
It would be really nice to have an "official" code-generated Zig cimgui bindings package which is automatically updated when a new tag is created in the cimgui repository (don't know if that's even possible with GH Actions), and which would allow to write imgui code like this:
ig.setNextWindowSize(.{ .x = 400, .y = 100 }, .Once);
...instead of this (which is the '@cImport' version):
ig.igSetNextWindowSize(.{ .x = 400, .y = 100 }, ig.ImGuiCond_Once);
...not sure yet if I want to tackle this myself ;)
Closing this ticket now since from my pov it's fixed :)
Hello, thanks for this library and the many clean and well-commented examples.
Is there an example of how I can use
sokol_imgui.h
with thesokol-zig
bindings. I started to attempt@cImport
-ing the header file directly, but ran into some errors("Please include sokol_app.h before sokol_imgui.h"
) probably because I'm using the Zig bindings.Do you plan on providing Zig bindings for
sokol_imgui.h
? Or is there a way of usingsokol-zig
andsokol_imgui.h
?