You've already forked flecs_tests
Makefile working with imgui
This commit is contained in:
17
src/api.h
17
src/api.h
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
78
src/main.c
78
src/main.c
@@ -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
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -53,4 +53,4 @@ struct FsO { //Fragment shader output
|
||||
output.color = textureSample(tex, samp, input.uv);
|
||||
|
||||
return output;
|
||||
}
|
||||
}
|
||||
19
src/sprite.h
19
src/sprite.h
@@ -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++)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user