diff --git a/assets b/assets index 74035fa..4724dbb 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 74035fae2626e2e62f803cd7d9817d1e47353f69 +Subproject commit 4724dbbd285a35282295661821ef30548ebd550a diff --git a/src/Components/Particle.h b/src/Components/Particle.h index d720dc5..81355db 100644 --- a/src/Components/Particle.h +++ b/src/Components/Particle.h @@ -15,6 +15,7 @@ namespace Components std::vector ScaleSpectrum; double LifeTime; double SpawnTime; + bool Fade; std::vector VelocitySpectrum; std::vector AngularVelocitySpectrum; std::vector OrientationSpectrum; //Keep? diff --git a/src/Components/ParticleEmitter.h b/src/Components/ParticleEmitter.h index 03eaf05..01ed05c 100755 --- a/src/Components/ParticleEmitter.h +++ b/src/Components/ParticleEmitter.h @@ -30,9 +30,10 @@ struct ParticleEmitter : Component float SpreadAngle; double LifeTime; bool UseGoalVelocity; + bool Fade; glm::vec3 GoalVelocity; std::vector AngularVelocitySpectrum; - std::vector OrientationSpectrum; //Keep? + std::vector OrientationSpectrum; //Keep? noo.. private: double TimeSinceLastSpawn; diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index ef15a7f..60473be 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -252,14 +252,14 @@ void GameWorld::Initialize() CommitEntity(tree);*/ - auto thing = CreateEntity(); - auto transform = AddComponent(thing); - transform->Position = glm::vec3(0,15,0); - transform->Scale = glm::vec3(3); -// auto model = AddComponent(thing); -// model->ModelFile = "Models/Barrel/Barrel.obj"; - auto sprite = AddComponent(thing); - sprite->SpriteFile = "Textures/Sprites/SeriousParticle.png"; +// auto thing = CreateEntity(); +// auto transform = AddComponent(thing); +// transform->Position = glm::vec3(0,15,0); +// transform->Scale = glm::vec3(3); +// // auto model = AddComponent(thing); +// // model->ModelFile = "Models/Barrel/Barrel.obj"; +// auto sprite = AddComponent(thing); +// sprite->SpriteFile = "Textures/Sprites/SeriousParticle.png"; } EntityID tank1 = CreateTank(1); @@ -745,31 +745,31 @@ 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 templateComponent = AddComponent(particleEntity); - auto TEMP = AddComponent(particleEntity); - TEMP->Scale = glm::vec3(0); - auto spriteComponent = AddComponent(particleEntity); - spriteComponent->SpriteFile = "Models/Textures/Sprites/Dust.png"; - CommitEntity(particleEntity); - emitterComponent->ParticleTemplate = 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 templateComponent = AddComponent(particleEntity); +// auto TEMP = AddComponent(particleEntity); +// TEMP->Scale = glm::vec3(0); +// auto spriteComponent = AddComponent(particleEntity); +// spriteComponent->SpriteFile = "Models/Textures/Sprites/Dust.png"; +// CommitEntity(particleEntity); +// emitterComponent->ParticleTemplate = particleEntity; +// } } { @@ -832,31 +832,7 @@ 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 templateComponent = AddComponent(particleEntity); - auto TEMP = AddComponent(particleEntity); - TEMP->Scale = glm::vec3(0); - auto spriteComponent = AddComponent(particleEntity); - spriteComponent->SpriteFile = "Models/Textures/Sprites/Dust.png"; - CommitEntity(particleEntity); - emitterComponent->ParticleTemplate = particleEntity; - } + } CommitEntity(tank); diff --git a/src/Systems/ParticleSystem.cpp b/src/Systems/ParticleSystem.cpp index a02ea78..df47cf6 100644 --- a/src/Systems/ParticleSystem.cpp +++ b/src/Systems/ParticleSystem.cpp @@ -22,12 +22,14 @@ void Systems::ParticleSystem::Update(double dt) double timeLived = glfwGetTime() - spawnTime; auto eComp = m_World->GetComponent(explosionID); - if(timeLived > eComp->LifeTime) + if(timeLived > eComp->LifeTime && m_ParticlesToEmitter[explosionID] == NULL) { + auto e = m_World->GetComponent(explosionID); + m_World->RemoveEntity(e->ParticleTemplate); m_World->RemoveEntity(explosionID); it = m_ExplosionEmitters.erase(it); //LOG_INFO("Deleted explosion emitter successfully"); - LOG_INFO("Deleted explosion emitter successfully"); + //LOG_INFO("Deleted explosion emitter successfully. nr of emitters%i", m_ExplosionEmitters.size()); } else { @@ -47,26 +49,34 @@ 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->TimeSinceLastSpawn > emitterComponent->SpawnFrequency) +// { +// SpawnParticles(entity); +// emitterComponent->TimeSinceLastSpawn = 0; +// } } auto particleComponent = m_World->GetComponent(entity); if(particleComponent) { - EntityID particleID = entity; - auto transformComponent = m_World->GetComponent(particleID); + + EntityID particleID = entity; double timeLived = glfwGetTime() - particleComponent->SpawnTime; + if(timeLived > particleComponent->LifeTime) { m_World->RemoveEntity(particleID); + m_ParticlesToEmitter.erase(particleID); + + LOG_INFO("Removed a particle: %i", particleID); + return; } else { + auto transformComponent = m_World->GetComponent(particleID); + auto eComponent = m_World->GetComponent(m_ParticlesToEmitter[particleID]); + auto sprite = m_World->GetComponent(entity); // FIX: calculate once float timeProgress = timeLived / particleComponent->LifeTime; // ColorInterpolation(timeProgress, particleComponent->ColorSpectrum, color); @@ -76,8 +86,16 @@ void Systems::ParticleSystem::UpdateEntity(double dt, EntityID entity, EntityID // Velocity interpolation if(particleComponent->VelocitySpectrum.size() > 1) VectorInterpolation(timeProgress, particleComponent->VelocitySpectrum, transformComponent->Velocity); - - + + if(particleComponent->Fade == true) + { + std::vector spectrum; + spectrum.push_back(1); + spectrum.push_back(0); + float alpha; + ScalarInterpolation(timeProgress, spectrum, alpha); + sprite->Color.w = alpha; + } /*// Angular velocity interpolation if (particleComponent->AngularVelocitySpectrum.size() != 0) { @@ -123,11 +141,11 @@ void Systems::ParticleSystem::SpawnParticles(EntityID emitterID) 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++) { auto ent = m_World->CloneEntity(eComponent->ParticleTemplate); - + LOG_INFO("Spawned a particle: %i", ent); + m_ParticlesToEmitter.insert(std::make_pair(ent, emitterID)); auto particleTransform = m_World->GetComponent(ent); particleTransform->Position = ePosition; @@ -143,6 +161,7 @@ void Systems::ParticleSystem::SpawnParticles(EntityID emitterID) particle->LifeTime = eComponent->LifeTime; particle->ScaleSpectrum = eComponent->ScaleSpectrum; particle->VelocitySpectrum.push_back(particleTransform->Velocity); + particle->Fade = eComponent->Fade; if (eComponent->ScaleSpectrum.size() > 0) { @@ -194,23 +213,13 @@ void Systems::ParticleSystem::VectorInterpolation(double timeProgress, std::vect dAxisValue = glm::abs(spectrum[0].y - spectrum[1].y); if (spectrum[0].y > spectrum[1].y) dAxisValue *= -1; - v.y = spectrum[0].y + dAxisValue * timeProgress; + v.y = spectrum[0].y + dAxisValue * timeProgress; dAxisValue = glm::abs(spectrum[0].z - spectrum[1].z); if(spectrum[0].z > spectrum[1].z) dAxisValue *= -1; v.z = spectrum[0].z + dAxisValue * timeProgress; } -// void Systems::ParticleSystem::ColorInterpolation(double timeProgress, std::vector spectrum, Color &c) -// { -// float dColor = glm::abs(spectrum[0].r - spectrum[1].r); -// c.r = spectrum[0].r + dColor * timeProgress; -// dColor = glm::abs(spectrum[0].g - spectrum[1].g); -// c.g = spectrum[0].g + dColor * timeProgress; -// dColor = glm::abs(spectrum[0].b - spectrum[1].b); -// c.b = spectrum[0].b + dColor * timeProgress; -// } - void Systems::ParticleSystem::ScalarInterpolation(double timeProgress, std::vector spectrum, float &alpha) { float dAlpha = glm::abs(spectrum[0] - spectrum[1]); @@ -221,20 +230,22 @@ void Systems::ParticleSystem::ScalarInterpolation(double timeProgress, std::vect bool Systems::ParticleSystem::CreateExplosion(const Events::CreateExplosion &e) { + LOG_INFO("Spawning an explosion"); auto explosion = m_World->CreateEntity(); auto emitter = m_World->AddComponent(explosion); emitter->LifeTime = e.LifeTime; emitter->SpawnCount = e.ParticlesToSpawn; emitter->Speed = e.Speed; emitter->SpreadAngle = e.SpreadAngle; + emitter->ScaleSpectrum.push_back(glm::vec3(e.ParticleScale)); emitter->SpawnFrequency = e.LifeTime + 20; //temp - // emitter->UseGoalVelocity = true; + emitter->Fade = true; // emitter->GoalVelocity = glm::vec3(0,-_speed, 0); m_World->CommitEntity(explosion); auto particleEnt = m_World->CreateEntity(); + auto templateComponent = m_World->AddComponent(particleEnt); auto TEMP = m_World->AddComponent(particleEnt); - TEMP->Scale = glm::vec3(0); auto spriteComponent = m_World->AddComponent(particleEnt); spriteComponent->SpriteFile = e.spritePath; m_World->CommitEntity(particleEnt); @@ -244,6 +255,7 @@ bool Systems::ParticleSystem::CreateExplosion(const Events::CreateExplosion &e) transform->Position = e.Position; transform->Orientation = e.RelativeUpOrientation; + LOG_INFO("Now we should spawn 1 particle!!!!!! not 2 :("); SpawnParticles(explosion); m_ExplosionEmitters[explosion] = glfwGetTime(); diff --git a/src/Systems/ParticleSystem.h b/src/Systems/ParticleSystem.h index c7a59f2..f70cc9d 100644 --- a/src/Systems/ParticleSystem.h +++ b/src/Systems/ParticleSystem.h @@ -37,12 +37,10 @@ private: float RandomizeAngle(float spreadAngle); //void ScaleInterpolation(double timeProgress, std::vector spectrum, glm::vec3 &scale); void VectorInterpolation(double timeProgress, std::vector spectrum, glm::vec3 &velocity); - //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_TimeSinceLastSpawn; - std::map m_ExplosionEmitters; + std::shared_ptr m_TransformSystem; bool tempSpawnedExplosions; @@ -51,7 +49,9 @@ private: // bool OnKeyUp(const Events::KeyUp &e); EventRelay m_EExplosion; bool CreateExplosion(const Events::CreateExplosion &e); - + + std::map m_ExplosionEmitters; + std::map m_ParticlesToEmitter; }; }