Skip to content

Commit b610bd7

Browse files
committed
[godot] Fixes #2670, animation tracks must be set to discrete, so we only get a single name/loop change for each key.
1 parent c3d510e commit b610bd7

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

spine-godot/spine_godot/SpineAnimationTrack.cpp

+12-1
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ void SpineAnimationTrack::_bind_methods() {
9595
}
9696

9797
SpineAnimationTrack::SpineAnimationTrack() : loop(false),
98+
animation_changed(false),
9899
track_index(-1),
99100
mix_duration(-1),
100101
hold_previous(false),
@@ -231,6 +232,9 @@ void SpineAnimationTrack::setup_animation_player() {
231232
reset_animation_ref->add_track(Animation::TYPE_VALUE);
232233
reset_animation_ref->track_set_path(1, NodePath(".:loop"));
233234
reset_animation_ref->track_insert_key(1, 0, false);
235+
reset_animation_ref->value_track_set_update_mode(0, Animation::UPDATE_DISCRETE);
236+
reset_animation_ref->value_track_set_update_mode(1, Animation::UPDATE_DISCRETE);
237+
234238
#if VERSION_MAJOR > 3
235239
animation_library->add_animation(reset_animation_ref->get_name(), reset_animation_ref);
236240
animation_library->add_animation("-- Empty --", reset_animation_ref);
@@ -262,6 +266,9 @@ Ref<Animation> SpineAnimationTrack::create_animation(spine::Animation *animation
262266
animation_ref->track_set_path(1, NodePath(".:loop"));
263267
animation_ref->track_insert_key(1, 0, !loop);
264268

269+
animation_ref->value_track_set_update_mode(0, Animation::UPDATE_DISCRETE);
270+
animation_ref->value_track_set_update_mode(1, Animation::UPDATE_DISCRETE);
271+
265272
return animation_ref;
266273
}
267274

@@ -416,7 +423,8 @@ void SpineAnimationTrack::update_animation_state(const Variant &variant_sprite)
416423
if (animation_player->is_playing()) {
417424
auto current_entry = animation_state->getCurrent(track_index);
418425
bool should_set_mix = mix_duration >= 0;
419-
bool should_set_animation = !current_entry || (animation_name != current_entry->getAnimation()->getName().buffer() || current_entry->getLoop() != loop);
426+
bool should_set_animation = !current_entry || (animation_name != current_entry->getAnimation()->getName().buffer() || current_entry->getLoop() != loop) || animation_changed;
427+
animation_changed = false;
420428

421429
if (should_set_animation) {
422430
if (!EMPTY(animation_name)) {
@@ -446,14 +454,17 @@ void SpineAnimationTrack::update_animation_state(const Variant &variant_sprite)
446454
}
447455

448456
void SpineAnimationTrack::set_animation_name(const String &_animation_name) {
457+
if (debug) print_line(String("Animation name changed"));
449458
animation_name = _animation_name;
459+
animation_changed = true;
450460
}
451461

452462
String SpineAnimationTrack::get_animation_name() {
453463
return animation_name;
454464
}
455465

456466
void SpineAnimationTrack::set_loop(bool _loop) {
467+
animation_changed = true;
457468
loop = _loop;
458469
}
459470

spine-godot/spine_godot/SpineAnimationTrack.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,11 @@ class SpineAnimationTrack : public Node {
3939
protected:
4040
// These are not exposed in the inspector, see SpineAnimationTrackInspectorPlugin.
4141
// Instead, they are are keyed by the animations created in setup_animation_player
42-
// and primarily used for animation player editor support like scrubbing.
42+
// and primarily used for animation player editor support like scrubbing and playing
43+
// back the .
4344
String animation_name;
4445
bool loop;
46+
bool animation_changed;
4547

4648
// These can be set by the user.
4749
int track_index;

0 commit comments

Comments
 (0)