1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-08 12:40:44 +00:00

Create reset tracks with the right update mode

This commit is contained in:
Pedro J. Estébanez
2022-07-17 19:42:53 +02:00
parent 3ae61590e1
commit b46a2aaa4b
2 changed files with 45 additions and 41 deletions

View File

@@ -3725,11 +3725,11 @@ void AnimationTrackEditor::_query_insert(const InsertData &p_id) {
} }
} }
void AnimationTrackEditor::_insert_track(bool p_create_reset, bool p_create_beziers) { void AnimationTrackEditor::_insert_track(bool p_reset_wanted, bool p_create_beziers) {
undo_redo->create_action(TTR("Anim Insert")); undo_redo->create_action(TTR("Anim Insert"));
Ref<Animation> reset_anim; Ref<Animation> reset_anim;
if (p_create_reset) { if (p_reset_wanted) {
reset_anim = _create_and_get_reset_animation(); reset_anim = _create_and_get_reset_animation();
} }
@@ -3739,7 +3739,7 @@ void AnimationTrackEditor::_insert_track(bool p_create_reset, bool p_create_bezi
if (insert_data.front()->get().advance) { if (insert_data.front()->get().advance) {
advance = true; advance = true;
} }
next_tracks = _confirm_insert(insert_data.front()->get(), next_tracks, p_create_reset, reset_anim, p_create_beziers); next_tracks = _confirm_insert(insert_data.front()->get(), next_tracks, p_reset_wanted, reset_anim, p_create_beziers);
insert_data.pop_front(); insert_data.pop_front();
} }
@@ -4207,32 +4207,15 @@ static Vector<String> _get_bezier_subindices_for_type(Variant::Type p_type, bool
return subindices; return subindices;
} }
AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertData p_id, TrackIndices p_next_tracks, bool p_create_reset, Ref<Animation> p_reset_anim, bool p_create_beziers) { AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertData p_id, TrackIndices p_next_tracks, bool p_reset_wanted, Ref<Animation> p_reset_anim, bool p_create_beziers) {
bool created = false; bool created = false;
if (p_id.track_idx < 0) {
if (p_create_beziers) {
bool valid;
Vector<String> subindices = _get_bezier_subindices_for_type(p_id.value.get_type(), &valid);
if (valid) {
for (int i = 0; i < subindices.size(); i++) {
InsertData id = p_id;
id.type = Animation::TYPE_BEZIER;
id.value = p_id.value.get(subindices[i].substr(1, subindices[i].length()));
id.path = String(p_id.path) + subindices[i];
p_next_tracks = _confirm_insert(id, p_next_tracks, p_create_reset, p_reset_anim, false);
}
return p_next_tracks; bool create_normal_track = p_id.track_idx < 0;
} bool create_reset_track = p_reset_wanted && track_type_is_resettable(p_id.type);
}
created = true;
undo_redo->create_action(TTR("Anim Insert Track & Key"));
Animation::UpdateMode update_mode = Animation::UPDATE_DISCRETE; Animation::UpdateMode update_mode = Animation::UPDATE_DISCRETE;
if (create_normal_track || create_reset_track) {
if (p_id.type == Animation::TYPE_VALUE || p_id.type == Animation::TYPE_BEZIER) { if (p_id.type == Animation::TYPE_VALUE || p_id.type == Animation::TYPE_BEZIER) {
// Wants a new track.
{
// Hack. // Hack.
NodePath np; NodePath np;
animation->add_track(p_id.type); animation->add_track(p_id.type);
@@ -4259,6 +4242,25 @@ AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertD
} }
} }
if (create_normal_track) {
if (p_create_beziers) {
bool valid;
Vector<String> subindices = _get_bezier_subindices_for_type(p_id.value.get_type(), &valid);
if (valid) {
for (int i = 0; i < subindices.size(); i++) {
InsertData id = p_id;
id.type = Animation::TYPE_BEZIER;
id.value = p_id.value.get(subindices[i].substr(1, subindices[i].length()));
id.path = String(p_id.path) + subindices[i];
p_next_tracks = _confirm_insert(id, p_next_tracks, p_reset_wanted, p_reset_anim, false);
}
return p_next_tracks;
}
}
created = true;
undo_redo->create_action(TTR("Anim Insert Track & Key"));
p_id.track_idx = p_next_tracks.normal; p_id.track_idx = p_next_tracks.normal;
undo_redo->add_do_method(animation.ptr(), "add_track", p_id.type); undo_redo->add_do_method(animation.ptr(), "add_track", p_id.type);
@@ -4320,8 +4322,7 @@ AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertD
} }
} }
if (p_create_reset && track_type_is_resettable(p_id.type)) { if (create_reset_track) {
bool create_reset_track = true;
Animation *reset_anim = p_reset_anim.ptr(); Animation *reset_anim = p_reset_anim.ptr();
for (int i = 0; i < reset_anim->get_track_count(); i++) { for (int i = 0; i < reset_anim->get_track_count(); i++) {
if (reset_anim->track_get_path(i) == p_id.path) { if (reset_anim->track_get_path(i) == p_id.path) {
@@ -4332,6 +4333,9 @@ AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertD
if (create_reset_track) { if (create_reset_track) {
undo_redo->add_do_method(reset_anim, "add_track", p_id.type); undo_redo->add_do_method(reset_anim, "add_track", p_id.type);
undo_redo->add_do_method(reset_anim, "track_set_path", p_next_tracks.reset, p_id.path); undo_redo->add_do_method(reset_anim, "track_set_path", p_next_tracks.reset, p_id.path);
if (p_id.type == Animation::TYPE_VALUE) {
undo_redo->add_do_method(reset_anim, "value_track_set_update_mode", p_next_tracks.reset, update_mode);
}
undo_redo->add_do_method(reset_anim, "track_insert_key", p_next_tracks.reset, 0.0f, value); undo_redo->add_do_method(reset_anim, "track_insert_key", p_next_tracks.reset, 0.0f, value);
undo_redo->add_undo_method(reset_anim, "remove_track", reset_anim->get_track_count()); undo_redo->add_undo_method(reset_anim, "remove_track", reset_anim->get_track_count());
p_next_tracks.reset++; p_next_tracks.reset++;

View File

@@ -375,8 +375,8 @@ class AnimationTrackEditor : public VBoxContainer {
reset = p_reset_anim ? p_reset_anim->get_track_count() : 0; reset = p_reset_anim ? p_reset_anim->get_track_count() : 0;
} }
}; };
TrackIndices _confirm_insert(InsertData p_id, TrackIndices p_next_tracks, bool p_create_reset, Ref<Animation> p_reset_anim, bool p_create_beziers); TrackIndices _confirm_insert(InsertData p_id, TrackIndices p_next_tracks, bool p_reset_wanted, Ref<Animation> p_reset_anim, bool p_create_beziers);
void _insert_track(bool p_create_reset, bool p_create_beziers); void _insert_track(bool p_reset_wanted, bool p_create_beziers);
void _root_removed(); void _root_removed();