From b76e73d57b35c0a6f4cfea7ae4cdbe34523db8ff Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Sun, 27 Aug 2023 20:58:12 +0100 Subject: [PATCH] Add ability to change FOV --- compile_commands.json | 4 ++-- main.c | 42 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/compile_commands.json b/compile_commands.json index 579b145..51504bc 100644 --- a/compile_commands.json +++ b/compile_commands.json @@ -71,11 +71,11 @@ "-x", "c", "-o", - "/tmp/main-b05c2f.o", + "/tmp/main-f47303.o", "main.c" ], "directory": "/home/abdelrahman/Sources/programming/starfield", "file": "/home/abdelrahman/Sources/programming/starfield/main.c", - "output": "/tmp/main-b05c2f.o" + "output": "/tmp/main-f47303.o" } ] diff --git a/main.c b/main.c index 6ca7227..e85b4db 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,6 @@ #include "aliases.h" #include +#include #include #include #include @@ -8,6 +9,7 @@ #include #include #include +#include #include #include @@ -26,6 +28,13 @@ #define PROJECTION_PLANE 1.0 +#define RAD(DEG) ((DEG * M_PI) / 180.0) +#define DEG(RAD) ((RAD * 180.0) / M_PI) + +#define FOV_MIN 1.0 +#define FOV_MAX 170.0 +#define FOV_INC 3.0 + typedef struct { u32 x; u32 y; @@ -58,7 +67,7 @@ void init_starfield(vec3f_t *stars, u32 count, i32 spread); void update_startfield(vec3f_t *stars, u32 count, i32 spread, u32 speed, f64 delta); void render_starfield(SDL_Surface *surface, vec3f_t *stars, u32 count, - i32 spread); + i32 spread, f64 fov); int main(void) { srand(time(NULL)); @@ -83,6 +92,7 @@ int main(void) { init_starfield(stars, STAR_COUNT, STAR_SPREAD); f64 delta = 1.0 / 60.0; // constant delta + f64 fov = 60.0; while (running) { while (SDL_PollEvent(&event)) { @@ -90,6 +100,26 @@ int main(void) { case SDL_QUIT: running = false; break; + case SDL_KEYDOWN: + switch (event.key.keysym.sym) { + case SDLK_UP: + fov -= FOV_INC; + + if (fov < FOV_MIN) { + fov = FOV_MIN; + } + + break; + case SDLK_DOWN: + fov += FOV_INC; + + if (fov > FOV_MAX) { + fov = FOV_MAX; + } + + break; + } + break; } } @@ -97,7 +127,7 @@ int main(void) { render_clear(canvas, BG_COLOR); - render_starfield(canvas, stars, STAR_COUNT, STAR_SPREAD); + render_starfield(canvas, stars, STAR_COUNT, STAR_SPREAD, fov); SDL_BlitSurface(canvas, NULL, surface, NULL); @@ -215,17 +245,19 @@ void update_startfield(vec3f_t *stars, u32 count, i32 spread, u32 speed, } void render_starfield(SDL_Surface *surface, vec3f_t *stars, u32 count, - i32 spread) { + i32 spread, f64 fov) { vec2f_t projected[count]; vec2i_t coords; + f64 tangent = tan(RAD(fov * 0.5)); + for (u32 i = 0; i < count; ++i) { if (stars[i].z == 0.0) { continue; } - projected[i] = - (vec2f_t){.x = stars[i].x / stars[i].z, .y = stars[i].y / stars[i].z}; + projected[i] = (vec2f_t){.x = stars[i].x / stars[i].z / tangent, + .y = stars[i].y / stars[i].z / tangent}; if (projected[i].x < NORMALISED_MIN || projected[i].x > NORMALISED_MAX || projected[i].y < NORMALISED_MIN || projected[i].y > NORMALISED_MAX ||