Antkeeper  0.0.1
rectangle-light.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2023 Christopher J. Howard
3  *
4  * This file is part of Antkeeper source code.
5  *
6  * Antkeeper source code is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * Antkeeper source code is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Antkeeper source code. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #ifndef ANTKEEPER_SCENE_RECTANGLE_LIGHT_HPP
21 #define ANTKEEPER_SCENE_RECTANGLE_LIGHT_HPP
22 
23 #include <engine/scene/light.hpp>
24 #include <engine/math/vector.hpp>
25 
26 namespace scene {
27 
31 class rectangle_light: public light
32 {
33 public:
36 
38  [[nodiscard]] inline light_type get_light_type() const noexcept override
39  {
40  return light_type::rectangle;
41  }
42 
48  void set_size(const math::fvec2& size);
49 
55  inline void set_luminous_flux(float luminous_flux) noexcept
56  {
57  m_luminous_flux = luminous_flux;
58  luminous_flux_updated();
59  }
60 
66  inline void set_luminance(float luminance) noexcept
67  {
68  m_luminance = luminance;
69  luminance_updated();
70  }
71 
73  [[nodiscard]] inline constexpr math::fvec2 get_size() const noexcept
74  {
75  return math::fvec2(get_scale());
76  }
77 
79  [[nodiscard]] inline constexpr float get_luminous_flux() const noexcept
80  {
81  return m_luminous_flux;
82  }
83 
85  [[nodiscard]] inline constexpr const math::fvec3& get_colored_luminous_flux() const noexcept
86  {
87  return m_colored_luminous_flux;
88  }
89 
91  [[nodiscard]] inline constexpr float get_luminance() const noexcept
92  {
93  return m_luminance;
94  }
95 
97  [[nodiscard]] inline constexpr const math::fvec3& get_colored_luminance() const noexcept
98  {
99  return m_colored_luminance;
100  }
101 
103  [[nodiscard]] inline constexpr std::span<const math::fvec3, 4> get_corners() const noexcept
104  {
105  return m_corners;
106  }
107 
108 private:
109  void transformed() override;
110  void color_updated() override;
111  void area_updated() noexcept;
112  void luminous_flux_updated() noexcept;
113  void luminance_updated() noexcept;
114 
115  float m_area{1.0f};
116  math::fvec3 m_corners[4];
117  float m_luminous_flux{};
118  math::fvec3 m_colored_luminous_flux{};
119  float m_luminance{};
120  math::fvec3 m_colored_luminance{};
121 };
122 
123 } // namespace scene
124 
125 #endif // ANTKEEPER_SCENE_RECTANGLE_LIGHT_HPP
Abstract base class for light objects.
Definition: scene/light.hpp:32
constexpr const vector_type & get_scale() const noexcept
Returns the scale of the object.
Definition: object.hpp:145
Rectangular area light.
void set_luminance(float luminance) noexcept
Sets the luminance of the light.
constexpr math::fvec2 get_size() const noexcept
Returns the dimensions of the light.
void set_size(const math::fvec2 &size)
Sets the size of the light.
constexpr const math::fvec3 & get_colored_luminance() const noexcept
Returns the color-modulated luminance of the light.
constexpr float get_luminance() const noexcept
Returns the luminance of the light.
rectangle_light()
Constructs a rectangular area light.
constexpr float get_luminous_flux() const noexcept
Returns the luminous flux of the light.
light_type get_light_type() const noexcept override
Returns light_type::rectangle.
constexpr const math::fvec3 & get_colored_luminous_flux() const noexcept
Returns the color-modulated luminous flux of the light.
void set_luminous_flux(float luminous_flux) noexcept
Sets the luminous flux of the light.
constexpr std::span< const math::fvec3, 4 > get_corners() const noexcept
Returns the world-space positions of the light corners.
3D scene.
Definition: context.hpp:28
light_type
Light types.
Definition: light-type.hpp:29
@ rectangle
Rectangle light.
n-dimensional vector.
Definition: vector.hpp:44