diff --git a/src/Components/Particle.h b/src/Components/Particle.h index d08b1a7..d720dc5 100644 --- a/src/Components/Particle.h +++ b/src/Components/Particle.h @@ -14,6 +14,7 @@ namespace Components std::vector ColorSpectrum; std::vector ScaleSpectrum; double LifeTime; + double SpawnTime; std::vector VelocitySpectrum; std::vector AngularVelocitySpectrum; std::vector OrientationSpectrum; //Keep? diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index 93a73ed..95845b9 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -745,29 +745,29 @@ EntityID GameWorld::CreateTank(int playerID) } CommitEntity(wheel); - auto entity = CreateEntity(tank); - auto transformComponent = AddComponent(entity); - 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); - emitterComponent->SpawnCount = 2; - emitterComponent->SpawnFrequency = 0.005; - emitterComponent->SpreadAngle = glm::pi(); - emitterComponent->UseGoalVelocity = false; - emitterComponent->LifeTime = 0.5; - //emitterComponent->AngularVelocitySpectrum.push_back(glm::pi() / 100); - emitterComponent->ScaleSpectrum.push_back(glm::vec3(0.05)); - CommitEntity(entity); - - auto particleEntity = CreateEntity(entity); - auto TEMP = AddComponent(particleEntity); - TEMP->Scale = glm::vec3(0); - auto spriteComponent = AddComponent(particleEntity); - spriteComponent->SpriteFile = "Models/Textures/Sprites/Dust.png"; - emitterComponent->ParticleTemplate = particleEntity; - - CommitEntity(particleEntity); +// auto entity = CreateEntity(tank); +// auto transformComponent = AddComponent(entity); +// 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); +// emitterComponent->SpawnCount = 2; +// emitterComponent->SpawnFrequency = 0.005; +// emitterComponent->SpreadAngle = glm::pi(); +// emitterComponent->UseGoalVelocity = false; +// emitterComponent->LifeTime = 0.5; +// //emitterComponent->AngularVelocitySpectrum.push_back(glm::pi() / 100); +// emitterComponent->ScaleSpectrum.push_back(glm::vec3(0.05)); +// CommitEntity(entity); +// +// auto particleEntity = CreateEntity(entity); +// auto TEMP = AddComponent(particleEntity); +// TEMP->Scale = glm::vec3(0); +// auto spriteComponent = AddComponent(particleEntity); +// spriteComponent->SpriteFile = "Models/Textures/Sprites/Dust.png"; +// emitterComponent->ParticleTemplate = particleEntity; +// +// CommitEntity(particleEntity); } { @@ -830,29 +830,29 @@ EntityID GameWorld::CreateTank(int playerID) CommitEntity(wheel); #pragma endregion - auto entity = CreateEntity(tank); - auto transformComponent = AddComponent(entity); - 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); - emitterComponent->SpawnCount = 2; - emitterComponent->SpawnFrequency = 0.005; - emitterComponent->SpreadAngle = glm::pi(); - emitterComponent->UseGoalVelocity = false; - emitterComponent->LifeTime = 0.5; - //emitterComponent->AngularVelocitySpectrum.push_back(glm::pi() / 100); - emitterComponent->ScaleSpectrum.push_back(glm::vec3(0.05)); - CommitEntity(entity); - - auto particleEntity = CreateEntity(entity); - auto TEMP = AddComponent(particleEntity); - TEMP->Scale = glm::vec3(0); - auto spriteComponent = AddComponent(particleEntity); - spriteComponent->SpriteFile = "Models/Textures/Sprites/Dust.png"; - emitterComponent->ParticleTemplate = particleEntity; - - CommitEntity(particleEntity); +// auto entity = CreateEntity(tank); +// auto transformComponent = AddComponent(entity); +// 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); +// emitterComponent->SpawnCount = 2; +// emitterComponent->SpawnFrequency = 0.005; +// emitterComponent->SpreadAngle = glm::pi(); +// emitterComponent->UseGoalVelocity = false; +// emitterComponent->LifeTime = 0.5; +// //emitterComponent->AngularVelocitySpectrum.push_back(glm::pi() / 100); +// emitterComponent->ScaleSpectrum.push_back(glm::vec3(0.05)); +// CommitEntity(entity); +// +// auto particleEntity = CreateEntity(entity); +// auto TEMP = AddComponent(particleEntity); +// TEMP->Scale = glm::vec3(0); +// auto spriteComponent = AddComponent(particleEntity); +// spriteComponent->SpriteFile = "Models/Textures/Sprites/Dust.png"; +// emitterComponent->ParticleTemplate = particleEntity; +// +// CommitEntity(particleEntity); } CommitEntity(tank); diff --git a/src/Systems/ParticleSystem.cpp b/src/Systems/ParticleSystem.cpp index 39ea2fb..a02ea78 100644 --- a/src/Systems/ParticleSystem.cpp +++ b/src/Systems/ParticleSystem.cpp @@ -52,64 +52,59 @@ void Systems::ParticleSystem::UpdateEntity(double dt, EntityID entity, EntityID SpawnParticles(entity); emitterComponent->TimeSinceLastSpawn = 0; } + } - std::list::iterator it; - for(it = m_ParticleEmitter[entity].begin(); it != m_ParticleEmitter[entity].end();) + auto particleComponent = m_World->GetComponent(entity); + if(particleComponent) + { + EntityID particleID = entity; + auto transformComponent = m_World->GetComponent(particleID); + + double timeLived = glfwGetTime() - particleComponent->SpawnTime; + if(timeLived > particleComponent->LifeTime) { - EntityID particleID = (it)->ParticleID; - auto transformComponent = m_World->GetComponent(particleID); - auto particleComponent = m_World->GetComponent(particleID); + m_World->RemoveEntity(particleID); + } + else + { + // FIX: calculate once + float timeProgress = timeLived / particleComponent->LifeTime; + // ColorInterpolation(timeProgress, particleComponent->ColorSpectrum, color); + // Scale interpolation + if(particleComponent->ScaleSpectrum.size() > 1) + VectorInterpolation(timeProgress, particleComponent->ScaleSpectrum, transformComponent->Scale); + // Velocity interpolation + if(particleComponent->VelocitySpectrum.size() > 1) + VectorInterpolation(timeProgress, particleComponent->VelocitySpectrum, transformComponent->Velocity); + - double timeLived = glfwGetTime() - it->SpawnTime; - if(timeLived > particleComponent->LifeTime) + /*// Angular velocity interpolation + if (particleComponent->AngularVelocitySpectrum.size() != 0) { - m_World->RemoveEntity(particleID); - it = m_ParticleEmitter[entity].erase(it); + if(particleComponent->AngularVelocitySpectrum.size() > 1) + { + ScalarInterpolation(timeProgress, particleComponent->AngularVelocitySpectrum, it->AngularVelocity); + transformComponent->Orientation = glm::angleAxis(it->AngularVelocity, it->Orientation); + } + else + { + transformComponent->Orientation *= glm::angleAxis(it->AngularVelocity, it->Orientation); + //it->Orientation = glm::angleAxis(it->AngularVelocity, it->Orientation); + } } - else + + //Angular velocity interpolation + if(particleComponent->OrientationSpectrum.size() > 1) { - // FIX: calculate once - float timeProgress = timeLived / particleComponent->LifeTime; - // ColorInterpolation(timeProgress, particleComponent->ColorSpectrum, color); - // Scale interpolation - if(particleComponent->ScaleSpectrum.size() > 1) - VectorInterpolation(timeProgress, particleComponent->ScaleSpectrum, transformComponent->Scale); - // Velocity interpolation - if(particleComponent->VelocitySpectrum.size() > 1) - VectorInterpolation(timeProgress, particleComponent->VelocitySpectrum, transformComponent->Velocity); - - // Angular velocity interpolation - if (particleComponent->AngularVelocitySpectrum.size() != 0) - { - if(particleComponent->AngularVelocitySpectrum.size() > 1) - { - ScalarInterpolation(timeProgress, particleComponent->AngularVelocitySpectrum, it->AngularVelocity); - transformComponent->Orientation = glm::angleAxis(it->AngularVelocity, it->Orientation); - } - else - { - transformComponent->Orientation *= glm::angleAxis(it->AngularVelocity, it->Orientation); - //it->Orientation = glm::angleAxis(it->AngularVelocity, it->Orientation); - } - } - - //Angular velocity interpolation - if(particleComponent->OrientationSpectrum.size() > 1) - { - VectorInterpolation(timeProgress, particleComponent->OrientationSpectrum, it->Orientation); - glm::vec3 v1 = (particleComponent->OrientationSpectrum[0]); - glm::vec3 v2 = (it->Orientation); - glm::vec3 v3 = glm::normalize(glm::cross(v1,v2)); - float angle = glm::acos(glm::dot(v1, v2) / (glm::length(v1) * glm::length(v2))); + VectorInterpolation(timeProgress, particleComponent->OrientationSpectrum, it->Orientation); + glm::vec3 v1 = (particleComponent->OrientationSpectrum[0]); + glm::vec3 v2 = (it->Orientation); + glm::vec3 v3 = glm::normalize(glm::cross(v1,v2)); + float angle = glm::acos(glm::dot(v1, v2) / (glm::length(v1) * glm::length(v2))); - transformComponent->Orientation = glm::angleAxis(angle, v3); - } - - - transformComponent->Position += transformComponent->Velocity * (float)dt; - - it++; - } + transformComponent->Orientation = glm::angleAxis(angle, v3); + }*/ + transformComponent->Position += transformComponent->Velocity * (float)dt; } } } @@ -173,15 +168,13 @@ void Systems::ParticleSystem::SpawnParticles(EntityID emitterID) particle->AngularVelocitySpectrum = eComponent->AngularVelocitySpectrum; - ParticleData data; - data.ParticleID = ent; - 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 = eOrientation * glm::vec3(0,0,-1); - m_ParticleEmitter[emitterID].push_back(data); + particle->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 = eOrientation * glm::vec3(0,0,-1); + //m_ParticleEmitter[emitterID].push_back(data); } } diff --git a/src/Systems/ParticleSystem.h b/src/Systems/ParticleSystem.h index 0ecd79c..c7a59f2 100644 --- a/src/Systems/ParticleSystem.h +++ b/src/Systems/ParticleSystem.h @@ -16,15 +16,6 @@ namespace Systems { - struct ParticleData - { - EntityID ParticleID; - double SpawnTime; - float AngularVelocity; - glm::vec3 Orientation; - Color color; - }; - class ParticleSystem : public System { public: @@ -49,7 +40,7 @@ private: //void ColorInterpolation(double timeProgress, std::vector spectrum, Color &color); void ScalarInterpolation(double timeProgress, std::vector spectrum, float &alpha); void Billboard(); - std::map> m_ParticleEmitter; + //std::map> m_ParticleEmitter; std::map m_TimeSinceLastSpawn; std::map m_ExplosionEmitters; std::shared_ptr m_TransformSystem;