diff options
| author | onelin <oscar@nelin.dk> | 2025-03-17 16:52:45 +0000 |
|---|---|---|
| committer | onelin <oscar@nelin.dk> | 2025-03-17 16:52:45 +0000 |
| commit | a7b73304bc13099590d081c0912c9006bb2abbc9 (patch) | |
| tree | bcabc691aa5faf995631a79e1f1d8a0c1e876889 /src | |
| parent | f28fd28c84086d17cc0b7bdf2ff03df433837515 (diff) | |
Fix batch refreshing
Diffstat (limited to 'src')
| -rw-r--r-- | src/rendering/include/engine/rendering/rendering.h | 16 | ||||
| -rw-r--r-- | src/rendering/src/rendering.c | 20 |
2 files changed, 24 insertions, 12 deletions
diff --git a/src/rendering/include/engine/rendering/rendering.h b/src/rendering/include/engine/rendering/rendering.h index b022117..a39e00c 100644 --- a/src/rendering/include/engine/rendering/rendering.h +++ b/src/rendering/include/engine/rendering/rendering.h @@ -90,13 +90,13 @@ typedef struct { // Array, access, and data, type. u32 buffertype; // Buffer size of `data`. To get the size of the actual data, size_elem * count - isize size; + usize size; // Number of elements - isize count; + usize count; // components per generic vertex attribute (ie, 3 for RGB, 2 for UV) - isize components; + usize components; // size of each element - isize size_elem; + usize size_elem; // Pointer to the data void* data; } ShaderBuffer; @@ -134,13 +134,13 @@ typedef struct { typedef struct { // Size of models buffer - isize msize; + usize msize; // number of models in the `models` buffer - isize mcount; - + usize mcount; + // The original models in this batch RenderObject *models; - // Size and count of vertices + // The rendered destination object RenderObject renderobj; } RenderBatch; diff --git a/src/rendering/src/rendering.c b/src/rendering/src/rendering.c index 9ffd970..679a07e 100644 --- a/src/rendering/src/rendering.c +++ b/src/rendering/src/rendering.c @@ -194,13 +194,25 @@ int renderbatch_add(RenderBatch* renderbatch, RenderObject* obj) { // renderbatch_refresh: Copy all models in the renderbatch to the batchs' model. int renderbatch_refresh(RenderBatch* renderbatch) { - isize offset = 0; - for (isize i = 0; i < renderbatch->mcount; i++) { - memcpy(renderbatch->renderobj.buffer + offset, renderbatch->models[i].buffer, renderbatch->models[i].buffer_len); + const usize bufs = renderbatch->renderobj.buffer_len; + isize *offsets = calloc(bufs, sizeof(isize)); + + for (usize m = 0; m < renderbatch->mcount; 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]; + const usize bsize = buf->size_elem * buf->count; + memcpy(&renderbatch->renderobj.buffer[b] + offsets[b], + buf->data, + bsize + ); + offsets[b] += bsize; + } - offset += renderbatch->models[i].buffer_len; } + free(offsets); return 0; } |
