Skip to content

Commit

Permalink
Clear the previously set state when configuring for a new scene root …
Browse files Browse the repository at this point in the history
…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`).
  • Loading branch information
Rindbee committed Aug 8, 2023
1 parent f7bc653 commit 4795c3c
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 6 deletions.
5 changes: 5 additions & 0 deletions core/io/resource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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;

Expand Down
2 changes: 2 additions & 0 deletions core/io/resource.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ class Resource : public RefCounted {
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
Expand Down
17 changes: 11 additions & 6 deletions scene/main/viewport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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();
Expand Down
2 changes: 2 additions & 0 deletions scene/main/viewport.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 4795c3c

Please sign in to comment.