// Scene 04
void Scene04(float time, float dt)
{
	static const float cameraBobbleSpeed = 0.5f;
	static const float cameraBobble = 0.1f;
	static float wobbleParameter = 0.0f;

	// Get world
	World* world = WorldSingleton::Get();


	// Move tanks
	redTank1->SetTargetPosition(Vector3f(160.0f, 0.0f, -16.0f));
	redTank2->SetTargetPosition(Vector3f(60.0f, 0.0f, -16.0f));
	blueTank1->SetTargetPosition(Vector3f(-128.0f, 0.0f, -64.0f));
	blueTank2->SetTargetPosition(Vector3f(432.0f, 0.0f, -80.0f));
	
	redTank1->SetTargetVelocity(30.0f);
	redTank2->SetTargetVelocity(30.0f);
	blueTank1->SetTargetVelocity(30.0f);
	blueTank2->SetTargetVelocity(30.0f);

	redTank1->Update(dt, terrain);
	redTank2->Update(dt, terrain);
	blueTank1->Update(dt, terrain);
	blueTank2->Update(dt, terrain);

	redTank1->OrientToTerrain(terrain, dt);
	redTank2->OrientToTerrain(terrain, dt);
	blueTank1->OrientToTerrain(terrain, dt);
	blueTank2->OrientToTerrain(terrain, dt);

	blueTank1->OrientTurret(-5.0f, Approach(blueTank1->GetTurretOrientation().y, -80.0f, 1.0f, dt));
	blueTank2->OrientTurret(-10.0f, Approach(blueTank2->GetTurretOrientation().y, 90.0f, 1.0f, dt));


	// Spit particles
	static Trigger* particleSpawnTimer = new Trigger(0.25f);
	static Lerp2f* sizeLerp = new Lerp2f(Vector2f(4.0f, 4.0f), Vector2f(8.0f, 8.0f));

	particleSpawnTimer->SetPlayState(Loop);
	particleSpawnTimer->Update(dt);

	if( particleSpawnTimer->DoTrigger() )
	{
		cout << "Trigger..." << endl;
		PointManager* pointManager = PointManagerSingleton::Get();
		Particle* particle;

		particle = pointManager->EmitParticle();
		if( particle )
		{
			particle->MaxLife() = Rnd(0.25f, 1.5f);
			particle->Life() = particle->MaxLife();
			particle->Rotation() = Rnd(0.0f, 360.0f);
			particle->Position() = redTank1->GetPosition()+Vector3f(Rnd(-4.0f, 4.0f), Rnd(0.0f, 4.0f), Rnd(-4.0f, 4.0f));
			particle->Velocity().Set(Rnd(-1.5f, 1.5f), Rnd(-1.5f, 1.5f), Rnd(-1.5f, 1.5f));
			particle->Size() = sizeLerp;
			particle->SetTexture(smokeTexture);
			particle->Color().Set(140.0f/255.0f, 128.0f/255.0f, 112.0f/255.0f, 0.75f);
		}

		particle = pointManager->EmitParticle();
		if( particle )
		{
			particle->MaxLife() = Rnd(0.25f, 1.5f);
			particle->Life() = particle->MaxLife();
			particle->Rotation() = Rnd(0.0f, 360.0f);
			particle->Position() = redTank2->GetPosition()+Vector3f(Rnd(-4.0f, 4.0f), Rnd(0.0f, 4.0f), Rnd(-4.0f, 4.0f));
			particle->Velocity().Set(Rnd(-1.5f, 1.5f), Rnd(-1.5f, 1.5f), Rnd(-1.5f, 1.5f));
			particle->Size() = sizeLerp;
			particle->SetTexture(smokeTexture);
			particle->Color().Set(140.0f/255.0f, 128.0f/255.0f, 112.0f/255.0f, 0.75f);
		}
	}


	// Orbit camera
	wobbleParameter += 30.0f*(1.0f+sin(wobbleParameter*0.4f)*0.05f)*dt;

	mainCamera->SetFieldOfView(90.0f);
	mainCamera->SetPosition(500.0f, 700.0f, -300.0f);
	mainCamera->SetEulerRotation(
		-60.0f+sin(wobbleParameter*0.2f*cameraBobbleSpeed)*3.0f*cameraBobble-5,
		120.0f+sin(wobbleParameter*0.1f*cameraBobbleSpeed)*6.0f*cameraBobble,
		sin(wobbleParameter*0.05f*cameraBobbleSpeed)*30.0f*cameraBobble);


	// Update blur effect
	blurEffect->SetBlurFactor(0.6f);
}
// Scene 03
void Scene03(float time, float dt)
{
	// Get world
	World* world = WorldSingleton::Get();


	// Move tanks
	redTank1->SetTargetPosition(Vector3f(160.0f, 0.0f, -16.0f));
	redTank2->SetTargetPosition(Vector3f(60.0f, 0.0f, -16.0f));
	
	redTank1->SetTargetVelocity(30.0f);
	redTank2->SetTargetVelocity(30.0f);

	redTank1->Update(dt, terrain);
	redTank2->Update(dt, terrain);

	redTank1->OrientToTerrain(terrain, dt);
	redTank2->OrientToTerrain(terrain, dt);
	blueTank1->OrientToTerrain(terrain, dt);
	blueTank2->OrientToTerrain(terrain, dt);

	redTank1->OrientTurret(10.0f, 45.0f+Sin(time*60.0f)*30.0f);
	redTank2->OrientTurret(15.0f, -30.0f+Sin(time*80.0f)*45.0f);


	// Spit particles
	static Trigger* particleSpawnTimer = new Trigger(0.25f);
	static Lerp2f* sizeLerp = new Lerp2f(Vector2f(4.0f, 4.0f), Vector2f(8.0f, 8.0f));

	particleSpawnTimer->SetPlayState(Loop);
	particleSpawnTimer->Update(dt);

	if( particleSpawnTimer->DoTrigger() )
	{
		cout << "Trigger..." << endl;
		PointManager* pointManager = PointManagerSingleton::Get();
		Particle* particle;

		particle = pointManager->EmitParticle();
		if( particle )
		{
			particle->MaxLife() = Rnd(0.25f, 1.5f);
			particle->Life() = particle->MaxLife();
			particle->Rotation() = Rnd(0.0f, 360.0f);
			particle->Position() = redTank1->GetPosition()+Vector3f(Rnd(-4.0f, 4.0f), Rnd(0.0f, 4.0f), Rnd(-4.0f, 4.0f));
			particle->Velocity().Set(Rnd(-1.5f, 1.5f), Rnd(-1.5f, 1.5f), Rnd(-1.5f, 1.5f));
			particle->Size() = sizeLerp;
			particle->SetTexture(smokeTexture);
			particle->Color().Set(140.0f/255.0f, 128.0f/255.0f, 112.0f/255.0f, 0.75f);
		}

		particle = pointManager->EmitParticle();
		if( particle )
		{
			particle->MaxLife() = Rnd(0.25f, 1.5f);
			particle->Life() = particle->MaxLife();
			particle->Rotation() = Rnd(0.0f, 360.0f);
			particle->Position() = redTank2->GetPosition()+Vector3f(Rnd(-4.0f, 4.0f), Rnd(0.0f, 4.0f), Rnd(-4.0f, 4.0f));
			particle->Velocity().Set(Rnd(-1.5f, 1.5f), Rnd(-1.5f, 1.5f), Rnd(-1.5f, 1.5f));
			particle->Size() = sizeLerp;
			particle->SetTexture(smokeTexture);
			particle->Color().Set(140.0f/255.0f, 128.0f/255.0f, 112.0f/255.0f, 0.75f);
		}
	}


	// Orbit camera
	mainCamera->SetFieldOfView(90.0f);

	mainCamera->SetEulerRotation(-6.0f, 100.0f, 0.0f);

	float yaw = mainCamera->GetEulerRotation().y;

	mainCamera->SetPosition(
		redTank1->GetPosition().x+Sin(yaw)*64.0f,
		redTank1->GetPosition().y+18.0f,
		redTank1->GetPosition().z+24.0f+Cos(yaw)*64.0f);


	// Update blur effect
	blurEffect->SetBlurFactor(0.7);
}