summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author0undefined <oscar@nelin.dk>2025-03-17 20:40:34 +0000
committeronelin <oscar@nelin.dk>2025-03-17 20:42:00 +0000
commit4af788b4a0d05dbf6816a21aeee2d233fb4e87e6 (patch)
tree775d8ba93db54edfd608877b3b5bfec12618e27a
parente1840f1319fd1884bfd8e8a73d2c0b82b2965ae6 (diff)
Fix renderbatch_refresh
-rw-r--r--src/rendering/include/engine/rendering/rendering.h4
-rw-r--r--src/rendering/src/rendering.c32
2 files changed, 20 insertions, 16 deletions
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
);