Atoms Crowd  4.1.0
AtomsPhysx.h
1 #pragma once
2 // ===========================================================================
3 // Copyright (c) 2015 Toolchefs Ltd. All rights reserved.
4 //
5 // Use of this software is subject to the terms of the Toolchefs license
6 // agreement provided at the time of installation or download, or which
7 // otherwise accompanies this software in either electronic or hard copy form.
8 // ===========================================================================
9 #ifndef ATOMS_UNREAL
10 #include <Atoms/Globals.h>
11 #include <AtomsCore/AtomsMath.h>
12 #include <Atoms/Physx/RigidBody.h>
13 #include <Atoms/Physx/RigidBodyConstraint.h>
14 #include <string>
15 #include <unordered_map>
16 #include <mutex>
17 
18 namespace physx
19 {
20  class PxFoundation;
21  class PxPhysics;
22  class PxDefaultCpuDispatcher;
23  class PxScene;
24  class PxPvd;
25  class PxRigidActor;
26  class PxCooking;
27  class PxAggregate;
28  class PxMaterial;
29  class PxHeightField;
30  class PxCudaContextManager;
31 }
32 
33 namespace Atoms
34 {
35  class ContactFilterCallback;
36  class ContactModifyCallback;
37  class AtomsCCDContactModification;
38 
39  class ATOMS_EXPORT AtomsPhysx
40  {
41  public:
42 
44  {
45  std::unordered_map<int, std::vector<int>> aggregates;
46  std::unordered_map<int, bool> aggregateEnableCollisions;
47  };
48 
50  {
51  size_t id;
52  RigidBodyAttributes attributes;
53  AtomsUtils::Mesh* mesh;
54  };
55 
57  {
59  Atoms::RigidBody* firstRb;
60  AtomsCore::Matrixf fMatrix;
61  Atoms::RigidBody* secondRb;
62  AtomsCore::Matrixf sMatrix;
63  std::string name;
64  bool lateCompute;
65  };
66 
67  enum SolverType
68  {
69  kPGS = 0,
70  kTGS
71  };
72 
73  AtomsPhysx();
74 
75  ~AtomsPhysx();
76 
77  void init();
78 
79  void release();
80 
81  void initScene();
82 
83  void releaseScene();
84 
85  void updateKinematics(float stepSize);
86 
87  void updateDynamicPool(float stepSize);
88 
89  void updateKinematicAgents(float stepSize);
90 
91  void updatedForces(float stepSize);
92 
93  void clearForces();
94 
95  void clearFeedbacks();
96 
97  void storeTransforms();
98 
99  void fetchStates();
100 
101  void storeStates();
102 
103  void updateConstraints();
104 
105  void createLazyData();
106 
107  void createDynamicConstraintData();
108 
109  void updateForceCollisionThreshold();
110 
111  void stepPhysics();
112 
113  //Attributes Pvd
114 
115  const std::string& pvdHost() const;
116 
117  void setPvdHost(const std::string& host);
118 
119  int pvdPort() const;
120 
121  void setPvdPort(int value);
122 
123  unsigned int pvdTimeout() const;
124 
125  void setPvdTimeout(unsigned int value);
126 
127 
128  // Sim attributes
129 
130  double fps() const;
131 
132  void setFps(double value);
133 
134  unsigned int subSamples() const;
135 
136  void setSubSamples(unsigned int value);
137 
138  double scale() const;
139 
140  void setScale(double value);
141 
142  const AtomsCore::Vector3& gravity() const;
143 
144  void setGravity(const AtomsCore::Vector3& value);
145 
146  void enablePvd(bool value);
147 
148  bool isPvdEnabled() const;
149 
150  bool isInitialized() const;
151 
152  unsigned int threadsNumber() const;
153 
154  void setThreadsNumber(unsigned int value);
155 
156  void setFrictionOffsetThreshold(double value);
157 
158  void setCcdMaxSeparation(double value);
159 
160  void setSolverOffsetSlop(double value);
161 
162  void setBounceThresholdVelocity(double value);
163 
164  short solverType() const;
165 
166  void setSolverType(short value);
167 
168  void setKinematicKinematicFilter(bool value);
169 
170  void setStaticKinematicFilter(bool value);
171 
172  bool useGpu() const;
173 
174  void setUseGpu(bool value);
175 
176  bool enableStabilization() const;
177 
178  void setEnableStabilization(bool value);
179 
180  bool enableEnhancedDeterminism() const;
181 
182  void setEnableEnhancedDeterminism(bool value);
183 
184  bool enableFrictionEveryIteration() const;
185 
186  void setEnableFrictionEveryIteration(bool value);
187 
188  bool enablePCM() const;
189 
190  void setEnablePCM(bool value);
191 
192  bool enableAdaptiveForce() const;
193 
194  void setEnableAdaptiveForce(bool value);
195 
196  bool enableCCD() const;
197 
198  void setEnableCCD(bool value);
199 
200  double elapsedTime() const;
201 
202  // Rbs
203  RigidBody* addRigidBody(
204  const std::string& name,
205  const RigidBodyAttributes& attributes,
206  AtomsUtils::Mesh* mesh = nullptr,
207  bool lazyCreation = false);
208 
209  void rigidBodyPose(const std::string& name, AtomsCore::Vector3f& pos, AtomsCore::Quaternionf& rot) const;
210 
211  void rigidBodyPose(size_t id, AtomsCore::Vector3f& pos, AtomsCore::Quaternionf& rot) const;
212 
213  std::unordered_map<size_t, RigidBody>& rigidBodies();
214 
215  const RigidBody* rigidBody(size_t id) const;
216 
217  const std::unordered_map<size_t, RigidBody>& rigidBodies() const;
218 
219  const std::unordered_map<size_t, std::string>& rigidBodyNames() const;
220 
221  const std::map<std::string, size_t>& rigidBodyNameIds() const;
222 
223  std::map<std::string, RigidBodyConstraint>& constraints();
224 
225  const std::map<std::string, RigidBodyConstraint>& constraints() const;
226 
227  const std::map<std::pair<size_t, size_t>, std::string>& constraintNames() const;
228 
229  physx::PxRigidActor* createPhysicObject(size_t id, const RigidBodyAttributes& attributes, physx::PxGeometry* geo, const physx::PxTransform* shapeOffset);
230 
231  physx::PxRigidActor* createRigidBody(size_t id, const RigidBodyAttributes& attributes, AtomsUtils::Mesh* mesh=nullptr);
232 
233  void setupDynamicAttributes(physx::PxRigidDynamic* rigid, const RigidBodyAttributes& attributes) const;
234 
235  void setupKinematicAttributes(physx::PxRigidDynamic* rigid, const RigidBodyAttributes& attributes) const;
236 
237  // Constraints
238 
239  RigidBodyConstraint* addRigidBodyConstraint(
240  const std::string& name,
241  const RigidBodyConstraintAttributes& attributes,
242  int first,
243  int second,
244  const AtomsCore::Matrixf& matrix);
245 
246  RigidBodyConstraint* addRigidBodyConstraint(
247  const std::string& name,
248  const RigidBodyConstraintAttributes& attributes,
249  Atoms::RigidBody* firstRb,
250  const AtomsCore::Matrixf& fMatrix,
251  Atoms::RigidBody* secondRb,
252  const AtomsCore::Matrixf& sMatrix,
253  bool lazyCreation = false);
254 
255  RigidBodyConstraint* addRigidBodyDynamicConstraint(
256  const std::string& name,
257  const RigidBodyConstraintAttributes& attributes,
258  Atoms::RigidBody* firstRb,
259  const AtomsCore::Matrixf& fMatrix,
260  Atoms::RigidBody* secondRb,
261  const AtomsCore::Matrixf& sMatrix);
262 
263  physx::PxJoint* createRigidBodyConstraint(
264  const RigidBodyConstraintAttributes& attributes,
265  physx::PxRigidActor* first,
266  physx::PxTransform& firstMatrix,
267  physx::PxRigidActor* second,
268  physx::PxTransform& secondMatrix);
269 
270  void addAggregates(
271  const std::unordered_map<int, std::vector<int>> &aggregates,
272  const std::unordered_map<int, bool> &aggregateEnableCollisions,
273  size_t id = 0,
274  bool lazyCreation = false);
275 
276  void removeRigidBody(size_t id);
277 
278  void removeConstraint(const std::string& name);
279 
280  private:
281 #ifndef VS2012
282  AtomsPhysx(const AtomsPhysx&) = delete;
283  AtomsPhysx& operator=(const AtomsPhysx&) = delete;
284 #else
285  AtomsPhysx(const AtomsPhysx&);
286  AtomsPhysx& operator=(const AtomsPhysx&);
287 #endif
288  private:
289 
290  std::unordered_map<size_t, RigidBody> m_rbs;
291 
292  std::unordered_map<size_t, std::string> m_rbNames;
293 
294  std::map<std::string, size_t> m_rbNameIds;
295 
296  std::map<std::string, RigidBodyConstraint> m_constraints;
297 
298  std::map<std::pair<size_t, size_t>, std::string> m_constraintNames;
299 
300  std::vector<physx::PxAggregate *> m_aggregates;
301 
302  std::vector<physx::PxHeightField*> m_heigthFields;
303 
304  physx::PxFoundation* m_foundation;
305 
306  physx::PxPhysics* m_physics;
307 
308  physx::PxCooking* m_cooking;
309 #ifndef ATOMS_UNREAL
310  physx::PxCudaContextManager* m_cudaContextManager;
311 #endif
312  physx::PxDefaultCpuDispatcher* m_dispatcher;
313 
314  physx::PxScene* m_scene;
315 
316  physx::PxPvd* m_pvd;
317 
318  std::string m_pvdHost;
319 
320  int m_pvdPort;
321 
322  unsigned int m_pvdTimeout;
323 
324  double m_fps;
325 
326  unsigned int m_subSamples;
327 
328  double m_scale;
329 
330  AtomsCore::Vector3 m_gravity;
331 
332  int m_threadsNumber;
333 
334  unsigned int m_maxThreads;
335 
336  double m_frictionOffsetThreshold;
337 
338  double m_ccdMaxSeparation;
339 
340  double m_solverOffsetSlop;
341 
342  double m_bounceThresholdVelocity;
343 
344  short m_solverType;
345 
346  bool m_isInitialized;
347 
348  bool m_activePvd;
349 
350  bool m_filterKinematicKinematicCollision;
351 
352  bool m_filterStaticKinematicCollision;
353 
354  std::atomic<size_t> m_freeId;
355 
356  AtomsUPtr<ContactFilterCallback> m_contactFilterCallback;
357 
358  AtomsUPtr<ContactModifyCallback> m_contactModifyCallback;
359 
360  AtomsUPtr<AtomsCCDContactModification> m_ccdContactModifyCallback;
361 
362  mutable std::mutex m_mutex;
363 
364  std::map<size_t, LazyAggregateData> m_lazyAggregates;
365 
366  std::map<std::string, LazyRigidBodyData> m_lazyRigidBodies;
367 
368  std::map<std::string, LazyRigidBodyConstraintData> m_lazyConstraints;
369 
370  std::map<size_t, physx::PxMaterial*> m_lazyMaterials;
371 
372  bool m_useGpu;
373 
374  bool m_enableStabilization;
375 
376  bool m_enableEnhancedDeterminism;
377 
378  bool m_enableFrictionEveryIteration;
379 
380  bool m_enablePCM;
381 
382  bool m_enableAdaptiveForce;
383 
384  bool m_enableCCD;
385 
386  double m_elapsedTime;
387  };
388 }
389 #endif
Atoms::RigidBodyConstraintAttributes
Definition: RigidBodyConstraint.h:23
Atoms::AtomsPhysx::LazyRigidBodyData
Definition: AtomsPhysx.h:50
Atoms::RigidBody
Definition: RigidBody.h:154
AtomsCore::Vector3
AtomsMath::Vector3 Vector3
Vector3 class.
Definition: AtomsMath.h:57
AtomsCore::Quaternionf
AtomsMath::Quaternionf Quaternionf
Quaternion class.
Definition: AtomsMath.h:68
Atoms::RigidBodyConstraint
Definition: RigidBodyConstraint.h:216
AtomsCore::Matrixf
AtomsMath::Matrixf Matrixf
Matrix class.
Definition: AtomsMath.h:64
Atoms::AtomsPhysx::LazyAggregateData
Definition: AtomsPhysx.h:44
Atoms::AtomsPhysx::LazyRigidBodyConstraintData
Definition: AtomsPhysx.h:57
Atoms
Atoms namespace.
Definition: Agent.h:28
Atoms::RigidBodyAttributes
Definition: RigidBody.h:40
Atoms::AtomsPhysx
Definition: AtomsPhysx.h:40
AtomsCore::Vector3f
AtomsMath::Vector3f Vector3f
Vector3 class.
Definition: AtomsMath.h:58
AtomsUtils::Mesh
Mesh class.
Definition: Mesh.h:30