diff --git a/assets/Textures/Particles/Ice_Particle.png b/assets/Textures/Particles/Ice_Particle.png new file mode 100644 index 0000000..c58ecd8 Binary files /dev/null and b/assets/Textures/Particles/Ice_Particle.png differ diff --git a/assets/Textures/Particles/Normal_Dust_Particle.png b/assets/Textures/Particles/Normal_Dust_Particle.png new file mode 100644 index 0000000..2dae585 Binary files /dev/null and b/assets/Textures/Particles/Normal_Dust_Particle.png differ diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 988698a..794e7f1 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -188,6 +188,7 @@ public: } //Background + { auto background = m_World->CreateEntity(); auto transform = m_World->AddComponent(background); diff --git a/include/Physics/CParticleEmitter.h b/include/Physics/CParticleEmitter.h index 565a935..7809735 100755 --- a/include/Physics/CParticleEmitter.h +++ b/include/Physics/CParticleEmitter.h @@ -13,7 +13,8 @@ struct ParticleEmitter : public Component float InitialSpeed = 1.f; double SpawnRate = 1; int ParticlesPerTick = 1; - double TimeSinceLastSpawn = 0; + //TODO: Refactor. Have cooldown instead of this + double TimeSinceLastSpawn = 100; int MaxCount = 0; float EmittingAngle = 0.f; float Spread = 0.f; diff --git a/include/Physics/EContact.h b/include/Physics/EContact.h index 4a6f3a9..62f280b 100644 --- a/include/Physics/EContact.h +++ b/include/Physics/EContact.h @@ -19,6 +19,7 @@ struct Contact : Event { EntityID Entity1; EntityID Entity2; + glm::vec2 IntersectionPoint; glm::vec2 Normal; glm::vec2 SignificantNormal; }; diff --git a/include/Physics/ECreateParticleSequence.h b/include/Physics/ECreateParticleSequence.h index c6b3c2d..12e66a7 100644 --- a/include/Physics/ECreateParticleSequence.h +++ b/include/Physics/ECreateParticleSequence.h @@ -22,9 +22,10 @@ struct CreateParticleSequence : public Event float Spread = 1.f; float EmittingAngle = 0.f; float MaxCount = 0; + glm::vec4 Color = glm::vec4(0); //Particle - std::string SpriteFile = "Texures/Core/ErrorTexture.png"; + std::string SpriteFile = ""; double ParticleLifeTime = 3.f; ParticleFlags::Type Flags = static_cast(ParticleFlags::Powder | ParticleFlags::ParticleContactFilter | ParticleFlags::FixtureContactFilter); float Radius = 1.f; diff --git a/include/Physics/PhysicsSystem.h b/include/Physics/PhysicsSystem.h index 6fd7bd3..ff8f4a9 100755 --- a/include/Physics/PhysicsSystem.h +++ b/include/Physics/PhysicsSystem.h @@ -37,6 +37,7 @@ #include "Game/CBall.h" #include "Rendering/CSprite.h" +#include "Rendering/CModel.h" namespace dd @@ -113,6 +114,8 @@ namespace dd bool OnPause(const dd::Events::Pause &event); dd::EventRelay m_EStageCleared; bool OnStageCleared(const dd::Events::StageCleared &event); + dd::EventRelay m_EContact; + bool OnContact(const dd::Events::Contact &event); bool m_Travelling = false; float m_Timer = 0; @@ -173,7 +176,7 @@ namespace dd { return false; } - + }; @@ -196,7 +199,7 @@ namespace dd }; DestructionListener* m_DestructionListener; - ParticleContactDisabler m_ParticleContactDisabler; + ParticleContactDisabler* m_ParticleContactDisabler; ContactListener* m_ContactListener; }; diff --git a/src/game/Physics/ContactListener.cpp b/src/game/Physics/ContactListener.cpp index 97981d1..f24ca85 100644 --- a/src/game/Physics/ContactListener.cpp +++ b/src/game/Physics/ContactListener.cpp @@ -12,8 +12,11 @@ void dd::Systems::PhysicsSystem::ContactListener::BeginContact(b2Contact* contac e.Entity2 = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureB()->GetBody()]; e.Normal = glm::normalize(glm::vec2(contact->GetManifold()->localNormal.x, contact->GetManifold()->localNormal.y)); e.SignificantNormal = glm::normalize((glm::abs(e.Normal.x) > glm::abs(e.Normal.y)) ? glm::vec2(e.Normal.x, 0) : glm::vec2(0, e.Normal.y)); - - m_PhysicsSystem->EventBroker->Publish(e); + //contact->GetManifold()->points + b2Vec2 pos = worldManifold.points[0]; + glm::vec2 glmPos = glm::vec2(pos.x, pos.y); + e.IntersectionPoint = glmPos; + m_PhysicsSystem->EventBroker->Publish(e); } void dd::Systems::PhysicsSystem::ContactListener::EndContact(b2Contact* contact) diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index 5ca8dc3..6815826 100755 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -15,14 +15,16 @@ void dd::Systems::PhysicsSystem::Initialize() m_DestructionListener = new DestructionListener(this); m_ContactListener = new ContactListener(this); m_PhysicsWorld = new b2World(m_Gravity); + m_ParticleContactDisabler = new ParticleContactDisabler(); m_PhysicsWorld->SetContactListener(m_ContactListener); - m_PhysicsWorld->SetContactFilter(&m_ParticleContactDisabler); - m_PhysicsWorld->SetDestructionListener(m_DestructionListener); + m_PhysicsWorld->SetContactFilter(m_ParticleContactDisabler); + m_PhysicsWorld->SetDestructionListener(m_DestructionListener); InitializeWater(); EVENT_SUBSCRIBE_MEMBER(m_SetImpulse, &PhysicsSystem::SetImpulse); EVENT_SUBSCRIBE_MEMBER(m_EPause, &PhysicsSystem::OnPause); EVENT_SUBSCRIBE_MEMBER(m_ECreateParticleSequence, &PhysicsSystem::CreateParticleSequence); + EVENT_SUBSCRIBE_MEMBER(m_EContact, &PhysicsSystem::OnContact); } @@ -250,8 +252,14 @@ void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, Entity } } auto particle = m_World->GetComponent(entity); - auto pTemplate = m_World->GetComponent(entity); + auto pTemplate = m_World->GetComponent(entity); + + if (particle && pTemplate) + LOG_ERROR("Particel + template finns"); + if (particle && !pTemplate) { + //LOG_ERROR("Particel - template finns"); + particle->LifeTime -= dt; if (particle->LifeTime <= 0) { for (int i = 0; i < m_EntitiesToParticleHandle.size(); i++) { @@ -266,6 +274,7 @@ void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, Entity if (iter2 != m_ParticleHandleToEntities[i].end()) { m_ParticleHandleToEntities[i].erase(iter2); } + LOG_INFO("Deleteing particle!!."); m_World->RemoveEntity(entity); } } @@ -448,14 +457,14 @@ void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) { std::vector emittersToDelete; - int pSizeTest = 0; + int pSizeTest = 0; //For debugging, delete this + int psListSize = 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(); - - + psListSize++; auto emitter = m_World->GetComponent(e); auto particleTemplate = m_World->GetComponent(pt); if(!emitter) { @@ -493,7 +502,7 @@ void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) 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; + glm::vec2 vel = unitVec * emitter->Speed * (float)dt; particleDef.velocity = b2Vec2(vel.x, vel.y); particleDef.position = b2Vec2(templateTransform->Position.x, templateTransform->Position.y); @@ -513,8 +522,25 @@ void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) auto b2ParticleHandle = ps->GetParticleHandleFromIndex(b2Particle); m_EntitiesToParticleHandle[i].insert(std::make_pair(particle, b2ParticleHandle)); m_ParticleHandleToEntities[i].insert(std::make_pair(b2ParticleHandle, particle)); + + } + } +// system("cls"); +// std::cout << "Particles living: " << pSizeTest << std::endl; +// std::cout << "particle systems: " << psListSize << std::endl; +// int entHandles = 0; +// for (int i = 0; i < m_EntitiesToParticleHandle.size(); i++) +// entHandles += m_EntitiesToParticleHandle[i].size(); +// std::cout << "Entities and handles: " << entHandles << std::endl; +// LOG_INFO("Particles living: %i", pSizeTest); +// LOG_INFO("Particle systems: %i", psListSize); +// int entHandles = 0; +// for (int i = 0; i < m_EntitiesToParticleHandle.size(); i++) +// entHandles += m_EntitiesToParticleHandle[i].size(); +// LOG_INFO("Entities and handles: %i", entHandles); + for (int i = 0; i < emittersToDelete.size(); i++) { @@ -537,6 +563,8 @@ void dd::Systems::PhysicsSystem::UpdateParticleEmitters(double dt) } } + + int stp = 0; for (auto ts : m_EntitiesToParticleHandle) { @@ -571,6 +599,7 @@ bool dd::Systems::PhysicsSystem::CreateParticleSequence(const Events::CreatePart particleTransform->Position = emitterTransform->Position; sprite->SpriteFile = event.SpriteFile; + sprite->Color = event.Color; particleComponent->LifeTime = event.ParticleLifeTime; particleComponent->Flags = event.Flags; particleComponent->Radius = event.Radius; @@ -632,6 +661,40 @@ b2ParticleSystem* dd::Systems::PhysicsSystem::CreateParticleSystem(float radius, return m_PhysicsWorld->CreateParticleSystem(&m_ParticleSystemDef); } +bool dd::Systems::PhysicsSystem::OnContact(const dd::Events::Contact &event) +{ + //Check if it is a brick colliding + auto brick = m_World->GetComponent(event.Entity1); + Components::Model* model; + + if (!brick) { + brick = m_World->GetComponent(event.Entity2); + if (!brick) { + return false; + } + else { + model = m_World->GetComponent(event.Entity2); + } + } + else { + model = m_World->GetComponent(event.Entity1); + } + Events::CreateParticleSequence e; + e.EmitterLifeTime = 2; + //- glm::atan(event.Normal.x, event.Normal.y + e.EmittingAngle = glm::half_pi(); + e.Spread = 0; + e.NumberOfTicks = 1; + e.ParticleLifeTime = 1.f; + e.ParticlesPerTick = 1; + e.Position = glm::vec3(event.IntersectionPoint.x, event.IntersectionPoint.y, -10); + e.Radius = 0.1f; + e.SpriteFile = "Textures/Bricks/3.png"; + e.Color = model->Color; + e.Speed = 100.f; + EventBroker->Publish(e); + return true; +} dd::Systems::PhysicsSystem::~PhysicsSystem()