From 2454b5449bbda815eb15327476e376d0d3a39617 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Wed, 5 Mar 2025 22:16:56 +0000 Subject: Move camera out of gl folder, it's not OpenGL specific --- gfx/camera.cpp | 67 ++++++++++++++++++++++++++++++ gfx/camera.h | 94 ++++++++++++++++++++++++++++++++++++++++++ gfx/followCameraController.cpp | 2 +- gfx/gl/camera.cpp | 67 ------------------------------ gfx/gl/camera.h | 94 ------------------------------------------ gfx/gl/sceneRenderer.h | 2 +- gfx/gl/shadowMapper.cpp | 2 +- test/test-maths.cpp | 2 +- ui/gameMainSelector.cpp | 2 +- ui/manualCameraController.cpp | 2 +- 10 files changed, 167 insertions(+), 167 deletions(-) create mode 100644 gfx/camera.cpp create mode 100644 gfx/camera.h delete mode 100644 gfx/gl/camera.cpp delete mode 100644 gfx/gl/camera.h diff --git a/gfx/camera.cpp b/gfx/camera.cpp new file mode 100644 index 0000000..9e165fa --- /dev/null +++ b/gfx/camera.cpp @@ -0,0 +1,67 @@ +#include "camera.h" +#include +#include +#include +#include + +Camera::Camera(GlobalPosition3D pos, Angle fov, Angle aspect, GlobalDistance zNear, GlobalDistance zFar) : + position {pos}, forward {::north}, up {::up}, near {zNear}, far {zFar}, view {}, + projection { + glm::perspective(fov, aspect, static_cast(zNear), static_cast(zFar))}, + viewProjection {}, inverseViewProjection {} +{ + updateView(); +} + +Ray +Camera::unProject(const ScreenRelCoord & mouse) const +{ + static constexpr const glm::vec4 SCREEN {0, 0, 1, 1}; + return { + .start = position, + .direction = glm::normalize(glm::unProject(mouse || 1.F, view, projection, SCREEN)), + }; +} + +void +Camera::updateView() +{ + view = glm::lookAt({}, forward, up); + viewProjection = projection * view; + inverseViewProjection = glm::inverse(viewProjection); + static constexpr auto PLANES = std::array {0, 1, 2} * std::array {1.F, -1.F}; + std::ranges::transform(PLANES, frustumPlanes.begin(), [vpt = glm::transpose(viewProjection)](const auto & idxs) { + const auto [idx, sgn] = idxs; + return vpt[3] + (vpt[idx] * sgn); + }); +} + +Direction3D +Camera::upFromForward(const Direction3D & forward) +{ + const auto right = crossProduct(forward, ::down); + return crossProduct(forward, right); +} + +std::array +Camera::extentsAtDist(const GlobalDistance dist) const +{ + const auto clampToSeaFloor = [this, dist](GlobalPosition3D target) -> GlobalPosition4D { + target += position; + if (target.z < -1500) { + const CalcPosition3D diff = target - position; + const CalcDistance limit = -1500 - position.z; + return {position + ((limit * diff) / diff.z), (limit * dist) / diff.z}; + } + return {target, dist}; + }; + const auto depth = -(2.F * (static_cast(dist - near)) * static_cast(far)) + / (static_cast(dist) * (static_cast(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) { + const glm::vec4 in {extent.first, extent.second, depth, 1.F}; + return clampToSeaFloor(perspective_divide(inverseViewProjection * in)); + }; +} diff --git a/gfx/camera.h b/gfx/camera.h new file mode 100644 index 0000000..d4fe6de --- /dev/null +++ b/gfx/camera.h @@ -0,0 +1,94 @@ +#pragma once + +#include "config/types.h" +#include +#include +#include + +class Camera { +public: + Camera(GlobalPosition3D, Angle fov, Angle aspect, GlobalDistance zNear, GlobalDistance zFar); + + [[nodiscard]] glm::mat4 + getViewProjection() const + { + return viewProjection; + } + + [[nodiscard]] Ray unProject(const ScreenRelCoord &) const; + + void + setPosition(const GlobalPosition3D & p) + { + position = p; + updateView(); + } + + void + setForward(const Direction3D & f) + { + setForward(f, upFromForward(f)); + } + + void + setForward(const Direction3D & f, const Direction3D & u) + { + forward = f; + up = u; + updateView(); + } + + void + setView(const GlobalPosition3D & p, const Direction3D & f) + { + position = p; + setForward(f); + } + + void + setView(const GlobalPosition3D & p, const Direction3D & f, const Direction3D & u) + { + position = p; + setView(f, u); + } + + void + lookAt(const GlobalPosition3D & target) + { + setForward(glm::normalize(RelativePosition3D(target - position))); + } + + [[nodiscard]] auto + getForward() const + { + return forward; + } + + [[nodiscard]] auto + getPosition() const + { + return position; + } + + [[nodiscard]] auto & + getFrustumPlanes() const + { + return frustumPlanes; + } + + [[nodiscard]] std::array extentsAtDist(GlobalDistance) const; + + [[nodiscard]] static Direction3D upFromForward(const Direction3D & forward); + +private: + void updateView(); + + GlobalPosition3D position; + Direction3D forward; + Direction3D up; + + GlobalDistance near, far; + glm::mat4 view, projection; + glm::mat4 viewProjection, inverseViewProjection; + std::array frustumPlanes; +}; diff --git a/gfx/followCameraController.cpp b/gfx/followCameraController.cpp index cf6da34..d7bbc0b 100644 --- a/gfx/followCameraController.cpp +++ b/gfx/followCameraController.cpp @@ -1,6 +1,6 @@ #include "followCameraController.h" #include "game/vehicles/vehicle.h" -#include +#include #include #include #include diff --git a/gfx/gl/camera.cpp b/gfx/gl/camera.cpp deleted file mode 100644 index 9e165fa..0000000 --- a/gfx/gl/camera.cpp +++ /dev/null @@ -1,67 +0,0 @@ -#include "camera.h" -#include -#include -#include -#include - -Camera::Camera(GlobalPosition3D pos, Angle fov, Angle aspect, GlobalDistance zNear, GlobalDistance zFar) : - position {pos}, forward {::north}, up {::up}, near {zNear}, far {zFar}, view {}, - projection { - glm::perspective(fov, aspect, static_cast(zNear), static_cast(zFar))}, - viewProjection {}, inverseViewProjection {} -{ - updateView(); -} - -Ray -Camera::unProject(const ScreenRelCoord & mouse) const -{ - static constexpr const glm::vec4 SCREEN {0, 0, 1, 1}; - return { - .start = position, - .direction = glm::normalize(glm::unProject(mouse || 1.F, view, projection, SCREEN)), - }; -} - -void -Camera::updateView() -{ - view = glm::lookAt({}, forward, up); - viewProjection = projection * view; - inverseViewProjection = glm::inverse(viewProjection); - static constexpr auto PLANES = std::array {0, 1, 2} * std::array {1.F, -1.F}; - std::ranges::transform(PLANES, frustumPlanes.begin(), [vpt = glm::transpose(viewProjection)](const auto & idxs) { - const auto [idx, sgn] = idxs; - return vpt[3] + (vpt[idx] * sgn); - }); -} - -Direction3D -Camera::upFromForward(const Direction3D & forward) -{ - const auto right = crossProduct(forward, ::down); - return crossProduct(forward, right); -} - -std::array -Camera::extentsAtDist(const GlobalDistance dist) const -{ - const auto clampToSeaFloor = [this, dist](GlobalPosition3D target) -> GlobalPosition4D { - target += position; - if (target.z < -1500) { - const CalcPosition3D diff = target - position; - const CalcDistance limit = -1500 - position.z; - return {position + ((limit * diff) / diff.z), (limit * dist) / diff.z}; - } - return {target, dist}; - }; - const auto depth = -(2.F * (static_cast(dist - near)) * static_cast(far)) - / (static_cast(dist) * (static_cast(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) { - const glm::vec4 in {extent.first, extent.second, depth, 1.F}; - return clampToSeaFloor(perspective_divide(inverseViewProjection * in)); - }; -} diff --git a/gfx/gl/camera.h b/gfx/gl/camera.h deleted file mode 100644 index d4fe6de..0000000 --- a/gfx/gl/camera.h +++ /dev/null @@ -1,94 +0,0 @@ -#pragma once - -#include "config/types.h" -#include -#include -#include - -class Camera { -public: - Camera(GlobalPosition3D, Angle fov, Angle aspect, GlobalDistance zNear, GlobalDistance zFar); - - [[nodiscard]] glm::mat4 - getViewProjection() const - { - return viewProjection; - } - - [[nodiscard]] Ray unProject(const ScreenRelCoord &) const; - - void - setPosition(const GlobalPosition3D & p) - { - position = p; - updateView(); - } - - void - setForward(const Direction3D & f) - { - setForward(f, upFromForward(f)); - } - - void - setForward(const Direction3D & f, const Direction3D & u) - { - forward = f; - up = u; - updateView(); - } - - void - setView(const GlobalPosition3D & p, const Direction3D & f) - { - position = p; - setForward(f); - } - - void - setView(const GlobalPosition3D & p, const Direction3D & f, const Direction3D & u) - { - position = p; - setView(f, u); - } - - void - lookAt(const GlobalPosition3D & target) - { - setForward(glm::normalize(RelativePosition3D(target - position))); - } - - [[nodiscard]] auto - getForward() const - { - return forward; - } - - [[nodiscard]] auto - getPosition() const - { - return position; - } - - [[nodiscard]] auto & - getFrustumPlanes() const - { - return frustumPlanes; - } - - [[nodiscard]] std::array extentsAtDist(GlobalDistance) const; - - [[nodiscard]] static Direction3D upFromForward(const Direction3D & forward); - -private: - void updateView(); - - GlobalPosition3D position; - Direction3D forward; - Direction3D up; - - GlobalDistance near, far; - glm::mat4 view, projection; - glm::mat4 viewProjection, inverseViewProjection; - std::array frustumPlanes; -}; diff --git a/gfx/gl/sceneRenderer.h b/gfx/gl/sceneRenderer.h index 93470f5..4649a68 100644 --- a/gfx/gl/sceneRenderer.h +++ b/gfx/gl/sceneRenderer.h @@ -1,12 +1,12 @@ #pragma once -#include "camera.h" #include "gfx/lightDirection.h" #include "glArrays.h" #include "program.h" #include "sceneProvider.h" #include "sceneShader.h" #include "shadowMapper.h" +#include #include class SceneRenderer { diff --git a/gfx/gl/shadowMapper.cpp b/gfx/gl/shadowMapper.cpp index 1b95aa3..908dbdb 100644 --- a/gfx/gl/shadowMapper.cpp +++ b/gfx/gl/shadowMapper.cpp @@ -1,5 +1,4 @@ #include "shadowMapper.h" -#include "camera.h" #include "collections.h" #include "game/gamestate.h" #include "gfx/gl/shaders/fs-shadowDynamicPointInstWithTextures.h" @@ -21,6 +20,7 @@ #include "sceneProvider.h" #include "sceneShader.h" #include "sorting.h" +#include #include #include #include diff --git a/test/test-maths.cpp b/test/test-maths.cpp index a6b780a..6f1f030 100644 --- a/test/test-maths.cpp +++ b/test/test-maths.cpp @@ -9,7 +9,7 @@ #include #include -#include +#include #include #include #include diff --git a/ui/gameMainSelector.cpp b/ui/gameMainSelector.cpp index e9642ec..a817f69 100644 --- a/ui/gameMainSelector.cpp +++ b/ui/gameMainSelector.cpp @@ -7,7 +7,7 @@ #include #include #include // IWYU pragma: keep -#include +#include #include #include #include diff --git a/ui/manualCameraController.cpp b/ui/manualCameraController.cpp index 53905eb..fbd0ca3 100644 --- a/ui/manualCameraController.cpp +++ b/ui/manualCameraController.cpp @@ -1,7 +1,7 @@ #include "manualCameraController.h" #include #include -#include +#include #include bool -- cgit v1.2.3