summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rendering/include/engine/rendering/rendering.h24
-rw-r--r--src/rendering/src/rendering.c35
2 files changed, 47 insertions, 12 deletions
diff --git a/src/rendering/include/engine/rendering/rendering.h b/src/rendering/include/engine/rendering/rendering.h
index c5f805e..ffc6267 100644
--- a/src/rendering/include/engine/rendering/rendering.h
+++ b/src/rendering/include/engine/rendering/rendering.h
@@ -57,6 +57,12 @@ typedef struct {
u32 program;
} Shader;
+typedef struct {
+ vec3 position;
+ vec3 size;
+ mat4 rotation;
+} Transform;
+
typedef enum {
ShaderBufferFlag_none = 0x00,
@@ -72,7 +78,8 @@ typedef enum {
// Next 3 bytes describe the buffer type
ShaderBuffer_Type_vertexData = 0b0000001000000, // 64
- ShaderBuffer_Type_vertexIndex = 0b0000010000000, // 128
+ ShaderBuffer_Type_vertexPosition = 0b0000010000000, // 128
+ ShaderBuffer_Type_vertexIndex = 0b0000011000000, // 192
// Next 4 bytes are designated for the data type
ShaderBuffer_DataType_nil = 0b0001000000000, // 512
@@ -147,6 +154,13 @@ typedef struct {
} RenderObject;
typedef struct {
+ // Index of the model in the RenderBatch models buffer
+ usize model_idx;
+ // The transformation of the model
+ Transform transorm;
+} BatchModelInstance;
+
+typedef struct {
// Size of models buffer
usize msize;
// number of models in the `models` buffer
@@ -154,6 +168,13 @@ typedef struct {
// Pointers to original models in this batch
RenderObject **models;
+ // Size of instance buffer
+ usize inst_size;
+ // number of instances in the `instances` buffer
+ usize inst_count;
+ // Pointers to original models in this batch
+ BatchModelInstance *instances;
+
// The rendered destination object
RenderObject renderobj;
} RenderBatch;
@@ -252,6 +273,7 @@ RenderObject RenderObject_new(
int renderbatch_new(RenderBatch* renderbatch, usize count);
int renderbatch_add(RenderBatch* renderbatch, RenderObject* obj);
+i32 renderbatch_add_ext(RenderBatch* renderbatch, RenderObject* obj, 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 6f6e55b..9f13998 100644
--- a/src/rendering/src/rendering.c
+++ b/src/rendering/src/rendering.c
@@ -46,6 +46,8 @@ u32 ShaderBuffer_get_gl_type(u64 flags) {
switch(ShaderBuffer_get_type(flags)) {
case ShaderBuffer_Type_vertexData:
return GL_ARRAY_BUFFER;
+ case ShaderBuffer_Type_vertexPosition:
+ return GL_ARRAY_BUFFER;
case ShaderBuffer_Type_vertexIndex:
return GL_ELEMENT_ARRAY_BUFFER;
default:
@@ -124,7 +126,7 @@ int renderbatch_new(RenderBatch* renderbatch, usize count) {
* pos;
* rotation;
* };
- * } ;
+ * };
*
* For this to work we will likely need to extend the shaderbuffer struct to
* also hold what type of data the buffer contains, s.t. we can apply the
@@ -139,26 +141,33 @@ int renderbatch_new(RenderBatch* renderbatch, usize count) {
return -1;
}
+ usize numisnstances = count;
+
if (count == 0) {
// Just allocate enough for a couple hundred
- count = 255;
+ count = 256;
+ numisnstances = count * 4;
}
- //GladGLContext* restrict gl = GLOBAL_PLATFORM->window->context;
- //u32 vbo = 0;
- //gl->CreateBuffers(1, &vbo);
- //gl->BindBuffer(GL_ARRAY_BUFFER, vbo);
- //gl->BufferData(GL_ARRAY_BUFFER, 0, NULL, GL_DYNAMIC_DRAW);
- //gl->VertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 0);
renderbatch->msize = sizeof(RenderObject) * count;
renderbatch->mcount = 0;
- renderbatch->models = (RenderObject**)malloc(sizeof(RenderObject*) * count);
+ renderbatch->inst_size = sizeof(BatchModelInstance) * numisnstances;
+ renderbatch->inst_count = 0;
+ renderbatch->models = (RenderObject**)calloc(count, sizeof(RenderObject*));
+
if (renderbatch->models == NULL) {
ERROR("Failed to allocate %lu size of bytes for models array!", sizeof(RenderObject*) * count);
return -1;
}
+ renderbatch->instances = (BatchModelInstance*)calloc(numisnstances, sizeof(BatchModelInstance));
+
+ if (renderbatch->instances == NULL) {
+ ERROR("Failed to allocate %lu size of bytes for batch instances array!", sizeof(BatchModelInstance) * numisnstances);
+ return -1;
+ }
+
memset(&(renderbatch->renderobj), 0, sizeof(RenderObject));
return 0;
@@ -204,7 +213,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
-int renderbatch_add(RenderBatch* renderbatch, RenderObject* obj) {
+i32 renderbatch_add(RenderBatch* renderbatch, RenderObject* obj) {
if (renderbatch == NULL) {
ERROR("renderbatch was null!");
return -1;
@@ -277,7 +286,11 @@ int renderbatch_add(RenderBatch* renderbatch, RenderObject* obj) {
//renderbatch->renderobj.buffer_len += obj->buffer_len;
//}
- return 0;
+ return (i32)renderbatch->mcount - 1;
+}
+
+i32 renderbatch_add_ext(RenderBatch* renderbatch, RenderObject* obj, Transform* t) {
+ return -1;
}
// renderbatch_refresh: Copy all models in the renderbatch to the batchs' model.