feat: emitters random access & add ParticlesRenderer.gc()

This commit is contained in:
MihailRis
2024-11-04 14:41:52 +03:00
parent 8bfc7983da
commit 0cd5136fdb
3 changed files with 49 additions and 5 deletions
+33 -3
View File
@@ -1,5 +1,7 @@
#include "ParticlesRenderer.hpp"
#include <set>
#include "assets/Assets.hpp"
#include "assets/assets_util.hpp"
#include "graphics/core/Shader.hpp"
@@ -119,7 +121,7 @@ void ParticlesRenderer::render(const Camera& camera, float delta) {
auto iter = emitters.begin();
while (iter != emitters.end()) {
auto& emitter = **iter;
auto& emitter = *iter->second;
auto texture = emitter.getTexture();
const auto& found = particles.find(texture);
std::vector<Particle>* vec;
@@ -138,6 +140,34 @@ void ParticlesRenderer::render(const Camera& camera, float delta) {
}
}
void ParticlesRenderer::add(std::unique_ptr<Emitter> emitter) {
emitters.push_back(std::move(emitter));
void ParticlesRenderer::gc() {
std::set<Emitter*> usedEmitters;
for (const auto& [_, vec] : particles) {
for (const auto& particle : vec) {
usedEmitters.insert(particle.emitter);
}
}
auto iter = emitters.begin();
while (iter != emitters.end()) {
auto emitter = iter->second.get();
if (usedEmitters.find(emitter) == usedEmitters.end()) {
iter = emitters.erase(iter);
} else {
iter++;
}
}
}
Emitter* ParticlesRenderer::getEmitter(u64id_t id) const {
const auto& found = emitters.find(id);
if (found == emitters.end()) {
return nullptr;
}
return found->second.get();
}
u64id_t ParticlesRenderer::add(std::unique_ptr<Emitter> emitter) {
u64id_t uid = nextEmitter++;
emitters[uid] = std::move(emitter);
return uid;
}