//----------------------------------------------------------------------------- // Purpose: Starts the effect // Input : *pParticleMgr - // *pArgs - //----------------------------------------------------------------------------- void C_SmokeStack::Start(CParticleMgr *pParticleMgr, IPrototypeArgAccess *pArgs) { pParticleMgr->AddEffect( &m_ParticleEffect, this ); // Figure out the material name. char str[512] = "unset_material"; const model_t *pModel = modelinfo->GetModel( m_iMaterialModel ); if ( pModel ) { Q_strncpy( str, modelinfo->GetModelName( pModel ), sizeof( str ) ); // Get rid of the extension because the material system doesn't want it. char *pExt = Q_stristr( str, ".vmt" ); if ( pExt ) pExt[0] = 0; } m_MaterialHandle[0] = m_ParticleEffect.FindOrAddMaterial( str ); int iCount = 1; char szNames[512]; int iLength = Q_strlen( str ); str[iLength-1] = '\0'; Q_snprintf( szNames, sizeof( szNames ), "%s%d.vmt", str, iCount ); while ( filesystem->FileExists( VarArgs( "materials/%s", szNames ) ) && iCount < SMOKESTACK_MAX_MATERIALS ) { char *pExt = Q_stristr( szNames, ".vmt" ); if ( pExt ) pExt[0] = 0; m_MaterialHandle[iCount] = m_ParticleEffect.FindOrAddMaterial( szNames ); iCount++; } m_iMaxFrames = iCount-1; m_ParticleSpawn.Init( mat_reduceparticles.GetBool() ? m_Rate / 4 : m_Rate ); // Obey mat_reduceparticles in episodic m_InvLifetime = m_Speed / m_JetLength; m_pParticleMgr = pParticleMgr; // Figure out how we need to draw. IMaterial *pMaterial = pParticleMgr->PMaterialToIMaterial( m_MaterialHandle[0] ); if( pMaterial ) { m_Renderer.Init( pParticleMgr, pMaterial ); } QueueLightParametersInRenderer(); // For the first N seconds, always simulate so it can build up the smokestack. // Afterwards, we set it to freeze when it's not being rendered. m_ParticleEffect.SetAlwaysSimulate( true ); SetNextClientThink( gpGlobals->curtime + 5 ); }
//----------------------------------------------------------------------------- // Purpose: // Input : fTimeDelta - //----------------------------------------------------------------------------- void C_SmokeStack::Update(float fTimeDelta) { if (!m_pParticleMgr) { assert(false); return; } // Don't spawn particles unless we're visible. if (m_bEmit && (m_ParticleEffect.WasDrawnPrevFrame() || m_ParticleEffect.GetAlwaysSimulate())) { // Add new particles. Vector forward, right, up; AngleVectors(GetAbsAngles(), &forward, &right, &up); float tempDelta = fTimeDelta; while (m_ParticleSpawn.NextEvent(tempDelta)) { int iRandomFrame = random->RandomInt(0, m_iMaxFrames); iRandomFrame = 0; // Make a new particle. if (SmokeStackParticle *pParticle = (SmokeStackParticle*) m_ParticleEffect.AddParticle(sizeof(SmokeStackParticle), m_MaterialHandle[iRandomFrame])) { float angle = FRand(0, 2.0f*M_PI_F); pParticle->m_Pos = GetAbsOrigin() + right * (cos(angle) * m_flBaseSpread) + forward * (sin(angle) * m_flBaseSpread); pParticle->m_Velocity = FRand(-m_SpreadSpeed, m_SpreadSpeed) * right + FRand(-m_SpreadSpeed, m_SpreadSpeed) * forward + m_Speed * up; pParticle->m_vAccel = m_vWind; pParticle->m_Lifetime = 0; pParticle->m_flAngle = 0.0f; pParticle->m_flRollDelta = random->RandomFloat(-m_flRollSpeed, m_flRollSpeed); pParticle->m_flSortPos = pParticle->m_Pos.z; } } } // Setup the twist matrix. float flTwist = (m_flTwist * (M_PI_F * 2.f) / 360.0f) * Helper_GetFrameTime(); if ((m_bTwist = !!flTwist)) { m_TwistMat[0][0] = cos(flTwist); m_TwistMat[0][1] = sin(flTwist); m_TwistMat[1][0] = -sin(flTwist); m_TwistMat[1][1] = cos(flTwist); } QueueLightParametersInRenderer(); }
//----------------------------------------------------------------------------- // Purpose: Starts the effect // Input : *pParticleMgr - // *pArgs - //----------------------------------------------------------------------------- void C_SmokeStack::Start(CParticleMgr *pParticleMgr, IPrototypeArgAccess *pArgs) { pParticleMgr->AddEffect(&m_ParticleEffect, this); // Figure out the material name. char str[512] = "unset_material"; const model_t *pModel = modelinfo->GetModel(m_iMaterialModel); if (pModel) { Q_strncpy(str, modelinfo->GetModelName(pModel), sizeof(str)); // Get rid of the extension because the material system doesn't want it. char *pExt = Q_stristr(str, ".vmt"); if (pExt) pExt[0] = 0; } m_MaterialHandle[0] = m_ParticleEffect.FindOrAddMaterial(str); m_ParticleSpawn.Init( m_Rate ); m_InvLifetime = m_Speed / m_JetLength; m_pParticleMgr = pParticleMgr; // Figure out how we need to draw. IMaterial *pMaterial = pParticleMgr->PMaterialToIMaterial( m_MaterialHandle[0] ); if( pMaterial ) { m_Renderer.Init( pParticleMgr, pMaterial ); } QueueLightParametersInRenderer(); // For the first N seconds, always simulate so it can build up the smokestack. // Afterwards, we set it to freeze when it's not being rendered. m_ParticleEffect.SetAlwaysSimulate( true ); SetNextClientThink( gpGlobals->curtime + 5 ); }