From 1a52b1d04c308e5d9921bc29c17d1fedd6256af7 Mon Sep 17 00:00:00 2001 From: Stiffly Date: Sun, 18 May 2014 20:32:10 +0200 Subject: [PATCH 1/2] finlir --- src/GameWorld.cpp | 6 ++-- src/Systems/ParticleSystem.cpp | 66 +++++++++++++++++----------------- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index 056598c..2a9fc9c 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -390,7 +390,7 @@ void GameWorld::Initialize() auto entity = CreateEntity(tank); auto transformComponent = AddComponent(entity, "Transform"); - transformComponent->Position = glm::vec3(2,-1.7,2.0); + transformComponent->Position = glm::vec3(-2,-1.7,2.0); transformComponent->Scale = glm::vec3(3,3,3); transformComponent->Orientation = glm::angleAxis(glm::pi()/2, glm::vec3(1,0,0)); auto emitterComponent = AddComponent(entity, "ParticleEmitter"); @@ -399,6 +399,7 @@ void GameWorld::Initialize() emitterComponent->SpreadAngle = glm::pi(); emitterComponent->UseGoalVelocity = false; emitterComponent->LifeTime = 0.5; + emitterComponent->Speed = 5; //emitterComponent->AngularVelocitySpectrum.push_back(glm::pi() / 100); emitterComponent->ScaleSpectrum.push_back(glm::vec3(0.05)); CommitEntity(entity); @@ -452,7 +453,7 @@ void GameWorld::Initialize() auto entity = CreateEntity(tank); auto transformComponent = AddComponent(entity, "Transform"); - transformComponent->Position = glm::vec3(-2,-1.7,2.0); + transformComponent->Position = glm::vec3(2,-1.7,2.0); transformComponent->Scale = glm::vec3(3,3,3); transformComponent->Orientation = glm::angleAxis(glm::pi()/2, glm::vec3(1,0,0)); auto emitterComponent = AddComponent(entity, "ParticleEmitter"); @@ -461,6 +462,7 @@ void GameWorld::Initialize() emitterComponent->SpreadAngle = glm::pi(); emitterComponent->UseGoalVelocity = false; emitterComponent->LifeTime = 0.5; + emitterComponent->Speed = 5; //emitterComponent->AngularVelocitySpectrum.push_back(glm::pi() / 100); emitterComponent->ScaleSpectrum.push_back(glm::vec3(0.05)); CommitEntity(entity); diff --git a/src/Systems/ParticleSystem.cpp b/src/Systems/ParticleSystem.cpp index 0882f9d..75580b4 100644 --- a/src/Systems/ParticleSystem.cpp +++ b/src/Systems/ParticleSystem.cpp @@ -101,43 +101,42 @@ void Systems::ParticleSystem::RegisterComponents(ComponentFactory* cf) void Systems::ParticleSystem::SpawnParticles(EntityID emitterID) { - auto emitterComponent = m_World->GetComponent(emitterID, "ParticleEmitter"); - auto emitterTransform = m_World->GetComponent(emitterID, "Transform"); - glm::vec3 emitterPos = m_TransformSystem->AbsolutePosition(emitterID); - glm::quat emitterOrientation = emitterTransform->Orientation; + auto eComponent = m_World->GetComponent(emitterID, "ParticleEmitter"); + auto eTransform = m_World->GetComponent(emitterID, "Transform"); + glm::vec3 ePosition = m_TransformSystem->AbsolutePosition(emitterID); + glm::quat eOrientation = eTransform->Orientation; - float tempSpeed = 4; - glm::vec3 speed = glm::vec3(tempSpeed); + glm::vec3 paticleSpeed = glm::vec3(eComponent->Speed); - for(int i = 0; i < emitterComponent->SpawnCount; i++) + for(int i = 0; i < eComponent->SpawnCount; i++) { - auto ent = m_World->CloneEntity(emitterComponent->ParticleTemplate); + auto particleEntity = m_World->CloneEntity(eComponent->ParticleTemplate); - auto particleTransform = m_World->GetComponent(ent, "Transform"); - particleTransform->Position = emitterPos; + auto particleTransform = m_World->GetComponent(particleEntity, "Transform"); + particleTransform->Position = ePosition; - particleTransform->Orientation = emitterOrientation; + particleTransform->Orientation = eOrientation; //The emitter's orientation as "start value" times the default direction for emitter. Times the speed, and then rotate on x and y axis with the randomized spread angle. - float spreadAngle = emitterComponent->SpreadAngle; - particleTransform->Velocity = emitterOrientation * glm::vec3(0, 0, -1) * speed * + float spreadAngle = eComponent->SpreadAngle; + particleTransform->Velocity = eOrientation * glm::vec3(0, 0, -1) * paticleSpeed * glm::normalize(glm::angleAxis(RandomizeAngle(spreadAngle), glm::vec3(1, 0, 0))) * glm::normalize(glm::angleAxis(RandomizeAngle(spreadAngle), glm::vec3(0, 1, 0))) * glm::normalize(glm::angleAxis(RandomizeAngle(spreadAngle), glm::vec3(0, 0, 1))); - auto particle = m_World->AddComponent(ent, "Particle"); - particle->LifeTime = emitterComponent->LifeTime; - particle->ScaleSpectrum = emitterComponent->ScaleSpectrum; - particle->VelocitySpectrum.push_back(particleTransform->Velocity); + auto particleComponent = m_World->AddComponent(particleEntity, "Particle"); + particleComponent->LifeTime = eComponent->LifeTime; + particleComponent->ScaleSpectrum = eComponent->ScaleSpectrum; + particleComponent->VelocitySpectrum.push_back(particleTransform->Velocity); - if (emitterComponent->ScaleSpectrum.size() > 0) + if (eComponent->ScaleSpectrum.size() > 0) { - if (emitterComponent->ScaleSpectrum.size() > 1) + if (eComponent->ScaleSpectrum.size() > 1) { - particle->ScaleSpectrum = emitterComponent->ScaleSpectrum; + particleComponent->ScaleSpectrum = eComponent->ScaleSpectrum; } else { - particleTransform->Scale = emitterComponent->ScaleSpectrum[0]; + particleTransform->Scale = eComponent->ScaleSpectrum[0]; } } else @@ -145,23 +144,22 @@ void Systems::ParticleSystem::SpawnParticles(EntityID emitterID) particleTransform->Scale = glm::vec3(1, 1, 1); } - if(emitterComponent->UseGoalVelocity) - particle->VelocitySpectrum.push_back(emitterComponent->GoalVelocity); - particle->OrientationSpectrum = emitterComponent->OrientationSpectrum; - if(particle->OrientationSpectrum.size() != 0) - particleTransform->Orientation = glm::angleAxis(0.f, particle->OrientationSpectrum[0]); - particle->AngularVelocitySpectrum = emitterComponent->AngularVelocitySpectrum; + if(eComponent->UseGoalVelocity) + particleComponent->VelocitySpectrum.push_back(eComponent->GoalVelocity); + particleComponent->OrientationSpectrum = eComponent->OrientationSpectrum; + if(particleComponent->OrientationSpectrum.size() != 0) + particleTransform->Orientation = glm::angleAxis(0.f, particleComponent->OrientationSpectrum[0]); + particleComponent->AngularVelocitySpectrum = eComponent->AngularVelocitySpectrum; ParticleData data; - data.ParticleID = ent; + data.ParticleID = particleEntity; data.SpawnTime = glfwGetTime(); - if (particle->AngularVelocitySpectrum.size() != 0) - data.AngularVelocity = particle->AngularVelocitySpectrum[0]; - if (particle->OrientationSpectrum.size() != 0) - data.Orientation = particle->OrientationSpectrum[0]; - else data.Orientation = emitterOrientation * glm::vec3(0,0,-1); - + if (particleComponent->AngularVelocitySpectrum.size() != 0) + data.AngularVelocity = particleComponent->AngularVelocitySpectrum[0]; + if (particleComponent->OrientationSpectrum.size() != 0) + data.Orientation = particleComponent->OrientationSpectrum[0]; + else data.Orientation = eOrientation * glm::vec3(0,0,-1); m_ParticleEmitter[emitterID].push_back(data); } } From 65acae410d5d35c5ad14e8df0171c4935617a25c Mon Sep 17 00:00:00 2001 From: Stiffly Date: Tue, 20 May 2014 00:38:30 +0200 Subject: [PATCH 2/2] Added Explosion function to particles --- assets | 2 +- src/Components/ParticleEmitter.h | 7 +-- src/GameWorld.cpp | 3 +- src/Systems/ParticleSystem.cpp | 77 ++++++++++++++++++++++++++++++-- src/Systems/ParticleSystem.h | 15 ++++++- 5 files changed, 93 insertions(+), 11 deletions(-) diff --git a/assets b/assets index 908d0eb..66e2abf 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 908d0eb8034d334437e79a2e524de9c7d9310ea6 +Subproject commit 66e2abf429f8d9a8c9fcab8ef81e717d5607aafa diff --git a/src/Components/ParticleEmitter.h b/src/Components/ParticleEmitter.h index bb57c99..03eaf05 100755 --- a/src/Components/ParticleEmitter.h +++ b/src/Components/ParticleEmitter.h @@ -19,7 +19,7 @@ struct ParticleEmitter : Component , SpawnCount(0) , SpreadAngle(0) , LifeTime(0) - , TimeSinceLastSpawn(0) { } + , TimeSinceLastSpawn(100) { } // TEMP fulhack så att partiklarna spawnar direkt EntityID ParticleTemplate; float SpawnFrequency; @@ -34,10 +34,11 @@ struct ParticleEmitter : Component std::vector AngularVelocitySpectrum; std::vector OrientationSpectrum; //Keep? - virtual ParticleEmitter* Clone() const override { return new ParticleEmitter(*this); } - private: double TimeSinceLastSpawn; + + virtual ParticleEmitter* Clone() const override { return new ParticleEmitter(*this); } + }; } diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index 2a9fc9c..247204c 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -395,7 +395,7 @@ void GameWorld::Initialize() transformComponent->Orientation = glm::angleAxis(glm::pi()/2, glm::vec3(1,0,0)); auto emitterComponent = AddComponent(entity, "ParticleEmitter"); emitterComponent->SpawnCount = 2; - emitterComponent->SpawnFrequency = 0.005; + emitterComponent->SpawnFrequency = 10; emitterComponent->SpreadAngle = glm::pi(); emitterComponent->UseGoalVelocity = false; emitterComponent->LifeTime = 0.5; @@ -473,7 +473,6 @@ void GameWorld::Initialize() auto spriteComponent = AddComponent(particleEntity, "Sprite"); spriteComponent->SpriteFile = "Models/Textures/Sprites/Dust.png"; emitterComponent->ParticleTemplate = particleEntity; - CommitEntity(particleEntity); } diff --git a/src/Systems/ParticleSystem.cpp b/src/Systems/ParticleSystem.cpp index 75580b4..fac2f91 100644 --- a/src/Systems/ParticleSystem.cpp +++ b/src/Systems/ParticleSystem.cpp @@ -7,11 +7,32 @@ void Systems::ParticleSystem::Initialize() { m_TransformSystem = m_World->GetSystem("TransformSystem"); + tempSpawnedExplosions = false; + EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &Systems::ParticleSystem::OnKeyUp); } void Systems::ParticleSystem::Update(double dt) { - + std::map::iterator it; + for(it = m_ExplosionEmitters.begin(); it != m_ExplosionEmitters.end();) + { + EntityID explosionID = it->first; + double spawnTime = it->second; + + double timeLived = glfwGetTime() - spawnTime; + auto eComp = m_World->GetComponent(explosionID, "ParticleEmitter"); + + if(timeLived > eComp->LifeTime) + { + m_World->RemoveEntity(explosionID); + it = m_ExplosionEmitters.erase(it); + LOG_INFO("Deleted explosion emitter successfully"); + } + else + { + it++; + } + } } void Systems::ParticleSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) @@ -105,7 +126,6 @@ void Systems::ParticleSystem::SpawnParticles(EntityID emitterID) auto eTransform = m_World->GetComponent(emitterID, "Transform"); glm::vec3 ePosition = m_TransformSystem->AbsolutePosition(emitterID); glm::quat eOrientation = eTransform->Orientation; - glm::vec3 paticleSpeed = glm::vec3(eComponent->Speed); for(int i = 0; i < eComponent->SpawnCount; i++) @@ -114,7 +134,7 @@ void Systems::ParticleSystem::SpawnParticles(EntityID emitterID) auto particleTransform = m_World->GetComponent(particleEntity, "Transform"); particleTransform->Position = ePosition; - + particleTransform->Orientation = eOrientation; //The emitter's orientation as "start value" times the default direction for emitter. Times the speed, and then rotate on x and y axis with the randomized spread angle. float spreadAngle = eComponent->SpreadAngle; @@ -203,4 +223,55 @@ void Systems::ParticleSystem::ScalarInterpolation(double timeProgress, std::vect if(spectrum[0] > spectrum[1]) dAlpha *= -1; alpha = spectrum[0] + dAlpha * timeProgress; +} + +void Systems::ParticleSystem::CreateExplosion(glm::vec3 _pos, double _lifeTime, int _particlesToSpawn, std::string _spritePath, glm::quat _relativeUpOri, float _speed, float _spreadAngle, float _particleScale) +{ + auto explosion = m_World->CreateEntity(); + auto emitter = m_World->AddComponent(explosion, "ParticleEmitter"); + emitter->LifeTime = _lifeTime; + emitter->SpawnCount = _particlesToSpawn; + emitter->Speed = _speed; + emitter->SpreadAngle = _spreadAngle; + emitter->SpawnFrequency = _lifeTime + 20; //temp +// emitter->UseGoalVelocity = true; +// emitter->GoalVelocity = glm::vec3(0,-_speed, 0); + m_World->CommitEntity(explosion); + + auto particleEnt = m_World->CreateEntity(); + auto TEMP = m_World->AddComponent(particleEnt, "Transform"); + TEMP->Scale = glm::vec3(0); + auto spriteComponent = m_World->AddComponent(particleEnt, "Sprite"); + spriteComponent->SpriteFile = _spritePath; + m_World->CommitEntity(particleEnt); + emitter->ParticleTemplate = particleEnt; + + auto transform = m_World->AddComponent(explosion, "Transform"); + transform->Position = _pos; + transform->Orientation = _relativeUpOri; + + SpawnParticles(explosion); + m_ExplosionEmitters[explosion] = glfwGetTime(); +} + +bool Systems::ParticleSystem::OnKeyUp(const Events::KeyUp &e) +{ + if(!tempSpawnedExplosions) + { + if (e.KeyCode == GLFW_KEY_B) + { + tempSpawnedExplosions = true; + CreateExplosion( + glm::vec3(0, 10, 0), + 0.5, + 60, + "Textures/Sprites/NewtonTreeDeleteASAPPlease.png", + glm::angleAxis(glm::pi()/2, glm::vec3(1,0,0)), + 40, + glm::pi(), + 0.5f + ); + } + } + return true; } \ No newline at end of file diff --git a/src/Systems/ParticleSystem.h b/src/Systems/ParticleSystem.h index 06cbe63..31945c8 100644 --- a/src/Systems/ParticleSystem.h +++ b/src/Systems/ParticleSystem.h @@ -6,8 +6,9 @@ #include "Components/Transform.h" #include "Components/ParticleEmitter.h" #include "Components/Particle.h" -#include "Components/Model.h" -#include "Components/PointLight.h" +#include "Components/Sprite.h" +#include "EventBroker.h" +#include "Events/KeyUp.h" #include "Color.h" #include @@ -33,6 +34,11 @@ public: void Update(double dt) override; void UpdateEntity(double dt, EntityID entity, EntityID parent) override; void Initialize() override; + + void CreateExplosion(glm::vec3 _pos, double _lifeTime, int _particlesToSpawn, std::string _spritePath, glm::quat _relativeUpOri, float _speed, float _spreadAngle, float _particleScale); + + virtual bool OnCommand(const Events::KeyUp &event) { return false; } + private: void SpawnParticles(EntityID emitterID); float RandomizeAngle(float spreadAngle); @@ -43,9 +49,14 @@ private: void Billboard(); std::map> m_ParticleEmitter; std::map m_TimeSinceLastSpawn; + std::map m_ExplosionEmitters; std::shared_ptr m_TransformSystem; + bool tempSpawnedExplosions; + EventRelay m_EKeyUp; + bool OnKeyUp(const Events::KeyUp &e); + }; }