#include <GLFW/glfw3.h>
#include "types.h"
+#include "container.h"
#include "utils.h"
#include "physics.h"
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.
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] = {};
}
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);
{
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;
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);
}
{
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);
}