sandbox
Loading...
Searching...
No Matches
scene_environment.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_SCENES_SCENE_ENVIRONMENT_HPP_
3#define LIBSBX_SCENES_SCENE_ENVIRONMENT_HPP_
4
5#include <array>
6#include <cmath>
7#include <limits>
8#include <algorithm>
9
10#include <libsbx/math/vector2.hpp>
11#include <libsbx/math/vector3.hpp>
12#include <libsbx/math/vector4.hpp>
13#include <libsbx/math/matrix4x4.hpp>
15#include <libsbx/math/ray.hpp>
16
17#include <libsbx/core/engine.hpp>
18
19#include <libsbx/scenes/node.hpp>
20#include <libsbx/scenes/scene_graph.hpp>
21#include <libsbx/scenes/components/camera.hpp>
22#include <libsbx/scenes/components/directional_light.hpp>
23
24namespace sbx::scenes {
25
27
28 static constexpr auto csm_cascade_count = std::uint32_t{4u};
29
30 struct csm_data {
31 std::array<math::matrix4x4, csm_cascade_count> light_spaces{};
32 math::vector4 cascade_splits{};
33 }; // struct csm_data
34
35public:
36
37 scene_environment(scene_graph& graph, const scenes::node camera, const math::vector3& light_direction, const math::color& light_color);
38
39 auto light() -> directional_light& {
40 return _light;
41 }
42
43 auto light() const -> const directional_light& {
44 return _light;
45 }
46
47 auto camera() const -> scenes::node {
48 return _camera;
49 }
50
51 auto set_active_camera(const scenes::node camera) -> void {
52 _camera = camera;
53 }
54
55 auto cascade_light_spaces() const -> const std::array<math::matrix4x4, csm_cascade_count>& {
56 return _cached_csm.light_spaces;
57 }
58
59 static constexpr auto cascade_count() -> std::uint32_t {
60 return csm_cascade_count;
61 }
62
63 auto uniform_handler() -> graphics::uniform_handler& {
64 return _uniform_handler;
65 }
66
67 auto update_uniforms() -> void;
68
69 auto view_projection() const -> const math::matrix4x4& {
70 return _view_projection;
71 }
72
73 auto light_space() -> math::matrix4x4;
74
75 auto screen_point_to_ray(const math::vector2& position) -> math::ray;
76
77 auto set_render_target_size(const math::vector2u& size) -> void {
78 _render_target_size = size;
79 }
80
81 auto render_target_size() const -> const math::vector2u& {
82 return _render_target_size;
83 }
84
85private:
86
87 static auto _lerp_float(const std::float_t a, const std::float_t b, const std::float_t t) -> std::float_t {
88 return a + (b - a) * t;
89 }
90
91 static auto _compute_csm_splits(const std::float_t near_plane, const std::float_t far_plane, const std::float_t lambda) -> std::array<std::float_t, csm_cascade_count>;
92
93 static auto _build_light_space_for_slice(const scenes::camera& camera, std::float_t aspect_ratio, const math::matrix4x4& camera_world, const math::vector3& light_direction, const std::float_t slice_near, const std::float_t slice_far, const std::uint32_t shadow_resolution) -> math::matrix4x4;
94
95 auto _build_csm(std::float_t aspect_ratio) -> csm_data;
96
97 scene_graph& _graph;
98
99
100 scenes::node _camera;
101 directional_light _light;
102
103 math::vector2u _render_target_size{0, 0};
104 math::matrix4x4 _view_projection{math::matrix4x4::identity};
105
106 graphics::uniform_handler _uniform_handler;
107 csm_data _cached_csm;
108
109}; // class scene_environment
110
111} // namespace sbx::scenes
112
113#endif // LIBSBX_SCENES_SCENE_ENVIRONMENT_HPP_
Definition: uniform_handler.hpp:16
Definition: matrix4x4.hpp:26
A vector in two-dimensional space.
Definition: vector2.hpp:28
Definition: vector3.hpp:23
Definition: vector4.hpp:24
RGBA color value type.
Definition: color.hpp:48
3D ray with normalized direction.
Definition: ray.hpp:37
Definition: camera.hpp:96
Definition: directional_light.hpp:10
Definition: scene_environment.hpp:26
Definition: scene_graph.hpp:32
Matrix casting and decomposition utilities.
Ray type for geometric queries.