aboutsummaryrefslogtreecommitdiff
path: root/09-september/tomcat/renderer/camera.c
blob: 8a0c620562eaef8bcce715f2d22804b3a37693fc (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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "camera.h"

#include "../util/util_time.h"

static const float movementSpeed = 40.0f;

Camera *camera_new()
{
    Camera *camera;
    camera = malloc( sizeof(Camera) );

    camera->position = (Vec3){ 0.0f, 6.0f, 0.0f };
    camera->viewDirection = (Vec3){ 0.5f, 0.0f, -1.0f };
    camera->needsUpdate = true;
    camera->up = (Vec3){ 0.0f, 1.0f, 0.0f };

    return camera;
}

void camera_move_up(Camera* camera)
{
    Vec3 temp = vec3_scalar_mul(&camera->up, movementSpeed * Time_GetFrameTime());
    camera->position = vec3_add(&camera->position, &temp);
}

void camera_move_down(Camera* camera)
{
    Vec3 temp = vec3_scalar_mul(&camera->up, -movementSpeed * Time_GetFrameTime());
    camera->position = vec3_add(&camera->position, &temp);
}

void camera_move_left(Camera* camera)
{
    Vec3 strafeDirection = vec3_cross_mul(&camera->viewDirection, &camera->up);
    strafeDirection = vec3_scalar_mul(&strafeDirection, -movementSpeed * Time_GetFrameTime());
    camera->position = vec3_add(&camera->position, &strafeDirection);
}

void camera_move_right(Camera* camera)
{
    Vec3 strafeDirection = vec3_cross_mul(&camera->viewDirection, &camera->up);
    strafeDirection = vec3_scalar_mul(&strafeDirection, movementSpeed * Time_GetFrameTime());
    camera->position = vec3_add(&camera->position, &strafeDirection);
}

void camera_move_foward(Camera* camera)
{
    Vec3 temp = vec3_scalar_mul(&camera->viewDirection, movementSpeed * Time_GetFrameTime());
    camera->position = vec3_add(&camera->position, &temp);
}

void camera_move_backward(Camera* camera)
{
    Vec3 temp = vec3_scalar_mul(&camera->viewDirection, -movementSpeed * Time_GetFrameTime());
    camera->position = vec3_add(&camera->position, &temp);
}

void camera_mouse_update(Camera *camera, const Vec2 *newMousePosition)
{
    Vec2 mouseDelta = vec2_sub(newMousePosition, &camera->mousePosition);

    /* El if evita que el mouse se teletrasporte al cambiar de posicion muy rapido */
    if(vec2_length(&mouseDelta) > 50.0f){
        camera->mousePosition = *newMousePosition;
        return;
    }

    Vec3 verticalRotation = vec3_cross_mul(&camera->viewDirection, &camera->up);

    Mat4 temp = mat4_rotate(mouseDelta.x * -0.5f, &camera->up);

    camera->viewDirection = mat4_mul_vec3(&temp, &camera->viewDirection);

    temp = mat4_rotate(mouseDelta.y * -0.5f, &verticalRotation);
    camera->viewDirection = mat4_mul_vec3(&temp, &camera->viewDirection);

    camera->mousePosition = *newMousePosition;

    camera->needsUpdate = true;
}

void camera_free(Camera *camera)
{
    free(camera);
}

Mat4 camera_get_model_to_view_matrix(Camera* camera)
{
    if(camera->needsUpdate)
    {
        Vec3 temp = vec3_add(&camera->position, &camera->viewDirection);
        camera->viewMatrix = mat4_lookAt(&camera->position, &temp, &camera->up);
    }
    return camera->viewMatrix;
}