From cd0b56692e2c6042ad56f7c21607e88c7bbace57 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Mon, 19 Oct 2020 08:50:29 -0500 Subject: [PATCH] using c++ now for SOME of its features --- Makefile | 26 +++++++++++++++----------- include/log.h | 7 +++++-- include/physics.h | 5 +++-- include/utils.h | 25 ++++++++++++++++++++++++- include/vecmath.h | 7 ++++++- project.4coder | 1 + src/{log.c => log.cpp} | 8 ++++---- src/{physics.c => physics.cpp} | 0 src/{sim.c => sim.cpp} | 30 +++++++++++++++--------------- src/{utils.c => utils.cpp} | 14 +++++++------- src/{vecmath.c => vecmath.cpp} | 4 ++-- 11 files changed, 82 insertions(+), 45 deletions(-) rename src/{log.c => log.cpp} (92%) rename src/{physics.c => physics.cpp} (100%) rename src/{sim.c => sim.cpp} (94%) rename src/{utils.c => utils.cpp} (79%) rename src/{vecmath.c => vecmath.cpp} (98%) diff --git a/Makefile b/Makefile index 717f3ed..4cc4e74 100644 --- a/Makefile +++ b/Makefile @@ -7,26 +7,30 @@ OBJ_FILES=\ build/physics.o \ build/sim.o -ifeq (, $(shell which tcc)) - CC=gcc -else -ifeq ($(RELEASE), 0) - CC=gcc -else - CC=tcc -endif -endif - +# ifeq (, $(shell which tcc)) +# CC=gcc +# else +# ifeq ($(RELEASE), 0) +# CC=gcc +# else +# CC=tcc +# endif +# endif + +CC=g++ INCLUDES=-I./include LIBS=-lGL -lglfw -lm TARGET=./sim ifeq ($(RELEASE), 1) - FLAGS=-O3 + FLAGS=-O2 else FLAGS=-g3 endif +build/%.o: src/%.cpp + $(CC) $(TIMEFLAG) $(FLAGS) -c $< -o $@ $(INCLUDES) + build/%.o: src/%.c $(CC) $(TIMEFLAG) $(FLAGS) -c $< -o $@ $(INCLUDES) diff --git a/include/log.h b/include/log.h index 9f29b7b..f23d3e8 100644 --- a/include/log.h +++ b/include/log.h @@ -1,14 +1,17 @@ #ifndef LOG_H #define LOG_H -typedef enum LogLevel { +enum LogLevel +{ LOG_LEVEL_INFO, LOG_LEVEL_WARNING, LOG_LEVEL_ERROR, LOG_LEVEL_COUNT, -} LogLevel; +}; +// NOTE(Brendan): The minimum log level that will be printed out. +// Useful for hiding a bunch of INFO logs. extern LogLevel LOG_LEVEL_MINIMUM; void logprint(LogLevel level, const char* format, ...); diff --git a/include/physics.h b/include/physics.h index f79b9ba..2210594 100644 --- a/include/physics.h +++ b/include/physics.h @@ -3,11 +3,12 @@ #include -typedef struct Body { +struct Body +{ V2f pos; V2f vel; f32 mass; -} Body; +}; #endif //PHYSICS_H diff --git a/include/utils.h b/include/utils.h index a0263a2..4c1584e 100644 --- a/include/utils.h +++ b/include/utils.h @@ -14,6 +14,29 @@ // 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++) -void _Noreturn panic_and_die(const char* msg, ...); +[[noreturn]] void panic_and_die(const char* msg, ...); + +#ifndef defer +struct defer_dummy {}; + +template +struct deferrer +{ + F f; + ~deferrer() { f(); } +}; + +template +deferrer +operator*(defer_dummy, F f) +{ + return { f }; +} + +#define DEFER_(LINE) zz_defer##LINE +#define DEFER(LINE_) DEFER_(LINE) +#define defer auto DEFER(__LINE__) = defer_dummy{} * [&]() + +#endif // defer #endif //UTILS_H \ No newline at end of file diff --git a/include/vecmath.h b/include/vecmath.h index 0916674..e3be4c3 100644 --- a/include/vecmath.h +++ b/include/vecmath.h @@ -3,7 +3,10 @@ #include "types.h" -typedef struct V2f { f32 x, y; } V2f; +struct V2f +{ + f32 x, y; +}; V2f v2f_add (V2f a, V2f b); V2f v2f_sub (V2f a, V2f b); @@ -14,6 +17,8 @@ f32 v2f_mag (V2f a); V2f v2f_norm(V2f a); V2f v2f_proj(V2f a, V2f onto); + + typedef float mat4[16]; void mat4_identity(mat4 *mat); diff --git a/project.4coder b/project.4coder index fa79a8e..30def96 100644 --- a/project.4coder +++ b/project.4coder @@ -4,6 +4,7 @@ project_name = "CSC718_Project"; patterns = { "*.c", +"*.cpp", "*.h", "*.sh", "*.glsl", diff --git a/src/log.c b/src/log.cpp similarity index 92% rename from src/log.c rename to src/log.cpp index 01256d3..6fd9486 100644 --- a/src/log.c +++ b/src/log.cpp @@ -1,5 +1,5 @@ -#include -#include +#include +#include #include "log.h" #include "utils.h" @@ -26,8 +26,8 @@ void logvprint(LogLevel level, const char* format, va_list va) { if (level < LOG_LEVEL_MINIMUM) return; - + printf("[%s] ", log_level_strs[level]); vprintf(format, va); printf("\n"); -} \ No newline at end of file +} diff --git a/src/physics.c b/src/physics.cpp similarity index 100% rename from src/physics.c rename to src/physics.cpp diff --git a/src/sim.c b/src/sim.cpp similarity index 94% rename from src/sim.c rename to src/sim.cpp index 36e8f50..769b65d 100644 --- a/src/sim.c +++ b/src/sim.cpp @@ -1,8 +1,8 @@ #define DEBUG -#include -#include -#include +#include +#include +#include #include #include #include @@ -61,9 +61,9 @@ init_glfw() glfwSetFramebufferSizeCallback(window, glfw_resize_handler); // NOTE(Brendan): This may need to be changed if the screen orientation changes. - //glEnable(GL_CULL_FACE); - //glFrontFace(GL_CW); - //glCullFace(GL_BACK); + glEnable(GL_CULL_FACE); + glFrontFace(GL_CW); + glCullFace(GL_BACK); } internal void @@ -87,7 +87,7 @@ load_shader(GLenum shader_type, const char* shader_loc) i32 shader_file_size = ftell(shader_file); fseek(shader_file, 0, SEEK_SET); - char* shader_buffer = malloc(shader_file_size + 1); + char* shader_buffer = (char *) malloc(shader_file_size + 1); fread(shader_buffer, 1, shader_file_size, shader_file); fclose(shader_file); @@ -147,12 +147,12 @@ create_program(GLuint vertex_shader, GLuint 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. -internal GLsizei +internal GLuint create_circle_mesh() { logprint(LOG_LEVEL_INFO, "Generating circle mesh"); - GLsizei vao; + GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); @@ -163,7 +163,7 @@ create_circle_mesh() circle_points[i].y = sin(t * 2 * PI) * 40.0f + 200.0f; } - GLsizei vertex_buffer; + GLuint vertex_buffer; glGenBuffers(1, &vertex_buffer); glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(circle_points), &circle_points, GL_STATIC_DRAW); @@ -174,7 +174,7 @@ create_circle_mesh() u8 circle_indicies[CIRCLE_POINT_COUNT] = {}; foreach(i, 0, CIRCLE_POINT_COUNT) circle_indicies[i] = i; - GLsizei index_buffer; + GLuint index_buffer; glGenBuffers(1, &index_buffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(circle_indicies), &circle_indicies, GL_STATIC_DRAW); @@ -231,7 +231,9 @@ i32 main(i32 argc, char* argv[]) { init_glfw(); - circle_mesh = create_circle_mesh(NULL); + defer { deinit_glfw(); }; + + circle_mesh = create_circle_mesh(); 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"); @@ -246,7 +248,5 @@ main(i32 argc, char* argv[]) loop(); - deinit_glfw(); - return 0; -} \ No newline at end of file +} diff --git a/src/utils.c b/src/utils.cpp similarity index 79% rename from src/utils.c rename to src/utils.cpp index 13d5ca2..141f25b 100644 --- a/src/utils.c +++ b/src/utils.cpp @@ -1,6 +1,6 @@ -#include -#include -#include +#include +#include +#include #include "log.h" @@ -8,16 +8,16 @@ void panic_and_die(const char* msg, ...) { puts("************ PANIC ************"); - + va_list va; va_start(va, msg); logvprint(LOG_LEVEL_ERROR, msg, va); va_end(va); - + #ifdef DEBUG // NOTE: This allows for a debugger to stop here. __asm("int $3"); #endif - + exit(1); -} \ No newline at end of file +} diff --git a/src/vecmath.c b/src/vecmath.cpp similarity index 98% rename from src/vecmath.c rename to src/vecmath.cpp index 6f61dde..985da6a 100644 --- a/src/vecmath.c +++ b/src/vecmath.cpp @@ -1,5 +1,5 @@ #include "vecmath.h" -#include +#include #include "utils.h" @@ -96,4 +96,4 @@ mat4_mul(mat4 a, mat4 b, mat4* out) } } } -} \ No newline at end of file +} -- 2.25.1