2#include "hellfire/ecs/InstancedRenderableComponent.h"
7 std::shared_ptr<
Mesh> mesh, size_t max_instances)
11 instances_.reserve(max_instances_);
20 if (instances_.size() < max_instances_) {
21 instances_.push_back(instance);
27 if (index < instances_.size()) {
28 instances_[index] = instance;
39 instances_.reserve((std::min)(count, max_instances_));
43 instances_ = instances;
44 if (instances_.size() > max_instances_) {
45 instances_.resize(max_instances_);
51 for (
const auto& instance : instances) {
52 add_instance(instance);
73 glGenBuffers(1, &instance_vbo_);
74 glGenBuffers(1, &transform_buffer_);
75 glGenBuffers(1, &color_buffer_);
76 glGenBuffers(1, &scale_buffer_);
80 if (instance_vbo_) glDeleteBuffers(1, &instance_vbo_);
81 if (transform_buffer_) glDeleteBuffers(1, &transform_buffer_);
82 if (color_buffer_) glDeleteBuffers(1, &color_buffer_);
83 if (scale_buffer_) glDeleteBuffers(1, &scale_buffer_);
86 transform_buffer_ = 0;
92 if (instances_.empty())
return;
94 std::vector<glm::mat4> transforms;
95 std::vector<glm::vec3> colors;
96 std::vector<
float> scales;
98 transforms.reserve(instances_.size());
99 colors.reserve(instances_.size());
100 scales.reserve(instances_.size());
102 for (
const auto& instance : instances_) {
103 transforms.push_back(instance.transform);
104 colors.push_back(instance.color);
105 scales.push_back(instance.scale);
109 glBindBuffer(GL_ARRAY_BUFFER, transform_buffer_);
110 glBufferData(GL_ARRAY_BUFFER, transforms.size() *
sizeof(glm::mat4),
111 transforms.data(), GL_DYNAMIC_DRAW);
114 glBindBuffer(GL_ARRAY_BUFFER, color_buffer_);
115 glBufferData(GL_ARRAY_BUFFER, colors.size() *
sizeof(glm::vec3),
116 colors.data(), GL_DYNAMIC_DRAW);
119 glBindBuffer(GL_ARRAY_BUFFER, scale_buffer_);
120 glBufferData(GL_ARRAY_BUFFER, scales.size() *
sizeof(
float),
121 scales.data(), GL_DYNAMIC_DRAW);
123 glBindBuffer(GL_ARRAY_BUFFER, 0);
130 glBindBuffer(GL_ARRAY_BUFFER, transform_buffer_);
131 for (
int i = 0; i < 4; i++) {
132 glVertexAttribPointer(4 + i, 4, GL_FLOAT, GL_FALSE,
sizeof(glm::mat4),
133 (
void*)(
sizeof(glm::vec4) * i));
134 glVertexAttribDivisor(4 + i, 1);
138 glBindBuffer(GL_ARRAY_BUFFER, color_buffer_);
139 glVertexAttribPointer(8, 3, GL_FLOAT, GL_FALSE,
sizeof(glm::vec3), (
void*)0);
140 glVertexAttribDivisor(8, 1);
143 glBindBuffer(GL_ARRAY_BUFFER, scale_buffer_);
144 glVertexAttribPointer(9, 1, GL_FLOAT, GL_FALSE,
sizeof(
float), (
void*)0);
145 glVertexAttribDivisor(9, 1);
151 glEnableVertexAttribArray(4);
152 glEnableVertexAttribArray(5);
153 glEnableVertexAttribArray(6);
154 glEnableVertexAttribArray(7);
155 glEnableVertexAttribArray(8);
156 glEnableVertexAttribArray(9);
160 glDisableVertexAttribArray(4);
161 glDisableVertexAttribArray(5);
162 glDisableVertexAttribArray(6);
163 glDisableVertexAttribArray(7);
164 glDisableVertexAttribArray(8);
165 glDisableVertexAttribArray(9);
void update_gpu_buffer() const
~InstancedRenderableComponent() override
void update_instance(size_t index, const InstanceData &instance)
void reserve_instances(size_t count)
InstancedRenderableComponent(std::shared_ptr< Mesh > mesh, size_t max_instances=1000)
void add_instance(const InstanceData &instance)
void unbind_instance_buffers()
void setup_instanced_vertex_attributes()
void enable_instance_attributes()
void add_instances(const std::vector< InstanceData > &instances)
void setup_instance_buffers()
void bind_instance_buffers()
void disable_instance_attributes()
void set_instances(const std::vector< InstanceData > &instances)
bool vertex_attributes_setup_