diff options
| -rw-r--r-- | src/rendering/src/rendering.c | 84 |
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. |
