mirror of
https://github.com/godotengine/godot.git
synced 2024-11-22 12:12:28 +00:00
-Make sure to properly use node path from animation track as base path, fixes #3448
This commit is contained in:
parent
0364d6b076
commit
3732688231
@ -35,6 +35,7 @@
|
||||
#include "scene/gui/separator.h"
|
||||
#include "editor_node.h"
|
||||
#include "tools/editor/plugins/animation_player_editor_plugin.h"
|
||||
#include "scene/main/viewport.h"
|
||||
/* Missing to fix:
|
||||
|
||||
*Set
|
||||
@ -256,6 +257,25 @@ public:
|
||||
|
||||
//PopupDialog *ke_dialog;
|
||||
|
||||
void _fix_node_path(Variant &value) {
|
||||
|
||||
|
||||
NodePath np=value;
|
||||
|
||||
Node* root = EditorNode::get_singleton()->get_tree()->get_root();
|
||||
|
||||
Node* np_node = root->get_node(np);
|
||||
ERR_FAIL_COND(!np_node);
|
||||
|
||||
Node* edited_node = root->get_node(base);
|
||||
ERR_FAIL_COND(!edited_node);
|
||||
|
||||
|
||||
|
||||
value = edited_node->get_path_to(np_node);
|
||||
}
|
||||
|
||||
|
||||
void _update_obj(const Ref<Animation> &p_anim) {
|
||||
if (setting)
|
||||
return;
|
||||
@ -356,10 +376,18 @@ public:
|
||||
case Animation::TYPE_VALUE: {
|
||||
|
||||
if (name=="value") {
|
||||
|
||||
Variant value = p_value;
|
||||
|
||||
if (value.get_type()==Variant::NODE_PATH) {
|
||||
|
||||
_fix_node_path(value);
|
||||
}
|
||||
|
||||
setting=true;
|
||||
undo_redo->create_action("Anim Change Value",true);
|
||||
Variant prev = animation->track_get_key_value(track,key);
|
||||
undo_redo->add_do_method(animation.ptr(),"track_set_key_value",track,key,p_value);
|
||||
undo_redo->add_do_method(animation.ptr(),"track_set_key_value",track,key,value);
|
||||
undo_redo->add_undo_method(animation.ptr(),"track_set_key_value",track,key,prev);
|
||||
undo_redo->add_do_method(this,"_update_obj",animation);
|
||||
undo_redo->add_undo_method(this,"_update_obj",animation);
|
||||
@ -420,7 +448,14 @@ public:
|
||||
|
||||
}
|
||||
if (what=="value") {
|
||||
args[idx]=p_value;
|
||||
|
||||
Variant value=p_value;
|
||||
if (value.get_type()==Variant::NODE_PATH) {
|
||||
|
||||
_fix_node_path(value);
|
||||
}
|
||||
|
||||
args[idx]=value;
|
||||
d_new["args"]=args;
|
||||
mergeable=true;
|
||||
}
|
||||
@ -441,7 +476,7 @@ public:
|
||||
} break;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
|
||||
return false;
|
||||
|
||||
@ -616,6 +651,7 @@ public:
|
||||
float key_ofs;
|
||||
|
||||
PropertyInfo hint;
|
||||
NodePath base;
|
||||
|
||||
|
||||
void notify_change() {
|
||||
@ -1630,8 +1666,9 @@ void AnimationKeyEditor::_select_at_anim(const Ref<Animation>& p_anim,int p_trac
|
||||
}
|
||||
|
||||
|
||||
PropertyInfo AnimationKeyEditor::_find_hint_for_track(int p_idx) {
|
||||
PropertyInfo AnimationKeyEditor::_find_hint_for_track(int p_idx,NodePath& r_base_path) {
|
||||
|
||||
r_base_path=NodePath();
|
||||
ERR_FAIL_COND_V(!animation.is_valid(),PropertyInfo());
|
||||
ERR_FAIL_INDEX_V(p_idx,animation->get_track_count(),PropertyInfo());
|
||||
|
||||
@ -1640,9 +1677,6 @@ PropertyInfo AnimationKeyEditor::_find_hint_for_track(int p_idx) {
|
||||
|
||||
NodePath path = animation->track_get_path(p_idx);
|
||||
|
||||
String property = path.get_property();
|
||||
if (property=="")
|
||||
return PropertyInfo();
|
||||
|
||||
if (!root->has_node_and_resource(path))
|
||||
return PropertyInfo();
|
||||
@ -1650,6 +1684,15 @@ PropertyInfo AnimationKeyEditor::_find_hint_for_track(int p_idx) {
|
||||
RES res;
|
||||
Node *node = root->get_node_and_resource(path,res);
|
||||
|
||||
|
||||
if (node) {
|
||||
r_base_path=node->get_path();
|
||||
}
|
||||
|
||||
String property = path.get_property();
|
||||
if (property=="")
|
||||
return PropertyInfo();
|
||||
|
||||
List<PropertyInfo> pinfo;
|
||||
if (res.is_valid())
|
||||
res->get_property_list(&pinfo);
|
||||
@ -1729,7 +1772,7 @@ bool AnimationKeyEditor::_edit_if_single_selection() {
|
||||
key_edit->animation=animation;
|
||||
key_edit->track=idx;
|
||||
key_edit->key_ofs=animation->track_get_key_time(idx,key);
|
||||
key_edit->hint=_find_hint_for_track(idx);
|
||||
key_edit->hint=_find_hint_for_track(idx,key_edit->base);
|
||||
key_edit->notify_change();
|
||||
|
||||
curve_edit->set_transition(animation->track_get_key_transition(idx,key));
|
||||
@ -2187,7 +2230,8 @@ void AnimationKeyEditor::_track_editor_input_event(const InputEvent& p_input) {
|
||||
newval=d;
|
||||
} else if (tt==Animation::TYPE_VALUE) {
|
||||
|
||||
PropertyInfo inf = _find_hint_for_track(idx);
|
||||
NodePath np;
|
||||
PropertyInfo inf = _find_hint_for_track(idx,np);
|
||||
if (inf.type!=Variant::NIL) {
|
||||
|
||||
Variant::CallError err;
|
||||
@ -2975,6 +3019,7 @@ void AnimationKeyEditor::_clear_selection() {
|
||||
key_edit->track=0;
|
||||
key_edit->key_ofs=0;
|
||||
key_edit->hint=PropertyInfo();
|
||||
key_edit->base=NodePath();
|
||||
key_edit->notify_change();
|
||||
|
||||
}
|
||||
@ -3269,9 +3314,10 @@ int AnimationKeyEditor::_confirm_insert(InsertData p_id,int p_last_track) {
|
||||
|
||||
{
|
||||
//shitty hack
|
||||
NodePath np;
|
||||
animation->add_track(p_id.type);
|
||||
animation->track_set_path(animation->get_track_count()-1,p_id.path);
|
||||
PropertyInfo h = _find_hint_for_track(animation->get_track_count()-1);
|
||||
PropertyInfo h = _find_hint_for_track(animation->get_track_count()-1,np);
|
||||
animation->remove_track(animation->get_track_count()-1); //hack
|
||||
|
||||
|
||||
@ -3645,6 +3691,9 @@ void AnimationKeyEditor::_add_call_track(const NodePath& p_base) {
|
||||
|
||||
NodePath path = root->get_path_to(from);
|
||||
|
||||
//print_line("root: "+String(root->get_path()));
|
||||
//print_line("path: "+String(path));
|
||||
|
||||
undo_redo->create_action("Anim Add Call Track");
|
||||
undo_redo->add_do_method(animation.ptr(),"add_track",Animation::TYPE_METHOD);
|
||||
undo_redo->add_do_method(animation.ptr(),"track_set_path",animation->get_track_count(),path);
|
||||
|
@ -302,7 +302,7 @@ class AnimationKeyEditor : public VBoxContainer {
|
||||
void _select_at_anim(const Ref<Animation>& p_anim,int p_track,float p_pos);
|
||||
void _curve_transition_changed(float p_what);
|
||||
|
||||
PropertyInfo _find_hint_for_track(int p_idx);
|
||||
PropertyInfo _find_hint_for_track(int p_idx, NodePath &r_base_path);
|
||||
|
||||
void _create_value_item(int p_type);
|
||||
void _pane_drag(const Point2& p_delta);
|
||||
|
Loading…
Reference in New Issue
Block a user