UNPKG

@pixi-spine/runtime-3.8

Version:

Pixi runtime for spine 3.8 models

1 lines 23.7 kB
{"version":3,"file":"IkConstraint.mjs","sources":["../../src/core/IkConstraint.ts"],"sourcesContent":["import type { Updatable } from './Updatable';\nimport type { IkConstraintData } from './IkConstraintData';\nimport type { Bone } from './Bone';\nimport type { Skeleton } from './Skeleton';\nimport { IIkConstraint, MathUtils, TransformMode } from '@pixi-spine/base';\n\n/**\n * @public\n */\nexport class IkConstraint implements IIkConstraint, Updatable {\n data: IkConstraintData;\n bones: Array<Bone>;\n target: Bone;\n bendDirection = 0;\n compress = false;\n stretch = false;\n mix = 1;\n softness = 0;\n active = false;\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.softness = data.softness;\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 isActive() {\n return this.active;\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.softness, 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\n const pa = p.a;\n let pb = p.c;\n const pc = p.b;\n let pd = p.d;\n let rotationIK = -bone.ashearX - bone.arotation;\n let tx = 0;\n let ty = 0;\n\n switch (bone.data.transformMode) {\n case TransformMode.OnlyTranslation:\n tx = targetX - bone.worldX;\n ty = targetY - bone.worldY;\n break;\n case TransformMode.NoRotationOrReflection:\n const s = Math.abs(pa * pd - pb * pc) / (pa * pa + pc * pc);\n const sa = pa / bone.skeleton.scaleX;\n const sc = pc / bone.skeleton.scaleY;\n\n pb = -sc * s * bone.skeleton.scaleX;\n pd = sa * s * bone.skeleton.scaleY;\n rotationIK += Math.atan2(sc, sa) * MathUtils.radDeg;\n // Fall through\n default:\n const x = targetX - p.tx;\n const y = targetY - p.ty;\n const d = pa * pd - pb * pc;\n\n tx = (x * pd - y * pb) / d - bone.ax;\n ty = (y * pa - x * pc) / d - bone.ay;\n }\n rotationIK += Math.atan2(ty, tx) * MathUtils.radDeg;\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 switch (bone.data.transformMode) {\n case TransformMode.NoScale:\n case TransformMode.NoScaleOrReflection:\n tx = targetX - bone.worldX;\n ty = targetY - bone.worldY;\n }\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, softness: number, 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 = cwx - pp.tx;\n let 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;\n let a2;\n\n if (l1 < 0.0001) {\n this.apply1(parent, targetX, targetY, false, stretch, false, alpha);\n child.updateWorldTransformWith(cx, cy, 0, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);\n\n return;\n }\n x = targetX - pp.tx;\n y = targetY - pp.ty;\n let tx = (x * d - y * b) * id - px;\n let ty = (y * a - x * c) * id - py;\n let dd = tx * tx + ty * ty;\n\n if (softness != 0) {\n softness *= (psx * (csx + 1)) / 2;\n const td = Math.sqrt(dd);\n const sd = td - l1 - l2 * psx + softness;\n\n if (sd > 0) {\n let p = Math.min(1, sd / (softness * 2)) - 1;\n\n p = (sd - softness * (1 - p * p)) / td;\n tx -= p * tx;\n ty -= p * ty;\n dd = tx * tx + ty * ty;\n }\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) 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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"}