mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
[csharp] Port TransformConstraint changes. See #2150. Changed Skeleton scaleX and scaleY from private to internal.
This commit is contained in:
parent
a1842c214e
commit
34a7eeb56d
@ -173,7 +173,7 @@ namespace Spine {
|
|||||||
|
|
||||||
Bone parent = this.parent;
|
Bone parent = this.parent;
|
||||||
if (parent == null) { // Root bone.
|
if (parent == null) { // Root bone.
|
||||||
float rotationY = rotation + 90 + shearY, sx = skeleton.ScaleX, sy = skeleton.ScaleY;
|
float rotationY = rotation + 90 + shearY, sx = skeleton.scaleX, sy = skeleton.scaleY;
|
||||||
a = MathUtils.CosDeg(rotation + shearX) * scaleX * sx;
|
a = MathUtils.CosDeg(rotation + shearX) * scaleX * sx;
|
||||||
b = MathUtils.CosDeg(rotationY) * scaleY * sx;
|
b = MathUtils.CosDeg(rotationY) * scaleY * sx;
|
||||||
c = MathUtils.SinDeg(rotation + shearX) * scaleX * sy;
|
c = MathUtils.SinDeg(rotation + shearX) * scaleX * sy;
|
||||||
@ -212,8 +212,8 @@ namespace Spine {
|
|||||||
float s = pa * pa + pc * pc, prx;
|
float s = pa * pa + pc * pc, prx;
|
||||||
if (s > 0.0001f) {
|
if (s > 0.0001f) {
|
||||||
s = Math.Abs(pa * pd - pb * pc) / s;
|
s = Math.Abs(pa * pd - pb * pc) / s;
|
||||||
pa /= skeleton.ScaleX;
|
pa /= skeleton.scaleX;
|
||||||
pc /= skeleton.ScaleY;
|
pc /= skeleton.scaleY;
|
||||||
pb = pc * s;
|
pb = pc * s;
|
||||||
pd = pa * s;
|
pd = pa * s;
|
||||||
prx = MathUtils.Atan2(pc, pa) * MathUtils.RadDeg;
|
prx = MathUtils.Atan2(pc, pa) * MathUtils.RadDeg;
|
||||||
@ -237,15 +237,15 @@ namespace Spine {
|
|||||||
case TransformMode.NoScale:
|
case TransformMode.NoScale:
|
||||||
case TransformMode.NoScaleOrReflection: {
|
case TransformMode.NoScaleOrReflection: {
|
||||||
float cos = MathUtils.CosDeg(rotation), sin = MathUtils.SinDeg(rotation);
|
float cos = MathUtils.CosDeg(rotation), sin = MathUtils.SinDeg(rotation);
|
||||||
float za = (pa * cos + pb * sin) / skeleton.ScaleX;
|
float za = (pa * cos + pb * sin) / skeleton.scaleX;
|
||||||
float zc = (pc * cos + pd * sin) / skeleton.ScaleY;
|
float zc = (pc * cos + pd * sin) / skeleton.scaleY;
|
||||||
float s = (float)Math.Sqrt(za * za + zc * zc);
|
float s = (float)Math.Sqrt(za * za + zc * zc);
|
||||||
if (s > 0.00001f) s = 1 / s;
|
if (s > 0.00001f) s = 1 / s;
|
||||||
za *= s;
|
za *= s;
|
||||||
zc *= s;
|
zc *= s;
|
||||||
s = (float)Math.Sqrt(za * za + zc * zc);
|
s = (float)Math.Sqrt(za * za + zc * zc);
|
||||||
if (data.transformMode == TransformMode.NoScale
|
if (data.transformMode == TransformMode.NoScale
|
||||||
&& (pa * pd - pb * pc < 0) != (skeleton.ScaleX < 0 != skeleton.ScaleY < 0)) s = -s;
|
&& (pa * pd - pb * pc < 0) != (skeleton.scaleX < 0 != skeleton.scaleY < 0)) s = -s;
|
||||||
|
|
||||||
float r = MathUtils.PI / 2 + MathUtils.Atan2(zc, za);
|
float r = MathUtils.PI / 2 + MathUtils.Atan2(zc, za);
|
||||||
float zb = MathUtils.Cos(r) * s;
|
float zb = MathUtils.Cos(r) * s;
|
||||||
@ -262,10 +262,10 @@ namespace Spine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
a *= skeleton.ScaleX;
|
a *= skeleton.scaleX;
|
||||||
b *= skeleton.ScaleX;
|
b *= skeleton.scaleX;
|
||||||
c *= skeleton.ScaleY;
|
c *= skeleton.scaleY;
|
||||||
d *= skeleton.ScaleY;
|
d *= skeleton.scaleY;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetToSetupPose () {
|
public void SetToSetupPose () {
|
||||||
@ -303,23 +303,65 @@ namespace Spine {
|
|||||||
}
|
}
|
||||||
float pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;
|
float pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;
|
||||||
float pid = 1 / (pa * pd - pb * pc);
|
float pid = 1 / (pa * pd - pb * pc);
|
||||||
|
float ia = pd * pid, ib = pb * pid, ic = pc * pid, id = pa * pid;
|
||||||
float dx = worldX - parent.worldX, dy = worldY - parent.worldY;
|
float dx = worldX - parent.worldX, dy = worldY - parent.worldY;
|
||||||
ax = (dx * pd * pid - dy * pb * pid);
|
|
||||||
ay = (dy * pa * pid - dx * pc * pid);
|
ax = (dx * ia - dy * ib);
|
||||||
float ia = pid * pd;
|
ay = (dy * id - dx * ic);
|
||||||
float id = pid * pa;
|
|
||||||
float ib = pid * pb;
|
float ra, rb, rc, rd;
|
||||||
float ic = pid * pc;
|
if (data.transformMode == TransformMode.OnlyTranslation) {
|
||||||
float ra = ia * a - ib * c;
|
ra = a;
|
||||||
float rb = ia * b - ib * d;
|
rb = b;
|
||||||
float rc = id * c - ic * a;
|
rc = c;
|
||||||
float rd = id * d - ic * b;
|
rd = d;
|
||||||
|
} else {
|
||||||
|
switch (data.transformMode) {
|
||||||
|
case TransformMode.NoRotationOrReflection: {
|
||||||
|
float s = Math.Abs(pa * pd - pb * pc) / (pa * pa + pc * pc);
|
||||||
|
float sa = pa / skeleton.scaleX;
|
||||||
|
float sc = pc / skeleton.scaleY;
|
||||||
|
pb = -sc * s * skeleton.scaleX;
|
||||||
|
pd = sa * s * skeleton.scaleY;
|
||||||
|
pid = 1 / (pa * pd - pb * pc);
|
||||||
|
ia = pd * pid;
|
||||||
|
ib = pb * pid;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TransformMode.NoScale:
|
||||||
|
case TransformMode.NoScaleOrReflection: {
|
||||||
|
float cos = MathUtils.CosDeg(rotation), sin = MathUtils.SinDeg(rotation);
|
||||||
|
pa = (pa * cos + pb * sin) / skeleton.scaleX;
|
||||||
|
pc = (pc * cos + pd * sin) / skeleton.scaleY;
|
||||||
|
float s = (float)Math.Sqrt(pa * pa + pc * pc);
|
||||||
|
if (s > 0.00001f) s = 1 / s;
|
||||||
|
pa *= s;
|
||||||
|
pc *= s;
|
||||||
|
s = (float)Math.Sqrt(pa * pa + pc * pc);
|
||||||
|
if (data.transformMode == TransformMode.NoScale && pid < 0 != (skeleton.scaleX < 0 != skeleton.scaleY < 0)) s = -s;
|
||||||
|
float r = MathUtils.PI / 2 + MathUtils.Atan2(pc, pa);
|
||||||
|
pb = MathUtils.Cos(r) * s;
|
||||||
|
pd = MathUtils.Sin(r) * s;
|
||||||
|
pid = 1 / (pa * pd - pb * pc);
|
||||||
|
ia = pd * pid;
|
||||||
|
ib = pb * pid;
|
||||||
|
ic = pc * pid;
|
||||||
|
id = pa * pid;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ra = ia * a - ib * c;
|
||||||
|
rb = ia * b - ib * d;
|
||||||
|
rc = id * c - ic * a;
|
||||||
|
rd = id * d - ic * b;
|
||||||
|
}
|
||||||
|
|
||||||
ashearX = 0;
|
ashearX = 0;
|
||||||
ascaleX = (float)Math.Sqrt(ra * ra + rc * rc);
|
ascaleX = (float)Math.Sqrt(ra * ra + rc * rc);
|
||||||
if (ascaleX > 0.0001f) {
|
if (ascaleX > 0.0001f) {
|
||||||
float det = ra * rd - rb * rc;
|
float det = ra * rd - rb * rc;
|
||||||
ascaleY = det / ascaleX;
|
ascaleY = det / ascaleX;
|
||||||
ashearY = MathUtils.Atan2(ra * rb + rc * rd, det) * MathUtils.RadDeg;
|
ashearY = -MathUtils.Atan2(ra * rb + rc * rd, det) * MathUtils.RadDeg;
|
||||||
arotation = MathUtils.Atan2(rc, ra) * MathUtils.RadDeg;
|
arotation = MathUtils.Atan2(rc, ra) * MathUtils.RadDeg;
|
||||||
} else {
|
} else {
|
||||||
ascaleX = 0;
|
ascaleX = 0;
|
||||||
|
|||||||
@ -173,10 +173,10 @@ namespace Spine {
|
|||||||
break;
|
break;
|
||||||
case TransformMode.NoRotationOrReflection: {
|
case TransformMode.NoRotationOrReflection: {
|
||||||
float s = Math.Abs(pa * pd - pb * pc) / (pa * pa + pc * pc);
|
float s = Math.Abs(pa * pd - pb * pc) / (pa * pa + pc * pc);
|
||||||
float sa = pa / bone.skeleton.ScaleX;
|
float sa = pa / bone.skeleton.scaleX;
|
||||||
float sc = pc / bone.skeleton.ScaleY;
|
float sc = pc / bone.skeleton.scaleY;
|
||||||
pb = -sc * s * bone.skeleton.ScaleX;
|
pb = -sc * s * bone.skeleton.scaleX;
|
||||||
pd = sa * s * bone.skeleton.ScaleY;
|
pd = sa * s * bone.skeleton.scaleY;
|
||||||
rotationIK += (float)Math.Atan2(sc, sa) * MathUtils.RadDeg;
|
rotationIK += (float)Math.Atan2(sc, sa) * MathUtils.RadDeg;
|
||||||
goto default; // Fall through.
|
goto default; // Fall through.
|
||||||
}
|
}
|
||||||
|
|||||||
@ -42,7 +42,7 @@ namespace Spine {
|
|||||||
internal ExposedList<IUpdatable> updateCache = new ExposedList<IUpdatable>();
|
internal ExposedList<IUpdatable> updateCache = new ExposedList<IUpdatable>();
|
||||||
internal Skin skin;
|
internal Skin skin;
|
||||||
internal float r = 1, g = 1, b = 1, a = 1;
|
internal float r = 1, g = 1, b = 1, a = 1;
|
||||||
private float scaleX = 1, scaleY = 1;
|
internal float scaleX = 1, scaleY = 1;
|
||||||
internal float x, y;
|
internal float x, y;
|
||||||
|
|
||||||
public SkeletonData Data { get { return data; } }
|
public SkeletonData Data { get { return data; } }
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user