From 5a45d3df30c42100956984c492654c1520d0345d Mon Sep 17 00:00:00 2001 From: NathanSweet Date: Sat, 13 Aug 2016 19:57:23 +0200 Subject: [PATCH] Fixed IK constraint child bone using uninitialized world transform to calculate applied transform. --- .../com/esotericsoftware/spine/Skeleton.java | 67 +++++++++++++------ 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Skeleton.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Skeleton.java index 8c5aae6d4..36e16836c 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Skeleton.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Skeleton.java @@ -53,6 +53,7 @@ public class Skeleton { final Array pathConstraints; final Array sortedConstraints = new Array(); final Array updateCache = new Array(); + final Array updateCacheReset = new Array(); Skin skin; final Color color; float time; @@ -160,31 +161,38 @@ public class Skeleton { for (int i = 0, n = bones.size; i < n; i++) bones.get(i).sorted = false; - Array constraints = sortedConstraints; - constraints.addAll(ikConstraints); - constraints.addAll(transformConstraints); - constraints.addAll(pathConstraints); - constraints.sort(constraintComparator); - for (int i = 0, n = constraints.size; i < n; i++) { - Constraint constraint = constraints.get(i); - if (constraint instanceof IkConstraint) - sortIkConstraint((IkConstraint)constraint); - else if (constraint instanceof TransformConstraint) - sortTransformConstraint((TransformConstraint)constraint); - else - sortPathConstraint((PathConstraint)constraint); + Array ikConstraints = this.ikConstraints; + Array transformConstraints = this.transformConstraints; + Array pathConstraints = this.pathConstraints; + int ikCount = ikConstraints.size, transformCount = transformConstraints.size, pathCount = pathConstraints.size; + int constraintCount = ikCount + transformCount + pathCount; + outer: + for (int i = 0; i < constraintCount; i++) { + for (int ii = 0; ii < ikCount; ii++) { + IkConstraint constraint = ikConstraints.get(ii); + if (constraint.data.order == i) { + sortIkConstraint(constraint); + continue outer; + } + } + for (int ii = 0; ii < transformCount; ii++) { + TransformConstraint constraint = transformConstraints.get(ii); + if (constraint.data.order == i) { + sortTransformConstraint(constraint); + continue outer; + } + } + for (int ii = 0; ii < pathCount; ii++) { + PathConstraint constraint = pathConstraints.get(ii); + if (constraint.data.order == i) { + sortPathConstraint(constraint); + continue outer; + } + } } - constraints.clear(); for (int i = 0, n = bones.size; i < n; i++) sortBone(bones.get(i)); - - // BOZO -// for (int i = 0, n = updateCache.size; i < n; i++) { -// Updatable item = updateCache.get(i); -// if (item instanceof Constraint) System.out.print(item + ", "); -// } -// System.out.println(); } private void sortIkConstraint (IkConstraint constraint) { @@ -195,6 +203,11 @@ public class Skeleton { Bone parent = constrained.first(); sortBone(parent); + if (constrained.size > 1) { + Bone child = constrained.peek(); + if (!updateCache.contains(child, true)) updateCacheReset.add(child); + } + updateCache.add(constraint); sortReset(parent.children); @@ -278,6 +291,18 @@ public class Skeleton { /** Updates the world transform for each bone and applies constraints. */ public void updateWorldTransform () { + Array updateCacheReset = this.updateCacheReset; + for (int i = 0, n = updateCacheReset.size; i < n; i++) { + Bone bone = updateCacheReset.get(i); + bone.ax = bone.x; + bone.ay = bone.y; + bone.arotation = bone.rotation; + bone.ascaleX = bone.scaleX; + bone.ascaleY = bone.scaleY; + bone.ashearX = bone.shearX; + bone.ashearY = bone.shearY; + bone.appliedValid = true; + } Array updateCache = this.updateCache; for (int i = 0, n = updateCache.size; i < n; i++) updateCache.get(i).update();