From 202f6753019694f54d6361b9b8fe9561feb44db4 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 8 Aug 2014 20:59:49 +0200 Subject: [PATCH] Changed particle callbacks arguments (offset, count) => (startId, endId) Former-commit-id: 24550dad44e55aa9dfabaf916cbfb8e25df0451a --- .../Nazara/Graphics/ParticleController.hpp | 2 +- include/Nazara/Graphics/ParticleGenerator.hpp | 2 +- include/Nazara/Graphics/ParticleRenderer.hpp | 2 +- src/Nazara/Graphics/ParticleEmitter.cpp | 61 ++++++++++--------- 4 files changed, 36 insertions(+), 31 deletions(-) diff --git a/include/Nazara/Graphics/ParticleController.hpp b/include/Nazara/Graphics/ParticleController.hpp index 13d8f765f..4456bcc28 100644 --- a/include/Nazara/Graphics/ParticleController.hpp +++ b/include/Nazara/Graphics/ParticleController.hpp @@ -25,7 +25,7 @@ class NAZARA_API NzParticleController : public NzResource NzParticleController(const NzParticleController& controller); 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 diff --git a/include/Nazara/Graphics/ParticleGenerator.hpp b/include/Nazara/Graphics/ParticleGenerator.hpp index 0e8e8eb77..eefb9233b 100644 --- a/include/Nazara/Graphics/ParticleGenerator.hpp +++ b/include/Nazara/Graphics/ParticleGenerator.hpp @@ -25,7 +25,7 @@ class NAZARA_API NzParticleGenerator : public NzResource NzParticleGenerator(const NzParticleGenerator& generator); 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 diff --git a/include/Nazara/Graphics/ParticleRenderer.hpp b/include/Nazara/Graphics/ParticleRenderer.hpp index ea85f3a87..81219c624 100644 --- a/include/Nazara/Graphics/ParticleRenderer.hpp +++ b/include/Nazara/Graphics/ParticleRenderer.hpp @@ -26,7 +26,7 @@ class NAZARA_API NzParticleRenderer : public NzResource NzParticleRenderer(const NzParticleRenderer& renderer); 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 diff --git a/src/Nazara/Graphics/ParticleEmitter.cpp b/src/Nazara/Graphics/ParticleEmitter.cpp index 48162155b..b6dc13244 100644 --- a/src/Nazara/Graphics/ParticleEmitter.cpp +++ b/src/Nazara/Graphics/ParticleEmitter.cpp @@ -72,9 +72,11 @@ void NzParticleEmitter::AddGenerator(NzParticleGenerator* generator) void NzParticleEmitter::AddToRenderQueue(NzAbstractRenderQueue* renderQueue) const { ///FIXME: Vérifier le renderer - NzParticleMapper mapper(m_buffer.data(), m_declaration); - - m_renderer->Render(*this, mapper, 0, m_particleCount, renderQueue); + if (m_particleCount > 0) + { + NzParticleMapper mapper(m_buffer.data(), m_declaration); + m_renderer->Render(*this, mapper, 0, m_particleCount-1, renderQueue); + } } void* NzParticleEmitter::CreateParticle() @@ -106,7 +108,7 @@ void* NzParticleEmitter::GenerateParticles(unsigned int count) NzParticleMapper mapper(ptr, m_declaration); for (NzParticleGenerator* generator : m_generators) - generator->Generate(*this, mapper, 0, m_particleCount); + generator->Generate(*this, mapper, 0, m_particleCount-1); return ptr; } @@ -329,33 +331,36 @@ void NzParticleEmitter::Update() } } - NzParticleMapper mapper(m_buffer.data(), m_declaration); - - m_processing = true; - - // Pour éviter un verrouillage en cas d'exception - NzCallOnExit onExit([this]() + if (m_particleCount > 0) { + 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; - }); + onExit.Reset(); - for (NzParticleController* controller : m_controllers) - controller->Apply(*this, mapper, 0, m_particleCount, elapsedTime); + // 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_processing = false; - 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); + m_dyingParticles.clear(); } - else - KillParticles(); // Toutes les particules sont mortes, ceci est beaucoup plus rapide - - m_dyingParticles.clear(); }