feat: emitters random access & add ParticlesRenderer.gc()
This commit is contained in:
parent
8bfc7983da
commit
0cd5136fdb
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user