From 773c6665bdb813e7376d9378571dfa7c150583da Mon Sep 17 00:00:00 2001 From: tleety Date: Fri, 2 Oct 2015 16:35:21 +0200 Subject: [PATCH 1/7] Particles working, still need some more variables implanted though --- include/Core/Engine.h | 81 ++++++++++++++------------- include/Physics/CParticleEmitter.h | 3 +- include/Physics/PhysicsSystem.h | 7 ++- src/game/Physics/PhysicsSystem.cpp | 90 +++++++++++++++++++++--------- 4 files changed, 111 insertions(+), 70 deletions(-) diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 8245052..5a3ebf2 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -207,61 +207,62 @@ public: m_World->CommitEntity(background); } - //ParticleTest -// { -// auto Pe = m_World->CreateEntity(); -// auto transform = m_World->AddComponent(Pe); -// auto particleEmitter= m_World->AddComponent(Pe); -// -// transform->Position = glm::vec3(0.f, -5.f, -10.f); -// particleEmitter->GravityScale = 0.0f; -// particleEmitter->SpawnRate = 1.0f; -// -// { -// auto Pt = m_World->CreateEntity(Pe); -// auto PtTransform = m_World->AddComponent(Pt); -// auto PtSprite = m_World->AddComponent(Pt); -// //auto PtModel = m_World->AddComponent(Pt); -// auto PtParticle = m_World->AddComponent(Pt); -// auto PtTemplate = m_World->AddComponent(Pt); -// -// PtTransform->Velocity = glm::vec3(1.0f, 0.f, 0.f); -// PtTransform->Position = transform->Position; -// PtSprite->SpriteFile = "Textures/Ball.png"; -// -// //PtModel->ModelFile = "Models/Brick/Brick.obj"; -// PtParticle->LifeTime = 1000.f; -// PtParticle->Flags = ParticleFlags::Type::powderParticle; -// } -// m_World->CommitEntity(Pe); -// } - -// { -// auto Pt = m_World->CreateEntity(); -// auto PtTransform = m_World->AddComponent(Pt); -// auto PtSprite = m_World->AddComponent(Pt); -// -// PtTransform->Position = glm::vec3(2.f, 0.f, -10.f); -// PtSprite->SpriteFile = "Textures/Ball.png"; -// } - //Water test { auto t_waterBody = m_World->CreateEntity(); auto transform = m_World->AddComponent(t_waterBody); transform->Position = glm::vec3(0.f, -5.5f, -10.f); - transform->Scale = glm::vec3(7.f, 1.5f, 1.f); + transform->Scale = glm::vec3(0.2f, 0.2f, 1.f); auto water = m_World->AddComponent(t_waterBody); auto body = m_World->AddComponent(t_waterBody); m_World->CommitEntity(t_waterBody); } + //ParticleTest + { + auto Pe = m_World->CreateEntity(); + auto transform = m_World->AddComponent(Pe); + auto particleEmitter= m_World->AddComponent(Pe); + + transform->Position = glm::vec3(0.f, -5.f, -10.f); + particleEmitter->GravityScale = 0.0f; + particleEmitter->SpawnRate = 1.0f; + particleEmitter->NumberOfTicks = 3.f; + + { + auto Pt = m_World->CreateEntity(Pe); + auto PtTransform = m_World->AddComponent(Pt); + auto PtSprite = m_World->AddComponent(Pt); + auto PtParticle = m_World->AddComponent(Pt); + auto PtTemplate = m_World->AddComponent(Pt); + + 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; + } + m_World->CommitEntity(Pe); + } + + { + auto Pt = m_World->CreateEntity(); + auto PtTransform = m_World->AddComponent(Pt); + auto PtSprite = m_World->AddComponent(Pt); + auto PtParticle = m_World->AddComponent(Pt); + + PtTransform->Velocity = glm::vec3(1.0f, 0.f, 0.f); + PtTransform->Position = glm::vec3(0.f, 0.f, -10.f); + PtSprite->SpriteFile = "Textures/Ball.png"; + //PtModel->ModelFile = "Models/Brick/Brick.obj"; + } + //TODO: Why does the ball not collide with these bricks? //BottomBox { auto topWall = m_World->CreateEntity(); auto transform = m_World->AddComponent(topWall); - transform->Position = glm::vec3(0.f, -6.f, -9.9f); + transform->Position = glm::vec3(0.f, -7.f, -9.9f); transform->Scale = glm::vec3(10.f, 0.5f, 1.f); std::shared_ptr sprite = m_World->AddComponent(topWall); sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; diff --git a/include/Physics/CParticleEmitter.h b/include/Physics/CParticleEmitter.h index a965a84..cc04d2f 100755 --- a/include/Physics/CParticleEmitter.h +++ b/include/Physics/CParticleEmitter.h @@ -9,10 +9,11 @@ namespace Components struct ParticleEmitter : public Component { - int Amount = 10.f; + int NumberOfTicks = 10.f; float InitialSpeed = 1.f; double SpawnRate = 1.f; double TimeSinceLastSpawn = 0; + int MaxCount = 0; //ParticleSystem variables float GravityScale = 1.0f; diff --git a/include/Physics/PhysicsSystem.h b/include/Physics/PhysicsSystem.h index 02e3e06..ee5009c 100755 --- a/include/Physics/PhysicsSystem.h +++ b/include/Physics/PhysicsSystem.h @@ -70,13 +70,16 @@ private: void CreateBody(EntityID entity); - std::vector m_ParticleSystem; + b2ParticleSystem* m_WaterParticleSystem; std::vector t_ParticleGroup; + std::unordered_map m_EntitiesToWaterParticleHandle; + std::unordered_map m_WaterParticleHandleToEntities; + std::vector> m_EntitiesToParticleHandle; std::vector> m_ParticleHandleToEntities; - b2ParticleSystem* CreateParticleSystem(float radius, float gravityScale); + b2ParticleSystem* CreateParticleSystem(float radius, float gravityScale, int maxCount); void InitializeWater(); void CreateParticleGroup(EntityID entity); void CreateParticleEmitter(EntityID entity); diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index e13d374..7e41a10 100755 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -31,7 +31,14 @@ void dd::Systems::PhysicsSystem::InitializeWater() { float radius = 0.13f; float gravityScale = 1.0f; - CreateParticleSystem(radius, gravityScale); + + b2ParticleSystemDef m_ParticleSystemDef; + m_ParticleSystemDef.radius = radius; + m_ParticleSystemDef.gravityScale = gravityScale; + + m_WaterParticleSystem = m_PhysicsWorld->CreateParticleSystem(&m_ParticleSystemDef); + + } bool dd::Systems::PhysicsSystem::SetImpulse(const Events::SetImpulse &event) @@ -77,7 +84,6 @@ void dd::Systems::PhysicsSystem::Update(double dt) { LOG_ERROR("RigidBody with no PhysicsComponent"); } - if (body == nullptr) { LOG_ERROR("This body should not exist"); continue; @@ -146,8 +152,32 @@ void dd::Systems::PhysicsSystem::Update(double dt) { } } + + + //water + b2Vec2 *positionBuffer = m_WaterParticleSystem->GetPositionBuffer(); + for (auto i : m_EntitiesToWaterParticleHandle){ + EntityID entity = i.first; + b2ParticleHandle *particleH = i.second; + + + b2Vec2 positionB2 = positionBuffer[particleH->GetIndex()]; + glm::vec2 position = glm::vec2(positionB2.x, positionB2.y); + + EntityID entityParent = m_World->GetEntityParent(entity); + glm::vec3 parentTransform = glm::vec3(0.f); + if(entityParent) { + auto tp = m_World->GetComponent(entityParent); + parentTransform = tp->Position; + } + auto transform = m_World->GetComponent(entity); + + transform->Position = glm::vec3(position.x, position.y, -10); + } + + //Normal particles for ( int e = 0; e < m_EntitiesToParticleHandle.size(); e++) { - b2Vec2 *positionBuffer = m_ParticleSystem[e]->GetPositionBuffer(); + b2Vec2 *positionBuffer = m_ParticleEmitters.ParticleSystem[e]->GetPositionBuffer(); for (auto i : m_EntitiesToParticleHandle[e]){ EntityID entity = i.first; b2ParticleHandle *particleH = i.second; @@ -163,8 +193,7 @@ void dd::Systems::PhysicsSystem::Update(double dt) { } auto transform = m_World->GetComponent(entity); - transform->Position = glm::vec3(position.x, position.y, -10) - parentTransform; - + transform->Position = glm::vec3(position.x, position.y, -10); } } @@ -280,7 +309,7 @@ void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) if(physicsComponent->Static) { - body->CreateFixture(&fixtureDef); //Density kanske ska vara 0 på statiska kroppar + body->CreateFixture(&fixtureDef); //Density kanske ska vara 0 p� statiska kroppar } else { fixtureDef.shape = pShape; @@ -314,19 +343,19 @@ void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) pd.shape = &shape; pd.flags = b2_tensileParticle; pd.position.Set(transform->Position.x, transform->Position.y); - t_ParticleGroup.push_back(m_ParticleSystem[0]->CreateParticleGroup(pd)); - b2Vec2* t_ParticlePositions = m_ParticleSystem[0]->GetPositionBuffer(); - for(int i = 0; i < m_ParticleSystem[0]->GetParticleCount(); i++){ + t_ParticleGroup.push_back(m_WaterParticleSystem->CreateParticleGroup(pd)); + b2Vec2* t_ParticlePositions = m_WaterParticleSystem->GetPositionBuffer(); + for(int i = 0; i < m_WaterParticleSystem->GetParticleCount(); i++){ { auto t_waterparticle = m_World->CreateEntity(e); auto transformChild = m_World->AddComponent(t_waterparticle); transformChild->Position = glm::vec3(t_ParticlePositions[i].x - transform->Position.x, t_ParticlePositions[i].y - transform->Position.y, -9.5f); - transformChild->Scale = glm::vec3(m_ParticleSystem[0]->GetRadius())/transform->Scale; + transformChild->Scale = glm::vec3(m_WaterParticleSystem->GetRadius())/transform->Scale; m_World->CommitEntity(t_waterparticle); - m_EntitiesToParticleHandle[0].insert(std::make_pair(t_waterparticle, m_ParticleSystem[0]->GetParticleHandleFromIndex(i))); - m_ParticleHandleToEntities[0].insert(std::make_pair( m_ParticleSystem[0]->GetParticleHandleFromIndex(i), t_waterparticle)); + m_EntitiesToWaterParticleHandle.insert(std::make_pair(t_waterparticle, m_WaterParticleSystem->GetParticleHandleFromIndex(i))); + m_WaterParticleHandleToEntities.insert(std::make_pair(m_WaterParticleSystem->GetParticleHandleFromIndex(i), t_waterparticle)); } } @@ -336,6 +365,7 @@ void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) { + //TODO: ParticleEmitters system are more than one? Wtf? for (int i = 0; i < m_ParticleEmitters.ParticleSystem.size(); i++) { auto e = m_ParticleEmitters.ParticleEmitter[i]; auto pt = m_ParticleEmitters.ParticleTemplate[i]; @@ -344,10 +374,21 @@ void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) auto emitter = m_World->GetComponent(e); auto particleTemplate = m_World->GetComponent(pt); - emitter->TimeSinceLastSpawn += dt; - if(emitter->TimeSinceLastSpawn < emitter->SpawnRate) { + if(!emitter) { + LOG_INFO("ParticleEmitter Component is nil"); continue; } + if(!particleTemplate) { + LOG_INFO("ParticleTemplate Component is nil."); + continue; + } + + + emitter->TimeSinceLastSpawn += dt; + if(emitter->TimeSinceLastSpawn < emitter->SpawnRate || emitter->NumberOfTicks < 1) { + continue; + } + emitter->NumberOfTicks--; emitter->TimeSinceLastSpawn -= emitter->SpawnRate; auto templateTransform = m_World->GetComponent(pt); @@ -358,21 +399,16 @@ void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) particleDef.velocity = b2Vec2(templateTransform->Velocity.x, templateTransform->Velocity.y); particleDef.position = b2Vec2(templateTransform->Position.x, templateTransform->Position.y); + auto particle = m_World->CloneEntity(pt, 0); m_World->RemoveComponent(particle); + 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)); - - //TODO: Ta bort detta - int particles = 0; - for (auto i : m_EntitiesToParticleHandle) - { - particles += i.size(); - } - LOG_INFO("--I have %i particles.", particles); } } @@ -406,13 +442,14 @@ void dd::Systems::PhysicsSystem::CreateParticleEmitter(EntityID entity) pf++; } //TODO: Skicka med fler flaggor till particlesystemet; - m_ParticleEmitters.ParticleSystem.push_back(CreateParticleSystem(particle->Radius, 0.f)); + + m_ParticleEmitters.ParticleSystem.push_back(CreateParticleSystem(particle->Radius, 0.f, 0)); m_ParticleEmitters.ParticleEmitter.push_back(entity); m_ParticleEmitters.ParticleTemplate.push_back(childEntity); } -b2ParticleSystem* dd::Systems::PhysicsSystem::CreateParticleSystem(float radius, float gravityScale) +b2ParticleSystem* dd::Systems::PhysicsSystem::CreateParticleSystem(float radius, float gravityScale, int maxCount) { std::unordered_map m1; std::unordered_map m2; @@ -420,12 +457,11 @@ b2ParticleSystem* dd::Systems::PhysicsSystem::CreateParticleSystem(float radius, m_ParticleHandleToEntities.push_back(m2); b2ParticleSystemDef m_ParticleSystemDef; + m_ParticleSystemDef.maxCount = maxCount; m_ParticleSystemDef.radius = radius; m_ParticleSystemDef.gravityScale = gravityScale; - m_ParticleSystem.push_back(m_PhysicsWorld->CreateParticleSystem(&m_ParticleSystemDef)); - - return m_ParticleSystem.back(); + return m_PhysicsWorld->CreateParticleSystem(&m_ParticleSystemDef); } dd::Systems::PhysicsSystem::~PhysicsSystem() From ca810743b2666e227bec0a1e5049cf1505193b8e Mon Sep 17 00:00:00 2001 From: Stiffly Date: Tue, 6 Oct 2015 13:38:40 +0200 Subject: [PATCH 2/7] 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)); From 8b12c1036dae99f36f1b3544d1edf77e43f7e5f1 Mon Sep 17 00:00:00 2001 From: Stiffly Date: Tue, 6 Oct 2015 21:42:54 +0200 Subject: [PATCH 3/7] Partycles. --- deps/include/Box2D/Dynamics/b2World.h | 3 +- .../Box2D/Particle/b2ParticleSystem.cpp | 2 +- .../include/Box2D/Particle/b2ParticleSystem.h | 4 +- include/Core/Engine.h | 21 ++--- include/Physics/CParticleEmitter.h | 1 + include/Physics/PhysicsSystem.h | 51 ++++++++++- src/game/Core/Renderer.cpp | 5 +- src/game/Physics/PhysicsSystem.cpp | 86 +++++++++++++------ 8 files changed, 124 insertions(+), 49 deletions(-) diff --git a/deps/include/Box2D/Dynamics/b2World.h b/deps/include/Box2D/Dynamics/b2World.h index ce0b8c1..de9d25a 100644 --- a/deps/include/Box2D/Dynamics/b2World.h +++ b/deps/include/Box2D/Dynamics/b2World.h @@ -53,7 +53,8 @@ public: /// Register a destruction listener. The listener is owned by you and must /// remain in scope. - void SetDestructionListener(b2DestructionListener* listener); + void + SetDestructionListener(b2DestructionListener* listener); /// Register a contact filter to provide specific control over collision. /// Otherwise the default filter is used (b2_defaultFilter). The listener is diff --git a/deps/include/Box2D/Particle/b2ParticleSystem.cpp b/deps/include/Box2D/Particle/b2ParticleSystem.cpp index ce1c01e..4863f4d 100644 --- a/deps/include/Box2D/Particle/b2ParticleSystem.cpp +++ b/deps/include/Box2D/Particle/b2ParticleSystem.cpp @@ -654,7 +654,7 @@ int32 b2ParticleSystem::CreateParticle(const b2ParticleDef& def) // If the oldest particle should be destroyed... if (m_def.destroyByAge) { - DestroyOldestParticle(0, false); + DestroyOldestParticle(0, true); // Need to destroy this particle *now* so that it's possible to // create a new particle. SolveZombie(); diff --git a/deps/include/Box2D/Particle/b2ParticleSystem.h b/deps/include/Box2D/Particle/b2ParticleSystem.h index fc27419..117bf33 100644 --- a/deps/include/Box2D/Particle/b2ParticleSystem.h +++ b/deps/include/Box2D/Particle/b2ParticleSystem.h @@ -299,7 +299,7 @@ public: /// b2World::Step()). void DestroyParticle(int32 index) { - DestroyParticle(index, false); + DestroyParticle(index, true); } /// Destroy a particle. @@ -330,7 +330,7 @@ public: /// @return Number of particles destroyed. int32 DestroyParticlesInShape(const b2Shape& shape, const b2Transform& xf) { - return DestroyParticlesInShape(shape, xf, false); + return DestroyParticlesInShape(shape, xf, true); } /// Destroy particles inside a shape. diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 187d149..d2729e9 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -227,9 +227,10 @@ public: transform->Position = glm::vec3(0.f, 0.f, -10.f); particleEmitter->GravityScale = 0.0f; - particleEmitter->SpawnRate = 0.1f; + particleEmitter->SpawnRate = 1.1f; particleEmitter->NumberOfTicks = 1000; particleEmitter->Speed = 2.f; + particleEmitter->ParticlesPerTick = 5; particleEmitter->Spread = glm::pi()/2; particleEmitter->EmittingAngle = glm::pi(); @@ -242,25 +243,13 @@ public: //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::staticPressureParticle; + PtSprite->SpriteFile = "Textures/Background.png"; + PtParticle->LifeTime = 1.f; + PtParticle->Flags = ParticleFlags::Type::powderParticle | ParticleFlags::Type::particleContactFilterParticle | ParticleFlags::Type::fixtureContactFilterParticle; } m_World->CommitEntity(Pe); } - { - auto Pt = m_World->CreateEntity(); - auto PtTransform = m_World->AddComponent(Pt); - auto PtSprite = m_World->AddComponent(Pt); - auto PtParticle = m_World->AddComponent(Pt); - - PtTransform->Velocity = glm::vec3(1.0f, 0.f, 0.f); - PtTransform->Position = glm::vec3(0.f, 0.f, -10.f); - PtSprite->SpriteFile = "Textures/Ball.png"; - //PtModel->ModelFile = "Models/Brick/Brick.obj"; - } - //TODO: Why does the ball not collide with these bricks? //BottomBox { diff --git a/include/Physics/CParticleEmitter.h b/include/Physics/CParticleEmitter.h index 033446f..1ef112e 100755 --- a/include/Physics/CParticleEmitter.h +++ b/include/Physics/CParticleEmitter.h @@ -12,6 +12,7 @@ struct ParticleEmitter : public Component int NumberOfTicks = 10.f; float InitialSpeed = 1.f; double SpawnRate = 1; + int ParticlesPerTick = 1; double TimeSinceLastSpawn = 0; int MaxCount = 0; float EmittingAngle = 0.f; diff --git a/include/Physics/PhysicsSystem.h b/include/Physics/PhysicsSystem.h index 901ba11..b11f84b 100755 --- a/include/Physics/PhysicsSystem.h +++ b/include/Physics/PhysicsSystem.h @@ -36,6 +36,7 @@ namespace Systems class PhysicsSystem : public System { friend class ContractListener; + friend class DestructionListener; public: PhysicsSystem(World* world, std::shared_ptr eventBroker) @@ -108,7 +109,36 @@ private: }; std::list m_Impulses; + class DestructionListener : public b2DestructionListener + { + public: + DestructionListener(PhysicsSystem* physicsSystem) + : m_PhysicsSystem(physicsSystem) { } + void SayGoodbye(b2Joint*) {LOG_INFO("joint körs");}; + void SayGoodbye(b2Fixture*) {LOG_INFO("Fixture körs");}; + + void SayGoodbye(b2ParticleSystem* particleSystem, int32 index) override + { + LOG_INFO("Particle ded"); + + + b2ParticleHandle* handle = particleSystem->GetParticleHandleFromIndex(index); + for (int i = 0; i < m_PhysicsSystem->m_ParticleEmitters.ParticleSystem.size(); i++) { + if(m_PhysicsSystem->m_ParticleEmitters.ParticleSystem[i] == particleSystem) { + std::unordered_map::iterator it = m_PhysicsSystem->m_ParticleHandleToEntities[i].find(handle); + if(it != m_PhysicsSystem->m_ParticleHandleToEntities[i].end()) { + EntityID id = it->second; + m_PhysicsSystem->m_World->RemoveEntity(id); + m_PhysicsSystem->m_ParticleHandleToEntities[i].erase(it); + LOG_INFO("Removing from list"); + } + } + } + } + private: + PhysicsSystem* m_PhysicsSystem; + }; class ContactListener : public b2ContactListener { @@ -130,6 +160,7 @@ private: m_PhysicsSystem->EventBroker->Publish(e); } + void EndContact(b2Contact* contact) { @@ -149,7 +180,6 @@ private: } } - } void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) { @@ -160,6 +190,25 @@ private: PhysicsSystem* m_PhysicsSystem; }; + class ParticleContactDisabler : public b2ContactFilter + { + public: + ParticleContactDisabler() { }; + + //Particles to particles + virtual bool ShouldCollide(b2ParticleSystem *particleSystem, int32 particleIndexA, int32 particleIndexB) + { + return false; + } + virtual bool ShouldCollide(b2Fixture* fixture, b2ParticleSystem* particleSystem, int32 particleIndex) + { + return false; + } + + }; + + DestructionListener* m_DestructionListener; + ParticleContactDisabler m_ParticleContactDisabler; ContactListener* m_ContactListener; }; diff --git a/src/game/Core/Renderer.cpp b/src/game/Core/Renderer.cpp index 6abf221..7f33a53 100755 --- a/src/game/Core/Renderer.cpp +++ b/src/game/Core/Renderer.cpp @@ -358,12 +358,10 @@ void dd::Renderer::DrawForward(RenderQueue &objects, RenderQueue &lights) { // Forward-render semi-transparent objects on top of the current framebuffer glDisable(GL_CULL_FACE); - glCullFace(GL_BACK); glDepthMask(GL_TRUE); glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); - //glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD); - glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBindFramebuffer(GL_FRAMEBUFFER, m_FbDeferred3); // glClearColor(1, 0.9, 0.8f, 1); @@ -444,7 +442,6 @@ void dd::Renderer::DrawScene(RenderQueue &objects, ShaderProgram &program) glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "V"), 1, GL_FALSE, glm::value_ptr(viewMatrix)); glUniform4fv(glGetUniformLocation(shaderProgramHandle, "Color"), 1, glm::value_ptr(modelJob->Color)); - glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, spriteJob->DiffuseTexture); glActiveTexture(GL_TEXTURE1); diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index 53eb258..97b2629 100755 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -13,6 +13,7 @@ void dd::Systems::PhysicsSystem::Initialize() std::random_device rd; gen = std::mt19937(rd()); + m_DestructionListener = new DestructionListener(this); m_ContactListener = new ContactListener(this); m_Gravity = b2Vec2(0.f, -9.82f); @@ -24,6 +25,8 @@ void dd::Systems::PhysicsSystem::Initialize() m_Accumulator = 0.f; m_PhysicsWorld->SetContactListener(m_ContactListener); + m_PhysicsWorld->SetContactFilter(&m_ParticleContactDisabler); + m_PhysicsWorld->SetDestructionListener(m_DestructionListener); InitializeWater(); @@ -198,7 +201,7 @@ void dd::Systems::PhysicsSystem::Update(double dt) { } auto transform = m_World->GetComponent(entity); - transform->Position = glm::vec3(position.x, position.y, -10); + transform->Position = glm::vec3(position.x, position.y, transform->Position.z); } } @@ -209,7 +212,28 @@ void dd::Systems::PhysicsSystem::Update(double dt) { void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { + auto particle = m_World->GetComponent(entity); + auto pTemplate = m_World->GetComponent(entity); + if (particle && !pTemplate) { + particle->LifeTime -= dt; + if (particle->LifeTime <= 0) { + for (int i = 0; i < m_EntitiesToParticleHandle.size(); i++) { + b2ParticleHandle* handle = m_EntitiesToParticleHandle[i][entity]; + std::unordered_map::iterator iter1; + std::unordered_map::iterator iter2; + iter1 = m_EntitiesToParticleHandle[i].find(entity); + iter2 = m_ParticleHandleToEntities[i].find(handle); + if (iter1 != m_EntitiesToParticleHandle[i].end()) { + m_EntitiesToParticleHandle[i].erase(iter1); + } + if (iter2 != m_ParticleHandleToEntities[i].end()) { + m_ParticleHandleToEntities[i].erase(iter2); + } + m_World->RemoveEntity(entity); + } + } + } } void dd::Systems::PhysicsSystem::OnEntityCommit(EntityID entity) @@ -370,11 +394,12 @@ void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) { - //TODO: ParticleEmitters system are more than one? Wtf? + int pSizeTest = 0; for (int i = 0; i < m_ParticleEmitters.ParticleSystem.size(); i++) { auto e = m_ParticleEmitters.ParticleEmitter[i]; auto pt = m_ParticleEmitters.ParticleTemplate[i]; auto ps = m_ParticleEmitters.ParticleSystem[i]; + pSizeTest += ps->GetParticleCount(); auto emitter = m_World->GetComponent(e); @@ -397,35 +422,47 @@ void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) emitter->NumberOfTicks--; emitter->TimeSinceLastSpawn -= emitter->SpawnRate; auto templateTransform = m_World->GetComponent(pt); - b2ParticleDef particleDef; - particleDef.flags = particleTemplate->Flags; - //particleDef.color TODO: Implement this if we want color mixing and shit. - particleDef.lifetime = particleTemplate->LifeTime; - float eAngle = emitter->EmittingAngle; - float halfSpread = emitter->Spread / 2; + for ( int j = 0; j < emitter->ParticlesPerTick; j++) { + LOG_INFO("Creating particle #%i", j); + particleDef.flags = particleTemplate->Flags; + //particleDef.color TODO: Implement this if we want color mixing and shit. + particleDef.lifetime = particleTemplate->LifeTime; + 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); + std::uniform_real_distribution dis(eAngle - halfSpread, eAngle + halfSpread); + float pAngle = dis(gen); + 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); - auto particle = m_World->CloneEntity(pt, 0); - m_World->RemoveComponent(particle); - auto transform = m_World->GetComponent(particle); - transform->Scale = glm::vec3 (particleTemplate->Radius * 2.f, particleTemplate->Radius * 2.f, 1); + auto particle = m_World->CloneEntity(pt, 0); + m_World->RemoveComponent(particle); + auto transform2 = m_World->GetComponent(particle); + + std::uniform_real_distribution dist(0, 1); + float zDistribution = dist(gen); + transform2->Position = glm::vec3(transform2->Position.x, transform2->Position.y, -9.5f + zDistribution); + transform2->Scale = glm::vec3(particleTemplate->Radius * 2.f, particleTemplate->Radius * 2.f, 1); - auto b2Particle = ps->CreateParticle(particleDef); + 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)); + auto b2ParticleHandle = ps->GetParticleHandleFromIndex(b2Particle); + m_EntitiesToParticleHandle[i].insert(std::make_pair(particle, b2ParticleHandle)); + m_ParticleHandleToEntities[i].insert(std::make_pair(b2ParticleHandle, particle)); + } } + int stp = 0; + for (auto ts : m_EntitiesToParticleHandle) + { + stp += ts.size(); + } + LOG_INFO("Particles in list: %i", stp); + LOG_INFO("Particles: %i", pSizeTest); } void dd::Systems::PhysicsSystem::CreateParticleEmitter(EntityID entity) @@ -443,7 +480,7 @@ void dd::Systems::PhysicsSystem::CreateParticleEmitter(EntityID entity) auto particleTemplate = m_World->GetComponent(c); if (!p) { continue; - LOG_WARNING("--ParticleEmitter's Child is not a particle."); + LOG_WARNING("ParticleEmitter's Child is not a particle."); } if(!particleTemplate) { LOG_ERROR("ParticleEmitter's particleChild is not a template."); @@ -476,6 +513,7 @@ b2ParticleSystem* dd::Systems::PhysicsSystem::CreateParticleSystem(float radius, m_ParticleSystemDef.maxCount = maxCount; m_ParticleSystemDef.radius = radius; m_ParticleSystemDef.gravityScale = gravityScale; + m_ParticleSystemDef.destroyByAge = true; return m_PhysicsWorld->CreateParticleSystem(&m_ParticleSystemDef); } From db2d6ad6e456beaca5ad5b85466cc23666e388d8 Mon Sep 17 00:00:00 2001 From: Stiffly Date: Wed, 7 Oct 2015 17:22:45 +0200 Subject: [PATCH 4/7] =?UTF-8?q?Eventbaserade=20partiklar.=20Fick=20n=C3=A5?= =?UTF-8?q?n=20krasch=20i=20physicssystem=20efter=20ett=20tags=20spelande,?= =?UTF-8?q?=20men=20det=20hoppas=20jag=20l=C3=B6ser=20sig=20n=C3=A4r=20jag?= =?UTF-8?q?=20mergar=20in=20Viktors=20senaste=20fysikfixar=20:3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/Core/Engine.h | 40 +++++++++---- include/Physics/CParticleEmitter.h | 1 + include/Physics/ECreateParticleSequence.h | 37 ++++++++++++ include/Physics/PhysicsSystem.h | 4 ++ include/Sound/SoundSystem.h | 2 + src/game/Physics/PhysicsSystem.cpp | 72 ++++++++++++++++++++++- src/game/Sound/SoundSystem.cpp | 27 +++++++-- 7 files changed, 165 insertions(+), 18 deletions(-) create mode 100644 include/Physics/ECreateParticleSequence.h diff --git a/include/Core/Engine.h b/include/Core/Engine.h index d2729e9..f55f5f4 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -137,7 +137,6 @@ public: //OctoBall - /* { auto ent = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(ent); @@ -159,7 +158,7 @@ public: plight->Radius = 2.f; m_World->CommitEntity(ent); - }*/ + } //PointLightTest { @@ -212,8 +211,8 @@ public: { auto t_waterBody = m_World->CreateEntity(); auto transform = m_World->AddComponent(t_waterBody); - transform->Position = glm::vec3(0.f, -5.5f, -10.f); - transform->Scale = glm::vec3(0.2f, 0.2f, 1.f); + transform->Position = glm::vec3(0.f, -3.5f, -10.f); + transform->Scale = glm::vec3(7.0f, 1.5f, 1.f); auto water = m_World->AddComponent(t_waterBody); auto body = m_World->AddComponent(t_waterBody); m_World->CommitEntity(t_waterBody); @@ -221,18 +220,37 @@ public: //ParticleTest { + Events::CreateParticleSequence e; + e.Position = glm::vec3(0.f, 0.f, -10.f); + e.SpriteFile = "Textures/Background.png"; + e.GravityScale = 0.0f; + e.SpawnRate = 1.f; + e.NumberOfTicks = 2; + e.Speed = 1.f; + e.ParticlesPerTick = 5; + e.Spread = glm::pi() * 2; + e.EmittingAngle = glm::pi(); + e.EmitterLifeTime = 50; + e.ParticleLifeTime = 3.f; + m_EventBroker->Publish(e); + } + + /*{ auto Pe = m_World->CreateEntity(); auto transform = m_World->AddComponent(Pe); auto particleEmitter= m_World->AddComponent(Pe); + auto emitteSprite = m_World->AddComponent(Pe); transform->Position = glm::vec3(0.f, 0.f, -10.f); + emitteSprite->SpriteFile = "Textures/Test/Brick_Normal.png"; particleEmitter->GravityScale = 0.0f; - particleEmitter->SpawnRate = 1.1f; - particleEmitter->NumberOfTicks = 1000; - particleEmitter->Speed = 2.f; + particleEmitter->SpawnRate = 1.f; + particleEmitter->NumberOfTicks = 2; + particleEmitter->Speed = 1.f; particleEmitter->ParticlesPerTick = 5; - particleEmitter->Spread = glm::pi()/2; + particleEmitter->Spread = glm::pi()*2; particleEmitter->EmittingAngle = glm::pi(); + particleEmitter->LifeTime = 50; { auto Pt = m_World->CreateEntity(Pe); @@ -244,11 +262,11 @@ public: //PtTransform->Velocity = glm::vec3(1.0f, 0.f, 0.f); PtTransform->Position = transform->Position; PtSprite->SpriteFile = "Textures/Background.png"; - PtParticle->LifeTime = 1.f; + PtParticle->LifeTime = 3.f; PtParticle->Flags = ParticleFlags::Type::powderParticle | ParticleFlags::Type::particleContactFilterParticle | ParticleFlags::Type::fixtureContactFilterParticle; } m_World->CommitEntity(Pe); - } + }*/ //TODO: Why does the ball not collide with these bricks? //BottomBox @@ -361,7 +379,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, -13.5f, -10.f); + ctransform->Position = glm::vec3(0.f, -3.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 1ef112e..56dd83c 100755 --- a/include/Physics/CParticleEmitter.h +++ b/include/Physics/CParticleEmitter.h @@ -18,6 +18,7 @@ struct ParticleEmitter : public Component float EmittingAngle = 0.f; float Spread = 0.f; float Speed = 2.f; + double LifeTime = 100; //ParticleSystem variables float GravityScale = 1.0f; diff --git a/include/Physics/ECreateParticleSequence.h b/include/Physics/ECreateParticleSequence.h new file mode 100644 index 0000000..1df3db6 --- /dev/null +++ b/include/Physics/ECreateParticleSequence.h @@ -0,0 +1,37 @@ +#ifndef EVENTS_ECREATEPARTICLESEQUENCE_H__ +#define EVENTS_ECREATEPARTICLESEQUENCE_H__ + +#include "Core/EventBroker.h" +#include "Physics/CParticle.h" + +namespace dd +{ +namespace Events +{ + +struct CreateParticleSequence : public Event +{ + //Emitter + double EmitterLifeTime = 100; + glm::vec3 Position = glm::vec3(0); + float GravityScale = 0.f; + float SpawnRate = 1.f; + int NumberOfTicks = 100; + float Speed = 1.f; + int ParticlesPerTick = 1.f; + float Spread = glm::pi(); + float EmittingAngle = glm::two_pi(); + float MaxCount = 0; + + //Particle + std::string SpriteFile = "Texures/Core/ErrorTexture.png"; + double ParticleLifeTime = 3.f; + ParticleFlags::Type Flags = ParticleFlags::Type::powderParticle | ParticleFlags::Type::particleContactFilterParticle | ParticleFlags::Type::fixtureContactFilterParticle; + float Radius = 1.f; +}; + +} +} + +#endif + diff --git a/include/Physics/PhysicsSystem.h b/include/Physics/PhysicsSystem.h index b11f84b..aace1fb 100755 --- a/include/Physics/PhysicsSystem.h +++ b/include/Physics/PhysicsSystem.h @@ -15,6 +15,7 @@ #include "Transform/TransformSystem.h" #include "Physics/EContact.h" #include "Physics/ESetImpulse.h" +#include "Physics/ECreateParticleSequence.h" #include "Physics/CCircleShape.h" #include "Core/EventBroker.h" #include "Game/CPad.h" @@ -47,6 +48,9 @@ public: EventRelay m_SetImpulse; bool SetImpulse(const Events::SetImpulse &event); + EventRelay m_ECreateParticleSequence; + bool CreateParticleSequence(const Events::CreateParticleSequence &event); + void RegisterComponents(ComponentFactory* cf) override; void Initialize() override; diff --git a/include/Sound/SoundSystem.h b/include/Sound/SoundSystem.h index 32dd05e..1cb981a 100644 --- a/include/Sound/SoundSystem.h +++ b/include/Sound/SoundSystem.h @@ -18,6 +18,8 @@ #include "Sound/CCollisionSound.h" #include "Core/ResourceManager.h" +#include "Physics/ECreateParticleSequence.h" + namespace dd { diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index 97b2629..3eaa8f7 100755 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -33,6 +33,8 @@ void dd::Systems::PhysicsSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_SetImpulse, PhysicsSystem::SetImpulse); + EVENT_SUBSCRIBE_MEMBER(m_ECreateParticleSequence, &PhysicsSystem::CreateParticleSequence); + } void dd::Systems::PhysicsSystem::InitializeWater() @@ -186,6 +188,9 @@ void dd::Systems::PhysicsSystem::Update(double dt) { //Normal particles for ( int e = 0; e < m_EntitiesToParticleHandle.size(); e++) { b2Vec2 *positionBuffer = m_ParticleEmitters.ParticleSystem[e]->GetPositionBuffer(); + if(!positionBuffer) { + break; + } for (auto i : m_EntitiesToParticleHandle[e]){ EntityID entity = i.first; b2ParticleHandle *particleH = i.second; @@ -394,6 +399,7 @@ void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) { + std::vector emittersToDelete; int pSizeTest = 0; for (int i = 0; i < m_ParticleEmitters.ParticleSystem.size(); i++) { auto e = m_ParticleEmitters.ParticleEmitter[i]; @@ -416,6 +422,12 @@ void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) TempTransform->Orientation = glm::rotate(glm::quat(), 3.f, glm::vec3(0.f, 0.f, -1.f)); emitter->TimeSinceLastSpawn += dt; + emitter->LifeTime -= dt; + + if (emitter->LifeTime <= 0 || emitter->NumberOfTicks <= 0) { + emittersToDelete.push_back(e); + continue; + } if(emitter->TimeSinceLastSpawn < emitter->SpawnRate || emitter->NumberOfTicks < 1) { continue; } @@ -424,7 +436,6 @@ void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) auto templateTransform = m_World->GetComponent(pt); b2ParticleDef particleDef; for ( int j = 0; j < emitter->ParticlesPerTick; j++) { - LOG_INFO("Creating particle #%i", j); particleDef.flags = particleTemplate->Flags; //particleDef.color TODO: Implement this if we want color mixing and shit. particleDef.lifetime = particleTemplate->LifeTime; @@ -456,13 +467,68 @@ void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) m_ParticleHandleToEntities[i].insert(std::make_pair(b2ParticleHandle, particle)); } } + + for (int i = 0; i < emittersToDelete.size(); i++) + { + EntityID ent = emittersToDelete[i]; + int key; + for(key = 0; key < m_ParticleEmitters.ParticleEmitter.size(); key++) { + if (m_ParticleEmitters.ParticleEmitter[key] == ent) { + break; + } + } + + if (m_ParticleEmitters.ParticleSystem[key]->GetParticleCount() == 0 && key <= m_ParticleEmitters.ParticleSystem.size()) { + m_World->RemoveEntity(ent); + m_PhysicsWorld->DestroyParticleSystem(m_ParticleEmitters.ParticleSystem[key]); + m_ParticleEmitters.ParticleSystem.erase(m_ParticleEmitters.ParticleSystem.begin() + key); + m_ParticleEmitters.ParticleEmitter.erase(m_ParticleEmitters.ParticleEmitter.begin() + key); + m_ParticleEmitters.ParticleTemplate.erase(m_ParticleEmitters.ParticleTemplate.begin() + key); + m_EntitiesToParticleHandle.erase(m_EntitiesToParticleHandle.begin() + key); + m_ParticleHandleToEntities.erase(m_ParticleHandleToEntities.begin() + key); + } + } + int stp = 0; for (auto ts : m_EntitiesToParticleHandle) { stp += ts.size(); } - LOG_INFO("Particles in list: %i", stp); - LOG_INFO("Particles: %i", pSizeTest); +} + +bool dd::Systems::PhysicsSystem::CreateParticleSequence(const Events::CreateParticleSequence &event) +{ + //Creating Emitter + auto emitter = m_World->CreateEntity(); + auto emitterTransform = m_World->AddComponent(emitter); + auto particleEmitter= m_World->AddComponent(emitter); + + emitterTransform->Position = event.Position; + particleEmitter->GravityScale = event.GravityScale; + particleEmitter->SpawnRate = event.SpawnRate; + particleEmitter->NumberOfTicks = event.NumberOfTicks; + particleEmitter->Speed = event.Speed; + particleEmitter->ParticlesPerTick = event.ParticlesPerTick; + particleEmitter->Spread = event.Spread; + particleEmitter->EmittingAngle = event.EmittingAngle; + particleEmitter->LifeTime = event.EmitterLifeTime; + + { + //Creating Particle Template + auto particle = m_World->CreateEntity(emitter); + auto particleTransform = m_World->AddComponent(particle); + auto sprite = m_World->AddComponent(particle); + auto particleComponent = m_World->AddComponent(particle); + m_World->AddComponent(particle); + + particleTransform->Position = emitterTransform->Position; + sprite->SpriteFile = event.SpriteFile; + particleComponent->LifeTime = event.ParticleLifeTime; + particleComponent->Flags = event.Flags; + particleComponent->Radius = event.Radius; + } + m_World->CommitEntity(emitter); + return true; } void dd::Systems::PhysicsSystem::CreateParticleEmitter(EntityID entity) diff --git a/src/game/Sound/SoundSystem.cpp b/src/game/Sound/SoundSystem.cpp index 90939a1..1ecbd00 100644 --- a/src/game/Sound/SoundSystem.cpp +++ b/src/game/Sound/SoundSystem.cpp @@ -164,10 +164,29 @@ bool dd::Systems::SoundSystem::OnContact(const dd::Events::Contact &event) } //Send play-sound event - dd::Events::PlaySound e; - e.path = collisionSound->filePath; - e.isAmbient = false; - EventBroker->Publish(e); + + { + dd::Events::PlaySound e; + e.path = collisionSound->filePath; + e.isAmbient = false; + EventBroker->Publish(e); + } + + { + Events::CreateParticleSequence e; + e.Position = glm::vec3(0.f, 0.f, -10.f); + e.SpriteFile = "Textures/Background.png"; + e.GravityScale = 0.0f; + e.SpawnRate = 1.f; + e.NumberOfTicks = 2; + e.Speed = 1.f; + e.ParticlesPerTick = 5; + e.Spread = glm::pi() * 2; + e.EmittingAngle = glm::pi(); + e.EmitterLifeTime = 50; + e.ParticleLifeTime = 3.f; + EventBroker->Publish(e); + } //return true; } From ef5882ffbf001c9bc20d99b919cbad18dc94ccbe Mon Sep 17 00:00:00 2001 From: Stiffly Date: Wed, 7 Oct 2015 19:18:49 +0200 Subject: [PATCH 5/7] Vattnet fungerar nu igen. --- include/Core/Engine.h | 16 +--------------- src/game/Physics/PhysicsSystem.cpp | 2 +- src/game/Sound/SoundSystem.cpp | 15 --------------- 3 files changed, 2 insertions(+), 31 deletions(-) diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 9c9904f..19ebbae 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -198,21 +198,7 @@ public: } //ParticleTest - { - Events::CreateParticleSequence e; - e.Position = glm::vec3(0.f, 0.f, -10.f); - e.SpriteFile = "Textures/Background.png"; - e.GravityScale = 0.0f; - e.SpawnRate = 1.f; - e.NumberOfTicks = 2; - e.Speed = 1.f; - e.ParticlesPerTick = 5; - e.Spread = glm::pi() * 2; - e.EmittingAngle = glm::pi(); - e.EmitterLifeTime = 50; - e.ParticleLifeTime = 3.f; - m_EventBroker->Publish(e); - } + /*{ auto Pe = m_World->CreateEntity(); diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index 5380ccb..2824a39 100755 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -199,7 +199,7 @@ void dd::Systems::PhysicsSystem::Update(double dt) } auto transform = m_World->GetComponent(entity); - transform->Position = glm::vec3(position.x, position.y, -10.f); + transform->Position = glm::vec3(position.x - parentTransform.x, position.y - parentTransform.y, 0); } //Normal particles diff --git a/src/game/Sound/SoundSystem.cpp b/src/game/Sound/SoundSystem.cpp index 2ee2a61..c11d84e 100644 --- a/src/game/Sound/SoundSystem.cpp +++ b/src/game/Sound/SoundSystem.cpp @@ -175,21 +175,6 @@ bool dd::Systems::SoundSystem::OnContact(const dd::Events::Contact &event) EventBroker->Publish(e); } - { - Events::CreateParticleSequence e; - e.Position = glm::vec3(0.f, 0.f, -10.f); - e.SpriteFile = "Textures/Background.png"; - e.GravityScale = 0.0f; - e.SpawnRate = 1.f; - e.NumberOfTicks = 2; - e.Speed = 1.f; - e.ParticlesPerTick = 5; - e.Spread = glm::pi() * 2; - e.EmittingAngle = glm::pi(); - e.EmitterLifeTime = 50; - e.ParticleLifeTime = 3.f; - EventBroker->Publish(e); - } return true; } From 66feadfd046a815e4770fc0547012214ea17a793 Mon Sep 17 00:00:00 2001 From: Stiffly Date: Thu, 8 Oct 2015 11:04:35 +0200 Subject: [PATCH 6/7] Fixed physics wrong error message --- include/Core/Engine.h | 6 +++--- src/game/Physics/PhysicsSystem.cpp | 19 ++++--------------- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 19ebbae..673805d 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -200,7 +200,7 @@ public: //ParticleTest - /*{ + { auto Pe = m_World->CreateEntity(); auto transform = m_World->AddComponent(Pe); auto particleEmitter= m_World->AddComponent(Pe); @@ -228,10 +228,10 @@ public: PtTransform->Position = transform->Position; PtSprite->SpriteFile = "Textures/Background.png"; PtParticle->LifeTime = 3.f; - PtParticle->Flags = ParticleFlags::Type::powderParticle | ParticleFlags::Type::particleContactFilterParticle | ParticleFlags::Type::fixtureContactFilterParticle; + PtParticle->Flags = static_cast(ParticleFlags::Type::Powder | ParticleFlags::Type::ParticleContactFilter | ParticleFlags::Type::FixtureContactFilter); } m_World->CommitEntity(Pe); - }*/ + } //TODO: Why does the ball not collide with these bricks? //BottomBox diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index 2824a39..98c8b82 100755 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -303,23 +303,12 @@ void dd::Systems::PhysicsSystem::OnEntityCommit(EntityID entity) void dd::Systems::PhysicsSystem::OnEntityRemoved(EntityID entity) { - /* auto physics = m_World->GetComponent(entity); - if (physics == nullptr) { - return; - }*/ - auto it = m_EntitiesToBodies.find(entity); - if(it == m_EntitiesToBodies.end()) { - LOG_ERROR("Trying to remove non-exsisting body, Entity: %i", entity); - return; + if(it != m_EntitiesToBodies.end()) { + it->second->GetWorld()->DestroyBody(it->second); + m_BodiesToEntities.erase(it->second); + m_EntitiesToBodies.erase(entity); } - - //It told me I was removing a lot of objects, and I didn't need that information, so I commented it out. - //LOG_INFO("Removing entity %i", entity); - it->second->GetWorld()->DestroyBody(it->second); - m_BodiesToEntities.erase(it->second); - m_EntitiesToBodies.erase(entity); - //delete body; } From bb314898ba755eeffd649ffcf58bc39003cab3a3 Mon Sep 17 00:00:00 2001 From: Stiffly Date: Thu, 8 Oct 2015 12:12:21 +0200 Subject: [PATCH 7/7] Fixing vs build fail --- include/Physics/ECreateParticleSequence.h | 4 ++-- include/Physics/PhysicsSystem.h | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/include/Physics/ECreateParticleSequence.h b/include/Physics/ECreateParticleSequence.h index 13861cb..c6b3c2d 100644 --- a/include/Physics/ECreateParticleSequence.h +++ b/include/Physics/ECreateParticleSequence.h @@ -19,8 +19,8 @@ struct CreateParticleSequence : public Event int NumberOfTicks = 100; float Speed = 1.f; int ParticlesPerTick = 1.f; - float Spread = glm::pi(); - float EmittingAngle = glm::two_pi(); + float Spread = 1.f; + float EmittingAngle = 0.f; float MaxCount = 0; //Particle diff --git a/include/Physics/PhysicsSystem.h b/include/Physics/PhysicsSystem.h index 2e930f8..6fd7bd3 100755 --- a/include/Physics/PhysicsSystem.h +++ b/include/Physics/PhysicsSystem.h @@ -2,6 +2,7 @@ #define DAYDREAM_PHYSICSSYSTEM_H #include +#include #include @@ -116,13 +117,13 @@ namespace dd float m_Timer = 0; //TODO: Fill struct with info needed. - struct ParticleEmitter //TODO CHANGE NAMES + struct EmitterHandler //TODO CHANGE NAMES { std::vector ParticleSystem; std::vector ParticleEmitter; std::vector ParticleTemplate; }; - ParticleEmitter m_ParticleEmitters; + EmitterHandler m_ParticleEmitters; std::list m_Impulses; @@ -134,7 +135,7 @@ namespace dd : m_PhysicsSystem(physicsSystem) { } void SayGoodbye(b2Joint*) {LOG_INFO("joint körs");}; - void SayGoodbye(b2Fixture*) {LOG_INFO("Fixture körs");}; + void SayGoodbye(b2Fixture*) {/*LOG_INFO("Fixture körs");*/}; void SayGoodbye(b2ParticleSystem* particleSystem, int32 index) override {