mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-02-04 22:34:53 +08:00
On second thought, the math optimizations are OK.
(reverted from commit 547ea760d82c3c7e1dc825704eb2046a218317b1) If inaccuracy becomes a problem at runtime (which is unlikely), users can decide to remove the optimizations.
This commit is contained in:
parent
547ea760d8
commit
86fa7aef11
@ -94,8 +94,7 @@ public class Bone implements Updatable {
|
||||
appliedScaleX = scaleX;
|
||||
appliedScaleY = scaleY;
|
||||
|
||||
rotation *= MathUtils.degRad;
|
||||
float cos = (float)Math.cos(rotation), sin = (float)Math.sin(rotation);
|
||||
float cos = MathUtils.cosDeg(rotation), sin = MathUtils.sinDeg(rotation);
|
||||
float la = cos * scaleX, lb = -sin * scaleY, lc = sin * scaleX, ld = cos * scaleY;
|
||||
Bone parent = this.parent;
|
||||
if (parent == null) { // Root bone.
|
||||
@ -139,9 +138,8 @@ public class Bone implements Updatable {
|
||||
pc = 0;
|
||||
pd = 1;
|
||||
do {
|
||||
rotation = parent.appliedRotation * MathUtils.degRad;
|
||||
cos = (float)Math.cos(rotation);
|
||||
sin = (float)Math.sin(rotation);
|
||||
cos = MathUtils.cosDeg(parent.appliedRotation);
|
||||
sin = MathUtils.sinDeg(parent.appliedRotation);
|
||||
float temp = pa * cos + pb * sin;
|
||||
pb = pa * -sin + pb * cos;
|
||||
pa = temp;
|
||||
@ -162,9 +160,9 @@ public class Bone implements Updatable {
|
||||
pc = 0;
|
||||
pd = 1;
|
||||
do {
|
||||
rotation = parent.appliedRotation * MathUtils.degRad;
|
||||
cos = (float)Math.cos(rotation);
|
||||
sin = (float)Math.sin(rotation);
|
||||
float r = parent.appliedRotation;
|
||||
cos = MathUtils.cosDeg(r);
|
||||
sin = MathUtils.sinDeg(r);
|
||||
float psx = parent.appliedScaleX, psy = parent.appliedScaleY;
|
||||
float za = cos * psx, zb = -sin * psy, zc = sin * psx, zd = cos * psy;
|
||||
float temp = pa * za + pb * zc;
|
||||
@ -174,9 +172,9 @@ public class Bone implements Updatable {
|
||||
pd = pc * zb + pd * zd;
|
||||
pc = temp;
|
||||
|
||||
if (psx < 0) rotation = -rotation;
|
||||
cos = (float)Math.cos(-rotation);
|
||||
sin = (float)Math.sin(-rotation);
|
||||
if (psx < 0) r = -r;
|
||||
cos = MathUtils.cosDeg(-r);
|
||||
sin = MathUtils.sinDeg(-r);
|
||||
temp = pa * cos + pb * sin;
|
||||
pb = pa * -sin + pb * cos;
|
||||
pa = temp;
|
||||
@ -318,11 +316,11 @@ public class Bone implements Updatable {
|
||||
}
|
||||
|
||||
public float getWorldRotationX () {
|
||||
return (float)Math.atan2(c, a) * MathUtils.radDeg;
|
||||
return MathUtils.atan2(c, a) * MathUtils.radDeg;
|
||||
}
|
||||
|
||||
public float getWorldRotationY () {
|
||||
return (float)Math.atan2(d, b) * MathUtils.radDeg;
|
||||
return MathUtils.atan2(d, b) * MathUtils.radDeg;
|
||||
}
|
||||
|
||||
public float getWorldScaleX () {
|
||||
|
||||
@ -124,7 +124,7 @@ public class IkConstraint implements Updatable {
|
||||
static public void apply (Bone bone, float targetX, float targetY, float alpha) {
|
||||
float parentRotation = bone.parent == null ? 0 : bone.parent.getWorldRotationX();
|
||||
float rotation = bone.rotation;
|
||||
float rotationIK = (float)Math.atan2(targetY - bone.worldY, targetX - bone.worldX) * radDeg - parentRotation;
|
||||
float rotationIK = atan2(targetY - bone.worldY, targetX - bone.worldX) * radDeg - parentRotation;
|
||||
if ((bone.worldSignX != bone.worldSignY) != (bone.skeleton.flipX != bone.skeleton.flipY)) rotationIK = 360 - rotationIK;
|
||||
if (rotationIK > 180)
|
||||
rotationIK -= 360;
|
||||
@ -190,10 +190,10 @@ public class IkConstraint implements Updatable {
|
||||
cos = -1;
|
||||
else if (cos > 1) cos = 1;
|
||||
a2 = (float)Math.acos(cos) * bendDir;
|
||||
float a = l1 + l2 * cos, o = l2 * (float)Math.sin(a2);
|
||||
a1 = (float)Math.atan2(ty * a - tx * o, tx * a + ty * o);
|
||||
float a = l1 + l2 * cos, o = l2 * sin(a2);
|
||||
a1 = atan2(ty * a - tx * o, tx * a + ty * o);
|
||||
} else {
|
||||
float a = psx * l2, b = psy * l2, ta = (float)Math.atan2(ty, tx);
|
||||
float a = psx * l2, b = psy * l2, ta = atan2(ty, tx);
|
||||
float aa = a * a, bb = b * b, ll = l1 * l1, dd = tx * tx + ty * ty;
|
||||
float c0 = bb * ll + aa * dd - aa * bb, c1 = -2 * bb * l1, c2 = bb - aa;
|
||||
float d = c1 * c1 - 4 * c2 * c0;
|
||||
@ -205,8 +205,8 @@ public class IkConstraint implements Updatable {
|
||||
float r = Math.abs(r0) < Math.abs(r1) ? r0 : r1;
|
||||
if (r * r <= dd) {
|
||||
float y = (float)Math.sqrt(dd - r * r) * bendDir;
|
||||
a1 = ta - (float)Math.atan2(y, r);
|
||||
a2 = (float)Math.atan2(y / psy, (r - l1) / psx);
|
||||
a1 = ta - atan2(y, r);
|
||||
a2 = atan2(y / psy, (r - l1) / psx);
|
||||
break outer;
|
||||
}
|
||||
}
|
||||
@ -226,8 +226,8 @@ public class IkConstraint implements Updatable {
|
||||
minX = x;
|
||||
}
|
||||
float angle = (float)Math.acos(-a * l1 / (aa - bb));
|
||||
x = a * (float)Math.cos(angle) + l1;
|
||||
float y = b * (float)Math.sin(angle);
|
||||
x = a * cos(angle) + l1;
|
||||
float y = b * sin(angle);
|
||||
dist = x * x + y * y;
|
||||
if (dist < minDist) {
|
||||
minAngle = angle;
|
||||
@ -242,14 +242,14 @@ public class IkConstraint implements Updatable {
|
||||
maxY = y;
|
||||
}
|
||||
if (dd <= (minDist + maxDist) / 2) {
|
||||
a1 = ta - (float)Math.atan2(minY * bendDir, minX);
|
||||
a1 = ta - atan2(minY * bendDir, minX);
|
||||
a2 = minAngle * bendDir;
|
||||
} else {
|
||||
a1 = ta - (float)Math.atan2(maxY * bendDir, maxX);
|
||||
a1 = ta - atan2(maxY * bendDir, maxX);
|
||||
a2 = maxAngle * bendDir;
|
||||
}
|
||||
}
|
||||
float os = (float)Math.atan2(cy, cx) * s2;
|
||||
float os = atan2(cy, cx) * s2;
|
||||
a1 = (a1 - os) * radDeg + os1;
|
||||
a2 = (a2 + os) * radDeg * s2 + os2;
|
||||
if (a1 > 180)
|
||||
|
||||
@ -92,9 +92,9 @@ public class RegionAttachment extends Attachment {
|
||||
localY *= scaleY;
|
||||
localX2 *= scaleX;
|
||||
localY2 *= scaleY;
|
||||
float rotation = getRotation() * MathUtils.degRad;
|
||||
float cos = (float)Math.cos(rotation);
|
||||
float sin = (float)Math.sin(rotation);
|
||||
float rotation = getRotation();
|
||||
float cos = MathUtils.cosDeg(rotation);
|
||||
float sin = MathUtils.sinDeg(rotation);
|
||||
float x = getX();
|
||||
float y = getY();
|
||||
float localXCos = localX * cos + x;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user