From ca810743b2666e227bec0a1e5049cf1505193b8e Mon Sep 17 00:00:00 2001 From: Stiffly Date: Tue, 6 Oct 2015 13:38:40 +0200 Subject: [PATCH] Angle and spread on particle system. Need to make them not collide. --- include/Core/Engine.h | 18 +++++++++++------- include/Physics/CParticleEmitter.h | 5 ++++- include/Physics/PhysicsSystem.h | 5 +++++ src/game/Physics/PhysicsSystem.cpp | 20 ++++++++++++++++++-- 4 files changed, 38 insertions(+), 10 deletions(-) diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 5a3ebf2..187d149 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -137,6 +137,7 @@ public: //OctoBall + /* { auto ent = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(ent); @@ -158,7 +159,7 @@ public: plight->Radius = 2.f; m_World->CommitEntity(ent); - } + }*/ //PointLightTest { @@ -224,10 +225,13 @@ public: auto transform = m_World->AddComponent(Pe); auto particleEmitter= m_World->AddComponent(Pe); - transform->Position = glm::vec3(0.f, -5.f, -10.f); + transform->Position = glm::vec3(0.f, 0.f, -10.f); particleEmitter->GravityScale = 0.0f; - particleEmitter->SpawnRate = 1.0f; - particleEmitter->NumberOfTicks = 3.f; + particleEmitter->SpawnRate = 0.1f; + particleEmitter->NumberOfTicks = 1000; + particleEmitter->Speed = 2.f; + particleEmitter->Spread = glm::pi()/2; + particleEmitter->EmittingAngle = glm::pi(); { auto Pt = m_World->CreateEntity(Pe); @@ -236,11 +240,11 @@ public: auto PtParticle = m_World->AddComponent(Pt); auto PtTemplate = m_World->AddComponent(Pt); - PtTransform->Velocity = glm::vec3(1.0f, 0.f, 0.f); + //PtTransform->Velocity = glm::vec3(1.0f, 0.f, 0.f); PtTransform->Position = transform->Position; PtSprite->SpriteFile = "Textures/Test/Water.png"; PtParticle->LifeTime = 5.f; - PtParticle->Flags = ParticleFlags::Type::powderParticle; + PtParticle->Flags = ParticleFlags::Type::staticPressureParticle; } m_World->CommitEntity(Pe); } @@ -368,7 +372,7 @@ public: auto ent = m_World->CreateEntity(); m_World->SetProperty(ent, "Name", "Pad"); auto ctransform = m_World->AddComponent(ent); - ctransform->Position = glm::vec3(0.f, -3.5f, -10.f); + ctransform->Position = glm::vec3(0.f, -13.5f, -10.f); ctransform->Scale = glm::vec3(1.0f, 1.0f, 1.f); auto rectangle = m_World->AddComponent(ent); auto physics = m_World->AddComponent(ent); diff --git a/include/Physics/CParticleEmitter.h b/include/Physics/CParticleEmitter.h index cc04d2f..033446f 100755 --- a/include/Physics/CParticleEmitter.h +++ b/include/Physics/CParticleEmitter.h @@ -11,9 +11,12 @@ struct ParticleEmitter : public Component { int NumberOfTicks = 10.f; float InitialSpeed = 1.f; - double SpawnRate = 1.f; + double SpawnRate = 1; double TimeSinceLastSpawn = 0; int MaxCount = 0; + float EmittingAngle = 0.f; + float Spread = 0.f; + float Speed = 2.f; //ParticleSystem variables float GravityScale = 1.0f; diff --git a/include/Physics/PhysicsSystem.h b/include/Physics/PhysicsSystem.h index ee5009c..901ba11 100755 --- a/include/Physics/PhysicsSystem.h +++ b/include/Physics/PhysicsSystem.h @@ -2,6 +2,9 @@ #define DAYDREAM_PHYSICSSYSTEM_H #include +#include + +#include #include "Core/System.h" #include "Core/World.h" @@ -65,6 +68,8 @@ private: int m_VelocityIterations, m_PositionIterations; + std::mt19937 gen; + std::unordered_map m_EntitiesToBodies; std::unordered_map m_BodiesToEntities; diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index 7e41a10..53eb258 100755 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -10,6 +10,9 @@ void dd::Systems::PhysicsSystem::RegisterComponents(ComponentFactory* cf) void dd::Systems::PhysicsSystem::Initialize() { + std::random_device rd; + gen = std::mt19937(rd()); + m_ContactListener = new ContactListener(this); m_Gravity = b2Vec2(0.f, -9.82f); @@ -24,6 +27,8 @@ void dd::Systems::PhysicsSystem::Initialize() InitializeWater(); + + EVENT_SUBSCRIBE_MEMBER(m_SetImpulse, PhysicsSystem::SetImpulse); } @@ -382,7 +387,8 @@ void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) LOG_INFO("ParticleTemplate Component is nil."); continue; } - + auto TempTransform = m_World->GetComponent(e); + TempTransform->Orientation = glm::rotate(glm::quat(), 3.f, glm::vec3(0.f, 0.f, -1.f)); emitter->TimeSinceLastSpawn += dt; if(emitter->TimeSinceLastSpawn < emitter->SpawnRate || emitter->NumberOfTicks < 1) { @@ -396,7 +402,15 @@ void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) particleDef.flags = particleTemplate->Flags; //particleDef.color TODO: Implement this if we want color mixing and shit. particleDef.lifetime = particleTemplate->LifeTime; - particleDef.velocity = b2Vec2(templateTransform->Velocity.x, templateTransform->Velocity.y); + float eAngle = emitter->EmittingAngle; + float halfSpread = emitter->Spread / 2; + + std::uniform_real_distribution dis(eAngle-halfSpread, eAngle+halfSpread); + float pAngle = dis(gen); + LOG_INFO("Radian angle: %f", pAngle); + glm::vec2 unitVec = glm::normalize(glm::vec2(glm::cos(pAngle), glm::sin(pAngle))); + glm::vec2 vel = unitVec * emitter->Speed; + particleDef.velocity = b2Vec2(vel.x, vel.y); particleDef.position = b2Vec2(templateTransform->Position.x, templateTransform->Position.y); @@ -405,7 +419,9 @@ void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) auto transform = m_World->GetComponent(particle); transform->Scale = glm::vec3 (particleTemplate->Radius * 2.f, particleTemplate->Radius * 2.f, 1); + auto b2Particle = ps->CreateParticle(particleDef); + auto b2ParticleHandle = ps->GetParticleHandleFromIndex(b2Particle); m_EntitiesToParticleHandle[i].insert(std::make_pair(particle, b2ParticleHandle)); m_ParticleHandleToEntities[i].insert(std::make_pair(b2ParticleHandle, particle));