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

View File

@ -1,5 +1,7 @@
#include "ParticlesRenderer.hpp" #include "ParticlesRenderer.hpp"
#include <set>
#include "assets/Assets.hpp" #include "assets/Assets.hpp"
#include "assets/assets_util.hpp" #include "assets/assets_util.hpp"
#include "graphics/core/Shader.hpp" #include "graphics/core/Shader.hpp"
@ -119,7 +121,7 @@ void ParticlesRenderer::render(const Camera& camera, float delta) {
auto iter = emitters.begin(); auto iter = emitters.begin();
while (iter != emitters.end()) { while (iter != emitters.end()) {
auto& emitter = **iter; auto& emitter = *iter->second;
auto texture = emitter.getTexture(); auto texture = emitter.getTexture();
const auto& found = particles.find(texture); const auto& found = particles.find(texture);
std::vector<Particle>* vec; std::vector<Particle>* vec;
@ -138,6 +140,34 @@ void ParticlesRenderer::render(const Camera& camera, float delta) {
} }
} }
void ParticlesRenderer::add(std::unique_ptr<Emitter> emitter) { void ParticlesRenderer::gc() {
emitters.push_back(std::move(emitter)); 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;
} }

View File

@ -5,6 +5,7 @@
#include <unordered_map> #include <unordered_map>
#include "Emitter.hpp" #include "Emitter.hpp"
#include "typedefs.hpp"
class Texture; class Texture;
class Assets; class Assets;
@ -18,9 +19,11 @@ class ParticlesRenderer {
const Assets& assets; const Assets& assets;
const GraphicsSettings* settings; const GraphicsSettings* settings;
std::unordered_map<const Texture*, std::vector<Particle>> particles; std::unordered_map<const Texture*, std::vector<Particle>> particles;
std::vector<std::unique_ptr<Emitter>> emitters;
std::unique_ptr<MainBatch> batch; std::unique_ptr<MainBatch> batch;
std::unordered_map<u64id_t, std::unique_ptr<Emitter>> emitters;
u64id_t nextEmitter = 1;
void renderParticles(const Camera& camera, float delta); void renderParticles(const Camera& camera, float delta);
public: public:
ParticlesRenderer( ParticlesRenderer(
@ -32,7 +35,17 @@ public:
void render(const Camera& camera, float delta); void render(const Camera& camera, float delta);
void add(std::unique_ptr<Emitter> emitter); u64id_t add(std::unique_ptr<Emitter> emitter);
/// @brief Perform garbage collection (remove extra dead emitters).
/// @note Emitters are deleting without GC when there's no particles with same
/// texture left.
/// @note Currently unused
void gc();
/// @brief Get emitter by UID
/// @return Emitter or nullptr
Emitter* getEmitter(u64id_t id) const;
static size_t visibleParticles; static size_t visibleParticles;
static size_t aliveEmitters; static size_t aliveEmitters;

View File

@ -12,6 +12,7 @@ using integer_t = int64_t;
using number_t = double; using number_t = double;
using uint = unsigned int; using uint = unsigned int;
using u64id_t = uint64_t;
/// @brief use for bytes arrays /// @brief use for bytes arrays
using ubyte = uint8_t; using ubyte = uint8_t;