| 88 | } |
| 89 | |
| 90 | void IslandSim::addNode(bool isActive, bool isKinematic, Node::NodeType type, NodeIndex nodeIndex) |
| 91 | { |
| 92 | PxU32 handle = nodeIndex.index(); |
| 93 | if(handle == mNodes.capacity()) |
| 94 | { |
| 95 | const PxU32 newCapacity = PxMax(2*mNodes.capacity(), 256u); |
| 96 | mNodes.reserve(newCapacity); |
| 97 | mIslandIds.reserve(newCapacity); |
| 98 | mFastRoute.reserve(newCapacity); |
| 99 | mHopCounts.reserve(newCapacity); |
| 100 | mActiveNodeIndex.reserve(newCapacity); |
| 101 | } |
| 102 | |
| 103 | const PxU32 newSize = PxMax(handle+1, mNodes.size()); |
| 104 | mNodes.resize(newSize); |
| 105 | mIslandIds.resize(newSize); |
| 106 | mFastRoute.resize(newSize); |
| 107 | mHopCounts.resize(newSize); |
| 108 | mActiveNodeIndex.resize(newSize); |
| 109 | |
| 110 | mActiveNodeIndex[handle] = IG_INVALID_NODE; |
| 111 | |
| 112 | |
| 113 | Node& node = mNodes[handle]; |
| 114 | node.mType = Ps::to8(type); |
| 115 | //Ensure that the node is not currently being used. |
| 116 | PX_ASSERT(node.isDeleted()); |
| 117 | |
| 118 | PxU8 flags = PxU16(isActive ? 0 : Node::eREADY_FOR_SLEEPING); |
| 119 | if(isKinematic) |
| 120 | flags |= Node::eKINEMATIC; |
| 121 | node.mFlags = flags; |
| 122 | mIslandIds[handle] = IG_INVALID_ISLAND; |
| 123 | mFastRoute[handle].setIndices(IG_INVALID_NODE); |
| 124 | mHopCounts[handle] = 0; |
| 125 | |
| 126 | if(!isKinematic) |
| 127 | { |
| 128 | IslandId islandHandle = mIslandHandles.getHandle(); |
| 129 | |
| 130 | if(islandHandle == mIslands.capacity()) |
| 131 | { |
| 132 | const PxU32 newCapacity = PxMax(2*mIslands.capacity(), 256u); |
| 133 | mIslands.reserve(newCapacity); |
| 134 | mIslandAwake.resize(newCapacity); |
| 135 | mIslandStaticTouchCount.reserve(newCapacity); |
| 136 | } |
| 137 | mIslands.resize(PxMax(islandHandle+1, mIslands.size())); |
| 138 | mIslandStaticTouchCount.resize(PxMax(islandHandle+1, mIslands.size())); |
| 139 | mIslandAwake.growAndReset(PxMax(islandHandle+1, mIslands.size())); |
| 140 | Island& island = mIslands[islandHandle]; |
| 141 | island.mLastNode = island.mRootNode = nodeIndex; |
| 142 | island.mSize[type] = 1; |
| 143 | mIslandIds[handle] = islandHandle; |
| 144 | mIslandStaticTouchCount[islandHandle] = 0; |
| 145 | } |
| 146 | |
| 147 | if(isActive) |
nothing calls this directly
no test coverage detected