summaryrefslogtreecommitdiff
path: root/src/camera.c
blob: fa2d0e8254d368827a4fc5eca5ec080ef6b4ae41 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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;
}