diff options
Diffstat (limited to 'source')
-rwxr-xr-x | source/main.cpp | 27 | ||||
-rw-r--r-- | source/renderer/renderer.cpp | 89 | ||||
-rw-r--r-- | source/renderer/renderer.h | 13 | ||||
-rw-r--r-- | source/todo.txt | 2 |
4 files changed, 129 insertions, 2 deletions
diff --git a/source/main.cpp b/source/main.cpp index 80dc6db..e02e48d 100755 --- a/source/main.cpp +++ b/source/main.cpp @@ -191,8 +191,14 @@ struct GLRenderer { u32 cq_batch_vbo; u32 cq_batch_count; r32_array cq_pos_batch; - r32_array cq_mvp_batch; r32_array cq_color_batch; + // Batched line + u32 line_sp; + u32 line_vao; + u32 line_vbo; + u32 line_batch_count; + r32_array line_pos_batch; + r32_array line_color_batch; // ui text TextState ui_text; @@ -748,10 +754,17 @@ int main(int argc, char* argv[]) size_t mem_size = GB(1); void* batch_memory = calloc(mem_size, sizeof(r32)); Arena batch_arena; + // quad batch buffers arena_init(&batch_arena, (unsigned char*)batch_memory, mem_size*sizeof(r32)); array_init(&batch_arena, &(renderer.cq_pos_batch), pos_ele_count); array_init(&batch_arena, &(renderer.cq_color_batch), color_ele_count); + // line batch buffers + u32 line_pos_ele_count = BATCH_SIZE * 4 * 2; + u32 line_color_ele_count = BATCH_SIZE * 3 * 2; + array_init(&batch_arena, &(renderer.line_pos_batch), line_pos_ele_count); + array_init(&batch_arena, &(renderer.line_color_batch), line_color_ele_count); + u32 quad_sp = gl_shader_program_from_path( "./source/shaders/colored_quad.vs.glsl", @@ -771,6 +784,9 @@ int main(int argc, char* argv[]) renderer.cq_batch_sp = cq_batch_sp; gl_setup_colored_quad_optimized(&renderer, cq_batch_sp); + + renderer.line_sp = cq_batch_sp; + gl_setup_line(&renderer, cq_batch_sp); r32 render_scale = 1.0f; //(r32)scr_width / (r32)base_scr_width; @@ -1609,6 +1625,15 @@ int main(int argc, char* argv[]) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // @section: rendering + // draw line + gl_draw_line( + &renderer, + Vec3{0.0f, 500.0f, -1.0f}, + Vec3{1000.0f, 500.0f, -1.0f}, + Vec3{0.0f, 0.0f, 0.0f}); + + gl_line_flush(&renderer); + // render_entities for (int i = 0; i < state.game_level.entity_count; i++) { Entity entity = state.game_level.entities[i]; diff --git a/source/renderer/renderer.cpp b/source/renderer/renderer.cpp index 669ac2d..ad75eca 100644 --- a/source/renderer/renderer.cpp +++ b/source/renderer/renderer.cpp @@ -261,7 +261,7 @@ void gl_cq_flush(GLRenderer* renderer) { GL_ARRAY_BUFFER, 0, renderer->cq_pos_batch.capacity*sizeof(r32), - renderer->cq_pos_batch.buffer + (void*)renderer->cq_pos_batch.buffer ); // color batch @@ -279,3 +279,90 @@ void gl_cq_flush(GLRenderer* renderer) { array_clear(&renderer->cq_color_batch); renderer->cq_batch_count = 0; } + +void gl_setup_line(GLRenderer* renderer, u32 sp) { + glGenVertexArrays(1, &renderer->line_vao); + glGenBuffers(1, &renderer->line_vbo); + + glBindVertexArray(renderer->line_vao); + glBindBuffer(GL_ARRAY_BUFFER, renderer->line_vbo); + glBufferData( + GL_ARRAY_BUFFER, ( + renderer->line_pos_batch.capacity + + renderer->line_color_batch.capacity + ) * sizeof(r32), NULL, GL_DYNAMIC_DRAW + ); + + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(r32), (void*)0); + + glEnableVertexAttribArray(1); + glVertexAttribPointer( + 1, 3, GL_FLOAT, GL_FALSE, + 3 * sizeof(r32), (void*)( + renderer->line_pos_batch.capacity*sizeof(r32) + ) + ); + + glBindVertexArray(0); +} + +void gl_draw_line( + GLRenderer *renderer, + Vec3 start, + Vec3 end, + Vec3 color + ) { + + Vec4 vertices[2] = { + Vec4{start.x, start.y, start.z, 1.0f}, + Vec4{end.x, end.y, end.z, 1.0f} + }; + + array_insert(&renderer->line_pos_batch, vertices[0].data, 4); + array_insert(&renderer->line_pos_batch, vertices[1].data, 4); + array_insert(&renderer->line_color_batch, color.data, 3); + array_insert(&renderer->line_color_batch, color.data, 3); + + renderer->line_batch_count++; + if(renderer->line_batch_count == BATCH_SIZE) { + gl_line_flush(renderer); + } +} + +void gl_line_flush(GLRenderer *renderer) { + glUseProgram(renderer->line_sp); + glEnable(GL_DEPTH_TEST); + + glUniformMatrix4fv( + glGetUniformLocation(renderer->line_sp, "View"), + 1, GL_FALSE, (renderer->cam_view).buffer + ); + glUniformMatrix4fv( + glGetUniformLocation(renderer->line_sp, "Projection"), + 1, GL_FALSE, (renderer->cam_proj).buffer + ); + glBindBuffer(GL_ARRAY_BUFFER, renderer->line_vbo); + + // fill batch data + // position batch + glBufferSubData( + GL_ARRAY_BUFFER, + 0, + renderer->line_pos_batch.capacity*sizeof(r32), + (void*)renderer->line_pos_batch.buffer + ); + glBufferSubData( + GL_ARRAY_BUFFER, + renderer->line_pos_batch.capacity*sizeof(r32), + renderer->line_color_batch.capacity*sizeof(r32), + (void*)renderer->line_color_batch.buffer + ); + + glBindVertexArray(renderer->line_vao); + glDrawArrays(GL_LINES, 0, renderer->line_batch_count*2); + + array_clear(&renderer->line_pos_batch); + array_clear(&renderer->line_color_batch); + renderer->line_batch_count = 0; +} diff --git a/source/renderer/renderer.h b/source/renderer/renderer.h index db7cdd4..104a3cd 100644 --- a/source/renderer/renderer.h +++ b/source/renderer/renderer.h @@ -3,6 +3,7 @@ u32 gl_shader_program(char *vs, char *fs); u32 gl_shader_program_from_path(const char *vspath, const char *fspath); +// ==================== QUADS ==================== u32 gl_setup_colored_quad(u32 sp); void gl_draw_colored_quad( GLRenderer* renderer, @@ -11,6 +12,7 @@ void gl_draw_colored_quad( Vec3 color ); +// batched renderer void gl_setup_colored_quad_optimized( GLRenderer* renderer, u32 sp @@ -22,3 +24,14 @@ void gl_draw_colored_quad_optimised( Vec3 color ); void gl_cq_flush(GLRenderer *renderer); + +// ==================== LINE ==================== +void gl_setup_colored_line(GLRenderer *renderer, u32 sp); +void gl_draw_colored_line( + GLRenderer *renderer, + Vec3 start, + Vec3 end, + Vec2 size, + Vec3 color + ); +void gl_line_flush(GLRenderer *renderer); diff --git a/source/todo.txt b/source/todo.txt index 0228778..165d963 100644 --- a/source/todo.txt +++ b/source/todo.txt @@ -38,6 +38,8 @@ BLOCKED: - Audio: figure out what the correct audio sound for jumping will be. TODO: +- Fix camera jerk on level load +- Make camera pan a continuous function, discrete steps are too jerky. - Update camera follower for centering player in view (with limits) after a few seconds (maybe like 2 seconds) - Implement Broad Phase Collision for efficient collision handling, let's see |