summaryrefslogtreecommitdiff
path: root/src/rendering.c
diff options
context:
space:
mode:
authoronelin <oscar@nelin.dk>2025-11-15 20:33:50 +0000
committeronelin <oscar@nelin.dk>2025-11-15 21:16:41 +0000
commit9b1c7caceff6af24d76146bcc7a4495ff9ef3ede (patch)
tree0cd3bb0ee78eec0556db4ba6208d235f706b2d8f /src/rendering.c
parenta4c67096a3afd74ec9ceff9260cff9ad0336b208 (diff)
Simplify render command buffer
Diffstat (limited to 'src/rendering.c')
-rw-r--r--src/rendering.c204
1 files changed, 74 insertions, 130 deletions
diff --git a/src/rendering.c b/src/rendering.c
index a37de58..25ee1fd 100644
--- a/src/rendering.c
+++ b/src/rendering.c
@@ -40,10 +40,10 @@ ShaderBufferDataType_size(u16 flags) {
}
}
-ShaderBufferFlag ShaderBuffer_get_access_frequency(u64 flags) { return flags & (0b111 << 0); }
-ShaderBufferFlag ShaderBuffer_get_access_type(u64 flags) { return flags & (0b111 << 3); }
-ShaderBufferFlag ShaderBuffer_get_type(u64 flags) { return flags & (0b111 << 6); }
-ShaderBufferFlag ShaderBuffer_get_data_type(u64 flags) { return flags & (0b1111 << 9); }
+ShaderBufferFlag ShaderBuffer_get_access_frequency(u64 flags) { return flags & ( 7 << 0); }
+ShaderBufferFlag ShaderBuffer_get_access_type(u64 flags) { return flags & ( 7 << 3); }
+ShaderBufferFlag ShaderBuffer_get_type(u64 flags) { return flags & ( 7 << 6); }
+ShaderBufferFlag ShaderBuffer_get_data_type(u64 flags) { return flags & (15 << 9); }
u32 ShaderBuffer_get_gl_type(u64 flags) {
switch(ShaderBuffer_get_type(flags)) {
@@ -457,98 +457,88 @@ void render_present(Window* w) {
for (i32 drawcall_idx = 0; drawcall_idx < drawcall_len; drawcall_idx++) {
RenderDrawCall dc = drawcalls[drawcall_idx];
- switch (dc.type) {
- case RenderDrawCallType_Sprite: {
- // TODO render a quad
- } break;
- case RenderDrawCallType_Model: {
+ // bind shader program
+ // - set uniforms
+ // bind vertex array
+ // bind index buffer
- // bind shader program
- // - set uniforms
- // bind vertex array
- // bind index buffer
+ const RenderObject* const restrict o = dc.model;
+ vec3 pos;
+ glm_vec3_copy(dc.pos, pos);
- RenderObject* o = dc.data.model.model;
- vec3 pos;
- glm_vec3_copy(dc.data.model.pos, pos);
+ gl->UseProgram(o->shader.program);
+ // TODO: Use texture atlas
+ gl->BindTextureUnit(0, o->texture);
- gl->UseProgram(o->shader.program);
- // TODO: Use texture atlas
- gl->BindTextureUnit(0, o->texture);
+ {
+ mat4 model = GLM_MAT4_IDENTITY_INIT;
+ mat4 modelviewprojection;
- {
- mat4 model = GLM_MAT4_IDENTITY_INIT;
- mat4 modelviewprojection;
+ model[3][0] = pos[0];
+ model[3][1] = pos[1];
+ model[3][2] = pos[2];
- model[3][0] = pos[0];
- model[3][1] = pos[1];
- model[3][2] = pos[2];
+ // modelviewprojection = p * view * model
+ glm_mat4_mul(model, camera_matrix, modelviewprojection);
- // modelviewprojection = p * view * model
- glm_mat4_mul(model, camera_matrix, modelviewprojection);
-
- // TODO: Do this only once during initialization
- gl->UniformMatrix4fv(o->mvp, 1, GL_FALSE, &modelviewprojection[0][0]);
- gl->UniformMatrix4fv(o->model_position, 1, GL_FALSE, &model[0][0]);
- }
-
- // TODO the buffers need to be abstracted a bit more
- gl->BindVertexArray(o->vao);
-
- ShaderBuffer* ibo = NULL;
- for (usize i = 0; i < o->buffer_len; i++) {
- const u32 b_gl_type = ShaderBuffer_get_gl_type(o->buffer[i].buffertype);
- if (b_gl_type == GL_ELEMENT_ARRAY_BUFFER) {
- ibo = &o->buffer[i];
- }
+ // TODO: Do this only once during initialization
+ gl->UniformMatrix4fv(o->mvp, 1, GL_FALSE, &modelviewprojection[0][0]);
+ gl->UniformMatrix4fv(o->model_position, 1, GL_FALSE, &model[0][0]);
+ }
- gl->EnableVertexAttribArray((u32)i);
- gl->BindBuffer(b_gl_type, o->buffer[i].buffername);
- gl->VertexAttribPointer(
- // index of the attribute
- (u32)i,
- // number of component
- (i32)o->buffer[i].components,
- // type
- ShaderBuffer_get_gl_datatype(o->buffer[i].buffertype),
- // normalized?
- GL_FALSE,
- // stride
- 0,
- // array buffer offset
- (void*)0
- );
- }
+ // TODO the buffers need to be abstracted a bit more
+ gl->BindVertexArray(o->vao);
- // Draw the model !
- const i32 sz = (i32)(o->buffer->count * o->buffer->size_elem);
- if (ibo) {
- gl->DrawElements(
- GL_TRIANGLES,
- (i32)ibo->count,
- ShaderBuffer_get_gl_datatype(ibo->buffertype),
- (void*)0
- );
- } else {
- // Starting from vertex 0; 3 vertices total -> 1 triangle
- gl->DrawArrays(GL_TRIANGLES, 0, sz);
+ ShaderBuffer* ibo = NULL;
+ for (usize i = 0; i < o->buffer_len; i++) {
+ const u32 b_gl_type = ShaderBuffer_get_gl_type(o->buffer[i].buffertype);
+ if (b_gl_type == GL_ELEMENT_ARRAY_BUFFER) {
+ ibo = &o->buffer[i];
}
- for (u32 i = 0; i < o->buffer_len; i++) {
- gl->DisableVertexAttribArray(i);
- }
+ gl->EnableVertexAttribArray((u32)i);
+ gl->BindBuffer(b_gl_type, o->buffer[i].buffername);
+ gl->VertexAttribPointer(
+ // index of the attribute
+ (u32)i,
+ // number of component
+ (i32)o->buffer[i].components,
+ // type
+ ShaderBuffer_get_gl_datatype(o->buffer[i].buffertype),
+ // normalized?
+ GL_FALSE,
+ // stride
+ 0,
+ // array buffer offset
+ (void*)0
+ );
+ }
- gl->BindVertexArray(0);
+ // Draw the model !
+ const i32 sz = (i32)(o->buffer->count * o->buffer->size_elem);
+ if (ibo) {
+ gl->DrawElements(
+ GL_TRIANGLES,
+ (i32)ibo->count,
+ ShaderBuffer_get_gl_datatype(ibo->buffertype),
+ (void*)0
+ );
+ } else {
+ // Starting from vertex 0; 3 vertices total -> 1 triangle
+ gl->DrawArrays(GL_TRIANGLES, 0, sz);
+ }
- //if (i == 8) {
- // printf("\r obj: %.3f", (double)(get_time() - t) * 1000.);
- //}
- } break;
- default:
- break;
+ for (u32 i = 0; i < o->buffer_len; i++) {
+ gl->DisableVertexAttribArray(i);
}
+
+ gl->BindVertexArray(0);
+
+ //if (i == 8) {
+ // printf("\r obj: %.3f", (double)(get_time() - t) * 1000.);
+ //}
}
drawcall_len = 0;
@@ -556,7 +546,7 @@ void render_present(Window* w) {
glfwSwapBuffers(w->window);
}
-void drawcall_reset(void) {
+void window_reset_drawing(void) {
drawcall_len = 0;
memset(drawcalls, 0, sizeof(RenderDrawCall) * drawcall_limit);
}
@@ -595,38 +585,6 @@ void r_reset_camera(Camera* c) {
}
}
-void engine_draw_sprite(Sprite* s, ivec2* pos, f32 scale) {
- if (drawcall_len + 1 >= drawcall_limit) return;
-#ifdef _DEBUG
- if (s == NULL) __asm__("int3;");
-#endif
- drawcalls[drawcall_len++] =
- (RenderDrawCall){.type = RenderDrawCallType_Sprite,
- .data.sprite = {
- .sprite = s,
- .x = *pos[0],
- .y = *pos[1],
- .scale = scale,
- //.mod = {0xFF, 0xFF, 0xFF, 0xFF},
- }};
-}
-
-void engine_draw_sprite_ex(Sprite* s, ivec2* pos, f32 scale,
- Engine_color colormod) {
- if (drawcall_len + 1 >= drawcall_limit) return;
-#ifdef _DEBUG
- if (s == NULL) __asm__("int3;");
-#endif
- drawcalls[drawcall_len++] = (RenderDrawCall){
- .type = RenderDrawCallType_Sprite,
- .data.sprite = {
- .sprite = s,
- .x = *pos[0],
- .y = *pos[1],
- .scale = scale,
- //.mod = {colormod.r, colormod.g, colormod.b, colormod.a},
- }};
-}
void engine_draw_model(RenderObject* o, vec3 pos) {
if (drawcall_len + 1 >= drawcall_limit) return;
@@ -634,29 +592,15 @@ void engine_draw_model(RenderObject* o, vec3 pos) {
if (o == NULL) __asm__("int3;");
#endif
RenderDrawCall dc = {
- .type = RenderDrawCallType_Model,
- .data.model = {
.model = o,
.scale = 1.f,
- }};
-
+ };
- glm_vec3_copy(pos, dc.data.model.pos);
+ glm_vec3_copy(pos, dc.pos);
drawcalls[drawcall_len++] = dc;
}
-Sprite sprite_new(u64 tid, u8 coord) {
- const i32 ts = 16;
- // FIXME; used to be
- //((struct Resources*)GLOBAL_PLATFORM->data)->textures[tid]->tilesize;
- return (Sprite){
- .texture_id = (u32)tid,
- {
- ts * (coord & 0x0F),
- ts * ((coord & 0xF0) >> 4),
- }};
-}
Texture createTextureFromImageData(unsigned char* image_data, i32 width, i32 height, u8 components) {
Window* restrict w = GLOBAL_PLATFORM->window;