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

This commit is contained in:
pharan 2016-02-25 15:57:27 +08:00
parent d22073b1a3
commit 2945eedad9
2 changed files with 23 additions and 14 deletions

View File

@ -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. */

View File

@ -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>