diff options
| author | Thomas Guillermo Albers Raviola <thomas@thomaslabs.org> | 2026-01-16 23:02:32 +0100 |
|---|---|---|
| committer | Thomas Guillermo Albers Raviola <thomas@thomaslabs.org> | 2026-01-16 23:02:32 +0100 |
| commit | 6b8af9cf83851c075c6c9514b1deaa931c2b19a4 (patch) | |
| tree | 428986b49c32e21d3f7a3c2dfa41858ae0153209 /09-september/tomcat/renderer/camera.c | |
Initial commit
Diffstat (limited to '09-september/tomcat/renderer/camera.c')
| -rw-r--r-- | 09-september/tomcat/renderer/camera.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/09-september/tomcat/renderer/camera.c b/09-september/tomcat/renderer/camera.c new file mode 100644 index 0000000..8a0c620 --- /dev/null +++ b/09-september/tomcat/renderer/camera.c @@ -0,0 +1,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; +} |
