Loading...
Searching...
No Matches
RenderingUtils.h
Go to the documentation of this file.
1//
2// Created by denzel on 14/08/2025.
3//
4
5#pragma once
6#include <glm/detail/type_mat.hpp>
7
9#include "hellfire/ecs/CameraComponent.h"
10#include "../shader/Shader.h"
11#include "hellfire/ecs/LightComponent.h"
12
13namespace hellfire {
14 /// Utility class containing shared rendering functionality.
15 /// Used by composition in both RenderableComponent and InstancedRenderableComponent.
17 public:
18 static void set_standard_uniforms(Shader &shader,
19 const glm::mat4 &model,
20 const glm::mat4 &view,
21 const glm::mat4 &projection,
22 float time = 0.0f) {
23 shader.set_transform_matrices(model, view, projection);
24 shader.set_time(time);
25 }
26
28 const glm::mat4 &view,
29 const glm::mat4 &projection,
30 float time = 0.0f) {
31 shader.set_view_projection(view, projection);
32 shader.set_time(time);
33 }
34
35 static void upload_lights_to_shader(Shader& shader, OGLRendererContext& renderer_context) {
36 shader.set_light_counts(renderer_context.num_directional_lights, renderer_context.num_point_lights);
37
38 // Upload directional lights
39 for (int i = 0; i < renderer_context.num_directional_lights && i < 4; i++) {
40 if (const Entity* light_entity = renderer_context.directional_light_entities[i]) {
41 if (const auto* light_component = light_entity->get_component<LightComponent>()) {
42 light_component->upload_to_shader(shader, i);
43 }
44 }
45 }
46
47 // Upload point lights
48 for (int i = 0; i < renderer_context.num_point_lights && i < 8; i++) {
49 const Entity* light_entity = renderer_context.point_light_entities[i];
50 if (light_entity) {
51 const auto* light_component = light_entity->get_component<LightComponent>();
52 if (light_component) {
53 light_component->upload_to_shader(shader, i);
54 }
55 }
56 }
57
58 // Upload camera position
59 if (renderer_context.camera_component) {
60 const auto* camera_transform = renderer_context.camera_component->get_owner().get_component<TransformComponent>();
61 if (camera_transform) {
62 shader.set_camera_position(camera_transform->get_world_position());
63 }
64 }
65 }
66
67 static bool is_valid_mesh(const std::shared_ptr<Mesh>& mesh) {
68 return mesh && mesh->get_index_count() > 0;
69 }
70 };
71}
void set_time(const float time) const
Definition Shader.h:126
void set_light_counts(const int directional_lights, const int point_lights) const
Definition Shader.h:130
Entity & get_owner() const
Definition Component.h:13
void update_instance(size_t index, const InstanceData &instance)
InstancedRenderableComponent(std::shared_ptr< Mesh > mesh, size_t max_instances=1000)
std::shared_ptr< Material > get_material() const
void add_instance(const InstanceData &instance)
void set_material(std::shared_ptr< Material > material)
const std::vector< InstanceData > & get_instances() const
void add_instances(const std::vector< InstanceData > &instances)
void set_mesh(std::shared_ptr< Mesh > mesh)
void set_instances(const std::vector< InstanceData > &instances)
CameraComponent * camera_component
static void set_view_projection_uniforms(Shader &shader, const glm::mat4 &view, const glm::mat4 &projection, float time=0.0f)
static bool is_valid_mesh(const std::shared_ptr< Mesh > &mesh)
static void set_standard_uniforms(Shader &shader, const glm::mat4 &model, const glm::mat4 &view, const glm::mat4 &projection, float time=0.0f)
static void upload_lights_to_shader(Shader &shader, OGLRendererContext &renderer_context)
InstanceData(const glm::mat4 &t=glm::mat4(1.0f), const glm::vec3 &c=glm::vec3(1.0f), float s=1.0f)