public void UpdateDeposits(ref BoundingSphereD worldDetectionSphere, long detectorId, MyOreDetectorComponent detectorComponent) { if (this.m_tasksRunning == 0) { MySession @static = MySession.Static; if ((@static != null) && @static.Ready) { Vector3I vectori; Vector3I vectori2; Vector3D worldPosition = worldDetectionSphere.Center - worldDetectionSphere.Radius; Vector3D vectord2 = worldDetectionSphere.Center + worldDetectionSphere.Radius; MyVoxelCoordSystems.WorldPositionToVoxelCoord(this.m_voxelMap.PositionLeftBottomCorner, ref worldPosition, out vectori); MyVoxelCoordSystems.WorldPositionToVoxelCoord(this.m_voxelMap.PositionLeftBottomCorner, ref vectord2, out vectori2); vectori = (Vector3I)(vectori + this.m_voxelMap.StorageMin); vectori2 = (Vector3I)(vectori2 + this.m_voxelMap.StorageMin); this.m_voxelMap.Storage.ClampVoxelCoord(ref vectori, 1); this.m_voxelMap.Storage.ClampVoxelCoord(ref vectori2, 1); vectori = vectori >> 5; vectori2 = vectori2 >> 5; if ((vectori != this.m_lastDetectionMin) || (vectori2 != this.m_lastDetectionMax)) { Vector3I vectori3; Vector3I vectori4; this.m_lastDetectionMin = vectori; this.m_lastDetectionMax = vectori2; int num = Math.Max((vectori2.X - vectori.X) / 2, 1); int num2 = Math.Max((vectori2.Y - vectori.Y) / 2, 1); vectori3.Z = vectori.Z; vectori4.Z = vectori2.Z; int num3 = 0; while (num3 < 2) { int num4 = 0; while (true) { if (num4 >= 2) { num3++; break; } vectori3.X = vectori.X + (num3 * num); vectori3.Y = vectori.Y + (num4 * num2); vectori4.X = vectori3.X + num; vectori4.Y = vectori3.Y + num2; MyDepositQuery.Start(vectori3, vectori4, detectorId, this.m_voxelMap, this.m_onDepositQueryComplete, detectorComponent); this.m_tasksRunning++; num4++; } } } } } }
public static void Start(Vector3I min, Vector3I max, long detectorId, MyVoxelBase voxelMap, Action <List <MyEntityOreDeposit>, List <Vector3I>, MyOreDetectorComponent> completionCallback, MyOreDetectorComponent detectorComp) { MyDepositQuery item = null; m_instancePool.AllocateOrCreate(out item); if (item != null) { item.Min = min; item.Max = max; item.DetectorId = detectorId; item.VoxelMap = voxelMap; item.CompletionCallback = completionCallback; item.OreDetectionComponent = detectorComp; Parallel.Start(item, item.m_onComplete); } }
private void OnDepositQueryComplete(List <MyEntityOreDeposit> deposits, List <Vector3I> emptyCells, MyOreDetectorComponent detectorComponent) { foreach (MyEntityOreDeposit deposit in deposits) { Vector3I cellCoord = deposit.CellCoord; this.m_depositsByCellCoord_Swap[cellCoord] = deposit; } this.m_tasksRunning--; if (this.m_tasksRunning == 0) { if (detectorComponent == null) { goto TR_000C; } else if (!detectorComponent.WillDiscardNextQuery) { Dictionary <Vector3I, MyEntityOreDeposit> dictionary = this.m_depositsByCellCoord_Main; this.m_depositsByCellCoord_Main = this.m_depositsByCellCoord_Swap; this.m_depositsByCellCoord_Swap = dictionary; foreach (MyEntityOreDeposit deposit4 in this.m_depositsByCellCoord_Swap.Values) { MyHud.OreMarkers.UnregisterMarker(deposit4); } this.m_depositsByCellCoord_Swap.Clear(); foreach (MyEntityOreDeposit deposit5 in this.m_depositsByCellCoord_Main.Values) { MyHud.OreMarkers.RegisterMarker(deposit5); } } else { goto TR_000C; } } return; TR_000C: foreach (MyEntityOreDeposit deposit2 in this.m_depositsByCellCoord_Main.Values) { MyHud.OreMarkers.UnregisterMarker(deposit2); } foreach (MyEntityOreDeposit deposit3 in this.m_depositsByCellCoord_Swap.Values) { MyHud.OreMarkers.UnregisterMarker(deposit3); } this.m_depositsByCellCoord_Main.Clear(); this.m_depositsByCellCoord_Swap.Clear(); }