mirror of
https://github.com/godotengine/godot.git
synced 2024-11-22 20:23:53 +00:00
Merge pull request #94945 from ArshPanesar/fix-anim-player-root-crash
Fix `AnimationPlayer` crash when it's made the scene root
This commit is contained in:
commit
7881dc2b11
@ -402,7 +402,17 @@ void AnimationPlayerEditor::_animation_selected(int p_which) {
|
||||
|
||||
track_editor->set_animation(anim, animation_is_readonly);
|
||||
Node *root = player->get_node_or_null(player->get_root_node());
|
||||
if (root) {
|
||||
|
||||
// Player shouldn't access parent if it's the scene root.
|
||||
if (!root || (player == get_tree()->get_edited_scene_root() && player->get_root_node() == SceneStringName(path_pp))) {
|
||||
NodePath cached_root_path = player->get_path_to(get_cached_root_node());
|
||||
if (player->get_node_or_null(cached_root_path) != nullptr) {
|
||||
player->set_root_node(cached_root_path);
|
||||
} else {
|
||||
player->set_root_node(SceneStringName(path_pp)); // No other choice, preventing crash.
|
||||
}
|
||||
} else {
|
||||
cached_root_node_id = root->get_instance_id(); // Caching as `track_editor` can lose track of player's root node.
|
||||
track_editor->set_root(root);
|
||||
}
|
||||
}
|
||||
@ -1886,6 +1896,10 @@ AnimationMixer *AnimationPlayerEditor::fetch_mixer_for_library() const {
|
||||
return original_node;
|
||||
}
|
||||
|
||||
Node *AnimationPlayerEditor::get_cached_root_node() const {
|
||||
return Object::cast_to<Node>(ObjectDB::get_instance(cached_root_node_id));
|
||||
}
|
||||
|
||||
bool AnimationPlayerEditor::_validate_tracks(const Ref<Animation> p_anim) {
|
||||
bool is_valid = true;
|
||||
if (!p_anim.is_valid()) {
|
||||
|
@ -52,6 +52,7 @@ class AnimationPlayerEditor : public VBoxContainer {
|
||||
AnimationPlayerEditorPlugin *plugin = nullptr;
|
||||
AnimationMixer *original_node = nullptr; // For pinned mark in SceneTree.
|
||||
AnimationPlayer *player = nullptr; // For AnimationPlayerEditor, could be dummy.
|
||||
ObjectID cached_root_node_id;
|
||||
bool is_dummy = false;
|
||||
|
||||
enum {
|
||||
@ -253,6 +254,7 @@ public:
|
||||
AnimationMixer *get_editing_node() const;
|
||||
AnimationPlayer *get_player() const;
|
||||
AnimationMixer *fetch_mixer_for_library() const;
|
||||
Node *get_cached_root_node() const;
|
||||
|
||||
static AnimationPlayerEditor *get_singleton() { return singleton; }
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user