10 #include <Atoms/Globals.h>
11 #include <AtomsCore/AtomsMath.h>
12 #include <Atoms/Physx/RigidBody.h>
13 #include <Atoms/Physx/RigidBodyConstraint.h>
15 #include <unordered_map>
22 class PxDefaultCpuDispatcher;
30 class PxCudaContextManager;
35 class ContactFilterCallback;
36 class ContactModifyCallback;
37 class AtomsCCDContactModification;
45 std::unordered_map<int, std::vector<int>> aggregates;
46 std::unordered_map<int, bool> aggregateEnableCollisions;
85 void updateKinematics(
float stepSize);
87 void updateDynamicPool(
float stepSize);
89 void updateKinematicAgents(
float stepSize);
91 void updatedForces(
float stepSize);
95 void clearFeedbacks();
97 void storeTransforms();
103 void updateConstraints();
105 void createLazyData();
107 void createDynamicConstraintData();
109 void updateForceCollisionThreshold();
115 const std::string& pvdHost()
const;
117 void setPvdHost(
const std::string& host);
121 void setPvdPort(
int value);
123 unsigned int pvdTimeout()
const;
125 void setPvdTimeout(
unsigned int value);
132 void setFps(
double value);
134 unsigned int subSamples()
const;
136 void setSubSamples(
unsigned int value);
138 double scale()
const;
140 void setScale(
double value);
146 void enablePvd(
bool value);
148 bool isPvdEnabled()
const;
150 bool isInitialized()
const;
152 unsigned int threadsNumber()
const;
154 void setThreadsNumber(
unsigned int value);
156 void setFrictionOffsetThreshold(
double value);
158 void setCcdMaxSeparation(
double value);
160 void setSolverOffsetSlop(
double value);
162 void setBounceThresholdVelocity(
double value);
164 short solverType()
const;
166 void setSolverType(
short value);
168 void setKinematicKinematicFilter(
bool value);
170 void setStaticKinematicFilter(
bool value);
174 void setUseGpu(
bool value);
176 bool enableStabilization()
const;
178 void setEnableStabilization(
bool value);
180 bool enableEnhancedDeterminism()
const;
182 void setEnableEnhancedDeterminism(
bool value);
184 bool enableFrictionEveryIteration()
const;
186 void setEnableFrictionEveryIteration(
bool value);
188 bool enablePCM()
const;
190 void setEnablePCM(
bool value);
192 bool enableAdaptiveForce()
const;
194 void setEnableAdaptiveForce(
bool value);
196 bool enableCCD()
const;
198 void setEnableCCD(
bool value);
200 double elapsedTime()
const;
204 const std::string& name,
207 bool lazyCreation =
false);
213 std::unordered_map<size_t, RigidBody>& rigidBodies();
215 const RigidBody* rigidBody(
size_t id)
const;
217 const std::unordered_map<size_t, RigidBody>& rigidBodies()
const;
219 const std::unordered_map<size_t, std::string>& rigidBodyNames()
const;
221 const std::map<std::string, size_t>& rigidBodyNameIds()
const;
223 std::map<std::string, RigidBodyConstraint>& constraints();
225 const std::map<std::string, RigidBodyConstraint>& constraints()
const;
227 const std::map<std::pair<size_t, size_t>, std::string>& constraintNames()
const;
229 physx::PxRigidActor* createPhysicObject(
size_t id,
const RigidBodyAttributes& attributes, physx::PxGeometry* geo,
const physx::PxTransform* shapeOffset);
233 void setupDynamicAttributes(physx::PxRigidDynamic* rigid,
const RigidBodyAttributes& attributes)
const;
235 void setupKinematicAttributes(physx::PxRigidDynamic* rigid,
const RigidBodyAttributes& attributes)
const;
240 const std::string& name,
247 const std::string& name,
253 bool lazyCreation =
false);
256 const std::string& name,
263 physx::PxJoint* createRigidBodyConstraint(
265 physx::PxRigidActor* first,
266 physx::PxTransform& firstMatrix,
267 physx::PxRigidActor* second,
268 physx::PxTransform& secondMatrix);
271 const std::unordered_map<
int, std::vector<int>> &aggregates,
272 const std::unordered_map<int, bool> &aggregateEnableCollisions,
274 bool lazyCreation =
false);
276 void removeRigidBody(
size_t id);
278 void removeConstraint(
const std::string& name);
290 std::unordered_map<size_t, RigidBody> m_rbs;
292 std::unordered_map<size_t, std::string> m_rbNames;
294 std::map<std::string, size_t> m_rbNameIds;
296 std::map<std::string, RigidBodyConstraint> m_constraints;
298 std::map<std::pair<size_t, size_t>, std::string> m_constraintNames;
300 std::vector<physx::PxAggregate *> m_aggregates;
302 std::vector<physx::PxHeightField*> m_heigthFields;
304 physx::PxFoundation* m_foundation;
306 physx::PxPhysics* m_physics;
308 physx::PxCooking* m_cooking;
310 physx::PxCudaContextManager* m_cudaContextManager;
312 physx::PxDefaultCpuDispatcher* m_dispatcher;
314 physx::PxScene* m_scene;
318 std::string m_pvdHost;
322 unsigned int m_pvdTimeout;
326 unsigned int m_subSamples;
334 unsigned int m_maxThreads;
336 double m_frictionOffsetThreshold;
338 double m_ccdMaxSeparation;
340 double m_solverOffsetSlop;
342 double m_bounceThresholdVelocity;
346 bool m_isInitialized;
350 bool m_filterKinematicKinematicCollision;
352 bool m_filterStaticKinematicCollision;
354 std::atomic<size_t> m_freeId;
356 AtomsUPtr<ContactFilterCallback> m_contactFilterCallback;
358 AtomsUPtr<ContactModifyCallback> m_contactModifyCallback;
360 AtomsUPtr<AtomsCCDContactModification> m_ccdContactModifyCallback;
362 mutable std::mutex m_mutex;
364 std::map<size_t, LazyAggregateData> m_lazyAggregates;
366 std::map<std::string, LazyRigidBodyData> m_lazyRigidBodies;
368 std::map<std::string, LazyRigidBodyConstraintData> m_lazyConstraints;
370 std::map<size_t, physx::PxMaterial*> m_lazyMaterials;
374 bool m_enableStabilization;
376 bool m_enableEnhancedDeterminism;
378 bool m_enableFrictionEveryIteration;
382 bool m_enableAdaptiveForce;
386 double m_elapsedTime;