diff options
| author | onelin <oscar@nelin.dk> | 2025-11-15 20:33:50 +0000 |
|---|---|---|
| committer | onelin <oscar@nelin.dk> | 2025-11-15 21:16:41 +0000 |
| commit | 9b1c7caceff6af24d76146bcc7a4495ff9ef3ede (patch) | |
| tree | 0cd3bb0ee78eec0556db4ba6208d235f706b2d8f /src/rendering.c | |
| parent | a4c67096a3afd74ec9ceff9260cff9ad0336b208 (diff) | |
Simplify render command buffer
Diffstat (limited to 'src/rendering.c')
| -rw-r--r-- | src/rendering.c | 204 |
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; |
