From 9bf0ca0e46658ede07d4635db5060822552edc93 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Thu, 10 Sep 2015 21:25:34 +0100 Subject: [PATCH] ContactListener and contact events --- include/Core/Physics/PhysicsSystem.h | 60 ----------------- include/{Core => }/Physics/CPhysics.h | 0 include/Physics/EContact.h | 27 ++++++++ include/Physics/PhysicsSystem.h | 94 +++++++++++++++++++++++++++ src/game/CMakeLists.txt | 2 +- src/game/Physics/PhysicsSystem.cpp | 25 +++++-- 6 files changed, 140 insertions(+), 68 deletions(-) delete mode 100644 include/Core/Physics/PhysicsSystem.h rename include/{Core => }/Physics/CPhysics.h (100%) create mode 100644 include/Physics/EContact.h create mode 100644 include/Physics/PhysicsSystem.h diff --git a/include/Core/Physics/PhysicsSystem.h b/include/Core/Physics/PhysicsSystem.h deleted file mode 100644 index c20365b..0000000 --- a/include/Core/Physics/PhysicsSystem.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef DAYDREAM_PHYSICSSYSTEM_H -#define DAYDREAM_PHYSICSSYSTEM_H - -#include - -#include "Core/System.h" -#include "Core/World.h" -#include "Core/CBoxShape.h" -#include "Core/Physics/CPhysics.h" -#include -#include "Core/CTransform.h" -#include "Transform/TransformSystem.h" - - -namespace dd -{ - -namespace Systems -{ - -//KOLLA http://box2d.org/manual.pdf p52 Pre-Solve Event - -class PhysicsSystem : public System -{ -public: - PhysicsSystem(World* world, std::shared_ptr eventBroker) - : System(world, eventBroker) {} - - void RegisterComponents(ComponentFactory* cf) override; - void Initialize() override; - - // Called once per system every tick - void Update(double dt) override; - // Called once for every entity in the world every tick - void UpdateEntity(double dt, EntityID entity, EntityID parent) override; - - // Called when components are committed to an entity - void OnEntityCommit(EntityID entity) override; - - // Called when an entity is removed - void OnEntityRemoved(EntityID entity) override; - -private: - - - - b2Vec2 m_Gravity; - b2World* m_PhysicsWorld; - float m_TimeStep; - int m_VelocityIterations, m_PositionIterations; - - std::unordered_map m_Bodies; - - void CreateBody(EntityID entity); -}; - -} -} - -#endif //DAYDREAM_PHYSICSSYSTEM_H diff --git a/include/Core/Physics/CPhysics.h b/include/Physics/CPhysics.h similarity index 100% rename from include/Core/Physics/CPhysics.h rename to include/Physics/CPhysics.h diff --git a/include/Physics/EContact.h b/include/Physics/EContact.h new file mode 100644 index 0000000..b2d5f57 --- /dev/null +++ b/include/Physics/EContact.h @@ -0,0 +1,27 @@ +// +// Created by Viktor on 10/09/2015. +// + +#ifndef Events_ECONTACT_h__ +#define Events_ECONTACT_h__ + + +#include +#include "Core/EventBroker.h" +#include "Core/Entity.h" + +namespace dd +{ + namespace Events + { + struct Contact : Event + { + EntityID Entity1; + EntityID Entity2; + glm::vec2 ContactPoint; + }; + } + +} + +#endif //Events_ECONTACT_h__ diff --git a/include/Physics/PhysicsSystem.h b/include/Physics/PhysicsSystem.h new file mode 100644 index 0000000..add84dc --- /dev/null +++ b/include/Physics/PhysicsSystem.h @@ -0,0 +1,94 @@ +#ifndef DAYDREAM_PHYSICSSYSTEM_H +#define DAYDREAM_PHYSICSSYSTEM_H + +#include + +#include "Core/System.h" +#include "Core/World.h" +#include "Core/CBoxShape.h" +#include "Physics/CPhysics.h" +#include +#include "Core/CTransform.h" +#include "Transform/TransformSystem.h" +#include "Physics/EContact.h" + + +namespace dd +{ + +namespace Systems +{ + +//KOLLA http://box2d.org/manual.pdf p52 Pre-Solve Event + +class PhysicsSystem : public System +{ + friend class ContractListener; + +public: + PhysicsSystem(World* world, std::shared_ptr eventBroker) + : System(world, eventBroker) {} + + ~PhysicsSystem(); + + void RegisterComponents(ComponentFactory* cf) override; + void Initialize() override; + + // Called once per system every tick + void Update(double dt) override; + // Called once for every entity in the world every tick + void UpdateEntity(double dt, EntityID entity, EntityID parent) override; + + // Called when components are committed to an entity + void OnEntityCommit(EntityID entity) override; + + // Called when an entity is removed + void OnEntityRemoved(EntityID entity) override; + +private: + b2Vec2 m_Gravity; + b2World* m_PhysicsWorld; + float m_TimeStep; + int m_VelocityIterations, m_PositionIterations; + + std::unordered_map m_EntitiesToBodies; + std::unordered_map m_BodiesToEntities; + + void CreateBody(EntityID entity); + + + class ContactListener : public b2ContactListener + { + public: + ContactListener(PhysicsSystem* physicsSystem) + : m_PhysicsSystem(physicsSystem) { } + + void BeginContact(b2Contact* contact) + { + b2Vec2 contactPoint = contact->GetManifold()->localPoint; + + Events::Contact e; + e.ContactPoint = glm::vec2(contactPoint.x, contactPoint.y); + e.Entity1 = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureA()->GetBody()]; + e.Entity2 = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureB()->GetBody()]; + + m_PhysicsSystem->EventBroker->Publish(e); + } + void EndContact(b2Contact* contact) + { /* handle end event */ } + void PreSolve(b2Contact* contact, const b2Manifold* oldManifold) + { /* handle pre-solve event */ } + void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) + { /* handle post-solve event */ } + + private: + PhysicsSystem* m_PhysicsSystem; + }; + + ContactListener* m_ContactListener; +}; + +} +} + +#endif //DAYDREAM_PHYSICSSYSTEM_H diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index 7fde6ae..c1c8611 100755 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -69,7 +69,7 @@ set(SOURCE_FILES ${SOURCE_FILES_Rendering} ${SOURCE_FILES_Transform} ${SOURCE_FILES_Game} - Physics/PhysicsSystem.cpp ../../include/Core/Physics/PhysicsSystem.h ../../include/Core/CBoxShape.h ../../include/Core/Physics/CPhysics.h) + Physics/PhysicsSystem.cpp ../../include/Physics/PhysicsSystem.h ../../include/Core/CBoxShape.h ../../include/Physics/CPhysics.h ../../include/Physics/EContact.h) if(CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index 0011a27..b9e2421 100644 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -1,5 +1,5 @@ #include "PrecompiledHeader.h" -#include "Core/Physics/PhysicsSystem.h" +#include "Physics/PhysicsSystem.h" @@ -10,19 +10,24 @@ void dd::Systems::PhysicsSystem::RegisterComponents(ComponentFactory* cf) void dd::Systems::PhysicsSystem::Initialize() { + m_ContactListener = new ContactListener(this); + m_Gravity = b2Vec2(0.f, -9.82f); m_PhysicsWorld = new b2World(m_Gravity); m_TimeStep = 1.f/60.f; m_VelocityIterations = 6; m_PositionIterations = 2; + + + m_PhysicsWorld->SetContactListener(m_ContactListener); } void dd::Systems::PhysicsSystem::Update(double dt) { m_PhysicsWorld->Step(m_TimeStep, m_VelocityIterations, m_PositionIterations); - for(auto i : m_Bodies) + for(auto i : m_EntitiesToBodies) { EntityID entity = i.first; b2Body* body = i.second; @@ -101,7 +106,7 @@ void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) auto boxComponent = m_World->GetComponent(entity); if(boxComponent){ - pShape.SetAsBox(absoluteTransform.Scale.x/2, absoluteTransform.Scale.y/2); + pShape.SetAsBox(absoluteTransform.Scale.x/4, absoluteTransform.Scale.y/4); //TODO: THIS SUCKS DUDE } if(physicsComponent->Static){ @@ -112,14 +117,20 @@ void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) b2FixtureDef fixtureDef; fixtureDef.shape = &pShape; fixtureDef.density = 1.f; - fixtureDef.restitution = 0.2f; + fixtureDef.restitution = 1.0f; fixtureDef.friction = 0.3f; body->CreateFixture(&fixtureDef); } - m_Bodies.insert(std::make_pair(entity, body)); + m_EntitiesToBodies.insert(std::make_pair(entity, body)); + m_BodiesToEntities.insert(std::make_pair(body, entity)); } - - +dd::Systems::PhysicsSystem::~PhysicsSystem() +{ + if (m_ContactListener != nullptr) { + delete m_ContactListener; + m_ContactListener = nullptr; + } +}