#include "camera.h" #include "util/util_time.h" static const float movementSpeed = 40.0f; void Camera_Init(camera_t* camera) { camera->position = (vec3_t){ 4.0f, 40.0f, 4.0f }; camera->viewDirection = (vec3_t){ -1.0f, -1.0f, 0.0f }; camera->needsUpdate = true; camera->up = (vec3_t){ 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; }