RavEngine
Loading...
Searching...
No Matches
PxsSimulationController.h
1// Redistribution and use in source and binary forms, with or without
2// modification, are permitted provided that the following conditions
3// are met:
4// * Redistributions of source code must retain the above copyright
5// notice, this list of conditions and the following disclaimer.
6// * Redistributions in binary form must reproduce the above copyright
7// notice, this list of conditions and the following disclaimer in the
8// documentation and/or other materials provided with the distribution.
9// * Neither the name of NVIDIA CORPORATION nor the names of its
10// contributors may be used to endorse or promote products derived
11// from this software without specific prior written permission.
12//
13// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
14// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24//
25// Copyright (c) 2008-2022 NVIDIA Corporation. All rights reserved.
26// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
27// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
28
29#ifndef PXS_SIMULATION_CONTROLLER_H
30#define PXS_SIMULATION_CONTROLLER_H
31
32#include "foundation/PxSimpleTypes.h"
33#include "foundation/PxPreprocessor.h"
34#include "foundation/PxTransform.h"
35#include "foundation/PxBitMap.h"
36#include "foundation/PxPinnedArray.h"
37#include "foundation/PxUserAllocated.h"
38#include "PxScene.h"
39#include "PxParticleSystem.h"
40
41#if PX_ENABLE_FEATURES_UNDER_CONSTRUCTION
42 #include "PxFLIPParticleSystem.h"
43 #include "PxMPMParticleSystem.h"
44
45 // if these assert fail adjust the type here and in the forward declaration of the #else section just below
46 PX_COMPILE_TIME_ASSERT(sizeof(physx::PxMPMParticleDataFlag::Enum) == sizeof(physx::PxU32));
47 PX_COMPILE_TIME_ASSERT(sizeof(physx::PxSparseGridDataFlag::Enum) == sizeof(physx::PxU32));
48#else
49 namespace PxMPMParticleDataFlag { enum Enum : physx::PxU32; }
50 namespace PxSparseGridDataFlag { enum Enum : physx::PxU32; }
51#endif
52
53#include "PxParticleSolverType.h"
54
55namespace physx
56{
57 namespace Dy
58 {
59 class Context;
60 struct Constraint;
61 class FeatherstoneArticulation;
62 struct ArticulationJointCore;
63 class ParticleSystemCore;
64 class ParticleSystem;
65
66#if PX_SUPPORT_GPU_PHYSX
67 class SoftBody;
68 class FEMCloth;
69 class HairSystem;
70#endif
71 }
72
73 namespace Cm
74 {
75 class EventProfiler;
76 }
77
78 namespace Bp
79 {
80 class BoundsArray;
81 class BroadPhase;
82 class AABBManagerBase;
83 }
84
85 namespace IG
86 {
87 class SimpleIslandManager;
88 class IslandSim;
89 }
90
91 namespace Sc
92 {
93 class BodySim;
94 }
95
96 class PxNodeIndex;
97 class PxsTransformCache;
98 class PxvNphaseImplementationContext;
99 class PxBaseTask;
100 class PxsContext;
101
102 struct PxsShapeSim;
103 class PxsRigidBody;
104 class PxsKernelWranglerManager;
105 class PxsHeapMemoryAllocatorManager;
106 class PxgParticleSystemCore;
107 struct PxConeLimitedConstraint;
108
109 class PxPhysXGpu;
110
111 struct PxgSolverConstraintManagerConstants;
112
114 {
115 public:
116 virtual void updateScBodyAndShapeSim(PxBaseTask* continuation) = 0;
117 virtual PxU32 getNbCcdBodies() = 0;
118
120 };
121
122
124 {
125 public:
126 PxsSimulationController(PxsSimulationControllerCallback* callback): mCallback(callback){}
127 virtual ~PxsSimulationController(){}
128
129 virtual void addJoint(const PxU32 edgeIndex, Dy::Constraint* constraint, IG::IslandSim& islandSim, PxArray<PxU32>& jointIndices,
130 PxPinnedArray<PxgSolverConstraintManagerConstants>& managerIter, PxU32 uniqueId) = 0;
131 virtual void removeJoint(const PxU32 edgeIndex, Dy::Constraint* constraint, PxArray<PxU32>& jointIndices, IG::IslandSim& islandSim) = 0;
132 virtual void addShape(PxsShapeSim* shapeSim, const PxU32 index) = 0;
133 virtual void reinsertShape(PxsShapeSim* shapeSim, const PxU32 index) = 0;
134 virtual void updateShape(PxsShapeSim& /*shapeSim*/, const PxNodeIndex& /*index*/) {}
135 virtual void removeShape(const PxU32 index) = 0;
136
137 virtual void addDynamic(PxsRigidBody* rigidBody, const PxNodeIndex& nodeIndex) = 0;
138 virtual void addDynamics(PxsRigidBody** rigidBody, const PxU32* nodeIndex, PxU32 nbToProcess) = 0;
139 virtual void addArticulation(Dy::FeatherstoneArticulation* articulation, const PxNodeIndex& nodeIndex) = 0;
140 virtual void releaseArticulation(Dy::FeatherstoneArticulation* articulation, const PxNodeIndex& nodeIndex) = 0;
141 virtual void releaseDeferredArticulationIds() = 0;
142
143#if PX_SUPPORT_GPU_PHYSX
144 virtual void addSoftBody(Dy::SoftBody* softBody, const PxNodeIndex& nodeIndex) = 0;
145 virtual void releaseSoftBody(Dy::SoftBody* softBody) = 0;
146 virtual void releaseDeferredSoftBodyIds() = 0;
147 virtual void activateSoftbody(Dy::SoftBody*) = 0;
148 virtual void deactivateSoftbody(Dy::SoftBody*) = 0;
149 virtual void activateSoftbodySelfCollision(Dy::SoftBody*) = 0;
150 virtual void deactivateSoftbodySelfCollision(Dy::SoftBody*) = 0;
151 virtual void setSoftBodyWakeCounter(Dy::SoftBody*) = 0;
152
153 virtual void addParticleFilter(Dy::SoftBody*softBodySystem, Dy::ParticleSystem* particleSystem,
154 PxU32 particleId, PxU32 userBufferId, PxU32 tetId) = 0;
155 virtual void removeParticleFilter(Dy::SoftBody* softBodySystem,
156 const Dy::ParticleSystem* particleSystem, PxU32 particleId, PxU32 userBufferId, PxU32 tetId) = 0;
157
158 virtual PxU32 addParticleAttachment(Dy::SoftBody*softBodySystem, const Dy::ParticleSystem* particleSystem,
159 PxU32 particleId, PxU32 userBufferId, PxU32 tetId, const PxVec4& barycentrics, const bool isActive) = 0;
160 virtual void removeParticleAttachment(Dy::SoftBody* softBody, PxU32 handle) = 0;
161
162 virtual void addRigidFilter(Dy::SoftBody*softBodySystem, const PxNodeIndex& softBodyNodeIndex,
163 const PxNodeIndex& rigidNodeIndex, PxU32 vertIndex) = 0;
164 virtual void removeRigidFilter(Dy::SoftBody* softBodySystem,
165 const PxNodeIndex& rigidNodeIndex, PxU32 vertIndex) = 0;
166
167 virtual PxU32 addRigidAttachment(Dy::SoftBody*softBodySystem, const PxNodeIndex& softBodyNodeIndex,
168 PxsRigidBody* rigidBody, const PxNodeIndex& rigidNodeIndex, PxU32 vertIndex, const PxVec3& actorSpacePose,
169 PxConeLimitedConstraint* constraint, const bool isActive) = 0;
170 virtual void removeRigidAttachment(Dy::SoftBody* softBody, PxU32 handle) = 0;
171
172 virtual void addTetRigidFilter(Dy::SoftBody* softBodySystem,
173 const PxNodeIndex& rigidNodeIndex, PxU32 tetId) = 0;
174
175 virtual PxU32 addTetRigidAttachment(Dy::SoftBody* softBodySystem,
176 PxsRigidBody* rigidBody, const PxNodeIndex& rigidNodeIndex, PxU32 tetIdx,
177 const PxVec4& barycentrics, const PxVec3& actorSpacePose, PxConeLimitedConstraint* constraint,
178 const bool isActive) = 0;
179
180 virtual void removeTetRigidFilter(Dy::SoftBody* softBody,
181 const PxNodeIndex& rigidNodeIndex, PxU32 tetId) = 0;
182
183 virtual void addSoftBodyFilter(Dy::SoftBody* softBody0, Dy::SoftBody* softBody1, PxU32 tetIdx0,
184 PxU32 tetIdx1) = 0;
185 virtual void removeSoftBodyFilter(Dy::SoftBody* softBody0, Dy::SoftBody* softBody1, PxU32 tetIdx0,
186 PxU32 tetId1) = 0;
187 virtual void addSoftBodyFilters(Dy::SoftBody* softBody0, Dy::SoftBody* softBody1, PxU32* tetIndices0, PxU32* tetIndices1,
188 PxU32 tetIndicesSize) = 0;
189 virtual void removeSoftBodyFilters(Dy::SoftBody* softBody0, Dy::SoftBody* softBody1, PxU32* tetIndices0, PxU32* tetIndices1,
190 PxU32 tetIndicesSize) = 0;
191
192 virtual PxU32 addSoftBodyAttachment(Dy::SoftBody* softBody0, Dy::SoftBody* softBody1, PxU32 tetIdx0, PxU32 tetIdx1,
193 const PxVec4& tetBarycentric0, const PxVec4& tetBarycentric1, PxConeLimitedConstraint* constraint, const bool isActive) = 0;
194 virtual void removeSoftBodyAttachment(Dy::SoftBody* softBody0, PxU32 handle) = 0;
195
196 virtual void addClothFilter(Dy::SoftBody* softBody, Dy::FEMCloth* cloth, PxU32 triIdx,
197 PxU32 tetIdx) = 0;
198 virtual void removeClothFilter(Dy::SoftBody* softBody, Dy::FEMCloth*, PxU32 triId,
199 PxU32 tetId) = 0;
200
201 virtual PxU32 addClothAttachment(Dy::SoftBody* softBody, Dy::FEMCloth* cloth, PxU32 triIdx,
202 const PxVec4& triBarycentric, PxU32 tetIdx, const PxVec4& tetBarycentric, PxConeLimitedConstraint* constraint,
203 const bool isActive) = 0;
204 virtual void removeClothAttachment(Dy::SoftBody* softBody,PxU32 handle) = 0;
205
206 virtual void addFEMCloth(Dy::FEMCloth* femCloth, const PxNodeIndex& nodeIndex) = 0;
207 virtual void releaseFEMCloth(Dy::FEMCloth* femCloth) = 0;
208 virtual void releaseDeferredFEMClothIds() = 0;
209 virtual void activateCloth(Dy::FEMCloth* femCloth) = 0;
210 virtual void deactivateCloth(Dy::FEMCloth* femCloth) = 0;
211 virtual void setClothWakeCounter(Dy::FEMCloth*) = 0;
212
213 virtual void addRigidFilter(Dy::FEMCloth* cloth,
214 const PxNodeIndex& rigidNodeIndex, PxU32 vertId) = 0;
215
216 virtual void removeRigidFilter(Dy::FEMCloth* cloth,
217 const PxNodeIndex& rigidNodeIndex, PxU32 vertId) = 0;
218
219 virtual PxU32 addRigidAttachment(Dy::FEMCloth* cloth, const PxNodeIndex& clothNodeIndex,
220 PxsRigidBody* rigidBody, const PxNodeIndex& rigidNodeIndex, PxU32 vertIndex, const PxVec3& actorSpacePose,
221 PxConeLimitedConstraint* constraint, const bool isActive) = 0;
222 virtual void removeRigidAttachment(Dy::FEMCloth* cloth, PxU32 handle) = 0;
223
224 virtual void addTriRigidFilter(Dy::FEMCloth* cloth,
225 const PxNodeIndex& rigidNodeIndex, PxU32 triIdx) = 0;
226
227 virtual void removeTriRigidFilter(Dy::FEMCloth* cloth,
228 const PxNodeIndex& rigidNodeIndex, PxU32 triIdx) = 0;
229
230 virtual PxU32 addTriRigidAttachment(Dy::FEMCloth* cloth,
231 PxsRigidBody* rigidBody, const PxNodeIndex& rigidNodeIndex, PxU32 triIdx, const PxVec4& barycentrics,
232 const PxVec3& actorSpacePose, PxConeLimitedConstraint* constraint,
233 const bool isActive) = 0;
234
235 virtual void removeTriRigidAttachment(Dy::FEMCloth* cloth, PxU32 handle) = 0;
236
237 virtual void addClothFilter(Dy::FEMCloth* cloth0, Dy::FEMCloth* cloth1, PxU32 triIdx0, PxU32 triIdx1) = 0;
238 virtual void removeClothFilter(Dy::FEMCloth* cloth0, Dy::FEMCloth* cloth1, PxU32 triIdx0, PxU32 triId1) = 0;
239
240 virtual PxU32 addTriClothAttachment(Dy::FEMCloth* cloth0, Dy::FEMCloth* cloth1, PxU32 triIdx0, PxU32 triIdx1,
241 const PxVec4& triBarycentric0, const PxVec4& triBarycentric1, const bool addToActive) = 0;
242
243 virtual void removeTriClothAttachment(Dy::FEMCloth* cloth0, PxU32 handle) = 0;
244
245
246 virtual void addParticleSystem(Dy::ParticleSystem* particleSystem, const PxNodeIndex& nodeIndex, PxParticleSolverType::Enum type) = 0;
247 virtual void releaseParticleSystem(Dy::ParticleSystem* particleSystem, PxParticleSolverType::Enum type) = 0;
248 virtual void releaseDeferredParticleSystemIds() = 0;
249
250 virtual void addHairSystem(Dy::HairSystem* hairSystem, const PxNodeIndex& nodeIndex) = 0;
251 virtual void releaseHairSystem(Dy::HairSystem* hairSystem) = 0;
252 virtual void releaseDeferredHairSystemIds() = 0;
253 virtual void activateHairSystem(Dy::HairSystem*) = 0;
254 virtual void deactivateHairSystem(Dy::HairSystem*) = 0;
255 virtual void setHairSystemWakeCounter(Dy::HairSystem*) = 0;
256#endif
257
258 virtual void flush() = 0;
259
260 virtual void updateDynamic(Dy::FeatherstoneArticulation* articulation, const PxNodeIndex& nodeIndex) = 0;
261 virtual void updateJoint(const PxU32 edgeIndex, Dy::Constraint* constraint) = 0;
262 virtual void updateBodies(PxsRigidBody** rigidBodies, PxU32* nodeIndices, const PxU32 nbBodies) = 0;
263 virtual void updateBodies(PxBaseTask* continuation) = 0;
264 virtual void updateShapes(PxBaseTask* continuation) = 0;
265 virtual void preIntegrateAndUpdateBound(PxBaseTask* continuation, const PxVec3 gravity, const PxReal dt) = 0;
266 virtual void updateParticleSystemsAndSoftBodies() = 0;
267 virtual void sortContacts() = 0;
268 virtual void update(PxBitMapPinned& changedHandleMap) = 0;
269 virtual void updateArticulation(Dy::FeatherstoneArticulation* articulation, const PxNodeIndex& nodeIndex) = 0;
270 virtual void updateArticulationJoint(Dy::FeatherstoneArticulation* articulation, const PxNodeIndex& nodeIndex) = 0;
271 virtual void updateArticulationExtAccel(Dy::FeatherstoneArticulation* articulation, const PxNodeIndex& nodeIndex) = 0;
272 virtual void updateArticulationAfterIntegration(PxsContext* llContext, Bp::AABBManagerBase* aabbManager, PxArray<Sc::BodySim*>& ccdBodies,
273 PxBaseTask* continuation, IG::IslandSim& islandSim, const float dt) = 0;
274
275 virtual void mergeChangedAABBMgHandle(const PxU32 maxAABBMgHandles, const bool suppressedReadback) = 0;
276 virtual void gpuDmabackData(PxsTransformCache& cache, Bp::BoundsArray& boundArray, PxBitMapPinned& changedAABBMgrHandles, bool suppressReadback) = 0;
277 virtual void updateScBodyAndShapeSim(PxsTransformCache& cache, Bp::BoundsArray& boundArray, PxBaseTask* continuation) = 0;
278 virtual PxU32* getActiveBodies() = 0;
279 virtual PxU32* getDeactiveBodies() = 0;
280 virtual void** getRigidBodies() = 0;
281 virtual PxU32 getNbBodies() = 0;
282
283 virtual PxU32* getUnfrozenShapes() = 0;
284 virtual PxU32* getFrozenShapes() = 0;
285 virtual PxsShapeSim** getShapeSims() = 0;
286 virtual PxU32 getNbFrozenShapes() = 0;
287 virtual PxU32 getNbUnfrozenShapes() = 0;
288 virtual PxU32 getNbShapes() = 0;
289
290 virtual void clear() = 0;
291 virtual void setBounds(Bp::BoundsArray* boundArray) = 0;
292 virtual void reserve(const PxU32 nbBodies) = 0;
293
294 virtual PxU32 getArticulationRemapIndex(const PxU32 nodeIndex) = 0;
295 //virtual void setParticleSystemManager(PxgParticleSystemCore* psCore) = 0;
296
297 virtual void copyArticulationData(void* data, void* index, PxArticulationGpuDataType::Enum dataType, const PxU32 nbCopyArticulations, void* copyEvent) = 0;
298 virtual void applyArticulationData(void* data, void* index, PxArticulationGpuDataType::Enum dataType, const PxU32 nbUpdatedArticulations,
299 void* waitEvent, void* signalEvent) = 0;
300
301 //KS - the methods below here should probably be wrapped in if PX_SUPPORT_GPU_PHYSX
302
303 virtual void copySoftBodyData(void** data, void* dataSizes, void* softBodyIndices, PxSoftBodyDataFlag::Enum flag, const PxU32 nbCopySoftBodies, const PxU32 maxSize, void* copyEvent) = 0;
304 virtual void applySoftBodyData(void** data, void* dataSizes, void* softBodyIndices, PxSoftBodyDataFlag::Enum flag, const PxU32 nbUpdatedSoftBodies, const PxU32 maxSize, void* applyEvent) = 0;
305 virtual void copyContactData(Dy::Context* dyContext, void* data, const PxU32 maxContactPairs, void* numContactPairs, void* copyEvent) = 0;
306 virtual void copyBodyData(PxGpuBodyData* data, PxGpuActorPair* index, const PxU32 nbUpdatedActors, void* copyEvent) = 0;
307 virtual void applyActorData(void* data, PxGpuActorPair* index, PxActorCacheFlag::Enum flag, const PxU32 nbUpdatedActors, void* waitEvent, void* signalEvent) = 0;
308
309 virtual void syncParticleData() = 0;
310
311 virtual void updateBoundsAndShapes(Bp::AABBManagerBase& aabbManager, const bool useGpuBp, const bool useDirectApi) = 0;
312
313 virtual void computeDenseJacobians(const PxIndexDataPair* indices, PxU32 nbIndices, void* computeEvent) = 0;
314 virtual void computeGeneralizedMassMatrices(const PxIndexDataPair* indices, PxU32 nbIndices, void* computeEvent) = 0;
315 virtual void computeGeneralizedGravityForces(const PxIndexDataPair* indices, PxU32 nbIndices, const PxVec3& gravity, void* computeEvent) = 0;
316 virtual void computeCoriolisAndCentrifugalForces(const PxIndexDataPair* indices, PxU32 nbIndices, void* computeEvent) = 0;
317 virtual void applyParticleBufferData(const PxU32* indices, const PxGpuParticleBufferIndexPair* indexPairs, const PxParticleBufferFlags* flags, PxU32 nbUpdatedBuffers, void* waitEvent, void* signalEvent) = 0;
318
319 virtual void flushInsertions() = 0;
320
321#if PX_SUPPORT_GPU_PHYSX
322 virtual PxU32 getNbDeactivatedFEMCloth() const = 0;
323 virtual PxU32 getNbActivatedFEMCloth() const = 0;
324
325 virtual Dy::FEMCloth** getDeactivatedFEMCloths() const = 0;
326 virtual Dy::FEMCloth** getActivatedFEMCloths() const = 0;
327
328
329 virtual PxU32 getNbDeactivatedSoftbodies() const = 0;
330 virtual PxU32 getNbActivatedSoftbodies() const = 0;
331
332 virtual const PxReal* getSoftBodyWakeCounters() const = 0;
333
334 virtual Dy::SoftBody** getDeactivatedSoftbodies() const = 0;
335 virtual Dy::SoftBody** getActivatedSoftbodies() const = 0;
336
337 virtual bool hasFEMCloth() const = 0;
338 virtual bool hasSoftBodies() const = 0;
339
340 virtual PxU32 getNbDeactivatedHairSystems() const = 0;
341 virtual PxU32 getNbActivatedHairSystems() const = 0;
342 virtual Dy::HairSystem** getDeactivatedHairSystems() const = 0;
343 virtual Dy::HairSystem** getActivatedHairSystems() const = 0;
344 virtual bool hasHairSystems() const = 0;
345
346#endif
347
348 virtual void* getMPMDataPointer(const Dy::ParticleSystem& psLL, PxMPMParticleDataFlag::Enum flags) = 0;
349 virtual void* getSparseGridDataPointer(const Dy::ParticleSystem& psLL, PxSparseGridDataFlag::Enum flags, PxParticleSolverType::Enum type) = 0;
350
351 protected:
353 };
354}
355
356#endif
Definition SnippetSoftBody.h:36
A structure responsible for: storing an aabb representation for each active shape in the related scen...
Definition BpAABBManagerBase.h:165
Definition BpAABBManagerBase.h:101
Definition DyContext.h:76
Definition DyFEMCloth.h:50
Definition DyFeatherstoneArticulation.h:590
Definition DyHairSystem.h:81
Definition DyParticleSystem.h:66
Definition DySoftBody.h:52
Definition PxsIslandSim.h:412
Definition PxArray.h:53
Enum
Definition PxArticulationFlag.h:52
Base class of all task types.
Definition PxTask.h:45
Container for bitfield flag variables associated with a specific enum type.
Definition PxFlags.h:73
PxNodeIndex.
Definition PxNodeIndex.h:51
Enum
Definition PxSoftBodyFlag.h:49
Definition PxUserAllocated.h:43
3 Element vector class.
Definition PxVec3.h:50
Definition PxVec4.h:50
Definition PxsContext.h:92
Definition PxsRigidBody.h:43
Definition PxsSimulationController.h:114
Definition PxsSimulationController.h:124
Definition PxsTransformCache.h:60
#define PX_COMPILE_TIME_ASSERT(exp)
Definition PxPreprocessor.h:428
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39
Definition DyConstraint.h:53
A constraint descriptor for limiting movement to a conical region.
Definition PxConeLimitedConstraint.h:48
Pair correspondence used for matching array indices with body node indices.
Definition PxActorData.h:89
State of a body used when interfacing with the GPU rigid body pipeline.
Definition PxActorData.h:76
A pair of particle buffer unique id and GPU particle system index.
Definition PxParticleSystemFlag.h:72
Maps numeric index to a data pointer.
Definition PxActorData.h:101
Enum
Definition PxParticleSolverType.h:53
Definition PxsShapeSim.h:40