Implement keyframe time.

This commit is contained in:
Relintai 2020-04-01 19:23:49 +02:00
parent 52873cd45b
commit 63827022bb
4 changed files with 67 additions and 4 deletions

View File

@ -179,6 +179,19 @@ void ProceduralAnimation::set_keyframe_transition(const int keyframe_index, cons
process_animation_data(); process_animation_data();
} }
float ProceduralAnimation::get_keyframe_time(const int keyframe_index) const {
ERR_FAIL_COND_V(!_keyframes.has(keyframe_index), 0);
return _keyframes[keyframe_index]->time;
}
void ProceduralAnimation::set_keyframe_time(const int keyframe_index, const float value) {
ERR_FAIL_COND(!_keyframes.has(keyframe_index));
_keyframes[keyframe_index]->time = value;
process_animation_data();
}
Vector2 ProceduralAnimation::get_keyframe_node_position(const int keyframe_index) const { Vector2 ProceduralAnimation::get_keyframe_node_position(const int keyframe_index) const {
ERR_FAIL_COND_V(!_keyframes.has(keyframe_index), Vector2()); ERR_FAIL_COND_V(!_keyframes.has(keyframe_index), Vector2());
@ -194,6 +207,8 @@ void ProceduralAnimation::process_animation_data() {
if (!_animation.is_valid()) if (!_animation.is_valid())
return; return;
bool looping = has_loop();
clear(); clear();
for (int i = 0; i < _animation->get_track_count(); ++i) { for (int i = 0; i < _animation->get_track_count(); ++i) {
@ -268,9 +283,11 @@ void ProceduralAnimation::process_animation_data() {
if (!found_keyframe) if (!found_keyframe)
ERR_PRINT("Could not find any keyframe! Index: " + String::num(animation_keyframe_index) + " at time: " + String::num(time)); ERR_PRINT("Could not find any keyframe! Index: " + String::num(animation_keyframe_index) + " at time: " + String::num(time));
//TODO add param target_keyframe_time += frame->time;
target_keyframe_time += 1.0;
} }
set_length(target_keyframe_time);
set_loop(looping);
} }
ProceduralAnimation::ProceduralAnimation() { ProceduralAnimation::ProceduralAnimation() {

View File

@ -41,13 +41,15 @@ protected:
String name; String name;
int animation_keyframe_index; int animation_keyframe_index;
int next_keyframe; int next_keyframe;
Vector2 position;
float transition; float transition;
float time;
Vector2 position;
AnimationKeyFrame() { AnimationKeyFrame() {
animation_keyframe_index = 0; animation_keyframe_index = 0;
transition = 1.0; transition = 1.0;
next_keyframe = -1; next_keyframe = -1;
time = 1;
} }
~AnimationKeyFrame() { ~AnimationKeyFrame() {
@ -90,6 +92,9 @@ public:
float get_keyframe_transition(const int keyframe_index) const; float get_keyframe_transition(const int keyframe_index) const;
void set_keyframe_transition(const int keyframe_index, const float value); void set_keyframe_transition(const int keyframe_index, const float value);
float get_keyframe_time(const int keyframe_index) const;
void set_keyframe_time(const int keyframe_index, const float value);
Vector2 get_keyframe_node_position(const int keyframe_index) const; Vector2 get_keyframe_node_position(const int keyframe_index) const;
void set_keyframe_node_position(const int keyframe_index, const Vector2 &value); void set_keyframe_node_position(const int keyframe_index, const Vector2 &value);

View File

@ -396,6 +396,22 @@ void ProceduralAnimationEditorGraphNode::set_transition(const float value) {
changed(); changed();
} }
float ProceduralAnimationEditorGraphNode::get_time() const {
return _time;
}
void ProceduralAnimationEditorGraphNode::set_time(const float value) {
_time = value;
_time_spinbox->set_value(value);
if (!_animation.is_valid())
return;
_animation->set_keyframe_time(_id, value);
changed();
}
Ref<ProceduralAnimation> ProceduralAnimationEditorGraphNode::get_animation() { Ref<ProceduralAnimation> ProceduralAnimationEditorGraphNode::get_animation() {
return _animation; return _animation;
} }
@ -410,6 +426,7 @@ void ProceduralAnimationEditorGraphNode::set_animation(const Ref<ProceduralAnima
set_next_keyframe(animation->get_keyframe_next_keyframe_index(_id)); set_next_keyframe(animation->get_keyframe_next_keyframe_index(_id));
set_transition(animation->get_keyframe_transition(_id)); set_transition(animation->get_keyframe_transition(_id));
set_animation_keyframe_index(animation->get_keyframe_animation_keyframe_index(_id)); set_animation_keyframe_index(animation->get_keyframe_animation_keyframe_index(_id));
set_time(animation->get_keyframe_time(_id));
_animation = animation; _animation = animation;
} }
@ -418,7 +435,8 @@ ProceduralAnimationEditorGraphNode::ProceduralAnimationEditorGraphNode() {
_id = 0; _id = 0;
_animation_keyframe_index = 0; _animation_keyframe_index = 0;
_next_keyframe = 0; _next_keyframe = -1;
_time = 1;
set_title("Animation Frame"); set_title("Animation Frame");
set_show_close_button(true); set_show_close_button(true);
@ -441,6 +459,17 @@ ProceduralAnimationEditorGraphNode::ProceduralAnimationEditorGraphNode() {
_animation_keyframe_spinbox->connect("value_changed", this, "on_animation_keyframe_spinbox_value_changed"); _animation_keyframe_spinbox->connect("value_changed", this, "on_animation_keyframe_spinbox_value_changed");
add_child(_animation_keyframe_spinbox); add_child(_animation_keyframe_spinbox);
Label *lt = memnew(Label);
lt->set_text("Time");
add_child(lt);
_time_spinbox = memnew(SpinBox);
_time_spinbox->set_max(999999999);
_time_spinbox->set_min(0);
_time_spinbox->set_h_size_flags(SIZE_EXPAND_FILL);
_time_spinbox->connect("value_changed", this, "on_time_spinbox_value_changed");
add_child(_time_spinbox);
_transition_editor = memnew(EditorPropertyEasing); _transition_editor = memnew(EditorPropertyEasing);
_transition_editor->set_margin(MARGIN_TOP, 5 * EDSCALE); _transition_editor->set_margin(MARGIN_TOP, 5 * EDSCALE);
_transition_editor->set_margin(MARGIN_BOTTOM, 5 * EDSCALE); _transition_editor->set_margin(MARGIN_BOTTOM, 5 * EDSCALE);
@ -459,6 +488,10 @@ void ProceduralAnimationEditorGraphNode::on_animation_keyframe_spinbox_value_cha
set_animation_keyframe_index(value); set_animation_keyframe_index(value);
} }
void ProceduralAnimationEditorGraphNode::on_time_spinbox_value_changed(float value) {
set_time(value);
}
void ProceduralAnimationEditorGraphNode::on_dragged(Vector2 from, Vector2 to) { void ProceduralAnimationEditorGraphNode::on_dragged(Vector2 from, Vector2 to) {
if (!_animation.is_valid()) if (!_animation.is_valid())
return; return;
@ -491,6 +524,7 @@ void ProceduralAnimationEditorGraphNode::_bind_methods() {
ClassDB::bind_method(D_METHOD("on_keyframe_name_modified", "name"), &ProceduralAnimationEditorGraphNode::on_keyframe_name_modified); ClassDB::bind_method(D_METHOD("on_keyframe_name_modified", "name"), &ProceduralAnimationEditorGraphNode::on_keyframe_name_modified);
ClassDB::bind_method(D_METHOD("changed"), &ProceduralAnimationEditorGraphNode::changed); ClassDB::bind_method(D_METHOD("changed"), &ProceduralAnimationEditorGraphNode::changed);
ClassDB::bind_method(D_METHOD("on_animation_keyframe_spinbox_value_changed", "value"), &ProceduralAnimationEditorGraphNode::on_animation_keyframe_spinbox_value_changed); ClassDB::bind_method(D_METHOD("on_animation_keyframe_spinbox_value_changed", "value"), &ProceduralAnimationEditorGraphNode::on_animation_keyframe_spinbox_value_changed);
ClassDB::bind_method(D_METHOD("on_time_spinbox_value_changed", "value"), &ProceduralAnimationEditorGraphNode::on_time_spinbox_value_changed);
ClassDB::bind_method(D_METHOD("on_dragged", "from", "to"), &ProceduralAnimationEditorGraphNode::on_dragged); ClassDB::bind_method(D_METHOD("on_dragged", "from", "to"), &ProceduralAnimationEditorGraphNode::on_dragged);

View File

@ -111,6 +111,9 @@ public:
float get_transition() const; float get_transition() const;
void set_transition(const float value); void set_transition(const float value);
float get_time() const;
void set_time(const float value);
Ref<ProceduralAnimation> get_animation(); Ref<ProceduralAnimation> get_animation();
void set_animation(const Ref<ProceduralAnimation> &animation); void set_animation(const Ref<ProceduralAnimation> &animation);
@ -119,6 +122,8 @@ public:
protected: protected:
void on_animation_keyframe_spinbox_value_changed(float value); void on_animation_keyframe_spinbox_value_changed(float value);
void on_time_spinbox_value_changed(float value);
void on_dragged(Vector2 from, Vector2 to); void on_dragged(Vector2 from, Vector2 to);
void changed(); void changed();
@ -132,11 +137,13 @@ private:
int _id; int _id;
LineEdit *_name; LineEdit *_name;
SpinBox *_animation_keyframe_spinbox; SpinBox *_animation_keyframe_spinbox;
SpinBox *_time_spinbox;
int _animation_keyframe_index; int _animation_keyframe_index;
int _next_keyframe; int _next_keyframe;
EditorPropertyEasing *_transition_editor; EditorPropertyEasing *_transition_editor;
float _transition; float _transition;
float _time;
Ref<ProceduralAnimation> _animation; Ref<ProceduralAnimation> _animation;
}; };