Loading...
Searching...
No Matches
InstancedRenderableComponent.h
Go to the documentation of this file.
1//
2// Created by denzel on 14/08/2025.
3//
4#pragma once
5#include <memory>
6#include <utility>
7#include <vector>
8#include <GL/glew.h>
9#include <glm/detail/type_mat4x4.hpp>
10#include <glm/detail/type_vec3.hpp>
11
12#include "hellfire/graphics/Mesh.h"
13#include "hellfire/graphics/renderer/RenderingUtils.h"
14#include "hellfire/graphics/managers/MaterialManager.h"
15#include "Component.h"
16
17#define Color glm::vec3
18#define Transform glm::mat4
19
20namespace hellfire {
21 class Mesh;
22 class Material;
23
25 public:
26 struct InstanceData {
29 float scale;
30
31 explicit InstanceData(const glm::mat4& t = glm::mat4(1.0f),
32 const glm::vec3& c = glm::vec3(1.0f),
33 float s = 1.0f)
34 : transform(t), color(c), scale(s) {}
35 };
36
38 explicit InstancedRenderableComponent(std::shared_ptr<Mesh> mesh, size_t max_instances = 1000);
40
41 // Mesh management (kept for now, but prefer using MeshComponent)
42 void set_mesh(std::shared_ptr<Mesh> mesh) { mesh_ = mesh; }
43 [[nodiscard]] std::shared_ptr<Mesh> get_mesh() const { return mesh_; }
44 [[nodiscard]] bool has_mesh() const { return mesh_ != nullptr; }
45
46 // Material management - NO LONGER stores on mesh
47 void set_material(std::shared_ptr<Material> material) { material_ = material; }
48 [[nodiscard]] std::shared_ptr<Material> get_material() const { return material_; }
49
50 // Instance management
51 void add_instance(const InstanceData& instance);
52 void update_instance(size_t index, const InstanceData& instance);
53 void clear_instances();
54 void reserve_instances(size_t count);
55 void set_instances(const std::vector<InstanceData>& instances);
56 void add_instances(const std::vector<InstanceData>& instances);
57
58 // Getters
59 size_t get_instance_count() const { return instances_.size(); }
60 size_t get_max_instances() const { return max_instances_; }
61 const std::vector<InstanceData>& get_instances() const { return instances_; }
62
63 // Rendering - called by Renderer, not by component itself
64 void prepare_for_draw();
67
68 private:
69 std::shared_ptr<Mesh> mesh_;
70 std::shared_ptr<Material> material_; // Store material here, not on mesh
75
76 // OpenGL buffers
81
83 void cleanup_buffers();
84 void update_gpu_buffer() const;
88 };
89};
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)
InstanceData(const glm::mat4 &t=glm::mat4(1.0f), const glm::vec3 &c=glm::vec3(1.0f), float s=1.0f)