From 788567987a468978d0539880a8ad14bdf07d960e Mon Sep 17 00:00:00 2001 From: lawnjelly Date: Sun, 25 Feb 2024 10:11:06 +0000 Subject: [PATCH] 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. --- scene/3d/portal.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/scene/3d/portal.cpp b/scene/3d/portal.cpp index 4369345ce3f..4f8e9950427 100644 --- a/scene/3d/portal.cpp +++ b/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 {