예제 #1
0
 public static bool IsInside(Vector2 a, PlacedPart b)
 {
     PartData.Area[] areas = b.partData.areas;
     for (int i = 0; i < areas.Length; i++)
     {
         PartData.Area area  = areas[i];
         bool          flag  = Utility.IsInsideRange(a.x, b.GetWorldPosition(area.start).x, b.GetWorldPosition(area.start + area.size).x, true);
         bool          flag2 = Utility.IsInsideRange(a.y, b.GetWorldPosition(area.start).y, b.GetWorldPosition(area.start + area.size).y, true);
         if (flag && flag2)
         {
             return(true);
         }
     }
     return(false);
 }
예제 #2
0
        public static void CenterParts(List <PlacedPart> parts, Vector2 targetCenter)
        {
            Vector2 zero = Vector2.zero;
            Vector2 a    = Vector2.one * float.PositiveInfinity;

            foreach (PlacedPart current in parts)
            {
                PartData.Area[] areas = current.partData.areas;
                for (int i = 0; i < areas.Length; i++)
                {
                    PartData.Area area    = areas[i];
                    Vector2       vector  = current.position + area.start * current.orientation;
                    Vector2       vector2 = current.position + (area.start + area.size) * current.orientation;
                    zero = new Vector2(Mathf.Max(new float[]
                    {
                        zero.x,
                        vector.x,
                        vector2.x
                    }), Mathf.Max(new float[]
                    {
                        zero.y,
                        vector.y,
                        vector2.y
                    }));
                    a = new Vector2(Mathf.Min(new float[]
                    {
                        a.x,
                        vector.x,
                        vector2.x
                    }), Mathf.Min(new float[]
                    {
                        a.y,
                        vector.y,
                        vector2.y
                    }));
                }
            }
            Vector2 a2 = Utility.RoundToHalf((a + zero) / 2f + targetCenter);

            for (int j = 0; j < parts.Count; j++)
            {
                parts[j].position += -a2;
            }
        }
예제 #3
0
        public static void PositionForLaunch(List <Build.BuildSave.PlacedPartSave> parts, PartDatabase partDatabase)
        {
            Vector2 zero = Vector2.zero;
            Vector2 a    = Vector2.one * float.PositiveInfinity;

            foreach (Build.BuildSave.PlacedPartSave current in parts)
            {
                PartData.Area[] areas = partDatabase.GetPartByName(current.partName).areas;
                for (int i = 0; i < areas.Length; i++)
                {
                    PartData.Area area    = areas[i];
                    Vector2       vector  = current.position + area.start * current.orientation;
                    Vector2       vector2 = current.position + (area.start + area.size) * current.orientation;
                    zero = new Vector2(Mathf.Max(new float[]
                    {
                        zero.x,
                        vector.x,
                        vector2.x
                    }), Mathf.Max(new float[]
                    {
                        zero.y,
                        vector.y,
                        vector2.y
                    }));
                    a = new Vector2(Mathf.Min(new float[]
                    {
                        a.x,
                        vector.x,
                        vector2.x
                    }), Mathf.Min(new float[]
                    {
                        a.y,
                        vector.y,
                        vector2.y
                    }));
                }
            }
            for (int j = 0; j < parts.Count; j++)
            {
                parts[j].position -= a - new Vector2(Utility.RoundToHalf((a.x - zero.x) / 2f), 0f);
            }
        }
예제 #4
0
 public static bool IsOverplaing(PlacedPart a, PlacedPart b)
 {
     PartData.Area[] areas = a.partData.areas;
     for (int i = 0; i < areas.Length; i++)
     {
         PartData.Area   area   = areas[i];
         PartData.Area[] areas2 = b.partData.areas;
         for (int j = 0; j < areas2.Length; j++)
         {
             PartData.Area area2 = areas2[j];
             bool          flag  = Utility.LineOverlaps(a.GetWorldPosition(area.start).x, a.GetWorldPosition(area.start + area.size).x, b.GetWorldPosition(area2.start).x, b.GetWorldPosition(area2.start + area2.size).x);
             bool          flag2 = Utility.LineOverlaps(a.GetWorldPosition(area.start).y, a.GetWorldPosition(area.start + area.size).y, b.GetWorldPosition(area2.start).y, b.GetWorldPosition(area2.start + area2.size).y);
             if (flag && flag2)
             {
                 return(true);
             }
         }
     }
     return(false);
 }
예제 #5
0
        public void ClampToLimits(PlacedPart part)
        {
            Vector2 zero  = Vector2.zero;
            Vector2 zero2 = Vector2.zero;

            PartData.Area[] areas = part.partData.areas;
            for (int i = 0; i < areas.Length; i++)
            {
                PartData.Area area    = areas[i];
                Vector2       vector  = part.position + area.start * part.orientation;
                Vector2       vector2 = part.position + (area.start + area.size) * part.orientation;
                zero = new Vector2(Mathf.Max(new float[]
                {
                    zero.x,
                    vector.x,
                    vector2.x
                }), Mathf.Max(new float[]
                {
                    zero.y,
                    vector.y,
                    vector2.y
                }));
                zero2 = new Vector2(Mathf.Min(new float[]
                {
                    zero2.x,
                    vector.x,
                    vector2.x
                }), Mathf.Min(new float[]
                {
                    zero2.y,
                    vector.y,
                    vector2.y
                }));
            }
            part.position -= new Vector2(Mathf.Min(0f, zero2.x), Mathf.Min(0f, zero2.y)) + new Vector2(Mathf.Max(0f, zero.x - this.width), Mathf.Max(0f, zero.y - this.height));
        }