Merge pull request #31125 from Calinou/improve-animation-editor-snapping
Improve snapping in the animation editor
This commit is contained in:
commit
27c518702a
@ -31,6 +31,7 @@
|
|||||||
#include "animation_track_editor.h"
|
#include "animation_track_editor.h"
|
||||||
|
|
||||||
#include "animation_track_editor_plugins.h"
|
#include "animation_track_editor_plugins.h"
|
||||||
|
#include "core/os/input.h"
|
||||||
#include "core/os/keyboard.h"
|
#include "core/os/keyboard.h"
|
||||||
#include "editor/animation_bezier_editor.h"
|
#include "editor/animation_bezier_editor.h"
|
||||||
#include "editor/plugins/animation_player_editor_plugin.h"
|
#include "editor/plugins/animation_player_editor_plugin.h"
|
||||||
@ -4082,6 +4083,10 @@ bool AnimationTrackEditor::is_selection_active() const {
|
|||||||
return selection.size();
|
return selection.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AnimationTrackEditor::is_snap_enabled() const {
|
||||||
|
return snap->is_pressed() ^ Input::get_singleton()->is_key_pressed(KEY_CONTROL);
|
||||||
|
}
|
||||||
|
|
||||||
void AnimationTrackEditor::_update_tracks() {
|
void AnimationTrackEditor::_update_tracks() {
|
||||||
|
|
||||||
int selected = _get_track_selected();
|
int selected = _get_track_selected();
|
||||||
@ -5679,7 +5684,7 @@ void AnimationTrackEditor::_selection_changed() {
|
|||||||
|
|
||||||
float AnimationTrackEditor::snap_time(float p_value) {
|
float AnimationTrackEditor::snap_time(float p_value) {
|
||||||
|
|
||||||
if (snap->is_pressed()) {
|
if (is_snap_enabled()) {
|
||||||
|
|
||||||
double snap_increment;
|
double snap_increment;
|
||||||
if (timeline->is_using_fps() && step->get_value() > 0)
|
if (timeline->is_using_fps() && step->get_value() > 0)
|
||||||
|
@ -520,8 +520,8 @@ public:
|
|||||||
bool is_key_selected(int p_track, int p_key) const;
|
bool is_key_selected(int p_track, int p_key) const;
|
||||||
bool is_selection_active() const;
|
bool is_selection_active() const;
|
||||||
bool is_moving_selection() const;
|
bool is_moving_selection() const;
|
||||||
|
bool is_snap_enabled() const;
|
||||||
float get_moving_selection_offset() const;
|
float get_moving_selection_offset() const;
|
||||||
bool is_snap_enabled();
|
|
||||||
float snap_time(float p_value);
|
float snap_time(float p_value);
|
||||||
bool is_grouping_tracks();
|
bool is_grouping_tracks();
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
|
|
||||||
#include "core/io/resource_loader.h"
|
#include "core/io/resource_loader.h"
|
||||||
#include "core/io/resource_saver.h"
|
#include "core/io/resource_saver.h"
|
||||||
|
#include "core/os/input.h"
|
||||||
#include "core/os/keyboard.h"
|
#include "core/os/keyboard.h"
|
||||||
#include "core/project_settings.h"
|
#include "core/project_settings.h"
|
||||||
#include "editor/animation_track_editor.h"
|
#include "editor/animation_track_editor.h"
|
||||||
@ -293,10 +294,6 @@ void AnimationPlayerEditor::_animation_selected(int p_which) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
frame->set_max(anim->get_length());
|
frame->set_max(anim->get_length());
|
||||||
if (anim->get_step())
|
|
||||||
frame->set_step(anim->get_step());
|
|
||||||
else
|
|
||||||
frame->set_step(0.00001);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
track_editor->set_animation(Ref<Animation>());
|
track_editor->set_animation(Ref<Animation>());
|
||||||
@ -1008,7 +1005,7 @@ void AnimationPlayerEditor::_seek_value_changed(float p_value, bool p_set) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
updating = true;
|
updating = true;
|
||||||
String current = player->get_assigned_animation(); //animation->get_item_text( animation->get_selected() );
|
String current = player->get_assigned_animation();
|
||||||
if (current == "" || !player->has_animation(current)) {
|
if (current == "" || !player->has_animation(current)) {
|
||||||
updating = false;
|
updating = false;
|
||||||
current = "";
|
current = "";
|
||||||
@ -1018,14 +1015,9 @@ void AnimationPlayerEditor::_seek_value_changed(float p_value, bool p_set) {
|
|||||||
Ref<Animation> anim;
|
Ref<Animation> anim;
|
||||||
anim = player->get_animation(current);
|
anim = player->get_animation(current);
|
||||||
|
|
||||||
float pos = anim->get_length() * (p_value / frame->get_max());
|
float pos = CLAMP(anim->get_length() * (p_value / frame->get_max()), 0, anim->get_length());
|
||||||
float step = anim->get_step();
|
if (track_editor->is_snap_enabled()) {
|
||||||
if (step) {
|
pos = Math::stepify(pos, anim->get_step());
|
||||||
pos = Math::stepify(pos, step);
|
|
||||||
if (pos < 0)
|
|
||||||
pos = 0;
|
|
||||||
if (pos >= anim->get_length())
|
|
||||||
pos = anim->get_length();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player->is_valid() && !p_set) {
|
if (player->is_valid() && !p_set) {
|
||||||
@ -1063,14 +1055,6 @@ void AnimationPlayerEditor::_animation_key_editor_anim_len_changed(float p_len)
|
|||||||
frame->set_max(p_len);
|
frame->set_max(p_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnimationPlayerEditor::_animation_key_editor_anim_step_changed(float p_len) {
|
|
||||||
|
|
||||||
if (p_len)
|
|
||||||
frame->set_step(p_len);
|
|
||||||
else
|
|
||||||
frame->set_step(0.00001);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnimationPlayerEditor::_animation_key_editor_seek(float p_pos, bool p_drag) {
|
void AnimationPlayerEditor::_animation_key_editor_seek(float p_pos, bool p_drag) {
|
||||||
|
|
||||||
if (!is_visible_in_tree())
|
if (!is_visible_in_tree())
|
||||||
@ -1081,8 +1065,10 @@ void AnimationPlayerEditor::_animation_key_editor_seek(float p_pos, bool p_drag)
|
|||||||
if (player->is_playing())
|
if (player->is_playing())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Ref<Animation> anim = player->get_animation(player->get_assigned_animation());
|
||||||
|
|
||||||
updating = true;
|
updating = true;
|
||||||
frame->set_value(p_pos);
|
frame->set_value(Math::stepify(p_pos, track_editor->is_snap_enabled() ? anim->get_step() : 0));
|
||||||
updating = false;
|
updating = false;
|
||||||
_seek_value_changed(p_pos, !p_drag);
|
_seek_value_changed(p_pos, !p_drag);
|
||||||
|
|
||||||
@ -1558,7 +1544,6 @@ void AnimationPlayerEditor::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("_list_changed"), &AnimationPlayerEditor::_list_changed);
|
ClassDB::bind_method(D_METHOD("_list_changed"), &AnimationPlayerEditor::_list_changed);
|
||||||
ClassDB::bind_method(D_METHOD("_animation_key_editor_seek"), &AnimationPlayerEditor::_animation_key_editor_seek);
|
ClassDB::bind_method(D_METHOD("_animation_key_editor_seek"), &AnimationPlayerEditor::_animation_key_editor_seek);
|
||||||
ClassDB::bind_method(D_METHOD("_animation_key_editor_anim_len_changed"), &AnimationPlayerEditor::_animation_key_editor_anim_len_changed);
|
ClassDB::bind_method(D_METHOD("_animation_key_editor_anim_len_changed"), &AnimationPlayerEditor::_animation_key_editor_anim_len_changed);
|
||||||
ClassDB::bind_method(D_METHOD("_animation_key_editor_anim_step_changed"), &AnimationPlayerEditor::_animation_key_editor_anim_step_changed);
|
|
||||||
ClassDB::bind_method(D_METHOD("_hide_anim_editors"), &AnimationPlayerEditor::_hide_anim_editors);
|
ClassDB::bind_method(D_METHOD("_hide_anim_editors"), &AnimationPlayerEditor::_hide_anim_editors);
|
||||||
ClassDB::bind_method(D_METHOD("_animation_duplicate"), &AnimationPlayerEditor::_animation_duplicate);
|
ClassDB::bind_method(D_METHOD("_animation_duplicate"), &AnimationPlayerEditor::_animation_duplicate);
|
||||||
ClassDB::bind_method(D_METHOD("_blend_editor_next_changed"), &AnimationPlayerEditor::_blend_editor_next_changed);
|
ClassDB::bind_method(D_METHOD("_blend_editor_next_changed"), &AnimationPlayerEditor::_blend_editor_next_changed);
|
||||||
@ -1621,6 +1606,7 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay
|
|||||||
hb->add_child(frame);
|
hb->add_child(frame);
|
||||||
frame->set_custom_minimum_size(Size2(60, 0));
|
frame->set_custom_minimum_size(Size2(60, 0));
|
||||||
frame->set_stretch_ratio(2);
|
frame->set_stretch_ratio(2);
|
||||||
|
frame->set_step(0.00001);
|
||||||
frame->set_tooltip(TTR("Animation position (in seconds)."));
|
frame->set_tooltip(TTR("Animation position (in seconds)."));
|
||||||
|
|
||||||
hb->add_child(memnew(VSeparator));
|
hb->add_child(memnew(VSeparator));
|
||||||
@ -1774,7 +1760,6 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay
|
|||||||
track_editor->set_v_size_flags(SIZE_EXPAND_FILL);
|
track_editor->set_v_size_flags(SIZE_EXPAND_FILL);
|
||||||
track_editor->connect("timeline_changed", this, "_animation_key_editor_seek");
|
track_editor->connect("timeline_changed", this, "_animation_key_editor_seek");
|
||||||
track_editor->connect("animation_len_changed", this, "_animation_key_editor_anim_len_changed");
|
track_editor->connect("animation_len_changed", this, "_animation_key_editor_anim_len_changed");
|
||||||
track_editor->connect("animation_step_changed", this, "_animation_key_editor_anim_step_changed");
|
|
||||||
|
|
||||||
_update_player();
|
_update_player();
|
||||||
|
|
||||||
|
@ -203,7 +203,6 @@ class AnimationPlayerEditor : public VBoxContainer {
|
|||||||
|
|
||||||
void _animation_key_editor_seek(float p_pos, bool p_drag);
|
void _animation_key_editor_seek(float p_pos, bool p_drag);
|
||||||
void _animation_key_editor_anim_len_changed(float p_len);
|
void _animation_key_editor_anim_len_changed(float p_len);
|
||||||
void _animation_key_editor_anim_step_changed(float p_len);
|
|
||||||
|
|
||||||
void _unhandled_key_input(const Ref<InputEvent> &p_ev);
|
void _unhandled_key_input(const Ref<InputEvent> &p_ev);
|
||||||
void _animation_tool_menu(int p_option);
|
void _animation_tool_menu(int p_option);
|
||||||
|
Loading…
Reference in New Issue
Block a user