mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
[ts] Port of #2150
This commit is contained in:
parent
52376a0a24
commit
7f9d4c0308
@ -309,23 +309,62 @@ export class Bone implements Updatable {
|
|||||||
}
|
}
|
||||||
let pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;
|
let pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;
|
||||||
let pid = 1 / (pa * pd - pb * pc);
|
let pid = 1 / (pa * pd - pb * pc);
|
||||||
|
let ia = pd * pid, ib = pb * pid, ic = pc * pid, id = pa * pid;
|
||||||
let dx = this.worldX - parent.worldX, dy = this.worldY - parent.worldY;
|
let dx = this.worldX - parent.worldX, dy = this.worldY - parent.worldY;
|
||||||
this.ax = (dx * pd * pid - dy * pb * pid);
|
this.ax = (dx * ia - dy * ib);
|
||||||
this.ay = (dy * pa * pid - dx * pc * pid);
|
this.ay = (dy * id - dx * ic);
|
||||||
let ia = pid * pd;
|
|
||||||
let id = pid * pa;
|
let ra, rb, rc, rd;
|
||||||
let ib = pid * pb;
|
if (this.data.transformMode == TransformMode.OnlyTranslation) {
|
||||||
let ic = pid * pc;
|
ra = this.a;
|
||||||
let ra = ia * this.a - ib * this.c;
|
rb = this.b;
|
||||||
let rb = ia * this.b - ib * this.d;
|
rc = this.c;
|
||||||
let rc = id * this.c - ic * this.a;
|
rd = this.d;
|
||||||
let rd = id * this.d - ic * this.b;
|
} else {
|
||||||
|
switch (this.data.transformMode) {
|
||||||
|
case TransformMode.NoRotationOrReflection: {
|
||||||
|
let s = Math.abs(pa * pd - pb * pc) / (pa * pa + pc * pc);
|
||||||
|
let sa = pa / this.skeleton.scaleX;
|
||||||
|
let sc = pc / this.skeleton.scaleY;
|
||||||
|
pb = -sc * s * this.skeleton.scaleX;
|
||||||
|
pd = sa * s * this.skeleton.scaleY;
|
||||||
|
pid = 1 / (pa * pd - pb * pc);
|
||||||
|
ia = pd * pid;
|
||||||
|
ib = pb * pid;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TransformMode.NoScale:
|
||||||
|
case TransformMode.NoScaleOrReflection:
|
||||||
|
let cos = MathUtils.cosDeg(this.rotation), sin = MathUtils.sinDeg(this.rotation);
|
||||||
|
pa = (pa * cos + pb * sin) / this.skeleton.scaleX;
|
||||||
|
pc = (pc * cos + pd * sin) / this.skeleton.scaleY;
|
||||||
|
let s = Math.sqrt(pa * pa + pc * pc);
|
||||||
|
if (s > 0.00001) s = 1 / s;
|
||||||
|
pa *= s;
|
||||||
|
pc *= s;
|
||||||
|
s = Math.sqrt(pa * pa + pc * pc);
|
||||||
|
if (this.data.transformMode == TransformMode.NoScale && pid < 0 != (this.skeleton.scaleX < 0 != this.skeleton.scaleY < 0)) s = -s;
|
||||||
|
let r = MathUtils.PI / 2 + Math.atan2(pc, pa);
|
||||||
|
pb = Math.cos(r) * s;
|
||||||
|
pd = Math.sin(r) * s;
|
||||||
|
pid = 1 / (pa * pd - pb * pc);
|
||||||
|
ia = pd * pid;
|
||||||
|
ib = pb * pid;
|
||||||
|
ic = pc * pid;
|
||||||
|
id = pa * pid;
|
||||||
|
}
|
||||||
|
ra = ia * this.a - ib * this.c;
|
||||||
|
rb = ia * this.b - ib * this.d;
|
||||||
|
rc = id * this.c - ic * this.a;
|
||||||
|
rd = id * this.d - ic * this.b;
|
||||||
|
}
|
||||||
|
|
||||||
this.ashearX = 0;
|
this.ashearX = 0;
|
||||||
this.ascaleX = Math.sqrt(ra * ra + rc * rc);
|
this.ascaleX = Math.sqrt(ra * ra + rc * rc);
|
||||||
if (this.ascaleX > 0.0001) {
|
if (this.ascaleX > 0.0001) {
|
||||||
let det = ra * rd - rb * rc;
|
let det = ra * rd - rb * rc;
|
||||||
this.ascaleY = det / this.ascaleX;
|
this.ascaleY = det / this.ascaleX;
|
||||||
this.ashearY = Math.atan2(ra * rb + rc * rd, det) * MathUtils.radDeg;
|
this.ashearY = -Math.atan2(ra * rb + rc * rd, det) * MathUtils.radDeg;
|
||||||
this.arotation = Math.atan2(rc, ra) * MathUtils.radDeg;
|
this.arotation = Math.atan2(rc, ra) * MathUtils.radDeg;
|
||||||
} else {
|
} else {
|
||||||
this.ascaleX = 0;
|
this.ascaleX = 0;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user