From 6b8af9cf83851c075c6c9514b1deaa931c2b19a4 Mon Sep 17 00:00:00 2001 From: Thomas Guillermo Albers Raviola Date: Fri, 16 Jan 2026 23:02:32 +0100 Subject: Initial commit --- 07-july/src/camera.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 07-july/src/camera.c (limited to '07-july/src/camera.c') 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; +} -- cgit v1.2.3