From 5539bbad0dca5c63766b51801636a81a545f8c00 Mon Sep 17 00:00:00 2001 From: Orange Date: Sat, 20 Sep 2025 15:46:21 +0300 Subject: [PATCH] reverted --- include/omath/engines/iw_engine/traits/camera_trait.hpp | 2 +- .../omath/engines/opengl_engine/traits/camera_trait.hpp | 2 +- .../omath/engines/source_engine/traits/camera_trait.hpp | 2 +- .../omath/engines/unity_engine/traits/camera_trait.hpp | 2 +- .../omath/engines/unreal_engine/traits/camera_trait.hpp | 2 +- include/omath/projection/camera.hpp | 9 ++++----- source/engines/iw_engine/traits/camera_trait.cpp | 8 ++++++-- source/engines/opengl_engine/traits/camera_trait.cpp | 8 ++++++-- source/engines/source_engine/traits/camera_trait.cpp | 8 ++++++-- source/engines/unity_engine/traits/camera_trait.cpp | 8 ++++++-- source/engines/unreal_engine/traits/camera_trait.cpp | 8 ++++++-- 11 files changed, 39 insertions(+), 20 deletions(-) diff --git a/include/omath/engines/iw_engine/traits/camera_trait.hpp b/include/omath/engines/iw_engine/traits/camera_trait.hpp index 805e2ea..88c2156 100644 --- a/include/omath/engines/iw_engine/traits/camera_trait.hpp +++ b/include/omath/engines/iw_engine/traits/camera_trait.hpp @@ -12,7 +12,7 @@ namespace omath::iw_engine { public: [[nodiscard]] - static Mat4X4 calc_look_at_mat(const Vector3& cam_origin, const Vector3& look_at) noexcept; + static ViewAngles calc_look_at_angle(const Vector3& cam_origin, const Vector3& look_at) noexcept; [[nodiscard]] static Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3& cam_origin) noexcept; diff --git a/include/omath/engines/opengl_engine/traits/camera_trait.hpp b/include/omath/engines/opengl_engine/traits/camera_trait.hpp index 2ea734e..3fb57c0 100644 --- a/include/omath/engines/opengl_engine/traits/camera_trait.hpp +++ b/include/omath/engines/opengl_engine/traits/camera_trait.hpp @@ -12,7 +12,7 @@ namespace omath::opengl_engine { public: [[nodiscard]] - static Mat4X4 calc_look_at_mat(const Vector3& cam_origin, const Vector3& look_at) noexcept; + static ViewAngles calc_look_at_angle(const Vector3& cam_origin, const Vector3& look_at) noexcept; [[nodiscard]] static Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3& cam_origin) noexcept; diff --git a/include/omath/engines/source_engine/traits/camera_trait.hpp b/include/omath/engines/source_engine/traits/camera_trait.hpp index 999f9f5..d027d25 100644 --- a/include/omath/engines/source_engine/traits/camera_trait.hpp +++ b/include/omath/engines/source_engine/traits/camera_trait.hpp @@ -12,7 +12,7 @@ namespace omath::source_engine { public: [[nodiscard]] - static Mat4X4 calc_look_at_mat(const Vector3& cam_origin, const Vector3& look_at) noexcept; + static ViewAngles calc_look_at_angle(const Vector3& cam_origin, const Vector3& look_at) noexcept; [[nodiscard]] static Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3& cam_origin) noexcept; diff --git a/include/omath/engines/unity_engine/traits/camera_trait.hpp b/include/omath/engines/unity_engine/traits/camera_trait.hpp index c5a6169..2d98b9d 100644 --- a/include/omath/engines/unity_engine/traits/camera_trait.hpp +++ b/include/omath/engines/unity_engine/traits/camera_trait.hpp @@ -12,7 +12,7 @@ namespace omath::unity_engine { public: [[nodiscard]] - static Mat4X4 calc_look_at_mat(const Vector3& cam_origin, const Vector3& look_at) noexcept; + static ViewAngles calc_look_at_angle(const Vector3& cam_origin, const Vector3& look_at) noexcept; [[nodiscard]] static Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3& cam_origin) noexcept; diff --git a/include/omath/engines/unreal_engine/traits/camera_trait.hpp b/include/omath/engines/unreal_engine/traits/camera_trait.hpp index 35dc8ae..f2de27e 100644 --- a/include/omath/engines/unreal_engine/traits/camera_trait.hpp +++ b/include/omath/engines/unreal_engine/traits/camera_trait.hpp @@ -12,7 +12,7 @@ namespace omath::unreal_engine { public: [[nodiscard]] - static Mat4X4 calc_look_at_mat(const Vector3& cam_origin, const Vector3& look_at) noexcept; + static ViewAngles calc_look_at_angle(const Vector3& cam_origin, const Vector3& look_at) noexcept; [[nodiscard]] static Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3& cam_origin) noexcept; diff --git a/include/omath/projection/camera.hpp b/include/omath/projection/camera.hpp index 38917b1..7d7feb1 100644 --- a/include/omath/projection/camera.hpp +++ b/include/omath/projection/camera.hpp @@ -36,12 +36,12 @@ namespace omath::projection requires(const Vector3& cam_origin, const Vector3& look_at, const ViewAnglesType& angles, const FieldOfView& fov, const ViewPort& viewport, float znear, float zfar) { // Presence + return types - { T::calc_look_at_mat(cam_origin, look_at) } -> std::same_as; + { T::calc_look_at_angle(cam_origin, look_at) } -> std::same_as; { T::calc_view_matrix(angles, cam_origin) } -> std::same_as; { T::calc_projection_matrix(fov, viewport, znear, zfar) } -> std::same_as; // Enforce noexcept as in the trait declaration - requires noexcept(T::calc_look_at_mat(cam_origin, look_at)); + requires noexcept(T::calc_look_at_angle(cam_origin, look_at)); requires noexcept(T::calc_view_matrix(angles, cam_origin)); requires noexcept(T::calc_projection_matrix(fov, viewport, znear, zfar)); }; @@ -64,9 +64,8 @@ namespace omath::projection void look_at(const Vector3& target) { - m_view_projection_matrix = TraitClass::calc_projection_matrix(m_field_of_view, m_view_port, - m_near_plane_distance, m_far_plane_distance) - * TraitClass::calc_look_at_mat(m_origin, target); + m_view_angles = TraitClass::calc_look_at_angle(m_origin, target); + m_view_projection_matrix = std::nullopt; } protected: diff --git a/source/engines/iw_engine/traits/camera_trait.cpp b/source/engines/iw_engine/traits/camera_trait.cpp index 7531cd8..a791751 100644 --- a/source/engines/iw_engine/traits/camera_trait.cpp +++ b/source/engines/iw_engine/traits/camera_trait.cpp @@ -6,9 +6,13 @@ namespace omath::iw_engine { - Mat4X4 CameraTrait::calc_look_at_mat(const Vector3& cam_origin, const Vector3& look_at) noexcept + ViewAngles CameraTrait::calc_look_at_angle(const Vector3& cam_origin, const Vector3& look_at) noexcept { - return mat_look_at_left_handed(cam_origin, look_at, k_abs_up); + const auto distance = cam_origin.distance_to(look_at); + const auto delta = look_at - cam_origin; + + return {PitchAngle::from_radians(-std::asin(delta.z / distance)), + YawAngle::from_radians(std::atan2(delta.y, delta.x)), RollAngle::from_radians(0.f)}; } Mat4X4 CameraTrait::calc_view_matrix(const ViewAngles& angles, const Vector3& cam_origin) noexcept { diff --git a/source/engines/opengl_engine/traits/camera_trait.cpp b/source/engines/opengl_engine/traits/camera_trait.cpp index 1fac148..24970cb 100644 --- a/source/engines/opengl_engine/traits/camera_trait.cpp +++ b/source/engines/opengl_engine/traits/camera_trait.cpp @@ -7,9 +7,13 @@ namespace omath::opengl_engine { - Mat4X4 CameraTrait::calc_look_at_mat(const Vector3& cam_origin, const Vector3& look_at) noexcept + ViewAngles CameraTrait::calc_look_at_angle(const Vector3& cam_origin, const Vector3& look_at) noexcept { - return mat_look_at_right_handed(cam_origin, look_at, k_abs_up); + const auto distance = cam_origin.distance_to(look_at); + const auto delta = look_at - cam_origin; + + return {PitchAngle::from_radians(std::asin(delta.y / distance)), + YawAngle::from_radians(std::atan2(delta.x, -delta.z)), RollAngle::from_radians(0.f)}; } Mat4X4 CameraTrait::calc_view_matrix(const ViewAngles& angles, const Vector3& cam_origin) noexcept { diff --git a/source/engines/source_engine/traits/camera_trait.cpp b/source/engines/source_engine/traits/camera_trait.cpp index 6af732d..4f49a3e 100644 --- a/source/engines/source_engine/traits/camera_trait.cpp +++ b/source/engines/source_engine/traits/camera_trait.cpp @@ -6,9 +6,13 @@ namespace omath::source_engine { - Mat4X4 CameraTrait::calc_look_at_mat(const Vector3& cam_origin, const Vector3& look_at) noexcept + ViewAngles CameraTrait::calc_look_at_angle(const Vector3& cam_origin, const Vector3& look_at) noexcept { - return mat_look_at_left_handed(cam_origin, look_at, k_abs_up); + const auto distance = cam_origin.distance_to(look_at); + const auto delta = look_at - cam_origin; + + return {PitchAngle::from_radians(-std::asin(delta.z / distance)), + YawAngle::from_radians(std::atan2(delta.y, delta.x)), RollAngle::from_radians(0.f)}; } Mat4X4 CameraTrait::calc_view_matrix(const ViewAngles& angles, const Vector3& cam_origin) noexcept { diff --git a/source/engines/unity_engine/traits/camera_trait.cpp b/source/engines/unity_engine/traits/camera_trait.cpp index 7b1ec35..d76426b 100644 --- a/source/engines/unity_engine/traits/camera_trait.cpp +++ b/source/engines/unity_engine/traits/camera_trait.cpp @@ -6,9 +6,13 @@ namespace omath::unity_engine { - Mat4X4 CameraTrait::calc_look_at_mat(const Vector3& cam_origin, const Vector3& look_at) noexcept + ViewAngles CameraTrait::calc_look_at_angle(const Vector3& cam_origin, const Vector3& look_at) noexcept { - return mat_look_at_left_handed(cam_origin, look_at, k_abs_up); + const auto distance = cam_origin.distance_to(look_at); + const auto delta = cam_origin - look_at; + + return {PitchAngle::from_radians(-std::asin(delta.y / distance)), + YawAngle::from_radians(std::atan2(delta.z, delta.x)), RollAngle::from_radians(0.f)}; } Mat4X4 CameraTrait::calc_view_matrix(const ViewAngles& angles, const Vector3& cam_origin) noexcept { diff --git a/source/engines/unreal_engine/traits/camera_trait.cpp b/source/engines/unreal_engine/traits/camera_trait.cpp index dfc4e78..5eb8126 100644 --- a/source/engines/unreal_engine/traits/camera_trait.cpp +++ b/source/engines/unreal_engine/traits/camera_trait.cpp @@ -6,9 +6,13 @@ namespace omath::unreal_engine { - Mat4X4 CameraTrait::calc_look_at_mat(const Vector3& cam_origin, const Vector3& look_at) noexcept + ViewAngles CameraTrait::calc_look_at_angle(const Vector3& cam_origin, const Vector3& look_at) noexcept { - return mat_look_at_left_handed(cam_origin, look_at, k_abs_up); + const auto distance = cam_origin.distance_to(look_at); + const auto delta = cam_origin - look_at; + + return {PitchAngle::from_radians(-std::asin(delta.z / distance)), + YawAngle::from_radians(std::atan2(delta.x, delta.y)), RollAngle::from_radians(0.f)}; } Mat4X4 CameraTrait::calc_view_matrix(const ViewAngles& angles, const Vector3& cam_origin) noexcept {