summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rwxr-xr-xsource/main.cpp27
-rw-r--r--source/renderer/renderer.cpp89
-rw-r--r--source/renderer/renderer.h13
-rw-r--r--source/todo.txt2
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