Browse Source

Merge pull request #79201 from Rindbee/fix-setup-state-not-cleared

Clear the previously set state when configuring for a new scene root node
Rémi Verschelde 2 years ago
parent
commit
e73a4a382e
4 changed files with 20 additions and 6 deletions
  1. 5 0
      core/io/resource.cpp
  2. 2 0
      core/io/resource.h
  3. 11 6
      scene/main/viewport.cpp
  4. 2 0
      scene/main/viewport.h

+ 5 - 0
core/io/resource.cpp

@@ -239,6 +239,7 @@ void Resource::configure_for_local_scene(Node *p_for_scene, HashMap<Ref<Resource
 	List<PropertyInfo> plist;
 	get_property_list(&plist);
 
+	reset_local_to_scene();
 	local_scene = p_for_scene;
 
 	for (const PropertyInfo &E : plist) {
@@ -382,6 +383,10 @@ void Resource::setup_local_to_scene() {
 	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;
 void (*Resource::_update_configuration_warning)() = nullptr;
 

+ 2 - 0
core/io/resource.h

@@ -80,6 +80,8 @@ protected:
 	void _set_path(const String &p_path);
 	void _take_over_path(const String &p_path);
 
+	virtual void reset_local_to_scene();
+
 public:
 	static Node *(*_get_local_scene_func)(); //used by editor
 	static void (*_update_configuration_warning)(); //used by editor

+ 11 - 6
scene/main/viewport.cpp

@@ -87,12 +87,7 @@ void ViewportTexture::setup_local_to_scene() {
 	}
 }
 
-void ViewportTexture::set_viewport_path_in_scene(const NodePath &p_path) {
-	if (path == p_path) {
-		return;
-	}
-
-	path = p_path;
+void ViewportTexture::reset_local_to_scene() {
 	vp_changed = true;
 
 	if (vp) {
@@ -104,6 +99,16 @@ void ViewportTexture::set_viewport_path_in_scene(const NodePath &p_path) {
 		proxy_ph = RS::get_singleton()->texture_2d_placeholder_create();
 		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()) {
 		setup_local_to_scene();

+ 2 - 0
scene/main/viewport.h

@@ -70,6 +70,8 @@ class ViewportTexture : public Texture2D {
 protected:
 	static void _bind_methods();
 
+	virtual void reset_local_to_scene() override;
+
 public:
 	void set_viewport_path_in_scene(const NodePath &p_path);
 	NodePath get_viewport_path_in_scene() const;