//----------------------------------------------------------------------------- // Purpose: Parameter heavy version //----------------------------------------------------------------------------- void FX_AddQuad( const Vector &origin, const Vector &normal, float startSize, float endSize, float sizeBias, float startAlpha, float endAlpha, float alphaBias, float yaw, float deltaYaw, const Vector &color, float lifeTime, const char *shader, unsigned int flags ) { FXQuadData_t data; //Setup the data data.SetAlpha( startAlpha, endAlpha ); data.SetScale( startSize, endSize ); data.SetFlags( flags ); data.SetMaterial( shader ); data.SetNormal( normal ); data.SetOrigin( origin ); data.SetLifeTime( lifeTime ); data.SetColor( color[0], color[1], color[2] ); data.SetScaleBias( sizeBias ); data.SetAlphaBias( alphaBias ); data.SetYaw( yaw, deltaYaw ); //Output it FX_AddQuad( data ); }
void FX_MetalSpark(const Vector &position, const Vector &direction, const Vector &surfaceNormal, int iScale) { VPROF_BUDGET("FX_MetalSpark", VPROF_BUDGETGROUP_PARTICLE_RENDERING); if (!fx_drawmetalspark.GetBool()) return; // // Emitted particles // Vector offset = position + (surfaceNormal * 1.0f); CSmartPtr<CTrailParticles> sparkEmitter = CTrailParticles::Create("FX_MetalSpark 1"); if (sparkEmitter == NULL) return; //Setup our information sparkEmitter->SetSortOrigin(offset); sparkEmitter->SetFlag(bitsPARTICLE_TRAIL_VELOCITY_DAMPEN); sparkEmitter->SetVelocityDampen(8.0f); sparkEmitter->SetGravity(METAL_SPARK_GRAVITY); sparkEmitter->SetCollisionDamped(METAL_SPARK_DAMPEN); sparkEmitter->GetBinding().SetBBox(offset - Vector(32, 32, 32), offset + Vector(32, 32, 32)); int numSparks = random->RandomInt(4, 8) * (iScale * 2); numSparks = (int) (0.5f + (float) numSparks * g_pParticleSystemMgr->ParticleThrottleScaling()); if (g_Material_Spark == NULL) { g_Material_Spark = sparkEmitter->GetPMaterial("effects/spark"); } TrailParticle *pParticle; Vector dir; float length = 0.1f; //Dump out sparks for (int i = 0; i < numSparks; i++) { pParticle = (TrailParticle *) sparkEmitter->AddParticle(sizeof(TrailParticle), g_Material_Spark, offset); if (pParticle == NULL) return; pParticle->m_flLifetime = 0.0f; if (iScale > 1 && i % 3 == 0) { // Every third spark goes flying far if we're having a big batch of sparks. pParticle->m_flDieTime = random->RandomFloat(0.15f, 0.25f); } else { pParticle->m_flDieTime = random->RandomFloat(0.05f, 0.1f); } float spreadOfs = random->RandomFloat(0.0f, 2.0f); dir[0] = direction[0] + random->RandomFloat(-(METAL_SPARK_SPREAD*spreadOfs), (METAL_SPARK_SPREAD*spreadOfs)); dir[1] = direction[1] + random->RandomFloat(-(METAL_SPARK_SPREAD*spreadOfs), (METAL_SPARK_SPREAD*spreadOfs)); dir[2] = direction[2] + random->RandomFloat(-(METAL_SPARK_SPREAD*spreadOfs), (METAL_SPARK_SPREAD*spreadOfs)); VectorNormalize(dir); pParticle->m_flWidth = random->RandomFloat(1.0f, 4.0f); pParticle->m_flLength = random->RandomFloat(length*0.25f, length); pParticle->m_vecVelocity = dir * random->RandomFloat((METAL_SPARK_MINSPEED*(2.0f - spreadOfs)), (METAL_SPARK_MAXSPEED*(2.0f - spreadOfs))); Color32Init(pParticle->m_color, 255, 255, 255, 255); } // // Impact point glow // FXQuadData_t data; data.SetMaterial("effects/yellowflare"); data.SetColor(1.0f, 1.0f, 1.0f); data.SetOrigin(offset); data.SetNormal(surfaceNormal); data.SetAlpha(1.0f, 0.0f); data.SetLifeTime(0.1f); data.SetYaw(random->RandomInt(0, 360)); int scale = random->RandomInt(24, 28); data.SetScale(scale, 0); FX_AddQuad(data); }