public void GenerateRooms(OctTree tree) { if (tree.GetChildCount() != 0) { foreach (OctTree subTree in tree.children) { if (subTree != null) { GenerateRooms(subTree); } } } else { RoomNode newRoom = new RoomNode(tree.boundary); newRoom.roomBounds.extents -= Vector3.one * minSeparation; newRoom.RandomizeBounds(Vector3.one, minRoomSize, maxRoomSize); newRoom.QuantizeBounds(corridorSize); /*Vector3 center, extents; * * extents.x = Mathf.Floor (Random.Range (minRoomSize / 2, tree.boundary.extents.x)); * extents.y = Mathf.Floor (Random.Range (minRoomSize / 2, tree.boundary.extents.y)); * extents.z = Mathf.Floor (Random.Range (minRoomSize / 2, tree.boundary.extents.z)); * * center = tree.boundary.center; * center.x = Mathf.Round (center.x + Random.Range (extents.x - tree.boundary.extents.x, tree.boundary.extents.x - extents.x)); * center.y = Mathf.Round (center.y + Random.Range (extents.y - tree.boundary.extents.y, tree.boundary.extents.y - extents.y)); * center.z = Mathf.Round (center.z + Random.Range (extents.z - tree.boundary.extents.z, tree.boundary.extents.z - extents.z)); * * newRoom.roomBounds.center = center; * newRoom.roomBounds.extents = extents;*/ newRoom.octTreeNode = tree; roomNodeList.AddFirst(newRoom); tree.roomNode = newRoom; } }
//Returns a list of newly created rooms public LinkedList<RoomNode> BuildCorridors(RoomNode roomA, RoomNode roomB, Vector3 lastDir, LinkedList<RoomNode> existingRooms) { if (lastDir == Vector3.zero) Debug.Log ("Attempting to build new corridor"); if (roomA == roomB) return new LinkedList<RoomNode> (); int attempts = 8; while (attempts > 0) { Vector3 overlapAxes = RoomNode.OverlapAxes (roomA.roomBounds, roomB.roomBounds); int numOverlaps = Util.VecNonZeroes (overlapAxes); int selectedAxis = Random.Range (0, 3); if (overlapAxes == Vector3.one) return new LinkedList<RoomNode> (); while (overlapAxes[selectedAxis] != 0) selectedAxis = Random.Range (0, 3); Vector3 corridorDir = Vector3.zero; corridorDir [selectedAxis] = Mathf.Sign (roomB.roomBounds.center [selectedAxis] - roomA.roomBounds.center [selectedAxis]); //Debug.Log ("Connect " + numOverlaps); if (numOverlaps == 2) { LinkedList<RoomNode> result = new LinkedList<RoomNode> (); Bounds b = RoomNode.OverlapBounds (roomA.roomBounds, roomB.roomBounds); RoomNode r = new RoomNode (b); Vector3 randomAxes = Vector3.one; randomAxes [selectedAxis] = 0; if (lastDir != Vector3.zero) { r.ShoveToEdge (lastDir, Vector3.one * 0.5f * corridorSize); } else r.RandomizeBounds (randomAxes, corridorSize * Vector3.one, corridorSize * Vector3.one); int limit = 12; while (GetOverlapped(r.roomBounds, existingRooms,corridorDir) != null && limit > 0) { r.roomBounds = b; r.RandomizeBounds (randomAxes, corridorSize * Vector3.one, corridorSize * Vector3.one); limit --; } if (limit == 0) { //Debug.Log ("OH GOD DAMMIT " + r.roomBounds.ToString ()); //Instantiate (indicatorPrefab, r.roomBounds.center, Quaternion.identity); } else { r.isCorridor = true; RoomNode.MakeNeighbors (roomA, r); RoomNode.MakeNeighbors (r, roomB); r.name = numOverlaps.ToString (); result.AddFirst (r); return result; } } else if (numOverlaps < 2) { Bounds b = RoomNode.OverlapBounds (roomA.roomBounds, roomB.roomBounds); int selectedOther = Random.Range (0, 3); while (selectedOther == selectedAxis || overlapAxes[selectedOther] != 0) { selectedOther = Random.Range (0, 3); } Vector3 newCenter; Vector3 newExtents; newCenter = b.center; newExtents = b.extents; if (numOverlaps == 1) { newCenter [selectedOther] = roomA.roomBounds.center [selectedOther]; newExtents [selectedOther] = roomA.roomBounds.extents [selectedOther]; } else if (numOverlaps == 0) { Debug.Log ("Connecting Zero"); newCenter = roomA.roomBounds.center; newExtents = roomA.roomBounds.extents; newCenter [selectedAxis] = b.center [selectedAxis]; newExtents [selectedAxis] = b.extents [selectedAxis]; } float sign = Mathf.Sign (newCenter [selectedAxis] - roomA.roomBounds.center [selectedAxis]); float extension = Random.Range (corridorSize, roomB.roomBounds.extents [selectedAxis]); newCenter [selectedAxis] += extension * sign; newExtents [selectedAxis] += extension; b.center = newCenter; b.extents = newExtents; RoomNode r = new RoomNode (b); Vector3 randomAxes = Vector3.one; randomAxes [selectedAxis] = 0; if (lastDir != Vector3.zero) { r.ShoveToEdge (lastDir, Vector3.one * 0.5f * corridorSize); } else r.RandomizeBounds (randomAxes, corridorSize * Vector3.one, corridorSize * Vector3.one); int limit = 12; while (GetOverlapped(r.roomBounds, existingRooms,corridorDir) != null && limit > 0) { b = RoomNode.OverlapBounds (roomA.roomBounds, roomB.roomBounds); newCenter = b.center; newExtents = b.extents; if (numOverlaps == 1) { newCenter [selectedOther] = roomA.roomBounds.center [selectedOther]; newExtents [selectedOther] = roomA.roomBounds.extents [selectedOther]; } else if (numOverlaps == 0) { newCenter = roomA.roomBounds.center; newExtents = roomA.roomBounds.extents; newCenter [selectedAxis] = b.center [selectedAxis]; newExtents [selectedAxis] = b.extents [selectedAxis]; } extension = Random.Range (corridorSize, roomB.roomBounds.extents [selectedAxis]); newCenter [selectedAxis] += extension * sign; newExtents [selectedAxis] += extension; b.center = newCenter; b.extents = newExtents; r.roomBounds = b; r.RandomizeBounds (randomAxes, corridorSize * Vector3.one, corridorSize * Vector3.one); limit --; } if (limit == 0) { //Debug.Log ("Aw f**k"); } else { LinkedList<RoomNode> result = BuildCorridors (r, roomB, corridorDir, existingRooms); if (result.Count != 0) { r.isCorridor = true; RoomNode.MakeNeighbors (roomA, r); r.name = numOverlaps.ToString (); result.AddFirst (r); return result; } } } attempts--; } if (lastDir == Vector3.zero) Debug.Log ("Couldn't Connect"); return new LinkedList<RoomNode> (); }
public void GenerateRooms(OctTree tree) { if (tree.GetChildCount () != 0) { foreach (OctTree subTree in tree.children) { if (subTree != null) { GenerateRooms (subTree); } } } else { RoomNode newRoom = new RoomNode (tree.boundary); newRoom.roomBounds.extents -= Vector3.one * minSeparation; newRoom.RandomizeBounds (Vector3.one, minRoomSize, maxRoomSize); newRoom.QuantizeBounds (corridorSize); /*Vector3 center, extents; extents.x = Mathf.Floor (Random.Range (minRoomSize / 2, tree.boundary.extents.x)); extents.y = Mathf.Floor (Random.Range (minRoomSize / 2, tree.boundary.extents.y)); extents.z = Mathf.Floor (Random.Range (minRoomSize / 2, tree.boundary.extents.z)); center = tree.boundary.center; center.x = Mathf.Round (center.x + Random.Range (extents.x - tree.boundary.extents.x, tree.boundary.extents.x - extents.x)); center.y = Mathf.Round (center.y + Random.Range (extents.y - tree.boundary.extents.y, tree.boundary.extents.y - extents.y)); center.z = Mathf.Round (center.z + Random.Range (extents.z - tree.boundary.extents.z, tree.boundary.extents.z - extents.z)); newRoom.roomBounds.center = center; newRoom.roomBounds.extents = extents;*/ newRoom.octTreeNode = tree; roomNodeList.AddFirst (newRoom); tree.roomNode = newRoom; } }
//Returns a list of newly created rooms public LinkedList <RoomNode> BuildCorridors(RoomNode roomA, RoomNode roomB, Vector3 lastDir, LinkedList <RoomNode> existingRooms) { if (lastDir == Vector3.zero) { Debug.Log("Attempting to build new corridor"); } if (roomA == roomB) { return(new LinkedList <RoomNode> ()); } int attempts = 8; while (attempts > 0) { Vector3 overlapAxes = RoomNode.OverlapAxes(roomA.roomBounds, roomB.roomBounds); int numOverlaps = Util.VecNonZeroes(overlapAxes); int selectedAxis = Random.Range(0, 3); if (overlapAxes == Vector3.one) { return(new LinkedList <RoomNode> ()); } while (overlapAxes[selectedAxis] != 0) { selectedAxis = Random.Range(0, 3); } Vector3 corridorDir = Vector3.zero; corridorDir [selectedAxis] = Mathf.Sign(roomB.roomBounds.center [selectedAxis] - roomA.roomBounds.center [selectedAxis]); //Debug.Log ("Connect " + numOverlaps); if (numOverlaps == 2) { LinkedList <RoomNode> result = new LinkedList <RoomNode> (); Bounds b = RoomNode.OverlapBounds(roomA.roomBounds, roomB.roomBounds); RoomNode r = new RoomNode(b); Vector3 randomAxes = Vector3.one; randomAxes [selectedAxis] = 0; if (lastDir != Vector3.zero) { r.ShoveToEdge(lastDir, Vector3.one * 0.5f * corridorSize); } else { r.RandomizeBounds(randomAxes, corridorSize * Vector3.one, corridorSize * Vector3.one); } int limit = 12; while (GetOverlapped(r.roomBounds, existingRooms, corridorDir) != null && limit > 0) { r.roomBounds = b; r.RandomizeBounds(randomAxes, corridorSize * Vector3.one, corridorSize * Vector3.one); limit--; } if (limit == 0) { //Debug.Log ("OH GOD DAMMIT " + r.roomBounds.ToString ()); //Instantiate (indicatorPrefab, r.roomBounds.center, Quaternion.identity); } else { r.isCorridor = true; RoomNode.MakeNeighbors(roomA, r); RoomNode.MakeNeighbors(r, roomB); r.name = numOverlaps.ToString(); result.AddFirst(r); return(result); } } else if (numOverlaps < 2) { Bounds b = RoomNode.OverlapBounds(roomA.roomBounds, roomB.roomBounds); int selectedOther = Random.Range(0, 3); while (selectedOther == selectedAxis || overlapAxes[selectedOther] != 0) { selectedOther = Random.Range(0, 3); } Vector3 newCenter; Vector3 newExtents; newCenter = b.center; newExtents = b.extents; if (numOverlaps == 1) { newCenter [selectedOther] = roomA.roomBounds.center [selectedOther]; newExtents [selectedOther] = roomA.roomBounds.extents [selectedOther]; } else if (numOverlaps == 0) { Debug.Log("Connecting Zero"); newCenter = roomA.roomBounds.center; newExtents = roomA.roomBounds.extents; newCenter [selectedAxis] = b.center [selectedAxis]; newExtents [selectedAxis] = b.extents [selectedAxis]; } float sign = Mathf.Sign(newCenter [selectedAxis] - roomA.roomBounds.center [selectedAxis]); float extension = Random.Range(corridorSize, roomB.roomBounds.extents [selectedAxis]); newCenter [selectedAxis] += extension * sign; newExtents [selectedAxis] += extension; b.center = newCenter; b.extents = newExtents; RoomNode r = new RoomNode(b); Vector3 randomAxes = Vector3.one; randomAxes [selectedAxis] = 0; if (lastDir != Vector3.zero) { r.ShoveToEdge(lastDir, Vector3.one * 0.5f * corridorSize); } else { r.RandomizeBounds(randomAxes, corridorSize * Vector3.one, corridorSize * Vector3.one); } int limit = 12; while (GetOverlapped(r.roomBounds, existingRooms, corridorDir) != null && limit > 0) { b = RoomNode.OverlapBounds(roomA.roomBounds, roomB.roomBounds); newCenter = b.center; newExtents = b.extents; if (numOverlaps == 1) { newCenter [selectedOther] = roomA.roomBounds.center [selectedOther]; newExtents [selectedOther] = roomA.roomBounds.extents [selectedOther]; } else if (numOverlaps == 0) { newCenter = roomA.roomBounds.center; newExtents = roomA.roomBounds.extents; newCenter [selectedAxis] = b.center [selectedAxis]; newExtents [selectedAxis] = b.extents [selectedAxis]; } extension = Random.Range(corridorSize, roomB.roomBounds.extents [selectedAxis]); newCenter [selectedAxis] += extension * sign; newExtents [selectedAxis] += extension; b.center = newCenter; b.extents = newExtents; r.roomBounds = b; r.RandomizeBounds(randomAxes, corridorSize * Vector3.one, corridorSize * Vector3.one); limit--; } if (limit == 0) { //Debug.Log ("Aw f**k"); } else { LinkedList <RoomNode> result = BuildCorridors(r, roomB, corridorDir, existingRooms); if (result.Count != 0) { r.isCorridor = true; RoomNode.MakeNeighbors(roomA, r); r.name = numOverlaps.ToString(); result.AddFirst(r); return(result); } } } attempts--; } if (lastDir == Vector3.zero) { Debug.Log("Couldn't Connect"); } return(new LinkedList <RoomNode> ()); }