Unravel Engine C++ Reference
Loading...
Searching...
No Matches
light_component.cpp
Go to the documentation of this file.
1#include "light_component.h"
2namespace unravel
3{
5{
6 return light_;
7}
8
10{
11 light_ = l;
12}
13
14auto light_component::get_bounds_sphere_impl(const math::vec3* light_direction) const -> math::bsphere
15{
16 math::bsphere result;
17
18 if(light_.type == light_type::point)
19 {
20 result = math::bsphere(math::vec3(0.0f, 0.0f, 0.0f), light_.point_data.range);
21 }
22 else if(light_.type == light_type::spot)
23 {
24 float range = light_.spot_data.get_range();
25
26 if(light_direction)
27 {
28 float clamped_inner_cone_angle =
29 math::radians(math::clamp(light_.spot_data.get_inner_angle(), 0.0f, 89.0f));
30 float clamped_outer_cone_angle = math::clamp(math::radians(light_.spot_data.get_outer_angle()),
31 clamped_inner_cone_angle + 0.001f,
32 math::radians(89.0f) + 0.001f);
33 float cos_outer_cone = math::cos(clamped_outer_cone_angle);
34 // Use the law of cosines to find the distance to the furthest edge of the
35 // spotlight cone from a
36 // position that is halfway down the spotlight direction
37 const float radius = math::sqrt(1.25f * range * range - range * range * cos_outer_cone);
38 math::vec3 center = math::vec3(0.0f, 0.0f, 0.0f) + 0.5f * (*light_direction) * range;
39
40 result = math::bsphere(center, radius);
41 }
42 else
43 {
44 result = math::bsphere(math::vec3(0.0f, 0.0f, 0.0f), range);
45 }
46 }
47 else
48 {
49 result = math::bsphere(math::vec3(0.0f, 0.0f, 0.0f), 999999999.0f);
50 }
51
52 return result;
53}
54
56{
57 return get_bounds_sphere_impl(nullptr);
58}
59
60auto light_component::get_bounds_sphere_precise(const math::vec3& light_direction) const -> math::bsphere
61{
62 return get_bounds_sphere_impl(&light_direction);
63}
64
65auto light_component::get_bounds() const -> math::bbox
66{
68 math::bbox result;
69 result.from_sphere(sphere.position, sphere.radius);
70 return result;
71}
72
73auto light_component::get_bounds_precise(const math::vec3& light_direction) const -> math::bbox
74{
75 auto sphere = get_bounds_sphere_precise(light_direction);
76 math::bbox result;
77 result.from_sphere(sphere.position, sphere.radius);
78 return result;
79}
80
82 const math::vec3& light_position,
83 const math::vec3& light_direction,
84 const math::vec3& view_origin,
85 const math::transform& view,
86 const math::transform& proj)
87{
88 if(light_.type == light_type::point)
89 {
91 rect.right,
92 rect.top,
94 light_position,
95 light_.point_data.range,
96 view_origin,
97 view,
98 proj);
99 }
100 else if(light_.type == light_type::spot)
101 {
102 float range = light_.spot_data.get_range();
103 float clamped_inner_cone_angle = math::radians(math::clamp(light_.spot_data.get_inner_angle(), 0.0f, 89.0f));
104 float clamped_outer_cone_angle = math::clamp(math::radians(light_.spot_data.get_outer_angle()),
105 clamped_inner_cone_angle + 0.001f,
106 math::radians(89.0f) + 0.001f);
107 float cos_outer_cone = math::cos(clamped_outer_cone_angle);
108 // Use the law of cosines to find the distance to the furthest edge of the
109 // spotlight cone from a
110 // position that is halfway down the spotlight direction
111 const float radius = math::sqrt(1.25f * range * range - range * range * cos_outer_cone);
112 math::vec3 center = light_position + 0.5f * light_direction * range;
113
115 rect.right,
116 rect.top,
117 rect.bottom,
118 center,
119 radius,
120 view_origin,
121 view,
122 proj);
123 }
124 else
125 {
126 return 1;
127 }
128}
129
131{
132 return *shadowmap_generator_;
133}
134
135auto skylight_component::get_mode() const noexcept -> const sky_mode&
136{
137 return mode_;
138}
140{
141 mode_ = mode;
142}
143
144auto skylight_component::get_turbidity() const noexcept -> float
145{
146 return turbidity_;
147}
148
150{
151 turbidity_ = math::clamp(turbidity, 1.9f, 10.0f);
152}
153
154} // namespace unravel
Provides storage for common representation of spherical bounding volume, and wraps up common function...
Definition bsphere.h:18
General purpose transformation class designed to maintain each component of the transformation separa...
Definition transform.hpp:27
auto get_bounds() const -> math::bbox
Gets the bounding box of the light object.
void set_light(const light &l)
Sets the light object.
auto get_bounds_sphere() const -> math::bsphere
auto get_light() const -> const light &
Gets the light object.
auto compute_projected_sphere_rect(irect32_t &rect, const math::vec3 &light_position, const math::vec3 &light_direction, const math::vec3 &view_origin, const math::transform &view, const math::transform &proj) -> int
Computes the projected sphere rectangle.
auto get_shadowmap_generator() -> shadow::shadowmap_generator &
Gets the shadow map generator.
auto get_bounds_precise(const math::vec3 &light_direction) const -> math::bbox
Gets the bounding box of the light object.
auto get_bounds_sphere_precise(const math::vec3 &light_direction) const -> math::bsphere
Shadow mapping generator with improved algorithms for high-altitude cameras.
Definition shadow.h:597
void set_mode(const sky_mode &mode)
Sets the sky mode.
auto get_turbidity() const noexcept -> float
Gets the current turbidity value.
auto get_mode() const noexcept -> const sky_mode &
Gets the current sky mode.
void set_turbidity(float turbidity)
Sets the turbidity value.
sky_mode
Enumeration for sky modes.
Definition bbox.cpp:5
std::uint32_t compute_projected_sphere_rect(std::int32_t &left, std::int32_t &right, std::int32_t &top, std::int32_t &bottom, const glm::vec3 &sphere_center, float radius, const glm::vec3 &view_origin, const glm::mat4 &view, const glm::mat4 &proj)
Definition math.h:223
@ sphere
Sphere type reflection probe.
Storage for box vector values and wraps up common functionality.
Definition bbox.h:21
bbox & from_sphere(const vec3 &center, float radius)
Calculates the bounding box based on the sphere specified.
Definition bbox.cpp:213
float range
The range of the point light.
Definition light.h:162
float get_range() const
Gets the range of the spot light.
Definition light.h:106
float get_outer_angle() const
Gets the outer angle of the spot light.
Definition light.h:121
float get_inner_angle() const
Gets the inner angle of the spot light.
Definition light.h:136
Struct representing a light.
Definition light.h:87
light_type type
The type of the light.
Definition light.h:89
point point_data
Data specific to point lights.
Definition light.h:203
spot spot_data
Data specific to spot lights.
Definition light.h:201