Loading...
Searching...
No Matches
CameraComponent.h
Go to the documentation of this file.
1//
2// Created by denzel on 08/08/2025.
3//
4#pragma once
5
6#include "Component.h"
8
9namespace hellfire {
10 enum class CameraType {
13 };
14
15 struct CameraData {
16 float yaw = -90.0f;
17 float pitch = 0.0f;
18 float sensitivity = 0.1f;
19 float zoom = 45.0f;
20 };
21
22 class CameraComponent : public Component {
23 public:
25
26 // Camera type management
28
29 void set_camera_type(CameraType type);
30
31 // Perspective camera setup
32 void set_perspective(float fov, float aspect, float near_plane, float far_plane);
33
34 // Orthographic camera setup
35 void set_orthographic(float left, float right, float bottom, float top, float near_plane, float far_plane);
36
37 // Matrix getters
38 glm::mat4 get_view_matrix() const;
39
41
42 // Property setters/getters
43 void set_fov(float fov);
44
45 float get_fov() const { return fov_; }
46
47 void set_aspect_ratio(float aspect);
48
49 float get_aspect_ratio() const {
50 return aspect_ratio_;
51 }
52
53 void set_clip_planes(float near_plane, float far_plane);
54
55 float get_near_plane() const { return near_plane_; }
56 float get_far_plane() const { return far_plane_; }
57
58 void set_yaw(float yaw);
59
60 void set_pitch(float pitch);
61
62 // Getters for PlayerController to read current values
63 float get_yaw() const { return camera_data_.yaw; }
64 float get_pitch() const { return camera_data_.pitch; }
65
66 // Mouse sensitivity (camera-related)
67 void set_mouse_sensitivity(float sensitivity);
68
70
71
72 // Camera vectors
73 glm::vec3 get_front_vector() const { return front_; }
74 glm::vec3 get_up_vector() const { return up_; }
75 glm::vec3 get_right_vector() const { return right_; }
76
77 // Target and orientation
78 void look_at(const glm::vec3 &target);
79
80 void set_target(const glm::vec3& target);
81
82 glm::vec3 get_target() const { return target_; }
83
84 void invalidate_view() const {
85 view_dirty_ = true;
86 }
87
88 // Factory methods
89 static CameraComponent* create_perspective(float fov = 45.0f, float aspect = 16.0f/9.0f,
90 float near_plane = 0.1f, float far_plane = 100.0f);
91
92 static CameraComponent* create_orthographic(float size = 10.0f, float aspect = 16.0f/9.0f,
93 float near_plane = 0.1f, float far_plane = 100.0f);
94
95 private:
96 // Camera type
98
99 // Perspective camera properties
100 float fov_ = 45.0f;
101 float aspect_ratio_ = 16.0f / 9.0f;
102 float near_plane_ = 0.1f;
103 float far_plane_ = 100.0f;
104
105 // Orthographic camera properties
106 float ortho_size_ = 10.0f;
107 float ortho_left_ = -10.0f;
108 float ortho_right_ = 10.0f;
109 float ortho_bottom_ = -10.0f;
110 float ortho_top_ = 10.0f;
111
112 // Camera vectors and orientation
113 glm::vec3 front_ = glm::vec3(0.0f, 0.0f, -1.0f);
114 glm::vec3 up_ = glm::vec3(0.0f, 1.0f, 0.0f);
115 glm::vec3 right_ = glm::vec3(1.0f, 0.0f, 0.0f);
116 glm::vec3 world_up_ = glm::vec3(0.0f, 1.0f, 0.0f);
118
120
121 // Cached matrices
122 mutable glm::mat4 view_matrix_ = glm::mat4(1.0f);
123 mutable glm::mat4 projection_matrix_ = glm::mat4(1.0f);
124 mutable bool view_dirty_ = true;
125 mutable bool projection_dirty_ = true;
126
128
129 void update_view_matrix() const;
130
131 void update_projection_matrix() const;
132
134 };
135}
Shader(const uint32_t program_id)
Definition Shader.h:12
Shader & operator=(const Shader &)=delete
Shader()
Definition Shader.h:15
void set_vec3(const std::string &name, const glm::vec3 &value) const
Definition Shader.h:74
void set_directional_light(const int index, const glm::vec3 &direction, const glm::vec3 &color, const float intensity=1.0f) const
Definition Shader.h:137
uint32_t program_id_
Definition Shader.h:167
hellfire::ShaderUniformBinder get_binder() const
Definition Shader.h:169
static Shader from_id(const uint32_t shader_id)
Definition Shader.h:34
bool is_valid() const
Definition Shader.h:46
void use() const
Definition Shader.h:39
void set_time(const float time) const
Definition Shader.h:126
Shader & operator=(Shader &&other) noexcept
Definition Shader.h:26
void set_bool(const std::string &name, const bool value) const
Definition Shader.h:49
void set_mat2(const std::string &name, const glm::mat2 &value) const
Definition Shader.h:91
bool has_uniform(const std::string &name) const
Definition Shader.h:162
void set_float(const std::string &name, const float value) const
Definition Shader.h:61
void set_view_projection(const glm::mat4 &view, const glm::mat4 &projection) const
Definition Shader.h:116
void set_mat3(const std::string &name, const glm::mat3 &value) const
Definition Shader.h:95
Shader(Shader &&other) noexcept
Definition Shader.h:22
void set_transform_matrices(const glm::mat4 &model, const glm::mat4 &view, const glm::mat4 &projection) const
Definition Shader.h:104
void set_camera_position(const glm::vec3 &position) const
Definition Shader.h:122
void set_mat4(const std::string &name, const glm::mat4 &value) const
Definition Shader.h:99
void set_int(const std::string &name, const int value) const
Definition Shader.h:53
void set_vec3(const std::string &name, const float x, const float y, const float z) const
Definition Shader.h:78
void set_point_light(const int index, const glm::vec3 &position, const glm::vec3 &color, const float constant=1.0f, const float linear=0.09f, const float quadratic=0.032f) const
Definition Shader.h:145
void set_vec4(const std::string &name, float x, float y, float z, float w) const
Definition Shader.h:86
void set_vec4(const std::string &name, const glm::vec4 &value) const
Definition Shader.h:82
void set_vec2(const std::string &name, const float x, const float y) const
Definition Shader.h:70
void set_uint(const std::string &name, const uint32_t value) const
Definition Shader.h:57
Shader(const Shader &)=delete
void set_light_counts(const int directional_lights, const int point_lights) const
Definition Shader.h:130
uint32_t get_program_id() const
Definition Shader.h:45
void set_vec2(const std::string &name, const glm::vec2 &value) const
Definition Shader.h:66
void set_texture(const std::string &name, const int texture_unit) const
Definition Shader.h:157
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
void set_camera_type(CameraType type)
glm::vec3 get_right_vector() const
void look_at(const glm::vec3 &target)
void set_orthographic(float left, float right, float bottom, float top, float near_plane, float far_plane)
static CameraComponent * create_orthographic(float size=10.0f, float aspect=16.0f/9.0f, float near_plane=0.1f, float far_plane=100.0f)
glm::mat4 get_projection_matrix() const
void set_clip_planes(float near_plane, float far_plane)
static CameraComponent * create_perspective(float fov=45.0f, float aspect=16.0f/9.0f, float near_plane=0.1f, float far_plane=100.0f)
CameraType get_camera_type() const
glm::mat4 get_view_matrix() const
float get_mouse_sensitivity() const
glm::vec3 get_front_vector() const
glm::vec3 get_target() const
CameraComponent(CameraType type=CameraType::PERSPECTIVE)
void set_mouse_sensitivity(float sensitivity)
glm::vec3 get_up_vector() const
void set_aspect_ratio(float aspect)
void set_perspective(float fov, float aspect, float near_plane, float far_plane)
void set_target(const glm::vec3 &target)
Entity & get_owner() const
Definition Component.h:13
void attach_texture_by_id(uint32_t texture_id, GLenum attachment, GLenum target)
std::vector< FrameBufferAttachmentSettings > color_settings_
Definition Framebuffer.h:87
uint32_t get_width() const
uint32_t get_height() const
void resize(uint32_t width, uint32_t height)
FrameBufferAttachmentSettings stencil_settings_
Definition Framebuffer.h:89
void attach_depth_texture(const FrameBufferAttachmentSettings &settings={})
const std::vector< uint32_t > & get_color_attachments() const
Definition Framebuffer.h:63
uint32_t get_depth_attachment() const
Definition Framebuffer.h:70
void attach_color_texture(const FrameBufferAttachmentSettings &settings={})
FrameBufferAttachmentSettings depth_settings_
Definition Framebuffer.h:88
void attach_stencil_texture(const FrameBufferAttachmentSettings &settings={})
std::vector< uint32_t > color_attachments_
Definition Framebuffer.h:84
uint32_t read_pixel_from_texture(uint32_t texture_id, int x, int y)
Reads a pixel from an external texture using this framebuffer.
size_t get_color_attachment_count() const
Definition Framebuffer.h:69
uint32_t stencil_attachment_
Definition Framebuffer.h:86
Framebuffer(const Framebuffer &)=delete
uint32_t get_color_attachment(const size_t index=0) const
Definition Framebuffer.h:65
Framebuffer & operator=(const Framebuffer &)=delete
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
std::vector< uint32_t > get_all_shader_ids() const
std::unordered_map< std::string, std::string > include_cache_
std::unordered_map< std::string, uint32_t > compiled_shaders_
uint32_t load_shader_from_files(const std::string &vertex_path, const std::string &fragment_path)
std::string trim(const std::string &str)
uint32_t load_shader(const ShaderVariant &variant)
std::string get_directory_from_path(const std::string &file_path)
std::string process_includes(const std::string &source, const std::string &base_path="shaders/")
bool has_shader(const std::string &key) const
std::string clean_shader_content(const std::string &content, const std::string &filepath)
uint32_t compile_shader_program(const std::string &vertex_source, const std::string &fragment_source)
std::string load_shader_file(const std::string &path)
uint32_t get_shader_for_material(Material &material)
uint32_t get_shader(const std::string &key) const
std::string load_include_file(const std::string &path, const std::string &base_path)
ShaderUniformBinder(const uint32_t shader_program)
std::unordered_map< std::string, GLint > uniform_cache_
void render(const Skybox &skybox, const CameraComponent *camera) const
@ 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::unordered_set< std::string > defines
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