From cfe806a929fb1d77f35c8b8b10509231d334f3e8 Mon Sep 17 00:00:00 2001 From: lawnjelly Date: Sun, 8 Aug 2021 14:02:38 +0100 Subject: [PATCH] Portals - Fix secondary PVS bug Fixes a bug whereby it read from the primary PVS in the gameplay monitor, using the size from the secondary PVS. This would read out of bounds and crash. Removed debug code to update the gameplay monitor from the preview camera - this is no longer required. Temporarily revert to the simple PVS generation method, because I've noticed a bug in the complex version, and the simple version is safer while I fix this. --- scene/3d/room_manager.cpp | 5 ---- .../portals/portal_gameplay_monitor.cpp | 27 ++++++++++--------- servers/visual/portals/portal_pvs_builder.cpp | 4 +-- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/scene/3d/room_manager.cpp b/scene/3d/room_manager.cpp index e3055846340..b16821dcffc 100644 --- a/scene/3d/room_manager.cpp +++ b/scene/3d/room_manager.cpp @@ -164,11 +164,6 @@ void RoomManager::_preview_camera_update() { bool changed = false; if (camera_pos != _godot_camera_pos) { changed = true; - - // update gameplay monitor - Vector camera_positions; - camera_positions.push_back(camera_pos); - VisualServer::get_singleton()->rooms_update_gameplay_monitor(scenario, camera_positions); } // check planes if (!changed) { diff --git a/servers/visual/portals/portal_gameplay_monitor.cpp b/servers/visual/portals/portal_gameplay_monitor.cpp index de515a4eabd..cf54c3bbb72 100644 --- a/servers/visual/portals/portal_gameplay_monitor.cpp +++ b/servers/visual/portals/portal_gameplay_monitor.cpp @@ -104,20 +104,23 @@ void PortalGameplayMonitor::update_gameplay(PortalRenderer &p_portal_renderer, c for (int n = 0; n < p_num_source_rooms; n++) { const VSRoom &source_room = p_portal_renderer.get_room(p_source_room_ids[n]); - int pvs_size = source_room._pvs_size; - int pvs_first = source_room._pvs_first; if (_use_secondary_pvs) { - pvs_size = source_room._secondary_pvs_size; - pvs_first = source_room._secondary_pvs_first; + int pvs_size = source_room._secondary_pvs_size; + int pvs_first = source_room._secondary_pvs_first; + + for (int r = 0; r < pvs_size; r++) { + int room_id = pvs.get_secondary_pvs_room_id(pvs_first + r); + _update_gameplay_room(p_portal_renderer, room_id, source_rooms_changed); + } // for r through the rooms hit in the pvs + } else { + int pvs_size = source_room._pvs_size; + int pvs_first = source_room._pvs_first; + + for (int r = 0; r < pvs_size; r++) { + int room_id = pvs.get_pvs_room_id(pvs_first + r); + _update_gameplay_room(p_portal_renderer, room_id, source_rooms_changed); + } // for r through the rooms hit in the pvs } - - for (int r = 0; r < pvs_size; r++) { - int room_id = pvs.get_pvs_room_id(pvs_first + r); - - _update_gameplay_room(p_portal_renderer, room_id, source_rooms_changed); - - } // for r through the rooms hit in the pvs - } // for n through source rooms // find any moving that were active last tick that are no longer active, and send notifications diff --git a/servers/visual/portals/portal_pvs_builder.cpp b/servers/visual/portals/portal_pvs_builder.cpp index 72e5ee3ee48..fab21bd40a9 100644 --- a/servers/visual/portals/portal_pvs_builder.cpp +++ b/servers/visual/portals/portal_pvs_builder.cpp @@ -272,8 +272,8 @@ void PVSBuilder::calculate_pvs(PortalRenderer &p_portal_renderer, String p_filen log("pvs from room : " + itos(n)); - // trace_rooms_recursive_simple(0, n, n, -1, false, -1, dummy_planes, bf); - trace_rooms_recursive(0, n, n, -1, false, -1, dummy_planes, bf); + trace_rooms_recursive_simple(0, n, n, -1, false, -1, dummy_planes, bf); + // trace_rooms_recursive(0, n, n, -1, false, -1, dummy_planes, bf); create_secondary_pvs(n, neighbors, bf);