From 79ce0c6e8052c065d88dbce5a2b7ff0d63fac3a7 Mon Sep 17 00:00:00 2001 From: Micky Date: Sat, 8 Oct 2022 14:47:58 +0200 Subject: [PATCH] Reimplement Resource.`_local_to_scene_setup` & remove workaround Reimplements the virtual method _setup_local_to_scene, lost in #51970 Also deprecates the redundant `setup_local_to_scene_requested` signal. --- core/io/resource.cpp | 3 ++- core/io/resource.h | 2 ++ doc/classes/Resource.xml | 24 ++++++++++++++++++++---- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/core/io/resource.cpp b/core/io/resource.cpp index 68cdeabac72..e0d42a274ac 100644 --- a/core/io/resource.cpp +++ b/core/io/resource.cpp @@ -379,8 +379,8 @@ Node *Resource::get_local_scene() const { } void Resource::setup_local_to_scene() { - // Can't use GDVIRTUAL in Resource, so this will have to be done with a signal emit_signal(SNAME("setup_local_to_scene_requested")); + GDVIRTUAL_CALL(_setup_local_to_scene); } void Resource::reset_local_to_scene() { @@ -460,6 +460,7 @@ void Resource::_bind_methods() { get_rid_bind.return_val.type = Variant::RID; ::ClassDB::add_virtual_method(get_class_static(), get_rid_bind, true, Vector(), true); + GDVIRTUAL_BIND(_setup_local_to_scene); } Resource::Resource() : diff --git a/core/io/resource.h b/core/io/resource.h index f848bdba991..a9b1a88f6bc 100644 --- a/core/io/resource.h +++ b/core/io/resource.h @@ -33,6 +33,7 @@ #include "core/io/resource_uid.h" #include "core/object/class_db.h" +#include "core/object/gdvirtual.gen.inc" #include "core/object/ref_counted.h" #include "core/templates/safe_refcount.h" #include "core/templates/self_list.h" @@ -81,6 +82,7 @@ protected: void _take_over_path(const String &p_path); virtual void reset_local_to_scene(); + GDVIRTUAL0(_setup_local_to_scene); public: static Node *(*_get_local_scene_func)(); //used by editor diff --git a/doc/classes/Resource.xml b/doc/classes/Resource.xml index be04ebd8935..75c258253d9 100644 --- a/doc/classes/Resource.xml +++ b/doc/classes/Resource.xml @@ -19,6 +19,21 @@ Override this method to return a custom [RID] when [method get_rid] is called. + + + + Override this method to customize the newly duplicated resource created from [method PackedScene.instantiate], if the original's [member resource_local_to_scene] is set to [code]true[/code]. + [b]Example:[/b] Set a random [code]damage[/code] value to every local resource from an instantiated scene. + [codeblock] + extends Resource + + var damage = 0 + + func _setup_local_to_scene(): + damage = randi_range(10, 40) + [/codeblock] + + @@ -58,8 +73,8 @@ - Emits the [signal setup_local_to_scene_requested] signal. If [member resource_local_to_scene] is set to [code]true[/code], this method is called from [method PackedScene.instantiate] by the newly duplicated resource within the scene instance. - For most resources, this method performs no logic of its own. Custom behavior can be defined by connecting [signal setup_local_to_scene_requested] from a script, [b]not[/b] by overriding this method. + Calls [method _setup_local_to_scene]. If [member resource_local_to_scene] is set to [code]true[/code], this method is automatically called from [method PackedScene.instantiate] by the newly duplicated resource within the scene instance. + [i]Deprecated.[/i] This method should only be called internally. Override [method _setup_local_to_scene] instead. @@ -90,9 +105,10 @@ [b]Note:[/b] This signal is not emitted automatically for properties of custom resources. If necessary, a setter needs to be created to emit the signal. - + - Emitted by the newly duplicated resource with [member resource_local_to_scene] set to [code]true[/code], when the scene is instantiated. Custom behavior can be defined by connecting this signal. + Emitted by a newly duplicated resource with [member resource_local_to_scene] set to [code]true[/code]. + [i]Deprecated.[/i] This signal is only emitted when the resource is created. Override [method _setup_local_to_scene] instead.