From e1956ddab691afb07114cbee55dd06caa329211d Mon Sep 17 00:00:00 2001 From: Jeremiah Morgan Date: Sun, 6 Apr 2025 14:28:19 +0100 Subject: [PATCH] Renderer: Camera Bounds# --- libopenage/renderer/camera/boundaries.cpp | 5 ++++ libopenage/renderer/camera/boundaries.h | 2 ++ .../renderer/stages/camera/CMakeLists.txt | 1 + libopenage/renderer/stages/camera/manager.cpp | 6 +++++ libopenage/renderer/stages/camera/manager.h | 6 +++++ .../renderer/stages/camera/render_entity.cpp | 21 +++++++++++++++ .../renderer/stages/camera/render_entity.h | 27 +++++++++++++++++++ 7 files changed, 68 insertions(+) create mode 100644 libopenage/renderer/stages/camera/render_entity.cpp create mode 100644 libopenage/renderer/stages/camera/render_entity.h diff --git a/libopenage/renderer/camera/boundaries.cpp b/libopenage/renderer/camera/boundaries.cpp index ca77344c7e..5f7e1178cf 100644 --- a/libopenage/renderer/camera/boundaries.cpp +++ b/libopenage/renderer/camera/boundaries.cpp @@ -1,9 +1,14 @@ // Copyright 2024-2024 the openage authors. See copying.md for legal info. +#include + #include "boundaries.h" namespace openage::renderer::camera { +bool CameraBoundaries::operator==(const CameraBoundaries &rhs) { + return (std::tie(x_min, x_max, y_min, y_max, z_min, z_max) == std::tie(rhs.x_min, rhs.x_max, rhs.y_min, rhs.y_max, rhs.z_min, rhs.z_max)); +} } // namespace openage::renderer::camera diff --git a/libopenage/renderer/camera/boundaries.h b/libopenage/renderer/camera/boundaries.h index 484a398455..4af99ff872 100644 --- a/libopenage/renderer/camera/boundaries.h +++ b/libopenage/renderer/camera/boundaries.h @@ -20,6 +20,8 @@ struct CameraBoundaries { float z_min; /// The maximum boundary for the camera's Z-coordinate. float z_max; + + bool operator==(const CameraBoundaries &rhs); }; } // namespace openage::renderer::camera diff --git a/libopenage/renderer/stages/camera/CMakeLists.txt b/libopenage/renderer/stages/camera/CMakeLists.txt index 359967eda0..e2b1d536b2 100644 --- a/libopenage/renderer/stages/camera/CMakeLists.txt +++ b/libopenage/renderer/stages/camera/CMakeLists.txt @@ -1,3 +1,4 @@ add_sources(libopenage manager.cpp + render_entity.cpp ) diff --git a/libopenage/renderer/stages/camera/manager.cpp b/libopenage/renderer/stages/camera/manager.cpp index d3cbd3f3b2..938e93b2d7 100644 --- a/libopenage/renderer/stages/camera/manager.cpp +++ b/libopenage/renderer/stages/camera/manager.cpp @@ -72,6 +72,12 @@ void CameraManager::set_camera_boundaries(const CameraBoundaries &camera_boundar this->camera_boundaries = camera_boundaries; } +void CameraManager::poll_render_entity() { + if (render_entity->is_changed()) { + this->camera_boundaries = render_entity->get_camera_boundaries(); + } +} + void CameraManager::update_motion() { if (this->move_motion_directions != static_cast(MoveDirection::NONE)) { Eigen::Vector3f move_dir{0.0f, 0.0f, 0.0f}; diff --git a/libopenage/renderer/stages/camera/manager.h b/libopenage/renderer/stages/camera/manager.h index 36d605e959..088e8f38ab 100644 --- a/libopenage/renderer/stages/camera/manager.h +++ b/libopenage/renderer/stages/camera/manager.h @@ -6,6 +6,7 @@ #include #include "renderer/camera/camera.h" +#include "renderer/stages/camera/render_entity.h" namespace openage::renderer { class UniformBufferInput; @@ -114,6 +115,9 @@ class CameraManager { */ void set_camera_boundaries(const CameraBoundaries &camera_boundaries); + + void poll_render_entity(); + private: /** * Update the camera parameters. @@ -159,6 +163,8 @@ class CameraManager { * Camera boundaries for X and Z movement. Contains minimum and maximum values for each axes. */ CameraBoundaries camera_boundaries; + + std::shared_ptr render_entity; }; } // namespace camera diff --git a/libopenage/renderer/stages/camera/render_entity.cpp b/libopenage/renderer/stages/camera/render_entity.cpp new file mode 100644 index 0000000000..cf40be91d2 --- /dev/null +++ b/libopenage/renderer/stages/camera/render_entity.cpp @@ -0,0 +1,21 @@ +// Copyright 2024-2025 the openage authors. See copying.md for legal info. + +#pragma once + +#include "render_entity.h" + +namespace openage::renderer::camera { + +void RenderEntity::update(const CameraBoundaries& boundaries, const time::time_t time) +{ + std::unique_lock lock{this->mutex}; + + this->camera_boundaries = camera_boundaries; + this->last_update = time; + this->changed = true; +} + +const CameraBoundaries &RenderEntity::get_camera_boundaries() { + return this->camera_boundaries; +} +} \ No newline at end of file diff --git a/libopenage/renderer/stages/camera/render_entity.h b/libopenage/renderer/stages/camera/render_entity.h new file mode 100644 index 0000000000..0cd94f063e --- /dev/null +++ b/libopenage/renderer/stages/camera/render_entity.h @@ -0,0 +1,27 @@ +// Copyright 2024-2025 the openage authors. See copying.md for legal info. + +#pragma once + +#include "renderer/camera/boundaries.h" +#include "gamestate/definitions.h" +#include "renderer/stages/render_entity.h" + + +namespace openage::renderer::camera { + +class RenderEntity final : public renderer::RenderEntity { +public: + RenderEntity(); + ~RenderEntity() = default; + + void update(const CameraBoundaries& camera_boundaries, const time::time_t time = 0.0); + + const CameraBoundaries& get_camera_boundaries(); + + + +private: + CameraBoundaries camera_boundaries; +}; + +} \ No newline at end of file