Browse Source

Merge pull request #51392 from lawnjelly/portals_autolink_internal

Portals - fix autolinking to internal rooms
Rémi Verschelde 4 năm trước cách đây
mục cha
commit
52b3891b59
1 tập tin đã thay đổi với 29 bổ sung14 xóa
  1. 29 14
      scene/3d/room_manager.cpp

+ 29 - 14
scene/3d/room_manager.cpp

@@ -966,6 +966,9 @@ void RoomManager::_autolink_portals(Spatial *p_roomlist, LocalVector<Portal *> &
 
 			Vector3 test_pos = portal->_pt_center_world + (dist * portal->_plane.normal);
 
+			int best_priority = -1000;
+			int best_room = -1;
+
 			for (int r = 0; r < _rooms.size(); r++) {
 				Room *room = _rooms[r];
 				if (room->_room_ID == portal->_linkedroom_ID[0]) {
@@ -988,25 +991,37 @@ void RoomManager::_autolink_portals(Spatial *p_roomlist, LocalVector<Portal *> &
 				} // for through planes
 
 				if (!outside) {
-					// great, we found a linked room!
-					convert_log("\t\tAUTOLINK OK from " + source_room->get_name() + " to " + room->get_name(), 1);
-					portal->_linkedroom_ID[1] = r;
+					// we found a suitable room, but we want the highest priority in
+					// case there are internal rooms...
+					if (room->_room_priority > best_priority) {
+						best_priority = room->_room_priority;
+						best_room = r;
+					}
+				}
 
-					// add the portal to the portals list for the receiving room
-					room->_portals.push_back(n);
+			} // for through rooms
 
-					// send complete link to visual server so the portal will be active in the visual server room system
-					VisualServer::get_singleton()->portal_link(portal->_portal_rid, source_room->_room_rid, room->_room_rid, portal->_settings_two_way);
+			// found a suitable link room
+			if (best_room != -1) {
+				Room *room = _rooms[best_room];
 
-					// make the portal internal if necessary
-					// (this prevents the portal plane clipping the room bound)
-					portal->_internal = source_room->_room_priority > room->_room_priority;
+				// great, we found a linked room!
+				convert_log("\t\tAUTOLINK OK from " + source_room->get_name() + " to " + room->get_name(), 1);
+				portal->_linkedroom_ID[1] = best_room;
 
-					autolink_found = true;
-					break;
-				}
+				// add the portal to the portals list for the receiving room
+				room->_portals.push_back(n);
 
-			} // for through rooms
+				// send complete link to visual server so the portal will be active in the visual server room system
+				VisualServer::get_singleton()->portal_link(portal->_portal_rid, source_room->_room_rid, room->_room_rid, portal->_settings_two_way);
+
+				// make the portal internal if necessary
+				// (this prevents the portal plane clipping the room bound)
+				portal->_internal = source_room->_room_priority > room->_room_priority;
+
+				autolink_found = true;
+				break;
+			}
 
 		} // for attempt