GlPortal Class Reference  0.1.1
Source code documentation of the free and open 3D action puzzle game.
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
PhysicsSystem.hpp
Go to the documentation of this file.
1 #ifndef RADIX_PHYSICS_SYSTEM_HPP
2 #define RADIX_PHYSICS_SYSTEM_HPP
3 
4 #include <unordered_set>
5 
6 #include <bullet/btBulletDynamicsCommon.h>
7 #include <bullet/BulletCollision/CollisionDispatch/btGhostObject.h>
8 
10 #include <radix/system/System.hpp>
11 
12 namespace radix {
13 
14 class CollisionDispatcher;
15 class Uncollider;
16 class BaseGame;
17 
18 class CheckCollisionCallback : public btCollisionWorld::ContactResultCallback {
19 public:
20  bool *remove;
21  CheckCollisionCallback(bool* remove) : ContactResultCallback(), remove(remove) { };
22 
23  virtual btScalar addSingleResult(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0Wrap,
24  int partId0, int index0,const btCollisionObjectWrapper* colObj1Wrap, int partId1, int index1) {
25  *remove = false;
26  return 0;
27  }
28 };
29 
30 struct CollisionInfo {
31  btCollisionObject *body0;
32  btCollisionObject *body1;
33  CollisionInfo(btCollisionObject* body0, btCollisionObject* body1)
34  : body0(body0), body1(body1) {}
35 };
36 
38 public:
39  unsigned long operator()(const CollisionInfo& info) const {
40  return (size_t) info.body0 + (size_t) info.body1;
41  }
42 };
43 
45 public:
46  bool operator()(const CollisionInfo& info0, const CollisionInfo& info1) const {
47  return (info0.body0 == info1.body0) && (info0.body1 == info1.body1) &&
48  (info0.body0->getUserPointer() == info1.body0->getUserPointer()) &&
49  (info0.body1->getUserPointer() == info1.body1->getUserPointer());
50  }
51 };
52 
53 class PhysicsSystem : public System {
54 private:
56 
58 
59  friend class Uncollider;
62 
63  btBroadphaseInterface *broadphase;
64  btDefaultCollisionConfiguration *collisionConfiguration;
66  btSequentialImpulseConstraintSolver *solver;
67  btDiscreteDynamicsWorld *physicsWorld;
68  btGhostPairCallback *gpCallback;
69 public:
70  PhysicsSystem(World&, BaseGame* game);
72 
73  const char* getName() const {
74  return "PhysicsSystem";
75  }
76 
77  TypeId getTypeId() const {
78  return System::getTypeId<std::remove_reference<decltype(*this)>::type>();
79  }
80 
81  btDiscreteDynamicsWorld& getPhysicsWorld() const {
82  return *physicsWorld;
83  }
84 
85  void update(TDelta timeDelta);
86 
87  static std::unordered_set<CollisionInfo, CollisionInfoHash,
89 
90  static bool contactProcessedCallback(btManifoldPoint& cp, void* body0, void* body1);
91 
92  void checkCollisions();
93 
94  struct CollisionAddedEvent : public Event {
95  static constexpr StaticEventTypeName TypeName = "radix/PhysicsSystem:CollisionAdded";
96  const EventTypeName getTypeName() const {
97  return TypeName;
98  }
99  static constexpr StaticEventType Type = TypeNameHash(TypeName);
100  const EventType getType() const {
101  return Type;
102  }
103 
104  CollisionInfo &info;
106  CollisionAddedEvent(CollisionInfo &info, BaseGame *game) : info(info) { };
107  };
108 
109  struct CollisionRemovedEvent : public Event {
110  static constexpr StaticEventTypeName TypeName = "radix/PhysicsSystem:CollisionRemoved";
111  const EventTypeName getTypeName() const {
112  return TypeName;
113  }
114  static constexpr StaticEventType Type = TypeNameHash(TypeName);
115  const EventType getType() const {
116  return Type;
117  }
118 
119  CollisionInfo &info;
121  CollisionRemovedEvent(CollisionInfo &info, BaseGame *game) : info(info) { };
122  };
123 };
124 
125 } /* namespace radix */
126 
127 #endif /* RADIX_PHYSICS_SYSTEM_HPP */
static PhysicsSystem * instance
Definition: PhysicsSystem.hpp:55
PhysicsSystem(World &, BaseGame *game)
Definition: PhysicsSystem.cpp:13
bool operator()(const CollisionInfo &info0, const CollisionInfo &info1) const
Definition: PhysicsSystem.hpp:46
Definition: GameController.hpp:7
CheckCollisionCallback(bool *remove)
Definition: PhysicsSystem.hpp:21
bool * remove
Definition: PhysicsSystem.hpp:20
Definition: PhysicsSystem.hpp:109
Definition: System.hpp:21
virtual btScalar addSingleResult(btManifoldPoint &cp, const btCollisionObjectWrapper *colObj0Wrap, int partId0, int index0, const btCollisionObjectWrapper *colObj1Wrap, int partId1, int index1)
Definition: PhysicsSystem.hpp:23
Definition: PhysicsSystem.hpp:94
Definition: Event.hpp:15
CollisionInfo(btCollisionObject *body0, btCollisionObject *body1)
Definition: PhysicsSystem.hpp:33
const EventType getType() const
Definition: PhysicsSystem.hpp:100
Definition: Uncollider.hpp:23
btBroadphaseInterface * broadphase
Definition: PhysicsSystem.hpp:63
TypeId getTypeId() const
Definition: PhysicsSystem.hpp:77
unsigned long operator()(const CollisionInfo &info) const
Definition: PhysicsSystem.hpp:39
Definition: TimeDelta.hpp:8
CollisionInfo & info
Definition: PhysicsSystem.hpp:104
Definition: PhysicsSystem.hpp:53
btSequentialImpulseConstraintSolver * solver
Definition: PhysicsSystem.hpp:66
const uint32_t StaticEventType
Definition: Event.hpp:10
btDiscreteDynamicsWorld * physicsWorld
Definition: PhysicsSystem.hpp:67
Definition: PhysicsSystem.hpp:44
std::string EventTypeName
Definition: Event.hpp:13
btDefaultCollisionConfiguration * collisionConfiguration
Definition: PhysicsSystem.hpp:64
static constexpr StaticEventType Type
Definition: PhysicsSystem.hpp:99
void checkCollisions()
Definition: PhysicsSystem.cpp:123
Uncollider * filterCallback
Definition: PhysicsSystem.hpp:60
static constexpr StaticEventTypeName TypeName
Definition: PhysicsSystem.hpp:95
static std::unordered_set< CollisionInfo, CollisionInfoHash, CollisionInfoEqual > collisions
Definition: PhysicsSystem.hpp:88
static constexpr StaticEventType Type
Definition: PhysicsSystem.hpp:114
const EventTypeName getTypeName() const
Definition: PhysicsSystem.hpp:111
static constexpr StaticEventTypeName TypeName
Definition: PhysicsSystem.hpp:110
CollisionAddedEvent(CollisionInfo &info, BaseGame *game)
Definition: PhysicsSystem.hpp:106
static bool contactProcessedCallback(btManifoldPoint &cp, void *body0, void *body1)
Definition: PhysicsSystem.cpp:108
EventDispatcher::CallbackHolder cbCompAdd
Definition: PhysicsSystem.hpp:57
btGhostPairCallback * gpCallback
Definition: PhysicsSystem.hpp:68
CollisionInfo & info
Definition: PhysicsSystem.hpp:119
Definition: PhysicsSystem.hpp:30
Definition: PhysicsSystem.hpp:18
btCollisionObject * body1
Definition: PhysicsSystem.hpp:32
SystemTypeId TypeId
Definition: System.hpp:26
BaseGame * game
Definition: PhysicsSystem.hpp:120
static constexpr EventType TypeNameHash(StaticEventTypeName etn)
Definition: Event.hpp:16
EventDispatcher::CallbackHolder cbCompRem
Definition: PhysicsSystem.hpp:57
CollisionRemovedEvent(CollisionInfo &info, BaseGame *game)
Definition: PhysicsSystem.hpp:121
const EventTypeName getTypeName() const
Definition: PhysicsSystem.hpp:96
btDiscreteDynamicsWorld & getPhysicsWorld() const
Definition: PhysicsSystem.hpp:81
const char * getName() const
Definition: PhysicsSystem.hpp:73
Definition: CollisionDispatcher.hpp:8
Definition: EventDispatcher.hpp:20
uint32_t EventType
Definition: Event.hpp:11
Definition: World.hpp:32
void update(TDelta timeDelta)
Definition: PhysicsSystem.cpp:87
const char *const StaticEventTypeName
Definition: Event.hpp:12
btCollisionObject * body0
Definition: PhysicsSystem.hpp:31
Definition: BaseGame.hpp:22
CollisionDispatcher * dispatcher
Definition: PhysicsSystem.hpp:65
~PhysicsSystem()
Definition: PhysicsSystem.cpp:83
BaseGame * game
Definition: PhysicsSystem.hpp:61
Definition: PhysicsSystem.hpp:37
BaseGame * game
Definition: PhysicsSystem.hpp:105
const EventType getType() const
Definition: PhysicsSystem.hpp:115