From b610bd7b7a8218f975e027a2785106d7f6f90b9e Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Wed, 6 Nov 2024 16:11:36 +0100 Subject: [PATCH] [godot] Fixes #2670, animation tracks must be set to discrete, so we only get a single name/loop change for each key. --- spine-godot/spine_godot/SpineAnimationTrack.cpp | 13 ++++++++++++- spine-godot/spine_godot/SpineAnimationTrack.h | 4 +++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/spine-godot/spine_godot/SpineAnimationTrack.cpp b/spine-godot/spine_godot/SpineAnimationTrack.cpp index 77dd524a3..39e7732b8 100644 --- a/spine-godot/spine_godot/SpineAnimationTrack.cpp +++ b/spine-godot/spine_godot/SpineAnimationTrack.cpp @@ -95,6 +95,7 @@ void SpineAnimationTrack::_bind_methods() { } SpineAnimationTrack::SpineAnimationTrack() : loop(false), + animation_changed(false), track_index(-1), mix_duration(-1), hold_previous(false), @@ -231,6 +232,9 @@ void SpineAnimationTrack::setup_animation_player() { reset_animation_ref->add_track(Animation::TYPE_VALUE); reset_animation_ref->track_set_path(1, NodePath(".:loop")); reset_animation_ref->track_insert_key(1, 0, false); + reset_animation_ref->value_track_set_update_mode(0, Animation::UPDATE_DISCRETE); + reset_animation_ref->value_track_set_update_mode(1, Animation::UPDATE_DISCRETE); + #if VERSION_MAJOR > 3 animation_library->add_animation(reset_animation_ref->get_name(), reset_animation_ref); animation_library->add_animation("-- Empty --", reset_animation_ref); @@ -262,6 +266,9 @@ Ref SpineAnimationTrack::create_animation(spine::Animation *animation animation_ref->track_set_path(1, NodePath(".:loop")); animation_ref->track_insert_key(1, 0, !loop); + animation_ref->value_track_set_update_mode(0, Animation::UPDATE_DISCRETE); + animation_ref->value_track_set_update_mode(1, Animation::UPDATE_DISCRETE); + return animation_ref; } @@ -416,7 +423,8 @@ void SpineAnimationTrack::update_animation_state(const Variant &variant_sprite) if (animation_player->is_playing()) { auto current_entry = animation_state->getCurrent(track_index); bool should_set_mix = mix_duration >= 0; - bool should_set_animation = !current_entry || (animation_name != current_entry->getAnimation()->getName().buffer() || current_entry->getLoop() != loop); + bool should_set_animation = !current_entry || (animation_name != current_entry->getAnimation()->getName().buffer() || current_entry->getLoop() != loop) || animation_changed; + animation_changed = false; if (should_set_animation) { if (!EMPTY(animation_name)) { @@ -446,7 +454,9 @@ void SpineAnimationTrack::update_animation_state(const Variant &variant_sprite) } void SpineAnimationTrack::set_animation_name(const String &_animation_name) { + if (debug) print_line(String("Animation name changed")); animation_name = _animation_name; + animation_changed = true; } String SpineAnimationTrack::get_animation_name() { @@ -454,6 +464,7 @@ String SpineAnimationTrack::get_animation_name() { } void SpineAnimationTrack::set_loop(bool _loop) { + animation_changed = true; loop = _loop; } diff --git a/spine-godot/spine_godot/SpineAnimationTrack.h b/spine-godot/spine_godot/SpineAnimationTrack.h index 680ec3c3f..de322511e 100644 --- a/spine-godot/spine_godot/SpineAnimationTrack.h +++ b/spine-godot/spine_godot/SpineAnimationTrack.h @@ -39,9 +39,11 @@ class SpineAnimationTrack : public Node { protected: // These are not exposed in the inspector, see SpineAnimationTrackInspectorPlugin. // Instead, they are are keyed by the animations created in setup_animation_player - // and primarily used for animation player editor support like scrubbing. + // and primarily used for animation player editor support like scrubbing and playing + // back the . String animation_name; bool loop; + bool animation_changed; // These can be set by the user. int track_index;