Browse Source

Merge pull request #88807 from lawnjelly/portals_fix_enter_tree_order

[3.x] Portals - defer setting active in `VisualServer` until enter tree
Rémi Verschelde 1 year ago
parent
commit
1869243644
1 changed files with 13 additions and 3 deletions
  1. 13 3
      scene/3d/portal.cpp

+ 13 - 3
scene/3d/portal.cpp

@@ -162,10 +162,13 @@ void Portal::_notification(int p_what) {
 		case NOTIFICATION_ENTER_WORLD: {
 			ERR_FAIL_COND(get_world().is_null());
 
-			// defer full creation of the visual server portal to when the editor portal is in the scene tree
+			// Defer full creation of the visual server portal to when the editor portal is in the scene tree.
 			VisualServer::get_singleton()->portal_set_scenario(_portal_rid, get_world()->get_scenario());
 
-			// we can't calculate world points until we have entered the tree
+			// Update any components in visual server that require the scenario to be set.
+			VisualServer::get_singleton()->portal_set_active(_portal_rid, _settings_active);
+
+			// We can't calculate world points until we have entered the tree.
 			portal_update();
 			update_gizmo();
 
@@ -192,7 +195,14 @@ void Portal::_notification(int p_what) {
 
 void Portal::set_portal_active(bool p_active) {
 	_settings_active = p_active;
-	VisualServer::get_singleton()->portal_set_active(_portal_rid, p_active);
+
+	// This can be called prior to entering the tree when loading packed scene,
+	// where the scenario has not yet been set (and thus the visual server portal
+	// is not yet fully created).
+	// We therefore defer setting this until entering the tree.
+	if (is_inside_tree()) {
+		VisualServer::get_singleton()->portal_set_active(_portal_rid, p_active);
+	}
 }
 
 bool Portal::get_portal_active() const {