From f9a16f61f54993f3ae570b168ee15fc311229d91 Mon Sep 17 00:00:00 2001 From: onelin Date: Sat, 22 Mar 2025 15:52:57 +0100 Subject: Brewing --- src/rendering/include/engine/rendering/rendering.h | 24 ++++++++++++++- src/rendering/src/rendering.c | 35 +++++++++++++++------- 2 files changed, 47 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/rendering/include/engine/rendering/rendering.h b/src/rendering/include/engine/rendering/rendering.h index c5f805e..ffc6267 100644 --- a/src/rendering/include/engine/rendering/rendering.h +++ b/src/rendering/include/engine/rendering/rendering.h @@ -57,6 +57,12 @@ typedef struct { u32 program; } Shader; +typedef struct { + vec3 position; + vec3 size; + mat4 rotation; +} Transform; + typedef enum { ShaderBufferFlag_none = 0x00, @@ -72,7 +78,8 @@ typedef enum { // Next 3 bytes describe the buffer type ShaderBuffer_Type_vertexData = 0b0000001000000, // 64 - ShaderBuffer_Type_vertexIndex = 0b0000010000000, // 128 + ShaderBuffer_Type_vertexPosition = 0b0000010000000, // 128 + ShaderBuffer_Type_vertexIndex = 0b0000011000000, // 192 // Next 4 bytes are designated for the data type ShaderBuffer_DataType_nil = 0b0001000000000, // 512 @@ -146,6 +153,13 @@ typedef struct { ShaderBuffer* buffer; } RenderObject; +typedef struct { + // Index of the model in the RenderBatch models buffer + usize model_idx; + // The transformation of the model + Transform transorm; +} BatchModelInstance; + typedef struct { // Size of models buffer usize msize; @@ -154,6 +168,13 @@ typedef struct { // Pointers to original models in this batch RenderObject **models; + // Size of instance buffer + usize inst_size; + // number of instances in the `instances` buffer + usize inst_count; + // Pointers to original models in this batch + BatchModelInstance *instances; + // The rendered destination object RenderObject renderobj; } RenderBatch; @@ -252,6 +273,7 @@ RenderObject RenderObject_new( int renderbatch_new(RenderBatch* renderbatch, usize count); int renderbatch_add(RenderBatch* renderbatch, RenderObject* obj); +i32 renderbatch_add_ext(RenderBatch* renderbatch, RenderObject* obj, Transform* t); int renderbatch_refresh(RenderBatch* renderbatch); Shader compile_shader(const char* file_path, const ShaderType shader_type); diff --git a/src/rendering/src/rendering.c b/src/rendering/src/rendering.c index 6f6e55b..9f13998 100644 --- a/src/rendering/src/rendering.c +++ b/src/rendering/src/rendering.c @@ -46,6 +46,8 @@ u32 ShaderBuffer_get_gl_type(u64 flags) { switch(ShaderBuffer_get_type(flags)) { case ShaderBuffer_Type_vertexData: return GL_ARRAY_BUFFER; + case ShaderBuffer_Type_vertexPosition: + return GL_ARRAY_BUFFER; case ShaderBuffer_Type_vertexIndex: return GL_ELEMENT_ARRAY_BUFFER; default: @@ -124,7 +126,7 @@ int renderbatch_new(RenderBatch* renderbatch, usize count) { * pos; * rotation; * }; - * } ; + * }; * * For this to work we will likely need to extend the shaderbuffer struct to * also hold what type of data the buffer contains, s.t. we can apply the @@ -139,26 +141,33 @@ int renderbatch_new(RenderBatch* renderbatch, usize count) { return -1; } + usize numisnstances = count; + if (count == 0) { // Just allocate enough for a couple hundred - count = 255; + count = 256; + numisnstances = count * 4; } - //GladGLContext* restrict gl = GLOBAL_PLATFORM->window->context; - //u32 vbo = 0; - //gl->CreateBuffers(1, &vbo); - //gl->BindBuffer(GL_ARRAY_BUFFER, vbo); - //gl->BufferData(GL_ARRAY_BUFFER, 0, NULL, GL_DYNAMIC_DRAW); - //gl->VertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 0); renderbatch->msize = sizeof(RenderObject) * count; renderbatch->mcount = 0; - renderbatch->models = (RenderObject**)malloc(sizeof(RenderObject*) * count); + renderbatch->inst_size = sizeof(BatchModelInstance) * numisnstances; + renderbatch->inst_count = 0; + renderbatch->models = (RenderObject**)calloc(count, sizeof(RenderObject*)); + if (renderbatch->models == NULL) { ERROR("Failed to allocate %lu size of bytes for models array!", sizeof(RenderObject*) * count); return -1; } + renderbatch->instances = (BatchModelInstance*)calloc(numisnstances, sizeof(BatchModelInstance)); + + if (renderbatch->instances == NULL) { + ERROR("Failed to allocate %lu size of bytes for batch instances array!", sizeof(BatchModelInstance) * numisnstances); + return -1; + } + memset(&(renderbatch->renderobj), 0, sizeof(RenderObject)); return 0; @@ -204,7 +213,7 @@ ShaderBuffer* shaderbuffer_cat(ShaderBuffer* dst, ShaderBuffer *restrict src) { // Add a render object to the render batch. // In reality we only add the buffer stuff to each of the batchs' renderobject // buffers -int renderbatch_add(RenderBatch* renderbatch, RenderObject* obj) { +i32 renderbatch_add(RenderBatch* renderbatch, RenderObject* obj) { if (renderbatch == NULL) { ERROR("renderbatch was null!"); return -1; @@ -277,7 +286,11 @@ int renderbatch_add(RenderBatch* renderbatch, RenderObject* obj) { //renderbatch->renderobj.buffer_len += obj->buffer_len; //} - return 0; + return (i32)renderbatch->mcount - 1; +} + +i32 renderbatch_add_ext(RenderBatch* renderbatch, RenderObject* obj, Transform* t) { + return -1; } // renderbatch_refresh: Copy all models in the renderbatch to the batchs' model. -- cgit v1.3