Esempio n. 1
0
 public bool GetTransform(out MatrixI transform)
 {
     transform = new MatrixI();
     if (this.Blocks.Count != 0)
     {
         MySlimBlock block = this.Blocks.First <MySlimBlock>();
         if (block.MultiBlockIndex < this.MultiBlockDefinition.BlockDefinitions.Length)
         {
             MyMultiBlockDefinition.MyMultiBlockPartDefinition definition = this.MultiBlockDefinition.BlockDefinitions[block.MultiBlockIndex];
             transform             = MatrixI.CreateRotation(definition.Forward, definition.Up, block.Orientation.Forward, block.Orientation.Up);
             transform.Translation = block.Position - Vector3I.TransformNormal(definition.Min, ref transform);
             return(true);
         }
     }
     return(false);
 }
Esempio n. 2
0
        public bool CanAddBlock(ref Vector3I otherGridPositionMin, ref Vector3I otherGridPositionMax, MyBlockOrientation otherOrientation, MyCubeBlockDefinition otherDefinition)
        {
            MatrixI xi;
            bool    flag2;

            if (!this.GetTransform(out xi))
            {
                return(true);
            }
            try
            {
                MatrixI xi2;
                MatrixI.Invert(ref xi, out xi2);
                Vector3I vectori1 = Vector3I.Transform(otherGridPositionMin, ref xi2);
                Vector3I vectori  = Vector3I.Transform(otherGridPositionMax, ref xi2);
                Vector3I minB     = Vector3I.Min(vectori1, vectori);
                Vector3I maxB     = Vector3I.Max(vectori1, vectori);
                if (Vector3I.BoxIntersects(ref this.MultiBlockDefinition.Min, ref this.MultiBlockDefinition.Max, ref minB, ref maxB))
                {
                    MatrixI xi4;
                    MatrixI leftMatrix = new MatrixI(otherOrientation);
                    MatrixI.Multiply(ref leftMatrix, ref xi2, out xi4);
                    MyBlockOrientation orientation = new MyBlockOrientation(xi4.Forward, xi4.Up);
                    m_tmpPartDefinitions.Clear();
                    MyMultiBlockDefinition.MyMultiBlockPartDefinition[] blockDefinitions = this.MultiBlockDefinition.BlockDefinitions;
                    int index = 0;
                    while (true)
                    {
                        if (index < blockDefinitions.Length)
                        {
                            MyMultiBlockDefinition.MyMultiBlockPartDefinition item = blockDefinitions[index];
                            if (Vector3I.BoxIntersects(ref item.Min, ref item.Max, ref minB, ref maxB))
                            {
                                if (!(minB == maxB))
                                {
                                    break;
                                }
                                if (!(item.Min == item.Max))
                                {
                                    break;
                                }
                                m_tmpPartDefinitions.Add(item);
                            }
                            index++;
                            continue;
                        }
                        if (m_tmpPartDefinitions.Count == 0)
                        {
                            flag2 = true;
                        }
                        else
                        {
                            bool flag = true;
                            foreach (MyMultiBlockDefinition.MyMultiBlockPartDefinition definition2 in m_tmpPartDefinitions)
                            {
                                MyCubeBlockDefinition definition3;
                                if (!MyDefinitionManager.Static.TryGetCubeBlockDefinition(definition2.Id, out definition3))
                                {
                                    continue;
                                }
                                if (definition3 != null)
                                {
                                    flag &= MyCompoundCubeBlock.CanAddBlocks(definition3, new MyBlockOrientation(definition2.Forward, definition2.Up), otherDefinition, orientation);
                                    if (!flag)
                                    {
                                        break;
                                    }
                                }
                            }
                            flag2 = flag;
                        }
                        return(flag2);
                    }
                    flag2 = false;
                }
                else
                {
                    flag2 = true;
                }
            }
            finally
            {
                m_tmpPartDefinitions.Clear();
            }
            return(flag2);
        }