Skip to content

Commit f3f454b

Browse files
authored
Merge pull request #182 from orange-cpp/feature/camera_upgrade
Feature/camera upgrade
2 parents ba80aeb + 0419043 commit f3f454b

10 files changed

Lines changed: 475 additions & 15 deletions

File tree

.idea/editor.xml

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

include/omath/engines/cry_engine/camera.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99

1010
namespace omath::cry_engine
1111
{
12-
using Camera = projection::Camera<Mat4X4, ViewAngles, CameraTrait, false, NDCDepthRange::ZERO_TO_ONE>;
12+
using Camera = projection::Camera<Mat4X4, ViewAngles, CameraTrait, NDCDepthRange::ZERO_TO_ONE>;
1313
} // namespace omath::cry_engine

include/omath/engines/frostbite_engine/camera.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99

1010
namespace omath::frostbite_engine
1111
{
12-
using Camera = projection::Camera<Mat4X4, ViewAngles, CameraTrait, false, NDCDepthRange::ZERO_TO_ONE>;
13-
} // namespace omath::unity_engine
12+
using Camera = projection::Camera<Mat4X4, ViewAngles, CameraTrait, NDCDepthRange::ZERO_TO_ONE>;
13+
} // namespace omath::frostbite_engine

include/omath/engines/iw_engine/camera.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99

1010
namespace omath::iw_engine
1111
{
12-
using Camera = projection::Camera<Mat4X4, ViewAngles, CameraTrait, false, NDCDepthRange::ZERO_TO_ONE>;
12+
using Camera = projection::Camera<Mat4X4, ViewAngles, CameraTrait, NDCDepthRange::ZERO_TO_ONE>;
1313
} // namespace omath::iw_engine

include/omath/engines/opengl_engine/camera.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@
88

99
namespace omath::opengl_engine
1010
{
11-
using Camera = projection::Camera<Mat4X4, ViewAngles, CameraTrait, true, NDCDepthRange::NEGATIVE_ONE_TO_ONE>;
11+
using Camera = projection::Camera<Mat4X4, ViewAngles, CameraTrait, NDCDepthRange::NEGATIVE_ONE_TO_ONE, {.inverted_forward = true}>;
1212
} // namespace omath::opengl_engine

include/omath/engines/source_engine/camera.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@
77
#include "traits/camera_trait.hpp"
88
namespace omath::source_engine
99
{
10-
using Camera = projection::Camera<Mat4X4, ViewAngles, CameraTrait, false, NDCDepthRange::ZERO_TO_ONE>;
10+
using Camera = projection::Camera<Mat4X4, ViewAngles, CameraTrait, NDCDepthRange::ZERO_TO_ONE>;
1111
} // namespace omath::source_engine

include/omath/engines/unity_engine/camera.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99

1010
namespace omath::unity_engine
1111
{
12-
using Camera = projection::Camera<Mat4X4, ViewAngles, CameraTrait, false, NDCDepthRange::ZERO_TO_ONE>;
12+
using Camera = projection::Camera<Mat4X4, ViewAngles, CameraTrait, NDCDepthRange::ZERO_TO_ONE, {.inverted_forward = true}>;
1313
} // namespace omath::unity_engine

include/omath/engines/unreal_engine/camera.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99

1010
namespace omath::unreal_engine
1111
{
12-
using Camera = projection::Camera<Mat4X4, ViewAngles, CameraTrait, false, NDCDepthRange::ZERO_TO_ONE>;
12+
using Camera = projection::Camera<Mat4X4, ViewAngles, CameraTrait, NDCDepthRange::ZERO_TO_ONE, {.inverted_right = true}>;
1313
} // namespace omath::unreal_engine

include/omath/projection/camera.hpp

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ namespace omath::projection
4242
AUTO,
4343
MANUAL,
4444
};
45+
struct CameraAxes
46+
{
47+
bool inverted_forward = false;
48+
bool inverted_right = false;
49+
};
50+
4551
template<class T, class MatType, class ViewAnglesType>
4652
concept CameraEngineConcept =
4753
requires(const Vector3<float>& cam_origin, const Vector3<float>& look_at, const ViewAnglesType& angles,
@@ -58,8 +64,9 @@ namespace omath::projection
5864
requires noexcept(T::calc_projection_matrix(fov, viewport, znear, zfar, ndc_depth_range));
5965
};
6066

61-
template<class Mat4X4Type, class ViewAnglesType, class TraitClass, bool inverted_z = false,
62-
NDCDepthRange depth_range = NDCDepthRange::NEGATIVE_ONE_TO_ONE>
67+
template<class Mat4X4Type, class ViewAnglesType, class TraitClass,
68+
NDCDepthRange depth_range = NDCDepthRange::NEGATIVE_ONE_TO_ONE,
69+
CameraAxes axes = {}>
6370
requires CameraEngineConcept<TraitClass, Mat4X4Type, ViewAnglesType>
6471
class Camera final
6572
{
@@ -83,6 +90,27 @@ namespace omath::projection
8390
{
8491
}
8592

93+
[[nodiscard]]
94+
static ViewAnglesType calc_view_angles_from_view_matrix(const Mat4X4Type& view_matrix) noexcept
95+
{
96+
Vector3<float> forward_vector = {view_matrix[2, 0], view_matrix[2, 1], view_matrix[2, 2]};
97+
if constexpr (axes.inverted_forward)
98+
forward_vector = -forward_vector;
99+
return TraitClass::calc_look_at_angle({}, forward_vector);
100+
}
101+
102+
[[nodiscard]]
103+
static Vector3<float> calc_origin_from_view_matrix(const Mat4X4Type& view_matrix) noexcept
104+
{
105+
// The view matrix is R * T(-origin), so the last column stores t = -R * origin.
106+
// Recovering origin: origin = -R^T * t
107+
return {
108+
-(view_matrix[0, 0] * view_matrix[0, 3] + view_matrix[1, 0] * view_matrix[1, 3] + view_matrix[2, 0] * view_matrix[2, 3]),
109+
-(view_matrix[0, 1] * view_matrix[0, 3] + view_matrix[1, 1] * view_matrix[1, 3] + view_matrix[2, 1] * view_matrix[2, 3]),
110+
-(view_matrix[0, 2] * view_matrix[0, 3] + view_matrix[1, 2] * view_matrix[1, 3] + view_matrix[2, 2] * view_matrix[2, 3]),
111+
};
112+
}
113+
86114
void look_at(const Vector3<float>& target)
87115
{
88116
m_view_angles = TraitClass::calc_look_at_angle(m_origin, target);
@@ -100,7 +128,7 @@ namespace omath::projection
100128
{
101129
const auto& view_matrix = get_view_matrix();
102130

103-
if constexpr (inverted_z)
131+
if constexpr (axes.inverted_forward)
104132
return -Vector3<float>{view_matrix[2, 0], view_matrix[2, 1], view_matrix[2, 2]};
105133
return {view_matrix[2, 0], view_matrix[2, 1], view_matrix[2, 2]};
106134
}
@@ -109,6 +137,8 @@ namespace omath::projection
109137
Vector3<float> get_right() const noexcept
110138
{
111139
const auto& view_matrix = get_view_matrix();
140+
if constexpr (axes.inverted_right)
141+
return -Vector3<float>{view_matrix[0, 0], view_matrix[0, 1], view_matrix[0, 2]};
112142
return {view_matrix[0, 0], view_matrix[0, 1], view_matrix[0, 2]};
113143
}
114144

0 commit comments

Comments
 (0)