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
|
#include "camera.h"
#include "util/util_time.h"
static const float movementSpeed = 40.0f;
void Camera_Init(camera_t* camera)
{
camera->position = vec3_create(5.0f, 15.0f, 0.0f);
camera->viewDirection = vec3_create(-1.0f, 0.0f, 0.0f);
camera->needsUpdate = true;
camera->up = vec3_create(0.0f, 1.0f, 0.0f);
}
void Camera_Move_Up(camera_t* camera)
{
vec3_t temp = vec3_scalar_mul(&camera->up, movementSpeed * Time_GetFrameTime());
camera->position = vec3_add(&camera->position, &temp);
}
void Camera_Move_Down(camera_t* camera)
{
vec3_t temp = vec3_scalar_mul(&camera->up, -movementSpeed * Time_GetFrameTime());
camera->position = vec3_add(&camera->position, &temp);
}
void Camera_Move_Left(camera_t* camera)
{
vec3_t 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_t* camera)
{
vec3_t 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_t* camera)
{
vec3_t temp = vec3_scalar_mul(&camera->viewDirection, movementSpeed * Time_GetFrameTime());
camera->position = vec3_add(&camera->position, &temp);
}
void Camera_Move_Backward(camera_t* camera)
{
vec3_t temp = vec3_scalar_mul(&camera->viewDirection, -movementSpeed * Time_GetFrameTime());
camera->position = vec3_add(&camera->position, &temp);
}
void Camera_MouseUpdate(camera_t* camera, const vec2_t* newMousePosition)
{
vec2_t 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_t verticalRotation = vec3_cross_mul(&camera->viewDirection, &camera->up);
mat4_t 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;
}
mat4_t Camera_GetModelToViewMatrix(camera_t* camera)
{
if(camera->needsUpdate)
{
vec3_t temp = vec3_add(&camera->position, &camera->viewDirection);
camera->viewMatrix = mat4_lookAt(&camera->position, &temp, &camera->up);
}
return camera->viewMatrix;
}
|