From 5040ff46493301a376321fc19bc4568cb83ec2a0 Mon Sep 17 00:00:00 2001 From: Stiffly Date: Tue, 13 Oct 2015 17:39:40 +0200 Subject: [PATCH] added a radius distribution to randomize the scale. --- src/game/Game/LevelSystem.cpp | 2 +- src/game/Physics/PhysicsSystem.cpp | 37 +++++++++++++++++------------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp index ee434a7..34f80b9 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -396,7 +396,7 @@ void dd::Systems::LevelSystem::BrickHit(EntityID entityHitter, EntityID entityBr ep.AlphaValues.push_back(1.f); ep.AlphaValues.push_back(0.f); ep.RadiusValues.push_back(0.05f); - ep.RadiusDistribution = 0.05; + ep.RadiusDistribution = 0.05f; ep.Speed = 50; EventBroker->Publish(ep); } diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index 7f1e515..0cc4a3c 100755 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -273,7 +273,7 @@ void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, Entity if (particle && !pTemplate) { particle->TimeLived += dt; - //Delete particles + //Delete particles if (particle->TimeLived >= particle->LifeTime - 0.1) { for (int i = 0; i < m_EntitiesToParticleHandle.size(); i++) { const b2ParticleHandle* handle = m_EntitiesToParticleHandle[i][entity]; @@ -299,7 +299,7 @@ void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, Entity auto emitter = m_World->GetComponent(particle->ParticleSystem); if (emitter) { sprite->Color.w = ScalarInterpolation(timeProgress, emitter->AlphaValues); - if (emitter->RadiusValues.size() >= 1) { + if (emitter->RadiusValues.size() > 1) { particle->Radius = ScalarInterpolation(timeProgress, emitter->RadiusValues); } } @@ -540,12 +540,18 @@ void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) if(emitter->TimeSinceLastSpawn < emitter->SpawnRate || emitter->NumberOfTicks < 1) { continue; } - //Create new particle + emitter->NumberOfTicks--; emitter->TimeSinceLastSpawn -= emitter->SpawnRate; auto templateTransform = m_World->GetComponent(pt); - + + //Create new particle for ( int j = 0; j < emitter->ParticlesPerTick; j++) { + auto particle = m_World->CloneEntity(pt, 0); + m_World->RemoveComponent(particle); + auto particleTransform = m_World->GetComponent(particle); + auto particleComponent = m_World->GetComponent(particle); + b2ParticleDef particleDef; particleDef.flags = particleTemplate->Flags; //particleDef.color TODO: Implement this if we want color mixing and shit. @@ -567,21 +573,18 @@ void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) //position particleDef.position = b2Vec2(emitterTransform->Position.x, emitterTransform->Position.y); - - auto particle = m_World->CloneEntity(pt, 0); - m_World->RemoveComponent(particle); - auto particleTransform = m_World->GetComponent(particle); - auto particleComponent = m_World->GetComponent(particle); - + //radius - currently not working :j float radius = emitter->RadiusValues[0]; - if (emitter->RadiusDistribution != 0) { - float halfRadius = emitter->RadiusDistribution / 2; + float newRadius = 0; + if (emitter->RadiusDistribution > 0) { + float halfRadius = radius / 2; std::uniform_real_distribution dis3(radius - halfRadius, radius + halfRadius); - radius = dis3(gen); - //emitter->RadiusValues[0] = radius; + newRadius = dis3(gen); } - //particleTransform->Scale = glm::vec3(radius * 2, radius * 2, 1); - particleComponent->Radius = radius; + else { + newRadius = radius; + } + particleComponent->Radius = newRadius; //Random z-value std::uniform_real_distribution dist(0, 1); @@ -773,6 +776,7 @@ bool dd::Systems::PhysicsSystem::OnContact(const dd::Events::Contact &event) e.Color = glm::vec4(1.f); e.AlphaValues.push_back(1.f); e.AlphaValues.push_back(0.f); + e.RadiusValues.push_back(1); e.Speed = 0; auto PowerFriend = m_World->GetComponent(entity); @@ -800,6 +804,7 @@ bool dd::Systems::PhysicsSystem::OnContact(const dd::Events::Contact &event) e.ParticleLifeTime = 1.f; e.ParticlesPerTick = 15; e.Position = glm::vec3(event.IntersectionPoint.x, event.IntersectionPoint.y, -10); + e.RadiusValues.clear(); e.RadiusValues.push_back(0.2); e.RadiusValues.push_back(1); e.SpriteFile = "Textures/Particles/Cloud_Particle.png";