#include <stdint.h> // NOTE(Brendan): Only for intptr_t
-// NOTE(Brendan): Hacky way to get the offset of a struct member.
-// offsetof() is the standard way in C to get it, but it is not guarenteed
-// to be defined in all C implementations.
+// NOTE(Brendan): Hacky way to get the offset of a struct member. offsetof() is the standard way in C to get it, but it is not guarenteed to be defined in all C implementations.
#define offset_of(S, mem) (intptr_t) &(((S*)(0))->mem)
+// NOTE(Brendan): There are so many uses of 'static' in C and they quickly lose their meaning.
+#define internal static // internal void foo() { ... }
+#define persist static // void foo() { persist int a = 10; }
+#define atleast static // void foo(int a[atleast 10]) { ... }
+
// NOTE(Brendan): This is useful in many situations and I believe it cleans up the code by making simple, counter based for loops easier to recognize at a glance.
#define foreach(var, lo, hi) for (i32 var = lo; var < hi; var++)
#include "utils.h"
#include "physics.h"
+#include "log.h"
+
#define PI 3.141592653589793238462643383
#define WINDOW_WIDTH 1600
#define WINDOW_HEIGHT 900
#define WINDOW_TITLE "N-Body Simulation"
-void glfw_key_handler(GLFWwindow* window, i32 key, i32 scancode, i32 action, i32 mods) {
+internal void
+glfw_key_handler(GLFWwindow* window, i32 key, i32 scancode, i32 action, i32 mods) {
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, 1);
}
-void glfw_resize_handler(GLFWwindow* window, i32 width, i32 height) {
+internal void
+glfw_resize_handler(GLFWwindow* window, i32 width, i32 height) {
glViewport(0, 0, width, height);
}
-void glfw_error_handler(i32 error, const char* desc) {
+internal void
+glfw_error_handler(i32 error, const char* desc) {
panic_and_die("GLFW Error (%d): %s\n", error, desc);
}
GLFWwindow* window;
-void init_glfw() {
+internal void
+init_glfw() {
+ logprint(LOG_LEVEL_INFO, "Initializing GLFW");
+
if (!glfwInit()) panic_and_die("Failed to initalize GLFW.");
glfwSetErrorCallback(glfw_error_handler);
glCullFace(GL_CCW);
}
-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");
glGetShaderInfoLog(shader, 1023, &log_length, shader_log);
shader_log[log_length] = 0;
- panic_and_die("Error compiling %s:\n%s\n", shader_loc, shader_log);
+ panic_and_die("Error compiling shader %s:\n%s\n",
+ shader_loc,
+ shader_log);
}
free(shader_buffer);
return shader;
}
-GLuint create_program(GLuint vertex_shader, GLuint fragment_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);
#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.
-GLsizei create_circle_mesh() {
+internal GLsizei
+create_circle_mesh() {
+ logprint(LOG_LEVEL_INFO, "Generating circle mesh");
+
GLsizei vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
return vao;
}
-void deinit_opengl() {
+internal void
+deinit_opengl() {
glfwDestroyWindow(window);
glfwTerminate();
}
// NOTE(Brendan): dt is expected to be in units of "per second".
-void update(f64 dt) {
+internal void
+update(f64 dt) {
}
-GLsizei circle_mesh;
-void draw() {
+internal GLsizei circle_mesh;
+internal void
+draw() {
glClearColor(0.1, 0.1, 0.1, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glfwSwapBuffers(window);
}
-void loop() {
+internal void
+loop() {
f64 last_time = glfwGetTime();
f64 curr_time = last_time;
f64 delta;
i32 main(i32 argc, char* argv[]) {
init_glfw();
- circle_mesh = create_circle_mesh();
+ circle_mesh = create_circle_mesh(NULL);
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");