Portals - fix autolinking to internal rooms
Portal autolinking was previously agnostic to room priorities, which meant that portals would link to the first room they found (often outside rooms). This PR fixes this by making the autolinking priority aware, and will preferentially link to internal rooms.
This commit is contained in:
parent
42e40a7d3c
commit
a339f6fc49
1 changed files with 31 additions and 16 deletions
|
@ -971,6 +971,9 @@ void RoomManager::_autolink_portals(Spatial *p_roomlist, LocalVector<Portal *> &
|
||||||
|
|
||||||
Vector3 test_pos = portal->_pt_center_world + (dist * portal->_plane.normal);
|
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++) {
|
for (int r = 0; r < _rooms.size(); r++) {
|
||||||
Room *room = _rooms[r];
|
Room *room = _rooms[r];
|
||||||
if (room->_room_ID == portal->_linkedroom_ID[0]) {
|
if (room->_room_ID == portal->_linkedroom_ID[0]) {
|
||||||
|
@ -993,26 +996,38 @@ void RoomManager::_autolink_portals(Spatial *p_roomlist, LocalVector<Portal *> &
|
||||||
} // for through planes
|
} // for through planes
|
||||||
|
|
||||||
if (!outside) {
|
if (!outside) {
|
||||||
// great, we found a linked room!
|
// we found a suitable room, but we want the highest priority in
|
||||||
convert_log("\t\tAUTOLINK OK from " + source_room->get_name() + " to " + room->get_name(), 1);
|
// case there are internal rooms...
|
||||||
portal->_linkedroom_ID[1] = r;
|
if (room->_room_priority > best_priority) {
|
||||||
|
best_priority = room->_room_priority;
|
||||||
// add the portal to the portals list for the receiving room
|
best_room = r;
|
||||||
room->_portals.push_back(n);
|
}
|
||||||
|
|
||||||
// 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 through rooms
|
} // for through rooms
|
||||||
|
|
||||||
|
// found a suitable link room
|
||||||
|
if (best_room != -1) {
|
||||||
|
Room *room = _rooms[best_room];
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
|
||||||
|
// add the portal to the portals list for the receiving room
|
||||||
|
room->_portals.push_back(n);
|
||||||
|
|
||||||
|
// 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
|
} // for attempt
|
||||||
|
|
||||||
// error condition
|
// error condition
|
||||||
|
|
Loading…
Reference in a new issue