Graphics/ParticleGroup: Emitters are now updated in case of move and removed in case of release

Former-commit-id: ade351eb66716c1870de6450e6e499a927cd40b5 [formerly 0fa763b512136b5eea96269b7d60dffd350ec990] [formerly 8d17f072fb762cc7ff17752ed63d87613d69584e [formerly f5df4cfe375057859d62096fd01c20b5f3cdefba]]
Former-commit-id: 1e248d44ea1aaf65711c033e0a716220d22ee3f8 [formerly db200dbdbd6c8a12c0445476477061ad6bd26323]
Former-commit-id: c3d6857dac1325bc9b62bbc1503987253c3cad68
This commit is contained in:
Lynix 2016-08-06 01:07:09 +02:00
parent 465801836d
commit 55d14a8b88
4 changed files with 57 additions and 9 deletions

View File

@ -20,7 +20,7 @@ namespace Nz
{ {
public: public:
ParticleEmitter(); ParticleEmitter();
ParticleEmitter(const ParticleEmitter& emitter) = default; ParticleEmitter(const ParticleEmitter& emitter);
ParticleEmitter(ParticleEmitter&& emitter); ParticleEmitter(ParticleEmitter&& emitter);
virtual ~ParticleEmitter(); virtual ~ParticleEmitter();
@ -40,7 +40,7 @@ namespace Nz
ParticleEmitter& operator=(ParticleEmitter&& emitter); ParticleEmitter& operator=(ParticleEmitter&& emitter);
// Signals: // Signals:
NazaraSignal(OnParticleEmitterMove, const ParticleEmitter* /*oldParticleEmitter*/, const ParticleEmitter* /*newParticleEmitter*/); NazaraSignal(OnParticleEmitterMove, ParticleEmitter* /*oldParticleEmitter*/, ParticleEmitter* /*newParticleEmitter*/);
NazaraSignal(OnParticleEmitterRelease, const ParticleEmitter* /*particleEmitter*/); NazaraSignal(OnParticleEmitterRelease, const ParticleEmitter* /*particleEmitter*/);
private: private:

View File

@ -68,12 +68,22 @@ namespace Nz
private: private:
void MakeBoundingVolume() const override; void MakeBoundingVolume() const override;
void OnEmitterMove(ParticleEmitter* oldEmitter, ParticleEmitter* newEmitter);
void OnEmitterRelease(const ParticleEmitter* emitter);
void ResizeBuffer(); void ResizeBuffer();
struct EmitterEntry
{
NazaraSlot(ParticleEmitter, OnParticleEmitterMove, moveSlot);
NazaraSlot(ParticleEmitter, OnParticleEmitterRelease, releaseSlot);
ParticleEmitter* emitter;
};
std::set<unsigned int, std::greater<unsigned int>> m_dyingParticles; std::set<unsigned int, std::greater<unsigned int>> m_dyingParticles;
mutable std::vector<UInt8> m_buffer; mutable std::vector<UInt8> m_buffer;
std::vector<ParticleControllerRef> m_controllers; std::vector<ParticleControllerRef> m_controllers;
std::vector<ParticleEmitter*> m_emitters; std::vector<EmitterEntry> m_emitters;
std::vector<ParticleGeneratorRef> m_generators; std::vector<ParticleGeneratorRef> m_generators;
ParticleDeclarationConstRef m_declaration; ParticleDeclarationConstRef m_declaration;
ParticleRendererRef m_renderer; ParticleRendererRef m_renderer;

View File

@ -32,6 +32,14 @@ namespace Nz
{ {
} }
ParticleEmitter::ParticleEmitter(const ParticleEmitter& emitter) :
m_lagCompensationEnabled(emitter.m_lagCompensationEnabled),
m_emissionAccumulator(0.f),
m_emissionRate(emitter.m_emissionRate),
m_emissionCount(emitter.m_emissionCount)
{
}
ParticleEmitter::ParticleEmitter(ParticleEmitter&& emitter) : ParticleEmitter::ParticleEmitter(ParticleEmitter&& emitter) :
m_lagCompensationEnabled(emitter.m_lagCompensationEnabled), m_lagCompensationEnabled(emitter.m_lagCompensationEnabled),
m_emissionAccumulator(0.f), m_emissionAccumulator(0.f),

View File

@ -109,7 +109,12 @@ namespace Nz
{ {
NazaraAssert(emitter, "Invalid particle emitter"); NazaraAssert(emitter, "Invalid particle emitter");
m_emitters.emplace_back(emitter); EmitterEntry entry;
entry.emitter = emitter;
entry.moveSlot.Connect(emitter->OnParticleEmitterMove, this, &ParticleGroup::OnEmitterMove);
entry.releaseSlot.Connect(emitter->OnParticleEmitterRelease, this, &ParticleGroup::OnEmitterRelease);
m_emitters.emplace_back(std::move(entry));
} }
/*! /*!
@ -336,9 +341,14 @@ namespace Nz
void ParticleGroup::RemoveEmitter(ParticleEmitter* emitter) void ParticleGroup::RemoveEmitter(ParticleEmitter* emitter)
{ {
auto it = std::find(m_emitters.begin(), m_emitters.end(), emitter); for (auto it = m_emitters.begin(); it != m_emitters.end(); ++it)
if (it != m_emitters.end()) {
if (it->emitter == emitter)
{
m_emitters.erase(it); m_emitters.erase(it);
break;
}
}
} }
/*! /*!
@ -374,8 +384,8 @@ namespace Nz
void ParticleGroup::Update(float elapsedTime) void ParticleGroup::Update(float elapsedTime)
{ {
// Emission // Emission
for (ParticleEmitter* emitter : m_emitters) for (const EmitterEntry& entry : m_emitters)
emitter->Emit(*this, elapsedTime); entry.emitter->Emit(*this, elapsedTime);
// Update // Update
if (m_particleCount > 0) if (m_particleCount > 0)
@ -443,6 +453,26 @@ namespace Nz
m_boundingVolume.MakeInfinite(); m_boundingVolume.MakeInfinite();
} }
void ParticleGroup::OnEmitterMove(ParticleEmitter* oldEmitter, ParticleEmitter* newEmitter)
{
for (EmitterEntry& entry : m_emitters)
{
if (entry.emitter == oldEmitter)
entry.emitter = newEmitter;
}
}
void ParticleGroup::OnEmitterRelease(const ParticleEmitter* emitter)
{
for (auto it = m_emitters.begin(); it != m_emitters.end();)
{
if (it->emitter == emitter)
it = m_emitters.erase(it);
else
++it;
}
}
/*! /*!
* \brief Resizes the internal buffer * \brief Resizes the internal buffer
* *