From 4af788b4a0d05dbf6816a21aeee2d233fb4e87e6 Mon Sep 17 00:00:00 2001 From: 0undefined Date: Mon, 17 Mar 2025 21:40:34 +0100 Subject: Fix renderbatch_refresh --- src/rendering/include/engine/rendering/rendering.h | 4 +-- src/rendering/src/rendering.c | 32 ++++++++++++---------- 2 files changed, 20 insertions(+), 16 deletions(-) (limited to 'src/rendering') diff --git a/src/rendering/include/engine/rendering/rendering.h b/src/rendering/include/engine/rendering/rendering.h index 42464d4..b984176 100644 --- a/src/rendering/include/engine/rendering/rendering.h +++ b/src/rendering/include/engine/rendering/rendering.h @@ -137,8 +137,8 @@ typedef struct { usize msize; // number of models in the `models` buffer usize mcount; - // The original models in this batch - RenderObject *models; + // Pointers to original models in this batch + RenderObject **models; // The rendered destination object RenderObject renderobj; diff --git a/src/rendering/src/rendering.c b/src/rendering/src/rendering.c index f0c19b7..09af019 100644 --- a/src/rendering/src/rendering.c +++ b/src/rendering/src/rendering.c @@ -68,9 +68,9 @@ int renderbatch_new(RenderBatch* renderbatch, usize count) { renderbatch->msize = sizeof(RenderObject) * count; renderbatch->mcount = 0; - renderbatch->models = (RenderObject*)malloc(sizeof(RenderObject) * count); + renderbatch->models = (RenderObject**)malloc(sizeof(RenderObject*) * count); if (renderbatch->models == NULL) { - ERROR("Failed to allocate %lu size of bytes for models array!", sizeof(RenderObject) * count); + ERROR("Failed to allocate %lu size of bytes for models array!", sizeof(RenderObject*) * count); return -1; } @@ -127,13 +127,13 @@ int renderbatch_add(RenderBatch* renderbatch, RenderObject* obj) { // Check if we have initialized models array if (renderbatch->models == NULL) { - const usize sz = 8 * sizeof(RenderObject); - renderbatch->models = malloc(8 * sizeof(RenderObject)); + const usize sz = 8 * sizeof(RenderObject*); + renderbatch->models = calloc(8, sizeof(RenderObject*)); renderbatch->msize = sz; renderbatch->mcount = 0; // Check if there's room enough - } else if ((renderbatch->mcount + 1) * sizeof(RenderObject) > renderbatch->msize) { + } else if ((renderbatch->mcount + 1) * sizeof(RenderObject*) > renderbatch->msize) { const usize sz = renderbatch->msize * 2; renderbatch->models = realloc(renderbatch->models, sz); renderbatch->msize = sz; @@ -146,20 +146,22 @@ int renderbatch_add(RenderBatch* renderbatch, RenderObject* obj) { renderbatch->renderobj.buffer_len = obj->buffer_len; renderbatch->renderobj.buffer = calloc(obj->buffer_len, sizeof(ShaderBuffer)); + // Copy the buffers for (usize i = 0; i < renderbatch->renderobj.buffer_len; i++) { const usize sz = obj->buffer[i].size_elem * obj->buffer[i].count; + // Round up to nearest multiple of 4096 byte + const usize newsz = (1 + (sz / 4096)) * 4096; - renderbatch->renderobj.buffer[i].count += obj->buffer[i].count; renderbatch->renderobj.buffer[i].buffername = 0; + renderbatch->renderobj.buffer[i].buffertype = obj->buffer[i].buffertype; + renderbatch->renderobj.buffer[i].size = newsz; + renderbatch->renderobj.buffer[i].count += obj->buffer[i].count; // Copy meta data renderbatch->renderobj.buffer[i].components = obj->buffer[i].components; renderbatch->renderobj.buffer[i].buffertype = obj->buffer[i].buffertype; renderbatch->renderobj.buffer[i].size_elem = obj->buffer[i].size_elem; - // Round up to nearest multiple of 4096 byte - const usize newsz = (1 + (sz / 4096)) * 4096; - renderbatch->renderobj.buffer[i].size = newsz; renderbatch->renderobj.buffer[i].data = malloc(newsz); memcpy(renderbatch->renderobj.buffer[i].data, obj->buffer[i].data, sz); } @@ -172,6 +174,8 @@ int renderbatch_add(RenderBatch* renderbatch, RenderObject* obj) { shaderbuffer_cat(&renderbatch->renderobj.buffer[i], &obj->buffer[i]); } + renderbatch->models[renderbatch->mcount++] = obj; + /* // If this is the first object, copy all its rendering params if (renderbatch->mcount == 0) { @@ -187,7 +191,6 @@ int renderbatch_add(RenderBatch* renderbatch, RenderObject* obj) { //if (renderbatch->mcount != 0) { //renderbatch->renderobj.buffer_len += obj->buffer_len; //} - renderbatch->mcount++; return 0; } @@ -195,15 +198,16 @@ int renderbatch_add(RenderBatch* renderbatch, RenderObject* obj) { // renderbatch_refresh: Copy all models in the renderbatch to the batchs' model. int renderbatch_refresh(RenderBatch* renderbatch) { const usize bufs = renderbatch->renderobj.buffer_len; - isize *offsets = calloc(bufs, sizeof(isize)); + usize *offsets = calloc(bufs, sizeof(usize)); for (usize m = 0; m < renderbatch->mcount; m++) { + const RenderObject* model = renderbatch->models[m]; // Copy every buffer in every object - for (usize b = 0; b < renderbatch->models[m].buffer_len; b++) { - const ShaderBuffer* buf = &renderbatch->models[m].buffer[b]; + 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] + offsets[b], + memcpy(renderbatch->renderobj.buffer[b].data + offsets[b], buf->data, bsize ); -- cgit v1.3