1#ifndef TATOOINE_RENDERING_CAMERA_H
2#define TATOOINE_RENDERING_CAMERA_H
18template <
floating_po
int Real>
64 auto constexpr viewport(std::size_t
const i)
const ->
auto const& {
78 auto constexpr eye() const -> auto {
103 std::size_t
const left,
104 std::size_t
const width,
105 std::size_t
const height) {
112 auto constexpr set_viewport(std::size_t
const bottom, std::size_t
const left,
113 std::size_t
const width,
114 std::size_t
const height) {
123 std::size_t
const height) {
129 std::size_t
const height) {
143 vec3 const& up = {0, 1, 0}) ->
void {
161 T(0, 3) * T(0, 0) + T(1, 3) * T(1, 0) + T(2, 3) * T(2, 0);
163 T(0, 3) * T(0, 1) + T(1, 3) * T(1, 1) + T(2, 3) * T(2, 1);
165 T(0, 3) * T(0, 2) + T(1, 3) * T(1, 2) + T(2, 3) * T(2, 2);
166 return mat4{{T(0, 0), T(1, 0), T(2, 0), -eye_o_x},
167 {T(0, 1), T(1, 1), T(2, 1), -eye_o_y},
168 {T(0, 2), T(1, 2), T(2, 2), -eye_o_z},
193 p(0) = (p(0) -
static_cast<Real
>(
m_viewport(0))) /
196 p(1) = (p(1) -
static_cast<Real
>(
m_viewport(1))) /
228 p(0) = p(0) * Real(0.5) + Real(0.5);
229 p(1) = p(1) * Real(0.5) + Real(0.5);
230 p(2) = p(2) * Real(0.5) + Real(0.5);
246 auto const bottom_left_near_homogeneous = A *
Vec4<Real>{-1, -1, -1, 1};
247 auto const bottom_right_homogeneous = A *
Vec4<Real>{1, -1, -1, 1};
248 auto const top_left_homogeneous = A *
Vec4<Real>{-1, 1, -1, 1};
250 auto const bottom_left =
251 bottom_left_near_homogeneous.
xyz() / bottom_left_near_homogeneous.w();
252 auto const bottom_right =
253 bottom_right_homogeneous.xyz() / bottom_right_homogeneous.w();
254 auto const top_left =
255 top_left_homogeneous.xyz() / top_left_homogeneous.w();
257 auto const plane_base_x =
259 auto const plane_base_y =
262 auto const view_plane_point =
263 bottom_left + x * plane_base_x + y * plane_base_y;
264 return {{
eye()}, {view_plane_point -
eye()}};
285namespace detail::camera {
287template <std::
floating_po
int Real>
303 : std::integral_constant<
305 std::is_class_v<T>&& decltype(detail::camera::is_derived_from_camera<
Definition: concepts.h:33
DLL_API auto viewport(GLint x, GLint y, GLsizei width, GLsizei height) -> void
auto is_derived_from_camera(...) -> std::true_type
auto ptr_convertible_to_camera(const volatile camera_interface< Real > *) -> std::true_type
auto constexpr fps_look_at_matrix(Vec3< Real > const &eye, arithmetic auto const pitch, arithmetic auto const yaw) -> Mat4< Real >
Can be used as transform matrix of an object.
Definition: matrices.h:274
static auto constexpr is_camera
Definition: camera.h:309
auto constexpr look_at_matrix(Vec3< Real > const &eye, Vec3< Real > const ¢er, Vec3< Real > const &up={0, 1, 0}) -> Mat4< Real >
Definition: matrices.h:155
constexpr auto inv(diag_static_tensor< Tensor, N, N > const &A) -> std::optional< diag_static_tensor< vec< tatooine::value_type< Tensor >, N >, N, N > >
Definition: diag_tensor.h:109
Interface for camera implementations.
Definition: camera.h:19
auto constexpr eye() const -> auto
Definition: camera.h:78
mat4 m_projection_matrix
Definition: camera.h:40
auto constexpr aspect_ratio() const
Definition: camera.h:74
virtual ~camera_interface()=default
auto constexpr up_direction() const
Definition: camera.h:90
auto project(vec2 const &p) const
Projects a world coordinate to screen coordinates.
Definition: camera.h:213
vec3 m_plane_base_x
Definition: camera.h:37
vec3 m_plane_base_y
Definition: camera.h:37
auto constexpr viewport() const -> auto const &
Returns number of pixels of plane in x-direction.
Definition: camera.h:63
auto set_projection_matrix(mat4 const &projection_matrix) -> void
Definition: camera.h:280
auto constexpr projection_matrix() const -> auto const &
Definition: camera.h:172
auto view_projection_matrix() const
Definition: camera.h:176
auto constexpr plane_height() const
Returns number of pixels of plane in y-direction.
Definition: camera.h:72
constexpr camera_interface(vec3 const &eye, vec3 const &lookat, vec3 const &up, Vec4< std::size_t > const &viewport)
Definition: camera.h:46
auto constexpr view_matrix() const
Definition: camera.h:158
vec3 m_bottom_left
Definition: camera.h:36
auto unproject(vec2 const &p) const
Projects a screen coordinates to world coordinates.
Definition: camera.h:181
auto constexpr viewport(std::size_t const i) const -> auto const &
Definition: camera.h:64
auto constexpr right_direction() const
Definition: camera.h:84
auto set_gl_viewport() const
Definition: camera.h:135
constexpr camera_interface(vec3 const &eye, vec3 const &lookat, vec3 const &up, Vec4< std::size_t > const &viewport, mat4 const &p)
Definition: camera.h:52
auto constexpr view_direction() const
Definition: camera.h:96
auto constexpr set_viewport(std::size_t const bottom, std::size_t const left, std::size_t const width, std::size_t const height)
Definition: camera.h:112
auto constexpr transform_matrix() const -> auto const &
Definition: camera.h:154
Real real_type
Definition: camera.h:23
auto ray(Real const x, Real const y) const -> ray_type
Gets a ray through plane at pixel with coordinate [x,y].
Definition: camera.h:243
auto constexpr look_at(vec3 const &eye, vec3 const &lookat, vec3 const &up={0, 1, 0}) -> void
Definition: camera.h:142
auto constexpr set_viewport_without_update(std::size_t const bottom, std::size_t const left, std::size_t const width, std::size_t const height)
Definition: camera.h:102
auto constexpr set_resolution(std::size_t const width, std::size_t const height)
Definition: camera.h:128
mat4 m_transform_matrix
Definition: camera.h:39
Vec4< std::size_t > m_viewport
Definition: camera.h:35
auto unproject(vec4 p) const
Projects a homogeneous screen coordinates to world coordinates.
Definition: camera.h:191
auto project(vec4 p) const
Projects a homogeneous world coordinate to screen coordinates.
Definition: camera.h:223
auto unproject(vec3 const &p) const
Projects a screen coordinates to world coordinates.
Definition: camera.h:186
auto constexpr look_at(vec3 const &eye, arithmetic auto const pitch, arithmetic auto const yaw) -> void
Definition: camera.h:148
auto constexpr plane_width() const
Returns number of pixels of plane in x-direction.
Definition: camera.h:69
auto project(vec3 const &p) const
Projects a world coordinate to screen coordinates.
Definition: camera.h:218
auto constexpr set_resolution_without_update(std::size_t const width, std::size_t const height)
Definition: camera.h:122
Perspective cameras are able to cast rays from one point called 'eye' through an image plane.
Definition: perspective_camera.h:15
auto constexpr xyz() const
Definition: vec.h:118