summaryrefslogtreecommitdiff
path: root/source/renderer
diff options
context:
space:
mode:
authortalha <sarcxd@gmail.com>2025-02-11 01:05:02 +0500
committertalha <sarcxd@gmail.com>2025-02-11 01:05:02 +0500
commitabc9a0dd0e8ae882bef4635c06a26f3727a7f776 (patch)
treed4c77d4bcc572239e228347e2a4de2a3a13b71b3 /source/renderer
parent355423d1f6cd364f17c29486b669c8f33c4b77f6 (diff)
Added line renderering
Diffstat (limited to 'source/renderer')
-rw-r--r--source/renderer/renderer.cpp89
-rw-r--r--source/renderer/renderer.h13
2 files changed, 101 insertions, 1 deletions
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);