Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Nuklear example #50

Closed
sherjilozair opened this issue Jun 9, 2018 · 8 comments
Closed

Nuklear example #50

sherjilozair opened this issue Jun 9, 2018 · 8 comments
Assignees

Comments

@sherjilozair
Copy link

Would be nice to have a nuklear example (instead or over imgui), since nuklear and sokol are C while imgui is C++.

@floooh
Copy link
Owner

floooh commented Jun 9, 2018

good idea, I have one here for Oryol: https://github.com/floooh/oryol-samples/blob/master/src/NuklearUIBasic/NuklearUIBasic.cc, should be fairly easy to adopt

@floooh floooh self-assigned this Jun 9, 2018
@sherjilozair
Copy link
Author

sherjilozair commented Jun 11, 2018

Hi @floooh,

I've been trying to do this myself by modifying the nuklear_sdl_gl3 example. Here's my work-in-progress. I'm very inexperienced at opengl and graphics programming, so for give my naiveté, but it seems sokol_gfx needs to support a version of sg_draw which can take in an offset, since it seems nuklear dumps all the data into the same buffer. Oryol has this feature, so maybe sokol should as well? Again, I'm very new to all this, so my apologies for being presumptuous.

Thanks, btw, for the very cool library. The code's very readable, and I'm learning a lot by using/reading it.

@sherjilozair
Copy link
Author

sherjilozair commented Jun 11, 2018

Never mind, I found that draw_state has index_buffer_offset which should work fine. I'm now trying to figure out how to translate glMapBuffer into sokol_gfx.

I guess since sokol_gfx aims to be compatible with gles2, it won't have the functionality equivalent to glMapBuffer? In which case, I'm guessing I'd need to duplicate buffers in CPU and GPU, and then use sg_update_buffer.

@floooh
Copy link
Owner

floooh commented Jun 11, 2018

Yep, problem with glMapBuffer is that it isn't supported in WebGL or WebGL2 at all.

But it's not so bad with Nuklear, since it has all the required vertex- and index-data in 2 continuous chunks already, check out the Nuklear rendering code in the Oryol Nuklear wrapper, for sokol-gfx it would be similar (Oryol has separate calls for Gfx::UpdateVertices and Gfx::UpdateIndices, these would be 2 calls to sg_update_buffer() in sokol-gfx:

https://github.com/floooh/oryol-nuklear/blob/b854097872600ca391ae4f5f2aa8862183630af4/src/NKUI/nkuiWrapper.cc#L231

PS: also see here for initialization of the "nuklear buffers": https://github.com/floooh/oryol-nuklear/blob/b854097872600ca391ae4f5f2aa8862183630af4/src/NKUI/nkuiWrapper.cc#L37

@sherjilozair
Copy link
Author

I get an error from nuklear when I replace the GL code with sokol code. This is the error: Assertion failed: (list->cmd_count), function nk_draw_list_command_last, file ./nuklear.h, line 9291., and the code's here: https://github.com/sherjilozair/nuklear-sokol. Run make and then bin/demo for the repro. Most of the changes are in nk_glfw3_device_create and nk_glfw3_render in the file nuklear_glfw_gl3.h. Do you perhaps see any mistakes I'm making?

@kavika13
Copy link

I just got sokol + sokol_app + nuklear to play nicely together on Windows + OGL 3.3.

Would you be interested in a PR to the sokol-examples repo? I can clean up a few things first, but would probably need help with some of the rest of it:

  1. I didn't set things up to use fips properly, or quite fit in perfectly with the sample app template system. I can probably handle this.
  2. I haven't implemented anything but windows OGL 3.3. I also don't really have a mac handy to test out metal, though I could probably handle most of the other renders easily enough. I could probably copy-pasta-modify the imgui version of the metal shaders, but not test them.
  3. Input is a bit funky since the design of Nuklear seems to need a callback before and after the event queue iterator is pumped, whereas sokol_app seems to not really provide callbacks at those times. I can easily "get it working" with a few global variables to aggregate the most recent event state, and some care to deal with swapping app focus, but maybe you have a better idea. See: Add sokol_app callback before event queue is iterated (or add an input polling API) #293
  4. I didn't try to pull the nuklear or sokol boilerplate out into a separate file, the way it seems to be for the sokol imgui sample apps. I also don't think I'm fully in the headspace of the project to do that extraction, so I'd probably need help with that part.

@floooh
Copy link
Owner

floooh commented May 12, 2020

Would you be interested in a PR to the sokol-examples repo?

Yes :)

I haven't implemented anything but windows OGL 3.3. I also don't really have a mac handy to test out metal, though I could probably handle most of the other renders easily enough.

I can take care of that.

Input is a bit funky since the design of Nuklear

See my comments in the issue thread: #293, maybe we can come up with a solution similar to how I handle input in Dear ImGui without sokol_app.h changes...

I didn't try to pull the nuklear or sokol boilerplate

That's fine, a self-contained sample makes sense as first step (that's also how I started with the Dear ImGui integration), a next step later could then be to put the Nuklear wrapper code into a sokol_nuklear.h header, similar to the sokol_imgui.h header.

@floooh
Copy link
Owner

floooh commented Feb 13, 2021

I just merged a sokol_nuklear.h backend and example, contributed by @wmerrifield :)

@floooh floooh closed this as completed Feb 13, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants