From f4222da43e186c556f62cf4eb47392915a8312b7 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Wed, 21 Oct 2020 10:52:53 -0500 Subject: [PATCH] forgot to add a couple files --- Makefile | 2 +- include/container.h | 4 +- src/sim.cpp | 166 ++++++++++++++++++++++---------------------- 3 files changed, 88 insertions(+), 84 deletions(-) diff --git a/Makefile b/Makefile index 4cc4e74..a663f35 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -RELEASE=0 +RELEASE=1 OBJ_FILES=\ build/log.o \ diff --git a/include/container.h b/include/container.h index d71e6c5..fb9801e 100644 --- a/include/container.h +++ b/include/container.h @@ -18,12 +18,14 @@ struct Array data = nullptr; } - T& operator[](i32 elem) { + T& operator[](i32 elem) + { #if defined(DEBUG) assert(elem >= 0 && elem < count); #endif return data[elem]; } + const T& operator[](i32 elem) const { return data[elem]; } bool ensure_capacity(u32 min_capacity) diff --git a/src/sim.cpp b/src/sim.cpp index 6a9e722..e1de352 100644 --- a/src/sim.cpp +++ b/src/sim.cpp @@ -14,6 +14,7 @@ #include #include "types.h" +#include "container.h" #include "utils.h" #include "physics.h" @@ -75,80 +76,77 @@ deinit_glfw() glfwTerminate(); } -namespace gl_util { - internal GLuint - load_shader(GLenum shader_type, const char* shader_loc) +internal GLuint +load_shader(GLenum shader_type, const char* shader_loc) +{ + logprint(LOG_LEVEL_INFO, "Loading shader: %s", shader_loc); + + GLuint shader = glCreateShader(shader_type); + + FILE* shader_file = fopen(shader_loc, "rb"); + if (shader_file == NULL) panic_and_die("Shader file not found: %s\n", shader_loc); + + fseek(shader_file, 0, SEEK_END); + i32 shader_file_size = ftell(shader_file); + fseek(shader_file, 0, SEEK_SET); + + char* shader_buffer = (char *) malloc(shader_file_size + 1); + fread(shader_buffer, 1, shader_file_size, shader_file); + fclose(shader_file); + + shader_buffer[shader_file_size] = 0; + + glShaderSource(shader, 1, (const char* const*) &shader_buffer, NULL); + glCompileShader(shader); + + GLint successful; + glGetShaderiv(shader, GL_COMPILE_STATUS, &successful); + if (successful != GL_TRUE) { - logprint(LOG_LEVEL_INFO, "Loading shader: %s", shader_loc); - - GLuint shader = glCreateShader(shader_type); - - FILE* shader_file = fopen(shader_loc, "rb"); - if (shader_file == NULL) panic_and_die("Shader file not found: %s\n", shader_loc); - - fseek(shader_file, 0, SEEK_END); - i32 shader_file_size = ftell(shader_file); - fseek(shader_file, 0, SEEK_SET); - - char* shader_buffer = (char *) malloc(shader_file_size + 1); - fread(shader_buffer, 1, shader_file_size, shader_file); - fclose(shader_file); - - shader_buffer[shader_file_size] = 0; - - glShaderSource(shader, 1, (const char* const*) &shader_buffer, NULL); - glCompileShader(shader); - - GLint successful; - glGetShaderiv(shader, GL_COMPILE_STATUS, &successful); - if (successful != GL_TRUE) - { - GLsizei log_length = 0; - GLchar shader_log[1024]; - glGetShaderInfoLog(shader, 1023, &log_length, shader_log); - shader_log[log_length] = 0; - - panic_and_die("Error compiling shader %s:\n%s\n", - shader_loc, - shader_log); - } - - free(shader_buffer); + GLsizei log_length = 0; + GLchar shader_log[1024]; + glGetShaderInfoLog(shader, 1023, &log_length, shader_log); + shader_log[log_length] = 0; - return shader; + panic_and_die("Error compiling shader %s:\n%s\n", + shader_loc, + shader_log); } - internal GLuint - create_program(GLuint vertex_shader, GLuint fragment_shader) + free(shader_buffer); + + return shader; +} + +internal GLuint +create_program(GLuint vertex_shader, GLuint fragment_shader) +{ + logprint(LOG_LEVEL_INFO, "Linking GL program"); + + GLuint program = glCreateProgram(); + glAttachShader(program, vertex_shader); + glAttachShader(program, fragment_shader); + glLinkProgram(program); + + GLint successful; + glGetProgramiv(program, GL_LINK_STATUS, &successful); + if (successful != GL_TRUE) { - logprint(LOG_LEVEL_INFO, "Linking GL program"); + GLsizei log_length = 0; + GLchar program_log[1024]; + glGetProgramInfoLog(program, 1023, &log_length, program_log); + program_log[log_length] = 0; - GLuint program = glCreateProgram(); - glAttachShader(program, vertex_shader); - glAttachShader(program, fragment_shader); - glLinkProgram(program); - - GLint successful; - glGetProgramiv(program, GL_LINK_STATUS, &successful); - if (successful != GL_TRUE) - { - GLsizei log_length = 0; - GLchar program_log[1024]; - glGetProgramInfoLog(program, 1023, &log_length, program_log); - program_log[log_length] = 0; - - panic_and_die("Error linking program:\n%s", program_log); - } - - return program; + panic_and_die("Error linking program:\n%s", program_log); } + + return program; } - #define CIRCLE_POINT_COUNT 36 // NOTE(Brendan): Treat a circle as a many-sided polygon. // NOTE(Brendan): Returns the VAO where the mesh data was bound. @@ -174,7 +172,7 @@ create_circle_mesh() glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(circle_points), &circle_points, GL_STATIC_DRAW); glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 2, GL_FLOAT, false, sizeof(V2f), (void *) offset_of(V2f, x)); + glVertexAttribPointer(0, 2, GL_FLOAT, false, sizeof(V2f), (void *) offsetof(V2f, x)); glBindBuffer(GL_ARRAY_BUFFER, -1); u8 circle_indicies[CIRCLE_POINT_COUNT] = {}; @@ -200,25 +198,25 @@ update(f64 dt) } internal GLuint body_buffer; -internal Body* body_data; +internal Array bodies; internal GLuint circle_mesh; internal void draw() { - foreach(i, 0, 128) + For(bodies) { - body_data[i].pos = V2f{ randf(0, 800), randf(0, 800) }; - body_data[i].vel = V2f{ 0.0f, 0.0f }; - body_data[i].mass = randf(10.0f, 50.0f); + it.pos = V2f{ randf(0, 800), randf(0, 800) }; + it.vel = V2f{ 0.0f, 0.0f }; + it.mass = randf(10.0f, 50.0f); } glBindBuffer(GL_ARRAY_BUFFER, body_buffer); - glBufferSubData(GL_ARRAY_BUFFER, 0, 128 * sizeof(Body), body_data); + glBufferSubData(GL_ARRAY_BUFFER, 0, bodies.count * sizeof(Body), bodies.data); glBindBuffer(GL_ARRAY_BUFFER, -1); - glClearColor(0.1, 0.1, 0.1, 1.0); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glClearColor(0.1, 0.1, 0.1, 1.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindVertexArray(circle_mesh); glDrawElementsInstanced(GL_TRIANGLE_FAN, CIRCLE_POINT_COUNT, GL_UNSIGNED_BYTE, 0, 128); @@ -255,14 +253,14 @@ main(i32 argc, char* argv[]) { srand(time(NULL)); - init_glfw(); + init_glfw(); defer { deinit_glfw(); }; circle_mesh = create_circle_mesh(); - GLuint v_shader = gl_util::load_shader(GL_VERTEX_SHADER, "res/shaders/planet_vert.glsl"); - GLuint f_shader = gl_util::load_shader(GL_FRAGMENT_SHADER, "res/shaders/planet_frag.glsl"); - GLuint program = gl_util::create_program(v_shader, f_shader); + GLuint v_shader = load_shader(GL_VERTEX_SHADER, "res/shaders/planet_vert.glsl"); + GLuint f_shader = load_shader(GL_FRAGMENT_SHADER, "res/shaders/planet_frag.glsl"); + GLuint program = create_program(v_shader, f_shader); glUseProgram(program); mat4 ortho_mat; @@ -271,12 +269,16 @@ main(i32 argc, char* argv[]) GLuint ortho_mat_loc = glGetUniformLocation(program, "u_proj"); glUniformMatrix4fv(ortho_mat_loc, 1, false, (f32 *) ortho_mat); - body_data = alloc_bodies(128); - foreach(i, 0, 128) + bodies.ensure_capacity(128); + + // NOTE(Brendan): Setting the count like this does not guarantee that the data will be initialized. + bodies.count = 128; + + For(bodies) { - body_data[i].pos = V2f{ randf(0, 800), randf(0, 800) }; - body_data[i].vel = V2f{ 0.0f, 0.0f }; - body_data[i].mass = randf(10.0f, 50.0f); + it.pos = V2f{ randf(0, 800), randf(0, 800) }; + it.vel = V2f{ 0.0f, 0.0f }; + it.mass = randf(10.0f, 50.0f); } { @@ -285,13 +287,13 @@ main(i32 argc, char* argv[]) glGenBuffers(1, &body_buffer); glBindBuffer(GL_ARRAY_BUFFER, body_buffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(Body) * 128, body_data, GL_STREAM_DRAW); + glBufferData(GL_ARRAY_BUFFER, sizeof(Body) * bodies.count, bodies.data, GL_STREAM_DRAW); glEnableVertexAttribArray(1); glEnableVertexAttribArray(2); glVertexAttribDivisor(1, 1); glVertexAttribDivisor(2, 1); - glVertexAttribPointer(1, 2, GL_FLOAT, false, sizeof(Body), (void *) offset_of(Body, pos.x)); - glVertexAttribPointer(2, 1, GL_FLOAT, false, sizeof(Body), (void *) offset_of(Body, mass)); + glVertexAttribPointer(1, 2, GL_FLOAT, false, sizeof(Body), (void *) offsetof(Body, pos.x)); + glVertexAttribPointer(2, 1, GL_FLOAT, false, sizeof(Body), (void *) offsetof(Body, mass)); glBindBuffer(GL_ARRAY_BUFFER, -1); } -- 2.25.1