void TryToCompressIslandHierarchy() { var currentSimulationIsland = simulationIsland; if (currentSimulationIsland != null) { if (currentSimulationIsland.immediateParent != currentSimulationIsland) { //Only remove ourselves from the owning simulation island, not all the way up the chain. //The change locker must be obtained first to prevent kinematic notifications in the candidacy update //from attempting to evaluate the SimulationIsland while we are reorganizing things. simulationIslandChangeLocker.Enter(); lock (currentSimulationIsland) currentSimulationIsland.Remove(this); currentSimulationIsland = currentSimulationIsland.Parent; //Add ourselves to the new owner. lock (currentSimulationIsland) currentSimulationIsland.Add(this); simulationIslandChangeLocker.Exit(); //TODO: Should it activate the new island? This might avoid a possible corner case. //It could interfere with the activated event meaningfulness, since that is triggered //at the end of the update candidacy loop.. //currentSimulationIsland.isActive = true; } } }