-Make sure to properly use node path from animation track as base path, fixes #3448

This commit is contained in:
Juan Linietsky 2016-01-31 20:06:37 -03:00
parent 0364d6b076
commit 3732688231
2 changed files with 60 additions and 11 deletions

View file

@ -35,6 +35,7 @@
#include "scene/gui/separator.h" #include "scene/gui/separator.h"
#include "editor_node.h" #include "editor_node.h"
#include "tools/editor/plugins/animation_player_editor_plugin.h" #include "tools/editor/plugins/animation_player_editor_plugin.h"
#include "scene/main/viewport.h"
/* Missing to fix: /* Missing to fix:
*Set *Set
@ -256,6 +257,25 @@ public:
//PopupDialog *ke_dialog; //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) { void _update_obj(const Ref<Animation> &p_anim) {
if (setting) if (setting)
return; return;
@ -356,10 +376,18 @@ public:
case Animation::TYPE_VALUE: { case Animation::TYPE_VALUE: {
if (name=="value") { if (name=="value") {
Variant value = p_value;
if (value.get_type()==Variant::NODE_PATH) {
_fix_node_path(value);
}
setting=true; setting=true;
undo_redo->create_action("Anim Change Value",true); undo_redo->create_action("Anim Change Value",true);
Variant prev = animation->track_get_key_value(track,key); 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_undo_method(animation.ptr(),"track_set_key_value",track,key,prev);
undo_redo->add_do_method(this,"_update_obj",animation); undo_redo->add_do_method(this,"_update_obj",animation);
undo_redo->add_undo_method(this,"_update_obj",animation); undo_redo->add_undo_method(this,"_update_obj",animation);
@ -420,7 +448,14 @@ public:
} }
if (what=="value") { 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; d_new["args"]=args;
mergeable=true; mergeable=true;
} }
@ -441,7 +476,7 @@ public:
} break; } break;
} }
return false;
return false; return false;
@ -616,6 +651,7 @@ public:
float key_ofs; float key_ofs;
PropertyInfo hint; PropertyInfo hint;
NodePath base;
void notify_change() { 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_COND_V(!animation.is_valid(),PropertyInfo());
ERR_FAIL_INDEX_V(p_idx,animation->get_track_count(),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); NodePath path = animation->track_get_path(p_idx);
String property = path.get_property();
if (property=="")
return PropertyInfo();
if (!root->has_node_and_resource(path)) if (!root->has_node_and_resource(path))
return PropertyInfo(); return PropertyInfo();
@ -1650,6 +1684,15 @@ PropertyInfo AnimationKeyEditor::_find_hint_for_track(int p_idx) {
RES res; RES res;
Node *node = root->get_node_and_resource(path,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; List<PropertyInfo> pinfo;
if (res.is_valid()) if (res.is_valid())
res->get_property_list(&pinfo); res->get_property_list(&pinfo);
@ -1729,7 +1772,7 @@ bool AnimationKeyEditor::_edit_if_single_selection() {
key_edit->animation=animation; key_edit->animation=animation;
key_edit->track=idx; key_edit->track=idx;
key_edit->key_ofs=animation->track_get_key_time(idx,key); 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(); key_edit->notify_change();
curve_edit->set_transition(animation->track_get_key_transition(idx,key)); 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; newval=d;
} else if (tt==Animation::TYPE_VALUE) { } 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) { if (inf.type!=Variant::NIL) {
Variant::CallError err; Variant::CallError err;
@ -2975,6 +3019,7 @@ void AnimationKeyEditor::_clear_selection() {
key_edit->track=0; key_edit->track=0;
key_edit->key_ofs=0; key_edit->key_ofs=0;
key_edit->hint=PropertyInfo(); key_edit->hint=PropertyInfo();
key_edit->base=NodePath();
key_edit->notify_change(); key_edit->notify_change();
} }
@ -3269,9 +3314,10 @@ int AnimationKeyEditor::_confirm_insert(InsertData p_id,int p_last_track) {
{ {
//shitty hack //shitty hack
NodePath np;
animation->add_track(p_id.type); animation->add_track(p_id.type);
animation->track_set_path(animation->get_track_count()-1,p_id.path); 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 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); 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->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(),"add_track",Animation::TYPE_METHOD);
undo_redo->add_do_method(animation.ptr(),"track_set_path",animation->get_track_count(),path); undo_redo->add_do_method(animation.ptr(),"track_set_path",animation->get_track_count(),path);

View file

@ -302,7 +302,7 @@ class AnimationKeyEditor : public VBoxContainer {
void _select_at_anim(const Ref<Animation>& p_anim,int p_track,float p_pos); void _select_at_anim(const Ref<Animation>& p_anim,int p_track,float p_pos);
void _curve_transition_changed(float p_what); 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 _create_value_item(int p_type);
void _pane_drag(const Point2& p_delta); void _pane_drag(const Point2& p_delta);