summaryrefslogtreecommitdiff
path: root/src/rendering
diff options
context:
space:
mode:
authoronelin <oscar@nelin.dk>2025-03-22 22:40:07 +0000
committeronelin <oscar@nelin.dk>2025-03-22 22:40:15 +0000
commit165c0c72fff2003846102d54b1ccfac8ef42da96 (patch)
treee0520e71bdd95d722a7ee4e73d825b56a8cf94b5 /src/rendering
parentf3459028248068232f1d746f9bb8976f27ada26c (diff)
Update API, add object transform
Diffstat (limited to 'src/rendering')
-rw-r--r--src/rendering/include/engine/rendering/rendering.h4
-rw-r--r--src/rendering/src/rendering.c133
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) {