void drawEntrancePath(Room room, List <Vector3> white) { var entrances = room.getCellsByAttribute(FaceTypes.ENTRANCE); foreach (Cell c in entrances) { white.Add(c.center); } var edgeMap = EdgeMap.constructEdgemapFromPoints(room.pointsInRoom); var edges = GenerateMap.getDelaunayFromPoints(white).ToList(); edges = new Prims().execute(edges).ToList(); foreach (Edge e in edges) { var path = Dijkstras.ASTAR(edgeMap, e.v1, e.v2); for (int i = 0; i < path.Count - 1; i++) { Debug.DrawLine(path[i], path[i + 1], Color.grey, float.PositiveInfinity, false); } white.AddRange(path); } }
public static EdgeMap constructEdgemapFromPoints(IEnumerable <Vector3> input) { var edgeMap = new EdgeMap(); var edges = new HashSet <Edge>(); foreach (Vector3 v in input) { foreach (Vector3 v2 in VoxelIterators.VonNeumanNeighbors3D()) { var v3 = v + v2; if (input.Contains(v3)) { edges.Add(new Edge(v, v3)); } } } foreach (Edge e in edges) { edgeMap.addElement(e); } return(edgeMap); }
public HashSet<Room> roomGenerator () { var watch = System.Diagnostics.Stopwatch.StartNew(); var roomCenters = new HashSet<Vector3>(); var rs = new List<Vector3>(requiredSpaces); totalPoints = new HashSet<Vector3>(); for (int i = 0; i < width;i++){ for (int j = 0; j < width;j++){ for (int k = 0; k < height;k++){ totalPoints.Add(new Vector3(i,j,k)); } } } graph = EdgeMap.constructEdgemapFromPoints(totalPoints); var rects = new List<Rect>(); int failsafe = 0; int roomCount = 0; while (roomCount< numberOfRooms || requiredSpaces.Count < 0){ failsafe ++; if (failsafe > 100) { Debug.Log("overflow"); break; } var v = new Vector3(random.Next(0,width),random.Next(0,width),0); Vector3 size = new Vector3(random.Next(minRoomLength,maxRoomLength),random.Next(minRoomLength,maxRoomLength),0); if (requiredSpaces.Count > 0){ size = requiredSpaces[0]; } var rect = new Rect(v,size); if (generateRoomHelper(ref roomCount,roomCenters,rect,rects,v)){ requiredSpaces.Remove(size); int childCount = random.Next(minRoomChildCount,maxRoomChildCount); Rect current; for (int q = 0; q < childCount;q++){ if (generateHypotheticalChildRoom(out current,rect,rects)){ generateRoomHelper(ref roomCount,roomCenters,current,rects,rect.min); } } } } var edges =(getDelaunayFromPoints(roomCenters)).ToList(); var totalEdges = new HashSet<Edge>(edges); edges= new HashSet<Edge>(new Prims().execute(edges)).ToList(); foreach (Edge e in totalEdges){ if (random.NextDouble() < .15 && ! edges.Contains(e)){ edges.Add(e); } } var g = new EdgeMap(edges); foreach (Edge e in edges){ var points = paintRoomAroundLine(e,1,2); if (points.Count > 0){ var r = new Room(points); r.tag = new BoundedSpaceTags(FaceTypes.HALLWAY); assignPointToRoom(r,false); } } var output = new HashSet<Room>(pointDict.Values); foreach (Room r in output){ var r2 = Room.splitDisconnectedRoom(r); foreach (Room r3 in r2) assignPointToRoom(r3,true); } output.Clear(); output.UnionWith(pointDict.Values); new RecursiveBackTrace().recursiveBackTrace(pointDict); return output; }