/*************************************************************************/ /* animation_editor.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ /* https://godotengine.org */ /*************************************************************************/ /* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ /* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ /* */ /* 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/file_dialog.h" #include "scene/gui/menu_button.h" #include "scene/gui/scroll_bar.h" #include "scene/gui/slider.h" #include "scene/gui/spin_box.h" #include "scene/gui/tab_container.h" #include "scene/gui/texture_rect.h" #include "scene/gui/tool_button.h" #include "editor_data.h" #include "property_editor.h" #include "scene/animation/animation_cache.h" #include "scene/resources/animation.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 Ref<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_last_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