aboutsummaryrefslogtreecommitdiff
path: root/07-july/src/camera.c
diff options
context:
space:
mode:
authorThomas Guillermo Albers Raviola <thomas@thomaslabs.org>2026-01-16 23:02:32 +0100
committerThomas Guillermo Albers Raviola <thomas@thomaslabs.org>2026-01-16 23:02:32 +0100
commit6b8af9cf83851c075c6c9514b1deaa931c2b19a4 (patch)
tree428986b49c32e21d3f7a3c2dfa41858ae0153209 /07-july/src/camera.c
Initial commit
Diffstat (limited to '07-july/src/camera.c')
-rw-r--r--07-july/src/camera.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/07-july/src/camera.c b/07-july/src/camera.c
new file mode 100644
index 0000000..9afadf2
--- /dev/null
+++ b/07-july/src/camera.c
@@ -0,0 +1,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;
+}