浏览代码

Portals - defer setting active in `VisualServer` until enter tree

`set_portal_active()` was being called loading packed scenes prior to entering the tree, visual server portals had not been fully created at this point hence the call was being ignored with an error flagged.
This PR defers the call until after entering the tree.
lawnjelly 1 年之前
父节点
当前提交
788567987a
共有 1 个文件被更改,包括 13 次插入3 次删除
  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 {