void CParticleEffect::Emit( const Core::CVector3& a_Position, const Core::CVector3& a_Velocity ) { if( m_DeadParticles.size() == 0 ) return; CParticle* particle = m_DeadParticles.back(); Float speed = RandRange( m_MinVelocity, m_MaxVelocity ); particle->Init( a_Position, a_Velocity * speed, RandRange( m_MinLifeTime, m_MinLifeTime ), m_InitialProperties, m_FinalProperties ); m_DeadParticles.pop_back(); assert( m_Interpolator != NULL && "No interpolator give to particle effect" ); m_Interpolator->RegisterParticle( particle, m_InterpolationType ); m_AliveParticles.push_back( particle ); }
void CParticleEmitter::Update() { if (timer >= param.intervalTime) { //パーティクルを生成。 CParticle* p = new CParticle; p->Init(*random, *camera, param, emitPosition); timer = 0.0f; particleList.push_back(p); } timer += 1.0f / 60.0f; std::list<CParticle*>::iterator p = particleList.begin(); while (p != particleList.end()){ if ((*p)->GetDead()) { p = particleList.erase(p); } else { p++; } } p = particleList.begin(); while (p != particleList.end()){ (*p++)->Update(); } }
//------------------------- // FX_AddParticle //------------------------- CParticle *FX_AddParticle( vec3_t org, vec3_t vel, vec3_t accel, float size1, float size2, float sizeParm, float alpha1, float alpha2, float alphaParm, vec3_t sRGB, vec3_t eRGB, float rgbParm, float rotation, float rotationDelta, vec3_t min, vec3_t max, float elasticity, int deathID, int impactID, int killTime, qhandle_t shader, int flags = 0, EMatImpactEffect matImpactFX /*MATIMPACTFX_NONE*/, int fxParm /*-1*/, int iGhoul2/*0*/, int entNum/*-1*/, int modelNum/*-1*/, int boltNum/*-1*/ ) { if ( theFxHelper.mFrameTime < 0 ) { // disallow adding effects when the system is paused return 0; } CParticle *fx = new CParticle; if ( fx ) { if (flags&FX_RELATIVE && iGhoul2>0) { fx->SetOrigin1( NULL ); fx->SetOrgOffset( org ); fx->SetBoltinfo( iGhoul2, entNum, modelNum, boltNum ); } else { fx->SetOrigin1( org ); } fx->SetOrigin1( org ); fx->SetMatImpactFX(matImpactFX); fx->SetMatImpactParm(fxParm); fx->SetVel( vel ); fx->SetAccel( accel ); // RGB---------------- fx->SetRGBStart( sRGB ); fx->SetRGBEnd( eRGB ); if (( flags & FX_RGB_PARM_MASK ) == FX_RGB_WAVE ) { fx->SetRGBParm( rgbParm * PI * 0.001f ); } else if ( flags & FX_RGB_PARM_MASK ) { // rgbParm should be a value from 0-100.. fx->SetRGBParm(rgbParm * 0.01f * killTime + theFxHelper.mTime + theFxHelper.mTimeFraction); } // Alpha---------------- fx->SetAlphaStart( alpha1 ); fx->SetAlphaEnd( alpha2 ); if (( flags & FX_ALPHA_PARM_MASK ) == FX_ALPHA_WAVE ) { fx->SetAlphaParm( alphaParm * PI * 0.001f ); } else if ( flags & FX_ALPHA_PARM_MASK ) { fx->SetAlphaParm(alphaParm * 0.01f * killTime + theFxHelper.mTime + theFxHelper.mTimeFraction); } // Size---------------- fx->SetSizeStart( size1 ); fx->SetSizeEnd( size2 ); if (( flags & FX_SIZE_PARM_MASK ) == FX_SIZE_WAVE ) { fx->SetSizeParm( sizeParm * PI * 0.001f ); } else if ( flags & FX_SIZE_PARM_MASK ) { fx->SetSizeParm(sizeParm * 0.01f * killTime + theFxHelper.mTime + theFxHelper.mTimeFraction); } fx->SetFlags( flags ); fx->SetShader( shader ); fx->SetRotation( rotation ); fx->SetRotationDelta( rotationDelta ); fx->SetElasticity( elasticity ); fx->SetMin( min ); fx->SetMax( max ); fx->SetDeathFxID( deathID ); fx->SetImpactFxID( impactID ); fx->Init(); FX_AddPrimitive( (CEffect**)&fx, killTime ); } return fx; }