public void GetAllRoomsAndCorridors() { Rooms.Clear(); Corridors.Clear(); ClearAllSpaces(TileMap, NumColumns, NumRows); DetermineSpaceTypes(); for (int column = 0; column < NumColumns; column++) { for (int row = 0; row < NumRows; row++) { Tile activeSpace = GetFloorSpace(column, row); if (activeSpace == null) { continue; } if (activeSpace.SpaceType == SpaceType.Room) { if (activeSpace.Parent == null) { Rooms.Add(CreateRoomFromSpace(activeSpace)); } } else if (activeSpace.SpaceType == SpaceType.Corridor) { if (activeSpace.Parent == null) { Corridors.Add(CreateCorridorFromSpace(activeSpace)); } } } } }
/// <summary> /// Private function conforming the Corridors to other Story Room lists. /// </summary> private void FitCorridors() { var corridors = Corridors.ToList(); Corridors.Clear(); foreach (var corridor in corridors) { AddCorridor(corridor); } }
/// <summary> /// Adds a Room to the Corridors list. /// </summary> /// <param name="room">Room to add.</param> /// <param name="fit">Indicates whether the new corridor should mutually fit to other Story features.</param> /// <param name="merge">Indicates whether the new corridor should merge with other corridors.</param> /// <returns> /// True if one or more rooms were added to the Story. /// </returns> public bool AddCorridor(Room room, bool fit = true, bool merge = true) { if (Perimeter == null || room.Perimeter == null || !Perimeter.Covers(perimeter)) { return(false); } var newRoom = new Room() { Color = room.Color, Elevation = Elevation, Height = room.Height, Name = room.Name, Perimeter = room.Perimeter }; var fitRooms = new List <Room> { newRoom }; if (fit) { var toRooms = new List <Room>(Exclusions); toRooms.AddRange(Services); fitRooms = FitRooms(fitRooms, toRooms, false); Rooms = FitRooms(Rooms, fitRooms); } if (fitRooms.Count == 0) { return(false); } Corridors.AddRange(fitRooms); var merged = Shaper.Merge(CorridorsAsPolygons); if (merge && merged.Count < Corridors.Count) { Corridors.Clear(); foreach (var corridor in merged) { Corridors.Add( new Room() { Color = room.Color, Elevation = Elevation, Height = room.Height, Name = room.Name, Perimeter = corridor }); } } return(true); }
/// <summary> /// Adds a Room to the Corridors list. /// </summary> /// <param name="room">Room to add.</param> /// <returns> /// True if one or more Rooms were added. /// </returns> public bool AddCorridor(Room room, bool merge = true, double tolerance = 0.0, double minLength = 0.0) { var perimeters = Shaper.FitWithin(room.Perimeter, Perimeter); if (perimeters.Count == 0) { return(false); } var fitAmong = new List <Polygon>(OpeningsAsPolygons); fitAmong.AddRange(ExclusionsAsPolygons); fitAmong.AddRange(ServicesAsPolygons); var corridors = Shaper.Differences(perimeters, fitAmong).ToList(); if (corridors.Count() == 0) { return(false); } corridors.AddRange(CorridorsAsPolygons); if (merge) { corridors = Shaper.Merge(corridors); } Corridors.Clear(); foreach (var corridor in corridors) { Corridors.Add( new Room(room) { Elevation = Elevation, Height = room.Height, Perimeter = corridor }); } FitRooms(); return(true); }
/// <summary> /// Creates a grid network of corridors within the Story and returns a list of spatially sorted RoomRows ready for population. /// </summary> /// <param name="rowLength">Distance between cross corridors.</param> /// <param name="roomDepth">Desired depth of Rooms.</param> /// <param name="corridorWidth">Width of all corridors.</param> /// <returns>A List of RoomRow</returns> public List <RoomRow> PlanGrid(double rowLength, double rowDepth, double corridorWidth = 3.0, bool split = true) { Corridors.Clear(); Rooms.Clear(); rowLength = rowLength.NearEqual(0.0) ? 1.0 : Math.Abs(rowLength); rowDepth = rowLength.NearEqual(0.0) ? 1.0 : Math.Abs(rowDepth); corridorWidth = rowLength.NearEqual(0.0) ? 1.0 : Math.Abs(corridorWidth); var row = Perimeter.Segments().OrderByDescending(s => s.Length()).First(); var ang = Math.Atan2(row.End.Y - row.Start.Y, row.End.X - row.Start.X) * (180 / Math.PI); var perimeterJig = Perimeter.Rotate(Vector3.Origin, ang * -1); var grid = new Grid2d(perimeterJig); grid.U.DivideByFixedLength(rowLength, FixedDivisionMode.RemainderAtBothEnds); grid.V.DivideByFixedLength(rowDepth, FixedDivisionMode.RemainderAtBothEnds); var uLines = grid.GetCellSeparators(GridDirection.U).Skip(1).Reverse().Skip(1).Reverse(); var vLines = grid.GetCellSeparators(GridDirection.V).Skip(1).Reverse().Skip(1).Reverse(); var ctrLines = new List <Line>(); foreach (var curve in uLines) { ctrLines.Add((Line)curve); } foreach (var curve in vLines) { ctrLines.Add((Line)curve); } foreach (var line in ctrLines) { var corridor = line.Thicken(corridorWidth); if (perimeterJig.Compass().Box.Covers(corridor)) { AddCorridor(new Room(corridor.Rotate(Vector3.Origin, ang), Height)); } } foreach (var cell in grid.CellsFlat) { var polygon = (Polygon)cell.GetCellGeometry(); var compass = polygon.Compass(); if (split) { var north = Polygon.Rectangle(compass.W, compass.NE).Rotate(Vector3.Origin, ang); var south = Polygon.Rectangle(compass.SW, compass.E).Rotate(Vector3.Origin, ang); AddRoom(new Room(north, Height)); AddRoom(new Room(south, Height)); continue; } else if (Math.Abs(compass.SizeY - rowDepth) <= 0.0001) { AddRoom(new Room(polygon.Rotate(Vector3.Origin, ang), Height)); } } var roomRows = new List <RoomRow>(); foreach (var room in Rooms) { roomRows.Add(new RoomRow(room.Perimeter)); } Rooms.Clear(); return(roomRows); }