diff options
Diffstat (limited to 'editor/animation_editor.h')
-rw-r--r-- | editor/animation_editor.h | 355 |
1 files changed, 355 insertions, 0 deletions
diff --git a/editor/animation_editor.h b/editor/animation_editor.h new file mode 100644 index 0000000000..c4539cd763 --- /dev/null +++ b/editor/animation_editor.h @@ -0,0 +1,355 @@ +/*************************************************************************/ +/* animation_editor.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#ifndef ANIMATION_EDITOR_H +#define ANIMATION_EDITOR_H + +#include "scene/gui/control.h" +#include "scene/gui/slider.h" +#include "scene/gui/menu_button.h" +#include "scene/gui/spin_box.h" +#include "scene/gui/texture_rect.h" +#include "scene/gui/scroll_bar.h" +#include "scene/gui/tool_button.h" +#include "scene/gui/file_dialog.h" +#include "scene/gui/tab_container.h" + +#include "scene/resources/animation.h" +#include "scene/animation/animation_cache.h" +#include "scene_tree_editor.h" +#include "editor_data.h" +#include "property_editor.h" +#include "scene_tree_editor.h" + +class AnimationKeyEdit; +class AnimationCurveEdit; + +class AnimationKeyEditor : public VBoxContainer { + + GDCLASS( AnimationKeyEditor, VBoxContainer ); + +/* + enum { + + MENU_NEW_ANIMATION, + MENU_OPEN_ANIMATION, + MENU_EDIT_ANIMATION, + MENU_CLOSE_ANIMATION, + MENU_KEYING_ACTIVE, + MENU_SET_ROOT_NODE, + MENU_SYNC_TO_PLAYER, + MENU_ANIM_BASE=100, + }; + +*/ + + enum { + + ADD_TRACK_MENU_ADD_VALUE_TRACK, + ADD_TRACK_MENU_ADD_TRANSFORM_TRACK, + ADD_TRACK_MENU_ADD_CALL_TRACK, + TRACK_MENU_SCALE, + TRACK_MENU_SCALE_PIVOT, + TRACK_MENU_MOVE_UP, + TRACK_MENU_MOVE_DOWN, + TRACK_MENU_REMOVE, + TRACK_MENU_DUPLICATE, + TRACK_MENU_DUPLICATE_TRANSPOSE, + TRACK_MENU_SET_ALL_TRANS_LINEAR, + TRACK_MENU_SET_ALL_TRANS_CONSTANT, + TRACK_MENU_SET_ALL_TRANS_OUT, + TRACK_MENU_SET_ALL_TRANS_IN, + TRACK_MENU_SET_ALL_TRANS_INOUT, + TRACK_MENU_SET_ALL_TRANS_OUTIN, + TRACK_MENU_NEXT_STEP, + TRACK_MENU_PREV_STEP, + TRACK_MENU_OPTIMIZE, + TRACK_MENU_CLEAN_UP, + TRACK_MENU_CLEAN_UP_CONFIRM, + CURVE_SET_LINEAR, + CURVE_SET_IN, + CURVE_SET_OUT, + CURVE_SET_INOUT, + CURVE_SET_OUTIN, + CURVE_SET_CONSTANT + }; + + enum { + RIGHT_MENU_DUPLICATE, + RIGHT_MENU_DUPLICATE_TRANSPOSE, + RIGHT_MENU_REMOVE + }; + + struct MouseOver { + + enum Over { + OVER_NONE, + OVER_NAME, + OVER_KEY, + OVER_VALUE, + OVER_INTERP, + OVER_WRAP, + OVER_UP, + OVER_DOWN, + OVER_REMOVE, + OVER_ADD_KEY, + }; + + Over over; + int track; + int over_key; + + } mouse_over; + + struct SelectedKey { + + int track; + int key; + bool operator<(const SelectedKey& p_key) const { return track==p_key.track ? key < p_key.key : track < p_key.track; }; + }; + + struct KeyInfo { + + float pos; + }; + + Map<SelectedKey,KeyInfo> selection; + + struct ClickOver { + + enum Click { + + CLICK_NONE, + CLICK_RESIZE_NAMES, + CLICK_DRAG_TIMELINE, + CLICK_MOVE_KEYS, + CLICK_SELECT_KEYS + + }; + + SelectedKey selk; + bool shift; + Click click; + Point2 at; + Point2 to; + } click; + + + float timeline_pos; + + float name_column_ratio; + + int track_name_editing; + int interp_editing; + int cont_editing; + int wrap_editing; + int selected_track; + int track_ofs[5]; + + int last_menu_track_opt; + LineEdit *track_name; + PopupMenu *track_menu; + PopupMenu *type_menu; + + Control *ec; + TextureRect *zoomicon; + HSlider *zoom; + //MenuButton *menu; + SpinBox *length; + Button *loop; + bool keying; + ToolButton *edit_button; + ToolButton *move_up_button; + ToolButton *move_down_button; + ToolButton *remove_button; + + ToolButton *curve_linear; + ToolButton *curve_in; + ToolButton *curve_out; + ToolButton *curve_inout; + ToolButton *curve_outin; + ToolButton *curve_constant; + + + ConfirmationDialog *optimize_dialog; + SpinBox *optimize_linear_error; + SpinBox *optimize_angular_error; + SpinBox *optimize_max_angle; + + ConfirmationDialog *cleanup_dialog; + CheckButton *cleanup_keys; + CheckButton *cleanup_tracks; + CheckButton *cleanup_all; + + SpinBox *step; + + MenuButton *menu_add_track; + MenuButton *menu_track; + + HScrollBar *h_scroll; + VScrollBar *v_scroll; + + Control *track_editor; + Control *track_pos; + TabContainer *key_editor_tab; + + ConfirmationDialog *scale_dialog; + SpinBox *scale; + + PropertyEditor *key_editor; + + SceneTreeDialog *call_select; + + Ref<Animation> animation; + void _update_paths(); + + int last_idx; + + Node *root; + + UndoRedo *undo_redo; + EditorHistory* history; + ConfirmationDialog *insert_confirm; + + + AnimationKeyEdit *key_edit; + AnimationCurveEdit *curve_edit; + + bool inserting; + + bool updating; + bool te_drawing; + + void _animation_len_changed(float p_len); + void _animation_loop_changed(); + void _step_changed(float p_len); + + struct InsertData { + + Animation::TrackType type; + NodePath path; + int track_idx; + Variant value; + String query; + bool advance; + };/* insert_data;*/ + + bool insert_query; + List<InsertData> insert_data; + uint64_t insert_frame; + + int cvi_track; + float cvi_pos; + + + int right_data_size_cache; + + EditorSelection *editor_selection; + + Label *select_anim_warning; + + + float _get_zoom_scale() const; + + void _track_editor_draw(); + void _track_editor_gui_input(const InputEvent& p_input); + void _track_pos_draw(); + + + void _track_name_changed(const String& p_name); + void _track_menu_selected(int p_idx); + void _confirm_insert_list(); + int _confirm_insert(InsertData p_id,int p_at_track=-1); + void _query_insert(const InsertData& p_id); + void _update_menu(); + bool insert_queue; + void _insert_delay(); + void _scale(); + + + void _clear_selection(); + + //void _browse_path(); + + + StringName alc; + + void _animation_changed(); + void _animation_optimize(); + void _cleanup_animation(Ref<Animation> p_animation); + + void _scroll_changed(double); + + void _menu_add_track(int p_type); + void _menu_track(int p_type); + + void _clear_selection_for_anim(const Ref<Animation>& p_anim); + 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, NodePath &r_base_path); + + void _create_value_item(int p_type); + void _pane_drag(const Point2& p_delta); + bool _edit_if_single_selection(); + + void _toggle_edit_curves(); + void _animation_len_update(); + + void _add_call_track(const NodePath& p_base); + + void _anim_duplicate_keys(bool transpose = false); + void _anim_delete_keys(); + + void _root_removed(); +protected: + + void _notification(int p_what); + static void _bind_methods(); +public: + + void set_animation(const Ref<Animation>& p_anim); + Ref<Animation> get_current_animation() const; + void set_root(Node *p_root); + Node *get_root() const; + void update_keying(); + bool has_keying() const; + + void cleanup(); + + void set_anim_pos(float p_pos); + void insert_node_value_key(Node* p_node, const String& p_property,const Variant& p_value,bool p_only_if_exists=false); + void insert_value_key(const String& p_property, const Variant& p_value, bool p_advance); + void insert_transform_key(Spatial *p_node,const String& p_sub,const Transform& p_xform); + + void show_select_node_warning(bool p_show) { select_anim_warning->set_visible(p_show); } + AnimationKeyEditor(); + ~AnimationKeyEditor(); +}; + +#endif // ANIMATION_EDITOR_H |