void C_EnvPortalPathTrack::UpdateParticles_Active ( void ) { // Emitters must be valid if ( SetupEmitters() == false ) return; // Reset our sort origin m_pSimpleEmitter->SetSortOrigin( GetAbsOrigin() ); SimpleParticle *sParticle; // Do the charging particles m_pAttractorEmitter->SetAttractorOrigin( GetAbsOrigin() ); Vector forward, right, up; AngleVectors( GetAbsAngles(), &forward, &right, &up ); Vector offset; float dist; int numParticles = floor( 4.0f ); for ( int i = 0; i < numParticles; i++ ) { dist = random->RandomFloat( 4.0f, 64.0f ); offset = forward * dist; dist = RemapValClamped( dist, 4.0f, 64.0f, 6.0f, 1.0f ); offset += right * random->RandomFloat( -4.0f * dist, 4.0f * dist ); offset += up * random->RandomFloat( -4.0f * dist, 4.0f * dist ); offset += GetAbsOrigin(); sParticle = (SimpleParticle *) m_pAttractorEmitter->AddParticle( sizeof(SimpleParticle), m_pAttractorEmitter->GetPMaterial( "effects/strider_muzzle" ), offset ); if ( sParticle == NULL ) return; sParticle->m_vecVelocity = Vector(0,0,8); sParticle->m_flDieTime = 0.5f; sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = 0.0f; float alpha = 255; sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; sParticle->m_uchStartSize = random->RandomFloat( 1, 2 ); sParticle->m_uchEndSize = 0; } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void C_EntityParticleTrail::AddParticle( float flInitialDeltaTime, const Vector &vecMins, const Vector &vecMaxs, const matrix3x4_t &boxToWorld ) { // Select a random point somewhere in the hitboxes of the entity. Vector vecLocalPosition, vecWorldPosition; vecLocalPosition.x = Lerp( random->RandomFloat( 0.0f, 1.0f ), vecMins.x, vecMaxs.x ); vecLocalPosition.y = Lerp( random->RandomFloat( 0.0f, 1.0f ), vecMins.y, vecMaxs.y ); vecLocalPosition.z = Lerp( random->RandomFloat( 0.0f, 1.0f ), vecMins.z, vecMaxs.z ); VectorTransform( vecLocalPosition, boxToWorld, vecWorldPosition ); // Don't emit the particle unless it's inside the model if ( m_hConstraintEntity.Get() ) { Ray_t ray; trace_t tr; ray.Init( vecWorldPosition, vecWorldPosition ); enginetrace->ClipRayToEntity( ray, MASK_ALL, m_hConstraintEntity, &tr ); if ( !tr.startsolid ) return; } // Make a new particle SimpleParticle *pParticle = (SimpleParticle *)m_ParticleEffect.AddParticle( sizeof(SimpleParticle), m_hMaterial ); if ( pParticle == NULL ) return; pParticle->m_Pos = vecWorldPosition; pParticle->m_flRoll = Helper_RandomInt( 0, 360 ); pParticle->m_flRollDelta = Helper_RandomFloat( -2.0f, 2.0f ); pParticle->m_flLifetime = flInitialDeltaTime; pParticle->m_flDieTime = m_Info.m_flLifetime; pParticle->m_uchColor[0] = 64; pParticle->m_uchColor[1] = 140; pParticle->m_uchColor[2] = 225; pParticle->m_uchStartAlpha = Helper_RandomInt( 64, 64 ); pParticle->m_uchEndAlpha = 0; pParticle->m_uchStartSize = m_Info.m_flStartSize; pParticle->m_uchEndSize = m_Info.m_flEndSize; pParticle->m_vecVelocity = vec3_origin; VectorMA( pParticle->m_Pos, flInitialDeltaTime, pParticle->m_vecVelocity, pParticle->m_Pos ); }
//----------------------------------------------------------------------------- // Purpose: // Input : flPerc - //----------------------------------------------------------------------------- void C_MortarShell::AddRisingParticles( float flPerc ) { SimpleParticle *sParticle; Vector offset; float radius = m_flRadius * 0.25f * flPerc; float val = RemapValClamped( gpGlobals->curtime, m_flStarttime, m_flStarttime + m_flLifespan, 0.0f, 1.0f ); float flCur = gpGlobals->frametime; // Anime ground effects while ( m_ParticleEvent.NextEvent( flCur ) ) { offset.x = random->RandomFloat( -radius, radius ); offset.y = random->RandomFloat( -radius, radius ); offset.z = random->RandomFloat( -8.0f, 8.0f ); offset += GetAbsOrigin(); sParticle = (SimpleParticle *) m_pEmitter->AddParticle( sizeof(SimpleParticle), m_pEmitter->GetPMaterial( "effects/spark" ), offset ); if ( sParticle == NULL ) return; sParticle->m_vecVelocity = Vector( Helper_RandomFloat( -4.0f, 4.0f ), Helper_RandomFloat( -4.0f, 4.0f ), Helper_RandomFloat( 32.0f, 256.0f ) * Bias( val, 0.25f ) ); sParticle->m_uchStartSize = random->RandomFloat( 4, 8 ) * flPerc; sParticle->m_flDieTime = random->RandomFloat( 0.5f, 1.0f ); sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); float alpha = 255 * flPerc; sParticle->m_flRollDelta = Helper_RandomFloat( -8.0f * flPerc, 8.0f * flPerc ); sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; sParticle->m_uchEndSize = 0; } }
//----------------------------------------------------------------------------- // Purpose: // Input : flPerc - //----------------------------------------------------------------------------- void C_MortarShell::AddExplodingParticles( float flPerc ) { SimpleParticle *sParticle; Vector offset; float radius = 48.0f * flPerc; float flCur = gpGlobals->frametime; // Anime ground effects while ( m_ParticleEvent.NextEvent( flCur ) ) { offset.x = random->RandomFloat( -radius, radius ); offset.y = random->RandomFloat( -radius, radius ); offset.z = random->RandomFloat( -8.0f, 8.0f ); offset += GetAbsOrigin(); sParticle = (SimpleParticle *) m_pEmitter->AddParticle( sizeof(SimpleParticle), m_pEmitter->GetPMaterial( "effects/spark" ), offset ); if ( sParticle == NULL ) return; sParticle->m_vecVelocity = RandomVector( -1.0f, 1.0f ) + Vector( 0, 0, 1 ); sParticle->m_vecVelocity *= ( 750.0f * flPerc ); sParticle->m_uchStartSize = random->RandomFloat( 2, 4 ) * flPerc; sParticle->m_flDieTime = random->RandomFloat( 0.25f, 0.5f ); sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); float alpha = 255 * flPerc; sParticle->m_flRollDelta = Helper_RandomFloat( -8.0f * flPerc, 8.0f * flPerc ); sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; sParticle->m_uchEndSize = 0; } }
//----------------------------------------------------------------------------- // Purpose: // Input : flags - // Output : int //----------------------------------------------------------------------------- int C_EntityDissolve::DrawModel( int flags ) { // See if we should draw if ( gpGlobals->frametime == 0 || m_bReadyToDraw == false ) return 0; C_BaseAnimating *pAnimating = GetMoveParent() ? GetMoveParent()->GetBaseAnimating() : NULL; if ( pAnimating == NULL ) return 0; matrix3x4_t *hitboxbones[MAXSTUDIOBONES]; if ( pAnimating->HitboxToWorldTransforms( hitboxbones ) == false ) return 0; studiohdr_t *pStudioHdr = modelinfo->GetStudiomodel( pAnimating->GetModel() ); if ( pStudioHdr == NULL ) return false; mstudiohitboxset_t *set = pStudioHdr->pHitboxSet( pAnimating->GetHitboxSet() ); if ( set == NULL ) return false; // Make sure the emitter is setup properly SetupEmitter(); // Get fade percentages for the effect float fadeInPerc = GetFadeInPercentage(); float fadeOutPerc = GetFadeOutPercentage(); float fadePerc = ( fadeInPerc >= 1.0f ) ? fadeOutPerc : fadeInPerc; Vector vecSkew = vec3_origin; // Do extra effects under certain circumstances if ( ( fadePerc < 0.99f ) && ( (m_nDissolveType == ENTITY_DISSOLVE_ELECTRICAL) || (m_nDissolveType == ENTITY_DISSOLVE_ELECTRICAL_LIGHT) ) ) { DoSparks( set, hitboxbones ); } // Skew the particles in front or in back of their targets vecSkew = CurrentViewForward() * ( 8.0f - ( ( 1.0f - fadePerc ) * 32.0f ) ); float spriteScale = ( ( gpGlobals->curtime - m_flStartTime ) / m_flFadeOutLength ); spriteScale = clamp( spriteScale, 0.75f, 1.0f ); // Cache off this material reference if ( g_Material_Spark == NULL ) { g_Material_Spark = ParticleMgr()->GetPMaterial( "effects/spark" ); } if ( g_Material_AR2Glow == NULL ) { g_Material_AR2Glow = ParticleMgr()->GetPMaterial( "effects/combinemuzzle2" ); } SimpleParticle *sParticle; for ( int i = 0; i < set->numhitboxes; ++i ) { Vector vecAbsOrigin, xvec, yvec; mstudiobbox_t *pBox = set->pHitbox(i); ComputeRenderInfo( pBox, *hitboxbones[pBox->bone], &vecAbsOrigin, &xvec, &yvec ); Vector offset; Vector xDir, yDir; xDir = xvec; float xScale = VectorNormalize( xDir ) * 0.75f; yDir = yvec; float yScale = VectorNormalize( yDir ) * 0.75f; int numParticles = clamp( 3.0f * fadePerc, 0.f, 3.f ); int iTempParts = 2; if ( m_nDissolveType == ENTITY_DISSOLVE_CORE ) { if ( m_bCoreExplode == true ) { numParticles = 15; iTempParts = 20; } } for ( int j = 0; j < iTempParts; j++ ) { // Skew the origin offset = xDir * Helper_RandomFloat( -xScale*0.5f, xScale*0.5f ) + yDir * Helper_RandomFloat( -yScale*0.5f, yScale*0.5f ); offset += vecSkew; if ( random->RandomInt( 0, 2 ) != 0 ) continue; sParticle = (SimpleParticle *) m_pEmitter->AddParticle( sizeof(SimpleParticle), g_Material_Spark, vecAbsOrigin + offset ); if ( sParticle == NULL ) return 1; sParticle->m_vecVelocity = Vector( Helper_RandomFloat( -4.0f, 4.0f ), Helper_RandomFloat( -4.0f, 4.0f ), Helper_RandomFloat( 16.0f, 64.0f ) ); if ( m_nDissolveType == ENTITY_DISSOLVE_CORE ) { if ( m_bCoreExplode == true ) { Vector vDirection = (vecAbsOrigin + offset) - m_vDissolverOrigin; VectorNormalize( vDirection ); sParticle->m_vecVelocity = vDirection * m_nMagnitude; } } if ( sParticle->m_vecVelocity.z > 0 ) { sParticle->m_uchStartSize = random->RandomFloat( 4, 6 ) * spriteScale; } else { sParticle->m_uchStartSize = 2 * spriteScale; } sParticle->m_flDieTime = random->RandomFloat( 0.4f, 0.5f ); // If we're the last particles, last longer if ( numParticles == 0 ) { sParticle->m_flDieTime *= 2.0f; sParticle->m_uchStartSize = 2 * spriteScale; sParticle->m_flRollDelta = Helper_RandomFloat( -4.0f, 4.0f ); if ( m_nDissolveType == ENTITY_DISSOLVE_CORE ) { if ( m_bCoreExplode == true ) { sParticle->m_flDieTime *= 2.0f; sParticle->m_flRollDelta = Helper_RandomFloat( -1.0f, 1.0f ); } } } else { sParticle->m_flRollDelta = Helper_RandomFloat( -8.0f, 8.0f ); } sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); float alpha = 255; sParticle->m_uchColor[0] = m_vEffectColor.x; sParticle->m_uchColor[1] = m_vEffectColor.y; sParticle->m_uchColor[2] = m_vEffectColor.z; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; sParticle->m_uchEndSize = 0; } for ( int j = 0; j < numParticles; j++ ) { offset = xDir * Helper_RandomFloat( -xScale*0.5f, xScale*0.5f ) + yDir * Helper_RandomFloat( -yScale*0.5f, yScale*0.5f ); offset += vecSkew; sParticle = (SimpleParticle *) m_pEmitter->AddParticle( sizeof(SimpleParticle), g_Material_AR2Glow, vecAbsOrigin + offset ); if ( sParticle == NULL ) return 1; sParticle->m_vecVelocity = Vector( Helper_RandomFloat( -4.0f, 4.0f ), Helper_RandomFloat( -4.0f, 4.0f ), Helper_RandomFloat( -64.0f, 128.0f ) ); sParticle->m_uchStartSize = random->RandomFloat( 8, 12 ) * spriteScale; sParticle->m_flDieTime = 0.1f; sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = Helper_RandomFloat( -2.0f, 2.0f ); float alpha = 255; sParticle->m_uchColor[0] = m_vEffectColor.x; sParticle->m_uchColor[1] = m_vEffectColor.y; sParticle->m_uchColor[2] = m_vEffectColor.z; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; sParticle->m_uchEndSize = 0; if ( m_nDissolveType == ENTITY_DISSOLVE_CORE ) { if ( m_bCoreExplode == true ) { Vector vDirection = (vecAbsOrigin + offset) - m_vDissolverOrigin; VectorNormalize( vDirection ); sParticle->m_vecVelocity = vDirection * m_nMagnitude; sParticle->m_flDieTime = 0.5f; } } } } return 1; }
//----------------------------------------------------------------------------- // Purpose: // Input : flags - // Output : int //----------------------------------------------------------------------------- int C_WeaponPhysCannon::DrawModel( int flags ) { // If we're not ugrading, don't do anything special if ( m_bIsCurrentlyUpgrading == false && m_bWasUpgraded == false ) return BaseClass::DrawModel( flags ); if ( gpGlobals->frametime == 0 ) return BaseClass::DrawModel( flags ); if ( !m_bReadyToDraw ) return 0; m_bWasUpgraded = true; // Create the particle emitter if it's not already if ( SetupEmitter() ) { // Add the power-up particles // See if we should draw if ( m_bReadyToDraw == false ) return 0; C_BaseAnimating *pAnimating = GetBaseAnimating(); if (!pAnimating) return 0; matrix3x4_t *hitboxbones[MAXSTUDIOBONES]; if ( !pAnimating->HitboxToWorldTransforms( hitboxbones ) ) return 0; studiohdr_t *pStudioHdr = modelinfo->GetStudiomodel( pAnimating->GetModel() ); if (!pStudioHdr) return false; mstudiohitboxset_t *set = pStudioHdr->pHitboxSet( pAnimating->GetHitboxSet() ); if ( !set ) return false; int i; float fadePerc = 1.0f; if ( m_bIsCurrentlyUpgrading ) { Vector vecSkew = vec3_origin; // Skew the particles in front or in back of their targets vecSkew = CurrentViewForward() * 4.0f; float spriteScale = 1.0f; spriteScale = clamp( spriteScale, 0.75f, 1.0f ); SimpleParticle *sParticle; for ( i = 0; i < set->numhitboxes; ++i ) { Vector vecAbsOrigin, xvec, yvec; mstudiobbox_t *pBox = set->pHitbox(i); ComputeRenderInfo( pBox, *hitboxbones[pBox->bone], &vecAbsOrigin, &xvec, &yvec ); Vector offset; Vector xDir, yDir; xDir = xvec; float xScale = VectorNormalize( xDir ) * 0.75f; yDir = yvec; float yScale = VectorNormalize( yDir ) * 0.75f; int numParticles = clamp( 4.0f * fadePerc, 1, 3 ); for ( int j = 0; j < numParticles; j++ ) { offset = xDir * Helper_RandomFloat( -xScale*0.5f, xScale*0.5f ) + yDir * Helper_RandomFloat( -yScale*0.5f, yScale*0.5f ); offset += vecSkew; sParticle = (SimpleParticle *) m_pEmitter->AddParticle( sizeof(SimpleParticle), m_pEmitter->GetPMaterial( "effects/combinemuzzle1" ), vecAbsOrigin + offset ); if ( sParticle == NULL ) return 1; sParticle->m_vecVelocity = vec3_origin; sParticle->m_uchStartSize = 16.0f * spriteScale; sParticle->m_flDieTime = 0.2f; sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = Helper_RandomFloat( -2.0f, 2.0f ); float alpha = 40; sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; sParticle->m_uchEndSize = sParticle->m_uchStartSize * 2; } } } } int attachment = LookupAttachment( "core" ); Vector coreOrigin; QAngle coreAngles; GetAttachment( attachment, coreOrigin, coreAngles ); SimpleParticle *sParticle; // Do the core effects for ( int i = 0; i < 4; i++ ) { sParticle = (SimpleParticle *) m_pLocalEmitter->AddParticle( sizeof(SimpleParticle), m_pLocalEmitter->GetPMaterial( "effects/strider_muzzle" ), vec3_origin ); if ( sParticle == NULL ) return 1; sParticle->m_vecVelocity = vec3_origin; sParticle->m_flDieTime = 0.1f; sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = 0.0f; float alpha = 255; sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; if ( i < 2 ) { sParticle->m_uchStartSize = random->RandomFloat( 1, 2 ) * (i+1); sParticle->m_uchEndSize = sParticle->m_uchStartSize * 2.0f; } else { if ( random->RandomInt( 0, 20 ) == 0 ) { sParticle->m_uchStartSize = random->RandomFloat( 1, 2 ) * (i+1); sParticle->m_uchEndSize = sParticle->m_uchStartSize * 4.0f; sParticle->m_flDieTime = 0.25f; } else { sParticle->m_uchStartSize = random->RandomFloat( 1, 2 ) * (i+1); sParticle->m_uchEndSize = sParticle->m_uchStartSize * 2.0f; } } } if ( m_bWasUpgraded && m_bIsCurrentlyUpgrading ) { // Update our attractor point m_pAttractor->SetAttractorOrigin( coreOrigin ); Vector offset; for ( int i = 0; i < 4; i++ ) { offset = coreOrigin + RandomVector( -32.0f, 32.0f ); sParticle = (SimpleParticle *) m_pAttractor->AddParticle( sizeof(SimpleParticle), m_pAttractor->GetPMaterial( "effects/strider_muzzle" ), offset ); if ( sParticle == NULL ) return 1; sParticle->m_vecVelocity = Vector(0,0,8); sParticle->m_flDieTime = 0.5f; sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = 0.0f; float alpha = 255; sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; sParticle->m_uchStartSize = random->RandomFloat( 1, 2 ); sParticle->m_uchEndSize = 0; } } return BaseClass::DrawModel( flags ); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void C_HopwireExplosion::AddParticles( void ) { // Make sure the emitters are setup properly if ( SetupEmitters() == false ) return; float tempDelta = gpGlobals->frametime; while( m_ParticleTimer.NextEvent( tempDelta ) ) { // ======================== // Attracted dust particles // ======================== // Update our attractor point m_pAttractorEmitter->SetAttractorOrigin( GetRenderOrigin() ); Vector offset; SimpleParticle *sParticle; offset = GetRenderOrigin() + RandomVector( -256.0f, 256.0f ); sParticle = (SimpleParticle *) m_pAttractorEmitter->AddParticle( sizeof(SimpleParticle), g_Mat_Fleck_Cement[0], offset ); if ( sParticle == NULL ) return; sParticle->m_vecVelocity = Vector(0,0,8); sParticle->m_flDieTime = 0.5f; sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = 1.0f; float alpha = random->RandomFloat( 128.0f, 200.0f ); sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = alpha; sParticle->m_uchStartSize = random->RandomInt( 1, 4 ); sParticle->m_uchEndSize = 0; // ======================== // Core effects // ======================== // Reset our sort origin m_pSimpleEmitter->SetSortOrigin( GetRenderOrigin() ); // Base of the core effect sParticle = (SimpleParticle *) m_pSimpleEmitter->AddParticle( sizeof(SimpleParticle), m_pSimpleEmitter->GetPMaterial( "effects/strider_muzzle" ), GetRenderOrigin() ); if ( sParticle == NULL ) return; sParticle->m_vecVelocity = vec3_origin; sParticle->m_flDieTime = 0.2f; sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = 4.0f; alpha = random->RandomInt( 32, 200 ); sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = 0; sParticle->m_uchEndAlpha = alpha; sParticle->m_uchStartSize = 255; sParticle->m_uchEndSize = 0; // Make sure we encompass the complete particle here! m_pSimpleEmitter->SetParticleCullRadius( sParticle->m_uchEndSize ); // ========================= // Dust ring effect // ========================= if ( random->RandomInt( 0, 5 ) != 1 ) return; Vector vecDustColor; vecDustColor.x = 0.35f; vecDustColor.y = 0.3f; vecDustColor.z = 0.25f; Vector color; int numRingSprites = 8; float yaw; Vector forward, vRight, vForward; vForward = Vector( 0, 1, 0 ); vRight = Vector( 1, 0, 0 ); float yawOfs = random->RandomFloat( 0, 359 ); for ( int i = 0; i < numRingSprites; i++ ) { yaw = ( (float) i / (float) numRingSprites ) * 360.0f; yaw += yawOfs; forward = ( vRight * sin( DEG2RAD( yaw) ) ) + ( vForward * cos( DEG2RAD( yaw ) ) ); VectorNormalize( forward ); trace_t tr; UTIL_TraceLine( GetRenderOrigin(), GetRenderOrigin()+(Vector(0, 0, -1024)), MASK_SOLID_BRUSHONLY, NULL, COLLISION_GROUP_NONE, &tr ); offset = ( RandomVector( -4.0f, 4.0f ) + tr.endpos ) + ( forward * 512.0f ); sParticle = (SimpleParticle *) m_pSimpleEmitter->AddParticle( sizeof(SimpleParticle), g_Mat_DustPuff[random->RandomInt(0,1)], offset ); if ( sParticle != NULL ) { sParticle->m_flLifetime = 0.0f; sParticle->m_flDieTime = random->RandomFloat( 0.25f, 0.5f ); sParticle->m_vecVelocity = forward * -random->RandomFloat( 1000, 1500 ); sParticle->m_vecVelocity[2] += 128.0f; #if __EXPLOSION_DEBUG debugoverlay->AddLineOverlay( m_vecOrigin, m_vecOrigin + sParticle->m_vecVelocity, 255, 0, 0, false, 3 ); #endif sParticle->m_uchColor[0] = vecDustColor.x * 255.0f; sParticle->m_uchColor[1] = vecDustColor.y * 255.0f; sParticle->m_uchColor[2] = vecDustColor.z * 255.0f; sParticle->m_uchStartSize = random->RandomInt( 32, 128 ); sParticle->m_uchEndSize = 200; sParticle->m_uchStartAlpha = random->RandomFloat( 16, 64 ); sParticle->m_uchEndAlpha = 0; sParticle->m_flRoll = random->RandomInt( 0, 360 ); sParticle->m_flRollDelta = random->RandomFloat( -16.0f, 16.0f ); } } } }
//----------------------------------------------------------------------------- // Purpose: // Input : percentage - //----------------------------------------------------------------------------- void C_AlyxEmpEffect::UpdateDischarging( void ) { // Emitters must be valid if ( SetupEmitters() == false ) return; // Reset our sort origin m_pSimpleEmitter->SetSortOrigin( GetAbsOrigin() ); float flScale = EMP_SCALE * 8.0f; Vector forward, right, up; AngleVectors( GetAbsAngles(), &forward, &right, &up ); SimpleParticle *sParticle; float dTime = gpGlobals->frametime; while ( m_tParticleSpawn.NextEvent( dTime ) ) { // Base of the core effect sParticle = (SimpleParticle *) m_pSimpleEmitter->AddParticle( sizeof(SimpleParticle), m_pSimpleEmitter->GetPMaterial( EMP_PARTICLES ), GetAbsOrigin() ); if ( sParticle == NULL ) return; sParticle->m_vecVelocity = vec3_origin; sParticle->m_flDieTime = 0.25f; sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = 0.0f; float alpha = 64; sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; sParticle->m_uchStartSize = flScale * 4.0f; sParticle->m_uchEndSize = 0.0f; // Base of the core effect sParticle = (SimpleParticle *) m_pSimpleEmitter->AddParticle( sizeof(SimpleParticle), m_pSimpleEmitter->GetPMaterial( EMP_PARTICLES ), GetAbsOrigin() ); if ( sParticle == NULL ) return; sParticle->m_vecVelocity = vec3_origin; sParticle->m_flDieTime = 0.1f; sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = 0.0f; alpha = 128; sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; sParticle->m_uchStartSize = 0.0f; sParticle->m_uchEndSize = flScale * 2.0f; // Make sure we encompass the complete particle here! m_pSimpleEmitter->SetParticleCullRadius( sParticle->m_uchEndSize ); // Do the core effects sParticle = (SimpleParticle *) m_pSimpleEmitter->AddParticle( sizeof(SimpleParticle), m_pSimpleEmitter->GetPMaterial( EMP_PARTICLES ), GetAbsOrigin() ); if ( sParticle == NULL ) return; sParticle->m_vecVelocity = RandomVector( -32.0f, 32.0f ); sParticle->m_flDieTime = 0.2f; sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = 0.0f; alpha = 255; sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; sParticle->m_uchStartSize = flScale; sParticle->m_uchEndSize = 0.0f; } #if 0 // Do the charging particles m_pAttractorEmitter->SetAttractorOrigin( GetAbsOrigin() ); Vector offset; float dist; for ( i = 0; i < 4; i++ ) { dist = random->RandomFloat( 4.0f, 64.0f ); offset = forward * dist; dist = RemapValClamped( dist, 4.0f, 64.0f, 6.0f, 1.0f ); offset += right * random->RandomFloat( -2.0f * dist, 2.0f * dist ); offset += up * random->RandomFloat( -2.0f * dist, 2.0f * dist ); offset += GetAbsOrigin(); sParticle = (SimpleParticle *) m_pAttractorEmitter->AddParticle( sizeof(SimpleParticle), m_pAttractorEmitter->GetPMaterial( "effects/combinemuzzle2_dark" ), offset ); if ( sParticle == NULL ) return; sParticle->m_vecVelocity = Vector(0,0,2); sParticle->m_flDieTime = 0.5f; sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = 0.0f; float alpha = 255; sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; sParticle->m_uchStartSize = 1; sParticle->m_uchEndSize = 0; } #endif }
//----------------------------------------------------------------------------- // Purpose: // Input : percentage - //----------------------------------------------------------------------------- void C_AlyxEmpEffect::UpdateCharging( float percentage ) { // Emitters must be valid if ( SetupEmitters() == false ) return; if ( percentage <= 0.0f ) return; // Reset our sort origin m_pSimpleEmitter->SetSortOrigin( GetAbsOrigin() ); float flScale = 4.0f * EMP_SCALE * percentage; SimpleParticle *sParticle; float dTime = gpGlobals->frametime; while ( m_tParticleSpawn.NextEvent( dTime ) ) { // Do the core effects sParticle = (SimpleParticle *) m_pSimpleEmitter->AddParticle( sizeof(SimpleParticle), m_pSimpleEmitter->GetPMaterial( EMP_PARTICLES ), GetAbsOrigin() ); if ( sParticle == NULL ) return; sParticle->m_vecVelocity = vec3_origin; sParticle->m_flDieTime = 0.1f; sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = 0.0f; float alpha = 255 * percentage; sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; sParticle->m_uchStartSize = flScale; sParticle->m_uchEndSize = sParticle->m_uchStartSize * 2.0f; } #if 0 // Do the charging particles m_pAttractorEmitter->SetAttractorOrigin( GetAbsOrigin() ); Vector forward, right, up; AngleVectors( GetAbsAngles(), &forward, &right, &up ); Vector offset; float dist; int numParticles = floor( 4.0f * percentage ); for ( i = 0; i < numParticles; i++ ) { dist = random->RandomFloat( 4.0f * percentage, 64.0f * percentage ); offset = forward * dist; dist = RemapValClamped( dist, 4.0f * percentage, 64.0f * percentage, 6.0f, 1.0f ); offset += right * random->RandomFloat( -4.0f * dist, 4.0f * dist ); offset += up * random->RandomFloat( -4.0f * dist, 4.0f * dist ); offset += GetAbsOrigin(); sParticle = (SimpleParticle *) m_pAttractorEmitter->AddParticle( sizeof(SimpleParticle), m_pAttractorEmitter->GetPMaterial( EMP_PARTICLES ), offset ); if ( sParticle == NULL ) return; sParticle->m_vecVelocity = Vector(0,0,8); sParticle->m_flDieTime = 0.5f; sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = 0.0f; float alpha = 255 * percentage; sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; sParticle->m_uchStartSize = random->RandomFloat( 1, 2 ); sParticle->m_uchEndSize = 0; } #endif }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void C_FireSmoke::Start( void ) { bool bTools = CommandLine()->CheckParm( "-tools" ) != NULL; // Setup the render handles for stuff we want in the client leaf list. int i; for ( i = 0; i < NUM_CHILD_FLAMES; i++ ) { if ( bTools ) { ClientEntityList().AddNonNetworkableEntity( &m_entFlames[i] ); } m_entFlames[i].AddToLeafSystem( RENDER_GROUP_TRANSLUCENT_ENTITY ); } if ( m_nFlags & bitsFIRESMOKE_VISIBLE_FROM_ABOVE ) { for ( int i = 0; i < NUM_CHILD_FLAMES; i++ ) { if ( bTools ) { ClientEntityList().AddNonNetworkableEntity( &m_entFlamesFromAbove[i] ); } m_entFlamesFromAbove[i].AddToLeafSystem( RENDER_GROUP_TRANSLUCENT_ENTITY ); } } //Various setup info m_tParticleSpawn.Init( 2.0f ); QAngle offset; model_t *pModel; int maxFrames; //Setup the child flames for ( i = 0; i < NUM_CHILD_FLAMES; i++ ) { //Setup our offset angles offset[0] = 0.0f; offset[1] = Helper_RandomFloat( 0, 360 ); offset[2] = 0.0f; AngleVectors( offset, &m_entFlames[i].m_vecMoveDir ); m_entFlames[i].m_bFadeFromAbove = ( m_nFlags & bitsFIRESMOKE_VISIBLE_FROM_ABOVE ); pModel = (model_t *) modelinfo->GetModel( m_nFlameModelIndex ); maxFrames = modelinfo->GetModelFrameCount( pModel ); //Setup all the information for the client entity m_entFlames[i].SetModelByIndex( m_nFlameModelIndex ); m_entFlames[i].SetLocalOrigin( GetLocalOrigin() ); m_entFlames[i].m_flFrame = Helper_RandomInt( 0.0f, maxFrames - 1 ); m_entFlames[i].m_flSpriteFramerate = Helper_RandomInt( 15, 30 ); m_entFlames[i].SetScale( m_flStartScale ); m_entFlames[i].SetRenderMode( kRenderTransAddFrameBlend ); m_entFlames[i].m_nRenderFX = kRenderFxNone; m_entFlames[i].SetRenderColor( 255, 255, 255, 255 ); m_entFlames[i].SetBrightness( 255 ); m_entFlames[i].AddEffects( EF_NORECEIVESHADOW | EF_NOSHADOW ); m_entFlames[i].index = -1; if ( i == 0 ) { m_entFlameScales[i] = 1.0f; } else { //Keep a scale offset m_entFlameScales[i] = random->RandomFloat( 0.5f, 1.0f ); } } if ( m_nFlags & bitsFIRESMOKE_VISIBLE_FROM_ABOVE ) { for ( int i = 0; i < NUM_CHILD_FLAMES; i++ ) { pModel = (model_t *) modelinfo->GetModel( m_nFlameFromAboveModelIndex ); maxFrames = modelinfo->GetModelFrameCount( pModel ); //Setup all the information for the client entity m_entFlamesFromAbove[i].SetModelByIndex( m_nFlameFromAboveModelIndex ); m_entFlamesFromAbove[i].SetLocalOrigin( GetLocalOrigin() ); m_entFlamesFromAbove[i].m_flFrame = Helper_RandomInt( 0.0f, maxFrames - 1 ); m_entFlamesFromAbove[i].m_flSpriteFramerate = Helper_RandomInt( 15, 30 ); m_entFlamesFromAbove[i].SetScale( m_flStartScale ); m_entFlamesFromAbove[i].SetRenderMode( kRenderTransAddFrameBlend ); m_entFlamesFromAbove[i].m_nRenderFX = kRenderFxNone; m_entFlamesFromAbove[i].SetRenderColor( 255, 255, 255, 255 ); m_entFlamesFromAbove[i].SetBrightness( 255 ); m_entFlamesFromAbove[i].AddEffects( EF_NORECEIVESHADOW | EF_NOSHADOW ); m_entFlamesFromAbove[i].index = -1; if ( i == 0 ) { m_entFlameScales[i] = 1.0f; } else { //Keep a scale offset m_entFlameScales[i] = random->RandomFloat( 0.5f, 1.0f ); } } } // Start up the smoke if ( m_nFlags & bitsFIRESMOKE_SMOKE ) { //m_pEmberEmitter = CEmberEffect::Create( "C_FireSmoke::m_pEmberEmitter" ); m_pSmokeEmitter = CLitSmokeEmitter::Create( "C_FireSmoke::m_pSmokeEmitter" ); m_pSmokeEmitter->Init( "particle/SmokeStack", GetAbsOrigin() ); } //Only make the glow if we've requested it if ( m_nFlags & bitsFIRESMOKE_GLOW ) { #if 0 //Create the fire overlay if ( m_pFireOverlay = new CFireOverlay( this ) ) { m_pFireOverlay->m_vPos = GetAbsOrigin(); m_pFireOverlay->m_nSprites = 1; m_pFireOverlay->m_vBaseColors[0].Init( 0.4f, 0.2f, 0.05f ); m_pFireOverlay->Activate(); } #endif } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void C_FireSmoke::AddFlames( void ) { #if PARTICLE_FIRE if ( ( gpGlobals->frametime != 0.0f ) && ( m_flScaleRegister > 0.0f ) ) { Vector offset; float scalar; scalar = 32.0f*m_flScaleRegister; offset[0] = Helper_RandomFloat( -scalar, scalar ); offset[1] = Helper_RandomFloat( -scalar, scalar ); offset[2] = 0.0f; CSmartPtr<CSimpleEmitter> pEmitter = CSimpleEmitter::Create( "C_FireSmoke" ); pEmitter->SetSortOrigin( GetAbsOrigin()+offset ); SimpleParticle *sParticle; //for ( int i = 0; i < 1; i++ ) { scalar = 32.0f*m_flScaleRegister; offset[0] = Helper_RandomFloat( -scalar, scalar ); offset[1] = Helper_RandomFloat( -scalar, scalar ); offset[2] = 12.0f*m_flScaleRegister; sParticle = (SimpleParticle *) pEmitter->AddParticle( sizeof(SimpleParticle), pEmitter->GetPMaterial( VarArgs("sprites/flamelet%d", Helper_RandomInt( 1, 5 ) ) ), GetAbsOrigin()+offset ); if ( sParticle ) { sParticle->m_flLifetime = 0.0f; sParticle->m_flDieTime = 0.25f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = Helper_RandomFloat( -4.0f, 4.0f ); float alpha = Helper_RandomInt( 128, 255 ); sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = 255; sParticle->m_uchEndAlpha = 0; sParticle->m_uchStartSize = 64.0f*m_flScaleRegister; sParticle->m_uchEndSize = 0; float speedScale = ((GetAbsOrigin()+offset)-GetAbsOrigin()).Length2D() / (32.0f*m_flScaleRegister); sParticle->m_vecVelocity = Vector( Helper_RandomFloat( -32.0f, 32.0f ), Helper_RandomFloat( -32.0f, 32.0f ), Helper_RandomFloat( 32.0f, 128.0f )*speedScale ); } } pEmitter->Release(); } #endif //#if !PARTICLE_FIRE float alpha = 1.0f; //Update the child flame alpha for ( int i = 0; i < NUM_CHILD_FLAMES; i++ ) { if ( m_entFlames[i].GetScale() > 1e-3f ) { m_entFlames[i].SetRenderColor( ( 255.0f * alpha ), ( 255.0f * alpha ), ( 255.0f * alpha ) ); m_entFlames[i].SetBrightness( 255.0f * alpha ); Assert( m_entFlames[i].GetRenderHandle() != INVALID_CLIENT_RENDER_HANDLE ); m_entFlames[i].AddToLeafSystem(); } } if ( m_nFlags & bitsFIRESMOKE_VISIBLE_FROM_ABOVE ) { for ( int i = 0; i < NUM_CHILD_FLAMES; i++ ) { if ( m_entFlamesFromAbove[i].GetScale() > 1e-3f ) { m_entFlamesFromAbove[i].SetRenderColor( ( 255.0f * alpha ), ( 255.0f * alpha ), ( 255.0f * alpha ) ); m_entFlamesFromAbove[i].SetBrightness( 255.0f * alpha ); Assert( m_entFlamesFromAbove[i].GetRenderHandle() != INVALID_CLIENT_RENDER_HANDLE ); m_entFlamesFromAbove[i].AddToLeafSystem(); } } } //#endif }
void FX_EnergySplash(const Vector &pos, const Vector &normal, int nFlags) { VPROF_BUDGET("FX_EnergySplash", VPROF_BUDGETGROUP_PARTICLE_RENDERING); Vector offset = pos + (normal * 2.0f); // Quick flash FX_AddQuad(pos, normal, 64.0f, 0, 0.75f, 1.0f, 0.0f, 0.4f, random->RandomInt(0, 360), 0, Vector(1.0f, 1.0f, 1.0f), 0.25f, "effects/combinemuzzle1_nocull", (FXQUAD_BIAS_SCALE | FXQUAD_BIAS_ALPHA)); // Lingering burn FX_AddQuad(pos, normal, 16, 32, 0.75f, 1.0f, 0.0f, 0.4f, random->RandomInt(0, 360), 0, Vector(1.0f, 1.0f, 1.0f), 0.5f, "effects/combinemuzzle2_nocull", (FXQUAD_BIAS_SCALE | FXQUAD_BIAS_ALPHA)); SimpleParticle *sParticle; CSmartPtr<CSimpleEmitter> pEmitter; pEmitter = CSimpleEmitter::Create("C_EntityDissolve"); pEmitter->SetSortOrigin(pos); if (g_Material_Spark == NULL) { g_Material_Spark = pEmitter->GetPMaterial("effects/spark"); } // Anime ground effects for (int j = 0; j < 8; j++) { offset.x = random->RandomFloat(-8.0f, 8.0f); offset.y = random->RandomFloat(-8.0f, 8.0f); offset.z = random->RandomFloat(0.0f, 4.0f); offset += pos; sParticle = (SimpleParticle *) pEmitter->AddParticle(sizeof(SimpleParticle), g_Material_Spark, offset); if (sParticle == NULL) return; sParticle->m_vecVelocity = Vector(Helper_RandomFloat(-4.0f, 4.0f), Helper_RandomFloat(-4.0f, 4.0f), Helper_RandomFloat(16.0f, 64.0f)); sParticle->m_uchStartSize = random->RandomFloat(2, 4); sParticle->m_flDieTime = random->RandomFloat(0.4f, 0.6f); sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt(0, 360); float alpha = 255; sParticle->m_flRollDelta = Helper_RandomFloat(-4.0f, 4.0f); sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; sParticle->m_uchEndSize = 0; } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void C_FireSmoke::Start( void ) { // Setup the render handles for stuff we want in the client leaf list. int i; for ( i = 0; i < NUM_CHILD_FLAMES; i++ ) { m_entFlames[i].SetupEntityRenderHandle( RENDER_GROUP_TRANSLUCENT_ENTITY ); } //Various setup info m_tParticleSpawn.Init( 10.0f ); QAngle offset; model_t *pModel; int maxFrames; //Setup the child flames for ( i = 0; i < NUM_CHILD_FLAMES; i++ ) { //Setup our offset angles offset[0] = 0.0f; offset[1] = Helper_RandomFloat( 0, 360 ); offset[2] = 0.0f; AngleVectors( offset, &m_entFlames[i].m_vecMoveDir ); pModel = (model_t *) modelinfo->GetModel( m_nFlameModelIndex ); maxFrames = modelinfo->GetModelFrameCount( pModel ); //Setup all the information for the client entity m_entFlames[i].SetModelByIndex( m_nFlameModelIndex ); m_entFlames[i].SetLocalOrigin( GetLocalOrigin() ); m_entFlames[i].m_flFrame = Helper_RandomInt( 0.0f, maxFrames - 1 ); m_entFlames[i].m_flSpriteFramerate = Helper_RandomInt( 24, 30 ); m_entFlames[i].SetScale( m_flStartScale ); m_entFlames[i].m_nRenderMode = kRenderTransAdd; m_entFlames[i].m_nRenderFX = kRenderFxNone; m_entFlames[i].SetRenderColor( 255, 255, 255, 255 ); m_entFlames[i].SetBrightness( 255 ); m_entFlames[i].index = -1; if ( i == 0 ) { m_entFlameScales[i] = 1.0f; } else { //Keep a scale offset m_entFlameScales[i] = 1.0f - ( ( (float) i / (float) NUM_CHILD_FLAMES ) ); } } //Only make the glow if we've requested it if ( m_nFlags & bitsFIRESMOKE_GLOW ) { //Create the fire overlay if ( m_pFireOverlay = new CFireOverlay( this ) ) { m_pFireOverlay->m_vPos = GetAbsOrigin(); m_pFireOverlay->m_nSprites = 1; m_pFireOverlay->m_vBaseColors[0].Init( 0.4f, 0.2f, 0.05f ); m_pFireOverlay->Activate(); } } }
//----------------------------------------------------------------------------- // Purpose: // Input : percentage - //----------------------------------------------------------------------------- void C_CitadelEnergyCore::UpdateDischarging( void ) { // Emitters must be valid if ( SetupEmitters() == false ) return; // Reset our sort origin m_pSimpleEmitter->SetSortOrigin( GetAbsOrigin() ); float flScale = 8.0f * m_flScale; Vector forward, right, up; AngleVectors( GetAbsAngles(), &forward, &right, &up ); SimpleParticle *sParticle; // Base of the core effect sParticle = (SimpleParticle *) m_pSimpleEmitter->AddParticle( sizeof(SimpleParticle), m_pSimpleEmitter->GetPMaterial( "effects/strider_muzzle" ), GetAbsOrigin() ); if ( sParticle == NULL ) return; sParticle->m_vecVelocity = forward * 32.0f; sParticle->m_flDieTime = 0.2f; sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = 0.0f; float alpha = 128; sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; sParticle->m_uchStartSize = flScale * 2.0f; sParticle->m_uchEndSize = sParticle->m_uchStartSize * 2.0f; // Make sure we encompass the complete particle here! m_pSimpleEmitter->SetParticleCullRadius( sParticle->m_uchEndSize ); // Do the core effects for ( int i = 0; i < 2; i++ ) { sParticle = (SimpleParticle *) m_pSimpleEmitter->AddParticle( sizeof(SimpleParticle), m_pSimpleEmitter->GetPMaterial( "effects/combinemuzzle2" ), GetAbsOrigin() ); if ( sParticle == NULL ) return; sParticle->m_vecVelocity = forward * ( 32.0f * (i+1) ); sParticle->m_flDieTime = 0.2f; sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = 0.0f; float alpha = 100; sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; if ( i < 1 ) { sParticle->m_uchStartSize = flScale * (i+1); sParticle->m_uchEndSize = sParticle->m_uchStartSize * 2.0f; } else { if ( random->RandomInt( 0, 20 ) == 0 ) { sParticle->m_uchStartSize = flScale * (i+1); sParticle->m_uchEndSize = 0.0f; sParticle->m_flDieTime = 0.25f; } else { sParticle->m_uchStartSize = flScale * (i+1); sParticle->m_uchEndSize = 0.0f; } } } // Only do these particles if required if ( m_spawnflags & SF_ENERGYCORE_NO_PARTICLES ) return; // Do the charging particles m_pAttractorEmitter->SetAttractorOrigin( GetAbsOrigin() ); Vector offset; float dist; for ( int i = 0; i < 4; i++ ) { dist = random->RandomFloat( 4.0f * m_flScale, 64.0f * m_flScale ); offset = forward * dist; dist = RemapValClamped( dist, 4.0f * m_flScale, 64.0f * m_flScale, 6.0f, 1.0f ); offset += right * random->RandomFloat( -2.0f * dist * m_flScale, 2.0f * dist * m_flScale ); offset += up * random->RandomFloat( -2.0f * dist * m_flScale, 2.0f * dist * m_flScale ); offset += GetAbsOrigin(); sParticle = (SimpleParticle *) m_pAttractorEmitter->AddParticle( sizeof(SimpleParticle), m_pAttractorEmitter->GetPMaterial( "effects/combinemuzzle2_dark" ), offset ); if ( sParticle == NULL ) return; sParticle->m_vecVelocity = Vector(0,0,2); sParticle->m_flDieTime = 0.5f; sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = 0.0f; float alpha = 255; sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; sParticle->m_uchStartSize = 1; sParticle->m_uchEndSize = 0; } }
//----------------------------------------------------------------------------- // Purpose: // Input : percentage - //----------------------------------------------------------------------------- void C_CitadelEnergyCore::UpdateCharging( float percentage ) { // Emitters must be valid if ( SetupEmitters() == false ) return; if ( percentage <= 0.0f ) return; // Reset our sort origin m_pSimpleEmitter->SetSortOrigin( GetAbsOrigin() ); float flScale = 4.0f * m_flScale * percentage; SimpleParticle *sParticle; // Do the core effects for ( int i = 0; i < 2; i++ ) { sParticle = (SimpleParticle *) m_pSimpleEmitter->AddParticle( sizeof(SimpleParticle), m_pSimpleEmitter->GetPMaterial( "effects/strider_muzzle" ), GetAbsOrigin() ); if ( sParticle == NULL ) return; sParticle->m_vecVelocity = vec3_origin; sParticle->m_flDieTime = 0.1f; sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = 0.0f; float alpha = 255; sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; if ( i < 2 ) { sParticle->m_uchStartSize = flScale * (i+1); sParticle->m_uchEndSize = sParticle->m_uchStartSize * 2.0f; } else { if ( random->RandomInt( 0, 20 ) == 0 ) { sParticle->m_uchStartSize = flScale * (i+1); sParticle->m_uchEndSize = sParticle->m_uchStartSize * 4.0f; sParticle->m_flDieTime = 0.25f; } else { sParticle->m_uchStartSize = flScale * (i+1); sParticle->m_uchEndSize = sParticle->m_uchStartSize * 2.0f; } } } // Only do these particles if required if ( m_spawnflags & SF_ENERGYCORE_NO_PARTICLES ) return; // Do the charging particles m_pAttractorEmitter->SetAttractorOrigin( GetAbsOrigin() ); Vector forward, right, up; AngleVectors( GetAbsAngles(), &forward, &right, &up ); Vector offset; float dist; int numParticles = floor( 4.0f * percentage ); for ( int i = 0; i < numParticles; i++ ) { dist = random->RandomFloat( 4.0f * percentage, 64.0f * percentage ); offset = forward * dist; dist = RemapValClamped( dist, 4.0f * percentage, 64.0f * percentage, 6.0f, 1.0f ); offset += right * random->RandomFloat( -4.0f * dist, 4.0f * dist ); offset += up * random->RandomFloat( -4.0f * dist, 4.0f * dist ); offset += GetAbsOrigin(); sParticle = (SimpleParticle *) m_pAttractorEmitter->AddParticle( sizeof(SimpleParticle), m_pAttractorEmitter->GetPMaterial( "effects/strider_muzzle" ), offset ); if ( sParticle == NULL ) return; sParticle->m_vecVelocity = Vector(0,0,8); sParticle->m_flDieTime = 0.5f; sParticle->m_flLifetime = 0.0f; sParticle->m_flRoll = Helper_RandomInt( 0, 360 ); sParticle->m_flRollDelta = 0.0f; float alpha = 255 * percentage; sParticle->m_uchColor[0] = alpha; sParticle->m_uchColor[1] = alpha; sParticle->m_uchColor[2] = alpha; sParticle->m_uchStartAlpha = alpha; sParticle->m_uchEndAlpha = 0; sParticle->m_uchStartSize = random->RandomFloat( 1, 2 ); sParticle->m_uchEndSize = 0; } }