// 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 SC_SCENE_H #define SC_SCENE_H #include "PxPhysXConfig.h" #include "PxScene.h" #include "PxSimulationEventCallback.h" #include "foundation/PxPool.h" #include "foundation/PxHashSet.h" #include "foundation/PxHashMap.h" #include "CmTask.h" #include "CmFlushPool.h" #include "CmPreallocatingPool.h" #include "foundation/PxBitMap.h" #include "ScIterators.h" #include "PxsMaterialManager.h" #include "PxvManager.h" #include "ScStaticCore.h" #include "ScBodyCore.h" #include "PxAggregate.h" #include "PxsContext.h" #include "GuPrunerTypedef.h" #include "DyContext.h" #include "ScFiltering.h" #include "ScBroadphase.h" #include "ScInteraction.h" #include "ScArticulationJointSim.h" #include "ScConstraintInteraction.h" #include "ScConstraintSim.h" #define PX_MAX_DOMINANCE_GROUP 32 namespace { class OverlapFilterTask; class OnOverlapCreatedTask; class IslandInsertionTask; } namespace physx { class NpShape; struct PxTriggerPair; class PxsSimulationController; class PxsSimulationControllerCallback; class PxsMemoryManager; struct PxConeLimitedConstraint; #if PX_SUPPORT_GPU_PHYSX class PxsKernelWranglerManager; class PxsHeapMemoryAllocatorManager; #endif namespace IG { class SimpleIslandManager; typedef PxU32 EdgeIndex; } struct DelayedGPUTypes { struct Data { IG::EdgeIndex mEdgeIndex; IG::Edge::EdgeType mType; }; PxArray mDelayed; PxMutex mLock; }; class PxsCCDContext; namespace Cm { class IDPool; } namespace Bp { class AABBManagerBase; class BroadPhase; class BoundsArray; } namespace Dy { class FeatherstoneArticulation; class Context; #if PX_SUPPORT_GPU_PHYSX class DeformableSurface; class DeformableVolume; class ParticleSystem; #endif } namespace Sc { class ActorSim; class ElementSim; class ShapeCore; class RigidCore; class ConstraintCore; class ArticulationCore; class ArticulationJointCore; class ArticulationSpatialTendonCore; class ArticulationFixedTendonCore; class ArticulationMimicJointCore; class LLArticulationPool; class LLArticulationRCPool; class LLDeformableSurfacePool; class LLDeformableVolumePool; class LLParticleSystemPool; class BodyCore; class DeformableSurfaceCore; class DeformableVolumeCore; class ParticleSystemCore; class NPhaseCore; class ElementSimInteraction; class BodySim; class ShapeSim; class RigidSim; class StaticSim; class ConstraintSim; struct TriggerPairExtraData; class ObjectIDTracker; class ActorPairReport; class ContactStreamManager; class SqBoundsManager; class ShapeInteraction; class ElementInteractionMarker; class ArticulationSim; class DeformableSurfaceSim; class DeformableVolumeSim; class ParticleSystemSim; class SimStats; struct SimStateData; struct BatchInsertionState { BodySim* bodySim; StaticSim*staticSim; ShapeSim* shapeSim; ptrdiff_t staticActorOffset; ptrdiff_t staticShapeTableOffset; ptrdiff_t dynamicActorOffset; ptrdiff_t dynamicShapeTableOffset; ptrdiff_t shapeOffset; }; struct BatchRemoveState { PxInlineArray bufferedShapes; PxInlineArray removedShapes; }; struct SceneInternalFlag { enum Enum { eSCENE_SIP_STATES_DIRTY_DOMINANCE = (1<<1), eSCENE_SIP_STATES_DIRTY_VISUALIZATION = (1<<2), eSCENE_DEFAULT = 0 }; }; struct SimulationStage { enum Enum { eCOMPLETE, eCOLLIDE, eFETCHCOLLIDE, eADVANCE, eFETCHRESULT }; }; struct SqBoundsSync; struct SqRefFinder; struct ParticleOrSoftBodyRigidInteraction { IG::EdgeIndex mIndex; PxU32 mCount; ParticleOrSoftBodyRigidInteraction() : mCount(0) {} }; class Scene : public PxUserAllocated { struct SimpleBodyPair { ActorSim* body1; ActorSim* body2; PxU32 body1ID; PxU32 body2ID; }; PX_NOCOPY(Scene) public: Scene(const PxSceneDesc& desc, PxU64 contextID); ~Scene() {} //use release() plz. void preAllocate(PxU32 nbStatics, PxU32 nbBodies, PxU32 nbStaticShapes, PxU32 nbDynamicShapes); void release(); PX_FORCE_INLINE PxsSimulationController* getSimulationController() { return mSimulationController; } PX_FORCE_INLINE const PxsSimulationController* getSimulationController() const { return mSimulationController; } PX_FORCE_INLINE Bp::AABBManagerBase* getAABBManager() { return mAABBManager; } PX_FORCE_INLINE const Bp::AABBManagerBase* getAABBManager() const { return mAABBManager; } PX_FORCE_INLINE PxArray& getCcdBodies() { return mCcdBodies; } PX_FORCE_INLINE IG::SimpleIslandManager* getSimpleIslandManager() { return mSimpleIslandManager; } PX_FORCE_INLINE const IG::SimpleIslandManager* getSimpleIslandManager() const { return mSimpleIslandManager; } PX_FORCE_INLINE SimulationStage::Enum getSimulationStage() const { return mSimulationStage; } PX_FORCE_INLINE void setSimulationStage(SimulationStage::Enum stage) { mSimulationStage = stage; } PX_FORCE_INLINE PxPool* getSimStateDataPool() { return mSimStateDataPool; } PX_FORCE_INLINE PxBitMap& getDirtyShapeSimMap() { return mDirtyShapeSimMap; } PX_FORCE_INLINE void setGravity(const PxVec3& g) { mGravity = g; } PX_FORCE_INLINE const PxVec3& getGravity() const { return mGravity; } PX_FORCE_INLINE void setElapsedTime(PxReal t) { mDt = t; mOneOverDt = t > 0.0f ? 1.0f/t : 0.0f; } PX_FORCE_INLINE PxReal getOneOverDt() const { return mOneOverDt; } // PX_FORCE_INLINE PxReal getDt() const { return mDt; } PX_FORCE_INLINE void setLimits(const PxSceneLimits& limits) { mLimits = limits; } PX_FORCE_INLINE const PxSceneLimits& getLimits() const { return mLimits; } PX_FORCE_INLINE void setBatchRemove(BatchRemoveState* bs) { mBatchRemoveState = bs; } PX_FORCE_INLINE BatchRemoveState* getBatchRemove() const { return mBatchRemoveState; } PX_FORCE_INLINE void setMaxArticulationLinks(const PxU32 maxLinks) { mMaxNbArticulationLinks = maxLinks; } PX_FORCE_INLINE PxU32 getMaxArticulationLinks() const { return mMaxNbArticulationLinks; } // mDynamicsContext wrappers PX_FORCE_INLINE Dy::Context* getDynamicsContext() { return mDynamicsContext; } PX_FORCE_INLINE const Dy::Context* getDynamicsContext() const { return mDynamicsContext; } PX_FORCE_INLINE void setBounceThresholdVelocity(PxReal t) { mDynamicsContext->setBounceThreshold(-t); } PX_FORCE_INLINE PxReal getBounceThresholdVelocity() const { return -mDynamicsContext->getBounceThreshold(); } PX_FORCE_INLINE PxSolverType::Enum getSolverType() const { return mDynamicsContext->getSolverType(); } PX_FORCE_INLINE void setSolverBatchSize(PxU32 solverBatchSize) { mDynamicsContext->setSolverBatchSize(solverBatchSize); } PX_FORCE_INLINE PxU32 getSolverBatchSize() const { return mDynamicsContext->getSolverBatchSize(); } PX_FORCE_INLINE void setSolverArticBatchSize(PxU32 solverBatchSize) { mDynamicsContext->setSolverArticBatchSize(solverBatchSize); } PX_FORCE_INLINE PxU32 getSolverArticBatchSize() const { return mDynamicsContext->getSolverArticBatchSize(); } PX_FORCE_INLINE void setCCDMaxSeparation(PxReal separation) { mDynamicsContext->setCCDSeparationThreshold(separation); } PX_FORCE_INLINE PxReal getCCDMaxSeparation() const { return mDynamicsContext->getCCDSeparationThreshold(); } PX_FORCE_INLINE void setMaxBiasCoefficient(PxReal coeff) { mDynamicsContext->setMaxBiasCoefficient(coeff); } PX_FORCE_INLINE PxReal getMaxBiasCoefficient() const { return mDynamicsContext->getMaxBiasCoefficient(); } PX_FORCE_INLINE void setFrictionOffsetThreshold(PxReal t) { mDynamicsContext->setFrictionOffsetThreshold(t); } PX_FORCE_INLINE PxReal getFrictionOffsetThreshold() const { return mDynamicsContext->getFrictionOffsetThreshold(); } PX_FORCE_INLINE void setFrictionCorrelationDistance(PxReal t) { mDynamicsContext->setCorrelationDistance(t); } PX_FORCE_INLINE PxReal getFrictionCorrelationDistance() const { return mDynamicsContext->getCorrelationDistance(); } PX_FORCE_INLINE PxReal getLengthScale() const { return mDynamicsContext->getLengthScale(); } PX_FORCE_INLINE void setDynamicsDirty() { mDynamicsContext->setStateDirty(true); } //~mDynamicsContext wrappers // mLLContext wrappers PX_FORCE_INLINE PxsContext* getLowLevelContext() { return mLLContext; } PX_FORCE_INLINE const PxsContext* getLowLevelContext() const { return mLLContext; } PX_FORCE_INLINE Cm::FlushPool* getFlushPool() { return &mLLContext->getTaskPool(); } PX_FORCE_INLINE void setPCM(bool enabled) { mLLContext->setPCM(enabled); } PX_FORCE_INLINE void setContactCache(bool enabled) { mLLContext->setContactCache(enabled); } PX_FORCE_INLINE void setContactModifyCallback(PxContactModifyCallback* callback) { mLLContext->setContactModifyCallback(callback); } PX_FORCE_INLINE PxContactModifyCallback* getContactModifyCallback() const { return mLLContext->getContactModifyCallback(); } PX_FORCE_INLINE void setDeformableSurfaceGpuPostSolveCallback(PxPostSolveCallback* callback) { mSimulationController->setDeformableSurfaceGpuPostSolveCallback(callback); } PX_FORCE_INLINE void setDeformableVolumeGpuPostSolveCallback(PxPostSolveCallback* callback) { mSimulationController->setDeformableVolumeGpuPostSolveCallback(callback); } PX_FORCE_INLINE void setVisualizationParameter(PxVisualizationParameter::Enum param, PxReal value) { mVisualizationParameterChanged = true; mLLContext->setVisualizationParameter(param, value); } PX_FORCE_INLINE PxReal getVisualizationParameter(PxVisualizationParameter::Enum param) const { return mLLContext->getVisualizationParameter(param); } PX_FORCE_INLINE void setVisualizationCullingBox(const PxBounds3& box) { mLLContext->setVisualizationCullingBox(box); } PX_FORCE_INLINE const PxBounds3& getVisualizationCullingBox() const { return mLLContext->getVisualizationCullingBox(); } PX_FORCE_INLINE PxReal getVisualizationScale() const { return mLLContext->getRenderScale(); } PX_FORCE_INLINE PxRenderBuffer& getRenderBuffer() { return mLLContext->getRenderBuffer(); } PX_FORCE_INLINE void setNbContactDataBlocks(PxU32 blockCount) { mLLContext->getNpMemBlockPool().setBlockCount(blockCount); } PX_FORCE_INLINE PxU32 getNbContactDataBlocksUsed() const { return mLLContext->getNpMemBlockPool().getUsedBlockCount(); } PX_FORCE_INLINE PxU32 getMaxNbContactDataBlocksUsed() const { return mLLContext->getNpMemBlockPool().getMaxUsedBlockCount(); } PX_FORCE_INLINE PxU32 getMaxNbConstraintDataBlocksUsed() const { return mLLContext->getNpMemBlockPool().getPeakConstraintBlockCount(); } PX_FORCE_INLINE void setScratchBlock(void* addr, PxU32 size) { mLLContext->setScratchBlock(addr, size); } //~mLLContext wrappers PX_FORCE_INLINE void setFlags(PxSceneFlags flags) { mPublicFlags = flags; } PX_FORCE_INLINE PxSceneFlags getFlags() const { return mPublicFlags; } PX_FORCE_INLINE bool readInternalFlag(SceneInternalFlag::Enum flag) const { return (mInternalFlags & flag) != 0; } void addStatic(StaticCore&, NpShape*const *shapes, PxU32 nbShapes, size_t shapePtrOffset, PxBounds3* uninflatedBounds); void removeStatic(StaticCore&, PxInlineArray& removedShapes, bool wakeOnLostTouch); void addBody(BodyCore&, NpShape*const *shapes, PxU32 nbShapes, size_t shapePtrOffset, PxBounds3* uninflatedBounds, bool compound); void removeBody(BodyCore&, PxInlineArray& removedShapes, bool wakeOnLostTouch); // Batch insertion API. // the bounds generated here are the uninflated bounds for the shapes, *if* they are trigger or sim shapes. // It's up to the caller to ensure the bounds array is big enough. // Some care is required in handling these since sim and SQ tweak the bounds in slightly different ways. void startBatchInsertion(BatchInsertionState&); void addStatic(PxActor* actor, BatchInsertionState&, PxBounds3* outBounds); void addBody(PxActor* actor, BatchInsertionState&, PxBounds3* outBounds, bool compound); void finishBatchInsertion(BatchInsertionState&); void addConstraint(ConstraintCore&, RigidCore*, RigidCore*); void removeConstraint(ConstraintCore&); void addConstraintToMap(ConstraintCore& constraint, RigidCore*, RigidCore*); void removeConstraintFromMap(const ConstraintInteraction&); void addArticulation(ArticulationCore&, BodyCore& root); void removeArticulation(ArticulationCore&); void addArticulationJoint(ArticulationJointCore&, BodyCore& parent, BodyCore& child); void removeArticulationJoint(ArticulationJointCore&); void addArticulationTendon(ArticulationSpatialTendonCore&); static void removeArticulationTendon(ArticulationSpatialTendonCore&); void addArticulationTendon(ArticulationFixedTendonCore&); static void removeArticulationTendon(ArticulationFixedTendonCore&); void addArticulationMimicJoint(ArticulationMimicJointCore&); static void removeArticulationMimicJoint(ArticulationMimicJointCore&); void addArticulationSimControl(ArticulationCore& core); void removeArticulationSimControl(ArticulationCore& core); void updateBodySim(BodySim& sim); PX_FORCE_INLINE PxU32 getNbArticulations() const { return mArticulations.size(); } PX_FORCE_INLINE ArticulationCore* const* getArticulations() { return mArticulations.getEntries(); } PX_FORCE_INLINE PxU32 getNbConstraints() const { return mConstraints.size(); } PX_FORCE_INLINE ConstraintCore*const* getConstraints() const { return mConstraints.getEntries(); } PX_FORCE_INLINE ConstraintCore*const* getConstraints() { return mConstraints.getEntries(); } void initContactsIterator(ContactIterator&, PxsContactManagerOutputIterator&); void setSimulationEventCallback(PxSimulationEventCallback* callback); PxSimulationEventCallback* getSimulationEventCallback() const; void setCCDContactModifyCallback(PxCCDContactModifyCallback* callback); PxCCDContactModifyCallback* getCCDContactModifyCallback() const; void setCCDMaxPasses(PxU32 ccdMaxPasses); PxU32 getCCDMaxPasses() const; void setCCDThreshold(PxReal t); PxReal getCCDThreshold() const; // Broad-phase management void finishBroadPhase(PxBaseTask* continuation); void finishBroadPhaseStage2(PxU32 ccdPass); void preallocateContactManagers(PxBaseTask* continuation); void islandInsertion(PxBaseTask* continuation); void registerContactManagers(PxBaseTask* continuation); void registerInteractions(PxBaseTask* continuation); void registerSceneInteractions(PxBaseTask* continuation); void secondPassNarrowPhase(PxBaseTask* continuation); void setDominanceGroupPair(PxDominanceGroup group1, PxDominanceGroup group2, const PxDominanceGroupPair& dominance); PxDominanceGroupPair getDominanceGroupPair(PxDominanceGroup group1, PxDominanceGroup group2) const; // Run void simulate(PxReal timeStep, PxBaseTask* continuation); void advance(PxReal timeStep, PxBaseTask* continuation); void collide(PxReal timeStep, PxBaseTask* continuation); void endSimulation(); void flush(bool sendPendingReports); void fireBrokenConstraintCallbacks(); void fireTriggerCallbacks(); void fireQueuedContactCallbacks(); void fireOnAdvanceCallback(); const PxArray& getQueuedContactPairHeaders(); void postCallbacksPreSync(); void postCallbacksPreSyncKinematics(); void postReportsCleanup(); void fireCallbacksPostSync(); void syncSceneQueryBounds(SqBoundsSync& sync, SqRefFinder& finder); PxU32 getDefaultContactReportStreamBufferSize() const; void visualizeStartStep(); void visualizeContacts(); // PX_ENABLE_SIM_STATS void getStats(PxSimulationStatistics& stats) const; PX_FORCE_INLINE SimStats& getStatsInternal() { return *mStats; } // PX_ENABLE_SIM_STATS void buildActiveActors(); void buildActiveAndFrozenActors(); PxActor** getActiveActors(PxU32& nbActorsOut); void setActiveActors(PxActor** actors, PxU32 nbActors); PxActor** getFrozenActors(PxU32& nbActorsOut); void finalizeContactStreamAndCreateHeader(PxContactPairHeader& header, const ActorPairReport& aPair, ContactStreamManager& cs, PxU32 removedShapeTestMask); PxTaskManager* getTaskManagerPtr() const { return mTaskManager; } PxCudaContextManager* getCudaContextManager() const { return mCudaContextManager; } void shiftOrigin(const PxVec3& shift); PX_FORCE_INLINE bool isCollisionPhaseActive() const { return mIsCollisionPhaseActive; } PX_FORCE_INLINE void setCollisionPhaseToActive() { PX_ASSERT(!mIsCollisionPhaseActive); mIsCollisionPhaseActive = true; } PX_FORCE_INLINE void setCollisionPhaseToInactive() { PX_ASSERT(mIsCollisionPhaseActive); mIsCollisionPhaseActive = false; } void addShape_(RigidSim&, ShapeCore&); void removeShape_(ShapeSim&, bool wakeOnLostTouch); void registerShapeInNphase(RigidCore* rigidCore, const ShapeCore& shapeCore, const PxU32 transformCacheID); void unregisterShapeFromNphase(const ShapeCore& shapeCore, const PxU32 transformCacheID); void notifyNphaseOnUpdateShapeMaterial(const ShapeCore& shapeCore); // Get an array of the active actors. PX_FORCE_INLINE BodyCore*const* getActiveBodiesArray() const { return mActiveBodies.begin(); } PX_FORCE_INLINE PxU32 getNumActiveBodies() const { return mActiveBodies.size(); } PX_FORCE_INLINE BodyCore*const* getActiveCompoundBodiesArray() const { return mActiveCompoundBodies.begin(); } PX_FORCE_INLINE PxU32 getNumActiveCompoundBodies() const { return mActiveCompoundBodies.size(); } PX_FORCE_INLINE PxU32 getNbInteractions(InteractionType::Enum type) const { return mInteractions[type].size(); } PX_FORCE_INLINE PxU32 getNbActiveInteractions(InteractionType::Enum type) const { return mActiveInteractionCount[type]; } // Get all interactions of a certain type PX_FORCE_INLINE ElementSimInteraction** getInteractions(InteractionType::Enum type) { return mInteractions[type].begin(); } PX_FORCE_INLINE ElementSimInteraction** getActiveInteractions(InteractionType::Enum type) { return mInteractions[type].begin(); } void registerInteraction(ElementSimInteraction* interaction, bool active); void unregisterInteraction(ElementSimInteraction* interaction); void notifyInteractionActivated(Interaction* interaction); void notifyInteractionDeactivated(Interaction* interaction); // for pool management of interaction arrays, a major cause of dynamic allocation void** allocatePointerBlock(PxU32 size); void deallocatePointerBlock(void**, PxU32 size); private: // Get the number of active one-way dominator actors PX_FORCE_INLINE PxU32 getActiveKinematicBodiesCount() const { return mActiveKinematicBodyCount; } // Get an iterator to the active one-way dominator actors PX_FORCE_INLINE BodyCore*const* getActiveKinematicBodies() const { return mActiveBodies.begin(); } // Get the number of active non-kinematic actors PX_FORCE_INLINE PxU32 getActiveDynamicBodiesCount() const { return mActiveBodies.size() - mActiveKinematicBodyCount; } // Get the active non-kinematic actors PX_FORCE_INLINE BodyCore*const* getActiveDynamicBodies() const { return mActiveBodies.begin() + mActiveKinematicBodyCount; } void swapInteractionArrayIndices(PxU32 id1, PxU32 id2, InteractionType::Enum type); public: void addDirtyArticulationSim(ArticulationSim* artiSim); void removeDirtyArticulationSim(ArticulationSim* artiSim); void addToActiveList(ActorSim& actor); void removeFromActiveList(ActorSim& actor); void removeFromActiveCompoundBodyList(BodySim& actor); void swapInActiveBodyList(BodySim& body); // call when an active body gets switched from dynamic to kinematic or vice versa void addActiveBreakableConstraint(ConstraintSim*, ConstraintInteraction*); void removeActiveBreakableConstraint(ConstraintSim*); //the Actor should register its top level shapes with these. void removeBody(BodySim&); //lists of actors woken up or put to sleep last simulate void onBodyWakeUp(BodySim* body); void onBodySleep(BodySim* body); PX_FORCE_INLINE bool isValid() const { return (mLLContext != NULL); } void addToLostTouchList(ActorSim& body1, ActorSim& body2); PxU32 createAggregate(void* userData, PxU32 maxNumShapes, PxAggregateFilterHint filterHint, PxU32 envID); void deleteAggregate(PxU32 id); Dy::FeatherstoneArticulation* createLLArticulation(ArticulationSim* sim); void destroyLLArticulation(Dy::FeatherstoneArticulation&); PX_FORCE_INLINE PxPool2& getConstraintInteractionPool() { return mConstraintInteractionPool; } public: PX_FORCE_INLINE const PxsMaterialManager& getMaterialManager() const { return mMaterialManager; } PX_FORCE_INLINE PxsMaterialManager& getMaterialManager() { return mMaterialManager; } PX_FORCE_INLINE const BroadphaseManager& getBroadphaseManager() const { return mBroadphaseManager; } PX_FORCE_INLINE BroadphaseManager& getBroadphaseManager() { return mBroadphaseManager; } PX_FORCE_INLINE bool fireOutOfBoundsCallbacks() { return mBroadphaseManager.fireOutOfBoundsCallbacks(mAABBManager, *mElementIDPool, mContextId); } // Collision filtering void setFilterShaderData(const void* data, PxU32 dataSize); PX_FORCE_INLINE const void* getFilterShaderDataFast() const { return mFilterShaderData; } PX_FORCE_INLINE PxU32 getFilterShaderDataSizeFast() const { return mFilterShaderDataSize; } PX_FORCE_INLINE PxSimulationFilterShader getFilterShaderFast() const { return mFilterShader; } PX_FORCE_INLINE PxSimulationFilterCallback* getFilterCallbackFast() const { return mFilterCallback; } PX_FORCE_INLINE PxPairFilteringMode::Enum getKineKineFilteringMode() const { return mKineKineFilteringMode; } PX_FORCE_INLINE PxPairFilteringMode::Enum getStaticKineFilteringMode() const { return mStaticKineFilteringMode; } PX_FORCE_INLINE PxU32 getTimeStamp() const { return mTimeStamp; } PX_FORCE_INLINE PxU32 getReportShapePairTimeStamp() const { return mReportShapePairTimeStamp; } PX_FORCE_INLINE NPhaseCore* getNPhaseCore() const { return mNPhaseCore; } void checkConstraintBreakage(); void collectSolverResidual(); PxSceneResidual getSolverResidual() const; PX_FORCE_INLINE PxArray& getTriggerBufferExtraData() { return *mTriggerBufferExtraData; } PX_FORCE_INLINE PxArray& getTriggerBufferAPI() { return mTriggerBufferAPI; } void reserveTriggerReportBufferSpace(const PxU32 pairCount, PxTriggerPair*& triggerPairBuffer, TriggerPairExtraData*& triggerPairExtraBuffer); PX_FORCE_INLINE ObjectIDTracker& getActorIDTracker() { return *mActorIDTracker; } PX_FORCE_INLINE void markReleasedBodyIDForLostTouch(PxU32 id) { mLostTouchPairsDeletedBodyIDs.growAndSet(id); } void resizeReleasedBodyIDMaps(PxU32 maxActors, PxU32 numActors); PX_FORCE_INLINE StaticSim& getStaticAnchor() { return *mStaticAnchor; } PX_FORCE_INLINE Bp::BoundsArray& getBoundsArray() const { return *mBoundsArray; } PX_FORCE_INLINE void updateContactDistance(PxU32 idx, PxReal distance) { (*mContactDistance)[idx] = distance; mHasContactDistanceChanged = true; } PX_FORCE_INLINE SqBoundsManager& getSqBoundsManager() const { return *mSqBoundsManager; } PX_FORCE_INLINE BodyCore* const* getSleepBodiesArray(PxU32& count) { count = mSleepBodies.size(); return mSleepBodies.getEntries(); } PX_FORCE_INLINE PxTaskManager& getTaskManager() const { PX_ASSERT(mTaskManager); return *mTaskManager; } PX_FORCE_INLINE void setPostSolverVelocityNeeded() { mContactReportsNeedPostSolverVelocity = true; } PX_FORCE_INLINE ObjectIDTracker& getConstraintIDTracker() { return *mConstraintIDTracker; } PX_FORCE_INLINE ObjectIDTracker& getElementIDPool() { return *mElementIDPool; } PX_FORCE_INLINE PxBitMap& getVelocityModifyMap() { return mVelocityModifyMap; } void* allocateConstraintBlock(PxU32 size); void deallocateConstraintBlock(void* addr, PxU32 size); void stepSetupCollide(PxBaseTask* continuation);//This is very important to guarantee thread safety in the collide PX_FORCE_INLINE void addToPosePreviewList(BodySim& b) { PX_ASSERT(!mPosePreviewBodies.contains(&b)); mPosePreviewBodies.insert(&b); } PX_FORCE_INLINE void removeFromPosePreviewList(BodySim& b) { PX_ASSERT(mPosePreviewBodies.contains(&b)); mPosePreviewBodies.erase(&b); } #if PX_DEBUG PX_FORCE_INLINE bool isInPosePreviewList(BodySim& b) const { return mPosePreviewBodies.contains(&b); } #endif PX_FORCE_INLINE void setSpeculativeCCDRigidBody(PxU32 index) { mSpeculativeCCDRigidBodyBitMap.growAndSet(index); } PX_FORCE_INLINE void resetSpeculativeCCDRigidBody(PxU32 index) { if(index < mSpeculativeCCDRigidBodyBitMap.size()) mSpeculativeCCDRigidBodyBitMap.reset(index); } PX_FORCE_INLINE void setSpeculativeCCDArticulationLink(PxU32 index) { mSpeculativeCDDArticulationBitMap.growAndSet(index); } PX_FORCE_INLINE void resetSpeculativeCCDArticulationLink(PxU32 index) { if(index < mSpeculativeCDDArticulationBitMap.size()) mSpeculativeCDDArticulationBitMap.reset(index); } PX_FORCE_INLINE PxU64 getContextId() const { return mContextId; } PX_FORCE_INLINE bool isUsingGpuDynamicsOrBp() const { return mUseGpuBp || mUseGpuDynamics; } PX_FORCE_INLINE bool isUsingGpuDynamicsAndBp() const { return mUseGpuBp && mUseGpuDynamics; } PX_FORCE_INLINE bool isUsingGpuDynamics() const { return mUseGpuDynamics; } PX_FORCE_INLINE bool isUsingGpuBp() const { return mUseGpuBp; } PX_FORCE_INLINE void setDirectGPUAPIInitialized() { mIsDirectGPUAPIInitialized = true; } PX_FORCE_INLINE bool isDirectGPUAPIInitialized() const { return mIsDirectGPUAPIInitialized; } // statistics counters increase/decrease PX_FORCE_INLINE void increaseNumKinematicsCounter() { mNbRigidKinematic++; } PX_FORCE_INLINE void decreaseNumKinematicsCounter() { mNbRigidKinematic--; } PX_FORCE_INLINE void increaseNumDynamicsCounter() { mNbRigidDynamics++; } PX_FORCE_INLINE void decreaseNumDynamicsCounter() { mNbRigidDynamics--; } ConstraintCore* findConstraintCore(const ActorSim* sim0, const ActorSim* sim1); //internal private methods: private: void activateEdgesInternal(IG::Edge::EdgeType type); void releaseConstraints(bool endOfScene); PX_INLINE void clearBrokenConstraintBuffer() { mBrokenConstraints.clear(); } ///////////////////////////////////////////////////////////// void collideStep(PxBaseTask* continuation); void advanceStep(PxBaseTask* continuation); // subroutines of collideStep/solveStep: void kinematicsSetup(PxBaseTask* continuation); void stepSetupSolve(PxBaseTask* continuation); void processNarrowPhaseTouchEvents(PxBaseTask* continuation); void setEdgesConnected(PxBaseTask* continuation); void processNarrowPhaseLostTouchEvents(PxBaseTask* continuation); void processNarrowPhaseLostTouchEventsIslands(PxBaseTask* continuation); void processLostTouchPairs(); void integrateKinematicPose(); void updateKinematicCached(PxBaseTask* continuation); void beforeSolver(PxBaseTask* continuation); void checkForceThresholdContactEvents(PxU32 ccdPass); private: void putObjectsToSleep(); void wakeObjectsUp(); void collectPostSolverVelocitiesBeforeCCD(); void clearSleepWakeBodies(); PX_INLINE void cleanUpSleepBodies(); PX_INLINE void cleanUpWokenBodies(); PX_INLINE void cleanUpSleepOrWokenBodies(PxCoalescedHashSet& bodyList, PxU32 removeFlag, bool& validMarker); private: // Material manager PX_ALIGN(16, PxsMaterialManager mMaterialManager); BroadphaseManager mBroadphaseManager; PxU64 mContextId; PxArray mActiveBodies; // Sorted: kinematic before dynamic PxU32 mActiveKinematicBodyCount; // Number of active kinematics. This is also the index in mActiveBodies where the active dynamic bodies start. PxU32 mActiveDynamicBodyCount; // Number of active dynamics. This is also the index in mActiveBodies where the active soft bodies start. PxArray mActiveCompoundBodies; BodyCore** mActiveKinematicsCopy; PxU32 mActiveKinematicsCopyCapacity; // PT: this array used for: // - debug visualization // - processing trigger interactions // - updating dirty interactions PxArray mInteractions[InteractionType::eTRACKED_IN_SCENE_COUNT]; PxU32 mActiveInteractionCount[InteractionType::eTRACKED_IN_SCENE_COUNT]; // Interactions with id < activeInteractionCount are active template struct Block { PxU8 mem[sizeof(T)*size]; Block() {} // get around VS warning C4345, otherwise useless }; typedef Block PointerBlock8; typedef Block PointerBlock16; typedef Block PointerBlock32; PxPool mPointerBlock8Pool; PxPool mPointerBlock16Pool; PxPool mPointerBlock32Pool; PxsContext* mLLContext; Bp::AABBManagerBase* mAABBManager; PxsCCDContext* mCCDContext; PxI32 mNumFastMovingShapes; PxU32 mCCDPass; IG::SimpleIslandManager* mSimpleIslandManager; Dy::Context* mDynamicsContext; PxsMemoryManager* mMemoryManager; #if PX_SUPPORT_GPU_PHYSX PxsKernelWranglerManager* mGpuWranglerManagers; PxsHeapMemoryAllocatorManager* mHeapMemoryAllocationManager; #endif PxsSimulationController* mSimulationController; PxsSimulationControllerCallback* mSimulationControllerCallback; PxSceneLimits mLimits; PxVec3 mGravity; //!< Gravity vector PxArray mQueuedContactPairHeaders; //time: //constants set with setTiming(): PxReal mDt; //delta time for current step. PxReal mOneOverDt; //inverse of dt. //stepping / counters: PxU32 mTimeStamp; //Counts number of steps. PxU32 mReportShapePairTimeStamp; //Timestamp for refreshing the shape pair report structure. Updated before delayed shape/actor deletion and before CCD passes. //containers: // Those ones contain shape ptrs from Actor, i.e. compound level, not subparts PxCoalescedHashSet mConstraints; Bp::BoundsArray* mBoundsArray; PxFloatArrayPinned* mContactDistance; bool mHasContactDistanceChanged; SqBoundsManager* mSqBoundsManager; PxArray mCcdBodies; PxArray mTriggerBufferAPI; PxArray* mTriggerBufferExtraData; PxCoalescedHashSet mArticulations; PxCoalescedHashSet mDirtyArticulationSims; PxArray mBrokenConstraints; PxCoalescedHashSet mActiveBreakableConstraints; // pools for joint buffers // The pools below currently cover all the internal cases typedef Block MemBlock128; typedef Block MemBlock256; typedef Block MemBlock384; typedef Block MemBlock512; PxPool2 mMemBlock128Pool; PxPool2 mMemBlock256Pool; PxPool2 mMemBlock384Pool; PxPool2 mMemBlock512Pool; // broad phase data: NPhaseCore* mNPhaseCore; // Collision filtering void* mFilterShaderData; PxU32 mFilterShaderDataSize; PxU32 mFilterShaderDataCapacity; PxSimulationFilterShader mFilterShader; PxSimulationFilterCallback* mFilterCallback; const PxPairFilteringMode::Enum mKineKineFilteringMode; const PxPairFilteringMode::Enum mStaticKineFilteringMode; PxCoalescedHashSet mSleepBodies; PxCoalescedHashSet mWokeBodies; bool mWokeBodyListValid; bool mSleepBodyListValid; const bool mEnableStabilization; PxArray mActiveActors; PxArray mFrozenActors; PxArray mClientPosePreviewBodies; // buffer for bodies that requested early report of the integrated pose (eENABLE_POSE_INTEGRATION_PREVIEW). // This buffer gets exposed to users. Is officially accessible from PxSimulationEventCallback::onAdvance() // until the next simulate()/advance(). PxArray mClientPosePreviewBuffer; // buffer of newly integrated poses for the bodies that requested a preview. This buffer gets exposed // to users. PxSimulationEventCallback* mSimulationEventCallback; SimStats* mStats; PxU32 mInternalFlags; // PT: combination of ::SceneInternalFlag, looks like only 2 bits are needed PxSceneFlags mPublicFlags; // Copy of PxSceneDesc::flags, of type PxSceneFlag // PT: TODO: unify names, "tracker" or "pool"? ObjectIDTracker* mConstraintIDTracker; // PT: provides Sc::ContraintSim::mLowLevelConstraint::index ObjectIDTracker* mActorIDTracker; // PT: provides Sc::ActorSim::mId ObjectIDTracker* mElementIDPool; // PT: provides Sc::ElementSim::mElementID StaticCore mAnchorCore; StaticSim* mStaticAnchor; Cm::PreallocatingPool* mShapeSimPool; Cm::PreallocatingPool* mStaticSimPool; Cm::PreallocatingPool* mBodySimPool; PxPool2 mConstraintSimPool; PxPool2 mArticulationJointSimPool; LLArticulationRCPool* mLLArticulationRCPool; PxHashMap, ConstraintCore*> mConstraintMap; PxPool2 mConstraintInteractionPool; PxPool* mSimStateDataPool; BatchRemoveState* mBatchRemoveState; PxArray mLostTouchPairs; PxBitMap mLostTouchPairsDeletedBodyIDs; // Need to know which bodies have been deleted when processing the lost touch pair list. // Can't use the existing rigid object ID tracker class since this map needs to be cleared at // another point in time. PxBitMap mVelocityModifyMap; PxArray mTouchFoundEvents; PxArray mTouchLostEvents; PxBitMap mDirtyShapeSimMap; PxU32 mDominanceBitMatrix[PX_MAX_DOMINANCE_GROUP]; bool mVisualizationParameterChanged; PxU32 mMaxNbArticulationLinks; // statics: PxU32 mNbRigidStatics; PxU32 mNbRigidDynamics; PxU32 mNbRigidKinematic; PxU32 mNbGeometries[PxGeometryType::eGEOMETRY_COUNT]; //IG::Node::eTYPE_COUNT PxU32 mNumDeactivatingNodes[IG::Node::eTYPE_COUNT]; // task decomposition void setupBroadPhaseFirstAndSecondPassTasks(PxBaseTask* continuation); void broadPhase(PxBaseTask* continuation); void broadPhaseFirstPass(PxBaseTask* continuation); void broadPhaseSecondPass(PxBaseTask* continuation); void updateBroadPhase(PxBaseTask* continuation); void preIntegrate(PxBaseTask* continuation); void postBroadPhase(PxBaseTask* continuation); void postBroadPhaseContinuation(PxBaseTask* continuation); void preRigidBodyNarrowPhase(PxBaseTask* continuation); void postBroadPhaseStage2(PxBaseTask* continuation); void postBroadPhaseStage3(PxBaseTask* continuation); void updateBoundsAndShapes(PxBaseTask* continuation); void rigidBodyNarrowPhase(PxBaseTask* continuation); void unblockNarrowPhase(PxBaseTask* continuation); void islandGen(PxBaseTask* continuation); void postIslandGen(PxBaseTask* continuation); void solver(PxBaseTask* continuation); void updateBodies(PxBaseTask* continuation); void updateShapes(PxBaseTask* continuation); void updateSimulationController(PxBaseTask* continuation); void updateDynamics(PxBaseTask* continuation); void updateDynamicsPostPartitioning(PxBaseTask* continuation); void processLostContacts(PxBaseTask*); void processLostContacts2(PxBaseTask*); void processLostContacts3(PxBaseTask*); void destroyManagers(PxBaseTask*); void lostTouchReports(PxBaseTask*); void unregisterInteractions(PxBaseTask*); void postThirdPassIslandGen(PxBaseTask*); void postSolver(PxBaseTask* continuation); void afterIntegration(PxBaseTask* continuation); // performs sleep check, for instance void postCCDPass(PxBaseTask* continuation); void ccdBroadPhaseAABB(PxBaseTask* continuation); void ccdBroadPhase(PxBaseTask* continuation); void updateCCDMultiPass(PxBaseTask* continuation); void updateCCDSinglePass(PxBaseTask* continuation); void updateCCDSinglePassStage2(PxBaseTask* continuation); void updateCCDSinglePassStage3(PxBaseTask* continuation); void finalizationPhase(PxBaseTask* continuation); void postNarrowPhase(PxBaseTask* continuation); void addShapes(NpShape*const* shapes, PxU32 nbShapes, size_t ptrOffset, RigidSim& sim, PxBounds3* outBounds); void removeShapes(RigidSim& , PxInlineArray& , PxInlineArray&, bool wakeOnLostTouch); private: void addShapes(NpShape*const* shapes, PxU32 nbShapes, size_t ptrOffset, RigidSim& sim, ShapeSim*& prefetchedShapeSim, PxBounds3* outBounds); void updateContactDistances(PxBaseTask* continuation); void updateDirtyShapes(PxBaseTask* continuation); Cm::DelegateTask mSecondPassNarrowPhase; Cm::DelegateTask mPostNarrowPhase; Cm::DelegateTask mFinalizationPhase; Cm::DelegateTask mUpdateCCDMultiPass; //multi-pass ccd stuff PxArray > mUpdateCCDSinglePass; PxArray > mUpdateCCDSinglePass2; PxArray > mUpdateCCDSinglePass3; PxArray > mCCDBroadPhaseAABB; PxArray > mCCDBroadPhase; PxArray > mPostCCDPass; Cm::DelegateTask mAfterIntegration; Cm::DelegateTask mPostSolver; Cm::DelegateTask mSolver; Cm::DelegateTask mUpdateBodies; Cm::DelegateTask mUpdateShapes; Cm::DelegateTask mUpdateSimulationController; Cm::DelegateTask mUpdateDynamics; Cm::DelegateTask mUpdateDynamicsPostPartitioning; Cm::DelegateTask mProcessLostContactsTask; Cm::DelegateTask mProcessLostContactsTask2; Cm::DelegateTask mProcessLostContactsTask3; Cm::DelegateTask mDestroyManagersTask; Cm::DelegateTask mLostTouchReportsTask; Cm::DelegateTask mUnregisterInteractionsTask; Cm::DelegateTask mProcessNarrowPhaseLostTouchTasks; Cm::DelegateTask mProcessNPLostTouchEvents; Cm::DelegateTask mPostThirdPassIslandGenTask; #if !USE_SPLIT_SECOND_PASS_ISLAND_GEN Cm::DelegateTask mPostIslandGen; #endif Cm::DelegateTask mIslandGen; Cm::DelegateTask mPreRigidBodyNarrowPhase; Cm::DelegateTask mSetEdgesConnectedTask; Cm::DelegateFanoutTask mUpdateBoundAndShapeTask; Cm::DelegateTask mRigidBodyNarrowPhase; Cm::DelegateTask mRigidBodyNPhaseUnlock; Cm::DelegateTask mPostBroadPhase; Cm::DelegateTask mPostBroadPhaseCont; Cm::DelegateTask mPostBroadPhase2; Cm::DelegateFanoutTask mPostBroadPhase3; Cm::DelegateTask mPreallocateContactManagers; Cm::DelegateTask mIslandInsertion; Cm::DelegateTask mRegisterContactManagers; Cm::DelegateTask mRegisterInteractions; Cm::DelegateTask mRegisterSceneInteractions; Cm::DelegateTask mBroadPhase; Cm::DelegateTask mAdvanceStep; Cm::DelegateTask mCollideStep; Cm::DelegateTask mBpFirstPass; Cm::DelegateTask mBpSecondPass; Cm::DelegateTask mBpUpdate; Cm::DelegateTask mPreIntegrate; Cm::FlushPool mTaskPool; PxTaskManager* mTaskManager; PxCudaContextManager* mCudaContextManager; bool mContactReportsNeedPostSolverVelocity; bool mUseGpuDynamics; bool mUseGpuBp; bool mCCDBp; SimulationStage::Enum mSimulationStage; PxCoalescedHashSet mPosePreviewBodies; // list of bodies that requested early report of the integrated pose (eENABLE_POSE_INTEGRATION_PREVIEW). PxArray mPreallocatedContactManagers; PxArray mPreallocatedShapeInteractions; PxArray mPreallocatedInteractionMarkers; // PT: class members that should ideally just be local parameters passed from task to task OverlapFilterTask* mOverlapFilterTaskHead; // PT: tmp data passed from finishBroadPhase to preallocateContactManagers PxArray mFilterInfo; // PT: tmp data passed from finishBroadPhase to preallocateContactManagers OnOverlapCreatedTask* mOverlapCreatedTaskHead; IslandInsertionTask* mIslandInsertionTaskHead; PxArray mPreallocatedHandles; DelayedGPUTypes mGPUTypes; // PT: GPU types found in last part of Sc::Scene::islandInsertion(), delayed for later processing //~class members that should ideally just be local parameters passed from task to task PxBitMap mSpeculativeCCDRigidBodyBitMap; PxBitMap mSpeculativeCDDArticulationBitMap; bool mIsCollisionPhaseActive; // Set to true as long as collision phase is active (used as an indicator that it is OK to read object pose, // velocity etc. compared to the solver phase where these properties might get written to). bool mIsDirectGPUAPIInitialized; public: // For OmniPVD. To notify NpScene that actor's sleeping state has changed. typedef void(*SleepingStateChangedCallback)(PxRigidDynamic&, bool); PxSceneResidual mResidual; SleepingStateChangedCallback mOnSleepingStateChanged; // PT: moved all the GPU-related code & data here in an attempt to clearly separate the CPU/GPU bits #if PX_SUPPORT_GPU_PHYSX public: void gpu_addToActiveList(ActorSim& actorSim, ActorCore* appendedActorCore); void gpu_removeFromActiveList(ActorSim& actorSim, PxU32 removedActiveIndex); void gpu_clearSleepWakeBodies(); void gpu_buildActiveActors(); void gpu_buildActiveAndFrozenActors(); void gpu_setSimulationEventCallback(PxSimulationEventCallback* callback); PxU32 gpu_cleanUpSleepAndWokenBodies(); void gpu_fireOnSleepCallback(PxActor** actors); void gpu_fireOnWakeCallback(PxActor** actors); void gpu_updateBounds(); void gpu_releasePools(); void gpu_release(); void addDeformableSurface(DeformableSurfaceCore&); void removeDeformableSurface(DeformableSurfaceCore&); void addDeformableVolume(DeformableVolumeCore&); void removeDeformableVolume(DeformableVolumeCore&); void addParticleSystem(ParticleSystemCore&); void removeParticleSystem(ParticleSystemCore&); PX_FORCE_INLINE PxU32 getNbDeformableSurfaces() const { return mDeformableSurfaces.size(); } PX_FORCE_INLINE DeformableSurfaceCore* const* getDeformableSurfaces() { return mDeformableSurfaces.getEntries(); } PX_FORCE_INLINE PxU32 getNbDeformableVolumes() const { return mDeformableVolumes.size(); } PX_FORCE_INLINE DeformableVolumeCore* const* getDeformableVolumes() { return mDeformableVolumes.getEntries(); } PX_FORCE_INLINE PxU32 getNbParticleSystems() const { return mParticleSystems.size(); } PX_FORCE_INLINE ParticleSystemCore* const* getParticleSystems() { return mParticleSystems.getEntries(); } // PT: redundant? // Get the active deformable surface actors PX_FORCE_INLINE DeformableSurfaceCore*const* getActiveDeformableSurfacesArray() const { return mActiveDeformableSurfaces.begin(); } PX_FORCE_INLINE PxU32 getNumActiveDeformableSurfaces() const { return mActiveDeformableSurfaces.size(); } // PT: redundant? // Get the active deformable surface actors PX_FORCE_INLINE DeformableVolumeCore*const* getActiveDeformableVolumesArray() const { return mActiveDeformableVolumes.begin(); } PX_FORCE_INLINE PxU32 getNumActiveDeformableVolumes() const { return mActiveDeformableVolumes.size(); } PX_FORCE_INLINE const PxsDeformableSurfaceMaterialManager& getDeformableSurfaceMaterialManager() const { return mDeformableSurfaceMaterialManager; } PX_FORCE_INLINE PxsDeformableSurfaceMaterialManager& getDeformableSurfaceMaterialManager() { return mDeformableSurfaceMaterialManager; } PX_FORCE_INLINE const PxsDeformableVolumeMaterialManager& getDeformableVolumeMaterialManager() const { return mDeformableVolumeMaterialManager; } PX_FORCE_INLINE PxsDeformableVolumeMaterialManager& getDeformableVolumeMaterialManager() { return mDeformableVolumeMaterialManager; } PX_FORCE_INLINE const PxsPBDMaterialManager& getPBDMaterialManager() const { return mPBDMaterialManager; } PX_FORCE_INLINE PxsPBDMaterialManager& getPBDMaterialManager() { return mPBDMaterialManager; } Dy::DeformableSurface* createLLDeformableSurface(DeformableSurfaceSim* sim); void destroyLLDeformableSurface(Dy::DeformableSurface& femCloth); Dy::DeformableVolume* createLLDeformableVolume(DeformableVolumeSim* sim); void destroyLLDeformableVolume(Dy::DeformableVolume& deformableVolume); Dy::ParticleSystem* createLLParticleSystem(ParticleSystemSim* sim); void destroyLLParticleSystem(Dy::ParticleSystem& softBody); void cleanUpSleepDeformableVolumes(); void cleanUpWokenDeformableVolumes(); void cleanUpSleepOrWokenDeformableVolumes(PxCoalescedHashSet& bodyList, PxU32 removeFlag, bool& validMarker); void addDeformableSurfaceSimControl(DeformableSurfaceCore& core); void removeDeformableSurfaceSimControl(DeformableSurfaceCore& core); void addDeformableVolumeSimControl(DeformableVolumeCore& core); void removeDeformableVolumeSimControl(DeformableVolumeCore& core); void addParticleSystemSimControl(ParticleSystemCore& core); void removeParticleSystemSimControl(ParticleSystemCore& core); void addParticleFilter(Sc::ParticleSystemCore* core, DeformableVolumeSim& sim, PxU32 particleId, PxU32 userBufferId, PxU32 tetId); void removeParticleFilter(Sc::ParticleSystemCore* core, DeformableVolumeSim& sim, PxU32 particleId, PxU32 userBufferId, PxU32 tetId); PxU32 addParticleAttachment(Sc::ParticleSystemCore* core, DeformableVolumeSim& sim, PxU32 particleId, PxU32 userBufferId, PxU32 tetId, const PxVec4& barycentric); void removeParticleAttachment(Sc::ParticleSystemCore* core, DeformableVolumeSim& sim, PxU32 handle); void addRigidFilter(BodyCore* core, DeformableVolumeSim& sim, PxU32 vertId); void removeRigidFilter(BodyCore* core, DeformableVolumeSim& sim, PxU32 vertId); PxU32 addRigidAttachment(BodyCore* core, DeformableVolumeSim& sim, PxU32 vertId, const PxVec3& actorSpacePose, PxConeLimitedConstraint* constraint, bool doConversion); void removeRigidAttachment(BodyCore* core, DeformableVolumeSim& sim, PxU32 handle); void addTetRigidFilter(BodyCore* core, DeformableVolumeSim& sim, PxU32 tetIdx); void removeTetRigidFilter(BodyCore* core, DeformableVolumeSim& sim, PxU32 tetIdx); PxU32 addTetRigidAttachment(BodyCore* core, DeformableVolumeSim& sim, PxU32 tetIdx, const PxVec4& barycentric, const PxVec3& actorSpacePose, PxConeLimitedConstraint* constraint, bool doConversion); void addSoftBodyFilter(DeformableVolumeCore& core, PxU32 tetIdx0, DeformableVolumeSim& sim, PxU32 tetIdx1); void removeSoftBodyFilter(DeformableVolumeCore& core, PxU32 tetIdx0, DeformableVolumeSim& sim, PxU32 tetIdx1); void addSoftBodyFilters(DeformableVolumeCore& core, DeformableVolumeSim& sim, PxU32* tetIndices0, PxU32* tetIndices1, PxU32 tetIndicesSize); void removeSoftBodyFilters(DeformableVolumeCore& core, DeformableVolumeSim& sim, PxU32* tetIndices0, PxU32* tetIndices1, PxU32 tetIndicesSize); PxU32 addSoftBodyAttachment(DeformableVolumeCore& core, PxU32 tetIdx0, const PxVec4& triBarycentric0, DeformableVolumeSim& sim, PxU32 tetIdx1, const PxVec4& tetBarycentric1, PxConeLimitedConstraint* constraint, PxReal constraintOffset, bool doConversion); void removeSoftBodyAttachment(DeformableVolumeCore& core, DeformableVolumeSim& sim, PxU32 handle); void addClothFilter(DeformableSurfaceCore& core, PxU32 triIdx, Sc::DeformableVolumeSim& sim, PxU32 tetIdx); void removeClothFilter(DeformableSurfaceCore& core, PxU32 triIdx, Sc::DeformableVolumeSim& sim, PxU32 tetIdx); PxU32 addClothAttachment(DeformableSurfaceCore& core, PxU32 triIdx, const PxVec4& triBarycentric, DeformableVolumeSim& sim, PxU32 tetIdx, const PxVec4& tetBarycentric, PxConeLimitedConstraint* constraint, PxReal constraintOffset, bool doConversion); void removeClothAttachment(DeformableSurfaceCore& core, DeformableVolumeSim& sim, PxU32 handle); PxU32 addRigidAttachment(BodyCore* core, DeformableSurfaceSim& sim, PxU32 vertId, const PxVec3& actorSpacePose, PxConeLimitedConstraint* constraint); void removeRigidAttachment(BodyCore* core, DeformableSurfaceSim& sim, PxU32 handle); void addClothFilter(DeformableSurfaceCore& core0, PxU32 triIdx0, Sc::DeformableSurfaceSim& sim1, PxU32 triIdx1); void removeClothFilter(DeformableSurfaceCore& core, PxU32 triIdx0, DeformableSurfaceSim& sim1, PxU32 triIdx1); PxU32 addTriClothAttachment(DeformableSurfaceCore& core0, PxU32 triIdx0, const PxVec4& barycentric0, Sc::DeformableSurfaceSim& sim1, PxU32 triIdx1, const PxVec4& barycentric1); void removeTriClothAttachment(DeformableSurfaceCore& core, DeformableSurfaceSim& sim1, PxU32 handle); void addTriRigidFilter(BodyCore* core, DeformableSurfaceSim& sim, PxU32 triIdx); void removeTriRigidFilter(BodyCore* core, DeformableSurfaceSim& sim, PxU32 triIdx); PxU32 addTriRigidAttachment(BodyCore* core, DeformableSurfaceSim& sim, PxU32 triIdx, const PxVec4& barycentric, const PxVec3& actorSpacePose, PxConeLimitedConstraint* constraint); void removeTriRigidAttachment(BodyCore* core, DeformableSurfaceSim& sim, PxU32 handle); void addRigidAttachment(BodyCore* core, ParticleSystemSim& sim); void removeRigidAttachment(BodyCore* core, ParticleSystemSim& sim); PxActor** getActiveDeformableVolumeActors(PxU32& nbActorsOut); void setActiveDeformableVolumeActors(PxActor** actors, PxU32 nbActors); //PxActor** getActiveDeformableSurfaceActors(PxU32& nbActorsOut); //void setActiveDeformableSurfaceActors(PxActor** actors, PxU32 nbActors); #if !USE_SPLIT_SECOND_PASS_ISLAND_GEN PxU64 mPadding; #endif PxU64 mPadding2; PX_ALIGN(16, PxsDeformableSurfaceMaterialManager mDeformableSurfaceMaterialManager); PX_ALIGN(16, PxsDeformableVolumeMaterialManager mDeformableVolumeMaterialManager); PX_ALIGN(16, PxsPBDMaterialManager mPBDMaterialManager); PxArray mActiveDeformableSurfaces; PxArray mActiveDeformableVolumes; PxArray mActiveParticleSystems; PxCoalescedHashSet mDeformableSurfaces; PxCoalescedHashSet mDeformableVolumes; PxCoalescedHashSet mParticleSystems; PxCoalescedHashSet mSleepDeformableVolumes; PxCoalescedHashSet mWokeDeformableVolumes; PxArray mActiveDeformableSurfaceActors; PxArray mActiveDeformableVolumeActors; LLDeformableSurfacePool* mLLDeformableSurfacePool; LLDeformableVolumePool* mLLDeformableVolumePool; LLParticleSystemPool* mLLParticleSystemPool; PxHashMap, ParticleOrSoftBodyRigidInteraction> mParticleOrSoftBodyRigidInteractionMap; bool mWokeDeformableVolumeListValid; bool mSleepDeformableVolumeListValid; #endif }; bool activateInteraction(Interaction* interaction); void activateInteractions(Sc::ActorSim& actorSim); void deactivateInteractions(Sc::ActorSim& actorSim); } // namespace Sc } #endif