diff options
Diffstat (limited to '')
-rw-r--r-- | src/camera.c | 76 |
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; +} + |