Browse Source

Changed bone sorting so transform behavior is consistent when IK and transform constraints are mixed.

pharan 9 years ago
parent
commit
2945eedad9
2 changed files with 23 additions and 14 deletions
  1. 12 7
      spine-as3/spine-as3/src/spine/Skeleton.as
  2. 11 7
      spine-csharp/src/Skeleton.cs

+ 12 - 7
spine-as3/spine-as3/src/spine/Skeleton.as

@@ -82,16 +82,10 @@ public class Skeleton {
 		var updateCache:Vector.<Updatable> = _updateCache;
 		var updateCache:Vector.<Updatable> = _updateCache;
 		var ikConstraints:Vector.<IkConstraint> = this.ikConstraints;
 		var ikConstraints:Vector.<IkConstraint> = this.ikConstraints;
 		var transformConstraints:Vector.<TransformConstraint> = this.transformConstraints;
 		var transformConstraints:Vector.<TransformConstraint> = this.transformConstraints;
-		updateCache.length = bones.length + ikConstraints.length + transformConstraints.length;
+		updateCache.length = bones.length + ikConstraints.length;
 		var i:int = 0;
 		var i:int = 0;
 		for each (var bone:Bone in bones) {
 		for each (var bone:Bone in bones) {
 			updateCache[i++] = bone;
 			updateCache[i++] = bone;
-			for each (var transformConstraint:TransformConstraint in transformConstraints) {
-				if (bone == transformConstraint.bone) {
-					updateCache[i++] = transformConstraint;
-					break;
-				}
-			}
 			for each (var ikConstraint:IkConstraint in ikConstraints) {
 			for each (var ikConstraint:IkConstraint in ikConstraints) {
 				if (bone == ikConstraint.bones[ikConstraint.bones.length - 1]) {
 				if (bone == ikConstraint.bones[ikConstraint.bones.length - 1]) {
 					updateCache[i++] = ikConstraint;
 					updateCache[i++] = ikConstraint;
@@ -99,6 +93,17 @@ public class Skeleton {
 				}
 				}
 			}
 			}
 		}
 		}
+		
+		for each (var transformConstraint:TransformConstraint in transformConstraints) {
+			var ii:int;
+			for (ii = updateCache.length - 1; ii >= 0; i--) {
+				var updatable:Updatable = updateCache[ii];
+				if (updateable == transformConstraint.bone || updateable == transformConstraint.target) {
+					updateCache.splice(ii + 1, 0, transformConstraint);
+					break;
+				}
+			}
+		}
 	}
 	}
 
 
 	/** Updates the world transform for each bone and applies constraints. */
 	/** Updates the world transform for each bone and applies constraints. */

+ 11 - 7
spine-csharp/src/Skeleton.cs

@@ -115,13 +115,6 @@ namespace Spine {
 			for (int i = 0, n = bones.Count; i < n; i++) {
 			for (int i = 0, n = bones.Count; i < n; i++) {
 				Bone bone = bones.Items[i];
 				Bone bone = bones.Items[i];
 				updateCache.Add(bone);
 				updateCache.Add(bone);
-				for (int ii = 0; ii < transformConstraintsCount; ii++) {
-					TransformConstraint transformConstraint = transformConstraints.Items[ii];
-					if (bone == transformConstraint.bone) {
-						updateCache.Add(transformConstraint);
-						break;
-					}
-				}
 				for (int ii = 0; ii < ikConstraintsCount; ii++) {
 				for (int ii = 0; ii < ikConstraintsCount; ii++) {
 					IkConstraint ikConstraint = ikConstraints.Items[ii];
 					IkConstraint ikConstraint = ikConstraints.Items[ii];
 					if (bone == ikConstraint.bones.Items[ikConstraint.bones.Count - 1]) {
 					if (bone == ikConstraint.bones.Items[ikConstraint.bones.Count - 1]) {
@@ -130,6 +123,17 @@ namespace Spine {
 					}
 					}
 				}
 				}
 			}
 			}
+
+			for (int i = 0; i < transformConstraintsCount; i++) {
+				TransformConstraint transformConstraint = transformConstraints.Items[i];
+				for (int ii = updateCache.Count - 1; i >= 0; ii--) {
+					IUpdatable updateable = updateCache.Items[ii];
+					if (updateable == transformConstraint.bone || updateable == transformConstraint.target) {
+						updateCache.Insert(ii + 1, transformConstraint);
+						break;
+					}
+				}
+			}
 		}
 		}
 
 
 		/// <summary>Updates the world transform for each bone and applies constraints.</summary>
 		/// <summary>Updates the world transform for each bone and applies constraints.</summary>