private static void DrawDoorLine(DoorLineGrid2D doorLine, Grid grid, Color color, string label = null) { var line = new OrthogonalLineGrid2D(doorLine.From.ToCustomIntVector2(), doorLine.To.ToCustomIntVector2()); var fromSolid = line.From; var toSolid = line.From; if (line.Length > 0) { toSolid += (doorLine.Length - 1) * line.GetDirectionVector(); } var toDotted = line.To; var doorsCount = line.Length - doorLine.Length + 2; if (doorsCount > 0) { var finalLabel = $"{doorsCount} door{(doorsCount != 1 ? "s" : "")}\nSize {doorLine.Length}"; if (label != null) { finalLabel += $"\n{label}"; } DrawRectangleOutline(grid, fromSolid.ToUnityIntVector3(), toSolid.ToUnityIntVector3(), color, new Vector2(0.2f, 0.2f)); } }
protected override void AddDoor(Vector3Int from, Vector3Int to) { var length = doors.HybridDoorModeData.DefaultLength; var doorLine = new DoorLineGrid2D() { From = from, To = to, Length = length, }; var line = new OrthogonalLineGrid2D(from.ToCustomIntVector2(), to.ToCustomIntVector2()); if (doors.HybridDoorModeData.DoorLines.Any(x => x == doorLine)) { return; } if (line.Length >= length - 1) { Undo.RecordObject(doors, "Added door positions"); doors.HybridDoorModeData.DoorLines.Add(doorLine); EditorUtility.SetDirty(doors); } }
private void DrawDoor(Grid grid, Vector3Int from, Vector3Int to) { var length = new OrthogonalLine(from, to).Length; var doorLine = new DoorLineGrid2D() { From = from, To = to, Length = length, }; var color = Color.red; DoorsInspectorUtils.DrawDoorLine(doorLine, grid, color); }
protected override void DrawPreview(Vector3Int from, Vector3Int to) { var gameObject = doors.transform.gameObject; var grid = gameObject.GetComponentInChildren <Grid>(); var length = doors.HybridDoorModeData.DefaultLength; var doorLine = new DoorLineGrid2D() { From = from, To = to, Length = length, }; var color = Color.red; DoorsInspectorUtils.DrawDoorLine(doorLine, grid, color); }
public static DoorLineGrid2D TransformDoorLine(DoorLineGrid2D doorLine, TransformationGrid2D transformation) { var doorPosition = doorLine.Line; if (doorPosition.GetDirection() == OrthogonalLineGrid2D.Direction.Undefined) { throw new InvalidOperationException("Cannot fix door direction when original direction is undefined"); } switch (transformation) { case TransformationGrid2D.Identity: return(doorLine); case TransformationGrid2D.Rotate90: return(new DoorLineGrid2D(doorPosition.Rotate(90), doorLine.Length, doorLine.DoorSocket)); case TransformationGrid2D.Rotate180: return(new DoorLineGrid2D(doorPosition.Rotate(180), doorLine.Length, doorLine.DoorSocket)); case TransformationGrid2D.Rotate270: return(new DoorLineGrid2D(doorPosition.Rotate(270), doorLine.Length, doorLine.DoorSocket)); } // Other transformations need to switch door directions var firstStartPoint = doorPosition.From.Transform(transformation); var lastStartPoint = doorPosition.To.Transform(transformation); var length = doorLine.Length; var transformedDirection = TransformDirection(doorPosition.GetDirection(), transformation); var transformedLine = new OrthogonalLineGrid2D(firstStartPoint, lastStartPoint, transformedDirection); var lastEndPoint = lastStartPoint + length * transformedLine.GetDirectionVector(); var newDirection = OrthogonalLineGrid2D.GetOppositeDirection(transformedDirection); var newDoorPosition = new OrthogonalLineGrid2D(lastEndPoint, lastEndPoint + transformedLine.Length * transformedLine.SwitchOrientation().GetDirectionVector(), newDirection); if (newDoorPosition.Length != doorPosition.Length) { throw new InvalidOperationException(); } return(new DoorLineGrid2D(newDoorPosition, doorLine.Length, doorLine.DoorSocket)); }
private IEnumerator RunCoroutine() { Show = true; var polygon = RoomTemplateLoaderGrid2D.GetPolygonFromRoomTemplate(gameObject); var doorsComponent = gameObject.GetComponent <DoorsGrid2D>(); var doorMode = doorsComponent.GetDoorMode(); var doors = doorMode.GetDoors(polygon); foreach (var doorLineGrid2D in doors) { foreach (var start in doorLineGrid2D.Line.GetPoints()) { var end = start + doorLineGrid2D.Length * doorLineGrid2D.Line.GetDirectionVector(); DoorLine = new DoorLineGrid2D() { From = start.ToUnityIntVector3(), To = end.ToUnityIntVector3(), Length = doorLineGrid2D.Length + 1, }; Debug.Log(1); var timer = new Stopwatch(); timer.Start(); SceneView.RepaintAll(); while (timer.ElapsedMilliseconds < 500) { yield return(null); } DoorLine = null; } } Show = false; SceneView.RepaintAll(); yield break; }
public static List <DoorLineGrid2D> MergeDoorLines(IEnumerable <DoorLineGrid2D> doorLines) { var doorLinesByDirection = doorLines.GroupBy(x => x.Line.GetDirection()); var result = new List <DoorLineGrid2D>(); foreach (var grouping in doorLinesByDirection) { if (grouping.Key == OrthogonalLineGrid2D.Direction.Undefined) { throw new ArgumentException("There must be no door lines with undefined direction"); } var sameDirectionDoorLines = new LinkedList <DoorLineGrid2D>(grouping); while (sameDirectionDoorLines.Count != 0) { var doorLineNode = sameDirectionDoorLines.First; var doorLine = doorLineNode.Value; sameDirectionDoorLines.RemoveFirst(); while (true) { var found = false; var nextDoorLineNode = sameDirectionDoorLines.First; while (nextDoorLineNode != null) { var otherDoorLineNode = nextDoorLineNode; var otherDoorLine = otherDoorLineNode.Value; nextDoorLineNode = otherDoorLineNode.Next; if (otherDoorLine.Length != doorLine.Length) { continue; } // TODO: improve later if (otherDoorLine.DoorSocket != doorLine.DoorSocket) { continue; } if (doorLine.Line.To + doorLine.Line.GetDirectionVector() == otherDoorLine.Line.From) { doorLine = new DoorLineGrid2D(new OrthogonalLineGrid2D(doorLine.Line.From, otherDoorLine.Line.To), doorLine.Length, doorLine.DoorSocket); found = true; sameDirectionDoorLines.Remove(otherDoorLineNode); } else if (doorLine.Line.From - doorLine.Line.GetDirectionVector() == otherDoorLine.Line.To) { doorLine = new DoorLineGrid2D(new OrthogonalLineGrid2D(otherDoorLine.Line.From, doorLine.Line.To), doorLine.Length, doorLine.DoorSocket); found = true; sameDirectionDoorLines.Remove(otherDoorLineNode); } } if (!found) { break; } } result.Add(doorLine); } } return(result); }