From bce3cadfd5a6396c4c21d975e13060d94accfa17 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 20 Jan 2015 17:48:11 +0100 Subject: [PATCH] (ParticleEmitter) Added lag compensation Former-commit-id: 914a976ba52b2629190ded068cc23e1cf7dee4d4 --- include/Nazara/Graphics/ParticleEmitter.hpp | 5 +++++ src/Nazara/Graphics/ParticleEmitter.cpp | 25 ++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/include/Nazara/Graphics/ParticleEmitter.hpp b/include/Nazara/Graphics/ParticleEmitter.hpp index 5e73426d5..6298c196c 100644 --- a/include/Nazara/Graphics/ParticleEmitter.hpp +++ b/include/Nazara/Graphics/ParticleEmitter.hpp @@ -23,9 +23,13 @@ class NAZARA_API NzParticleEmitter : public NzNode virtual void Emit(NzParticleSystem& system, float elapsedTime) const; + void EnableLagCompensation(bool enable); + unsigned int GetEmissionCount() const; float GetEmissionRate() const; + bool IsLagCompensationEnabled() const; + void SetEmissionCount(unsigned int count); void SetEmissionRate(float rate); @@ -35,6 +39,7 @@ class NAZARA_API NzParticleEmitter : public NzNode private: virtual void SetupParticles(NzParticleMapper& mapper, unsigned int count) const = 0; + bool m_lagCompensationEnabled; mutable float m_emissionAccumulator; float m_emissionRate; unsigned int m_emissionCount; diff --git a/src/Nazara/Graphics/ParticleEmitter.cpp b/src/Nazara/Graphics/ParticleEmitter.cpp index 46500f082..33eda8002 100644 --- a/src/Nazara/Graphics/ParticleEmitter.cpp +++ b/src/Nazara/Graphics/ParticleEmitter.cpp @@ -13,6 +13,7 @@ #include NzParticleEmitter::NzParticleEmitter() : +m_lagCompensationEnabled(false), m_emissionAccumulator(0.f), m_emissionRate(0.f), m_emissionCount(1) @@ -34,20 +35,37 @@ void NzParticleEmitter::Emit(NzParticleSystem& system, float elapsedTime) const if (emissionCount >= 1.f) { // On calcule le nombre maximum de particules pouvant être émises cette fois-ci - unsigned int maxParticleCount = static_cast(emissionCount)*m_emissionCount; + unsigned int emissionCountInt = static_cast(emissionCount); + unsigned int maxParticleCount = emissionCountInt*m_emissionCount; // On récupère le nombre de particules qu'il est possible de créer selon l'espace libre unsigned int particleCount = std::min(maxParticleCount, system.GetMaxParticleCount() - system.GetParticleCount()); + if (particleCount == 0) + return; // Et on émet nos particules void* particles = system.GenerateParticles(particleCount); NzParticleMapper mapper(particles, system.GetDeclaration()); SetupParticles(mapper, particleCount); + + if (m_lagCompensationEnabled) + { + // On va maintenant appliquer les contrôleurs + float accumulator = 0.f; + float invEmissionRate = 1.f/m_emissionRate; + for (unsigned int i = 1; i <= emissionCountInt; ++i) + system.ApplyControllers(mapper, std::min(m_emissionCount*i, particleCount), 20*invEmissionRate, accumulator); + } } } } +void NzParticleEmitter::EnableLagCompensation(bool enable) +{ + m_lagCompensationEnabled = enable; +} + unsigned int NzParticleEmitter::GetEmissionCount() const { return m_emissionCount; @@ -58,6 +76,11 @@ float NzParticleEmitter::GetEmissionRate() const return m_emissionRate; } +bool NzParticleEmitter::IsLagCompensationEnabled() const +{ + return m_lagCompensationEnabled; +} + void NzParticleEmitter::SetEmissionCount(unsigned int count) { m_emissionCount = count;