From 5968ca324e958d19ad1e140ed3c8b94ac943cf8b Mon Sep 17 00:00:00 2001 From: sam Date: Mon, 2 Sep 2024 12:40:20 +1200 Subject: [PATCH] idk --- include/gear/graphics/renderer.h | 2 +- shaders/simple.glsl | 23 +++++++++++ src/graphics/renderer/renderer.c | 2 +- src/main.c | 65 ++++++++++++++++++++++++++++++++ 4 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 shaders/simple.glsl diff --git a/include/gear/graphics/renderer.h b/include/gear/graphics/renderer.h index 3ed05bf..3be62c8 100644 --- a/include/gear/graphics/renderer.h +++ b/include/gear/graphics/renderer.h @@ -11,7 +11,7 @@ typedef struct g_renderer { } g_renderer; typedef struct g_renderer_object { - sg_bindings bind; + sg_bindings* bind; sg_pipeline pipeline; } g_renderer_object; diff --git a/shaders/simple.glsl b/shaders/simple.glsl new file mode 100644 index 0000000..4c293a1 --- /dev/null +++ b/shaders/simple.glsl @@ -0,0 +1,23 @@ +@vs vs +in vec4 pos; +in vec4 color0; + +out vec4 color; + +void main() { + gl_Position = pos; + color = color0; +} +@end + +@fs fs +in vec4 color; +out vec4 frag_color; + +void main() { + frag_color = color; +} +@end + +@program simple vs fs + diff --git a/src/graphics/renderer/renderer.c b/src/graphics/renderer/renderer.c index 620e5fc..258306a 100644 --- a/src/graphics/renderer/renderer.c +++ b/src/graphics/renderer/renderer.c @@ -9,9 +9,9 @@ void g_renderer_begin(g_renderer* renderer) { void g_renderer_draw(g_renderer* renderer, g_renderer_object object, u32 elements) { if(renderer->bound_pipeline_id != object.pipeline.id) { g_pipeline_bind(renderer, object.pipeline); - sg_apply_bindings(&object.bind); } + sg_apply_bindings(object.bind); sg_draw(0, elements, 1); }; diff --git a/src/main.c b/src/main.c index 31d5419..c385c1f 100644 --- a/src/main.c +++ b/src/main.c @@ -1,19 +1,34 @@ +#include "HandmadeMath/HandmadeMath.h" +#include "gear/base.h" +#include "gear/graphics/pipeline.h" +#include "gear/images.h" +#include "slibs/slibs.h" #include #include #include #include #include +#include +#include #include #include #include #include +#include + #include +#include + g_renderer* renderer; g_camera* camera; g_gui* gui; +g_model* model; +sg_pipeline pipeline; +sg_bindings* bind; +sg_attachments attachments; void init() { sg_setup(&(sg_desc){ @@ -29,12 +44,62 @@ void init() { for(sl_vec_it(layer, gui->layers)) { log_info(" %s", (*layer)->name); } + + g_vertex vertices[] = { + { 1.0f, 1.0f, 0.0f, G_WHITE, 1.0f * 32767, 1.0f * 32767 }, // top right + { 1.0f, -1.0f, 0.0f, G_WHITE, 1.0f * 32767, 0.0f * 32767 }, // bottom right + { -1.0f, -1.0f, 0.0f, G_WHITE, 0.0f * 32767, 0.0f * 32767 }, // bottom left + { -1.0f, 1.0f, 0.0f, G_WHITE, 0.0f * 32767, 1.0f * 32767 } // top left + }; + + uint32_t indices[] = { + 0, 1, 3, + 1, 2, 3 + }; + + g_vertex_vec vertices_vec = { 0 }; + g_index_vec indices_vec = { 0 }; + sl_vec_from_arr(vertices_vec, vertices); + sl_vec_from_arr(indices_vec, indices); + + model = g_model_create(&vertices_vec, &indices_vec); + + bind = calloc(1, sizeof(sg_bindings)); + bind->vertex_buffers[0] = model->vertex_buffer; + bind->index_buffer = model->index_buffer; + + g_texture* texture = g_texture_create_filtered(g_image_default(), SG_FILTER_NEAREST, SG_FILTER_NEAREST); + bind->fs.images[SLOT_tex] = texture->image; + bind->fs.samplers[SLOT_smp] = texture->sampler; + + sg_shader shd = sg_make_shader(transform_shader_desc(sg_query_backend())); + + pipeline = g_pipeline_create(shd, (sg_vertex_layout_state){ + .attrs = { + [ATTR_vs_pos].format = SG_VERTEXFORMAT_FLOAT3, + [ATTR_vs_color0].format = SG_VERTEXFORMAT_UBYTE4N, + [ATTR_vs_texcoord0].format = SG_VERTEXFORMAT_SHORT2N, + } + }); } void frame() { g_gui_update(gui); g_renderer_begin(renderer); + g_pipeline_bind(renderer, pipeline); + + vs_params_t vs_params = { + .mvp = HMM_Mul(g_camera_matrix(camera), HMM_Rotate_LH(HMM_AngleDeg(45.0f), HMM_V3(1.0f, 0.0f, 0.0f))), + .texture_scale = HMM_V2(1.0f, 1.0f) + }; + + sg_apply_uniforms(SG_SHADERSTAGE_VS, SLOT_vs_params, SG_RANGE_REF(vs_params)); + + g_renderer_draw(renderer, (g_renderer_object){ + .pipeline = pipeline, + .bind = bind + }, model->indices.size); g_gui_render(sapp_width(), sapp_height()); g_renderer_end(renderer); }