Loading...
Searching...
No Matches
LightComponent.h
Go to the documentation of this file.
1//
2// Created by denzel on 08/08/2025.
3//
4
5#pragma once
6#include <glm/detail/type_vec.hpp>
7#include <glm/gtc/quaternion.hpp>
8#include <glm/gtc/type_ptr.hpp>
9
11#include "hellfire/graphics/shader/Shader.h"
12#include "Component.h"
13#include "Entity.h"
14#include "hellfire/graphics/backends/opengl/Framebuffer.h"
15
16namespace hellfire {
17
18
19 class LightComponent : public Component {
20 public:
21 enum LightType {
24 SPOT
25 };
26
27 private:
28 // Common properties
30 glm::vec3 color_ = glm::vec3(1.0f);
31 float intensity_ = 1.0f;
32
33 // Directional light properties
34 glm::vec3 direction_ = glm::vec3(0.0f, -1.0f, 0.0f);
35
36 // Point light properties
37 float range_ = 10.0f;
38 float attenuation_ = 1.0f;
39
40 // Spotlight properties
41 float inner_cone_angle_ = 30.0f;
42 float outer_cone_angle_ = 45.0f;
43
45
46 // Shadow mapping properties
47 bool cast_shadows_ = true;
48 public:
49 explicit LightComponent(const LightType type = DIRECTIONAL) : type_(type) {
50 }
51
52 // Type management
53 LightType get_light_type() const { return type_; }
54 void set_light_type(const LightType type) { type_ = type; }
55
56 // Common properties
57 void set_color(const glm::vec3 &color) { color_ = color; }
58 const glm::vec3 &get_color() const { return color_; }
59
60 void set_intensity(const float intensity) { intensity_ = intensity; }
61 const float &get_intensity() const { return intensity_; }
62
63 // Directional light methods
64 void set_direction(const float x, const float y, const float z) {
65 set_direction(glm::vec3(x, y, z));
66 }
67
68 void set_direction(const glm::vec3 &direction) {
69 // if (auto transform_comp = get_owner().transform()) {
70 // transform_comp->set_rotation(direction);
71 // }
72 }
73
74 void set_cast_shadows(const bool cast_shadows) { cast_shadows_ = cast_shadows; }
75
76 bool should_cast_shadows() const { return cast_shadows_; }
77
79 if (const auto transform_comp = get_owner().transform()) {
80 const glm::vec3 rotation_degrees = transform_comp->get_rotation();
81
82 // Convert to radians
83 const glm::vec3 rotation_radians = glm::radians(rotation_degrees);
84
85 // Convert to quaternion
86 const auto quat = glm::quat(rotation_radians);
87
88 // Transform forward vector by rotation
89 const auto forward = glm::vec3(0.0f, 0.0f, -1.0f);
90 direction_ = glm::normalize(quat * forward);
91 return direction_;
92 }
93 return direction_;
94 }
95
96 void look_at(const float x, const float y, const float z) {
97 look_at(glm::vec3(x, y, z));
98 }
99
100 void look_at(const glm::vec3 &target) {
101 if (const auto transform_comp = get_owner().get_component<TransformComponent>()) {
102 const glm::vec3 position = transform_comp->get_position();
103 const glm::vec3 new_direction = glm::normalize(target - position);
104 set_direction(new_direction);
105 }
106 }
107
108 // Point light methods
109 void set_range(const float range) { range_ = range; }
110 float get_range() const { return range_; }
111
112 void set_attenuation(const float attenuation) { attenuation_ = attenuation; }
113 float get_attenuation() const { return attenuation_; }
114
115 // Spotlight methods
116 void set_inner_cone_angle(const float angle) { inner_cone_angle_ = angle; }
117 float get_inner_cone_angle() const { return inner_cone_angle_; }
118
119 void set_outer_cone_angle(const float angle) { outer_cone_angle_ = angle; }
120 float get_outer_cone_angle() const { return outer_cone_angle_; }
121
122 // Shader upload method
123 void upload_to_shader(Shader& shader, const int light_index) const {
124 switch (type_) {
125 case DIRECTIONAL:
126 upload_directional_to_shader(shader, light_index);
127 break;
128 case POINT:
129 upload_point_to_shader(shader, light_index);
130 break;
131 case SPOT:
132 upload_spot_to_shader(shader, light_index);
133 break;
134 }
135 }
136
137 const glm::mat4& get_light_view_proj_matrix() const { return light_view_proj_matrix; }
138 void set_light_view_proj_matrix(const glm::mat4& lvpm) { light_view_proj_matrix = lvpm; }
139
140 private:
141 void upload_directional_to_shader(Shader& shader, const int light_index) const {
142 // Get Euler angles and convert to direction
143 const glm::vec3 rotation_degrees = get_owner().transform()->get_rotation();
144 const glm::vec3 rotation_radians = glm::radians(rotation_degrees);
145 const auto quat = glm::quat(rotation_radians);
146 const auto forward = glm::vec3(0.0f, 0.0f, -1.0f);
147 const glm::vec3 direction = glm::normalize(quat * forward);
148
149 shader.set_directional_light(light_index, direction, color_, intensity_);
150 }
151
152 void upload_point_to_shader(Shader& shader, const int light_index) const {
153
154 // Get world position from transform
155 glm::vec3 position(0.0f);
156 auto *transform = get_owner().get_component<TransformComponent>();
157 if (transform) {
158 position = transform->get_position();
159 }
160
161 shader.set_point_light(light_index, position, color_, intensity_, range_, attenuation_);
162 }
163
164 void upload_spot_to_shader(Shader& shader, int light_index) const {
165 // TODO: Actually support spotlights in shader
166
167 }
168 };
169}
bool is_valid() const
Definition Shader.h:46
std::vector< std::unique_ptr< IApplicationPlugin > > plugins_
Definition Application.h:97
std::function< bool()> exit_condition_
Definition Application.h:93
AppInfo & get_window_info()
Definition Application.h:59
void on_mouse_move(float x, float y) override
void set_exit_condition(std::function< bool()> condition)
ShaderManager shader_manager_
std::unique_ptr< IWindow > window_
Definition Application.h:98
ShaderRegistry shader_registry_
bool call_plugins_until_consumed(Func &&func)
void on_render() override
std::unique_ptr< InputManager > input_manager_
Definition Application.h:99
Application(int width=800, int height=600, std::string title="hellfire Application")
void handle_cursor_warping(float x, float y) const
bool handle_first_mouse_movement(float x, float y)
void on_key_up(int key) override
void on_key_down(int key) override
void on_window_minimize(bool minimized) override
void register_plugin(std::unique_ptr< IApplicationPlugin > plugin)
Method for registering plugins.
Definition Application.h:61
Shader * ensure_fallback_shader()
void on_mouse_button(int button, bool pressed) override
void call_plugins(Func &&func)
uint32_t create_minimal_fallback_shader()
void on_window_resize(int width, int height) override
Entity & get_owner() const
Definition Component.h:13
virtual bool on_mouse_move(float x, float y, float x_offset, float y_offset)
virtual bool on_mouse_button(int button, bool pressed)
virtual bool on_key_down(int key)
virtual Entity * get_render_camera_override()
virtual void on_initialize(Application &app)
virtual void on_window_resize(int width, int height)
virtual void on_key_up(int keycode)
Definition IWindow.h:31
virtual void on_mouse_move(float x, float y)
Definition IWindow.h:37
virtual void on_window_resize(int width, int height)
Definition IWindow.h:43
virtual ~IWindowEventHandler()=default
virtual void on_key_down(int keycode)
Definition IWindow.h:28
virtual void on_window_minimize(bool minimized)
Definition IWindow.h:46
virtual void on_mouse_button(int button, bool pressed)
Definition IWindow.h:34
virtual void on_render()
Definition IWindow.h:49
virtual void on_mouse_wheel(float delta)
Definition IWindow.h:40
virtual void set_event_handler(IWindowEventHandler *event_handler)=0
virtual bool is_key_pressed(int keycode) const =0
virtual bool should_close() const =0
WindowInfo window_info_
Definition IWindow.h:101
virtual glm::vec2 get_mouse_position() const =0
virtual ~IWindow()=default
virtual void set_size(int width, int height)=0
virtual void poll_events()=0
virtual glm::ivec2 get_framebuffer_size() const =0
virtual void set_title(const std::string &title)=0
virtual void swap_buffers()=0
virtual void enable_vsync(bool vsync)=0
virtual glm::ivec2 get_size() const =0
virtual void * get_native_handle()=0
virtual void warp_cursor(double x, double y)=0
virtual void destroy()=0
virtual void set_cursor_mode(CursorMode mode)=0
virtual bool create(int width, int height, const std::string &title)=0
virtual float get_elapsed_time()=0
virtual void wait_for_events()=0
virtual void make_current()=0
void upload_directional_to_shader(Shader &shader, const int light_index) const
void set_outer_cone_angle(const float angle)
void set_intensity(const float intensity)
float get_inner_cone_angle() const
void set_color(const glm::vec3 &color)
LightComponent(const LightType type=DIRECTIONAL)
float get_outer_cone_angle() const
LightType get_light_type() const
void look_at(const glm::vec3 &target)
void look_at(const float x, const float y, const float z)
void upload_to_shader(Shader &shader, const int light_index) const
void set_inner_cone_angle(const float angle)
void set_range(const float range)
void set_attenuation(const float attenuation)
bool should_cast_shadows() const
const glm::vec3 & get_color() const
void upload_spot_to_shader(Shader &shader, int light_index) const
void set_direction(const float x, const float y, const float z)
void set_cast_shadows(const bool cast_shadows)
void set_light_type(const LightType type)
const glm::vec3 & get_direction()
void set_light_view_proj_matrix(const glm::mat4 &lvpm)
void set_direction(const glm::vec3 &direction)
const float & get_intensity() const
void upload_point_to_shader(Shader &shader, const int light_index) const
const glm::mat4 & get_light_view_proj_matrix() const
CameraComponent * camera_component
void draw_render_command(const RenderCommand &cmd, const glm::mat4 &view, const glm::mat4 &projection)
Definition Renderer.cpp:221
ShaderRegistry & get_shader_registry()
Definition Renderer.h:103
void ensure_shadow_map(Entity *light_entity, const LightComponent &light)
Definition Renderer.cpp:200
Shader & get_shader_for_material(const std::shared_ptr< Material > &material)
Definition Renderer.cpp:619
SkyboxRenderer skybox_renderer_
Definition Renderer.h:136
ShaderRegistry shader_registry_
Definition Renderer.h:114
void set_render_to_framebuffer(bool enable)
Definition Renderer.h:88
ShadowSettings shadow_settings_
Definition Renderer.h:134
std::vector< InstancedRenderCommand > opaque_instanced_objects_
Definition Renderer.h:131
bool render_to_framebuffer_
Definition Renderer.h:124
void execute_skybox_pass(Scene *scene, const glm::mat4 &view, const glm::mat4 &projection, CameraComponent *camera_comp) const
Definition Renderer.cpp:300
uint32_t get_object_id_texture() const
Definition Renderer.cpp:573
glm::mat4 calculate_light_view_proj(Entity *light_entity, LightComponent *light, const CameraComponent &camera)
Definition Renderer.cpp:422
std::shared_ptr< Material > shadow_material_
Definition Renderer.h:137
void draw_instanced_command(const InstancedRenderCommand &cmd, const glm::mat4 &view, const glm::mat4 &projection)
Definition Renderer.cpp:268
void render(Scene &scene, const Entity *camera_override)
Definition Renderer.cpp:47
void collect_geometry_from_scene(Scene &scene, const glm::vec3 camera_pos)
Definition Renderer.cpp:140
void execute_shadow_passes(Scene &scene, CameraComponent &camera)
Definition Renderer.cpp:343
std::unique_ptr< Framebuffer > scene_framebuffers_[2]
Definition Renderer.h:121
Shader * fallback_shader_
Definition Renderer.h:116
uint32_t fallback_program_
Definition Renderer.h:117
std::vector< RenderCommand > opaque_objects_
Definition Renderer.h:129
uint32_t get_main_output_texture() const
Definition Renderer.cpp:565
void resize_main_framebuffer(uint32_t width, uint32_t height)
Definition Renderer.cpp:553
ShaderManager shader_manager_
Definition Renderer.h:113
void execute_transparency_pass(const glm::mat4 &view, const glm::mat4 &proj)
Definition Renderer.cpp:481
void reset_framebuffer_data()
Definition Renderer.cpp:68
void execute_main_pass(Scene &scene, CameraComponent &camera)
Definition Renderer.cpp:323
ShadowSettings & get_shadow_settings()
Definition Renderer.h:104
uint32_t framebuffer_width_
Definition Renderer.h:125
void render_frame(Scene &scene, CameraComponent &camera)
Definition Renderer.cpp:581
void execute_geometry_pass(const glm::mat4 &view, const glm::mat4 &proj)
Definition Renderer.cpp:453
void collect_lights_from_scene(Scene &scene, CameraComponent &camera)
Definition Renderer.cpp:312
void store_lights_in_context(const std::vector< Entity * > &light_entities, CameraComponent &camera)
Definition Renderer.cpp:94
uint32_t framebuffer_height_
Definition Renderer.h:126
std::vector< RenderCommand > transparent_objects_
Definition Renderer.h:130
void draw_shadow_geometry(const glm::mat4 &light_view_proj)
Definition Renderer.cpp:399
std::unordered_map< Entity *, ShadowMapData > shadow_maps_
Definition Renderer.h:133
void set_fallback_shader(Shader &fallback_shader)
Definition Renderer.cpp:611
std::unique_ptr< OGLRendererContext > context_
Definition Renderer.h:118
void collect_render_commands_recursive(EntityID entity_id, const glm::vec3 &camera_pos)
Definition Renderer.cpp:146
std::vector< InstancedRenderCommand > transparent_instanced_objects_
Definition Renderer.h:132
void create_main_framebuffer(uint32_t width, uint32_t height)
Definition Renderer.cpp:528
Shader * get_fallback_shader() const
Definition Renderer.h:81
uint32_t compile_material_shader(std::shared_ptr< Material > material)
Definition Renderer.cpp:646
ShaderManager & get_shader_manager()
Definition Renderer.h:102
bool has_active_scene() const
void destroy_scene(Scene *scene)
CameraComponent * get_active_camera() const
bool save_scene(Scene *scene)
Scene * create_scene(const std::string &name="GameScene")
Scene * load_scene(const std::filesystem::path &filename)
std::optional< AssetID > get_scene_asset_id(Scene *scene) const
void set_active_camera(EntityID camera) const
void set_scene_asset_id(Scene *scene, AssetID id)
std::optional< AssetID > get_active_scene_asset_id() const
SceneActivatedCallback scene_activated_callback_
Scene * get_active_scene() const
void set_active_scene(Scene *scene, bool should_play=true)
bool save_scene_as(const std::string &filename, Scene *scene)
std::vector< Scene * > scenes_
std::vector< Scene * > get_scenes()
std::unordered_map< Scene *, AssetID > scene_asset_ids_
EntityID find_entity_by_name(const std::string &name)
std::vector< EntityID > get_camera_entities() const
Scene * load_scene(AssetID asset_id, const std::filesystem::path &filename)
void set_scene_activated_callback(SceneActivatedCallback callback)
void update(float delta_time)
Manages a collection of entities and their hierarchical relationships.
Definition Scene.h:24
@ HIDDEN
Definition IWindow.h:12
@ DISABLED
Definition IWindow.h:13
@ SHOWN
Definition IWindow.h:14
std::string title
Definition Application.h:40
bool operator<(const RenderCommand &other) const
Definition Renderer.h:44
InstancedRenderableComponent * instanced_renderable
Definition Renderer.h:39
std::shared_ptr< Material > material
Definition Renderer.h:40
std::shared_ptr< Material > material
Definition Renderer.h:25
std::shared_ptr< Mesh > mesh
Definition Renderer.h:24
bool operator<(const RenderCommand &other) const
Definition Renderer.h:29
std::unique_ptr< Framebuffer > framebuffer
Definition Renderer.h:53
glm::mat4 light_view_proj
Definition Renderer.h:54
static float delta_time
Definition Time.h:9
static void update()
Definition Time.h:20
static void init()
Definition Time.h:16
std::string title
Definition IWindow.h:20