update particles garbage collection scheme
This commit is contained in:
@@ -15,24 +15,24 @@ ParticlesRenderer::ParticlesRenderer(const Assets& assets)
|
||||
|
||||
auto region = util::get_texture_region(assets, "blocks:grass_side", "");
|
||||
Emitter emitter(glm::vec3(0, 100, 0), Particle {
|
||||
glm::vec3(), glm::vec3(), 5.0f, region.region
|
||||
},region.texture, 0.001f, -1);
|
||||
emitters.push_back(std::move(emitter));
|
||||
nullptr, glm::vec3(), glm::vec3(), 5.0f, region.region
|
||||
},region.texture, 0.001f, 1000);
|
||||
emitters.push_back(std::make_unique<Emitter>(emitter));
|
||||
}
|
||||
|
||||
ParticlesRenderer::~ParticlesRenderer() = default;
|
||||
|
||||
void ParticlesRenderer::render(
|
||||
const Assets& assets, const Camera& camera, float delta
|
||||
) {
|
||||
void ParticlesRenderer::renderParticles(const Camera& camera, float delta) {
|
||||
const auto& right = camera.right;
|
||||
const auto& up = camera.up;
|
||||
|
||||
batch->begin();
|
||||
|
||||
aliveEmitters = emitters.size();
|
||||
visibleParticles = 0;
|
||||
std::vector<const Texture*> unusedTextures;
|
||||
|
||||
for (auto& [texture, vec] : particles) {
|
||||
if (vec.empty()) {
|
||||
unusedTextures.push_back(texture);
|
||||
continue;
|
||||
}
|
||||
batch->setTexture(texture);
|
||||
|
||||
visibleParticles += vec.size();
|
||||
@@ -62,24 +62,36 @@ void ParticlesRenderer::render(
|
||||
}
|
||||
}
|
||||
batch->flush();
|
||||
for (const auto& texture : unusedTextures) {
|
||||
particles.erase(texture);
|
||||
}
|
||||
}
|
||||
|
||||
void ParticlesRenderer::render(const Camera& camera, float delta) {
|
||||
batch->begin();
|
||||
|
||||
aliveEmitters = emitters.size();
|
||||
visibleParticles = 0;
|
||||
|
||||
renderParticles(camera, delta);
|
||||
|
||||
auto iter = emitters.begin();
|
||||
while (iter != emitters.end()) {
|
||||
auto& emitter = *iter;
|
||||
auto& emitter = **iter;
|
||||
auto texture = emitter.getTexture();
|
||||
const auto& found = particles.find(texture);
|
||||
std::vector<Particle>* vec;
|
||||
if (found == particles.end()) {
|
||||
if (emitter.isDead()) {
|
||||
// destruct Emitter only when there is no particles spawned by it
|
||||
iter = emitters.erase(iter);
|
||||
continue;
|
||||
}
|
||||
vec = &particles[texture];
|
||||
} else {
|
||||
vec = &found->second;
|
||||
}
|
||||
emitter.update(delta, *vec);
|
||||
|
||||
if (emitter.isDead()) {
|
||||
iter = emitters.erase(iter);
|
||||
} else {
|
||||
iter++;
|
||||
}
|
||||
iter++;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user