Changed particle callbacks arguments (offset, count) => (startId, endId)

Former-commit-id: 24550dad44e55aa9dfabaf916cbfb8e25df0451a
This commit is contained in:
Lynix 2014-08-08 20:59:49 +02:00
parent e9267d7f43
commit 202f675301
4 changed files with 36 additions and 31 deletions

View File

@ -25,7 +25,7 @@ class NAZARA_API NzParticleController : public NzResource
NzParticleController(const NzParticleController& controller); NzParticleController(const NzParticleController& controller);
virtual ~NzParticleController(); virtual ~NzParticleController();
virtual void Apply(NzParticleEmitter& emitter, NzParticleMapper& mapper, unsigned int offset, unsigned int particleCount, float elapsedTime) = 0; virtual void Apply(NzParticleEmitter& emitter, NzParticleMapper& mapper, unsigned int startId, unsigned int endId, float elapsedTime) = 0;
}; };
#endif // NAZARA_PARTICLECONTROLLER_HPP #endif // NAZARA_PARTICLECONTROLLER_HPP

View File

@ -25,7 +25,7 @@ class NAZARA_API NzParticleGenerator : public NzResource
NzParticleGenerator(const NzParticleGenerator& generator); NzParticleGenerator(const NzParticleGenerator& generator);
virtual ~NzParticleGenerator(); virtual ~NzParticleGenerator();
virtual void Generate(NzParticleEmitter& emitter, NzParticleMapper& mapper, unsigned int offset, unsigned int particleCount) = 0; virtual void Generate(NzParticleEmitter& emitter, NzParticleMapper& mapper, unsigned int startId, unsigned int endId) = 0;
}; };
#endif // NAZARA_PARTICLEGENERATOR_HPP #endif // NAZARA_PARTICLEGENERATOR_HPP

View File

@ -26,7 +26,7 @@ class NAZARA_API NzParticleRenderer : public NzResource
NzParticleRenderer(const NzParticleRenderer& renderer); NzParticleRenderer(const NzParticleRenderer& renderer);
virtual ~NzParticleRenderer(); virtual ~NzParticleRenderer();
virtual void Render(const NzParticleEmitter& emitter, const NzParticleMapper& mapper, unsigned int offset, unsigned int particleCount, NzAbstractRenderQueue* renderQueue) = 0; virtual void Render(const NzParticleEmitter& emitter, const NzParticleMapper& mapper, unsigned int startId, unsigned int endId, NzAbstractRenderQueue* renderQueue) = 0;
}; };
#endif // NAZARA_PARTICLERENDERER_HPP #endif // NAZARA_PARTICLERENDERER_HPP

View File

@ -72,9 +72,11 @@ void NzParticleEmitter::AddGenerator(NzParticleGenerator* generator)
void NzParticleEmitter::AddToRenderQueue(NzAbstractRenderQueue* renderQueue) const void NzParticleEmitter::AddToRenderQueue(NzAbstractRenderQueue* renderQueue) const
{ {
///FIXME: Vérifier le renderer ///FIXME: Vérifier le renderer
NzParticleMapper mapper(m_buffer.data(), m_declaration); if (m_particleCount > 0)
{
m_renderer->Render(*this, mapper, 0, m_particleCount, renderQueue); NzParticleMapper mapper(m_buffer.data(), m_declaration);
m_renderer->Render(*this, mapper, 0, m_particleCount-1, renderQueue);
}
} }
void* NzParticleEmitter::CreateParticle() void* NzParticleEmitter::CreateParticle()
@ -106,7 +108,7 @@ void* NzParticleEmitter::GenerateParticles(unsigned int count)
NzParticleMapper mapper(ptr, m_declaration); NzParticleMapper mapper(ptr, m_declaration);
for (NzParticleGenerator* generator : m_generators) for (NzParticleGenerator* generator : m_generators)
generator->Generate(*this, mapper, 0, m_particleCount); generator->Generate(*this, mapper, 0, m_particleCount-1);
return ptr; return ptr;
} }
@ -329,33 +331,36 @@ void NzParticleEmitter::Update()
} }
} }
NzParticleMapper mapper(m_buffer.data(), m_declaration); if (m_particleCount > 0)
m_processing = true;
// Pour éviter un verrouillage en cas d'exception
NzCallOnExit onExit([this]()
{ {
NzParticleMapper mapper(m_buffer.data(), m_declaration);
m_processing = true;
// Pour éviter un verrouillage en cas d'exception
NzCallOnExit onExit([this]()
{
m_processing = false;
});
for (NzParticleController* controller : m_controllers)
controller->Apply(*this, mapper, 0, m_particleCount-1, elapsedTime);
m_processing = false; m_processing = false;
}); onExit.Reset();
for (NzParticleController* controller : m_controllers) // On tue maintenant les particules mortes durant la mise à jour
controller->Apply(*this, mapper, 0, m_particleCount, elapsedTime); if (m_dyingParticles.size() < m_particleCount)
{
// On tue les particules depuis la dernière vers la première (en terme de place), le std::set étant trié via std::greater
// La raison est simple, étant donné que la mort d'une particule signifie le déplacement de la dernière particule du buffer,
// sans cette solution certaines particules pourraient échapper à la mort
for (unsigned int index : m_dyingParticles)
KillParticle(index);
}
else
KillParticles(); // Toutes les particules sont mortes, ceci est beaucoup plus rapide
m_processing = false; m_dyingParticles.clear();
onExit.Reset();
// On tue maintenant les particules mortes durant la mise à jour
if (m_dyingParticles.size() < m_particleCount)
{
// On tue les particules depuis la dernière vers la première (en terme de place), le std::set étant trié via std::greater
// La raison est simple, étant donné que la mort d'une particule signifie le déplacement de la dernière particule du buffer,
// sans cette solution certaines particules pourraient échapper à la mort
for (unsigned int index : m_dyingParticles)
KillParticle(index);
} }
else
KillParticles(); // Toutes les particules sont mortes, ceci est beaucoup plus rapide
m_dyingParticles.clear();
} }