فهرست منبع

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.
lawnjelly 4 سال پیش
والد
کامیت
cfe806a929
3فایلهای تغییر یافته به همراه17 افزوده شده و 19 حذف شده
  1. 0 5
      scene/3d/room_manager.cpp
  2. 15 12
      servers/visual/portals/portal_gameplay_monitor.cpp
  3. 2 2
      servers/visual/portals/portal_pvs_builder.cpp

+ 0 - 5
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<Vector3> camera_positions;
-				camera_positions.push_back(camera_pos);
-				VisualServer::get_singleton()->rooms_update_gameplay_monitor(scenario, camera_positions);
 			}
 			// check planes
 			if (!changed) {

+ 15 - 12
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

+ 2 - 2
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);