(ParticleEmitter) Added lag compensation

Former-commit-id: 914a976ba52b2629190ded068cc23e1cf7dee4d4
This commit is contained in:
Lynix
2015-01-20 17:48:11 +01:00
parent bbfbec1aa3
commit bce3cadfd5
2 changed files with 29 additions and 1 deletions

View File

@@ -13,6 +13,7 @@
#include <Nazara/Graphics/Debug.hpp>
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<unsigned int>(emissionCount)*m_emissionCount;
unsigned int emissionCountInt = static_cast<unsigned int>(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;