improved animation editor

-same-value link keys
-new layout
-forward, backwards playback
-integrated curve/property editor
-auto increment sprite frame after insert
-copy & paste animation resoucres
This commit is contained in:
Juan Linietsky 2015-05-25 01:46:45 -03:00
parent f8f3362cab
commit f36e7dcb40
30 changed files with 840 additions and 106 deletions

View file

@ -28,7 +28,8 @@
/*************************************************************************/
#include "animation_player_editor_plugin.h"
#include "io/resource_loader.h"
#include "os/keyboard.h"
#include "tools/editor/editor_settings.h"
void AnimationPlayerEditor::_node_removed(Node *p_node) {
@ -100,12 +101,18 @@ void AnimationPlayerEditor::_notification(int p_what) {
remove_anim->set_icon( get_icon("Del","EditorIcons") );
edit_anim->set_icon( get_icon("Edit","EditorIcons") );
blend_anim->set_icon( get_icon("Blend","EditorIcons") );
play->set_icon( get_icon("Play","EditorIcons") );
play->set_icon( get_icon("PlayStart","EditorIcons") );
play_from->set_icon( get_icon("Play","EditorIcons") );
play_bw->set_icon( get_icon("PlayStartBackwards","EditorIcons") );
play_bw_from->set_icon( get_icon("PlayBackwards","EditorIcons") );
autoplay_icon=get_icon("AutoPlay","EditorIcons");
stop->set_icon( get_icon("Stop","EditorIcons") );
resource_edit_anim->set_icon( get_icon("EditResource","EditorIcons") );
pin->set_normal_texture(get_icon("Pin","EditorIcons") );
pin->set_pressed_texture( get_icon("PinPressed","EditorIcons") );
tool_anim->set_icon(get_icon("Tools","EditorIcons"));
tool_anim->get_popup()->connect("item_pressed",this,"_animation_tool_menu");
blend_editor.next->connect("text_changed",this,"_blend_editor_next_changed");
@ -180,9 +187,82 @@ void AnimationPlayerEditor::_play_pressed() {
//unpause
//pause->set_pressed(false);
}
void AnimationPlayerEditor::_play_from_pressed() {
String current;
if (animation->get_selected()>=0 && animation->get_selected()<animation->get_item_count()) {
current = animation->get_item_text( animation->get_selected() );
}
if (current!="") {
float time = player->get_current_animation_pos();
if (current==player->get_current_animation() && player->is_playing()) {
player->stop(); //so it wont blend with itself
}
player->play( current );
player->seek(time);
}
//unstop
stop->set_pressed(false);
//unpause
//pause->set_pressed(false);
}
void AnimationPlayerEditor::_play_bw_pressed() {
String current;
if (animation->get_selected()>=0 && animation->get_selected()<animation->get_item_count()) {
current = animation->get_item_text( animation->get_selected() );
}
if (current!="") {
if (current==player->get_current_animation())
player->stop(); //so it wont blend with itself
player->play(current,-1,-1,true);
}
//unstop
stop->set_pressed(false);
//unpause
//pause->set_pressed(false);
}
void AnimationPlayerEditor::_play_bw_from_pressed() {
String current;
if (animation->get_selected()>=0 && animation->get_selected()<animation->get_item_count()) {
current = animation->get_item_text( animation->get_selected() );
}
if (current!="") {
float time = player->get_current_animation_pos();
if (current==player->get_current_animation())
player->stop(); //so it wont blend with itself
player->play(current,-1,-1,true);
player->seek(time);
}
//unstop
stop->set_pressed(false);
//unpause
//pause->set_pressed(false);
}
void AnimationPlayerEditor::_stop_pressed() {
player->stop();
player->stop(false);
play->set_pressed(false);
stop->set_pressed(true);
//pause->set_pressed(false);
@ -598,6 +678,9 @@ void AnimationPlayerEditor::_update_player() {
stop->set_disabled(animlist.size()==0);
play->set_disabled(animlist.size()==0);
play_bw->set_disabled(animlist.size()==0);
play_bw_from->set_disabled(animlist.size()==0);
play_from->set_disabled(animlist.size()==0);
autoplay->set_disabled(animlist.size()==0);
duplicate_anim->set_disabled(animlist.size()==0);
rename_anim->set_disabled(animlist.size()==0);
@ -877,11 +960,108 @@ void AnimationPlayerEditor::_hide_anim_editors() {
}
}
void AnimationPlayerEditor::_animation_tool_menu(int p_option) {
switch(p_option) {
case TOOL_COPY_ANIM: {
if (!animation->get_item_count()) {
error_dialog->set_text("ERROR: No animation to copy!");
error_dialog->popup_centered_minsize();
return;
}
String current = animation->get_item_text(animation->get_selected());
Ref<Animation> anim = player->get_animation(current);
//editor->edit_resource(anim);
EditorSettings::get_singleton()->set_resource_clipboard(anim);
} break;
case TOOL_PASTE_ANIM: {
Ref<Animation> anim = EditorSettings::get_singleton()->get_resource_clipboard();
if (!anim.is_valid()) {
error_dialog->set_text("ERROR: No animation resource on clipboard!");
error_dialog->popup_centered_minsize();
return;
}
String name = anim->get_name();
if (name=="") {
name="Pasted Animation";
}
int idx=1;
String base = name;
while (player->has_animation(name)) {
idx++;
name=base+" "+itos(idx);
}
undo_redo->create_action("Paste Animation");
undo_redo->add_do_method(player,"add_animation",name,anim);
undo_redo->add_undo_method(player,"remove_animation",name);
undo_redo->add_do_method(this,"_animation_player_changed",player);
undo_redo->add_undo_method(this,"_animation_player_changed",player);
undo_redo->commit_action();
_select_anim_by_name(name);
} break;
case TOOL_EDIT_RESOURCE: {
if (!animation->get_item_count()) {
error_dialog->set_text("ERROR: No animation to edit!");
error_dialog->popup_centered_minsize();
return;
}
String current = animation->get_item_text(animation->get_selected());
Ref<Animation> anim = player->get_animation(current);
editor->edit_resource(anim);
} break;
}
}
void AnimationPlayerEditor::_unhandled_key_input(const InputEvent& p_ev) {
if (is_visible() && p_ev.type==InputEvent::KEY && p_ev.key.pressed && !p_ev.key.echo && !p_ev.key.mod.alt && !p_ev.key.mod.control && !p_ev.key.mod.meta) {
switch(p_ev.key.scancode) {
case KEY_A: {
if (!p_ev.key.mod.shift)
_play_bw_from_pressed();
else
_play_bw_pressed();
} break;
case KEY_S: {
_stop_pressed();
} break;
case KEY_D: {
if (!p_ev.key.mod.shift)
_play_from_pressed();
else
_play_pressed();
} break;
}
}
}
void AnimationPlayerEditor::_bind_methods() {
ObjectTypeDB::bind_method(_MD("_input_event"),&AnimationPlayerEditor::_input_event);
ObjectTypeDB::bind_method(_MD("_node_removed"),&AnimationPlayerEditor::_node_removed);
ObjectTypeDB::bind_method(_MD("_play_pressed"),&AnimationPlayerEditor::_play_pressed);
ObjectTypeDB::bind_method(_MD("_play_from_pressed"),&AnimationPlayerEditor::_play_from_pressed);
ObjectTypeDB::bind_method(_MD("_play_bw_pressed"),&AnimationPlayerEditor::_play_bw_pressed);
ObjectTypeDB::bind_method(_MD("_play_bw_from_pressed"),&AnimationPlayerEditor::_play_bw_from_pressed);
ObjectTypeDB::bind_method(_MD("_stop_pressed"),&AnimationPlayerEditor::_stop_pressed);
ObjectTypeDB::bind_method(_MD("_autoplay_pressed"),&AnimationPlayerEditor::_autoplay_pressed);
ObjectTypeDB::bind_method(_MD("_pause_pressed"),&AnimationPlayerEditor::_pause_pressed);
@ -908,6 +1088,8 @@ void AnimationPlayerEditor::_bind_methods() {
ObjectTypeDB::bind_method(_MD("_hide_anim_editors"),&AnimationPlayerEditor::_hide_anim_editors);
ObjectTypeDB::bind_method(_MD("_animation_duplicate"),&AnimationPlayerEditor::_animation_duplicate);
ObjectTypeDB::bind_method(_MD("_blend_editor_next_changed"),&AnimationPlayerEditor::_blend_editor_next_changed);
ObjectTypeDB::bind_method(_MD("_unhandled_key_input"),&AnimationPlayerEditor::_unhandled_key_input);
ObjectTypeDB::bind_method(_MD("_animation_tool_menu"),&AnimationPlayerEditor::_animation_tool_menu);
@ -935,47 +1117,56 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor) {
add_child(hb);
add_anim = memnew( Button );
add_anim = memnew( ToolButton );
add_anim->set_tooltip("Create new animation in player.");
hb->add_child(add_anim);
load_anim = memnew( Button );
load_anim = memnew( ToolButton );
load_anim->set_tooltip("Load an animation from disk.");
hb->add_child(load_anim);
duplicate_anim = memnew( Button );
duplicate_anim = memnew( ToolButton );
hb->add_child(duplicate_anim);
duplicate_anim->set_tooltip("Duplicate Animation");
rename_anim = memnew( ToolButton );
hb->add_child(rename_anim);
rename_anim->set_tooltip("Rename Animation");
remove_anim = memnew( ToolButton );
hb->add_child(remove_anim);
remove_anim->set_tooltip("Remove Animation");
animation = memnew( OptionButton );
hb->add_child(animation);
animation->set_h_size_flags(SIZE_EXPAND_FILL);
animation->set_tooltip("Display list of animations in player.");
autoplay = memnew( Button );
autoplay = memnew( ToolButton );
hb->add_child(autoplay);
autoplay->set_tooltip("Autoplay On Load");
rename_anim = memnew( Button );
hb->add_child(rename_anim);
rename_anim->set_tooltip("Rename Animation");
remove_anim = memnew( Button );
hb->add_child(remove_anim);
remove_anim->set_tooltip("Remove Animation");
blend_anim = memnew( Button );
blend_anim = memnew( ToolButton );
hb->add_child(blend_anim);
blend_anim->set_tooltip("Edit Target Blend Times");
tool_anim = memnew( MenuButton);
//tool_anim->set_flat(false);
tool_anim->set_tooltip("Animation Tools");
tool_anim->get_popup()->add_item("Copy Animation",TOOL_COPY_ANIM);
tool_anim->get_popup()->add_item("Paste Animation",TOOL_PASTE_ANIM);
//tool_anim->get_popup()->add_separator();
//tool_anim->get_popup()->add_item("Edit Anim Resource",TOOL_PASTE_ANIM);
hb->add_child(tool_anim);
edit_anim = memnew( Button );
edit_anim = memnew( ToolButton );
edit_anim->set_toggle_mode(true);
hb->add_child(edit_anim);
edit_anim->set_tooltip("Open animation editor.\nProperty editor will displays all editable keys too.");
@ -984,15 +1175,29 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor) {
hb = memnew (HBoxContainer);
add_child(hb);
play = memnew( Button );
play->set_tooltip("Play selected animation.");
play_bw_from = memnew( ToolButton );
play_bw_from->set_tooltip("Play backwards selected animation from current pos. (A)");
hb->add_child(play_bw_from);
hb->add_child(play);
play_bw = memnew( ToolButton );
play_bw->set_tooltip("Play backwards selected animation from end. (Shift+A)");
hb->add_child(play_bw);
stop = memnew( Button );
stop = memnew( ToolButton );
stop->set_toggle_mode(true);
hb->add_child(stop);
play->set_tooltip("Stop animation playback.");
stop->set_tooltip("Stop animation playback. (S)");
play = memnew( ToolButton );
play->set_tooltip("Play selected animation from start. (Shift+D)");
hb->add_child(play);
play_from = memnew( ToolButton );
play_from->set_tooltip("Play selected animation from current pos. (D)");
hb->add_child(play_from);
//pause = memnew( Button );
//pause->set_toggle_mode(true);
@ -1024,6 +1229,7 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor) {
resource_edit_anim= memnew( Button );
hb->add_child(resource_edit_anim);
resource_edit_anim->hide();
file = memnew(FileDialog);
@ -1074,7 +1280,10 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor) {
autoplay->connect("pressed", this,"_autoplay_pressed");
autoplay->set_toggle_mode(true);
play->connect("pressed", this,"_play_pressed");
play->connect("pressed", this,"_play_pressed");
play_from->connect("pressed", this,"_play_from_pressed");
play_bw->connect("pressed", this,"_play_bw_pressed");
play_bw_from->connect("pressed", this,"_play_bw_from_pressed");
stop->connect("pressed", this,"_stop_pressed");
//pause->connect("pressed", this,"_pause_pressed");
add_anim->connect("pressed", this,"_animation_new");
@ -1104,6 +1313,8 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor) {
renaming=false;
last_active=false;
set_process_unhandled_key_input(true);
}