7#include <glm/ext/matrix_transform.hpp>
11 std::array<linalg_utils::Plane, 6>
planes;
16 for (
const auto &plane :
planes) {
17 bool all_outside =
true;
19 for (
const auto &
p : points) {
20 auto side = plane.classify_point(
p);
22 all_outside &= !inside;
110 std::array<glm::vec3, 8> corners = box.
get_corners();
111 for (
auto &
c : corners) {
112 glm::vec4 world = model * glm::vec4(
c, 1.0f);
113 c = glm::vec3(world);
137 glm::vec3
up = glm::vec3(0.0f, 1.0f, 0.0f);
157 glm::vec3 start_position = glm::vec3(0.0f, 0.0f, 0.0f),
double user_sensitivity = 1.0,
173 float fov_y = glm::radians(
fov.get());
177 float tan_half_fov_y = tanf(fov_y * 0.5f);
178 float near_height = 2.0f * near_z * tan_half_fov_y;
179 float near_width = near_height * aspect;
180 float far_height = 2.0f * far_z * tan_half_fov_y;
181 float far_width = far_height * aspect;
184 std::array<glm::vec3, 8> cam_corners = {
185 glm::vec3(-near_width / 2, -near_height / 2, -near_z), glm::vec3(near_width / 2, -near_height / 2, -near_z),
186 glm::vec3(-near_width / 2, near_height / 2, -near_z), glm::vec3(near_width / 2, near_height / 2, -near_z),
187 glm::vec3(-far_width / 2, -far_height / 2, -far_z), glm::vec3(far_width / 2, -far_height / 2, -far_z),
188 glm::vec3(-far_width / 2, far_height / 2, -far_z), glm::vec3(far_width / 2, far_height / 2, -far_z)};
194 glm::vec3 r_rad =
r * glm::two_pi<float>();
196 glm::mat4
T = glm::translate(glm::mat4(1.0f),
t);
197 glm::mat4 Rx = glm::rotate(glm::mat4(1.0f), r_rad.x, glm::vec3(1, 0, 0));
199 glm::mat4 Ry = glm::rotate(glm::mat4(1.0f), -r_rad.y - glm::two_pi<float>() / 4, glm::vec3(0, 1, 0));
200 glm::mat4 Rz = glm::rotate(glm::mat4(1.0f), r_rad.z, glm::vec3(0, 0, 1));
201 glm::mat4
R = Ry * Rx * Rz;
202 glm::mat4
S = glm::scale(glm::mat4(1.0f),
s);
203 glm::mat4 world_matrix =
T *
R *
S;
205 std::array<glm::vec3, 8> world_corners;
207 for (
auto &
c : cam_corners) {
208 glm::vec4
w = world_matrix * glm::vec4(
c, 1.0f);
209 world_corners[
i] = glm::vec3(
w);
213 glm::vec3 nbl = world_corners[0], nbr = world_corners[1], ntl = world_corners[2], ntr = world_corners[3];
214 glm::vec3 fbl = world_corners[4], fbr = world_corners[5], ftl = world_corners[6], ftr = world_corners[7];
241 return {left, right, bottom, top, near_, far_};
254 return frustum.intersects_points(corners);
257 void process_input(
bool slow_move_pressed,
bool fast_move_pressed,
bool forward_pressed,
bool left_pressed,
258 bool backward_pressed,
bool right_pressed,
bool up_pressed,
bool down_pressed,
float delta_time);
260 void mouse_callback(
double xpos,
double ypos,
double sensitivity_override = -1);
291 float view_width =
zoom * aspect;
292 float view_height =
zoom;
295 glm::vec3 nbl(-view_width +
offset.x, -view_height +
offset.y, -1.0f);
296 glm::vec3 nbr(view_width +
offset.x, -view_height +
offset.y, -1.0f);
297 glm::vec3 ntl(-view_width +
offset.x, view_height +
offset.y, -1.0f);
298 glm::vec3 ntr(view_width +
offset.x, view_height +
offset.y, -1.0f);
300 glm::vec3 fbl(-view_width +
offset.x, -view_height +
offset.y, 1.0f);
301 glm::vec3 fbr(view_width +
offset.x, -view_height +
offset.y, 1.0f);
302 glm::vec3 ftl(-view_width +
offset.x, view_height +
offset.y, 1.0f);
303 glm::vec3 ftr(view_width +
offset.x, view_height +
offset.y, 1.0f);
315 return {left, right, bottom, top, near_, far_};
338 glm::mat4 model =
transform.get_transform_matrix();
339 glm::vec3 min_world(std::numeric_limits<float>::max());
340 glm::vec3 max_world(-std::numeric_limits<float>::max());
341 for (
auto &
c : corners) {
342 glm::vec4 world_c = model * glm::vec4(
c, 1.0f);
343 min_world = glm::min(min_world, glm::vec3(world_c));
344 max_world = glm::max(max_world, glm::vec3(world_c));
348 glm::vec2 aabb_min(min_world.x, min_world.y);
349 glm::vec2 aabb_max(max_world.x, max_world.y);
353 float view_width =
zoom * aspect;
354 float view_height =
zoom;
356 glm::vec2 cam_min(-view_width +
offset.x, -view_height +
offset.y);
357 glm::vec2 cam_max(view_width +
offset.x, view_height +
offset.y);
360 return !(aabb_max.x < cam_min.x || aabb_min.x > cam_max.x || aabb_max.y < cam_min.y || aabb_min.y > cam_max.y);
368 float view_width =
zoom * aspect;
369 float view_height =
zoom;
371 glm::mat4 projection = glm::ortho(-view_width +
offset.x, view_width +
offset.x, -view_height +
offset.y,
372 view_height +
offset.y, -1.0f, 1.0f);
385 void update(
double mouse_delta_x,
double mouse_delta_y,
unsigned int width,
unsigned int height,
bool is_dragging) {
387 float aspect =
static_cast<float>(width) / height;
388 float sensitivity = 10;
389 offset.x -= sensitivity *
static_cast<float>(mouse_delta_x) / width *
zoom * aspect * 2.0f;
390 offset.y += sensitivity *
static_cast<float>(mouse_delta_y) / height *
zoom * 2.0f;
void zoom_out()
Definition fps_camera.cpp:50
float slow_move_speed
Definition fps_camera.hpp:136
bool is_visible(const std::vector< glm::vec3 > &xyz_positions, Transform &transform) override
Definition fps_camera.hpp:244
void process_input(bool slow_move_pressed, bool fast_move_pressed, bool forward_pressed, bool left_pressed, bool backward_pressed, bool right_pressed, bool up_pressed, bool down_pressed, float delta_time)
Definition fps_camera.cpp:56
double unscoped_sensitivity
Definition fps_camera.hpp:150
void toggle_mouse_freeze()
Definition fps_camera.cpp:98
bool is_visible(const vertex_geometry::AxisAlignedBoundingBox &aabb, Transform &transform) override
Definition fps_camera.hpp:250
float original_fov
Definition fps_camera.hpp:146
float move_speed
Definition fps_camera.hpp:134
float far_plane
Definition fps_camera.hpp:146
double active_sensitivity
Definition fps_camera.hpp:151
glm::mat4 get_projection_matrix() const override
the projection matrix is the one that takes the world and applies the perspective view on the world
Definition fps_camera.cpp:141
Observable< float > fov
Definition fps_camera.hpp:148
void unfreeze_camera()
Definition fps_camera.cpp:100
void freeze_camera()
Definition fps_camera.cpp:99
void mouse_callback(double xpos, double ypos, double sensitivity_override=-1)
Definition fps_camera.cpp:102
glm::mat4 projection
Definition fps_camera.hpp:138
glm::mat4 get_third_person_view_matrix() const
Definition fps_camera.cpp:122
void change_active_sensitivity(double new_sens)
Definition fps_camera.cpp:40
glm::mat4 get_view_matrix_at(glm::vec3 position) const
Definition fps_camera.cpp:134
float zoom_fov
Definition fps_camera.hpp:146
FPSCamera(unsigned int &screen_width_px, unsigned int &screen_height_px, glm::vec3 start_position=glm::vec3(0.0f, 0.0f, 0.0f), double user_sensitivity=1.0, float fov=90.0f, float zoom_fov=30.0f, float near_plane=0.01f, float far_plane=300.0f)
Definition fps_camera.cpp:8
Mouse mouse
Definition fps_camera.hpp:131
void toggle_zoom()
Definition fps_camera.cpp:32
bool zoomed_in
Definition fps_camera.hpp:145
glm::vec3 up
Definition fps_camera.hpp:137
float near_plane
Definition fps_camera.hpp:146
unsigned int & screen_height_px
Definition fps_camera.hpp:154
glm::mat4 get_view_matrix() const override
this is the matrix that puts the camera in the right place and looking in the right place
Definition fps_camera.cpp:117
bool camera_frozen
Definition fps_camera.hpp:140
unsigned int & screen_width_px
Definition fps_camera.hpp:153
Frustum get_visible_frustum_world_space() override
Definition fps_camera.hpp:169
void zoom_in()
Definition fps_camera.cpp:45
float fast_move_speed
Definition fps_camera.hpp:135
Definition logger.hpp:182
Definition observable.hpp:7
Definition linalg_utils.hpp:42
@ NormalSide
Definition linalg_utils.hpp:57
Definition vertex_geometry.hpp:70
std::array< glm::vec3, 8 > get_corners() const
Definition vertex_geometry.hpp:86
std::array< glm::vec3, 8 > get_aabb_corners_world(const vertex_geometry::AxisAlignedBoundingBox &box, Transform &transform)
Definition fps_camera.hpp:107
Logger global_logger
Definition logger.cpp:3
glm::mat4 get_transform_matrix() const
Definition fps_camera.hpp:366
bool is_dragging
Definition fps_camera.hpp:282
bool is_visible(const vertex_geometry::AxisAlignedBoundingBox &aabb, Transform &transform) override
Definition fps_camera.hpp:332
double last_mouse_pos_x
Definition fps_camera.hpp:279
unsigned int & screen_height_px
Definition fps_camera.hpp:284
Camera2D(unsigned int &screen_width_px, unsigned int &screen_height_px)
Definition fps_camera.hpp:286
glm::mat4 get_view_matrix() const override
Definition fps_camera.hpp:318
void on_scroll(double x_offset, double y_offset)
Definition fps_camera.hpp:376
void update(double mouse_delta_x, double mouse_delta_y, unsigned int width, unsigned int height, bool is_dragging)
Definition fps_camera.hpp:385
glm::mat4 get_projection_matrix() const override
Definition fps_camera.hpp:364
bool is_visible(const std::vector< glm::vec3 > &xyz_positions, Transform &transform) override
Definition fps_camera.hpp:323
Frustum get_visible_frustum_world_space() override
Definition fps_camera.hpp:289
float zoom
Definition fps_camera.hpp:275
double last_mouse_pos_y
Definition fps_camera.hpp:280
glm::vec2 offset
Definition fps_camera.hpp:277
unsigned int & screen_width_px
Definition fps_camera.hpp:284
Definition fps_camera.hpp:10
std::array< linalg_utils::Plane, 6 > planes
Definition fps_camera.hpp:11
bool intersects_points(const Container &points) const
Definition fps_camera.hpp:15
Definition fps_camera.hpp:118
Transform transform
Definition fps_camera.hpp:126
virtual bool is_visible(const vertex_geometry::AxisAlignedBoundingBox &aabb, Transform &transform)=0
virtual glm::mat4 get_projection_matrix() const =0
virtual Frustum get_visible_frustum_world_space()=0
virtual ~ICamera()=default
virtual glm::mat4 get_view_matrix() const =0
virtual bool is_visible(const std::vector< glm::vec3 > &xyz_positions, Transform &transform)=0