//------------------------- // FX_AddParticle //------------------------- CParticle *FX_AddParticle( int clientID, const vec3_t org, const vec3_t vel, const vec3_t accel, float gravity, float size1, float size2, float sizeParm, float alpha1, float alpha2, float alphaParm, const vec3_t sRGB, const vec3_t eRGB, float rgbParm, float rotation, float rotationDelta, const vec3_t min, const vec3_t max, float elasticity, int deathID, int impactID, int killTime, qhandle_t shader, int flags, int modelNum, int boltNum ) { if ( theFxHelper.mFrameTime < 1 ) { // disallow adding effects when the system is paused return 0; } CParticle *fx = new CParticle; if ( fx ) { if (flags&FX_RELATIVE && clientID>=0) { fx->SetOrigin1( NULL ); fx->SetOrgOffset( org ); fx->SetClient( clientID, modelNum, boltNum ); } else { fx->SetOrigin1( org ); } fx->SetVel( vel ); fx->SetAccel( accel ); fx->SetGravity( gravity ); // 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 ); } // 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 ); } // 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 ); } 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_AddPrimitive( (CEffect**)&fx, killTime ); // in the editor, fx may now be NULL } return fx; }
//------------------------- // FX_AddParticle //------------------------- CParticle *FX_AddParticle( int clientID, const vec3_t org, const vec3_t vel, const vec3_t accel, float gravity, float size1, float size2, float sizeParm, float alpha1, float alpha2, float alphaParm, const vec3_t rgb1, const vec3_t rgb2, float rgbParm, float rotation, float rotationDelta, int killTime, qhandle_t shader, int flags = 0 ) { if ( theFxHelper.mFrameTime < 1 ) { // disallow adding effects when the system is paused return 0; } CParticle *fx = new CParticle; if ( fx ) { fx->SetOrigin1( NULL ); fx->SetOrgOffset( org ); fx->SetVel( vel ); fx->SetAccel( accel ); fx->SetGravity( gravity ); // RGB---------------- fx->SetRGBStart( rgb1 ); fx->SetRGBEnd( rgb2 ); 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 ); } // 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 ); } // 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 ); } fx->SetFlags( flags ); fx->SetShader( shader ); fx->SetRotation( rotation ); fx->SetRotationDelta( rotationDelta ); fx->SetElasticity( 0.0f ); fx->SetMin( NULL ); fx->SetMax( NULL ); fx->SetClient( clientID ); FX_AddPrimitive( (CEffect**)&fx, killTime ); } return fx; }
void CParticleEmitter::CreateParticle(float fTimeDelta) { CRandom * l_Random = CORE->GetRandom(); float l_TimeToLive = l_Random->getRandFloat(m_fMinTimeLife, m_fMaxTimeLife); float fEmitRateThisFrame = l_Random->getRandFloat(m_fMinEmitRate, m_fMaxEmitRate); int iNumNewParts = (int)(fEmitRateThisFrame * fTimeDelta); m_fNumNewPartsExcess += (float)(fEmitRateThisFrame * fTimeDelta)-iNumNewParts; if (m_fNumNewPartsExcess > 1.0f) { iNumNewParts += (int)m_fNumNewPartsExcess; m_fNumNewPartsExcess -= (int)m_fNumNewPartsExcess; } for (int q=0; q < iNumNewParts; q++) { // Si hay espacio para una nueva partícula: if(m_Particles.GetNumFreeElements() <= 0) { return; } CParticle *part = m_Particles.New(); part->SetTimeToLive(l_TimeToLive); part->SetGravity(m_bGravity); part->SetAngle(m_fAngle); part->SetTexture(m_sTexture); //Función virtual pura que calcula la posición de la partícula según el tipo de emisor GenerateParticlePosition(part); //determinar los colores según time for(unsigned int i=0; i<m_vColors.size(); i++) { SColor l_color; l_color.time = m_vColors[i].time; l_color.col1 = l_Random->getRandColor(m_vColors[i].col1, m_vColors[i].col2); part->AddColor(l_color); } //determinar la direccion segun time for(unsigned int i=0; i<m_vDirections.size(); i++) { SDirection l_direction; l_direction.time = m_vDirections[i].time; l_direction.dir1 = l_Random->getRandVect3f(m_vDirections[i].dir1, m_vDirections[i].dir2); part->AddDirection(l_direction); } //determinar el tamaño segun time for(unsigned int i=0; i<m_vSizes.size(); i++) { SSize l_size; l_size.time = m_vSizes[i].time; l_size.size1 = l_Random->getRandFloat(m_vSizes[i].size1, m_vSizes[i].size2); part->AddSize(l_size); } //determinar la aceleracion segun time for(unsigned int i=0; i<m_vAcelerations.size(); i++) { SAceleration l_acel; l_acel.time = m_vAcelerations[i].time; l_acel.acel1 = l_Random->getRandVect3f(m_vAcelerations[i].acel1, m_vAcelerations[i].acel2); part->AddAceleration(l_acel); } } }