summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rendering/include/engine/rendering/rendering.h2
-rw-r--r--src/rendering/src/rendering.c90
2 files changed, 73 insertions, 19 deletions
diff --git a/src/rendering/include/engine/rendering/rendering.h b/src/rendering/include/engine/rendering/rendering.h
index ffc6267..e969e0a 100644
--- a/src/rendering/include/engine/rendering/rendering.h
+++ b/src/rendering/include/engine/rendering/rendering.h
@@ -157,7 +157,7 @@ typedef struct {
// Index of the model in the RenderBatch models buffer
usize model_idx;
// The transformation of the model
- Transform transorm;
+ Transform transform;
} BatchModelInstance;
typedef struct {
diff --git a/src/rendering/src/rendering.c b/src/rendering/src/rendering.c
index 26805c8..387dfef 100644
--- a/src/rendering/src/rendering.c
+++ b/src/rendering/src/rendering.c
@@ -340,6 +340,9 @@ i32 renderbatch_add_ext(RenderBatch* renderbatch, RenderObject* obj, Transform*
// 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.shader = obj->shader;
+ //renderbatch->renderobj.texture = obj->texture;
+
renderbatch->renderobj.buffer_len = obj->buffer_len;
if (renderbatch->renderobj.buffer == NULL) {
renderbatch->renderobj.buffer = calloc(obj->buffer_len, sizeof(ShaderBuffer));
@@ -360,36 +363,87 @@ i32 renderbatch_add_ext(RenderBatch* renderbatch, RenderObject* obj, Transform*
}
}
- // Concatenate the buffers
- for (usize i = 0; i < renderbatch->renderobj.buffer_len; i++) {
- shaderbuffer_cat(&renderbatch->renderobj.buffer[i], &obj->buffer[i]);
- }
+ //// Only concatenate the buffers once we refresh
+ //for (usize i = 0; i < renderbatch->renderobj.buffer_len; i++) {
+ // shaderbuffer_cat(&renderbatch->renderobj.buffer[i], &obj->buffer[i]);
+ //}
+
+ model_idx = (isize)renderbatch->mcount;
+ renderbatch->models[renderbatch->mcount++] = obj;
}
- renderbatch->models[renderbatch->mcount++] = obj;
+ // Create batch instance
+ // Check if there's room enough
+ if ((1 + renderbatch->inst_count) * sizeof(BatchModelInstance) > renderbatch->inst_size) {
+ // Realloc if necessary
+ const usize sz = renderbatch->inst_size * 2;
+ renderbatch->models = realloc(renderbatch->instances, sz);
+ renderbatch->msize = sz;
+ }
- return (i32)renderbatch->mcount - 1;
+ BatchModelInstance inst = {
+ .model_idx = (usize)model_idx,
+ .transform = *t,
+ };
+
+ // Add it to the batch
+ renderbatch->instances[renderbatch->inst_count++] = inst;
+
+ // Return instance index
+ return (i32)renderbatch->inst_count - 1;
}
-// renderbatch_refresh: Copy all models in the renderbatch to the batchs' model.
+// renderbatch_refresh: Copy all instances/models in the renderbatch to the
+// batchs' model.
int renderbatch_refresh(RenderBatch* renderbatch) {
const usize bufs = renderbatch->renderobj.buffer_len;
usize *offsets = calloc(bufs, sizeof(usize));
- for (usize m = 0; m < renderbatch->mcount; m++) {
+ // Reset renderobj buffers
+ for (usize b = 0; b < renderbatch->renderobj.buffer_len; b++) {
+ // Zero the old data
+ renderbatch->renderobj.buffer[b].count = 0;
+ memset(renderbatch->renderobj.buffer[b].data, 0, renderbatch->renderobj.buffer[b].size);
+ }
+
+ // Copy the instances models buffers, and vertex position buffers with translations applied
+ for (usize i = 0; i < renderbatch->inst_count; i++) {
+ const usize m = renderbatch->instances[i].model_idx;
const RenderObject* model = renderbatch->models[m];
+ Transform t = renderbatch->instances[i].transform;
- // Copy every buffer in every object
- 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].data + offsets[b],
- buf->data,
- bsize
- );
- offsets[b] += bsize;
- }
+ for (usize b = 0; b < renderbatch->renderobj.buffer_len; b++) {
+ shaderbuffer_cat(&renderbatch->renderobj.buffer[b], &model->buffer[b]);
+
+ if (ShaderBuffer_Type_vertexPosition == ShaderBuffer_get_gl_type(renderbatch->renderobj.buffer[b].buffertype)) {
+ if (ShaderBuffer_DataType_f32 == ShaderBuffer_get_data_type(renderbatch->renderobj.buffer[b].buffertype)) {
+ WARN("Buffer data type is not f32, skipping transformation...");
+ continue;
+ }
+ // Apply transformation in renderbatch buffer-memory
+ float *data = renderbatch->renderobj.buffer[b].data;
+ const usize len = model->buffer[b].count;
+ data = &data[renderbatch->renderobj.buffer[b].count - len];
+
+ if (model->buffer[b].components == 2) {
+ for (usize v = 0; v < len; v += 2) {
+ // scale
+ // rotate
+ // offset
+ glm_vec2_add(&data[v], t.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], t.position, &data[v]);
+ }
+ }
+ }
+ }
}
free(offsets);