forked from 0ad/0ad
Fix burst of particles when starting to construct a building.
Fix crash when particle XML loading failed. This was SVN commit r9509.
This commit is contained in:
parent
03b87f9a8d
commit
c41b7904d2
@ -26,7 +26,7 @@
|
||||
#include "renderer/Renderer.h"
|
||||
|
||||
CParticleEmitter::CParticleEmitter(const CParticleEmitterTypePtr& type) :
|
||||
m_Type(type), m_Active(true), m_NextParticleIdx(0), m_EmissionTimer(0.f),
|
||||
m_Type(type), m_Active(true), m_NextParticleIdx(0), m_EmissionRoundingError(0.f),
|
||||
m_LastUpdateTime(type->m_Manager.GetCurrentTime()),
|
||||
m_VertexArray(GL_DYNAMIC_DRAW)
|
||||
{
|
||||
|
@ -129,7 +129,7 @@ public:
|
||||
size_t m_NextParticleIdx;
|
||||
|
||||
float m_LastUpdateTime;
|
||||
float m_EmissionTimer;
|
||||
float m_EmissionRoundingError;
|
||||
|
||||
private:
|
||||
/// Bounding box of the current particle center points
|
||||
|
@ -355,6 +355,7 @@ bool CParticleEmitterType::LoadXML(const VfsPath& path)
|
||||
m_BlendFuncSrc = GL_SRC_ALPHA;
|
||||
m_BlendFuncDst = GL_ONE_MINUS_SRC_ALPHA;
|
||||
m_StartFull = false;
|
||||
m_Texture = g_Renderer.GetTextureManager().GetErrorTexture();
|
||||
|
||||
CXeromyces XeroFile;
|
||||
PSRETURN ret = XeroFile.Load(g_VFS, path);
|
||||
@ -507,11 +508,10 @@ void CParticleEmitterType::UpdateEmitterStep(CParticleEmitter& emitter, float dt
|
||||
{
|
||||
float emissionRate = m_Variables[VAR_EMISSIONRATE]->Evaluate(emitter);
|
||||
|
||||
// Find how many new particles to spawn, and accumulate any rounding errors into EmissionTimer
|
||||
emitter.m_EmissionTimer += dt;
|
||||
int newParticles = floor(emitter.m_EmissionTimer * emissionRate);
|
||||
if (newParticles) // avoid divide-by-zero if emissionRate == 0
|
||||
emitter.m_EmissionTimer -= newParticles / emissionRate;
|
||||
// Find how many new particles to spawn, and accumulate any rounding errors
|
||||
// (to maintain a constant emission rate even if dt is very small)
|
||||
int newParticles = floor(emitter.m_EmissionRoundingError + dt*emissionRate);
|
||||
emitter.m_EmissionRoundingError += dt*emissionRate - newParticles;
|
||||
|
||||
// If dt was very large, there's no point spawning new particles that
|
||||
// we'll immediately overwrite, so clamp it
|
||||
|
Loading…
Reference in New Issue
Block a user