[c] Port of commit 8d058fb: Improved AnimationState behavior when paused. See #2705

This commit is contained in:
Mario Zechner 2024-12-09 15:00:59 +01:00
parent 9bd964514d
commit 140335636c
2 changed files with 22 additions and 32 deletions

View File

@ -350,16 +350,18 @@ int /*boolean*/ _spAnimationState_updateMixingFrom(spAnimationState *self, spTra
from->animationLast = from->nextAnimationLast;
from->trackLast = from->nextTrackLast;
/* Require mixTime > 0 to ensure the mixing from entry was applied at least once. */
if (to->mixTime > 0 && to->mixTime >= to->mixDuration) {
/* Require totalAlpha == 0 to ensure mixing is complete, unless mixDuration == 0 (the transition is a single frame). */
if (from->totalAlpha == 0 || to->mixDuration == 0) {
to->mixingFrom = from->mixingFrom;
if (from->mixingFrom != 0) from->mixingFrom->mixingTo = to;
to->interruptAlpha = from->interruptAlpha;
_spEventQueue_end(internal->queue, from);
if (to->nextTrackLast != -1) { // The from entry was applied at least once.
int discard = to->mixTime == 0 && from->mixTime == 0;// Discard the from entry when neither have advanced yet.
if (to->mixTime >= to->mixDuration || discard) {
// Require totalAlpha == 0 to ensure mixing is complete or the transition is a single frame or discarded.
if (from->totalAlpha == 0 || to->mixDuration == 0 || discard) {
to->mixingFrom = from->mixingFrom;
if (from->mixingFrom) from->mixingFrom->mixingTo = to;
to->interruptAlpha = from->interruptAlpha;
_spEventQueue_end(internal->queue, from);
}
return finished;
}
return finished;
}
from->trackTime += delta * from->timeScale;

View File

@ -794,31 +794,19 @@ bool AnimationState::updateMixingFrom(TrackEntry *to, float delta) {
from->_animationLast = from->_nextAnimationLast;
from->_trackLast = from->_nextTrackLast;
// Require mixTime > 0 to ensure the mixing from entry was applied at least once.
if (to->_mixTime > 0 && to->_mixTime >= to->_mixDuration) {
// Require totalAlpha == 0 to ensure mixing is complete, unless mixDuration == 0 (the transition is a single frame).
if (from->_totalAlpha == 0 || to->_mixDuration == 0) {
to->_mixingFrom = from->_mixingFrom;
if (from->_mixingFrom != NULL) from->_mixingFrom->_mixingTo = to;
to->_interruptAlpha = from->_interruptAlpha;
_queue->end(from);
}
return finished;
}
if (to->_nextTrackLast != -1) { // The from entry was applied at least once.
bool discard = to->_mixTime == 0 && from->_mixTime == 0; // Discard the from entry when neither have advanced yet.
if (to->_mixTime >= to->_mixDuration || discard) {
// Require totalAlpha == 0 to ensure mixing is complete or the transition is a single frame or discarded.
if (from->_totalAlpha == 0 || to->_mixDuration == 0 || discard) {
to->_mixingFrom = from->_mixingFrom;
if (from->_mixingFrom) from->_mixingFrom->_mixingTo = to;
to->_interruptAlpha = from->_interruptAlpha;
_queue->end(from);
}
return finished;
if (to->_nextTrackLast != -1) { // The from entry was applied at least once.
bool discard = to->_mixTime == 0 && from->_mixTime == 0;// Discard the from entry when neither have advanced yet.
if (to->_mixTime >= to->_mixDuration || discard) {
// Require totalAlpha == 0 to ensure mixing is complete or the transition is a single frame or discarded.
if (from->_totalAlpha == 0 || to->_mixDuration == 0 || discard) {
to->_mixingFrom = from->_mixingFrom;
if (from->_mixingFrom) from->_mixingFrom->_mixingTo = to;
to->_interruptAlpha = from->_interruptAlpha;
_queue->end(from);
}
return finished;
}
}
from->_trackTime += delta * from->_timeScale;
to->_mixTime += delta;