UNPKG

@pixi-spine/runtime-3.7

Version:

Pixi runtime for spine 3.7 models

1 lines 19.7 kB
{"version":3,"file":"IkConstraint.mjs","sources":["../../src/core/IkConstraint.ts"],"sourcesContent":["import type { Constraint } from './Constraint';\nimport type { IkConstraintData } from './IkConstraintData';\nimport type { Bone } from './Bone';\nimport type { Skeleton } from './Skeleton';\nimport { MathUtils } from '@pixi-spine/base';\n\n/**\n * @public\n */\nexport class IkConstraint implements Constraint {\n data: IkConstraintData;\n bones: Array<Bone>;\n target: Bone;\n bendDirection = 0;\n compress = false;\n stretch = false;\n mix = 1;\n\n constructor(data: IkConstraintData, skeleton: Skeleton) {\n if (data == null) throw new Error('data cannot be null.');\n if (skeleton == null) throw new Error('skeleton cannot be null.');\n this.data = data;\n this.mix = data.mix;\n this.bendDirection = data.bendDirection;\n this.compress = data.compress;\n this.stretch = data.stretch;\n\n this.bones = new Array<Bone>();\n for (let i = 0; i < data.bones.length; i++) this.bones.push(skeleton.findBone(data.bones[i].name));\n this.target = skeleton.findBone(data.target.name);\n }\n\n getOrder() {\n return this.data.order;\n }\n\n apply() {\n this.update();\n }\n\n update() {\n const target = this.target;\n const bones = this.bones;\n\n switch (bones.length) {\n case 1:\n this.apply1(bones[0], target.worldX, target.worldY, this.compress, this.stretch, this.data.uniform, this.mix);\n break;\n case 2:\n this.apply2(bones[0], bones[1], target.worldX, target.worldY, this.bendDirection, this.stretch, this.mix);\n break;\n }\n }\n\n /** Adjusts the bone rotation so the tip is as close to the target position as possible. The target is specified in the world\n * coordinate system. */\n apply1(bone: Bone, targetX: number, targetY: number, compress: boolean, stretch: boolean, uniform: boolean, alpha: number) {\n if (!bone.appliedValid) bone.updateAppliedTransform();\n const p = bone.parent.matrix;\n const id = 1 / (p.a * p.d - p.b * p.c);\n const x = targetX - p.tx;\n const y = targetY - p.ty;\n const tx = (x * p.d - y * p.c) * id - bone.ax;\n const ty = (y * p.a - x * p.b) * id - bone.ay;\n let rotationIK = Math.atan2(ty, tx) * MathUtils.radDeg - bone.ashearX - bone.arotation;\n\n if (bone.ascaleX < 0) rotationIK += 180;\n if (rotationIK > 180) rotationIK -= 360;\n else if (rotationIK < -180) rotationIK += 360;\n let sx = bone.ascaleX;\n let sy = bone.ascaleY;\n\n if (compress || stretch) {\n const b = bone.data.length * sx;\n const dd = Math.sqrt(tx * tx + ty * ty);\n\n if ((compress && dd < b) || (stretch && dd > b && b > 0.0001)) {\n const s = (dd / b - 1) * alpha + 1;\n\n sx *= s;\n if (uniform) sy *= s;\n }\n }\n bone.updateWorldTransformWith(bone.ax, bone.ay, bone.arotation + rotationIK * alpha, sx, sy, bone.ashearX, bone.ashearY);\n }\n\n /** Adjusts the parent and child bone rotations so the tip of the child is as close to the target position as possible. The\n * target is specified in the world coordinate system.\n * @param child A direct descendant of the parent bone. */\n apply2(parent: Bone, child: Bone, targetX: number, targetY: number, bendDir: number, stretch: boolean, alpha: number) {\n if (alpha == 0) {\n child.updateWorldTransform();\n\n return;\n }\n if (!parent.appliedValid) parent.updateAppliedTransform();\n if (!child.appliedValid) child.updateAppliedTransform();\n const px = parent.ax;\n const py = parent.ay;\n let psx = parent.ascaleX;\n let sx = psx;\n let psy = parent.ascaleY;\n let csx = child.ascaleX;\n const pmat = parent.matrix;\n let os1 = 0;\n let os2 = 0;\n let s2 = 0;\n\n if (psx < 0) {\n psx = -psx;\n os1 = 180;\n s2 = -1;\n } else {\n os1 = 0;\n s2 = 1;\n }\n if (psy < 0) {\n psy = -psy;\n s2 = -s2;\n }\n if (csx < 0) {\n csx = -csx;\n os2 = 180;\n } else os2 = 0;\n const cx = child.ax;\n let cy = 0;\n let cwx = 0;\n let cwy = 0;\n let a = pmat.a;\n let b = pmat.c;\n let c = pmat.b;\n let d = pmat.d;\n const u = Math.abs(psx - psy) <= 0.0001;\n\n if (!u) {\n cy = 0;\n cwx = a * cx + pmat.tx;\n cwy = c * cx + pmat.ty;\n } else {\n cy = child.ay;\n cwx = a * cx + b * cy + pmat.tx;\n cwy = c * cx + d * cy + pmat.ty;\n }\n const pp = parent.parent.matrix;\n\n a = pp.a;\n b = pp.c;\n c = pp.b;\n d = pp.d;\n const id = 1 / (a * d - b * c);\n let x = targetX - pp.tx;\n let y = targetY - pp.ty;\n const tx = (x * d - y * b) * id - px;\n const ty = (y * a - x * c) * id - py;\n const dd = tx * tx + ty * ty;\n\n x = cwx - pp.tx;\n y = cwy - pp.ty;\n const dx = (x * d - y * b) * id - px;\n const dy = (y * a - x * c) * id - py;\n const l1 = Math.sqrt(dx * dx + dy * dy);\n let l2 = child.data.length * csx;\n let a1 = 0;\n let a2 = 0;\n\n // eslint-disable-next-line no-restricted-syntax, no-labels\n outer: if (u) {\n l2 *= psx;\n let cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2);\n\n if (cos < -1) cos = -1;\n else if (cos > 1) {\n cos = 1;\n if (stretch && l1 + l2 > 0.0001) sx *= (Math.sqrt(dd) / (l1 + l2) - 1) * alpha + 1;\n }\n a2 = Math.acos(cos) * bendDir;\n a = l1 + l2 * cos;\n b = l2 * Math.sin(a2);\n a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b);\n } else {\n a = psx * l2;\n b = psy * l2;\n const aa = a * a;\n const bb = b * b;\n const ta = Math.atan2(ty, tx);\n\n c = bb * l1 * l1 + aa * dd - aa * bb;\n const c1 = -2 * bb * l1;\n const c2 = bb - aa;\n\n d = c1 * c1 - 4 * c2 * c;\n if (d >= 0) {\n let q = Math.sqrt(d);\n\n if (c1 < 0) q = -q;\n q = -(c1 + q) / 2;\n const r0 = q / c2;\n const r1 = c / q;\n const r = Math.abs(r0) < Math.abs(r1) ? r0 : r1;\n\n if (r * r <= dd) {\n y = Math.sqrt(dd - r * r) * bendDir;\n a1 = ta - Math.atan2(y, r);\n a2 = Math.atan2(y / psy, (r - l1) / psx);\n // eslint-disable-next-line no-labels\n break outer;\n }\n }\n let minAngle = MathUtils.PI;\n let minX = l1 - a;\n let minDist = minX * minX;\n let minY = 0;\n let maxAngle = 0;\n let maxX = l1 + a;\n let maxDist = maxX * maxX;\n let maxY = 0;\n\n c = (-a * l1) / (aa - bb);\n if (c >= -1 && c <= 1) {\n c = Math.acos(c);\n x = a * Math.cos(c) + l1;\n y = b * Math.sin(c);\n d = x * x + y * y;\n if (d < minDist) {\n minAngle = c;\n minDist = d;\n minX = x;\n minY = y;\n }\n if (d > maxDist) {\n maxAngle = c;\n maxDist = d;\n maxX = x;\n maxY = y;\n }\n }\n if (dd <= (minDist + maxDist) / 2) {\n a1 = ta - Math.atan2(minY * bendDir, minX);\n a2 = minAngle * bendDir;\n } else {\n a1 = ta - Math.atan2(maxY * bendDir, maxX);\n a2 = maxAngle * bendDir;\n }\n }\n const os = Math.atan2(cy, cx) * s2;\n let rotation = parent.arotation;\n\n a1 = (a1 - os) * MathUtils.radDeg + os1 - rotation;\n if (a1 > 180) a1 -= 360;\n else if (a1 < -180) a1 += 360;\n parent.updateWorldTransformWith(px, py, rotation + a1 * alpha, sx, parent.ascaleY, 0, 0);\n rotation = child.arotation;\n a2 = ((a2 + os) * MathUtils.radDeg - child.ashearX) * s2 + os2 - rotation;\n if (a2 > 180) a2 -= 360;\n else if (a2 < -180) a2 += 360;\n child.updateWorldTransformWith(cx, cy, rotation + a2 * alpha, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);\n }\n}\n"],"names":[],"mappings":"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"}