예제 #1
0
//-----------------------------------------------------------------------------
// Purpose:
// Input  : timeDelta -
//-----------------------------------------------------------------------------
void C_SignalFlare::Update( float timeDelta )
{
    CSimpleEmitter::Update( timeDelta );

    //Make sure our stored resources are up to date
    RestoreResources();

    //Don't do this if the console is down
    if ( timeDelta <= 0.0f )
        return;

    float	fColor;
    float	baseScale = m_flScale;

    //Account for fading out
    if ( ( m_flDuration != -1.0f ) && ( ( m_flDuration - gpGlobals->curtime ) <= 10.0f ) )
    {
        baseScale *= ( ( m_flDuration - gpGlobals->curtime ) / 10.0f );
    }

    //Clamp the scale if vanished
    if ( baseScale < 0.01f )
    {
        baseScale = 0.0f;

        if ( m_pParticle[0] != NULL )
        {
            m_pParticle[0]->m_flDieTime		= gpGlobals->curtime;
            m_pParticle[0]->m_uchStartSize	= m_pParticle[0]->m_uchEndSize = 0;
            m_pParticle[0]->m_uchColor[0]	= 0;
            m_pParticle[0]->m_uchColor[1]	= 0;
            m_pParticle[0]->m_uchColor[2]	= 0;
        }

        if ( m_pParticle[1] != NULL )
        {
            m_pParticle[1]->m_flDieTime		= gpGlobals->curtime;
            m_pParticle[1]->m_uchStartSize	= m_pParticle[1]->m_uchEndSize = 0;
            m_pParticle[1]->m_uchColor[0]	= 0;
            m_pParticle[1]->m_uchColor[1]	= 0;
            m_pParticle[1]->m_uchColor[2]	= 0;
        }

        return;
    }

    //
    // Dynamic light
    //

    if ( m_bLight )
    {
        dlight_t *dl= effects->CL_AllocDlight( index );

        dl->origin	= GetAbsOrigin();
        dl->color.r = 255;
        dl->color.g = dl->color.b = random->RandomInt( 32, 64 );
        dl->radius	= baseScale * random->RandomFloat( 110.0f, 128.0f );
        dl->die		= gpGlobals->curtime;
    }

    //
    // Smoke
    //

    if ( m_bSmoke )
    {
        Vector	smokeOrg = GetAbsOrigin();

        Vector	flareScreenDir = ( smokeOrg - CurrentViewOrigin() );
        VectorNormalize( flareScreenDir );

        smokeOrg = smokeOrg + ( flareScreenDir * 2.0f );
        smokeOrg[2] += baseScale * 4.0f;

        SimpleParticle *sParticle = (SimpleParticle *) AddParticle( sizeof( SimpleParticle ), g_Mat_DustPuff[1], smokeOrg );

        if ( sParticle == NULL )
            return;

        sParticle->m_flLifetime		= 0.0f;
        sParticle->m_flDieTime		= 1.0f;

        sParticle->m_vecVelocity	= Vector( random->RandomFloat( -16.0f, 16.0f ), random->RandomFloat( -16.0f, 16.0f ), random->RandomFloat( 8.0f, 16.0f ) + 32.0f );

        fColor = random->RandomInt( 64, 128 );

        sParticle->m_uchColor[0]	= fColor+64;
        sParticle->m_uchColor[1]	= fColor;
        sParticle->m_uchColor[2]	= fColor;
        sParticle->m_uchStartAlpha	= random->RandomInt( 16, 32 );
        sParticle->m_uchEndAlpha	= 0;
        sParticle->m_uchStartSize	= random->RandomInt( 2, 4 );
        sParticle->m_uchEndSize		= sParticle->m_uchStartSize * 6.0f;
        sParticle->m_flRoll			= random->RandomInt( 0, 360 );
        sParticle->m_flRollDelta	= random->RandomFloat( -2.0f, 2.0f );
    }

    //Check for LOS
    if ( EffectOccluded( GetAbsOrigin() ) )
    {
        if ( m_pParticle[0] != NULL )
        {
            m_pParticle[0]->m_uchColor[0] *= 0.5f;
            m_pParticle[0]->m_uchColor[1] *= 0.5f;
            m_pParticle[0]->m_uchColor[2] *= 0.5f;
        }

        if ( m_pParticle[1] != NULL )
        {
            m_pParticle[1]->m_uchColor[0] *= 0.25f;
            m_pParticle[1]->m_uchColor[1] *= 0.25f;
            m_pParticle[1]->m_uchColor[2] *= 0.25f;
        }

        return;
    }

    //
    // Outer glow
    //

    Vector	offset;

    //Cause the base of the effect to shake
    offset.Random( -0.5f * baseScale, 0.5f * baseScale );
    offset += GetAbsOrigin();

    if ( m_pParticle[0] != NULL )
    {
        m_pParticle[0]->m_Pos			= offset;
        m_pParticle[0]->m_flLifetime	= 0.0f;
        m_pParticle[0]->m_flDieTime		= 2.0f;

        m_pParticle[0]->m_vecVelocity.Init();

        fColor = random->RandomInt( 100.0f, 128.0f );

        m_pParticle[0]->m_uchColor[0]	= fColor;
        m_pParticle[0]->m_uchColor[1]	= fColor;
        m_pParticle[0]->m_uchColor[2]	= fColor;
        m_pParticle[0]->m_uchStartAlpha	= fColor;
        m_pParticle[0]->m_uchEndAlpha	= fColor;
        m_pParticle[0]->m_uchStartSize	= baseScale * (float) random->RandomInt( 32, 48 );
        m_pParticle[0]->m_uchEndSize	= m_pParticle[0]->m_uchStartSize;
        m_pParticle[0]->m_flRollDelta	= 0.0f;

        if ( random->RandomInt( 0, 4 ) == 3 )
        {
            m_pParticle[0]->m_flRoll	+= random->RandomInt( 2, 8 );
        }
    }

    //
    // Inner core
    //

    //Cause the base of the effect to shake
    offset.Random( -1.0f * baseScale, 1.0f * baseScale );
    offset += GetAbsOrigin();

    if ( m_pParticle[1] != NULL )
    {
        m_pParticle[1]->m_Pos			= offset;
        m_pParticle[1]->m_flLifetime	= 0.0f;
        m_pParticle[1]->m_flDieTime		= 2.0f;

        m_pParticle[1]->m_vecVelocity.Init();

        fColor = 255;

        m_pParticle[1]->m_uchColor[0]	= fColor;
        m_pParticle[1]->m_uchColor[1]	= fColor;
        m_pParticle[1]->m_uchColor[2]	= fColor;
        m_pParticle[1]->m_uchStartAlpha	= fColor;
        m_pParticle[1]->m_uchEndAlpha	= fColor;
        m_pParticle[1]->m_uchStartSize	= baseScale * (float) random->RandomInt( 2, 4 );
        m_pParticle[1]->m_uchEndSize	= m_pParticle[0]->m_uchStartSize;
        m_pParticle[1]->m_flRoll		= random->RandomInt( 0, 360 );
    }
}
예제 #2
0
//-----------------------------------------------------------------------------
// Purpose: 
// Input  : timeDelta - 
//-----------------------------------------------------------------------------
void C_Flare::Update( float timeDelta )
{
	if ( !IsVisible() )
		return;

	CSimpleEmitter::Update( timeDelta );

	//Make sure our stored resources are up to date
	RestoreResources();

	//Don't do this if the console is down
	if ( timeDelta <= 0.0f )
		return;

	//Check for LOS
	pixelvis_queryparams_t params;
	params.Init(GetAbsOrigin());
	params.proxySize = 8.0f; // Inches
	
	float visible = PixelVisibility_FractionVisible( params, &m_queryHandle );

	float	fColor;
#ifdef HL2_CLIENT_DLL
	float	baseScale = m_flScale;
#else
	// NOTE!!!  This is bigger by a factor of 1.2 to deal with fixing a bug from HL2.  See dlight_t.h
	float	baseScale = m_flScale * 1.2f;
#endif

	//Account for fading out
	if ( ( m_flTimeBurnOut != -1.0f ) && ( ( m_flTimeBurnOut - gpGlobals->curtime ) <= 10.0f ) )
	{
		baseScale *= ( ( m_flTimeBurnOut - gpGlobals->curtime ) / 10.0f );
	}

	bool bVisible = (baseScale < 0.01f || visible == 0.0f) ? false : true;
	//Clamp the scale if vanished
	if ( !bVisible )
	{
		if ( m_pParticle[0] != NULL )
		{	
			m_pParticle[0]->m_flDieTime		= gpGlobals->curtime;
			m_pParticle[0]->m_uchStartSize	= m_pParticle[0]->m_uchEndSize = 0;
			m_pParticle[0]->m_uchColor[0]	= 0;
			m_pParticle[0]->m_uchColor[1]	= 0;
			m_pParticle[0]->m_uchColor[2]	= 0;
		}

		if ( m_pParticle[1] != NULL )
		{	
			m_pParticle[1]->m_flDieTime		= gpGlobals->curtime;
			m_pParticle[1]->m_uchStartSize	= m_pParticle[1]->m_uchEndSize = 0;
			m_pParticle[1]->m_uchColor[0]	= 0;
			m_pParticle[1]->m_uchColor[1]	= 0;
			m_pParticle[1]->m_uchColor[2]	= 0;
		}
	}

	if ( baseScale < 0.01f )
		return;
	//
	// Dynamic light
	//

	if ( m_bLight )
	{
		dlight_t *dl= effects->CL_AllocDlight( index );

		

		if ( m_bPropFlare == false )
		{
			dl->origin	= GetAbsOrigin();
			dl->color.r = 255;
			dl->die		= gpGlobals->curtime + 0.1f;

			dl->radius	= baseScale * random->RandomFloat( 110.0f, 128.0f );
			dl->color.g = dl->color.b = random->RandomInt( 32, 64 );
		}
		else
		{
			if ( m_iAttachment == -1 )
			{
				m_iAttachment =  LookupAttachment( "fuse" );
			}

			if ( m_iAttachment != -1 )
			{
				Vector effect_origin;
				QAngle effect_angles;
				
				GetAttachment( m_iAttachment, effect_origin, effect_angles );

				//Raise the light a little bit away from the flare so it lights it up better.
				dl->origin	= effect_origin + Vector( 0, 0, 4 );
				dl->color.r = 255;
				dl->die		= gpGlobals->curtime + 0.1f;

				dl->radius	= baseScale * random->RandomFloat( 245.0f, 256.0f );
				dl->color.g = dl->color.b = random->RandomInt( 95, 128 );
		
				dlight_t *el= effects->CL_AllocElight( index );

				el->origin	= effect_origin;
				el->color.r = 255;
				el->color.g = dl->color.b = random->RandomInt( 95, 128 );
				el->radius	= baseScale * random->RandomFloat( 260.0f, 290.0f );
				el->die		= gpGlobals->curtime + 0.1f;
			}
		}
	}

	//
	// Smoke
	//

	float dt = timeDelta;

	if ( m_bSmoke )
	{
		while ( m_teSmokeSpawn.NextEvent( dt ) )
		{
			Vector	smokeOrg = GetAbsOrigin();

			Vector	flareScreenDir = ( smokeOrg - MainViewOrigin() );
			VectorNormalize( flareScreenDir );

			smokeOrg = smokeOrg + ( flareScreenDir * 2.0f );
			smokeOrg[2] += baseScale * 4.0f;

			SimpleParticle *sParticle = (SimpleParticle *) AddParticle( sizeof( SimpleParticle ), g_Mat_DustPuff[1], smokeOrg );
				
			if ( sParticle == NULL )
				return;

			sParticle->m_flLifetime		= 0.0f;
			sParticle->m_flDieTime		= 1.0f;
			
			sParticle->m_vecVelocity	= Vector( random->RandomFloat( -16.0f, 16.0f ), random->RandomFloat( -16.0f, 16.0f ), random->RandomFloat( 8.0f, 16.0f ) + 32.0f );

			if ( m_bPropFlare )
			{
				sParticle->m_uchColor[0]	= 255;
				sParticle->m_uchColor[1]	= 100;
				sParticle->m_uchColor[2]	= 100;
			}
			else
			{
				sParticle->m_uchColor[0]	= 255;
				sParticle->m_uchColor[1]	= 48;
				sParticle->m_uchColor[2]	= 48;
			}

			sParticle->m_uchStartAlpha	= random->RandomInt( 64, 90 );
			sParticle->m_uchEndAlpha	= 0;
			sParticle->m_uchStartSize	= random->RandomInt( 2, 4 );
			sParticle->m_uchEndSize		= sParticle->m_uchStartSize * 8.0f;
			sParticle->m_flRoll			= random->RandomInt( 0, 2*M_PI );
			sParticle->m_flRollDelta	= random->RandomFloat( -(M_PI/6.0f), M_PI/6.0f );
		}
	}

	if ( !bVisible )
		return;

	//
	// Outer glow
	//

	Vector	offset;
	
	//Cause the base of the effect to shake
	offset.Random( -0.5f * baseScale, 0.5f * baseScale );
	offset += GetAbsOrigin();

	if ( m_pParticle[0] != NULL )
	{
		m_pParticle[0]->m_Pos			= offset;
		m_pParticle[0]->m_flLifetime	= 0.0f;
		m_pParticle[0]->m_flDieTime		= 2.0f;
		
		m_pParticle[0]->m_vecVelocity.Init();

		fColor = random->RandomInt( 100.0f, 128.0f ) * visible;

		m_pParticle[0]->m_uchColor[0]	= fColor;
		m_pParticle[0]->m_uchColor[1]	= fColor;
		m_pParticle[0]->m_uchColor[2]	= fColor;
		m_pParticle[0]->m_uchStartAlpha	= fColor;
		m_pParticle[0]->m_uchEndAlpha	= fColor;
		m_pParticle[0]->m_uchStartSize	= baseScale * (float) random->RandomInt( 32, 48 );
		m_pParticle[0]->m_uchEndSize	= m_pParticle[0]->m_uchStartSize;
		m_pParticle[0]->m_flRollDelta	= 0.0f;
		
		if ( random->RandomInt( 0, 4 ) == 3 )
		{
			m_pParticle[0]->m_flRoll	+= random->RandomInt( 2, 8 );
		}
	}

	//
	// Inner core
	//

	//Cause the base of the effect to shake
	offset.Random( -1.0f * baseScale, 1.0f * baseScale );
	offset += GetAbsOrigin();

	if ( m_pParticle[1] != NULL )
	{
		m_pParticle[1]->m_Pos			= offset;
		m_pParticle[1]->m_flLifetime	= 0.0f;
		m_pParticle[1]->m_flDieTime		= 2.0f;
		
		m_pParticle[1]->m_vecVelocity.Init();

		fColor = 255 * visible;

		m_pParticle[1]->m_uchColor[0]	= fColor;
		m_pParticle[1]->m_uchColor[1]	= fColor;
		m_pParticle[1]->m_uchColor[2]	= fColor;
		m_pParticle[1]->m_uchStartAlpha	= fColor;
		m_pParticle[1]->m_uchEndAlpha	= fColor;
		m_pParticle[1]->m_uchStartSize	= baseScale * (float) random->RandomInt( 2, 4 );
		m_pParticle[1]->m_uchEndSize	= m_pParticle[0]->m_uchStartSize;
		m_pParticle[1]->m_flRoll		= random->RandomInt( 0, 360 );
	}
}