(ParticleEmitter) Added lag compensation
Former-commit-id: 914a976ba52b2629190ded068cc23e1cf7dee4d4
This commit is contained in:
parent
bbfbec1aa3
commit
bce3cadfd5
|
|
@ -23,9 +23,13 @@ class NAZARA_API NzParticleEmitter : public NzNode
|
||||||
|
|
||||||
virtual void Emit(NzParticleSystem& system, float elapsedTime) const;
|
virtual void Emit(NzParticleSystem& system, float elapsedTime) const;
|
||||||
|
|
||||||
|
void EnableLagCompensation(bool enable);
|
||||||
|
|
||||||
unsigned int GetEmissionCount() const;
|
unsigned int GetEmissionCount() const;
|
||||||
float GetEmissionRate() const;
|
float GetEmissionRate() const;
|
||||||
|
|
||||||
|
bool IsLagCompensationEnabled() const;
|
||||||
|
|
||||||
void SetEmissionCount(unsigned int count);
|
void SetEmissionCount(unsigned int count);
|
||||||
void SetEmissionRate(float rate);
|
void SetEmissionRate(float rate);
|
||||||
|
|
||||||
|
|
@ -35,6 +39,7 @@ class NAZARA_API NzParticleEmitter : public NzNode
|
||||||
private:
|
private:
|
||||||
virtual void SetupParticles(NzParticleMapper& mapper, unsigned int count) const = 0;
|
virtual void SetupParticles(NzParticleMapper& mapper, unsigned int count) const = 0;
|
||||||
|
|
||||||
|
bool m_lagCompensationEnabled;
|
||||||
mutable float m_emissionAccumulator;
|
mutable float m_emissionAccumulator;
|
||||||
float m_emissionRate;
|
float m_emissionRate;
|
||||||
unsigned int m_emissionCount;
|
unsigned int m_emissionCount;
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
#include <Nazara/Graphics/Debug.hpp>
|
#include <Nazara/Graphics/Debug.hpp>
|
||||||
|
|
||||||
NzParticleEmitter::NzParticleEmitter() :
|
NzParticleEmitter::NzParticleEmitter() :
|
||||||
|
m_lagCompensationEnabled(false),
|
||||||
m_emissionAccumulator(0.f),
|
m_emissionAccumulator(0.f),
|
||||||
m_emissionRate(0.f),
|
m_emissionRate(0.f),
|
||||||
m_emissionCount(1)
|
m_emissionCount(1)
|
||||||
|
|
@ -34,20 +35,37 @@ void NzParticleEmitter::Emit(NzParticleSystem& system, float elapsedTime) const
|
||||||
if (emissionCount >= 1.f)
|
if (emissionCount >= 1.f)
|
||||||
{
|
{
|
||||||
// On calcule le nombre maximum de particules pouvant être émises cette fois-ci
|
// 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
|
// 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());
|
unsigned int particleCount = std::min(maxParticleCount, system.GetMaxParticleCount() - system.GetParticleCount());
|
||||||
|
if (particleCount == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
// Et on émet nos particules
|
// Et on émet nos particules
|
||||||
void* particles = system.GenerateParticles(particleCount);
|
void* particles = system.GenerateParticles(particleCount);
|
||||||
NzParticleMapper mapper(particles, system.GetDeclaration());
|
NzParticleMapper mapper(particles, system.GetDeclaration());
|
||||||
|
|
||||||
SetupParticles(mapper, particleCount);
|
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
|
unsigned int NzParticleEmitter::GetEmissionCount() const
|
||||||
{
|
{
|
||||||
return m_emissionCount;
|
return m_emissionCount;
|
||||||
|
|
@ -58,6 +76,11 @@ float NzParticleEmitter::GetEmissionRate() const
|
||||||
return m_emissionRate;
|
return m_emissionRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NzParticleEmitter::IsLagCompensationEnabled() const
|
||||||
|
{
|
||||||
|
return m_lagCompensationEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
void NzParticleEmitter::SetEmissionCount(unsigned int count)
|
void NzParticleEmitter::SetEmissionCount(unsigned int count)
|
||||||
{
|
{
|
||||||
m_emissionCount = count;
|
m_emissionCount = count;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue