diff --git a/src/Components/ParticleEmitter.h b/src/Components/ParticleEmitter.h index 9f5e20f..46ad8fb 100755 --- a/src/Components/ParticleEmitter.h +++ b/src/Components/ParticleEmitter.h @@ -5,11 +5,15 @@ #include "Color.h" #include +namespace Systems { class ParticleSystem; } + namespace Components { struct ParticleEmitter : Component { + friend class Systems::ParticleSystem; + EntityID ParticleTemplate; float SpawnFrequency; int SpawnCount; @@ -19,6 +23,9 @@ struct ParticleEmitter : Component double LifeTime; std::vector VelocitySpectrum; std::vector AngularVelocitySpectrum; + +private: + double TimeSinceLastSpawn; }; } diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index d11cce1..be62e0a 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -77,7 +77,7 @@ void GameWorld::Initialize() auto model = AddComponent(ball, "Model"); model->ModelFile = "Models/Placeholders/PhysicsTest/Sphere.obj"; auto sphere = AddComponent(ball, "Sphere"); - sphere->Radius = 0.5; + sphere->Radius = 0.05; auto physics = AddComponent(ball, "Physics"); physics->Mass = 1; } @@ -92,16 +92,21 @@ void GameWorld::Initialize() }*/ { - // Particle emitter - auto ent = CreateEntity(); - auto transform = AddComponent(ent, "Transform"); - transform->Position = glm::vec3(0); - auto emitter = AddComponent(ent, "ParticleEmitter"); - emitter->LifeTime = 4; - emitter->SpawnCount = 1; - emitter->SpreadAngle = 35; - emitter->SpawnFrequency = 0.05; - //emitter-> + for(int i = 0; i < 4 ; i++) + { + // Particle emitter + auto ent = CreateEntity(); + auto transform = AddComponent(ent, "Transform"); + transform->Position = glm::vec3(i * 10, 20, 0); + auto emitter = AddComponent(ent, "ParticleEmitter"); + emitter->LifeTime = 2; + emitter->SpawnCount = 1; + emitter->SpreadAngle = 35; + emitter->SpawnFrequency = 2; + auto model = AddComponent(ent, "Model"); + model->ModelFile = "Models/Placeholders/PhysicsTest/PointLight.obj"; + //emitter-> + } } } diff --git a/src/Systems/ParticleSystem.cpp b/src/Systems/ParticleSystem.cpp index 7cdec83..22075bc 100644 --- a/src/Systems/ParticleSystem.cpp +++ b/src/Systems/ParticleSystem.cpp @@ -6,12 +6,12 @@ Systems::ParticleSystem::ParticleSystem(World *m_World) : System(m_World) { - m_TimeSinceLastSpawn = 0; + } void Systems::ParticleSystem::Update(double dt) { - m_TimeSinceLastSpawn += dt; + } void Systems::ParticleSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) @@ -23,14 +23,13 @@ void Systems::ParticleSystem::UpdateEntity(double dt, EntityID entity, EntityID auto emitterComponent = m_World->GetComponent(entity, "ParticleEmitter"); if(emitterComponent) { - if(m_TimeSinceLastSpawn > emitterComponent->SpawnFrequency) + emitterComponent->TimeSinceLastSpawn += dt; + + auto transformComponent = m_World->GetComponent(entity, "Transform"); + if(emitterComponent->TimeSinceLastSpawn > emitterComponent->SpawnFrequency) { - //if(m_ParticleEmitter[entity].size() < 100) // TEMP - { - SpawnParticles(entity, emitterComponent->SpawnCount, emitterComponent->SpreadAngle); - m_TimeSinceLastSpawn = 0; - } - //std::cout<<"Particle count: "<Position, emitterComponent->SpawnCount, emitterComponent->SpreadAngle); + emitterComponent->TimeSinceLastSpawn = 0; } std::list::iterator it; @@ -54,7 +53,7 @@ void Systems::ParticleSystem::UpdateEntity(double dt, EntityID entity, EntityID } auto transformComponent = m_World->GetComponent(particleID, "Transform"); - float speed = 10 * dt; + float speed = 20 * dt; transformComponent->Position.x += it->Direction.x * speed; transformComponent->Position.y += it->Direction.y * speed; transformComponent->Position.z += it->Direction.z * speed; @@ -92,14 +91,16 @@ void Systems::ParticleSystem::RegisterComponents(ComponentFactory* cf) cf->Register("Particle", []() { return new Components::Particle(); }); } -void Systems::ParticleSystem::SpawnParticles(EntityID emitterID, float spawnCount, float spreadAngle) +void Systems::ParticleSystem::SpawnParticles(EntityID emitterID, glm::vec3 pos, float spawnCount, float spreadAngle) { for(int i = 0; i < spawnCount; i++) { auto ent = m_World->CreateEntity(); auto transform = m_World->AddComponent(ent, "Transform"); - transform->Position = glm::vec3(0, 20, 0); + transform->Position.x = pos.x; + transform->Position.y = pos.y; + transform->Position.z = pos.z; transform->Scale = glm::vec3(1, 1, 0); auto particle = m_World->AddComponent(ent, "Particle"); @@ -134,7 +135,6 @@ void Systems::ParticleSystem::SpawnParticles(EntityID emitterID, float spawnCoun m_ParticleEmitter[emitterID].push_back(data); } - //std::cout<<"Added "<> m_ParticleEmitter; - double m_TimeSinceLastSpawn; + std::map m_TimeSinceLastSpawn; };