diff options
| author | 0scar <qgt268@alumni.ku.dk> | 2024-03-24 20:30:08 +0000 |
|---|---|---|
| committer | 0scar <qgt268@alumni.ku.dk> | 2024-03-24 20:30:08 +0000 |
| commit | 89d91e094d3d956e76a5a66e9490666e2455a8e0 (patch) | |
| tree | c49fb04f71875f490db6e514254ab97f9d731d94 /src/rendering | |
| parent | c963d88a6be5dcd80d7431ce884a68dc8d4953ce (diff) | |
Refine data structures
Diffstat (limited to 'src/rendering')
| -rw-r--r-- | src/rendering/include/engine/rendering/rendering.h | 78 |
1 files changed, 56 insertions, 22 deletions
diff --git a/src/rendering/include/engine/rendering/rendering.h b/src/rendering/include/engine/rendering/rendering.h index 4babe6d..fccbb73 100644 --- a/src/rendering/include/engine/rendering/rendering.h +++ b/src/rendering/include/engine/rendering/rendering.h @@ -58,50 +58,84 @@ typedef struct { u32 program; } Shader; +typedef enum { + ShaderBufferDataType_nil, + + ShaderBufferDataType_f32, + ShaderBufferDataType_f64, + + ShaderBufferDataType_i32, + ShaderBufferDataType_i64, +} ShaderBufferDataType; + +const +usize ShaderBufferDataType_size(ShaderBufferDataType t) { + switch (t) { + case ShaderBufferDataType_nil: return 0; + case ShaderBufferDataType_f32: return sizeof(f32); + case ShaderBufferDataType_f64: return sizeof(f64); + case ShaderBufferDataType_i32: return sizeof(i32); + case ShaderBufferDataType_i64: return sizeof(i64); + default: return 0; + } +} + typedef struct { - // Maybe also define type? so texture normals can be mapped to a texture - // atlas? + // The backend ID, ie. glGenBuffer(numBufferObjects, &this->buffername) u32 buffername; - isize sz; - isize n; - isize m; + // The size of data = count * size_elem + isize size; + // Number of elements + isize count; + // components per generic vertex attribute (ie, 3 for RGB, 2 for UV) + isize components; + // Size of each element + ShaderBufferDataType datatype; + isize size_elem; + // Pointer to the data void* data; } ShaderBuffer; +#define SHADERBUFFER_NEW(T, COUNT, COMPONENTS, DATA) \ + (ShaderBuffer){ \ + .buffername = 0, \ + .size = COUNT * sizeof(T), \ + .count = COUNT, \ + .datatype = ShaderBufferDataType_##T, \ + .size_elem = sizeof(T), \ + .data = DATA, \ + } + typedef struct { /* Shader proram */ Shader shader; /* Vertex Array Object */ u32 vao; - /* MVP (a uniform from the shader) */ + /* MVP (a uniform from the shader). + * This could also probably be generalized */ u32 mvp; + // The texture ID, glBindTextures(target, &this->texture) u32 texture; + + // Number of buffers usize buffer_len; + + // The vertex buffer is also just a buffer. ShaderBuffer* buffer; } RenderObject; typedef struct { - isize count; - // TODO: Add index buffer? - f32 *vertices; -} RenderModel; - -typedef struct { - // Size and count of models + // Size of models buffer isize msize; + // number of models (RenderObject) isize mcount; + + RenderObject *models; + // Size and count of vertices - isize vsize; - isize vcount; - // Should we keep track of each added model? - // sort of like an array of pointers? - // then have a function to update each model? - RenderModel *models; - u32 vertexbuffer; - f32 *vertices; - // TODO: Add index buffer? + RenderObject renderobj; } RenderBatch; typedef enum { |
