From 6b407b2778c69314ba034e9ea265697a51f331d4 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 28 Feb 2026 13:30:46 +0000 Subject: Use RelativeDistance in Camera near/fear and expose member variables --- gfx/camera.cpp | 9 ++++----- gfx/camera.h | 24 +++++++++++++++++++++--- test/test-render.cpp | 4 ++-- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/gfx/camera.cpp b/gfx/camera.cpp index 3bb785d..db748e9 100644 --- a/gfx/camera.cpp +++ b/gfx/camera.cpp @@ -4,13 +4,13 @@ #include #include -Camera::Camera(GlobalPosition3D pos, Angle fov, Angle aspect, GlobalDistance near, GlobalDistance far) : +Camera::Camera(GlobalPosition3D pos, Angle fov, Angle aspect, RelativeDistance near, RelativeDistance far) : Camera {pos, fov, aspect, near, far, glm::lookAt({}, ::north, ::up), glm::perspective(fov, aspect, static_cast(near), static_cast(far))} { } -Camera::Camera(GlobalPosition3D pos, Angle fov, Angle aspect, GlobalDistance near, GlobalDistance far, +Camera::Camera(GlobalPosition3D pos, Angle fov, Angle aspect, RelativeDistance near, RelativeDistance far, const glm::mat4 & view, const glm::mat4 & projection) : Frustum {pos, view, projection}, fov {fov}, aspect {aspect}, forward {::north}, up {::up}, near {near}, far {far} { @@ -58,9 +58,8 @@ Camera::extentsAtDist(const GlobalDistance dist) const } return {target, dist}; }; - const auto depth = -(2.F * (static_cast(dist - near)) * static_cast(far)) - / (static_cast(dist) * (static_cast(near - far))) - - 1.F; + const auto depth + = -(2.F * (static_cast(dist) - near) * far) / (static_cast(dist) * (near - far)) - 1.F; static constexpr const std::array extents {-1.F, 1.F}; static constexpr const auto cartesianExtents = extents * extents; return cartesianExtents * [&depth, this, &clampToSeaFloor](const auto & extent) { diff --git a/gfx/camera.h b/gfx/camera.h index b17bcbb..b78827a 100644 --- a/gfx/camera.h +++ b/gfx/camera.h @@ -8,7 +8,7 @@ class Camera : public Frustum { public: - Camera(GlobalPosition3D position, Angle fov, Angle aspect, GlobalDistance near, GlobalDistance far); + Camera(GlobalPosition3D position, Angle fov, Angle aspect, RelativeDistance near, RelativeDistance far); [[nodiscard]] Ray unProject(const ScreenRelCoord &) const; @@ -61,17 +61,35 @@ public: return forward; } + [[nodiscard]] auto + getNear() const + { + return near; + } + + [[nodiscard]] auto + getFar() const + { + return far; + } + + [[nodiscard]] auto + getDepth() const + { + return far - near; + } + [[nodiscard]] std::array extentsAtDist(GlobalDistance) const; [[nodiscard]] static Direction3D upFromForward(const Direction3D & forward); private: - Camera(GlobalPosition3D position, Angle fov, Angle aspect, GlobalDistance near, GlobalDistance far, + Camera(GlobalPosition3D position, Angle fov, Angle aspect, RelativeDistance near, RelativeDistance far, const glm::mat4 & view, const glm::mat4 & projection); void updateView(); Angle fov, aspect; Direction3D forward; Direction3D up; - GlobalDistance near, far; + RelativeDistance near, far; }; diff --git a/test/test-render.cpp b/test/test-render.cpp index da7d572..1a6e1ae 100644 --- a/test/test-render.cpp +++ b/test/test-render.cpp @@ -126,8 +126,8 @@ namespace { BOOST_GLOBAL_FIXTURE(TestMainWindowAppBase); BOOST_DATA_TEST_CASE(Cam, - boost::unit_test::data::xrange(500, 30000, 1300) * boost::unit_test::data::xrange(500, 10000, 300) - * boost::unit_test::data::xrange(50000, 500000, 70000), + boost::unit_test::data::xrange(500, 30000, 1300) * boost::unit_test::data::xrange(500.F, 10000.F, 300.F) + * boost::unit_test::data::xrange(50000.F, 500000.F, 70000.F), dist, near, far) { static constexpr GlobalPosition4D POS {-10, -10, 60000, 0}; -- cgit v1.3