From 72a8ee9080880de48ef67e229342b998327e850b Mon Sep 17 00:00:00 2001 From: Stiffly Date: Wed, 4 Jun 2014 03:26:29 +0200 Subject: [PATCH] Water splash --- assets | 2 +- src/Components/ParticleEmitter.h | 2 + src/Events/CreateExplosion.h | 10 +++- src/Systems/ParticleSystem.cpp | 21 ++++++-- src/Systems/TankSteeringSystem.cpp | 87 ++++++++++++++++++++---------- 5 files changed, 86 insertions(+), 36 deletions(-) diff --git a/assets b/assets index 78ba667..a6e3f12 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 78ba667b37a553c8387bc2717032c284dbd14aa9 +Subproject commit a6e3f120fd90e4c2c3983cf0098bb9c3ebdc4b39 diff --git a/src/Components/ParticleEmitter.h b/src/Components/ParticleEmitter.h index f7cb678..edd92b5 100755 --- a/src/Components/ParticleEmitter.h +++ b/src/Components/ParticleEmitter.h @@ -20,6 +20,7 @@ struct ParticleEmitter : Component , SpreadAngle(0) , LifeTime(0) , TimeSinceLastSpawn(100) + , Emitting(false) , Color(glm::vec4(0)) { } EntityID ParticleTemplate; @@ -32,6 +33,7 @@ struct ParticleEmitter : Component double LifeTime; bool UseGoalVelocity; bool Fade; + bool Emitting; glm::vec3 GoalVelocity; std::vector AngularVelocitySpectrum; std::vector OrientationSpectrum; //Keep? noo.. diff --git a/src/Events/CreateExplosion.h b/src/Events/CreateExplosion.h index 0fb6310..3766c6b 100644 --- a/src/Events/CreateExplosion.h +++ b/src/Events/CreateExplosion.h @@ -9,8 +9,10 @@ namespace Events { struct CreateExplosion : Event { - CreateExplosion() - : Color(glm::vec4(0)) {} + CreateExplosion() : + Color(glm::vec4(0)), + UseGoalVector(false) {} + glm::vec3 Position; glm::vec4 Color; double LifeTime; @@ -20,6 +22,10 @@ namespace Events float Speed; float SpreadAngle; std::vector ParticleScale; + bool UseGoalVector; + glm::vec3 GoalVelocity; + bool Emitting; + float SpawnFrequency; }; } diff --git a/src/Systems/ParticleSystem.cpp b/src/Systems/ParticleSystem.cpp index 45c3646..e9e6c56 100644 --- a/src/Systems/ParticleSystem.cpp +++ b/src/Systems/ParticleSystem.cpp @@ -49,11 +49,15 @@ void Systems::ParticleSystem::UpdateEntity(double dt, EntityID entity, EntityID { emitterComponent->TimeSinceLastSpawn += dt; auto emitterTransformComponent = m_World->GetComponent(entity); -// if(emitterComponent->TimeSinceLastSpawn > emitterComponent->SpawnFrequency) -// { -// SpawnParticles(entity); -// emitterComponent->TimeSinceLastSpawn = 0; -// } + if(emitterComponent->Emitting) + { + if(emitterComponent->TimeSinceLastSpawn > emitterComponent->SpawnFrequency) + { + SpawnParticles(entity); + emitterComponent->TimeSinceLastSpawn = 0; + } + } + } auto particleComponent = m_World->GetComponent(entity); @@ -242,10 +246,17 @@ bool Systems::ParticleSystem::CreateExplosion(const Events::CreateExplosion &e) emitter->SpawnCount = e.ParticlesToSpawn; emitter->Speed = e.Speed; emitter->SpreadAngle = e.SpreadAngle; + emitter->Emitting = e.Emitting; + emitter->SpawnFrequency = e.SpawnFrequency; //emitter->ScaleSpectrum.push_back(glm::vec3(e.ParticleScale)); emitter->SpawnFrequency = e.LifeTime + 20; //temp emitter->Fade = true; emitter->Color = e.Color; + if(e.UseGoalVector) + { + emitter->UseGoalVelocity = e.UseGoalVector; + emitter->GoalVelocity = e.GoalVelocity; + } std::vector scale; scale.push_back(glm::vec3(e.ParticleScale[0])); if(e.ParticleScale.size() >= 2) diff --git a/src/Systems/TankSteeringSystem.cpp b/src/Systems/TankSteeringSystem.cpp index e6f301c..9c8a7c0 100644 --- a/src/Systems/TankSteeringSystem.cpp +++ b/src/Systems/TankSteeringSystem.cpp @@ -102,12 +102,14 @@ void Systems::TankSteeringSystem::UpdateEntity(double dt, EntityID entity, Entit e.LifeTime = 1.5; e.ParticleScale.push_back(0.6); e.ParticleScale.push_back(1.8); - e.ParticlesToSpawn = 5; + e.ParticlesToSpawn = 1; e.Position = cloneTransform->Position; e.RelativeUpOrientation = glm::angleAxis(glm::pi() / 2, glm::vec3(1,0,0)); e.Speed = 1.7; - e.SpreadAngle = glm::pi()/10; + e.SpreadAngle = glm::pi()/100; e.spritePath = "Textures/Sprites/Smoke1.png"; + e.Emitting = true; + e.SpawnFrequency = 0.2; e.Color = glm::vec4(0.6,0.6,0.6,1); EventBroker->Publish(e); } @@ -192,36 +194,65 @@ bool Systems::TankSteeringSystem::OnCollision(const Events::Collision &e) //auto otherTransform = m_World->GetComponent(otherEntity); { +// Events::CreateExplosion e; +// e.LifeTime = 3; +// e.ParticleScale.push_back(8); +// e.ParticlesToSpawn = 20; +// e.Position = shellTransform->Position; +// e.RelativeUpOrientation = glm::angleAxis(glm::pi() / 2, glm::vec3(1,0,0)); +// e.Speed = 3; +// e.SpreadAngle = glm::pi(); +// e.spritePath = "Textures/Sprites/Smoke1.png"; +// e.Color = glm::vec4(0.6,0.6,0.6,1); +// EventBroker->Publish(e); +// e.LifeTime = 0.7; +// e.ParticleScale.push_back(12); +// e.ParticlesToSpawn = 10; +// e.Position = shellTransform->Position; +// e.RelativeUpOrientation = glm::angleAxis(glm::pi() / 2, glm::vec3(1,0,0)); +// e.Speed = 17; +// e.SpreadAngle = glm::pi(); +// e.spritePath = "Textures/Sprites/Fire.png"; +// EventBroker->Publish(e); +// e.LifeTime = 0.2; +// e.ParticleScale.push_back(1); +// e.ParticleScale.push_back(15); +// e.ParticlesToSpawn = 5; +// e.Position = shellTransform->Position; +// e.RelativeUpOrientation = glm::angleAxis(glm::pi() / 2, glm::vec3(1,0,0)); +// e.Speed = 6; +// e.SpreadAngle = glm::pi(); +// e.spritePath = "Textures/Sprites/Blast1.png"; +// e.Color = glm::vec4(2, 2, 2, 0.2); +// EventBroker->Publish(e); + Events::CreateExplosion e; - e.LifeTime = 3; - e.ParticleScale.push_back(8); + e.LifeTime = 1; + e.ParticleScale.push_back(1); + e.ParticleScale.push_back(3); e.ParticlesToSpawn = 20; e.Position = shellTransform->Position; - e.RelativeUpOrientation = glm::angleAxis(glm::pi() / 2, glm::vec3(1,0,0)); - e.Speed = 3; - e.SpreadAngle = glm::pi(); - e.spritePath = "Textures/Sprites/Smoke1.png"; - e.Color = glm::vec4(0.6,0.6,0.6,1); - EventBroker->Publish(e); - e.LifeTime = 0.7; - e.ParticleScale.push_back(12); - e.ParticlesToSpawn = 10; - e.Position = shellTransform->Position; - e.RelativeUpOrientation = glm::angleAxis(glm::pi() / 2, glm::vec3(1,0,0)); - e.Speed = 17; - e.SpreadAngle = glm::pi(); - e.spritePath = "Textures/Sprites/Fire.png"; - EventBroker->Publish(e); - e.LifeTime = 0.2; - e.ParticleScale.push_back(1); - e.ParticleScale.push_back(15); - e.ParticlesToSpawn = 5; - e.Position = shellTransform->Position; - e.RelativeUpOrientation = glm::angleAxis(glm::pi() / 2, glm::vec3(1,0,0)); + e.SpreadAngle = glm::radians(180) / 4; + e.RelativeUpOrientation = glm::angleAxis(glm::radians(90), glm::vec3(1,0,0)); + e.UseGoalVector = true; + e.GoalVelocity = glm::vec3(0,-4,0); e.Speed = 6; - e.SpreadAngle = glm::pi(); - e.spritePath = "Textures/Sprites/Blast1.png"; - e.Color = glm::vec4(2, 2, 2, 0.2); + e.spritePath = "Textures/Sprites/Splash.png"; + e.Color = glm::vec4(5.f,5.f,5.f,1); + + EventBroker->Publish(e); + e.LifeTime = 1; + e.ParticleScale.push_back(1); + e.ParticleScale.push_back(3); + e.ParticlesToSpawn = 20; + e.Position = shellTransform->Position; + e.SpreadAngle = glm::radians(180)/ 4; + e.RelativeUpOrientation = glm::angleAxis(glm::radians(90), glm::vec3(1,0,0)); + e.UseGoalVector = true; + e.GoalVelocity = glm::vec3(0,-4,0); + e.Speed = 6; + e.spritePath = "Textures/Sprites/Splash.png"; + e.Color = glm::vec4(1.f,1.f,1.f,1); EventBroker->Publish(e); } {