| 674 | |
| 675 | |
| 676 | void IslandSim::wakeIslands() |
| 677 | { |
| 678 | PX_PROFILE_ZONE("Basic.wakeIslands", getContextId()); |
| 679 | |
| 680 | //(1) Iterate over activating nodes and activate them |
| 681 | |
| 682 | |
| 683 | PxU32 originalActiveIslands = mActiveIslands.size(); |
| 684 | |
| 685 | for (PxU32 a = 0; a < Edge::eEDGE_TYPE_COUNT; ++a) |
| 686 | { |
| 687 | for (PxU32 i = 0, count = mActivatedEdges[a].size(); i < count; ++i) |
| 688 | { |
| 689 | IG::Edge& edge = mEdges[mActivatedEdges[a][i]]; |
| 690 | edge.mEdgeState &= (~Edge::eACTIVATING); |
| 691 | } |
| 692 | |
| 693 | } |
| 694 | |
| 695 | mActivatedEdges[0].forceSize_Unsafe(0); |
| 696 | mActivatedEdges[1].forceSize_Unsafe(0); |
| 697 | /*mInitialActiveEdgeCount[0] = mActiveEdges[0].size(); |
| 698 | mInitialActiveEdgeCount[1] = mActiveEdges[1].size();*/ |
| 699 | |
| 700 | for(PxU32 a = 0; a < mActivatingNodes.size(); ++a) |
| 701 | { |
| 702 | NodeIndex wakeNode = mActivatingNodes[a]; |
| 703 | |
| 704 | IslandId islandId = mIslandIds[wakeNode.index()]; |
| 705 | |
| 706 | Node& node = mNodes[wakeNode.index()]; |
| 707 | node.clearActivating(); |
| 708 | if(islandId != IG_INVALID_ISLAND) |
| 709 | { |
| 710 | if(!mIslandAwake.test(islandId)) |
| 711 | { |
| 712 | markIslandActive(islandId); |
| 713 | } |
| 714 | mActiveNodeIndex[wakeNode.index()] = IG_INVALID_NODE; //Mark active node as invalid. |
| 715 | activateNodeInternal(wakeNode); |
| 716 | } |
| 717 | else |
| 718 | { |
| 719 | PX_ASSERT(node.isKinematic()); |
| 720 | node.setActive(); |
| 721 | PX_ASSERT(mActiveNodeIndex[wakeNode.index()] == a); |
| 722 | mActiveNodeIndex[wakeNode.index()] = mActiveKinematicNodes.size(); |
| 723 | mActiveKinematicNodes.pushBack(wakeNode); |
| 724 | |
| 725 | //Wake up the islands connected to this waking kinematic! |
| 726 | EdgeInstanceIndex index = node.mFirstEdgeIndex; |
| 727 | while(index != IG_INVALID_EDGE) |
| 728 | { |
| 729 | EdgeInstance& edgeInstance = mEdgeInstances[index]; |
| 730 | |
| 731 | NodeIndex outboundNode = mEdgeNodeIndices[index ^ 1]; |
| 732 | //Edge& edge = mEdges[index/2]; |
| 733 | //if(edge.isConnected()) //Only wake up if the edge is not connected... |
no test coverage detected