Browse Source

Merge pull request #63193 from BimDav/visibility_enabler2

Add option in VisibilityEnabler2D to hide the parent for better performance
Rémi Verschelde 2 years ago
parent
commit
31224276ee

+ 6 - 1
doc/classes/VisibilityEnabler2D.xml

@@ -47,6 +47,9 @@
 		<member name="process_parent" type="bool" setter="set_enabler" getter="is_enabler_enabled" default="false">
 		<member name="process_parent" type="bool" setter="set_enabler" getter="is_enabler_enabled" default="false">
 			If [code]true[/code], the parent's [method Node._process] will be stopped.
 			If [code]true[/code], the parent's [method Node._process] will be stopped.
 		</member>
 		</member>
+		<member name="visibility_parent" type="bool" setter="set_enabler" getter="is_enabler_enabled" default="true">
+			If [code]true[/code] and the parent is a [CanvasItem], the parent will be hidden.
+		</member>
 	</members>
 	</members>
 	<constants>
 	<constants>
 		<constant name="ENABLER_PAUSE_ANIMATIONS" value="0" enum="Enabler">
 		<constant name="ENABLER_PAUSE_ANIMATIONS" value="0" enum="Enabler">
@@ -67,7 +70,9 @@
 		<constant name="ENABLER_PAUSE_ANIMATED_SPRITES" value="5" enum="Enabler">
 		<constant name="ENABLER_PAUSE_ANIMATED_SPRITES" value="5" enum="Enabler">
 			This enabler will stop [AnimatedSprite] nodes animations.
 			This enabler will stop [AnimatedSprite] nodes animations.
 		</constant>
 		</constant>
-		<constant name="ENABLER_MAX" value="6" enum="Enabler">
+		<constant name="ENABLER_PARENT_VISIBILITY" value="6" enum="Enabler">
+		</constant>
+		<constant name="ENABLER_MAX" value="7" enum="Enabler">
 			Represents the size of the [enum Enabler] enum.
 			Represents the size of the [enum Enabler] enum.
 		</constant>
 		</constant>
 	</constants>
 	</constants>

+ 24 - 0
scene/2d/visibility_notifier_2d.cpp

@@ -168,6 +168,13 @@ void VisibilityEnabler2D::_screen_enter() {
 	if (enabler[ENABLER_PARENT_PROCESS] && get_parent()) {
 	if (enabler[ENABLER_PARENT_PROCESS] && get_parent()) {
 		get_parent()->set_process(true);
 		get_parent()->set_process(true);
 	}
 	}
+	if (enabler[ENABLER_PARENT_VISIBILITY] && get_parent()) {
+		CanvasItem *ci = Object::cast_to<CanvasItem>(get_parent());
+
+		if (ci) {
+			ci->set_visible(true);
+		}
+	}
 
 
 	visible = true;
 	visible = true;
 }
 }
@@ -183,6 +190,13 @@ void VisibilityEnabler2D::_screen_exit() {
 	if (enabler[ENABLER_PARENT_PROCESS] && get_parent()) {
 	if (enabler[ENABLER_PARENT_PROCESS] && get_parent()) {
 		get_parent()->set_process(false);
 		get_parent()->set_process(false);
 	}
 	}
+	if (enabler[ENABLER_PARENT_VISIBILITY] && get_parent()) {
+		CanvasItem *ci = Object::cast_to<CanvasItem>(get_parent());
+
+		if (ci) {
+			ci->set_visible(false);
+		}
+	}
 
 
 	visible = false;
 	visible = false;
 }
 }
@@ -265,6 +279,14 @@ void VisibilityEnabler2D::_notification(int p_what) {
 			get_parent()->connect(SceneStringNames::get_singleton()->ready,
 			get_parent()->connect(SceneStringNames::get_singleton()->ready,
 					get_parent(), "set_process", varray(false), CONNECT_REFERENCE_COUNTED);
 					get_parent(), "set_process", varray(false), CONNECT_REFERENCE_COUNTED);
 		}
 		}
+		if (enabler[ENABLER_PARENT_VISIBILITY] && get_parent()) {
+			CanvasItem *ci = Object::cast_to<CanvasItem>(get_parent());
+
+			if (ci) {
+				ci->connect(SceneStringNames::get_singleton()->ready,
+						ci, "set_visible", varray(false), CONNECT_REFERENCE_COUNTED);
+			}
+		}
 	}
 	}
 
 
 	if (p_what == NOTIFICATION_EXIT_TREE) {
 	if (p_what == NOTIFICATION_EXIT_TREE) {
@@ -355,6 +377,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, "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, "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, "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_PAUSE_ANIMATIONS);
 	BIND_ENUM_CONSTANT(ENABLER_FREEZE_BODIES);
 	BIND_ENUM_CONSTANT(ENABLER_FREEZE_BODIES);
@@ -362,6 +385,7 @@ void VisibilityEnabler2D::_bind_methods() {
 	BIND_ENUM_CONSTANT(ENABLER_PARENT_PROCESS);
 	BIND_ENUM_CONSTANT(ENABLER_PARENT_PROCESS);
 	BIND_ENUM_CONSTANT(ENABLER_PARENT_PHYSICS_PROCESS);
 	BIND_ENUM_CONSTANT(ENABLER_PARENT_PHYSICS_PROCESS);
 	BIND_ENUM_CONSTANT(ENABLER_PAUSE_ANIMATED_SPRITES);
 	BIND_ENUM_CONSTANT(ENABLER_PAUSE_ANIMATED_SPRITES);
+	BIND_ENUM_CONSTANT(ENABLER_PARENT_VISIBILITY);
 	BIND_ENUM_CONSTANT(ENABLER_MAX);
 	BIND_ENUM_CONSTANT(ENABLER_MAX);
 }
 }
 
 

+ 1 - 0
scene/2d/visibility_notifier_2d.h

@@ -78,6 +78,7 @@ public:
 		ENABLER_PARENT_PROCESS,
 		ENABLER_PARENT_PROCESS,
 		ENABLER_PARENT_PHYSICS_PROCESS,
 		ENABLER_PARENT_PHYSICS_PROCESS,
 		ENABLER_PAUSE_ANIMATED_SPRITES,
 		ENABLER_PAUSE_ANIMATED_SPRITES,
+		ENABLER_PARENT_VISIBILITY,
 		ENABLER_MAX
 		ENABLER_MAX
 	};
 	};