From 165c0c72fff2003846102d54b1ccfac8ef42da96 Mon Sep 17 00:00:00 2001 From: onelin Date: Sat, 22 Mar 2025 23:40:07 +0100 Subject: Update API, add object transform --- src/rendering/include/engine/rendering/rendering.h | 4 +- src/rendering/src/rendering.c | 133 +++++++++------------ 2 files changed, 57 insertions(+), 80 deletions(-) diff --git a/src/rendering/include/engine/rendering/rendering.h b/src/rendering/include/engine/rendering/rendering.h index e969e0a..7120182 100644 --- a/src/rendering/include/engine/rendering/rendering.h +++ b/src/rendering/include/engine/rendering/rendering.h @@ -272,8 +272,8 @@ RenderObject RenderObject_new( ShaderBuffer *restrict buffers, usize num_buffers); int renderbatch_new(RenderBatch* renderbatch, usize count); -int renderbatch_add(RenderBatch* renderbatch, RenderObject* obj); -i32 renderbatch_add_ext(RenderBatch* renderbatch, RenderObject* obj, Transform* t); +i32 renderbatch_add(RenderBatch* renderbatch, RenderObject* obj, Transform* t); +void renderbatch_transform(RenderBatch* renderbatch, usize obj_idx, Transform* t); int renderbatch_refresh(RenderBatch* renderbatch); Shader compile_shader(const char* file_path, const ShaderType shader_type); diff --git a/src/rendering/src/rendering.c b/src/rendering/src/rendering.c index d373a7b..571b9e0 100644 --- a/src/rendering/src/rendering.c +++ b/src/rendering/src/rendering.c @@ -211,84 +211,7 @@ ShaderBuffer* shaderbuffer_cat(ShaderBuffer* dst, ShaderBuffer *restrict src) { } // Add a render object to the render batch. -// In reality we only add the buffer stuff to each of the batchs' renderobject -// buffers -i32 renderbatch_add(RenderBatch* renderbatch, RenderObject* obj) { - if (renderbatch == NULL) { - ERROR("renderbatch was null!"); - return -1; - } - - // Check if we have initialized models array - if (renderbatch->models == NULL) { - 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) { - const usize sz = renderbatch->msize * 2; - renderbatch->models = realloc(renderbatch->models, sz); - renderbatch->msize = sz; - } - - // If this is the first object, copy all its rendering params - if (renderbatch->mcount == 0) { - renderbatch->renderobj.shader = obj->shader; - renderbatch->renderobj.texture = obj->texture; - 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].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].size_elem = obj->buffer[i].size_elem; - - renderbatch->renderobj.buffer[i].data = malloc(newsz); - memcpy(renderbatch->renderobj.buffer[i].data, obj->buffer[i].data, sz); - } - - } else if (renderbatch->renderobj.buffer_len != obj->buffer_len) { - ERROR("Mismatch in number of shader buffers in render objects! Assumed %d but got %d", renderbatch->renderobj.buffer_len, obj->buffer_len); - - // Append all ShaderBuffers to their appropriate buffers. - } else for (usize i = 0; i < renderbatch->renderobj.buffer_len; i++) { - 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) { - // Copy the first objects shaderstuff - renderbatch->renderobj.shader = obj->shader; - renderbatch->renderobj.vao = obj->vao; - renderbatch->renderobj.mvp = obj->mvp; - renderbatch->renderobj.texture = obj->texture; - renderbatch->renderobj.buffer_len = obj->buffer_len; - } - */ - - //if (renderbatch->mcount != 0) { - //renderbatch->renderobj.buffer_len += obj->buffer_len; - //} - - return (i32)renderbatch->mcount - 1; -} - -i32 renderbatch_add_ext(RenderBatch* renderbatch, RenderObject* obj, Transform* t) { +i32 renderbatch_add(RenderBatch* renderbatch, RenderObject* obj, Transform* t) { // Check if its a valid renderbatch if (renderbatch == NULL) { ERROR("renderbatch was null!"); @@ -393,6 +316,60 @@ i32 renderbatch_add_ext(RenderBatch* renderbatch, RenderObject* obj, Transform* return (i32)renderbatch->inst_count - 1; } +void renderbatch_transform(RenderBatch* renderbatch, usize obj_idx, Transform* t) { + // TODO: Combine transformation, ie. pos' += pos, etc. + const usize m = renderbatch->instances[obj_idx].model_idx; + const RenderObject* model = renderbatch->models[m]; + renderbatch->instances[obj_idx].transform = *t; + + if(renderbatch->inst_count < obj_idx) { + ERROR("renderbatch_transform: object index is outside range!"); + return; + } + /* TODO: Update the model data, we might need to + * 0. Iteratively go through each renderobj buffer, to find a vertexPosition + * buffer, + * 1. Calculate the models start index in the renderobj, + * 2. Apply transformation to the model in the renderobj buffer. + * */ + usize b; + for (b = 0; b < renderbatch->renderobj.buffer_len; b++) { + if (ShaderBuffer_Type_vertexPosition != ShaderBuffer_get_type(renderbatch->renderobj.buffer[b].buffertype) + || ShaderBuffer_DataType_f32 != ShaderBuffer_get_data_type(renderbatch->renderobj.buffer[b].buffertype)) { + continue; + } + } + + usize offset = 0; + for (usize i = 0; i < obj_idx; i++) { + const usize idx = renderbatch->instances[i].model_idx; + offset += renderbatch->models[idx]->buffer->size_elem + * renderbatch->models[idx]->buffer->count; + } + + float *data = renderbatch->renderobj.buffer[b].data; + data = &data[offset]; + const usize len = model->buffer[b].count; + + Transform tt = renderbatch->instances[obj_idx].transform; + if (model->buffer[b].components == 2) { + for (usize v = 0; v < len; v += 2) { + // scale + // rotate + // offset + glm_vec2_add(&data[v], tt.position, &data[v]); + } + } + else if (model->buffer[b].components == 3) { + for (usize v = 0; v < len; v += 3) { + // scale + // rotate + // offset + glm_vec3_add(&data[v], tt.position, &data[v]); + } + } +} + // renderbatch_refresh: Copy all instances/models in the renderbatch to the // batchs' model. int renderbatch_refresh(RenderBatch* renderbatch) { -- cgit v1.3