forgot to add a couple files
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 21 Oct 2020 15:52:53 +0000 (10:52 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 21 Oct 2020 15:52:53 +0000 (10:52 -0500)
Makefile
include/container.h
src/sim.cpp

index 4cc4e74dfcd5a37a1a709851efd3cf6ef4cf13ae..a663f35a15f72a7b425e13c3687366a9f87301fe 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-RELEASE=0
+RELEASE=1
 
 OBJ_FILES=\
        build/log.o \
index d71e6c55b3d978247817bb221bb6e3ebc9b48759..fb9801e45f5ae890d1de326179d32d14a2626b72 100644 (file)
@@ -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)
index 6a9e722974f3bc918af7036cf6e2696e565565dd..e1de3520edeeb58609f0d0d6824b283f5f6b9d85 100644 (file)
@@ -14,6 +14,7 @@
 #include <GLFW/glfw3.h>
 
 #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<Body> 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);
     }