diff --git a/.clangd b/.clangd new file mode 100644 index 0000000..8379b43 --- /dev/null +++ b/.clangd @@ -0,0 +1,7 @@ + +CompileFlags: + Add: [-xc, -std=c11] +If: + PathMatch: [".*\\.h$"] +CompileFlags: + Add: [-x, c-header] diff --git a/CMakeLists.txt b/CMakeLists.txt index cee399f..7e891be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,7 @@ cmake_minimum_required(VERSION 3.20) +set(CMAKE_C_COMPILER gcc) + project(fuckedphysics VERSION 0.1.0 LANGUAGES C @@ -19,6 +21,9 @@ find_package(raylib REQUIRED) add_executable(${PROJECT_NAME} main.c + cphysics.c + mechanics.c + vec_util.c ) target_link_libraries(${PROJECT_NAME} diff --git a/main.c b/main.c index da430b7..c64f4d0 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,7 @@ #define _POSIX_C_SOURCE 200809L +#include "consts.h" +#include "mechanics.h" #include #include #include @@ -9,8 +11,6 @@ #include #include #include -#include "consts.h" -#include "mechanics.h" int center_x_text(const char *text, int width, int size) { return (width - MeasureText(text, size)) / 2; @@ -20,8 +20,6 @@ static inline int center_y_text(int height, int size) { return (height - size) / 2; } - - long long timespec_diff_ns(struct timespec end, struct timespec start) { return (end.tv_sec - start.tv_sec) * 1000000000LL + (end.tv_nsec - start.tv_nsec); @@ -51,6 +49,8 @@ void *physics(void *args) { } int main(void) { + float v_scale = 1; + Vector2 canvas_offset = {0, 0}; pthread_t physics_thread; const char *welcome_text = "Welcome to Fucked Physics!"; universe_t universe = {0, NULL}; @@ -95,11 +95,60 @@ int main(void) { while (!WindowShouldClose()) { + int key_pressed = 0; + do { + key_pressed = GetKeyPressed(); + switch (key_pressed) { + case KEY_I: + v_scale += 0.1; + break; + case KEY_O: + if (v_scale > 0.1) { + v_scale -= 0.1; + } + break; + case KEY_LEFT: + canvas_offset.x += 100; + break; + case KEY_RIGHT: + canvas_offset.x -= 100; + break; + case KEY_UP: + canvas_offset.y += 100; + break; + case KEY_DOWN: + canvas_offset.y -= 100; + break; + } + } while (key_pressed != 0); + + if (canvas_offset.x + GetRenderWidth() * 0.5 / v_scale > + GetRenderWidth() * 5) { + canvas_offset.x = + -GetRenderWidth() * 0.5 / v_scale + GetRenderWidth() * 5; + } else if (canvas_offset.x - GetRenderWidth() * 0.5 / v_scale < + -GetRenderWidth() * 5) { + canvas_offset.x = GetRenderWidth() * 0.5 / v_scale - GetRenderWidth() * 5; + } + + if (canvas_offset.y + GetRenderHeight() * 0.5 / v_scale > + GetRenderHeight() * 5) { + canvas_offset.y = + -GetRenderHeight() * 0.5 / v_scale + GetRenderHeight() * 5; + } else if (canvas_offset.y - GetRenderHeight() * 0.5 / v_scale < + -GetRenderHeight() * 5) { + canvas_offset.y = + GetRenderHeight() * 0.5 / v_scale - GetRenderHeight() * 5; + } + BeginDrawing(); ClearBackground(RAYWHITE); for (unsigned int i = 0; i < universe.num_bodies; i++) { - DrawCircleV(transform_to_center(universe.bodies[i].position), - universe.bodies[i].radius, + Vector2 scaled_offset = vec2_scale(&canvas_offset, v_scale); + Vector2 body_position = vec2_scale(&universe.bodies[i].position, v_scale); + body_position = vec2_sum(&body_position, &scaled_offset); + DrawCircleV(transform_to_center(body_position), + universe.bodies[i].radius * v_scale, (Color){((256 / universe.num_bodies) * i) % 256, 255 * (i % 2), 255 * (i % 2) * (i % 3), 255}); }