From 67a6e57eb66d70e92cc508524c30af82df90ce45 Mon Sep 17 00:00:00 2001 From: onelin Date: Sat, 22 Mar 2025 17:11:28 +0100 Subject: Are we cooking yet? --- src/rendering/include/engine/rendering/rendering.h | 2 +- src/rendering/src/rendering.c | 90 +++++++++++++++++----- 2 files changed, 73 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/rendering/include/engine/rendering/rendering.h b/src/rendering/include/engine/rendering/rendering.h index ffc6267..e969e0a 100644 --- a/src/rendering/include/engine/rendering/rendering.h +++ b/src/rendering/include/engine/rendering/rendering.h @@ -157,7 +157,7 @@ typedef struct { // Index of the model in the RenderBatch models buffer usize model_idx; // The transformation of the model - Transform transorm; + Transform transform; } BatchModelInstance; typedef struct { diff --git a/src/rendering/src/rendering.c b/src/rendering/src/rendering.c index 26805c8..387dfef 100644 --- a/src/rendering/src/rendering.c +++ b/src/rendering/src/rendering.c @@ -340,6 +340,9 @@ i32 renderbatch_add_ext(RenderBatch* renderbatch, RenderObject* obj, Transform* // Shader, VAO, modelviewprojection, and texture, are set when the shaderobj // is actually created with RenderObject_new later. // The number of buffers should be the same. + //renderbatch->renderobj.shader = obj->shader; + //renderbatch->renderobj.texture = obj->texture; + renderbatch->renderobj.buffer_len = obj->buffer_len; if (renderbatch->renderobj.buffer == NULL) { renderbatch->renderobj.buffer = calloc(obj->buffer_len, sizeof(ShaderBuffer)); @@ -360,36 +363,87 @@ i32 renderbatch_add_ext(RenderBatch* renderbatch, RenderObject* obj, Transform* } } - // Concatenate the buffers - for (usize i = 0; i < renderbatch->renderobj.buffer_len; i++) { - shaderbuffer_cat(&renderbatch->renderobj.buffer[i], &obj->buffer[i]); - } + //// Only concatenate the buffers once we refresh + //for (usize i = 0; i < renderbatch->renderobj.buffer_len; i++) { + // shaderbuffer_cat(&renderbatch->renderobj.buffer[i], &obj->buffer[i]); + //} + + model_idx = (isize)renderbatch->mcount; + renderbatch->models[renderbatch->mcount++] = obj; } - renderbatch->models[renderbatch->mcount++] = obj; + // Create batch instance + // Check if there's room enough + if ((1 + renderbatch->inst_count) * sizeof(BatchModelInstance) > renderbatch->inst_size) { + // Realloc if necessary + const usize sz = renderbatch->inst_size * 2; + renderbatch->models = realloc(renderbatch->instances, sz); + renderbatch->msize = sz; + } - return (i32)renderbatch->mcount - 1; + BatchModelInstance inst = { + .model_idx = (usize)model_idx, + .transform = *t, + }; + + // Add it to the batch + renderbatch->instances[renderbatch->inst_count++] = inst; + + // Return instance index + return (i32)renderbatch->inst_count - 1; } -// renderbatch_refresh: Copy all models in the renderbatch to the batchs' model. +// renderbatch_refresh: Copy all instances/models in the renderbatch to the +// batchs' model. int renderbatch_refresh(RenderBatch* renderbatch) { const usize bufs = renderbatch->renderobj.buffer_len; usize *offsets = calloc(bufs, sizeof(usize)); - for (usize m = 0; m < renderbatch->mcount; m++) { + // Reset renderobj buffers + for (usize b = 0; b < renderbatch->renderobj.buffer_len; b++) { + // Zero the old data + renderbatch->renderobj.buffer[b].count = 0; + memset(renderbatch->renderobj.buffer[b].data, 0, renderbatch->renderobj.buffer[b].size); + } + + // Copy the instances models buffers, and vertex position buffers with translations applied + for (usize i = 0; i < renderbatch->inst_count; i++) { + const usize m = renderbatch->instances[i].model_idx; const RenderObject* model = renderbatch->models[m]; + Transform t = renderbatch->instances[i].transform; - // Copy every buffer in every object - for (usize b = 0; b < model->buffer_len; b++) { - const ShaderBuffer* buf = &model->buffer[b]; - const usize bsize = buf->size_elem * buf->count; - memcpy(renderbatch->renderobj.buffer[b].data + offsets[b], - buf->data, - bsize - ); - offsets[b] += bsize; - } + for (usize b = 0; b < renderbatch->renderobj.buffer_len; b++) { + shaderbuffer_cat(&renderbatch->renderobj.buffer[b], &model->buffer[b]); + if (ShaderBuffer_Type_vertexPosition == ShaderBuffer_get_gl_type(renderbatch->renderobj.buffer[b].buffertype)) { + if (ShaderBuffer_DataType_f32 == ShaderBuffer_get_data_type(renderbatch->renderobj.buffer[b].buffertype)) { + WARN("Buffer data type is not f32, skipping transformation..."); + continue; + } + // Apply transformation in renderbatch buffer-memory + + float *data = renderbatch->renderobj.buffer[b].data; + const usize len = model->buffer[b].count; + data = &data[renderbatch->renderobj.buffer[b].count - len]; + + if (model->buffer[b].components == 2) { + for (usize v = 0; v < len; v += 2) { + // scale + // rotate + // offset + glm_vec2_add(&data[v], t.position, &data[v]); + } + } + else if (model->buffer[b].components == 3) { + for (usize v = 0; v < len; v += 3) { + // scale + // rotate + // offset + glm_vec3_add(&data[v], t.position, &data[v]); + } + } + } + } } free(offsets); -- cgit v1.3