Exemple #1
0
// |----------------------------------------------------------------------------|
// |							     Logic()									|
// |----------------------------------------------------------------------------|
bool ParticleSystem::Logic() {
    DebugLog ("ParticleSystem: Logic() called.", DB_LOGIC, 10);

    // Increment the frame time.
    float time = TimerManager::GetRef()->GetTime() / 1000;
    m_accumulatedTime += time;

    // Set emit particle to false for now.
    bool emitParticle = false;

    // Check if it is time to emit a new particle or not.
    if(m_accumulatedTime > (m_particleSpawnFrequency))
    {
        m_accumulatedTime = 0.0f;
        emitParticle = true;
    }

    if(m_spawnParticles && (emitParticle == true) && (m_particles.size() < (m_maxParticles - 1)))
    {
        // Emit new particles.
        EmitParticle();
    }

    // Update the position of the particles.
    UpdateParticles();

    // Release old particles.
    KillParticles();

    return true;
}
Exemple #2
0
//--------------------------------------------------------------------------------------
// Create a VB for particles
//--------------------------------------------------------------------------------------
void SoftParticles::AdvanceParticles(double fTime, float fTimeDelta )
{
	//emit new particles
	static double fLastEmitTime = 0;
	static UINT iLastParticleEmitted = 0;

	if( !g_bAnimateParticles )
	{
		fLastEmitTime = fTime;
		return;
	}

	float fEmitRate = g_fEmitRate;
	float fParticleMaxSize = g_fParticleMaxSize;
	float fParticleMinSize = g_fParticleMinSize;

	if( PT_VOLUME_HARD == g_ParticleTechnique ||
		PT_VOLUME_SOFT == g_ParticleTechnique )
	{
		fEmitRate *= 3.0f;	//emit 1/3 less particles if we're doing volume
		fParticleMaxSize *= 1.5f;	//1.5x the max radius
		fParticleMinSize *= 1.5f;	//1.5x the min radius
	}

	UINT NumParticlesToEmit = (UINT)( (fTime - fLastEmitTime)/fEmitRate );
	if( NumParticlesToEmit > 0 )
	{
		for( UINT i=0; i<NumParticlesToEmit; i++ )
		{
			EmitParticle( &g_pCPUParticles[iLastParticleEmitted] );
			iLastParticleEmitted = (iLastParticleEmitted+1) % MAX_PARTICLES;
		}
		fLastEmitTime = fTime;
	}

	D3DXVECTOR3 vel;
	float lifeSq = 0;
	for( UINT i=0; i<MAX_PARTICLES; i++ )
	{
		if( g_pCPUParticles[i].Life > -1 )
		{
			// squared velocity falloff
			lifeSq = g_pCPUParticles[i].Life*g_pCPUParticles[i].Life;

			// Slow down by 50% as we age
			vel = g_pCPUParticles[i].Vel * (1 - 0.5f*lifeSq);
			vel.y += 0.5f;	//(add some to the up direction, becuase of buoyancy)

			g_pCPUParticles[i].Pos += vel*fTimeDelta;
			g_pCPUParticles[i].Life += fTimeDelta/g_fParticleLifeSpan;
			g_pCPUParticles[i].Size = fParticleMinSize + (fParticleMaxSize-fParticleMinSize) * g_pCPUParticles[i].Life;

			if( g_pCPUParticles[i].Life > 0.99f )
				g_pCPUParticles[i].Life = -1;
		}
	}
}
void MovingTile::OnTopCollision(Entity* collider, sf::FloatRect intersection)
{
    SpecialTile::OnTopCollision(collider, intersection);

    EmitParticle(sf::milliseconds(500), false);
    if (collider->IsUnit())
        collider->ToUnit()->Vehicle = this;

    Passengers.insert(collider);
}
Exemple #4
0
// |----------------------------------------------------------------------------|
// |					     EmitAllParticles()									|
// |----------------------------------------------------------------------------|
void ParticleSystem::EmitAllParticles() {
    DebugLog ("ParticleSystem: EmitAllParticles() called.", DB_LOGIC, 10);

    while(m_particles.size() < m_maxParticles)
    {
        // Emit new particles.
        EmitParticle();
    }

    return;
}
	void ParticleEmitterInstance::UpdateEmitter(float aDeltaTime, const CU::Matrix44f& aWorldMatrix)
	{
		myEmissionTime -= aDeltaTime;
		myEmitterLife -= aDeltaTime;

		UpdateParticle(aDeltaTime);

		if (myEmissionTime <= 0.f && (myEmitterLife > 0.f || myParticleEmitterData->myUseEmitterLifeTime == false)
			&& myShouldLive == true)
		{
			EmitParticle(aWorldMatrix);

			myEmissionTime = myParticleEmitterData->myEmissionRate * 8.f;
			if (myIsCloseToPlayer == false)
				myEmissionTime = myParticleEmitterData->myEmissionRate;
		}
		
		if (myEmitterLife <= 0.f && myDeadParticleCount == myLogicalParticles.Size())
		{
			myIsActive = false;
		}

	}
Exemple #6
0
void UpdBls()
{
#if 0
	static float completion = 2.0f;

	if(completion+EPSILON >= 1 && completion-EPSILON <= 1)
		Explode(&g_building[1]);

#if 1
	//StageCopyVA(&g_building[0].drawva, &g_model[g_bltype[g_building[0].type].model].m_va[0], completion);
	HeightCopyVA(&g_building[1].drawva, &g_model[g_bltype[g_building[1].type].model].m_va[0], Clipf(completion, 0, 1));

	completion -= 0.01f;

	if(completion < -1.0f)
		completion = 2.0f;
#elif 1
	HeightCopyVA(&g_building[0].drawva, &g_model[g_bltype[g_building[0].type].model].m_va[0], completion);

	completion *= 0.95f;

	if(completion < 0.001f)
		completion = 1.0f;
#endif
#elif 0
	static float completion = 2.0f;

	StageCopyVA(&g_building[0].drawva, &g_model[g_bltype[g_building[0].type].cmodel].m_va[0], completion);

	completion += 0.005f;

	if(completion < 2.0f && completion >= 1.0f)
	{
		g_building[0].finished = true;
		CopyVA(&g_building[0].drawva, &g_model[g_bltype[g_building[0].type].model].m_va[0]);
	}
	if(completion >= 2.0f)
	{
		completion = 0.1f;
		g_building[0].finished = false;
	}
#endif

	for(int i=0; i<BUILDINGS; i++)
	{
		Building* b = &g_building[i];

		if(!b->on)
			continue;

		BuildingT* t = &g_bltype[b->type];
		EmitterPlace* ep;
		ParticleT* pt;

		if(!b->finished)
			continue;

		for(int j=0; j<MAX_B_EMITTERS; j++)
		{
			//first = true;

			//if(completion < 1)
			//	continue;

			ep = &t->emitterpl[j];

			if(!ep->on)
				continue;

			pt = &g_particleT[ep->type];

			if(b->emitterco[j].EmitNext(pt->delay))
				EmitParticle(ep->type, b->drawpos + ep->offset);
		}
	}
}
void SceneObject_ParticleEmitter_Sprite::Logic()
{
	// ----------------------- Spawning -----------------------

	if(m_emit)
	{
		m_spawnTimer += GetScene()->m_frameTimer.GetTimeMultiplier();

		if(m_spawnTimer > m_spawnTime)
		{
			// Spawn multiple per frame, if went over more than one multiple of the spawn time
			int numSpawn = static_cast<int>(m_spawnTimer / m_spawnTime);

			// Spawn particles
			for(int i = 0; i < numSpawn; i++)
				m_pParticles.push_back(EmitParticle());

			// Reset timer, keep overflow (fmodf equivalent)
			m_spawnTimer -= numSpawn * m_spawnTime;

			// Pick new random spawn time
			m_spawnTime = Randf(m_minSpawnTime, m_maxSpawnTime);
		}
	}

	// ----------------------- Updating -----------------------

	if(m_pParticles.empty())
	{
		if(m_autoDestruct)
			Destroy();
	}
	else
	{
		// Recalculate AABB while at it
		m_aabb.m_lowerBound = m_pParticles.front()->m_position;
		m_aabb.m_upperBound = m_aabb.m_lowerBound;

		for(std::list<Particle_Sprite*>::iterator it = m_pParticles.begin(); it != m_pParticles.end();)
		{
			Particle_Sprite* pParticle = *it;

			if(pParticle->Logic())
			{
				// Destroy particle
				delete pParticle;

				it = m_pParticles.erase(it);
			}
			else
			{
				// Affect particle
				for(unsigned int i = 0, size = m_pAffectorFuncs.size(); i < size; i++)
					m_pAffectorFuncs[i](pParticle);

				// Grow AABB
				float radius = pParticle->GetRadius();

				Vec3f particleLower(pParticle->m_position - Vec3f(radius, radius, radius));
				Vec3f particleUpper(pParticle->m_position + Vec3f(radius, radius, radius));
				
				if(particleLower.x < m_aabb.m_lowerBound.x)
					m_aabb.m_lowerBound.x = pParticle->m_position.x - pParticle->m_radius;

				if(particleLower.y < m_aabb.m_lowerBound.y)
					m_aabb.m_lowerBound.y = pParticle->m_position.y - pParticle->m_radius;

				if(particleLower.z < m_aabb.m_lowerBound.z)
					m_aabb.m_lowerBound.z = pParticle->m_position.z - pParticle->m_radius;

				if(particleUpper.x > m_aabb.m_upperBound.x)
					m_aabb.m_upperBound.x = pParticle->m_position.x + pParticle->m_radius;

				if(particleUpper.y > m_aabb.m_upperBound.y)
					m_aabb.m_upperBound.y = pParticle->m_position.y + pParticle->m_radius;

				if(particleUpper.z > m_aabb.m_upperBound.z)
					m_aabb.m_upperBound.z = pParticle->m_position.z + pParticle->m_radius;

				it++;
			}
		}

		if(IsSPTManaged())
			TreeUpdate();
	}
}
void SceneObject_ParticleEmitter_Sprite::SpawnBurst(int numParticles)
{
	for(int i = 0; i < numParticles; i++)
		m_pParticles.push_back(EmitParticle());
}