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 {