From ad6e504a5bc944892e93baacb5d9ee7de7f92e80 Mon Sep 17 00:00:00 2001 From: BimDav <67792882+BimDav@users.noreply.github.com> Date: Tue, 19 Jul 2022 10:56:47 +0200 Subject: [PATCH] Add option in VisibilityEnabler2D to hide the parent for better performance --- doc/classes/VisibilityEnabler2D.xml | 7 ++++++- scene/2d/visibility_notifier_2d.cpp | 24 ++++++++++++++++++++++++ scene/2d/visibility_notifier_2d.h | 1 + 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/doc/classes/VisibilityEnabler2D.xml b/doc/classes/VisibilityEnabler2D.xml index e2d811cfa..5e1993b6b 100644 --- a/doc/classes/VisibilityEnabler2D.xml +++ b/doc/classes/VisibilityEnabler2D.xml @@ -47,6 +47,9 @@ If [code]true[/code], the parent's [method Node._process] will be stopped. + + If [code]true[/code] and the parent is a [CanvasItem], the parent will be hidden. + @@ -67,7 +70,9 @@ This enabler will stop [AnimatedSprite] nodes animations. - + + + Represents the size of the [enum Enabler] enum. diff --git a/scene/2d/visibility_notifier_2d.cpp b/scene/2d/visibility_notifier_2d.cpp index c45d3bcde..cf467d055 100644 --- a/scene/2d/visibility_notifier_2d.cpp +++ b/scene/2d/visibility_notifier_2d.cpp @@ -169,6 +169,13 @@ void VisibilityEnabler2D::_screen_enter() { if (enabler[ENABLER_PARENT_PROCESS] && get_parent()) { get_parent()->set_process(true); } + if (enabler[ENABLER_PARENT_VISIBILITY] && get_parent()) { + CanvasItem *ci = Object::cast_to(get_parent()); + + if (ci) { + ci->set_visible(true); + } + } visible = true; } @@ -184,6 +191,13 @@ void VisibilityEnabler2D::_screen_exit() { if (enabler[ENABLER_PARENT_PROCESS] && get_parent()) { get_parent()->set_process(false); } + if (enabler[ENABLER_PARENT_VISIBILITY] && get_parent()) { + CanvasItem *ci = Object::cast_to(get_parent()); + + if (ci) { + ci->set_visible(false); + } + } visible = false; } @@ -259,6 +273,14 @@ void VisibilityEnabler2D::_notification(int p_what) { get_parent()->connect(SceneStringNames::get_singleton()->ready, get_parent(), "set_process", varray(false), CONNECT_REFERENCE_COUNTED); } + if (enabler[ENABLER_PARENT_VISIBILITY] && get_parent()) { + CanvasItem *ci = Object::cast_to(get_parent()); + + if (ci) { + ci->connect(SceneStringNames::get_singleton()->ready, + ci, "set_visible", varray(false), CONNECT_REFERENCE_COUNTED); + } + } } if (p_what == NOTIFICATION_EXIT_TREE) { @@ -341,6 +363,7 @@ void VisibilityEnabler2D::_bind_methods() { ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "pause_animated_sprites"), "set_enabler", "is_enabler_enabled", ENABLER_PAUSE_ANIMATED_SPRITES); ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "process_parent"), "set_enabler", "is_enabler_enabled", ENABLER_PARENT_PROCESS); ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "physics_process_parent"), "set_enabler", "is_enabler_enabled", ENABLER_PARENT_PHYSICS_PROCESS); + ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "visibility_parent"), "set_enabler", "is_enabler_enabled", ENABLER_PARENT_VISIBILITY); BIND_ENUM_CONSTANT(ENABLER_PAUSE_ANIMATIONS); BIND_ENUM_CONSTANT(ENABLER_FREEZE_BODIES); @@ -348,6 +371,7 @@ void VisibilityEnabler2D::_bind_methods() { BIND_ENUM_CONSTANT(ENABLER_PARENT_PROCESS); BIND_ENUM_CONSTANT(ENABLER_PARENT_PHYSICS_PROCESS); BIND_ENUM_CONSTANT(ENABLER_PAUSE_ANIMATED_SPRITES); + BIND_ENUM_CONSTANT(ENABLER_PARENT_VISIBILITY); BIND_ENUM_CONSTANT(ENABLER_MAX); } diff --git a/scene/2d/visibility_notifier_2d.h b/scene/2d/visibility_notifier_2d.h index 7f9fb7588..40a98123c 100644 --- a/scene/2d/visibility_notifier_2d.h +++ b/scene/2d/visibility_notifier_2d.h @@ -77,6 +77,7 @@ public: ENABLER_PARENT_PROCESS, ENABLER_PARENT_PHYSICS_PROCESS, ENABLER_PAUSE_ANIMATED_SPRITES, + ENABLER_PARENT_VISIBILITY, ENABLER_MAX };