From 5edeeb6035cb4a9e459b33bb405ed417ec61570e Mon Sep 17 00:00:00 2001 From: NathanSweet Date: Thu, 18 Aug 2016 16:51:50 +0200 Subject: [PATCH] When mixing scale, the sign of the last applied scale is used to avoid mixing across zero. #621 --- .../com/esotericsoftware/spine/Animation.java | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Animation.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Animation.java index 35c86e0b1..849a776dd 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Animation.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Animation.java @@ -375,21 +375,32 @@ public class Animation { if (time < frames[0]) return; // Time is before first frame. Bone bone = skeleton.bones.get(boneIndex); + float x, y; if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame. - bone.scaleX += (bone.data.scaleX * frames[frames.length + PREV_X] - bone.scaleX) * alpha; - bone.scaleY += (bone.data.scaleY * frames[frames.length + PREV_Y] - bone.scaleY) * alpha; - return; + x = frames[frames.length + PREV_X]; + y = frames[frames.length + PREV_Y]; + } else { + // Interpolate between the previous frame and the current frame. + int frame = binarySearch(frames, time, ENTRIES); + float prevX = frames[frame + PREV_X]; + float prevY = frames[frame + PREV_Y]; + float frameTime = frames[frame]; + float percent = getCurvePercent(frame / ENTRIES - 1, + 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + x = prevX + (frames[frame + X] - prevX) * percent; + y = prevY + (frames[frame + Y] - prevY) * percent; + } + if (alpha == 1) { + bone.scaleX = x * bone.data.scaleX; + bone.scaleY = y * bone.data.scaleY; + } else { + x *= bone.data.scaleX; + y *= bone.data.scaleY; + float bx = Math.abs(bone.scaleX), by = Math.abs(bone.scaleY); + bone.scaleX = (bx + (Math.abs(x) - bx) * alpha) * Math.signum(x); + bone.scaleY = (by + (Math.abs(y) - by) * alpha) * Math.signum(y); } - - // Interpolate between the previous frame and the current frame. - int frame = binarySearch(frames, time, ENTRIES); - float prevX = frames[frame + PREV_X]; - float prevY = frames[frame + PREV_Y]; - float frameTime = frames[frame]; - float percent = getCurvePercent(frame / ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); - - bone.scaleX += (bone.data.scaleX * (prevX + (frames[frame + X] - prevX) * percent) - bone.scaleX) * alpha; - bone.scaleY += (bone.data.scaleY * (prevY + (frames[frame + Y] - prevY) * percent) - bone.scaleY) * alpha; } }