diff --git a/src/camera.cpp b/src/camera.cpp new file mode 100644 index 0000000..21d7932 --- /dev/null +++ b/src/camera.cpp @@ -0,0 +1,17 @@ +#include "camera.h" + +Matrix4 get_camera_view_matrix(Camera *camera, Render_Data *render_data) { + f32 azimimuth_radians = glm::radians(render_data.view_azimuth); + f32 elevation_radians = glm::radians(render_data.view_elevation); + + f32 sin_azimuth = glm::sin(azimuth_radians); + f32 cos_azimuth = glm::cos(azimuth_radians); + f32 sin_elevation = glm::sin(elevation_radians); + f32 cos_elevation = glm::cos(elevation_radians); + + camera->view_direction = glm::normalize(Vector3(sin_azimuth * cos_elevation, sin_elevation, -cos_azimuth * cos_elevation)); + + Matrix4 look_at = glm::lookAt(camera->world_position, camera->world_position + camera->view_direction, camera->word_up_vector); + + return look_at; +} diff --git a/src/camera.h b/src/camera.h new file mode 100644 index 0000000..a619cc2 --- /dev/null +++ b/src/camera.h @@ -0,0 +1,15 @@ +#pragma once + +#include "basic.h" +#include +#include "renderer.h" +#include "render_data.h" + +struct Camera { + Vector3 world_position = Vector3(0.5f, 0.25f, 1.0f); + Vector3 view_direction = Vector3(0.0f, 0.0f, 0.0f); + Vector3 world_up_vector = Vector3(0.0f, 1.0f, 0.0f); +}; + +Matrix4 get_camera_view_matrix(Camera *camera, Render_Data *render_data); + diff --git a/src/render_data.h b/src/render_data.h index a996be9..c9bbf89 100644 --- a/src/render_data.h +++ b/src/render_data.h @@ -24,4 +24,7 @@ struct Render_Data { f32 user_interface_generate_time = 0.0f; bool use_alt_shader = false; s32 field_of_view = 90; + + f32 view_azimuth = 320.0f; + f32 view_elevation = -15.0f; }; diff --git a/src/renderer.h b/src/renderer.h index 8fccba3..ff5c5cd 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -7,6 +7,7 @@ #include #include "render_data.h" #include "user_interface.h" +#include "camera.h" #include "timer.h"