mirror of
				https://github.com/godotengine/godot.git
				synced 2025-10-31 13:41:03 +00:00 
			
		
		
		
	Clear the previously set state when configuring for a new scene root node
Saving a subscene causes the main scene to be re-instantiated. And the resource
instance in the main scene will be reused when the main scene is re-instantiated.
So for resources with `resource_local_to_scene` enabled, resetting state may be
necessary (at least for `ViewportTexture`).
(cherry picked from commit 4795c3cdfa)
			
			
This commit is contained in:
		
							parent
							
								
									d5a11e17b8
								
							
						
					
					
						commit
						00d5da2f09
					
				
					 4 changed files with 20 additions and 6 deletions
				
			
		|  | @ -226,6 +226,7 @@ void Resource::configure_for_local_scene(Node *p_for_scene, HashMap<Ref<Resource | ||||||
| 	List<PropertyInfo> plist; | 	List<PropertyInfo> plist; | ||||||
| 	get_property_list(&plist); | 	get_property_list(&plist); | ||||||
| 
 | 
 | ||||||
|  | 	reset_local_to_scene(); | ||||||
| 	local_scene = p_for_scene; | 	local_scene = p_for_scene; | ||||||
| 
 | 
 | ||||||
| 	for (const PropertyInfo &E : plist) { | 	for (const PropertyInfo &E : plist) { | ||||||
|  | @ -386,6 +387,10 @@ void Resource::setup_local_to_scene() { | ||||||
| 	emit_signal(SNAME("setup_local_to_scene_requested")); | 	emit_signal(SNAME("setup_local_to_scene_requested")); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Resource::reset_local_to_scene() { | ||||||
|  | 	// Restores the state as if setup_local_to_scene() hadn't been called.
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| Node *(*Resource::_get_local_scene_func)() = nullptr; | Node *(*Resource::_get_local_scene_func)() = nullptr; | ||||||
| void (*Resource::_update_configuration_warning)() = nullptr; | void (*Resource::_update_configuration_warning)() = nullptr; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -86,6 +86,8 @@ protected: | ||||||
| 	void _set_path(const String &p_path); | 	void _set_path(const String &p_path); | ||||||
| 	void _take_over_path(const String &p_path); | 	void _take_over_path(const String &p_path); | ||||||
| 
 | 
 | ||||||
|  | 	virtual void reset_local_to_scene(); | ||||||
|  | 
 | ||||||
| public: | public: | ||||||
| 	static Node *(*_get_local_scene_func)(); //used by editor
 | 	static Node *(*_get_local_scene_func)(); //used by editor
 | ||||||
| 	static void (*_update_configuration_warning)(); //used by editor
 | 	static void (*_update_configuration_warning)(); //used by editor
 | ||||||
|  |  | ||||||
|  | @ -88,12 +88,7 @@ void ViewportTexture::setup_local_to_scene() { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ViewportTexture::set_viewport_path_in_scene(const NodePath &p_path) { | void ViewportTexture::reset_local_to_scene() { | ||||||
| 	if (path == p_path) { |  | ||||||
| 		return; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	path = p_path; |  | ||||||
| 	vp_changed = true; | 	vp_changed = true; | ||||||
| 
 | 
 | ||||||
| 	if (vp) { | 	if (vp) { | ||||||
|  | @ -105,6 +100,16 @@ void ViewportTexture::set_viewport_path_in_scene(const NodePath &p_path) { | ||||||
| 		proxy_ph = RS::get_singleton()->texture_2d_placeholder_create(); | 		proxy_ph = RS::get_singleton()->texture_2d_placeholder_create(); | ||||||
| 		RS::get_singleton()->texture_proxy_update(proxy, proxy_ph); | 		RS::get_singleton()->texture_proxy_update(proxy, proxy_ph); | ||||||
| 	} | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ViewportTexture::set_viewport_path_in_scene(const NodePath &p_path) { | ||||||
|  | 	if (path == p_path) { | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	path = p_path; | ||||||
|  | 
 | ||||||
|  | 	reset_local_to_scene(); | ||||||
| 
 | 
 | ||||||
| 	if (get_local_scene() && !path.is_empty()) { | 	if (get_local_scene() && !path.is_empty()) { | ||||||
| 		setup_local_to_scene(); | 		setup_local_to_scene(); | ||||||
|  |  | ||||||
|  | @ -70,6 +70,8 @@ class ViewportTexture : public Texture2D { | ||||||
| protected: | protected: | ||||||
| 	static void _bind_methods(); | 	static void _bind_methods(); | ||||||
| 
 | 
 | ||||||
|  | 	virtual void reset_local_to_scene() override; | ||||||
|  | 
 | ||||||
| public: | public: | ||||||
| 	void set_viewport_path_in_scene(const NodePath &p_path); | 	void set_viewport_path_in_scene(const NodePath &p_path); | ||||||
| 	NodePath get_viewport_path_in_scene() const; | 	NodePath get_viewport_path_in_scene() const; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Rindbee
						Rindbee