summaryrefslogtreecommitdiff
path: root/src/rendering
diff options
context:
space:
mode:
authoronelin <oscar@nelin.dk>2025-03-22 15:36:51 +0000
committeronelin <oscar@nelin.dk>2025-03-22 15:37:51 +0000
commitef1c67c69d317809cf90f7cc63ed6c26b2ca151e (patch)
tree8c38c0316c54ec69b1b1d2e9c581bde65c8b9be0 /src/rendering
parentf9a16f61f54993f3ae570b168ee15fc311229d91 (diff)
Copy renderbatch_add renderbatch_add_ext
Diffstat (limited to 'src/rendering')
-rw-r--r--src/rendering/src/rendering.c84
1 files changed, 81 insertions, 3 deletions
diff --git a/src/rendering/src/rendering.c b/src/rendering/src/rendering.c
index 9f13998..26805c8 100644
--- a/src/rendering/src/rendering.c
+++ b/src/rendering/src/rendering.c
@@ -196,7 +196,7 @@ ShaderBuffer* shaderbuffer_cat(ShaderBuffer* dst, ShaderBuffer *restrict src) {
// Verify the size
const usize sz_src = src->size_elem * src->count;
const usize sz_dst = dst->size_elem * dst->count;
- if (sz_src + sz_dst >= dst->size) {
+ if (dst->data == NULL || sz_dst + sz_src >= dst->size) {
const usize sz_new = (1 + ((sz_src + sz_dst) / 4096)) * 4096;
// Resize dst size
dst->data = realloc(dst->data, sz_new);
@@ -253,7 +253,6 @@ i32 renderbatch_add(RenderBatch* renderbatch, RenderObject* obj) {
// 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;
renderbatch->renderobj.buffer[i].data = malloc(newsz);
@@ -290,7 +289,86 @@ i32 renderbatch_add(RenderBatch* renderbatch, RenderObject* obj) {
}
i32 renderbatch_add_ext(RenderBatch* renderbatch, RenderObject* obj, Transform* t) {
- return -1;
+ // Check if its a valid renderbatch
+ if (renderbatch == NULL) {
+ ERROR("renderbatch was null!");
+ return -1;
+ }
+
+ // Check whether we have initialized models & instance memory
+ if (renderbatch->models == NULL) {
+ const usize sz = 8 * sizeof(RenderObject*);
+ renderbatch->models = calloc(8, sizeof(RenderObject*));
+ renderbatch->msize = sz;
+ renderbatch->mcount = 0;
+ }
+
+ if (renderbatch->instances == NULL) {
+ // Allocate enough for 4 times the models
+ const usize modelbufsz = renderbatch->msize / sizeof(RenderObject*);
+ const usize sz = 4 * modelbufsz * sizeof(BatchModelInstance);
+ renderbatch->instances = calloc(4 * modelbufsz, sizeof(BatchModelInstance));
+ renderbatch->inst_size = sz;
+ renderbatch->inst_count = 0;
+ }
+
+ // The index of the model
+ isize model_idx = -1;
+
+ // Find the model, to check if it already exists
+ for (usize i = 0; i < renderbatch->mcount; i++) {
+ // Compare the model pointers
+ if (obj == renderbatch->models[i]) {
+ model_idx = (isize)i;
+ break;
+ }
+ }
+
+ // Model doesn't exist, add it
+ if (-1 == model_idx) {
+ // Check if there's room enough
+ if ((1 + renderbatch->mcount) * sizeof(RenderObject*) > renderbatch->msize) {
+ // Realloc if necessary
+ const usize sz = renderbatch->msize * 2;
+ renderbatch->models = realloc(renderbatch->models, sz);
+ renderbatch->msize = sz;
+ }
+
+ // If this is the first model, we want to copy the renderobj, and
+ // shaderbuffer parameters.
+ if (renderbatch->mcount == 0) {
+ // 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.buffer_len = obj->buffer_len;
+ if (renderbatch->renderobj.buffer == NULL) {
+ renderbatch->renderobj.buffer = calloc(obj->buffer_len, sizeof(ShaderBuffer));
+ } else {
+ ERROR("RenderObj buffer is already initialized!");
+ return -1;
+ }
+
+ // Copy each buffers parameters
+ for (usize i = 0; i < renderbatch->renderobj.buffer_len; i++) {
+ renderbatch->renderobj.buffer[i].buffername = 0;
+ renderbatch->renderobj.buffer[i].buffertype = obj->buffer[i].buffertype;
+ // Size and count should be zero
+
+ renderbatch->renderobj.buffer[i].components = obj->buffer[i].components;
+ renderbatch->renderobj.buffer[i].size_elem = obj->buffer[i].size_elem;
+ // Data should also be null
+ }
+ }
+
+ // Concatenate the buffers
+ for (usize i = 0; i < renderbatch->renderobj.buffer_len; i++) {
+ shaderbuffer_cat(&renderbatch->renderobj.buffer[i], &obj->buffer[i]);
+ }
+ }
+
+ renderbatch->models[renderbatch->mcount++] = obj;
+
+ return (i32)renderbatch->mcount - 1;
}
// renderbatch_refresh: Copy all models in the renderbatch to the batchs' model.