void CParticleEmitter::Update( Real32 i_rTime, Real32 i_rDeltaTime, bool i_bSimulate ) { const Real64 rInvDesiredUpdatesPerSecond = 1.0f / (Real64)m_pParent->rGetDesiredUpdatesPerSecond(); m_rEmissionRemainder += rGetEmittedParticles( i_rTime ) * rInvDesiredUpdatesPerSecond; UInt32 iEmittedParticles = (UInt32)m_rEmissionRemainder; m_rEmissionRemainder -= iEmittedParticles; GeoPositionsPtr pPos = NullFC; GeoColorsPtr pCols = NullFC; MFVec3f *pSizes = 0; if( !i_bSimulate ) { beginEditCP( m_pDrawableParticles ); pPos = m_pDrawableParticles->getPositions(); beginEditCP( pPos ); pCols = m_pDrawableParticles->getColors(); beginEditCP( pCols ); pSizes = m_pDrawableParticles->getMFSizes(); pPos->clear(); pCols->clear(); pSizes->clear(); } particle *pCurParticle = m_pParticles; for( UInt32 i = 0; i < m_iNumParticles; ++i, ++pCurParticle ) { pCurParticle->position += m_nextMovement; bool bParticleOkay = m_pParticleType->bUpdateParticle( *pCurParticle, i_rDeltaTime, pPos, pCols, pSizes ); if( !bParticleOkay && iEmittedParticles > 0 ) { bParticleOkay = bSpawnParticle( *pCurParticle, i_rTime, m_pParent->RandomSpawnPoint() ); if( bParticleOkay ) { m_pParticleType->bUpdateParticle( *pCurParticle, i_rDeltaTime, pPos, pCols, pSizes ); --iEmittedParticles; } } } m_nextMovement = Vec3f( 0.0f, 0.0f, 0.0f ); // reset movement vector if( !i_bSimulate ) { endEditCP( pCols ); endEditCP( pPos ); endEditCP( m_pDrawableParticles ); } }