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); }
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; } }
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); } }
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); }
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)); }