public void Initialize(ref MyBlockBuildArea area, MyCubeBlockDefinition definition) { m_definition = definition; m_orientation = new MyBlockOrientation(area.OrientationForward, area.OrientationUp); m_posInGrid = area.PosInGrid; m_blockMin = area.BlockMin; m_blockMax = area.BlockMax; m_stepDelta = area.StepDelta; m_lookup.Clear(); }
public static void CheckAreaConnectivity(MyCubeGrid grid, ref MyBlockBuildArea area, List<Vector3UByte> validOffsets, HashSet<Vector3UByte> resultFailList) { try { var definition = MyDefinitionManager.Static.GetCubeBlockDefinition(area.DefinitionId) as MyCubeBlockDefinition; if (definition == null) { Debug.Fail("Block definition not found"); return; } Quaternion orientation = Base6Directions.GetOrientation(area.OrientationForward, area.OrientationUp); Vector3I stepDir = area.StepDelta; var mountPoints = definition.GetBuildProgressModelMountPoints(MyComponentStack.NewBlockIntegrity); // Step 1: Add blocks which are connected directly to existing grid for (int i = validOffsets.Count - 1; i >= 0; i--) { Vector3I center = area.PosInGrid + validOffsets[i] * stepDir; if (MyCubeGrid.CheckConnectivity(grid, definition, mountPoints, ref orientation, ref center)) { m_tmpAreaMountpointPass.Add(validOffsets[i]); validOffsets.RemoveAtFast(i); } } // Step 2: Add remaining blocks which are connected to any newly added block m_areaOverlapTest.Initialize(ref area, definition); foreach (var block in m_tmpAreaMountpointPass) m_areaOverlapTest.AddBlock(block); int prevCount = int.MaxValue; while (validOffsets.Count > 0 && validOffsets.Count < prevCount) { prevCount = validOffsets.Count; for (int i = validOffsets.Count - 1; i >= 0; i--) { Vector3I center = area.PosInGrid + validOffsets[i] * stepDir; if (MyCubeGrid.CheckConnectivity(m_areaOverlapTest, definition, mountPoints, ref orientation, ref center)) { m_tmpAreaMountpointPass.Add(validOffsets[i]); m_areaOverlapTest.AddBlock(validOffsets[i]); validOffsets.RemoveAtFast(i); } } } // Step 3: Remaining blocks failed foreach (var item in validOffsets) { resultFailList.Add(item); } validOffsets.Clear(); validOffsets.AddHashset(m_tmpAreaMountpointPass); } finally { m_tmpAreaMountpointPass.Clear(); } }