Cogs.Core
PhysicsManager.h
1#pragma once
2#ifdef _WIN32
3#pragma warning(push)
4#pragma warning(disable: 4127) // conditional expression is constant
5#pragma warning(disable: 4324) // structure was padded due to alignment specifier
6#pragma warning(disable: 5033) // 'register' is no longer a supported storage class
7#endif
8#include <btBulletDynamicsCommon.h>
9#include <BulletCollision/CollisionShapes/btCylinderShape.h>
10#ifdef _WIN32
11#pragma warning(pop)
12#endif
13
14#include "EntityDefinition.h"
15#include "Services/TaskManager.h"
16#include "Systems/Core/DynamicComponentSystem.h"
17
18#include "Foundation/ComponentModel/Entity.h"
19#include "Foundation/Reflection/TypeDatabase.h"
20#include "Foundation/Platform/Threads.h"
21
22#include <memory>
23#include <unordered_map>
24#include <glm/glm.hpp>
25
26namespace Cogs
27{
28 namespace Core
29 {
30 struct SizeT
31 {
32 size_t value;
33 };
34
36 {
37 SizeT idA;
38 SizeT idB;
39
40 glm::vec3 positionA;
41 glm::vec3 positionB;
42
43 float impulse;
44
45 static void registerType();
46 };
47
49 {
50 size_t contactCode;
51
52 WeakEntityPtr entityA;
53 WeakEntityPtr entityB;
54
55 CollisionDetail detail;
56
57 bool trigger;
58 bool visited;
59 };
60
61 inline btVector3 toBullet(const glm::vec3 & v)
62 {
63 return btVector3(v.x, v.y, v.z);
64 }
65
66 inline btQuaternion toBullet(const glm::quat & v)
67 {
68 btQuaternion b;
69 b.deSerializeFloat(*reinterpret_cast<const btQuaternionData *>(&v));
70 return b;
71 }
72
73 class Context;
74
76 {
77 public:
78 explicit PhysicsManager(Context * context);
80
81 static Reflection::TypeId getTypeId() { return Reflection::TypeDatabase::getType<PhysicsManager>().getTypeId(); }
82
83 void addRigidBody(btRigidBody * rigidBody);
84 void removeRigidBody(btRigidBody * rigidBody);
85
86 void addCollisionObject(btCollisionObject * btCollisionObject);
87 void removeCollisionObject(btCollisionObject * btCollisionObject);
88
89 void addConstraint(btTypedConstraint * constraint);
90 void removeConstraint(btTypedConstraint * constraint);
91
92 void preUpdate(Context* context);
93
94 void postUpdate(Context* context);
95
96 void waitForASync(Context* context);
97
98 constexpr Context* getContext() noexcept { return context; }
99
100 private:
101
102 void stepSimulation(float deltaTime);
103 void pullGhostState();
104 void pushGhostState();
105
106 private:
107 Context* context;
108
109 bool ghostCallbackSet = false;
110
111 std::unique_ptr<btBroadphaseInterface> broadphase;
112 std::unique_ptr<btDefaultCollisionConfiguration> collisionConfiguration;
113 std::unique_ptr<btCollisionDispatcher> dispatcher;
114 std::unique_ptr<btSequentialImpulseConstraintSolver> solver;
115 std::unique_ptr<btDiscreteDynamicsWorld> dynamicsWorld;
116
120 {
121 CollisionInfo * info;
122 MessageId id;
123 };
124
125 TaskId task = NoTask;
126 };
127 }
128}
129
130template<> inline Cogs::StringView getName<Cogs::Core::PhysicsManager>() { return "PhysicsManager"; }
131template<> inline Cogs::StringView getName<Cogs::Core::SizeT>() { return "SizeT"; }
132template<> inline Cogs::StringView getName<Cogs::Core::CollisionDetail>() { return "CollisionDetail"; }
A Context instance contains all the services, systems and runtime components needed to use Cogs.
Definition: Context.h:83
Provides a weakly referenced view over the contents of a string.
Definition: StringView.h:24
std::weak_ptr< ComponentModel::Entity > WeakEntityPtr
Weak Smart pointer for Entity access.
Definition: EntityPtr.h:18
uint16_t TypeId
Built in type used to uniquely identify a single type instance.
Definition: Name.h:48
Contains all Cogs related functionality.
Definition: FieldSetter.h:23
Task id struct used to identify unique Task instances.
Definition: TaskManager.h:20