コード例 #1
0
 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();
 }
コード例 #2
0
        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();
            }
        }