From 3509feaf27e6ea3889b8fc86187943e211a4159f Mon Sep 17 00:00:00 2001 From: Ruixiang Du Date: Tue, 8 Jul 2025 16:14:32 +0800 Subject: [PATCH] camera_controller: added functions for better camera control --- .../include/renderer/camera_controller.hpp | 3 +++ .../include/renderer/renderable/canvas.hpp | 2 ++ src/renderer/src/camera_controller.cpp | 19 ++++++++++++++++--- src/renderer/src/renderable/canvas.cpp | 7 +++++++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/renderer/include/renderer/camera_controller.hpp b/src/renderer/include/renderer/camera_controller.hpp index ba77a0b..d7b499a 100644 --- a/src/renderer/include/renderer/camera_controller.hpp +++ b/src/renderer/include/renderer/camera_controller.hpp @@ -38,6 +38,9 @@ class CameraController { glm::vec2 GetPosition() const; void SetPosition(const glm::vec2& position); + float GetYaw() const { return camera_.GetYaw(); } + void SetYaw(float yaw); + private: static constexpr float initial_orbit_distance = 10.0f; static constexpr float default_orbit_zoom_speed = 2.0f; diff --git a/src/renderer/include/renderer/renderable/canvas.hpp b/src/renderer/include/renderer/renderable/canvas.hpp index c8ccbf0..2304302 100644 --- a/src/renderer/include/renderer/renderable/canvas.hpp +++ b/src/renderer/include/renderer/renderable/canvas.hpp @@ -73,6 +73,7 @@ class Canvas : public OpenGlObject { void AddBackgroundImage(const std::string& image_path, const glm::vec3& origin, float resolution); + glm::vec2 GetBackgroundImageSize() const; // Clear all points from the canvas void Clear(); @@ -162,6 +163,7 @@ class Canvas : public OpenGlObject { }; // Background image texture + glm::vec2 background_image_size_{0.0f, 0.0f}; std::mutex background_mutex_; std::atomic background_texture_{0}; diff --git a/src/renderer/src/camera_controller.cpp b/src/renderer/src/camera_controller.cpp index ae555a4..151409c 100644 --- a/src/renderer/src/camera_controller.cpp +++ b/src/renderer/src/camera_controller.cpp @@ -61,9 +61,22 @@ glm::vec2 CameraController::GetPosition() const { void CameraController::SetPosition(const glm::vec2& position) { glm::vec3 pos = camera_.GetPosition(); - pos.x = position.x; - pos.z = position.y; // Use Y for Z in 2D view - camera_.SetPosition(pos); + if (mode_ == Mode::kTopDown) { + pos.x = position.x; + pos.z = -position.y; // Use Y for Z in 2D view + camera_.SetPosition(pos); + } + // do nothing in other modes +} + +void CameraController::SetYaw(float yaw) { + if (mode_ == Mode::kTopDown) { + // In TopDown mode, we set the yaw directly + top_down_rotation_ = yaw; + camera_.SetYaw(yaw); + } else { + camera_.SetYaw(yaw); + } } void CameraController::ProcessKeyboard( diff --git a/src/renderer/src/renderable/canvas.cpp b/src/renderer/src/renderable/canvas.cpp index 3c3cb4b..bdc127a 100644 --- a/src/renderer/src/renderable/canvas.cpp +++ b/src/renderer/src/renderable/canvas.cpp @@ -322,6 +322,10 @@ void Canvas::AddBackgroundImage(const std::string& image_path, } } +glm::vec2 Canvas::GetBackgroundImageSize() const { + return background_image_size_; +} + void Canvas::SetupBackgroundImage(int width, int height, int channels, unsigned char* data) { if (!data) { @@ -329,6 +333,9 @@ void Canvas::SetupBackgroundImage(int width, int height, int channels, return; } + background_image_size_.x = static_cast(width); + background_image_size_.y = static_cast(height); + // Setup the background shader if it hasn't been compiled yet try { Shader background_vertex_shader(background_vertex_shader_source.c_str(),