From 94401a10ee6809213cd904f2f61f1bba63559802 Mon Sep 17 00:00:00 2001 From: tleety Date: Tue, 22 Sep 2015 16:06:47 +0200 Subject: [PATCH] Water working, might not work for several bodies --- include/Core/Engine.h | 45 +++++++++++++++++++-- include/Physics/PhysicsSystem.h | 6 +-- src/game/Physics/PhysicsSystem.cpp | 63 +++++++++++++++++++++++------- 3 files changed, 94 insertions(+), 20 deletions(-) diff --git a/include/Core/Engine.h b/include/Core/Engine.h index cdbb688..3b3e479 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -148,14 +148,53 @@ public: { auto t_waterBody = m_World->CreateEntity(); auto transform = m_World->AddComponent(t_waterBody); - transform->Position = glm::vec3(1.5f, 1.5f, -10.f); + transform->Position = glm::vec3(0.f, -1.f, -10.f); + transform->Scale = glm::vec3(2.f, 3.f, 1.f); auto water = m_World->AddComponent(t_waterBody); - auto sprite = m_World->AddComponent(t_waterBody); - sprite->SpriteFile = "Textures/Test/Brick_Diffuse.png"; auto body = m_World->AddComponent(t_waterBody); m_World->CommitEntity(t_waterBody); } + //BottomBox + { + auto topWall = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(topWall); + transform->Position = glm::vec3(0.f, -3.f, -10.f); + transform->Scale = glm::vec3(3.f, 0.5f, 1.f); + std::shared_ptr sprite = m_World->AddComponent(topWall); + sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; + std::shared_ptr boxShape = m_World->AddComponent(topWall); + std::shared_ptr physics = m_World->AddComponent(topWall); + physics->Static = true; + m_World->CommitEntity(topWall); + } + //SideBox + { + auto topWall = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(topWall); + transform->Position = glm::vec3(1.5f, -1.5f, -10.f); + transform->Scale = glm::vec3(0.5f, 3.f, 1.f); + std::shared_ptr sprite = m_World->AddComponent(topWall); + sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; + std::shared_ptr boxShape = m_World->AddComponent(topWall); + std::shared_ptr physics = m_World->AddComponent(topWall); + physics->Static = true; + m_World->CommitEntity(topWall); + } + //OtherSideBox + { + auto topWall = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(topWall); + transform->Position = glm::vec3(-1.5f, -1.5f, -10.f); + transform->Scale = glm::vec3(0.5f, 3.0f, 1.f); + std::shared_ptr sprite = m_World->AddComponent(topWall); + sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; + std::shared_ptr boxShape = m_World->AddComponent(topWall); + std::shared_ptr physics = m_World->AddComponent(topWall); + physics->Static = true; + m_World->CommitEntity(topWall); + } + { auto topWall = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(topWall); diff --git a/include/Physics/PhysicsSystem.h b/include/Physics/PhysicsSystem.h index cab4912..196c5bf 100755 --- a/include/Physics/PhysicsSystem.h +++ b/include/Physics/PhysicsSystem.h @@ -16,6 +16,7 @@ #include "Core/EventBroker.h" #include "Game/CPad.h" #include "Physics/CWaterVolume.h" +#include "Rendering/CSprite.h" namespace dd @@ -65,17 +66,16 @@ private: void CreateBody(EntityID entity); - const b2ParticleSystemDef m_ParticleSystemDef; b2ParticleSystem *m_ParticleSystem; b2ParticleGroup* t_watergroup; + std::unordered_map m_EntitiesToParticleHandle; + std::unordered_map m_ParticleHandleToEntities; void InitializeWater(); void SyncWater(); //TODO: Probably remove this void CreateParticleGroup(EntityID entity); - - class ContactListener : public b2ContactListener { public: diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index a83ef5d..ea25ede 100755 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -12,7 +12,7 @@ void dd::Systems::PhysicsSystem::Initialize() { m_ContactListener = new ContactListener(this); - m_Gravity = b2Vec2(0.f, 0.f); + m_Gravity = b2Vec2(0.f, -9.82f); m_PhysicsWorld = new b2World(m_Gravity); m_TimeStep = 1.f/60.f; @@ -29,6 +29,9 @@ void dd::Systems::PhysicsSystem::Initialize() void dd::Systems::PhysicsSystem::InitializeWater() { + b2ParticleSystemDef m_ParticleSystemDef; + m_ParticleSystemDef.radius = 0.1f; + m_ParticleSystem = m_PhysicsWorld->CreateParticleSystem(&m_ParticleSystemDef); } @@ -73,8 +76,6 @@ void dd::Systems::PhysicsSystem::Update(double dt) body->SetTransform(position, angle); - - } } @@ -97,7 +98,8 @@ void dd::Systems::PhysicsSystem::Update(double dt) auto transformComponent = m_World->GetComponent(entity); if (! transformComponent) continue; - if (m_World->GetEntityParent(entity) == 0) { + auto parent = m_World->GetEntityParent(entity); + if (parent == 0) { b2Vec2 position = body->GetPosition(); transformComponent->Position.x = position.x; transformComponent->Position.y = position.y; @@ -109,6 +111,22 @@ void dd::Systems::PhysicsSystem::Update(double dt) } } + + b2Vec2* positionBuffer = m_ParticleSystem->GetPositionBuffer(); + for (auto i : m_EntitiesToParticleHandle) { + 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); + auto transform = m_World->GetComponent(entity); + auto transformParent = m_World->GetComponent(entityParent); + + transform->Position = glm::vec3(position.x, position.y, -10) - transformParent->Position; + } } void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) @@ -121,10 +139,13 @@ void dd::Systems::PhysicsSystem::OnEntityCommit(EntityID entity) auto physicsComponent = m_World->GetComponent(entity); auto waterComponent = m_World->GetComponent(entity); + if (physicsComponent && waterComponent) { + LOG_ERROR("Entity has both water and physics component, this is illegal. The police has been alerted."); + return; + } if (physicsComponent) { CreateBody(entity); - } - if (waterComponent) { + } else if (waterComponent) { CreateParticleGroup(entity); } } @@ -182,7 +203,7 @@ void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) auto boxComponent = m_World->GetComponent(entity); if (boxComponent) { b2PolygonShape* bShape = new b2PolygonShape(); - bShape->SetAsBox(absoluteTransform.Scale.x/2, absoluteTransform.Scale.y/2); //TODO: THIS SUCKS DUDE 4?!?!?!? + bShape->SetAsBox(absoluteTransform.Scale.x/2, absoluteTransform.Scale.y/2); pShape = bShape; } else { auto circleComponent = m_World->GetComponent(entity); @@ -194,7 +215,7 @@ void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) if (absoluteTransform.Scale.x != absoluteTransform.Scale.y && absoluteTransform.Scale.y != absoluteTransform.Scale.z) { LOG_WARNING("Circles has to be of uniform scale."); } - pShape->m_radius = absoluteTransform.Scale.x/2; //TODO: THIS ALSO SUCKS 4 WTH + pShape->m_radius = absoluteTransform.Scale.x/2; } } @@ -231,19 +252,33 @@ void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) b2ParticleGroupDef pd; b2PolygonShape shape; - shape.SetAsBox(transform->Scale.x, transform->Scale.y); + shape.SetAsBox(transform->Scale.x/2.f, transform->Scale.y/2.f); pd.shape = &shape; - pd.flags = b2_elasticParticle; - pd.angle = -0.5f; - pd.angularVelocity = 2.0f; + pd.flags = b2_tensileParticle; + pd.linearVelocity = b2Vec2(0, 5.f); pd.position.Set(transform->Position.x, transform->Position.y); - //pd.particleCount = 10; //TODO: PUT IN LIST t_watergroup = m_ParticleSystem->CreateParticleGroup(pd); - LOG_INFO("ParticleCount: %i", t_watergroup->GetParticleCount()); + b2Vec2* t_ParticlePositions = m_ParticleSystem->GetPositionBuffer(); + for(int i = 0; i < m_ParticleSystem->GetParticleCount(); i++){ + { + auto t_waterparticle = m_World->CreateEntity(e); + auto transformChild = m_World->AddComponent(t_waterparticle); + auto sprite = 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->GetRadius())/transform->Scale; + sprite->SpriteFile = "Textures/Ball.png"; + m_World->CommitEntity(t_waterparticle); + + m_EntitiesToParticleHandle.insert(std::make_pair(t_waterparticle, m_ParticleSystem->GetParticleHandleFromIndex(i))); + m_ParticleHandleToEntities.insert(std::make_pair( m_ParticleSystem->GetParticleHandleFromIndex(i), t_waterparticle)); + } + + } + LOG_INFO("ParticleCount: %i", m_ParticleSystem->GetParticleCount()); } dd::Systems::PhysicsSystem::~PhysicsSystem()