NodeConnection[] GetConnectionCandidates(BSPNodeObject[] leftRooms, BSPNodeObject[] rightRooms) { var connections = new List <NodeConnection>(); foreach (var leftRoom in leftRooms) { foreach (var rightRoom in rightRooms) { // Connect left and right together var intersection = Rectangle.Intersect(leftRoom.bounds, rightRoom.bounds); var minIntersection = bspConfig.roomPadding * 2; if (intersection.Size.x > minIntersection || intersection.Size.z > minIntersection) { var connection = new NodeConnection(leftRoom, rightRoom, bspConfig.roomPadding); connections.Add(connection); } } } return(connections.ToArray()); }
NodeConnection[] ConnectPartitions(BSPNodeObject leftPartition, BSPNodeObject rightPartition, bool horizontalSplit) { var connections = new List <NodeConnection>(); if (leftPartition.discarded || rightPartition.discarded) { return(connections.ToArray()); } var leftRooms = new List <BSPNodeObject>(); var rightRooms = new List <BSPNodeObject>(); if (horizontalSplit) { FindBoundaryEdgeRooms(leftPartition, BSPNodeDirection.Right, leftRooms); FindBoundaryEdgeRooms(rightPartition, BSPNodeDirection.Left, rightRooms); } else // Vertical split { // Left = bottom partition // Right = top partition FindBoundaryEdgeRooms(leftPartition, BSPNodeDirection.Top, leftRooms); FindBoundaryEdgeRooms(rightPartition, BSPNodeDirection.Bottom, rightRooms); } // Connect the two rooms together if (leftRooms.Count == 0 || rightRooms.Count == 0) { return(connections.ToArray()); } Shuffle(leftRooms); Shuffle(rightRooms); bool roomsConnected = false; foreach (var leftRoom in leftRooms) { // First check if any of the right rooms are connected foreach (var rightRoom in rightRooms) { if (leftRoom.connectedRooms.Contains(rightRoom)) { roomsConnected = true; break; } } foreach (var rightRoom in rightRooms) { if (leftRoom.connectedRooms.Contains(rightRoom)) { // Already connected continue; } bool shouldConnectRooms = true; if (roomsConnected) { // rooms are already connected along this edge. Check if can loop shouldConnectRooms = random.NextFloat() < bspConfig.loopingProbability; } if (shouldConnectRooms) { // Connect left and right together var intersection = Rectangle.Intersect(leftRoom.bounds, rightRoom.bounds); var minIntersection = bspConfig.roomPadding * 2; if (intersection.Size.x > minIntersection || intersection.Size.z > minIntersection) { // These two rooms can connect leftRoom.connectedRooms.Add(rightRoom); rightRoom.connectedRooms.Add(leftRoom); roomsConnected = true; var connection = new NodeConnection(leftRoom, rightRoom, bspConfig.roomPadding); connections.Add(connection); } } } } return(connections.ToArray()); }