Atoms Crowd  4.1.0
RigidBody.h
1 #pragma once
2 #ifndef ATOMS_UNREAL
3 // ===========================================================================
4 // Copyright (c) 2015 Toolchefs Ltd. All rights reserved.
5 //
6 // Use of this software is subject to the terms of the Toolchefs license
7 // agreement provided at the time of installation or download, or which
8 // otherwise accompanies this software in either electronic or hard copy form.
9 // ===========================================================================
10 
11 #include <Atoms/Globals.h>
12 #include <AtomsCore/AtomsMath.h>
13 #include <AtomsUtils/Mesh.h>
14 #include <AtomsCore/Metadata/MapMetadata.h>
15 #include <string>
16 #include <atomic>
17 #ifdef VS2012
18 #include <tbb/atomic.h>
19 #endif
20 
21 #define GETSET_RIGID_BODY_ATTRIBUTE( SET_NAME, GET_NAME, TYPE, ATTRIBUTE ) \
22 inline TYPE GET_NAME() const { return ATTRIBUTE; } \
23 void SET_NAME(TYPE value) { ATTRIBUTE = value; } \
24 
25 
26 namespace physx
27 {
28  class PxPhysics;
29  class PxScene;
30  class PxGeometry;
31  class PxRigidDynamic;
32  class PxRigidActor;
33  class PxTransform;
34  class PxCooking;
35 }
36 
37 namespace Atoms
38 {
39  class ATOMS_EXPORT RigidBodyAttributes
40  {
41  public:
42 
43  enum State
44  {
45  kStatic = 0,
46  kDynamic = 1,
47  kKinematic = 2
48  };
49 
50  enum Type
51  {
52  kPlane = 0,
53  kSphere,
54  kBox,
55  kCapsule,
56  kConvexMesh,
57  kTriangleMesh,
58  kHeightField
59  };
60 
61  enum Axis
62  {
63  kX = 0,
64  kY,
65  kZ
66  };
67 
68  enum RotationOrder
69  {
70  kXYZ = 0,
71  kYZX,
72  kZXY,
73  kXZY,
74  kYXZ,
75  kZYX,
76  };
77 
79 
81 
82  public:
83 
85  bool serialise(std::string& outStream) const;
86 
88  bool deserialise(const std::string& inStream);
89 
91  bool serialise(AtomsCore::MapMetadata* outStream) const;
92 
94  bool deserialise(const AtomsCore::MapMetadata* inStream);
95 
96  public:
97 
98  static const size_t version;
99 
100  public:
101  AtomsCore::Vector3f dimension;
102  AtomsCore::Vector3f linearVelocity;
103  AtomsCore::Vector3f angularVelocity;
104  AtomsCore::Vector3f massSpaceInertiaTensor;
105  AtomsCore::Matrixf transform;
106  AtomsCore::Matrixf shapeOffset;
107  AtomsCore::Matrixf cMassLocalPose;
108  AtomsCore::Vector3f rotatePivot;
109  AtomsCore::Vector3f scalePivot;
110  AtomsCore::Vector3f scalePivotTranslate;
111  AtomsCore::Vector3f rotatePivotTranslate;
112  AtomsCore::Vector3f scale;
113  AtomsCore::Vector3f position;
114  AtomsCore::Quaternionf rotation;
115  AtomsCore::Vector2f stuckOnCollisionBreakForce;
116  AtomsCore::Vector2f solverIteratorCount;
117  float collisionForceThreshold;
118  float maxAngularVelocity;
119  float angularDamping;
120  float linearDamping;
121  float density;
122  float sleepThreshold;
123  float stabilizationThreshold;
124  float wakeCounter;
125  float mass;
126  float staticFriction;
127  float dynamicFriction;
128  float restitution;
129  float restOffset;
130  float contactOffset;
131  float contactReportThreshold;
132  float stuckOnCollisionImpulse;
133  float heightFieldScale;
134  int aggregate;
135  int collisionPool;
136  int dynamicOnCollisionPool;
137  int stuckOnCollisionPool;
138  int heightFieldRows;
139  int heightFieldColumns;
140  short state;
141  short type;
142  short axis;
143  short rotationOrder;
144  bool active;
145  bool useMass;
146  bool dynamicOnCollision;
147  bool disableCollisionEvent;
148  bool stuckOnCollision;
149  bool aggregateSelfCollision;
150  bool storeImpactData;
151  };
152 
153  class ATOMS_EXPORT RigidBody
154  {
155  public:
156 
158  {
159  kSphere = 0,
160  kPlane,
161  kCapsule,
162  kBox,
163  kConvexMesh,
164  kTriangleMesh,
165  kHeightfield,
167  kInvalid = -1
168  };
169 
170  struct ShapeData
171  {
172  AtomsCore::Matrixf transform;
173  short shapeType;
174  AtomsCore::Vector3f size;
175  std::vector<AtomsCore::Vector3f> points;
176  std::vector<AtomsCore::Vector3f> normals;
177  std::vector<unsigned int> indices;
178  };
179 
180  struct ImpactData
181  {
182  AtomsCore::Vector3f position;
183  AtomsCore::Vector3f force;
184  int asImpulse;
185  double time;
186  size_t obj;
187  };
188 
189  enum DynamicOnCollisionType
190  {
191  kSingle = 0,
192  kAggregate,
193  kChildren
194  };
195 
196  RigidBody();
197 
198  ~RigidBody();
199 
200  void setKinematicTarget(const AtomsCore::Matrixf& mtx);
201 
202  void storeTransform();
203 
204  void setKinematic(bool value);
205 
206  void pose(AtomsCore::Vector3f& pos, AtomsCore::Quaternionf& rot) const;
207 
208  void getGeometry(std::vector<AtomsCore::Vector3f>& points,
209  std::vector<AtomsCore::Vector3f>& normals,
210  std::vector<unsigned int>& indices) const;
211 
212  void getShape(ShapeData& data) const;
213 
214  inline bool isStatic() const;
215 
216  inline bool isKinematic() const;
217 
218  inline bool isDynamic() const;
219 
220  void addForce(const AtomsCore::Vector3f& force);
221 
222  void addImpulse(const AtomsCore::Vector3f& impulse);
223 
224  void addForceAtPosition(const AtomsCore::Vector3f& force, const AtomsCore::Vector3f& position);
225 
226  void addImpulseAtPosition(const AtomsCore::Vector3f& impulse, const AtomsCore::Vector3f& position);
227 
228  void addTorque(const AtomsCore::Vector3f& force);
229 
230  void addTorqueImpulse(const AtomsCore::Vector3f& impulse);
231 
232  void applyForces(float scale);
233 
234  void clearForces();
235 
236  void clearFeedbacks();
237 
238  AtomsCore::Matrixf centerOfMass();
239 
240  float friction();
241 
242  float bounce();
243 
244  void release();
245 
246  public:
247 
248  std::vector<ImpactData> impacts;
249 
250  std::vector<ImpactData> feedback;
251 
252  physx::PxRigidActor* actor;
253 
254  short state;
255 
256  short rotationOrder;
257 
258  AtomsCore::Quaternionf targetRot;
259 
260  AtomsCore::Quaternionf currentRot;
261 
262  AtomsCore::Vector3f targetPos;
263 
264  AtomsCore::Vector3f currentPos;
265 
266  AtomsCore::Vector3f rotatePivot;
267 
268  AtomsCore::Vector3f scale;
269 
270  AtomsCore::Vector3f scalePivot;
271 
272  AtomsCore::Vector3f scalePivotTranslate;
273 
274  AtomsCore::Vector3f rotatePivotTranslate;
275 
276  AtomsCore::Matrixf initTransform;
277 
278  AtomsCore::Vector3f initPosition;
279 
280  AtomsCore::Quaternionf initRotation;
281 #ifndef VS2012
282  std::atomic<bool> dynamicSwitch;
283 
284  std::atomic<int> dynamicPool;
285 #else
286  tbb::atomic<bool> dynamicSwitch;
287 
288  tbb::atomic<int> dynamicPool;
289 #endif
290  AtomsCore::Vector3f force;
291 
292  AtomsCore::Vector3f impulse;
293 
294  AtomsCore::Vector3f torque;
295 
296  AtomsCore::Vector3f torqueImpulse;
297 
298  AtomsCore::Vector3f velocity;
299 
300  AtomsCore::Vector3f angularVelocity;
301 
302  AtomsCore::Vector3f acceleration;
303 
304  float mass;
305 
306  size_t id;
307 
308  short dynamicOnCollisionType;
309 
310  int aggregate;
311 
312  float stuckOnCollisionImpulse;
313 
314  AtomsCore::Vector2f stuckOnCollisionBreakForce;
315 
316  float collisionForceThreshold;
317 
318  int dynamicOnCollisionPool;
319 
320  int stuckOnCollisionPool;
321 
322  int collisionPool;
323 
324  bool dynamicOnCollision;
325 
326  bool isRoot;
327 
328  bool stuckOnCollision;
329 
330  bool aggregateSelfCollision;
331 
332  bool isJoint;
333 
334  bool storeImpactData;
335  };
336 
337 }
338 
339 #include "RigidBody.impl.h"
340 #endif
Atoms::RigidBodyAttributes::deserialise
bool deserialise(const std::string &inStream)
Binary Deserialise.
Atoms::RigidBodyAttributes::serialise
bool serialise(std::string &outStream) const
Binary Serialise.
Atoms::RigidBody::kGeometryCount
@ kGeometryCount
internal use only!
Definition: RigidBody.h:166
Atoms::RigidBody
Definition: RigidBody.h:154
AtomsCore::Quaternionf
AtomsMath::Quaternionf Quaternionf
Quaternion class.
Definition: AtomsMath.h:68
Atoms::RigidBody::ShapeType
ShapeType
Definition: RigidBody.h:158
AtomsCore::Vector2f
AtomsMath::Vector2f Vector2f
Vector2 class.
Definition: AtomsMath.h:55
AtomsCore::Matrixf
AtomsMath::Matrixf Matrixf
Matrix class.
Definition: AtomsMath.h:64
Atoms
Atoms namespace.
Definition: Agent.h:28
AtomsCore::MapMetadata
MapMetadata class.
Definition: MapMetadata.h:24
Atoms::RigidBody::ImpactData
Definition: RigidBody.h:181
Atoms::RigidBodyAttributes
Definition: RigidBody.h:40
AtomsCore::Vector3f
AtomsMath::Vector3f Vector3f
Vector3 class.
Definition: AtomsMath.h:58
Atoms::RigidBodyAttributes::serialise
bool serialise(AtomsCore::MapMetadata *outStream) const
Binary Serialise.
Atoms::RigidBodyAttributes::deserialise
bool deserialise(const AtomsCore::MapMetadata *inStream)
Binary Deserialise.
Atoms::RigidBody::ShapeData
Definition: RigidBody.h:171