#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;
}