427 PxU32 mActiveEdgeCount[Edge::eEDGE_TYPE_COUNT];
441 PxU32 mInitialActiveNodeCount[Edge::eEDGE_TYPE_COUNT];
483 void resize(
const PxU32 nbNodes,
const PxU32 nbContactManagers,
const PxU32 nbConstraints);
489#if PX_SUPPORT_GPU_PHYSX
507 void removeConnection(EdgeIndex edgeIndex);
511 PX_FORCE_INLINE PxU32 getNbActiveNodes(Node::NodeType type)
const {
return mActiveNodes[type].
size(); }
515 PX_FORCE_INLINE PxU32 getNbActiveKinematics()
const {
return mActiveKinematicNodes.
size(); }
519 PX_FORCE_INLINE PxU32 getNbNodesToActivate(Node::NodeType type)
const {
return mActiveNodes[type].
size() - mInitialActiveNodeCount[type]; }
521 PX_FORCE_INLINE const PxNodeIndex* getNodesToActivate(Node::NodeType type)
const {
return mActiveNodes[type].
begin() + mInitialActiveNodeCount[type]; }
523 PX_FORCE_INLINE PxU32 getNbNodesToDeactivate(Node::NodeType type)
const {
return mNodesToPutToSleep[type].
size(); }
527 PX_FORCE_INLINE PxU32 getNbActivatedEdges(Edge::EdgeType type)
const {
return mActivatedEdges[type].
size(); }
529 PX_FORCE_INLINE const EdgeIndex* getActivatedEdges(Edge::EdgeType type)
const {
return mActivatedEdges[type].
begin(); }
531 PX_FORCE_INLINE PxU32 getNbActiveEdges(Edge::EdgeType type)
const {
return mActiveEdgeCount[type]; }
534 PX_FORCE_INLINE void setFirstPartitionEdge(IG::EdgeIndex edgeIndex,
PartitionEdge* partitionEdge) { (*mFirstPartitionEdges)[edgeIndex] = partitionEdge; }
540 const Node& node = mNodes[nodeIndex.index()];
541 PX_ASSERT(node.mType == Node::eRIGID_BODY_TYPE);
542 return node.mRigidBody;
547 const Node& node = mNodes[nodeIndex.index()];
548 PX_ASSERT(node.mType == Node::eARTICULATION_TYPE);
549 return node.mLLArticulation;
554#if PX_SUPPORT_GPU_PHYSX
557 const Node& node = mNodes[nodeIndex.index()];
558 PX_ASSERT(node.mType == Node::eSOFTBODY_TYPE);
559 return node.mLLSoftBody;
564 const Node& node = mNodes[nodeIndex.index()];
565 PX_ASSERT(node.mType == Node::eFEMCLOTH_TYPE);
566 return node.mLLFEMCloth;
571 const Node& node = mNodes[nodeIndex.index()];
572 PX_ASSERT(node.mType == Node::eHAIRSYSTEM_TYPE);
573 return node.mLLHairSystem;
579 for (PxU32 i = 0; i < Node::eTYPE_COUNT; ++i)
586 PX_FORCE_INLINE const Island& getIsland(IG::IslandId islandIndex)
const {
return mIslands[islandIndex]; }
591 PX_FORCE_INLINE PxU32 getNbDeactivatingEdges(
const IG::Edge::EdgeType edgeType)
const {
return mDeactivatingEdges[edgeType].
size(); }
592 PX_FORCE_INLINE const EdgeIndex* getDeactivatingEdges(
const IG::Edge::EdgeType edgeType)
const {
return mDeactivatingEdges[edgeType].
begin(); }
597 PX_FORCE_INLINE PxU32 getNbDestroyedPartitionEdges()
const {
return mDestroyedPartitionEdges->
size(); }
601 PX_FORCE_INLINE PxU32 getNbDirtyEdges(IG::Edge::EdgeType type)
const {
return mDirtyEdges[type].
size(); }
602 PX_FORCE_INLINE const EdgeIndex* getDirtyEdges(IG::Edge::EdgeType type)
const {
return mDirtyEdges[type].
begin(); }
604 PX_FORCE_INLINE const Edge& getEdge(
const EdgeIndex edgeIndex)
const {
return mEdges[edgeIndex]; }
610 PX_FORCE_INLINE const Island& getIsland(
const PxNodeIndex& nodeIndex)
const { PX_ASSERT(mIslandIds[nodeIndex.index()] != IG_INVALID_ISLAND);
return mIslands[mIslandIds[nodeIndex.index()]]; }
612 PX_FORCE_INLINE PxU32 getIslandStaticTouchCount(
const PxNodeIndex& nodeIndex)
const { PX_ASSERT(mIslandIds[nodeIndex.index()] != IG_INVALID_ISLAND);
return mIslandStaticTouchCount[mIslandIds[nodeIndex.index()]]; }
616 PX_FORCE_INLINE PxU32 getActiveNodeIndex(
const PxNodeIndex& nodeIndex)
const { PxU32 activeNodeIndex = mActiveNodeIndex[nodeIndex.index()];
return activeNodeIndex;}
626 PX_FORCE_INLINE void setEdgeNodeIndexPtr(PxU32* ptr) { mNpIndexPtr = ptr; }
631 PX_FORCE_INLINE PxU32* getEdgeNodeIndexPtr()
const {
return mNpIndexPtr; }
634 PxU32 getNbIslands()
const {
return mIslandStaticTouchCount.
size(); }
636 const PxU32* getIslandStaticTouchCount()
const {
return mIslandStaticTouchCount.
begin(); }
638 const PxU32* getIslandIds()
const {
return mIslandIds.
begin(); }
640 bool checkInternalConsistency();
645 IG::Node& node = mNodes[index.index()];
646 node.clearIsReadyForSleeping();
647 node.clearDeactivating();
651 IG::Node& node = mNodes[index.index()];
652 node.setIsReadyForSleeping();
657 void insertNewEdges();
658 void removeDestroyedEdges();
661 void processNewEdges();
662 void processLostEdges(
PxArray<PxNodeIndex>& destroyedNodes,
bool allowDeactivation,
bool permitKinematicDeactivation, PxU32 dirtyNodeLimit);
664 void removeConnectionInternal(EdgeIndex edgeIndex);
666 void addConnection(
PxNodeIndex nodeHandle1,
PxNodeIndex nodeHandle2, Edge::EdgeType edgeType, EdgeIndex handle);
668 void addConnectionToGraph(EdgeIndex index);
669 void removeConnectionFromGraph(EdgeIndex edgeIndex);
671 void disconnectEdge(
EdgeInstance& instance, EdgeInstanceIndex edgeIndex,
Node& node);
682 void unwindRoute(PxU32 traversalIndex,
PxNodeIndex lastNode, PxU32 hopCount, IslandId
id);
684 void activateIsland(IslandId island);
686 void deactivateIsland(IslandId island);
696 void addNode(
bool isActive,
bool isKinematic, Node::NodeType type,
PxNodeIndex nodeIndex);
703 Node& node = mNodes[nodeIndex.index()];
705 node.setIsReadyForSleeping();
710 Node& node = mNodes[nodeIndex.index()];
711 PX_ASSERT(node.isActive() || node.isActivating());
712 node.clearIsReadyForSleeping();
717 Island& island = mIslands[islandId];
718 PX_ASSERT(!mIslandAwake.test(islandId));
719 PX_ASSERT(island.mActiveIndex == IG_INVALID_ISLAND);
721 mIslandAwake.set(islandId);
722 island.mActiveIndex = mActiveIslands.
size();
728 Island& island = mIslands[islandId];
729 PX_ASSERT(mIslandAwake.test(islandId));
730 PX_ASSERT(island.mActiveIndex != IG_INVALID_ISLAND);
731 PX_ASSERT(mActiveIslands[island.mActiveIndex] == islandId);
732 IslandId replaceId = mActiveIslands[mActiveIslands.
size()-1];
733 PX_ASSERT(mIslandAwake.test(replaceId));
734 Island& replaceIsland = mIslands[replaceId];
735 replaceIsland.mActiveIndex = island.mActiveIndex;
736 mActiveIslands[island.mActiveIndex] = replaceId;
738 island.mActiveIndex = IG_INVALID_ISLAND;
739 mIslandAwake.reset(islandId);
744 Node& node = mNodes[index.index()];
745 PX_ASSERT(node.isKinematic());
746 if(node.mActiveRefCount == 0 && mActiveNodeIndex[index.index()] == PX_INVALID_NODE)
750 mActiveNodeIndex[index.index()] = mActiveKinematicNodes.
size();
753 mActiveKinematicNodes.
pushBack(nodeIndex);
759 Node& node = mNodes[index.index()];
760 PX_ASSERT(node.isKinematic());
761 PX_ASSERT(mActiveNodeIndex[index.index()] != PX_INVALID_NODE);
762 PX_ASSERT(mActiveKinematicNodes[mActiveNodeIndex[index.index()]].index() == index.index());
764 if(node.mActiveRefCount == 0)
767 if(mActiveNodeIndex[index.index()] != PX_INVALID_NODE)
772 PX_ASSERT(mActiveNodeIndex[replaceIndex.index()] == mActiveKinematicNodes.
size()-1);
773 mActiveNodeIndex[replaceIndex.index()] = mActiveNodeIndex[index.index()];
774 mActiveKinematicNodes[mActiveNodeIndex[index.index()]] = replaceIndex;
776 mActiveNodeIndex[index.index()] = PX_INVALID_NODE;
783 Node& node = mNodes[index.index()];
784 PX_ASSERT(!node.isKinematic());
785 PX_ASSERT(mActiveNodeIndex[index.index()] == PX_INVALID_NODE);
786 mActiveNodeIndex[index.index()] = mActiveNodes[node.mType].
size();
789 mActiveNodes[node.mType].
pushBack(nodeIndex);
794 Node& node = mNodes[index.index()];
796 PX_ASSERT(!node.isKinematic());
797 PX_ASSERT(mActiveNodeIndex[index.index()] != PX_INVALID_NODE);
801 PX_ASSERT(activeNodes[mActiveNodeIndex[index.index()]].index() == index.index());
802 const PxU32 initialActiveNodeCount = mInitialActiveNodeCount[node.mType];
804 if(mActiveNodeIndex[index.index()] < initialActiveNodeCount)
809 PxU32 activeNodeIndex = mActiveNodeIndex[index.index()];
810 PxNodeIndex replaceIndex = activeNodes[initialActiveNodeCount-1];
811 PX_ASSERT(mActiveNodeIndex[replaceIndex.index()] == initialActiveNodeCount-1);
812 mActiveNodeIndex[index.index()] = mActiveNodeIndex[replaceIndex.index()];
813 mActiveNodeIndex[replaceIndex.index()] = activeNodeIndex;
814 activeNodes[activeNodeIndex] = replaceIndex;
815 activeNodes[mActiveNodeIndex[index.index()]] = index;
816 mInitialActiveNodeCount[node.mType]--;
819 PX_ASSERT(!node.isKinematic());
820 PX_ASSERT(mActiveNodeIndex[index.index()] != PX_INVALID_NODE);
821 PX_ASSERT(activeNodes[mActiveNodeIndex[index.index()]].index() == index.index());
824 PX_ASSERT(mActiveNodeIndex[replaceIndex.index()] == activeNodes.
size()-1);
825 mActiveNodeIndex[replaceIndex.index()] = mActiveNodeIndex[index.index()];
826 activeNodes[mActiveNodeIndex[index.index()]] = replaceIndex;
828 mActiveNodeIndex[index.index()] = PX_INVALID_NODE;
833 Edge& edge = mEdges[index];
835 PX_ASSERT((edge.mEdgeState & Edge::eACTIVATING) == 0);
837 edge.mEdgeState |= Edge::eACTIVATING;
839 mActivatedEdges[edge.mEdgeType].
pushBack(index);
841 mActiveEdgeCount[edge.mEdgeType]++;
844 if(edge.mEdgeType == Edge::eCONTACT_MANAGER)
845 mActiveContactEdges.set(index);
847 PxNodeIndex nodeIndex1 = mEdgeNodeIndices[2 * index];
848 PxNodeIndex nodeIndex2 = mEdgeNodeIndices[2 * index + 1];
850 if (nodeIndex1.index() != PX_INVALID_NODE && nodeIndex2.index() != PX_INVALID_NODE)
852 PX_ASSERT((!mNodes[nodeIndex1.index()].isKinematic()) || (!mNodes[nodeIndex2.index()].isKinematic()) || edge.getEdgeType() == IG::Edge::eCONTACT_MANAGER);
854 Node& node = mNodes[nodeIndex1.index()];
856 if(node.mActiveRefCount == 0 && node.isKinematic() && !(node.isActive() || node.isActivating()))
859 markKinematicActive(nodeIndex1);
861 node.mActiveRefCount++;
865 Node& node = mNodes[nodeIndex2.index()];
866 if(node.mActiveRefCount == 0 && node.isKinematic() && !(node.isActive() || node.isActivating()))
869 markKinematicActive(nodeIndex2);
871 node.mActiveRefCount++;
877 void removeEdgeFromActivatingList(EdgeIndex index);
881 Edge& edge = mEdges[edgeIndex];
882 if(edge.mNextIslandEdge != IG_INVALID_EDGE)
884 PX_ASSERT(mEdges[edge.mNextIslandEdge].mPrevIslandEdge == edgeIndex);
885 mEdges[edge.mNextIslandEdge].mPrevIslandEdge = edge.mPrevIslandEdge;
889 PX_ASSERT(island.mLastEdge[edge.mEdgeType] == edgeIndex);
890 island.mLastEdge[edge.mEdgeType] = edge.mPrevIslandEdge;
893 if(edge.mPrevIslandEdge != IG_INVALID_EDGE)
895 PX_ASSERT(mEdges[edge.mPrevIslandEdge].mNextIslandEdge == edgeIndex);
896 mEdges[edge.mPrevIslandEdge].mNextIslandEdge = edge.mNextIslandEdge;
900 PX_ASSERT(island.mFirstEdge[edge.mEdgeType] == edgeIndex);
901 island.mFirstEdge[edge.mEdgeType] = edge.mNextIslandEdge;
904 island.mEdgeCount[edge.mEdgeType]--;
905 edge.mNextIslandEdge = edge.mPrevIslandEdge = IG_INVALID_EDGE;
910 Edge& edge = mEdges[edgeIndex];
911 PX_ASSERT(edge.mNextIslandEdge == IG_INVALID_EDGE && edge.mPrevIslandEdge == IG_INVALID_EDGE);
913 if(island.mLastEdge[edge.mEdgeType] != IG_INVALID_EDGE)
915 PX_ASSERT(mEdges[island.mLastEdge[edge.mEdgeType]].mNextIslandEdge == IG_INVALID_EDGE);
916 mEdges[island.mLastEdge[edge.mEdgeType]].mNextIslandEdge = edgeIndex;
920 PX_ASSERT(island.mFirstEdge[edge.mEdgeType] == IG_INVALID_EDGE);
921 island.mFirstEdge[edge.mEdgeType] = edgeIndex;
924 edge.mPrevIslandEdge = island.mLastEdge[edge.mEdgeType];
925 island.mLastEdge[edge.mEdgeType] = edgeIndex;
926 island.mEdgeCount[edge.mEdgeType]++;
931 Node& node = mNodes[nodeIndex.index()];
932 if(node.mNextNode.isValid())
934 PX_ASSERT(mNodes[node.mNextNode.index()].mPrevNode.index() == nodeIndex.index());
935 mNodes[node.mNextNode.index()].mPrevNode = node.mPrevNode;
939 PX_ASSERT(island.mLastNode.index() == nodeIndex.index());
940 island.mLastNode = node.mPrevNode;
943 if(node.mPrevNode.isValid())
945 PX_ASSERT(mNodes[node.mPrevNode.index()].mNextNode.index() == nodeIndex.index());
946 mNodes[node.mPrevNode.index()].mNextNode = node.mNextNode;
950 PX_ASSERT(island.mRootNode.index() == nodeIndex.index());
951 island.mRootNode = node.mNextNode;
954 island.mSize[node.mType]--;