Makefile working with imgui

This commit is contained in:
2026-04-27 13:41:50 +02:00
parent 0fed24b3c4
commit 21476a3b95
11 changed files with 187 additions and 131 deletions

View File

@@ -1,29 +1,26 @@
#ifndef API_DEFINITION
#define API_DEFINITION
#define CIMGUI_DEFINE_ENUMS_AND_STRUCTS
#define SOKOL_IMPL
#define SOKOL_WGPU
#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT
#define NK_INCLUDE_FONT_BAKING
#define NK_INCLUDE_DEFAULT_ALLOCATOR
#define NK_INCLUDE_DEFAULT_FONT
#define NK_IMPLEMENTATION
#define SOKOL_IMGUI_IMPL
#include "sokol_gfx.h"
#include "sokol_app.h"
#include "sokol_glue.h"
#include "sokol_log.h"
#include "nuklear.h"
#include "util/sokol_memtrack.h"
#include "util/sokol_nuklear.h"
#include "cimgui.h"
#include "sokol_imgui.h"
#include "sokol_memtrack.h"
#include "math.h"
#include "rand.h"
#include "util.h"
#include "sprite.h"
#include "generated/sprite.wgsl.h"
#include "generated/sprite.h"
#include <stdio.h>
#include <stdlib.h>

View File

@@ -140,6 +140,6 @@ unsigned char src_shaders_sprite_wgsl[] = {
0x6d, 0x70, 0x2c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x75, 0x76,
0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x3b,
0x0d, 0x0a, 0x7d, 0x0d, 0x0a
0x0d, 0x0a, 0x7d
};
unsigned int src_shaders_sprite_wgsl_len = 1697;
unsigned int src_shaders_sprite_wgsl_len = 1695;

View File

@@ -54,23 +54,6 @@ void compute_mvp(userdata_t *userdata)
static void frame(void* _userdata)
{
userdata_t* userdata = (userdata_t*) _userdata;
struct nk_context *nk_ctx = snk_new_frame();
if(nk_begin(nk_ctx, "Menu", nk_rect(20, 20, 600, 200), NK_WINDOW_BORDER | NK_WINDOW_BACKGROUND | NK_WINDOW_MOVABLE | NK_WINDOW_CLOSABLE))
{
nk_layout_row_dynamic(nk_ctx, 0, 1);
nk_label(nk_ctx, format("Frame duration: %.4fms", sapp_frame_duration() * 1000.0), NK_TEXT_ALIGN_CENTERED);
nk_layout_row_dynamic(nk_ctx, 0, 1);
nk_label(nk_ctx, format("Zoom: %.3f", userdata->zoom), NK_TEXT_ALIGN_CENTERED);
nk_layout_row_dynamic(nk_ctx, 0, 1);
nk_label(nk_ctx, format("Pan: %.3f/%.3f", userdata->pan.x, userdata->pan.y), NK_TEXT_ALIGN_CENTERED);
}
nk_end(nk_ctx);
sg_begin_pass(&(sg_pass){
.action = userdata->renderer.clear_pass,
@@ -89,7 +72,8 @@ static void frame(void* _userdata)
if(texture->dirty)
{
const sg_range range = vector_range(&texture->sprites);
sg_update_buffer(texture->binding.storage_buffers[0], &range);
sg_buffer buf = sg_query_view_buffer(texture->binding.views[1]);
sg_update_buffer(buf, &range);
texture->dirty = false;
}
@@ -100,8 +84,6 @@ static void frame(void* _userdata)
}
}
snk_render(userdata->width, userdata->height);
sg_end_pass();
sg_commit();
}
@@ -128,6 +110,12 @@ static void init(void* _userdata)
{2.0f, -2.0f}, // top right
{-2.0f, -2.0f}, // top left
};
const vec2f uv[4] = {
{0.0f, 1.0f}, // bottom left
{1.0f, 1.0f}, // bottom right
{1.0f, 0.0f}, // top right
{0.0f, 0.0f}, // top left
};
const uint16_t indices[] = {
0, 1, 2, 0, 2, 3,
};
@@ -146,12 +134,21 @@ static void init(void* _userdata)
.source = (const char*) src_shaders_sprite_wgsl,
.entry = "fs_main",
},
.images = {
.views = {
[0] = {
.stage = SG_SHADERSTAGE_FRAGMENT,
.image_type = SG_IMAGETYPE_2D,
.wgsl_group1_binding_n = 0,
.sample_type = SG_IMAGESAMPLETYPE_FLOAT,
.texture = {
.stage = SG_SHADERSTAGE_FRAGMENT,
.image_type = SG_IMAGETYPE_2D,
.wgsl_group1_binding_n = 0,
.sample_type = SG_IMAGESAMPLETYPE_FLOAT,
},
},
[1] = {
.storage_buffer = {
.stage = SG_SHADERSTAGE_VERTEX,
.readonly = true,
.wgsl_group1_binding_n = 2,
},
},
},
.samplers = {
@@ -161,20 +158,13 @@ static void init(void* _userdata)
.wgsl_group1_binding_n = 1,
}
},
.image_sampler_pairs = {
.texture_sampler_pairs = {
[0] = {
.stage = SG_SHADERSTAGE_FRAGMENT,
.image_slot = 0,
.view_slot = 0,
.sampler_slot = 0,
}
},
.storage_buffers = {
[0] = {
.wgsl_group1_binding_n = 2,
.stage = SG_SHADERSTAGE_VERTEX,
.readonly = true,
},
},
.uniform_blocks = {
[0] = {
.size = sizeof(uniform_t),
@@ -190,13 +180,14 @@ static void init(void* _userdata)
userdata->renderer = (renderer_t) {
.clear_pass = (sg_pass_action) {
.colors[0] = { .clear_value = { 1.0f, 1.0f, 1.0f, 1.0f }, .load_action = SG_LOADACTION_CLEAR }
.colors[0] = { .clear_value = { 0.0f, 0.0f, 0.0f, 1.0f }, .load_action = SG_LOADACTION_CLEAR }
},
.pipeline = sg_make_pipeline(&(sg_pipeline_desc) {
.shader = sprite_shader,
.index_type = SG_INDEXTYPE_UINT16,
.layout.attrs = {
[0].format = SG_VERTEXFORMAT_FLOAT2,
[1].format = SG_VERTEXFORMAT_FLOAT2,
},
.label = "Sprite pipeline",
}),
@@ -213,15 +204,6 @@ static void init(void* _userdata)
gs_init(&userdata->manager);
compute_mvp(userdata);
snk_setup(&(snk_desc_t) {
.enable_set_mouse_cursor = true,
.logger.func = slog_func,
.allocator = {
.alloc_fn = smemtrack_alloc,
.free_fn = smemtrack_free,
},
});
}
static void cleanup(void* _userdata)
@@ -232,7 +214,6 @@ static void cleanup(void* _userdata)
FREE(userdata);
snk_shutdown();
sg_shutdown();
}
@@ -240,9 +221,6 @@ static void event(const sapp_event* event, void* _userdata)
{
userdata_t* userdata = (userdata_t*) _userdata;
if(snk_handle_event(event))
return;
switch(event->type)
{
case SAPP_EVENTTYPE_FILES_DROPPED:
@@ -264,9 +242,7 @@ static void event(const sapp_event* event, void* _userdata)
.buffer = (sapp_range) { .ptr = buffer, .size = size },
.dropped_file_index = i,
.callback = gs_import_file,
.user_data = &(import_t) {
.userdata = userdata,
},
.user_data = userdata
});
}

View File

@@ -53,4 +53,4 @@ struct FsO { //Fragment shader output
output.color = textureSample(tex, samp, input.uv);
return output;
}
}

View File

@@ -23,24 +23,19 @@ typedef struct manager_t {
vector_t textures;
} manager_t;
typedef struct import_t {
userdata_t *userdata;
} import_t;
typedef struct loader_t {
uint8_t buffer[MAX_FILE_SIZE];
} loader_t;
typedef void (*ForEachTexture)(texture_t *texture, userdata_t *userdata);
typedef void (*ForEachSprite)(sprite_t *sprite, userdata_t *userdata);
typedef void (*ForEachTexture)(texture_t *texture, void *userdata);
typedef void (*ForEachSprite)(sprite_t *sprite, void *userdata);
void gs_init(manager_t *manager);
void gs_shutdown(manager_t *manager);
void gs_import_file(const sapp_html5_fetch_response *response);
void gs_each_textures(manager_t *manager, ForEachTexture callback, userdata_t *userdata);
void gs_each_sprites(manager_t *manager, ForEachSprite callback, userdata_t *userdata);
void gs_each_textures(manager_t *manager, ForEachTexture callback, void *userdata);
void gs_each_sprites(manager_t *manager, ForEachSprite callback, void *userdata);
void gs_init(manager_t *manager)
{
@@ -51,7 +46,7 @@ void gs_shutdown(manager_t *manager)
vector_free(&manager->textures);
}
void fs_import_file(const sapp_html5_fetch_response *response)
void gs_import_file(const sapp_html5_fetch_response *response)
{
const char* filename = sapp_get_dropped_file_path(response->file_index);
@@ -64,12 +59,12 @@ void fs_import_file(const sapp_html5_fetch_response *response)
//Toast error
}
}
void gs_each_textures(manager_t *manager, ForEachTexture callback, userdata_t *userdata)
void gs_each_textures(manager_t *manager, ForEachTexture callback, void *userdata)
{
for(uint32_t i = 0; i < manager->textures.size; i++)
callback((texture_t*) manager->textures.data[i], userdata);
}
void gs_each_sprites(manager_t *manager, ForEachSprite callback, userdata_t *userdata)
void gs_each_sprites(manager_t *manager, ForEachSprite callback, void *userdata)
{
for(uint32_t i = 0; i < manager->textures.size; i++)
{