Skip to content

Commit be8b9c7

Browse files
committed
Fix Clear Inheritance error
1 parent 540ea0b commit be8b9c7

File tree

5 files changed

+51
-28
lines changed

5 files changed

+51
-28
lines changed

editor/docks/scene_tree_dock.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1396,7 +1396,8 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
13961396
Node *node = e->get();
13971397
if (node) {
13981398
node->set_scene_inherited_state(Ref<SceneState>());
1399-
scene_tree->update_tree();
1399+
editor_data->reload_scene_from_memory(editor_data->get_edited_scene(), true);
1400+
scene_tree->clear_cache();
14001401
InspectorDock::get_inspector_singleton()->update_tree();
14011402
}
14021403
}

editor/editor_data.cpp

Lines changed: 43 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,7 @@ bool EditorData::_find_updated_instances(Node *p_root, Node *p_node, HashSet<Str
677677

678678
if (!checked_paths.has(path)) {
679679
uint64_t modified_time = FileAccess::get_modified_time(path);
680+
680681
if (modified_time != ss->get_last_modified_time()) {
681682
return true; //external scene changed
682683
}
@@ -706,40 +707,55 @@ bool EditorData::check_and_update_scene(int p_idx) {
706707
bool must_reload = _find_updated_instances(edited_scene[p_idx].root, edited_scene[p_idx].root, checked_scenes);
707708

708709
if (must_reload) {
709-
Ref<PackedScene> pscene;
710-
pscene.instantiate();
711-
712-
EditorProgress ep("update_scene", TTR("Updating Scene"), 2);
713-
ep.step(TTR("Storing local changes..."), 0);
714-
// Pack first, so it stores diffs to previous version of saved scene.
715-
Error err = pscene->pack(edited_scene[p_idx].root);
716-
ERR_FAIL_COND_V(err != OK, false);
717-
ep.step(TTR("Updating scene..."), 1);
718-
Node *new_scene = pscene->instantiate(PackedScene::GEN_EDIT_STATE_MAIN);
719-
ERR_FAIL_NULL_V(new_scene, false);
720-
721-
// Transfer selection.
722-
List<Node *> new_selection;
723-
for (const Node *E : edited_scene.write[p_idx].selection) {
724-
NodePath p = edited_scene[p_idx].root->get_path_to(E);
725-
Node *new_node = new_scene->get_node(p);
726-
if (new_node) {
727-
new_selection.push_back(new_node);
728-
}
729-
}
730-
731-
new_scene->set_scene_file_path(edited_scene[p_idx].root->get_scene_file_path());
732-
Node *old_root = edited_scene[p_idx].root;
733-
EditorNode::get_singleton()->set_edited_scene(new_scene);
734-
memdelete(old_root);
735-
edited_scene.write[p_idx].selection = new_selection;
710+
reload_scene_from_memory(p_idx, false);
736711

737712
return true;
738713
}
739714

740715
return false;
741716
}
742717

718+
bool EditorData::reload_scene_from_memory(int p_idx, bool need_mark_unsaved) {
719+
ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), false);
720+
if (!edited_scene[p_idx].root) {
721+
return false;
722+
}
723+
724+
Ref<PackedScene> pscene;
725+
pscene.instantiate();
726+
727+
EditorProgress ep("update_scene", TTR("Updating Scene"), 2);
728+
ep.step(TTR("Storing local changes..."), 0);
729+
// Pack first, so it stores diffs to previous version of saved scene.
730+
Error err = pscene->pack(edited_scene[p_idx].root);
731+
ERR_FAIL_COND_V(err != OK, false);
732+
ep.step(TTR("Updating scene..."), 1);
733+
Node *new_scene = pscene->instantiate(PackedScene::GEN_EDIT_STATE_MAIN);
734+
ERR_FAIL_NULL_V(new_scene, false);
735+
736+
// Transfer selection.
737+
List<Node *> new_selection;
738+
for (const Node *E : edited_scene.write[p_idx].selection) {
739+
NodePath p = edited_scene[p_idx].root->get_path_to(E);
740+
Node *new_node = new_scene->get_node(p);
741+
if (new_node) {
742+
new_selection.push_back(new_node);
743+
}
744+
}
745+
746+
new_scene->set_scene_file_path(edited_scene[p_idx].root->get_scene_file_path());
747+
Node *old_root = edited_scene[p_idx].root;
748+
EditorNode::get_singleton()->set_edited_scene(new_scene);
749+
memdelete(old_root);
750+
edited_scene.write[p_idx].selection = new_selection;
751+
752+
if (need_mark_unsaved) {
753+
EditorUndoRedoManager::get_singleton()->clear_history();
754+
EditorUndoRedoManager::get_singleton()->set_history_as_unsaved(get_current_edited_scene_history_id());
755+
}
756+
return true;
757+
}
758+
743759
int EditorData::get_edited_scene() const {
744760
return current_edited_scene;
745761
}

editor/editor_data.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ class EditorData {
219219
void set_edited_scene_live_edit_root(const NodePath &p_root);
220220
NodePath get_edited_scene_live_edit_root();
221221
bool check_and_update_scene(int p_idx);
222+
bool reload_scene_from_memory(int p_idx, bool need_mark_unsaved);
222223
void move_edited_scene_to_index(int p_idx);
223224

224225
bool call_build();

editor/scene/scene_tree_editor.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1728,6 +1728,10 @@ void SceneTreeEditor::set_display_foreign_nodes(bool p_display) {
17281728
_update_tree();
17291729
}
17301730

1731+
void SceneTreeEditor::clear_cache() {
1732+
set_valid_types({});
1733+
}
1734+
17311735
void SceneTreeEditor::set_valid_types(const Vector<StringName> &p_valid) {
17321736
valid_types = p_valid;
17331737
node_cache.force_update = true;

editor/scene/scene_tree_editor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ class SceneTreeEditor : public Control {
248248

249249
void set_show_enabled_subscene(bool p_show) { show_enabled_subscene = p_show; }
250250
void set_valid_types(const Vector<StringName> &p_valid);
251+
void clear_cache();
251252

252253
inline void update_tree() { _update_tree(); }
253254

0 commit comments

Comments
 (0)