// Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // * Neither the name of NVIDIA CORPORATION nor the names of its // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Copyright (c) 2008-2025 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. #ifndef PXG_BODYSIM_MANAGER_H #define PXG_BODYSIM_MANAGER_H #include "foundation/PxBitMap.h" #include "foundation/PxPinnedArray.h" #include "PxgCudaMemoryAllocator.h" #include "PxNodeIndex.h" #include "PxgBodySim.h" #include "CmIDPool.h" #include "CmBlockArray.h" #include "foundation/PxHashMap.h" namespace physx { class PxsRigidBody; struct PxsExternalAccelerationProvider; namespace IG { class NodeIndex; } namespace Dy { class FeatherstoneArticulation; class DeformableSurface; class DeformableVolume; class ParticleSystem; } struct PxgRemapIndices { public: PxU32 nodeIndex; //this is the index to PxgBodySim in GPU PxU32 remapIndex; //this is the index map between PxgBodySim and the PxgArticulation in GPU }; struct PxgArticulationUpdate { PxU32 articulationIndex; //Which articulation on GPU Dy::FeatherstoneArticulation* articulation; //Which articulation on CPU }; struct PxgArticulationIndices : public PxgRemapIndices {}; struct PxgSoftBodyIndices : public PxgRemapIndices {}; struct PxgFEMClothIndices : public PxgRemapIndices {}; struct PxgParticleSystemIndices : public PxgRemapIndices {}; struct PxgStaticConstraint { PxU32 uniqueId; PxU32 linkID; }; struct PxgSelfConstraint { PxU32 uniqueId; PxU32 linkID0; PxU32 linkID1; }; struct PxgStaticConstraints { static const PxU32 MaxConstraints = 16; PxArray mStaticContacts; PxArray mStaticJoints; }; struct PxgArticulationSelfConstraints { static const PxU32 MaxConstraints = 32; PxArray mSelfContacts; PxArray mSelfJoints; }; class PxgBodySimManager { PX_NOCOPY(PxgBodySimManager) public: PxgBodySimManager(const PxVirtualAllocator& allocator) : mNewUpdatedBodies(allocator), mTotalNumBodies(0), mNbUpdatedBodies(0), mTotalNumArticulations(0), mTotalNumSoftBodies(0), mTotalNumFEMCloths(0), mTotalNumPBDParticleSystems(0), mActivePBDParticleSystems(allocator), mActivePBDParticleSystemsDirty(false), mActiveSoftbodies(allocator), mActiveSelfCollisionSoftbodies(allocator), mActiveSoftbodiesDirty(false), mActiveFEMCloths(allocator), mActiveFEMClothsDirty(false), mTotalStaticArticContacts(0), mTotalStaticArticJoints(0), mTotalSelfArticContacts(0), mTotalSelfArticJoints(0), mMaxStaticArticContacts(0), mMaxStaticArticJoints(0), mMaxSelfArticContacts(0), mMaxSelfArticJoints(0), mTotalStaticRBContacts(0), mTotalStaticRBJoints(0), mMaxStaticRBContacts(0), mMaxStaticRBJoints(0), mExternalAccelerations(NULL) { } ~PxgBodySimManager(); void addBody(PxsRigidBody* bodyCore, const PxU32 nodeIndex); void addArticulation(Dy::FeatherstoneArticulation* articulation, const PxU32 nodeIndex, bool OmniPVDRecordDirectGPUAPI); void releaseArticulation(Dy::FeatherstoneArticulation* articulation, const PxU32 nodeIndex); void releaseDeferredArticulationIds(); void addSoftBody(Dy::DeformableVolume* deformableVolume, const PxU32 nodeIndex); void releaseSoftBody(Dy::DeformableVolume* deformableVolume); void releaseDeferredSoftBodyIds(); bool activateSoftbody(Dy::DeformableVolume* deformableVolume); bool deactivateSoftbody(Dy::DeformableVolume* deformableVolume); bool activateSoftbodySelfCollision(Dy::DeformableVolume* deformableVolume); bool deactivateSoftbodySelfCollision(Dy::DeformableVolume* deformableVolume); void addFEMCloth(Dy::DeformableSurface*, const PxU32 nodeIndex); void releaseFEMCloth(Dy::DeformableSurface*); void releaseDeferredFEMClothIds(); bool activateCloth(Dy::DeformableSurface*); bool deactivateCloth(Dy::DeformableSurface*); void addPBDParticleSystem(Dy::ParticleSystem* particleSystem, const PxU32 nodeIndex); void releasePBDParticleSystem(Dy::ParticleSystem* particleSystem); void releaseDeferredPBDParticleSystemIds(); void updateBodies(PxsRigidBody** rigidBodies, PxU32* nodeIndices, const PxU32 nbBodies, PxsExternalAccelerationProvider* externalAccelerations); void updateBody(const PxNodeIndex&); void destroy(); void updateArticulation(Dy::FeatherstoneArticulation* articulation, const PxU32 nodeIndex); void reset(); void reserve(const PxU32 nbBodies); bool addStaticArticulationContactManager(PxU32 uniqueIndex, const PxNodeIndex nodeIndex); bool removeStaticArticulationContactManager(PxU32 uniqueIndex, const PxNodeIndex nodeIndex); bool addStaticArticulationJoint(PxU32 uniqueIndex, const PxNodeIndex nodeIndex); bool removeStaticArticulationJoint(PxU32 uniqueIndex, const PxNodeIndex nodeIndex); bool addSelfArticulationContactManager(PxU32 uniqueIndex, const PxNodeIndex nodeIndex0, const PxNodeIndex nodeIndex1); bool removeSelfArticulationContactManager(PxU32 uniqueIndex, const PxNodeIndex nodeIndex0, const PxNodeIndex nodeIndex1); bool addSelfArticulationJoint(PxU32 uniqueIndex, const PxNodeIndex nodeIndex0, const PxNodeIndex nodeIndex1); bool removeSelfArticulationJoint(PxU32 uniqueIndex, const PxNodeIndex nodeIndex0, const PxNodeIndex nodeIndex1); bool addStaticRBContactManager(PxU32 uniqueIndex, const PxNodeIndex nodeIndex); bool removeStaticRBContactManager(PxU32 uniqueIndex, const PxNodeIndex nodeIndex); bool addStaticRBJoint(PxU32 uniqueIndex, const PxNodeIndex nodeIndex); bool removeStaticRBJoint(PxU32 uniqueIndex, const PxNodeIndex nodeIndex); PX_INLINE PxU32 getArticulationRemapIndex(PxU32 nodeIndex) { return mNodeToRemapMap.find(nodeIndex)->second;} PX_INLINE PxU32 getNumActiveParticleSystem() { return mActivePBDParticleSystems.size(); } PxArray mUpdatedArticulations; PxArray mBodies; //rigid bodies, articulations, soft bodies and particle systems PxArray mNewOrUpdatedBodySims; PxArray mNewArticulationSims; PxArray mNewSoftBodySims; PxArray mNewFEMClothSims; PxArray mDeformableSurfaces; PxArray mDeformableVolumes; PxArray mNewPBDParticleSystemSims; Cm::DeferredIDPool mArticulationIdPool; //generate the remap id between pxgbodysim and pxgarticulation Cm::DeferredIDPool mSoftBodyIdPool; //generate the remap id between pxgbodysim and pxgsoftbody Cm::DeferredIDPool mFEMClothIdPool; //generate the remap id between pxgbodysim and pxgfemcloth Cm::DeferredIDPool mPBDParticleSystemIdPool; //generate the remap id between pxgbodysim and pxgparticlesystem PxPinnedArray mNewUpdatedBodies; PxU32 mTotalNumBodies; //include rigid body and articulation PxU32 mNbUpdatedBodies; //this is used for multiply threads in the ScBeforeSolverTask to update body information PxBitMap mUpdatedMap; PxU32 mTotalNumArticulations; PxU32 mTotalNumSoftBodies; PxU32 mTotalNumFEMCloths; PxU32 mTotalNumPBDParticleSystems; PxArray mActiveFEMClothIndex; PxArray mActiveSoftbodyIndex; PxArray mActiveSelfCollisionSoftbodyIndex; PxInt32ArrayPinned mActivePBDParticleSystems; bool mActivePBDParticleSystemsDirty; PxInt32ArrayPinned mActiveSoftbodies; PxInt32ArrayPinned mActiveSelfCollisionSoftbodies; PxArray mActiveSoftbodiesStaging; PxArray mActiveSelfCollisionSoftBodiesStaging; bool mActiveSoftbodiesDirty; PxInt32ArrayPinned mActiveFEMCloths; PxArray mActiveFEMClothStaging; bool mActiveFEMClothsDirty; PxHashMap mNodeToRemapMap; #if PX_SUPPORT_OMNI_PVD PxHashMap mRemapToNodeMap; #endif PxArray mDeferredFreeNodeIDs; Cm::BlockArray mStaticConstraints; Cm::BlockArray mArticulationSelfConstraints; PxU32 mTotalStaticArticContacts; PxU32 mTotalStaticArticJoints; PxU32 mTotalSelfArticContacts; PxU32 mTotalSelfArticJoints; PxU32 mMaxStaticArticContacts; PxU32 mMaxStaticArticJoints; PxU32 mMaxSelfArticContacts; PxU32 mMaxSelfArticJoints; PxU32 mTotalStaticRBContacts; PxU32 mTotalStaticRBJoints; PxU32 mMaxStaticRBContacts; PxU32 mMaxStaticRBJoints; PxsExternalAccelerationProvider* mExternalAccelerations; }; } #endif