summaryrefslogtreecommitdiff
path: root/src/camera.c
diff options
context:
space:
mode:
authorTyler Murphy <tylerm@tylerm.dev>2023-04-26 20:18:41 -0400
committerTyler Murphy <tylerm@tylerm.dev>2023-04-26 20:18:41 -0400
commit0294878ddabd07a677930536daff0e6ca3bea081 (patch)
treecbb466c102f636c930c5c5577b24301944b269e7 /src/camera.c
parentfix color to use argb (diff)
downloadraycaster-0294878ddabd07a677930536daff0e6ca3bea081.tar.gz
raycaster-0294878ddabd07a677930536daff0e6ca3bea081.tar.bz2
raycaster-0294878ddabd07a677930536daff0e6ca3bea081.zip
refactor camera into its own directoryHEADmain
Diffstat (limited to '')
-rw-r--r--src/camera.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/camera.c b/src/camera.c
new file mode 100644
index 0000000..fa2d0e8
--- /dev/null
+++ b/src/camera.c
@@ -0,0 +1,76 @@
+#include "camera.h"
+
+#include <math.h>
+
+void init_camera(Camera* camera) {
+ camera->pos.x = 3;
+ camera->pos.y = 3;
+ camera->angle = PI / 4;
+ camera->fov = PI / 4;
+}
+
+#define MOVE_SPEED 1
+#define ROTATE_SPEED PI / 2
+#define FOV_CHANGE_SPEED .5
+#define PLAYER_SIZE .1
+
+void update_camera(Camera* camera, Screen* screen) {
+ double rotate = 0;
+
+ if (key_down(KEY_LEFT))
+ rotate -= ROTATE_SPEED;
+
+ if (key_down(KEY_RIGHT))
+ rotate += ROTATE_SPEED;
+
+ rotate *= screen->delta;
+ rotate += camera->angle;
+ while (rotate >= PI2) rotate -= PI2;
+ while (rotate < 0) rotate += PI2;
+ camera->angle = rotate;
+
+ v2 forward = { cos(camera->angle), sin(camera->angle) };
+ v2 left = { forward.y, -forward.x };
+ v2 move = { 0, 0 };
+
+ if (key_down(KEY_W)) {
+ move.x += forward.x;
+ move.y += forward.y;
+ }
+
+ if (key_down(KEY_S)) {
+ move.x -= forward.x;
+ move.y -= forward.y;
+ }
+
+ if (key_down(KEY_A)) {
+ move.x += left.x;
+ move.y += left.y;
+ }
+
+ if (key_down(KEY_D)) {
+ move.x -= left.x;
+ move.y -= left.y;
+ }
+
+ if (key_down(KEY_EQUALS)) {
+ camera->fov += FOV_CHANGE_SPEED * screen->delta;
+ }
+
+ if (key_down(KEY_MINUS)) {
+ camera->fov -= FOV_CHANGE_SPEED * screen->delta;
+ }
+
+ v2 hit_pos;
+ bool movex, movey;
+
+ cast_ray(camera->pos, sign(move.x) == 1 ? 0 : PI, &hit_pos);
+ movex = v2_dist(hit_pos, camera->pos) > PLAYER_SIZE;
+
+ cast_ray(camera->pos, sign(move.y) == 1 ? PIH : -PIH, &hit_pos);
+ movey = v2_dist(hit_pos, camera->pos) > PLAYER_SIZE;
+
+ if (movex) camera->pos.x += move.x * MOVE_SPEED * screen->delta;
+ if (movey) camera->pos.y += move.y * MOVE_SPEED * screen->delta;
+}
+