Exemple #1
0
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 );
  }
}