TDME2  1.9.200
World.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <map>
4 #include <string>
5 #include <vector>
6 
7 #include <reactphysics3d/constraint/Joint.h>
8 #include <reactphysics3d/engine/PhysicsCommon.h>
9 #include <reactphysics3d/engine/PhysicsWorld.h>
10 
11 #include <tdme/tdme.h>
12 #include <tdme/engine/fwd-tdme.h>
15 #include <tdme/engine/Transform.h>
16 #include <tdme/math/fwd-tdme.h>
18 
19 using std::map;
20 using std::string;
21 using std::vector;
22 
32 
33 /**
34  * Dynamic physics world class
35  * @author Andreas Drewke
36  */
38 {
39  friend class Body;
46 
47 private:
49  string body1Id;
50  string body2Id;
51  };
52 
53  reactphysics3d::PhysicsCommon physicsCommon;
54  reactphysics3d::PhysicsWorld* world { nullptr };
55 
56  vector<Body*> bodies;
57  vector<Body*> rigidBodiesDynamic;
58  map<string, Body*> bodiesById;
59  map<string, reactphysics3d::Joint*> jointsById;
60  map<string, BodyCollisionStruct> bodyCollisionsLastFrame;
61  vector<WorldListener*> worldListeners;
62 
63  /**
64  * Synchronize cloned body from body
65  * @param clonedBody cloned body
66  * @param body body
67  */
68  void synchronize(Body* clonedBody, Body* body);
69 
70 public:
71  // forbid class copy
73 
74  /**
75  * Public constructor
76  * @param id id
77  */
78  World(const string& id);
79 
80  /**
81  * Destructor
82  */
83  ~World();
84 
85  /**
86  * @return id
87  */
88  const string& getId() {
89  return world->getName();
90  }
91 
92  /**
93  * Resets the physic world
94  */
95  void reset();
96 
97  /**
98  * Add a rigid body
99  * @param id id
100  * @param collisionTypeId collision type id
101  * @param enabled enabled
102  * @param transform transform
103  * @param restitution restitution
104  * @param friction friction
105  * @param mass mass
106  * @param inertiaTensor inertia matrix
107  * @param boundingVolumes bounding volumes
108  * @return body
109  */
110  Body* addRigidBody(const string& id, uint16_t collisionTypeId, bool enabled, const Transform& transform, float restitution, float friction, float mass, const Vector3& inertiaTensor, const vector<BoundingVolume*>& boundingVolumes, bool hierarchy = false);
111 
112  /**
113  * Add a static collision body
114  * @param id id
115  * @param collisionTypeId collision type id
116  * @param enabled enabled
117  * @param transform transform
118  * @param boundingVolumes bounding volumes
119  * @return body
120  */
121  Body* addStaticCollisionBody(const string& id, uint16_t collisionTypeId, bool enabled, const Transform& transform, const vector<BoundingVolume*>& boundingVolumes, bool hierarchy = false);
122 
123  /**
124  * Add a dynamic collision body
125  * @param id id
126  * @param collisionTypeId collision type id
127  * @param enabled enabled
128  * @param transform transform
129  * @param boundingVolumes bounding volumes
130  * @return body
131  */
132  Body* addDynamicCollisionBody(const string& id, uint16_t collisionTypeId, bool enabled, const Transform& transform, const vector<BoundingVolume*>& boundingVolumes, bool hierarchy = false);
133 
134  /**
135  * Add a static rigid body
136  * @param id id
137  * @param collisionTypeId collision type id
138  * @param enabled enabled
139  * @param transform transform
140  * @param friction friction
141  * @param boundingVolumes bounding volumes
142  * @return body
143  */
144  Body* addStaticRigidBody(const string& id, uint16_t collisionTypeId, bool enabled, const Transform& transform, float friction, const vector<BoundingVolume*>& boundingVolumes, bool hierarchy = false);
145 
146  /**
147  * Returns body identified by id
148  * @param id id
149  * @return body
150  */
151  inline Body* getBody(const string& id) {
152  auto bodyByIdIt = bodiesById.find(id);
153  if (bodyByIdIt != bodiesById.end()) {
154  return bodyByIdIt->second;
155  }
156  return nullptr;
157  }
158 
159  /**
160  * Returns body hierarchy identified by id
161  * @param id id
162  * @return body hierarchy
163  */
164  BodyHierarchy* getBodyHierarchy(const string& id);
165 
166  /**
167  * Removes body identified by id
168  * @param id id
169  */
170  void removeBody(const string& id);
171 
172  /**
173  * Add fixed joint
174  * @param id id
175  * @param body1 body 1
176  * @param body2 body 2
177  */
178  void addFixedJoint(const string& id, Body* body1, Body* body2);
179 
180  /**
181  * Remove joint
182  * @param id id
183  */
184  void removeJoint(const string& id);
185 
186  /**
187  * Update world
188  * @param deltaTime delta time
189  */
190  void update(float deltaTime);
191 
192  /**
193  * Synchronize physics world with engine
194  * @param engine engine
195  */
196  void synchronize(Engine* engine);
197 
198  /**
199  * Determine height on x,y,u while respecting step up max
200  * @param collisionTypeId collision type ids
201  * @param stepUpMax step up max
202  * @param point point on which height should be calculated
203  * @param heightPoint point with determined height
204  * @param minHeight min height to determine height from
205  * @param maxHeight max height to start raytracing from
206  * @return body from which height was determined or null
207  */
208  Body* determineHeight(uint16_t collisionTypeIds, float stepUpMax, const Vector3& point, Vector3& heightPoint, float minHeight = -10000.0f, float maxHeight = 10000.0f);
209 
210  /**
211  * Do a ray cast from given start to given end point, if there is any body with given collision type in between
212  * then the body is returned and a hit point is reported
213  * @param collisionTypeIds collision type ids
214  * @param start start
215  * @param end end
216  * @param hitPoint hit point
217  * @param actorId actor rigid body id, which will be exlcluded from ray tracing
218  * @return body
219  *
220  */
221  Body* doRayCasting(uint16_t collisionTypeIds, const Vector3& start, const Vector3& end, Vector3& hitPoint, const string& actorId = string());
222 
223  /**
224  * Check if world collides with given body
225  * @param collisionTypeIds collision type ids
226  * @param body body
227  * @param collisionBodies bodies that collide with given body
228  * @return if collision happpened or not
229  */
230  bool doesCollideWith(uint16_t collisionTypeIds, Body* body, vector<Body*>& collisionBodies);
231 
232  /**
233  * Check if world collides with given bounding volumes and its transform, which both form a collision for method runtime
234  * @param collisionTypeIds collision type ids
235  * @param transform transform
236  * @param boundingVolumes bounding volume
237  * @param collisionBodies bodies that collide with given body
238  * @return if collision happpened or not
239  */
240  bool doesCollideWith(uint16_t collisionTypeIds, const Transform& transform, vector<BoundingVolume*> boundingVolumes, vector<Body*>& collisionBodies);
241 
242  /**
243  * Check if body 1 collides with body 2
244  * @param body1 body 1
245  * @param body2 body 2
246  * @return if collision happpened or not
247  */
248  bool doCollide(Body* body1, Body* body2);
249 
250  /**
251  * Get collision response
252  * @param body1 body 1
253  * @param body2 body 2
254  * @param collision collision response
255  * @return if having hit points
256  */
257  bool getCollisionResponse(Body* body1, Body* body2, CollisionResponse& collision);
258 
259  /**
260  * Clone this world
261  * @param id id
262  * @param collisionTypeIds collision type ids to clone
263  */
264  World* clone(const string& id, uint16_t collisionTypeIds = ~0);
265 
266  /**
267  * Synchronize given world with this world
268  * Given world should be a clone of this world
269  * @param world world
270  */
271  void synchronize(World* world);
272 
273  /**
274  * Add a world listener
275  * @param listener listener
276  */
277  void addWorldListener(WorldListener* listener);
278 
279  /**
280  * Remove a world listener
281  * @param listener listener
282  */
283  void removeWorldListener(WorldListener* listener);
284 
285 };
Engine main class.
Definition: Engine.h:131
Transform which contain scale, rotations and translation.
Definition: Transform.h:29
Rigid body class.
Definition: Body.h:41
Dynamic physics world class.
Definition: World.h:38
BodyHierarchy * getBodyHierarchy(const string &id)
Returns body hierarchy identified by id.
Definition: World.cpp:205
Body * doRayCasting(uint16_t collisionTypeIds, const Vector3 &start, const Vector3 &end, Vector3 &hitPoint, const string &actorId=string())
Do a ray cast from given start to given end point, if there is any body with given collision type in ...
Definition: World.cpp:449
bool doesCollideWith(uint16_t collisionTypeIds, Body *body, vector< Body * > &collisionBodies)
Check if world collides with given body.
Definition: World.cpp:489
bool doCollide(Body *body1, Body *body2)
Check if body 1 collides with body 2.
Definition: World.cpp:526
void removeBody(const string &id)
Removes body identified by id.
Definition: World.cpp:211
reactphysics3d::PhysicsCommon physicsCommon
Definition: World.h:53
map< string, reactphysics3d::Joint * > jointsById
Definition: World.h:59
map< string, Body * > bodiesById
Definition: World.h:58
bool getCollisionResponse(Body *body1, Body *body2, CollisionResponse &collision)
Get collision response.
Definition: World.cpp:530
void synchronize(Body *clonedBody, Body *body)
Synchronize cloned body from body.
Definition: World.cpp:610
void addWorldListener(WorldListener *listener)
Add a world listener.
Definition: World.cpp:636
map< string, BodyCollisionStruct > bodyCollisionsLastFrame
Definition: World.h:60
World * clone(const string &id, uint16_t collisionTypeIds=~0)
Clone this world.
Definition: World.cpp:571
Body * getBody(const string &id)
Returns body identified by id.
Definition: World.h:151
vector< Body * > rigidBodiesDynamic
Definition: World.h:57
void addFixedJoint(const string &id, Body *body1, Body *body2)
Add fixed joint.
Definition: World.cpp:226
Body * addStaticRigidBody(const string &id, uint16_t collisionTypeId, bool enabled, const Transform &transform, float friction, const vector< BoundingVolume * > &boundingVolumes, bool hierarchy=false)
Add a static rigid body.
Definition: World.cpp:181
vector< WorldListener * > worldListeners
Definition: World.h:61
Body * addStaticCollisionBody(const string &id, uint16_t collisionTypeId, bool enabled, const Transform &transform, const vector< BoundingVolume * > &boundingVolumes, bool hierarchy=false)
Add a static collision body.
Definition: World.cpp:135
void removeJoint(const string &id)
Remove joint.
Definition: World.cpp:242
reactphysics3d::PhysicsWorld * world
Definition: World.h:54
Body * determineHeight(uint16_t collisionTypeIds, float stepUpMax, const Vector3 &point, Vector3 &heightPoint, float minHeight=-10000.0f, float maxHeight=10000.0f)
Determine height on x,y,u while respecting step up max.
Definition: World.cpp:405
void removeWorldListener(WorldListener *listener)
Remove a world listener.
Definition: World.cpp:641
void update(float deltaTime)
Update world.
Definition: World.cpp:251
void reset()
Resets the physic world.
Definition: World.cpp:94
const string & getId()
Definition: World.h:88
Body * addRigidBody(const string &id, uint16_t collisionTypeId, bool enabled, const Transform &transform, float restitution, float friction, float mass, const Vector3 &inertiaTensor, const vector< BoundingVolume * > &boundingVolumes, bool hierarchy=false)
Add a rigid body.
Definition: World.cpp:110
Body * addDynamicCollisionBody(const string &id, uint16_t collisionTypeId, bool enabled, const Transform &transform, const vector< BoundingVolume * > &boundingVolumes, bool hierarchy=false)
Add a dynamic collision body.
Definition: World.cpp:158
vector< Body * > bodies
Definition: World.h:56
World(const string &id)
Public constructor.
Definition: World.cpp:76
Capsule physics primitive.
Definition: Capsule.h:19
Convex mesh physics primitive.
Definition: ConvexMesh.h:37
Height map physics primitive.
Definition: HeightMap.h:19
Oriented bounding box physics primitive.
Sphere physics primitive.
Definition: Sphere.h:19
Terrain mesh physics primitive.
Definition: TerrainMesh.h:31
Matrix4x4 class representing matrix4x4 mathematical structure and operations for 3d space.
Definition: Matrix4x4.h:23
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Definition: Vector3.h:20
World listener which is about notifying adding or removing bodies.
Definition: WorldListener.h:23
#define FORBID_CLASS_COPY(CLASS)
Definition: tdme.h:6