From 514a0d2d572474b4ee95ab98866d9fe9032a9e28 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Mon, 30 Nov 2020 11:36:52 -0600 Subject: [PATCH] added sequential version --- Makefile | 15 ++- dummy.settings | 4 +- sim_seq | Bin 0 -> 144720 bytes src/sim_seq.cpp | 346 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 357 insertions(+), 8 deletions(-) create mode 100755 sim_seq create mode 100644 src/sim_seq.cpp diff --git a/Makefile b/Makefile index f5d17e9..813c05e 100644 --- a/Makefile +++ b/Makefile @@ -7,8 +7,7 @@ OBJ_FILES=\ build/vecmath.o \ build/physics.o \ build/settings.o \ - build/ui.o \ - build/sim.o + build/ui.o LIB_FILES=\ lib/stb_truetype.o @@ -16,7 +15,8 @@ LIB_FILES=\ CC=g++ INCLUDES=-I./include LIBS=-lGL -lglfw -lm -lpthread -TARGET=./sim +PTH_TARGET=./sim +SEQ_TARGET=./sim_seq ifeq ($(RELEASE), 1) FLAGS=-O3 @@ -33,10 +33,13 @@ build/%.o: src/%.cpp build/%.o: src/%.c $(CC) $(FLAGS) -c $< -o $@ $(INCLUDES) -$(TARGET): $(OBJ_FILES) $(LIB_FILES) - $(CC) $(FLAGS) $(OBJ_FILES) $(LIB_FILES) -o $@ $(LIBS) +$(PTH_TARGET): $(OBJ_FILES) build/sim.o $(LIB_FILES) + $(CC) $(FLAGS) $(OBJ_FILES) build/sim.o $(LIB_FILES) -o $@ $(LIBS) + +$(SEQ_TARGET): $(OBJ_FILES) build/sim_seq.o $(LIB_FILES) + $(CC) $(FLAGS) $(OBJ_FILES) build/sim_seq.o $(LIB_FILES) -o $@ $(LIBS) clean: rm -f $(OBJ_FILES) 2>&1 >/dev/null -all: ./sim +all: ./sim ./sim_seq diff --git a/dummy.settings b/dummy.settings index bf207ef..d515ea3 100644 --- a/dummy.settings +++ b/dummy.settings @@ -1,6 +1,6 @@ -# Determines the number of parallel execution units to be used. +# Determines 4 # This must be at least 2 (for now). -thread_count 4 +thread_count 2 # Determines the number of physics bodies in the simulation. body_count 2500 diff --git a/sim_seq b/sim_seq new file mode 100755 index 0000000000000000000000000000000000000000..fcfc2c41a180bd982ab8a108869d4085b7d4656a GIT binary patch literal 144720 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 O)$#3j%$7bk{{I6z(hcVT literal 0 HcmV?d00001 diff --git a/src/sim_seq.cpp b/src/sim_seq.cpp new file mode 100644 index 0000000..37f3e49 --- /dev/null +++ b/src/sim_seq.cpp @@ -0,0 +1,346 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "types.h" +#include "container.h" +#include "utils.h" +#include "physics.h" +#include "ui.h" +#include "log.h" +#include "settings.h" + +// TODO(Brendan): Maybe this can be removed because it isn't really necessary? +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); + + if (key == GLFW_KEY_F && action == GLFW_PRESS) + { + persist bool is_fullscreen = false; + is_fullscreen = !is_fullscreen; + + if (is_fullscreen) + { + GLFWmonitor* primary_mon = glfwGetPrimaryMonitor(); + const GLFWvidmode* vidmode = glfwGetVideoMode(primary_mon); + glfwSetWindowMonitor(window, primary_mon, 0, 0, vidmode->width, vidmode->height, GLFW_DONT_CARE); + } + else + { + glfwSetWindowMonitor(window, NULL, 0, 0, 800, 600, GLFW_DONT_CARE); + } + } +} + +internal void +glfw_error_handler(i32 error, const char* desc) +{ + panic_and_die("GLFW Error (%d): %s\n", error, desc); +} + +GLFWwindow* window; +internal void +init_glfw() +{ + logprint(LOG_LEVEL_INFO, "Initializing GLFW"); + + if (!glfwInit()) panic_and_die("Failed to initalize GLFW."); + glfwSetErrorCallback(glfw_error_handler); + + window = glfwCreateWindow(1600, 900, "N-Body Simulation", NULL, NULL); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); + glfwMakeContextCurrent(window); + + glfwSwapInterval(1); + glfwSetKeyCallback(window, glfw_key_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_TEXTURE_2D); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +} + +internal void +deinit_glfw() +{ + glfwDestroyWindow(window); + glfwTerminate(); +} + +#define CIRCLE_POINT_COUNT 12 // NOTE(Brendan): Treat a circle as a many-sided polygon. + +// NOTE(Brendan): Returns the VAO where the mesh data was bound. +internal GLuint +create_circle_mesh() +{ + logprint(LOG_LEVEL_INFO, "Generating circle mesh"); + + GLuint vao; + glGenVertexArrays(1, &vao); + glBindVertexArray(vao); + + V2f circle_points[CIRCLE_POINT_COUNT] = {}; + foreach (i, 0, CIRCLE_POINT_COUNT) + { + f32 t = (f32) i / (f32) CIRCLE_POINT_COUNT; + circle_points[i].x = cos(t * 2 * 3.1415926535897); + circle_points[i].y = sin(t * 2 * 3.1415926535897); + } + + 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); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 2, GL_FLOAT, false, sizeof(V2f), (void *) offsetof(V2f, x)); + glBindBuffer(GL_ARRAY_BUFFER, -1); + + u8 circle_indicies[CIRCLE_POINT_COUNT] = {}; + foreach(i, 0, CIRCLE_POINT_COUNT) circle_indicies[i] = i; + + 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); + + glBindVertexArray(-1); + + return vao; +} + +struct SimState; +struct ThreadData +{ + i32 id; + SimState* state; +}; + +struct SimState +{ + Array bodies; + QuadTree qt_bodies; + FixedArenaAllocator> qt_body_allocator; + + Camera camera; +}; + +// @CLEANUP +internal f64 TEMP_dt = 0; + +internal void +update_bodies_partial(SimState *state, i32 index) +{ + i32 low = 0; + i32 high = global_settings.body_count; + + foreach (i, low, high) body_accumulate_move(&state->bodies[i], &state->qt_bodies, TEMP_dt); + foreach (i, low, high) body_apply_move(&state->bodies[i], TEMP_dt); +} + +internal void +sim_state_init(SimState* state) +{ + // NOTE(Brendan): Need to initialize the array since it does not get constructed because I refuse to use the 'new' keyword. alloc uses malloc under the hood and cannot initialize the result. + state->bodies.init(global_settings.body_count); + + foreach (i, 0, global_settings.body_count) + { + Body tmp_body; + tmp_body.body_type = (rand() % global_settings.body_type_count); + tmp_body.pos = V2f{ randf(-1000, 1000), randf(-1000, 1000) }; + tmp_body.vel = V2f{ 0.0f, 0.0f }; + + BodyMassRange bmr = global_settings.body_mass_range[tmp_body.body_type]; + tmp_body.mass = randf(bmr.min, bmr.max); + + state->bodies.push(tmp_body); + } + + state->qt_body_allocator.init(global_settings.body_count); + state->qt_bodies.init(AABB { -2000, -2000, 4000, 4000 }); + + state->camera.scale = 1.0f; +} + +// NOTE(Brendan): dt is expected to be in units of "per second". +internal void +update(SimState* state, f64 dt) +{ + glfwGetWindowSize(window, &state->camera.window_width, &state->camera.window_height); + + persist const f32 camera_move_speed = 6; + if (glfwGetKey(window, GLFW_KEY_UP)) state->camera.offset.y -= camera_move_speed; + if (glfwGetKey(window, GLFW_KEY_DOWN)) state->camera.offset.y += camera_move_speed; + if (glfwGetKey(window, GLFW_KEY_LEFT)) state->camera.offset.x -= camera_move_speed; + if (glfwGetKey(window, GLFW_KEY_RIGHT)) state->camera.offset.x += camera_move_speed; + if (glfwGetKey(window, GLFW_KEY_Q)) state->camera.scale *= 1.02f; + if (glfwGetKey(window, GLFW_KEY_A)) state->camera.scale /= 1.02f; + + state->qt_bodies.init(AABB { -2000, -2000, 4000, 4000 }); + state->qt_body_allocator.reset(); + For (state->bodies) state->qt_bodies.insert(&it, &state->qt_body_allocator); + + TEMP_dt = dt; + update_bodies_partial(state, 0); +} + +// NOTE CLEANUP(Brendan): Bunch of graphics state that should go elsewhere. +internal GLuint body_buffer; +internal GLuint circle_mesh; +internal GLuint body_program; + +// TEMPORARY +internal i32 frame_rate = 0; + +internal void +draw(SimState* state) +{ + // NOTE(Brendan): Rebuffer all the body data to the GPU. + glBindBuffer(GL_ARRAY_BUFFER, body_buffer); + glBufferSubData(GL_ARRAY_BUFFER, 0, state->bodies.size_in_bytes(), state->bodies.data); + glBindBuffer(GL_ARRAY_BUFFER, -1); + + glUseProgram(body_program); + + mat4 ortho_mat; + camera_ortho_mat4(state->camera, &ortho_mat); + GLuint ortho_mat_loc = glGetUniformLocation(body_program, "u_proj"); + glUniformMatrix4fv(ortho_mat_loc, 1, false, (f32 *) ortho_mat); + glViewport(0, 0, state->camera.window_width, state->camera.window_height); + + mat4 camera_mat; + camera_world_mat4(state->camera, &camera_mat); + GLuint camera_mat_loc = glGetUniformLocation(body_program, "u_camera"); + glUniformMatrix4fv(camera_mat_loc, 1, false, (f32 *) camera_mat); + + // NOTE(Brendan): Clear the screen. + glClearColor(0.1, 0.1, 0.1, 1.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // NOTE(Brendan): Draw the bodies. + glBindVertexArray(circle_mesh); + glDrawElementsInstanced(GL_TRIANGLE_FAN, CIRCLE_POINT_COUNT, GL_UNSIGNED_BYTE, 0, state->bodies.count); + glBindVertexArray(-1); + + font_set_projection_matrix(ortho_mat); + char fps_str[64]; + snprintf(fps_str, 63, "FPS: %d", frame_rate); + font_print(0, 32, fps_str); + + // NOTE(Brendan): Present the changes to the screen. + glfwSwapBuffers(window); +} + +internal void +loop(SimState* state) +{ + f64 last_time = glfwGetTime(); + f64 curr_time = last_time; + f64 delta = 0.0; + + f64 frame_delta = 0.0; + i32 frame_count = 0; + clock_t total_clock_delta = 0; + + while (!glfwWindowShouldClose(window)) + { + curr_time = glfwGetTime(); + delta = curr_time - last_time; + last_time = curr_time; + + clock_t before_update = clock(); + update(state, delta); + clock_t after_update = clock(); + total_clock_delta += (after_update - before_update); + + frame_count += 1; + draw(state); + + frame_delta += delta; + if (frame_delta >= 1.0) + { + total_clock_delta = 0; + frame_delta -= 1.0; + frame_rate = frame_count; + frame_count = 0; + } + + glfwPollEvents(); + } +} + +i32 +main(i32 argc, char* argv[]) +{ + srand(time(NULL)); + + if (argc > 1) + { + load_settings_from_file(&global_settings, argv[1]); + } + else + { + generate_random_settings(&global_settings); + } + + init_glfw(); + defer { deinit_glfw(); }; + + circle_mesh = create_circle_mesh(); + + init_font("res/font/Hack-Regular.ttf"); + + body_program = create_program(load_shader(GL_VERTEX_SHADER, "res/shaders/planet_vert.glsl"), + load_shader(GL_FRAGMENT_SHADER, "res/shaders/planet_frag.glsl")); + glUseProgram(body_program); + + GLuint planet_colors_loc = glGetUniformLocation(body_program, "u_planet_colors"); + GLfloat* planet_colors = (GLfloat *) global_settings.body_colors.data; + glUniform3fv(planet_colors_loc, global_settings.body_type_count, planet_colors); + + auto state = alloc(); + sim_state_init(state); + + // NOTE(Brendan): Other OpenGL initializations that could probably happen earlier. + { + glBindVertexArray(circle_mesh); + defer { glBindVertexArray(-1); }; + + glGenBuffers(1, &body_buffer); + glBindBuffer(GL_ARRAY_BUFFER, body_buffer); + glBufferData(GL_ARRAY_BUFFER, state->bodies.size_in_bytes(), state->bodies.data, GL_STREAM_DRAW); + + foreach (i, 1, 4) + { + glEnableVertexAttribArray(i); + glVertexAttribDivisor(i, 1); + } + 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)); + glVertexAttribPointer(3, 1, GL_BYTE, false, sizeof(Body), (void *) offsetof(Body, body_type)); + + glBindBuffer(GL_ARRAY_BUFFER, -1); + } + + loop(state); + + return 0; +} -- 2.25.1