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

	}
}