//-----------------------------------------------------------------------------
// Purpose: Debris flecks caused by impacts
// Input  : origin - start
//			*trace - trace information
//			*materialName - material hit
//			materialType - type of material hit
//-----------------------------------------------------------------------------
void FX_DebrisFlecks( const Vector& origin, trace_t *tr, char materialType, int iScale, bool bNoFlecks )
{
	VPROF_BUDGET( "FX_DebrisFlecks", VPROF_BUDGETGROUP_PARTICLE_RENDERING );

	if ( !fx_drawimpactdebris.GetBool() )
		return;

#ifdef _XBOX

	//
	// XBox version
	//

	Vector	offset;
	float	spread = 0.2f;

	CSmartPtr<CDustParticle> pSimple = CDustParticle::Create( "dust" );
	pSimple->SetSortOrigin( origin );
	
	// Lock the bbox
	pSimple->GetBinding().SetBBox( origin - ( Vector( 16, 16, 16 ) * iScale ), origin + ( Vector( 16, 16, 16 ) * iScale ) );

	// Get the color of the surface we've impacted
	Vector	color;
	float	colorRamp;
	GetColorForSurface( tr, &color );

	int i;
	SimpleParticle	*pParticle;
	for ( i = 0; i < 4; i++ )
	{
		if ( i == 3 )
		{
			pParticle = (SimpleParticle *) pSimple->AddParticle( sizeof( SimpleParticle ), g_Mat_BloodPuff[0], origin );
		}
		else
		{
			pParticle = (SimpleParticle *) pSimple->AddParticle( sizeof( SimpleParticle ), g_Mat_DustPuff[0], origin );
		}

		if ( pParticle != NULL )
		{
			pParticle->m_flLifetime = 0.0f;
			pParticle->m_flDieTime	= random->RandomFloat( 0.5f, 1.0f );

			pParticle->m_vecVelocity.Random( -spread, spread );
			pParticle->m_vecVelocity += ( tr->plane.normal * random->RandomFloat( 1.0f, 6.0f ) );

			VectorNormalize( pParticle->m_vecVelocity );

			float	fForce = random->RandomFloat( 250, 500 ) * i * 0.5f;

			// scaled
			pParticle->m_vecVelocity *= fForce * iScale;

			// Ramp the color
			colorRamp = random->RandomFloat( 0.5f, 1.25f );
			pParticle->m_uchColor[0]	= MIN( 1.0f, color[0] * colorRamp ) * 255.0f;
			pParticle->m_uchColor[1]	= MIN( 1.0f, color[1] * colorRamp ) * 255.0f;
			pParticle->m_uchColor[2]	= MIN( 1.0f, color[2] * colorRamp ) * 255.0f;

			// scaled
			pParticle->m_uchStartSize	= (iScale*0.5f) * random->RandomInt( 3, 4 ) * (i+1);

			// scaled
			pParticle->m_uchEndSize		= (iScale*0.5f) * pParticle->m_uchStartSize * 4;

			pParticle->m_uchStartAlpha	= random->RandomInt( 200, 255 );
			pParticle->m_uchEndAlpha	= 0;

			pParticle->m_flRoll			= random->RandomInt( 0, 360 );
			pParticle->m_flRollDelta	= random->RandomFloat( -1.0f, 1.0f );
		}
	}			

	// Covers the impact spot with flecks
	pParticle = (SimpleParticle *) pSimple->AddParticle( sizeof( SimpleParticle ), g_DustPuff2, origin );

	if ( pParticle != NULL )
	{
		offset = origin;
		offset[0] += random->RandomFloat( -8.0f, 8.0f );
		offset[1] += random->RandomFloat( -8.0f, 8.0f );

		pParticle->m_flLifetime = 0.0f;
		pParticle->m_flDieTime	= random->RandomFloat( 0.5f, 1.0f );

		spread = 1.0f;

		pParticle->m_vecVelocity.Init();

		colorRamp = random->RandomFloat( 0.5f, 1.25f );

		pParticle->m_uchColor[0]	= MIN( 1.0f, color[0] * colorRamp ) * 255.0f;
		pParticle->m_uchColor[1]	= MIN( 1.0f, color[1] * colorRamp ) * 255.0f;
		pParticle->m_uchColor[2]	= MIN( 1.0f, color[2] * colorRamp ) * 255.0f;

		pParticle->m_uchStartSize	= random->RandomInt( 4, 8 );
		pParticle->m_uchEndSize		= pParticle->m_uchStartSize * 4;

		pParticle->m_uchStartAlpha	= random->RandomInt( 64, 128 );
		pParticle->m_uchEndAlpha	= 0;

		pParticle->m_flRoll			= random->RandomInt( 0, 360 );
		pParticle->m_flRollDelta	= random->RandomFloat( -0.1f, 0.1f );
	}

#else

	//
	// PC version
	//

	Vector	color;
	GetColorForSurface( tr, &color );

	if ( !bNoFlecks )
	{
		CreateFleckParticles( origin, color, tr, materialType, iScale );
	}

	//
	// Dust trail
	//
	Vector	offset = tr->endpos + ( tr->plane.normal * 2.0f );

	SimpleParticle newParticle;

	int i;
	for ( i = 0; i < 2; i++ )
	{
		newParticle.m_Pos = offset;

		newParticle.m_flLifetime	= 0.0f;
		newParticle.m_flDieTime	= 1.0f;

		Vector dir;
		dir[0] = tr->plane.normal[0] + random->RandomFloat( -0.8f, 0.8f );
		dir[1] = tr->plane.normal[1] + random->RandomFloat( -0.8f, 0.8f );
		dir[2] = tr->plane.normal[2] + random->RandomFloat( -0.8f, 0.8f );

		newParticle.m_uchStartSize	= random->RandomInt( 2, 4 ) * iScale;
		newParticle.m_uchEndSize	= newParticle.m_uchStartSize * 8 * iScale;

		newParticle.m_vecVelocity = dir * random->RandomFloat( 2.0f, 24.0f )*(i+1);
		newParticle.m_vecVelocity[2] -= random->RandomFloat( 8.0f, 32.0f )*(i+1);

		newParticle.m_uchStartAlpha	= random->RandomInt( 100, 200 );
		newParticle.m_uchEndAlpha	= 0;

		newParticle.m_flRoll			= random->RandomFloat( 0, 360 );
		newParticle.m_flRollDelta	= random->RandomFloat( -1, 1 );

		float colorRamp = random->RandomFloat( 0.5f, 1.25f );

		newParticle.m_uchColor[0] = MIN( 1.0f, color[0]*colorRamp )*255.0f;
		newParticle.m_uchColor[1] = MIN( 1.0f, color[1]*colorRamp )*255.0f;
		newParticle.m_uchColor[2] = MIN( 1.0f, color[2]*colorRamp )*255.0f;

		AddSimpleParticle( &newParticle, g_Mat_DustPuff[0] );
	}


	for ( i = 0; i < 4; i++ )
	{
		newParticle.m_Pos = offset;

		newParticle.m_flLifetime	= 0.0f;
		newParticle.m_flDieTime	= random->RandomFloat( 0.25f, 0.5f );

		Vector dir;
		dir[0] = tr->plane.normal[0] + random->RandomFloat( -0.8f, 0.8f );
		dir[1] = tr->plane.normal[1] + random->RandomFloat( -0.8f, 0.8f );
		dir[2] = tr->plane.normal[2] + random->RandomFloat( -0.8f, 0.8f );

		newParticle.m_uchStartSize	= random->RandomInt( 1, 4 );
		newParticle.m_uchEndSize	= newParticle.m_uchStartSize * 4;

		newParticle.m_vecVelocity = dir * random->RandomFloat( 8.0f, 32.0f );
		newParticle.m_vecVelocity[2] -= random->RandomFloat( 8.0f, 64.0f );

		newParticle.m_uchStartAlpha	= 255;
		newParticle.m_uchEndAlpha	= 0;

		newParticle.m_flRoll			= random->RandomFloat( 0, 360 );
		newParticle.m_flRollDelta	= random->RandomFloat( -2.0f, 2.0f );

		float colorRamp = random->RandomFloat( 0.5f, 1.25f );

		newParticle.m_uchColor[0] = MIN( 1.0f, color[0]*colorRamp )*255.0f;
		newParticle.m_uchColor[1] = MIN( 1.0f, color[1]*colorRamp )*255.0f;
		newParticle.m_uchColor[2] = MIN( 1.0f, color[2]*colorRamp )*255.0f;

		AddSimpleParticle( &newParticle, g_Mat_BloodPuff[0] );
	}

	//
	// Bullet hole capper
	//
	newParticle.m_Pos = offset;

	newParticle.m_flLifetime		= 0.0f;
	newParticle.m_flDieTime		= random->RandomFloat( 1.0f, 1.5f );

	Vector dir;
	dir[0] = tr->plane.normal[0] + random->RandomFloat( -0.8f, 0.8f );
	dir[1] = tr->plane.normal[1] + random->RandomFloat( -0.8f, 0.8f );
	dir[2] = tr->plane.normal[2] + random->RandomFloat( -0.8f, 0.8f );

	newParticle.m_uchStartSize	= random->RandomInt( 4, 8 );
	newParticle.m_uchEndSize		= newParticle.m_uchStartSize * 4.0f;

	newParticle.m_vecVelocity = dir * random->RandomFloat( 2.0f, 24.0f );
	newParticle.m_vecVelocity[2] = random->RandomFloat( -2.0f, 2.0f );

	newParticle.m_uchStartAlpha	= random->RandomInt( 100, 200 );
	newParticle.m_uchEndAlpha	= 0;

	newParticle.m_flRoll			= random->RandomFloat( 0, 360 );
	newParticle.m_flRollDelta	= random->RandomFloat( -2, 2 );

	float colorRamp = random->RandomFloat( 0.5f, 1.25f );

	newParticle.m_uchColor[0] = MIN( 1.0f, color[0]*colorRamp )*255.0f;
	newParticle.m_uchColor[1] = MIN( 1.0f, color[1]*colorRamp )*255.0f;
	newParticle.m_uchColor[2] = MIN( 1.0f, color[2]*colorRamp )*255.0f;

	AddSimpleParticle( &newParticle, g_Mat_DustPuff[0] );

#endif
}
예제 #2
0
//-----------------------------------------------------------------------------
// Purpose: Debris flecks caused by impacts
// Input  : origin - start
//			*trace - trace information
//			*materialName - material hit
//			materialType - type of material hit
//-----------------------------------------------------------------------------
void FX_DebrisFlecks(const Vector& origin, trace_t *tr, char materialType, int iScale, bool bNoFlecks)
{
    VPROF_BUDGET("FX_DebrisFlecks", VPROF_BUDGETGROUP_PARTICLE_RENDERING);

    if (!fx_drawimpactdebris.GetBool())
        return;
    //
    // PC version
    //

    Vector	color;
    GetColorForSurface(tr, &color);

    if (!bNoFlecks)
    {
        CreateFleckParticles(origin, color, tr, materialType, iScale);
    }

    //
    // Dust trail
    //
    Vector	offset = tr->endpos + (tr->plane.normal * 2.0f);

    SimpleParticle newParticle;

    int i;
    for (i = 0; i < 2; i++)
    {
        newParticle.m_Pos = offset;

        newParticle.m_flLifetime = 0.0f;
        newParticle.m_flDieTime = 1.0f;

        Vector dir;
        dir[0] = tr->plane.normal[0] + random->RandomFloat(-0.8f, 0.8f);
        dir[1] = tr->plane.normal[1] + random->RandomFloat(-0.8f, 0.8f);
        dir[2] = tr->plane.normal[2] + random->RandomFloat(-0.8f, 0.8f);

        newParticle.m_uchStartSize = random->RandomInt(2, 4) * iScale;
        newParticle.m_uchEndSize = newParticle.m_uchStartSize * 8 * iScale;

        newParticle.m_vecVelocity = dir * random->RandomFloat(2.0f, 24.0f)*(i + 1);
        newParticle.m_vecVelocity[2] -= random->RandomFloat(8.0f, 32.0f)*(i + 1);

        newParticle.m_uchStartAlpha = random->RandomInt(100, 200);
        newParticle.m_uchEndAlpha = 0;

        newParticle.m_flRoll = random->RandomFloat(0, 360);
        newParticle.m_flRollDelta = random->RandomFloat(-1, 1);

        float colorRamp = random->RandomFloat(0.5f, 1.25f);

        newParticle.m_uchColor[0] = MIN(1.0f, color[0] * colorRamp)*255.0f;
        newParticle.m_uchColor[1] = MIN(1.0f, color[1] * colorRamp)*255.0f;
        newParticle.m_uchColor[2] = MIN(1.0f, color[2] * colorRamp)*255.0f;

        AddSimpleParticle(&newParticle, g_Mat_DustPuff[0]);
    }


    for (i = 0; i < 4; i++)
    {
        newParticle.m_Pos = offset;

        newParticle.m_flLifetime = 0.0f;
        newParticle.m_flDieTime = random->RandomFloat(0.25f, 0.5f);

        Vector dir;
        dir[0] = tr->plane.normal[0] + random->RandomFloat(-0.8f, 0.8f);
        dir[1] = tr->plane.normal[1] + random->RandomFloat(-0.8f, 0.8f);
        dir[2] = tr->plane.normal[2] + random->RandomFloat(-0.8f, 0.8f);

        newParticle.m_uchStartSize = random->RandomInt(1, 4);
        newParticle.m_uchEndSize = newParticle.m_uchStartSize * 4;

        newParticle.m_vecVelocity = dir * random->RandomFloat(8.0f, 32.0f);
        newParticle.m_vecVelocity[2] -= random->RandomFloat(8.0f, 64.0f);

        newParticle.m_uchStartAlpha = 255;
        newParticle.m_uchEndAlpha = 0;

        newParticle.m_flRoll = random->RandomFloat(0, 360);
        newParticle.m_flRollDelta = random->RandomFloat(-2.0f, 2.0f);

        float colorRamp = random->RandomFloat(0.5f, 1.25f);

        newParticle.m_uchColor[0] = MIN(1.0f, color[0] * colorRamp)*255.0f;
        newParticle.m_uchColor[1] = MIN(1.0f, color[1] * colorRamp)*255.0f;
        newParticle.m_uchColor[2] = MIN(1.0f, color[2] * colorRamp)*255.0f;

        AddSimpleParticle(&newParticle, g_Mat_BloodPuff[0]);
    }

    //
    // Bullet hole capper
    //
    newParticle.m_Pos = offset;

    newParticle.m_flLifetime = 0.0f;
    newParticle.m_flDieTime = random->RandomFloat(1.0f, 1.5f);

    Vector dir;
    dir[0] = tr->plane.normal[0] + random->RandomFloat(-0.8f, 0.8f);
    dir[1] = tr->plane.normal[1] + random->RandomFloat(-0.8f, 0.8f);
    dir[2] = tr->plane.normal[2] + random->RandomFloat(-0.8f, 0.8f);

    newParticle.m_uchStartSize = random->RandomInt(4, 8);
    newParticle.m_uchEndSize = newParticle.m_uchStartSize * 4.0f;

    newParticle.m_vecVelocity = dir * random->RandomFloat(2.0f, 24.0f);
    newParticle.m_vecVelocity[2] = random->RandomFloat(-2.0f, 2.0f);

    newParticle.m_uchStartAlpha = random->RandomInt(100, 200);
    newParticle.m_uchEndAlpha = 0;

    newParticle.m_flRoll = random->RandomFloat(0, 360);
    newParticle.m_flRollDelta = random->RandomFloat(-2, 2);

    float colorRamp = random->RandomFloat(0.5f, 1.25f);

    newParticle.m_uchColor[0] = MIN(1.0f, color[0] * colorRamp)*255.0f;
    newParticle.m_uchColor[1] = MIN(1.0f, color[1] * colorRamp)*255.0f;
    newParticle.m_uchColor[2] = MIN(1.0f, color[2] * colorRamp)*255.0f;

    AddSimpleParticle(&newParticle, g_Mat_DustPuff[0]);
}