@datamoc/mw_games 0.37.0 → 0.39.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/README.md +26 -0
  3. package/api-surface.json +650 -2
  4. package/dist/assets/SvgParts.d.ts +31 -0
  5. package/dist/assets/SvgParts.d.ts.map +1 -0
  6. package/dist/assets/SvgParts.js +54 -0
  7. package/dist/assets/SvgParts.js.map +1 -0
  8. package/dist/assets/SvgSource.d.ts +3 -0
  9. package/dist/assets/SvgSource.d.ts.map +1 -0
  10. package/dist/assets/SvgSource.js +22 -0
  11. package/dist/assets/SvgSource.js.map +1 -0
  12. package/dist/assets/index.d.ts +2 -0
  13. package/dist/assets/index.d.ts.map +1 -1
  14. package/dist/assets/index.js +1 -0
  15. package/dist/assets/index.js.map +1 -1
  16. package/dist/assets/svg.d.ts.map +1 -1
  17. package/dist/assets/svg.js +9 -5
  18. package/dist/assets/svg.js.map +1 -1
  19. package/dist/mw_games.global.js +110 -110
  20. package/dist/mwl/presentation.d.ts +70 -0
  21. package/dist/mwl/presentation.d.ts.map +1 -0
  22. package/dist/mwl/presentation.js +419 -0
  23. package/dist/mwl/presentation.js.map +1 -0
  24. package/dist/physics/PhysicsWorld.d.ts +49 -17
  25. package/dist/physics/PhysicsWorld.d.ts.map +1 -1
  26. package/dist/physics/PhysicsWorld.js +297 -59
  27. package/dist/physics/PhysicsWorld.js.map +1 -1
  28. package/dist/physics/XpbdWorld.d.ts +1 -1
  29. package/dist/physics/XpbdWorld.js +1 -1
  30. package/dist/physics/cloth/index.d.ts +98 -0
  31. package/dist/physics/cloth/index.d.ts.map +1 -0
  32. package/dist/physics/cloth/index.js +207 -0
  33. package/dist/physics/cloth/index.js.map +1 -0
  34. package/dist/physics/index.d.ts +4 -0
  35. package/dist/physics/index.d.ts.map +1 -1
  36. package/dist/physics/index.js +2 -0
  37. package/dist/physics/index.js.map +1 -1
  38. package/dist/physics/spring/index.d.ts +90 -0
  39. package/dist/physics/spring/index.d.ts.map +1 -0
  40. package/dist/physics/spring/index.js +97 -0
  41. package/dist/physics/spring/index.js.map +1 -0
  42. package/dist/skeleton/index.d.ts +94 -13
  43. package/dist/skeleton/index.d.ts.map +1 -1
  44. package/dist/skeleton/index.js +192 -73
  45. package/dist/skeleton/index.js.map +1 -1
  46. package/dist/two-d/presentation/MwlPresentation.d.ts +110 -0
  47. package/dist/two-d/presentation/MwlPresentation.d.ts.map +1 -0
  48. package/dist/two-d/presentation/MwlPresentation.js +755 -0
  49. package/dist/two-d/presentation/MwlPresentation.js.map +1 -0
  50. package/dist/two-d/presentation/index.d.ts +3 -0
  51. package/dist/two-d/presentation/index.d.ts.map +1 -0
  52. package/dist/two-d/presentation/index.js +2 -0
  53. package/dist/two-d/presentation/index.js.map +1 -0
  54. package/dist/two-d/render/ClothSprite.d.ts +83 -0
  55. package/dist/two-d/render/ClothSprite.d.ts.map +1 -0
  56. package/dist/two-d/render/ClothSprite.js +105 -0
  57. package/dist/two-d/render/ClothSprite.js.map +1 -0
  58. package/dist/two-d/render/HazeLayer.d.ts +112 -0
  59. package/dist/two-d/render/HazeLayer.d.ts.map +1 -0
  60. package/dist/two-d/render/HazeLayer.js +185 -0
  61. package/dist/two-d/render/HazeLayer.js.map +1 -0
  62. package/dist/two-d/render/NeonGlow.d.ts +100 -0
  63. package/dist/two-d/render/NeonGlow.d.ts.map +1 -0
  64. package/dist/two-d/render/NeonGlow.js +183 -0
  65. package/dist/two-d/render/NeonGlow.js.map +1 -0
  66. package/dist/two-d/render/SkeletalSprite.d.ts +5 -2
  67. package/dist/two-d/render/SkeletalSprite.d.ts.map +1 -1
  68. package/dist/two-d/render/SkeletalSprite.js +27 -3
  69. package/dist/two-d/render/SkeletalSprite.js.map +1 -1
  70. package/dist/two-d/render/SpringSprite.d.ts +40 -0
  71. package/dist/two-d/render/SpringSprite.d.ts.map +1 -0
  72. package/dist/two-d/render/SpringSprite.js +39 -0
  73. package/dist/two-d/render/SpringSprite.js.map +1 -0
  74. package/dist/two-d/render/SpriteDeform.d.ts +156 -0
  75. package/dist/two-d/render/SpriteDeform.d.ts.map +1 -0
  76. package/dist/two-d/render/SpriteDeform.js +278 -0
  77. package/dist/two-d/render/SpriteDeform.js.map +1 -0
  78. package/dist/two-d/render/SvgSkeleton.d.ts +54 -0
  79. package/dist/two-d/render/SvgSkeleton.d.ts.map +1 -0
  80. package/dist/two-d/render/SvgSkeleton.js +112 -0
  81. package/dist/two-d/render/SvgSkeleton.js.map +1 -0
  82. package/dist/two-d/render/index.d.ts +12 -0
  83. package/dist/two-d/render/index.d.ts.map +1 -1
  84. package/dist/two-d/render/index.js +6 -0
  85. package/dist/two-d/render/index.js.map +1 -1
  86. package/dist/two-d/ui/Bar.d.ts +3 -1
  87. package/dist/two-d/ui/Bar.d.ts.map +1 -1
  88. package/dist/two-d/ui/Bar.js +5 -0
  89. package/dist/two-d/ui/Bar.js.map +1 -1
  90. package/dist/two-d/ui/Button.d.ts +12 -0
  91. package/dist/two-d/ui/Button.d.ts.map +1 -1
  92. package/dist/two-d/ui/Button.js +16 -4
  93. package/dist/two-d/ui/Button.js.map +1 -1
  94. package/dist/two-d/ui/Window.d.ts +10 -0
  95. package/dist/two-d/ui/Window.d.ts.map +1 -1
  96. package/dist/two-d/ui/Window.js +17 -6
  97. package/dist/two-d/ui/Window.js.map +1 -1
  98. package/dist/two-d/ui/index.d.ts +2 -0
  99. package/dist/two-d/ui/index.d.ts.map +1 -1
  100. package/dist/two-d/ui/index.js.map +1 -1
  101. package/dist/version.d.ts +1 -1
  102. package/dist/version.js +1 -1
  103. package/package.json +24 -7
  104. package/sbom.cdx.json +6 -58
  105. package/tools/asset-report.d.mts +37 -0
  106. package/tools/asset-report.mjs +157 -0
  107. package/tools/compile-resources.d.mts +2 -0
  108. package/tools/compile-resources.mjs +23 -2
  109. package/tools/emit-page.d.mts +2 -0
  110. package/tools/emit-page.mjs +11 -1
  111. package/tools/verify-scenarios.d.mts +15 -0
  112. package/tools/verify-scenarios.mjs +129 -0
  113. package/tools/vite.mjs +4 -1
@@ -3,13 +3,14 @@
3
3
  *
4
4
  * The pose half of a skeletal puppet (roadmap 399), as pure data and arithmetic so it loads
5
5
  * headless and tests without a renderer - the same split every other module draws. A bone
6
- * is a name, a parent name, a length and a local rotation; a pose is one rotation per bone;
7
- * resolving a pose walks the tree so rotating an arm, a leg or a head is one number on one
8
- * bone and the rest of the body follows. Clips are keyframed poses over time - plain data a
9
- * game authors in JSON, never code, and never a borrowed game's animation data - with
10
- * interpolation, looping, a playback rate and a crossfade between clips. Additive layers
11
- * (aim on top of walk, hurt on top of idle) mix by priority, so a game composes motion
12
- * instead of authoring every combination as its own clip.
6
+ * is a name, a parent name, a length and a local rotation; a pose is one rotation per bone,
7
+ * with optional per-bone translations and scales riding the same timeline; resolving a pose
8
+ * walks the tree so rotating an arm, a leg or a head is one number on one bone and the rest
9
+ * of the body follows. Clips are keyframed poses over time - plain data a game authors in
10
+ * JSON, never code, and never a borrowed game's animation data - with interpolation,
11
+ * looping, a playback rate and a crossfade between clips. Additive layers (aim on top of
12
+ * walk, hurt on top of idle) mix by priority, so a game composes motion instead of
13
+ * authoring every combination as its own clip.
13
14
  *
14
15
  * @example
15
16
  * ```ts
@@ -33,13 +34,21 @@ export function boneOrder(skeleton) {
33
34
  const byName = new Map(skeleton.bones.map((bone) => [bone.name, bone]));
34
35
  const order = [];
35
36
  const placed = new Set();
37
+ const placing = new Set();
36
38
  const visit = (bone) => {
37
39
  if (placed.has(bone.name))
38
40
  return;
41
+ if (placing.has(bone.name))
42
+ throw new Error(`skeleton cycle involving ${bone.name}`);
39
43
  if (bone.parent && !byName.has(bone.parent))
40
44
  throw new Error(`skeleton bone ${bone.name} names no parent ${bone.parent}`);
41
- if (bone.parent)
42
- visit(byName.get(bone.parent));
45
+ if (bone.parent) {
46
+ placing.add(bone.name);
47
+ const parent = byName.get(bone.parent);
48
+ if (parent)
49
+ visit(parent);
50
+ placing.delete(bone.name);
51
+ }
43
52
  if (!placed.has(bone.name)) {
44
53
  placed.add(bone.name);
45
54
  order.push(bone.name);
@@ -49,13 +58,15 @@ export function boneOrder(skeleton) {
49
58
  visit(bone);
50
59
  return order;
51
60
  }
52
- /** create a skeleton, refusing duplicate names and cycles by name */
61
+ /** create a skeleton, refusing duplicate names, cycles and invalid joint limits by name */
53
62
  export function create(bones) {
54
63
  const names = new Set();
55
64
  for (const bone of bones) {
56
65
  if (names.has(bone.name))
57
66
  throw new Error(`duplicate skeleton bone ${bone.name}`);
58
67
  names.add(bone.name);
68
+ if (bone.limits && !(bone.limits.min <= bone.limits.max))
69
+ throw new Error(`invalid joint limits for bone ${bone.name}`);
59
70
  }
60
71
  const order = boneOrder({ bones });
61
72
  //boneOrder throws on a missing parent, which is also what a cycle surfaces as here
@@ -65,68 +76,98 @@ export function create(bones) {
65
76
  return { bones };
66
77
  }
67
78
  /**
68
- * A pose through the tree: each bone starts at its parent's tip plus its origin, rotated by
69
- * its rest rotation plus its pose rotation plus every ancestor's world rotation.
79
+ * A pose through the tree: each bone starts at its parent's tip plus its origin and
80
+ * translation, transformed by the parent's rotation and scale, and reaches along its
81
+ * own rotation and composed scale. Translations ride in the bone's rest frame; scales
82
+ * multiply down the chain, so a scaled parent carries its children with it.
70
83
  */
71
84
  export function resolve(skeleton, pose = {}) {
85
+ const rotations = typeof pose.rotations === 'object' ? pose.rotations : pose;
86
+ const translations = pose.translations ?? {};
87
+ const scales = pose.scales ?? {};
72
88
  const byName = new Map(skeleton.bones.map((bone) => [bone.name, bone]));
73
89
  const world = new Map();
74
90
  for (const name of boneOrder(skeleton)) {
75
91
  const bone = byName.get(name);
92
+ if (!bone)
93
+ throw new Error(`skeleton bone ${name} went missing`);
76
94
  const parent = bone.parent ? world.get(bone.parent) : undefined;
77
- const rotation = (bone.rotation ?? 0) + (pose[name] ?? 0);
78
- const angle = parent ? parent.angle + rotation : rotation;
95
+ const rotation = (bone.rotation ?? 0) + (rotations[name] ?? 0);
96
+ const angle = (parent ? parent.angle : 0) + rotation;
97
+ const scale = scales[name] ?? { x: 1, y: 1 };
98
+ const scaleX = (parent ? parent.scaleX : 1) * scale.x;
99
+ const scaleY = (parent ? parent.scaleY : 1) * scale.y;
100
+ const radians = (angle * Math.PI) / 180;
101
+ const matrix = {
102
+ a: Math.cos(radians) * scaleX,
103
+ b: Math.sin(radians) * scaleX,
104
+ c: -Math.sin(radians) * scaleY,
105
+ d: Math.cos(radians) * scaleY,
106
+ };
107
+ const parentMatrix = parent
108
+ ? { a: parent.matrix.a, b: parent.matrix.b, c: parent.matrix.c, d: parent.matrix.d }
109
+ : { a: 1, b: 0, c: 0, d: 1 };
79
110
  const originX = bone.origin?.x ?? 0;
80
111
  const originY = bone.origin?.y ?? 0;
81
- const x = parent ? parent.tipX : 0;
82
- const y = parent ? parent.tipY : 0;
83
- const radians = (angle * Math.PI) / 180;
112
+ const localX = originX + (translations[name]?.x ?? 0);
113
+ const localY = originY + (translations[name]?.y ?? 0);
114
+ const x = (parent ? parent.tipX : 0) + parentMatrix.a * localX + parentMatrix.c * localY;
115
+ const y = (parent ? parent.tipY : 0) + parentMatrix.b * localX + parentMatrix.d * localY;
116
+ for (const value of [matrix.a, matrix.b, matrix.c, matrix.d])
117
+ if (!Number.isFinite(value))
118
+ throw new Error(`invalid transform for bone ${name}`);
84
119
  world.set(name, {
85
120
  name,
86
121
  x,
87
122
  y,
88
123
  angle,
89
- tipX: x + originX + Math.cos(radians) * (bone.length ?? 0),
90
- tipY: y + originY + Math.sin(radians) * (bone.length ?? 0),
124
+ scaleX,
125
+ scaleY,
126
+ matrix,
127
+ tipX: x + matrix.a * (bone.length ?? 0),
128
+ tipY: y + matrix.b * (bone.length ?? 0),
91
129
  });
92
130
  }
93
131
  return [...world.values()];
94
132
  }
95
- /** the pose a clip shows at `time`: its frames interpolated, looped or held */
96
- export function samplePose(clip, time) {
133
+ /** the rotations a clip shows at `time`, interpolated, looped or held, validated */
134
+ export function samplePose(clip, time, skeleton) {
135
+ const result = { ...sampleTransformPose(clip, time, skeleton).rotations };
136
+ return result;
137
+ }
138
+ /** Sample every channel with the same timeline as rotations: holds the first frame
139
+ * before it, the last past the end of a one-shot, and wraps a looping clip.
140
+ * @example
141
+ * ```ts
142
+ * import { sampleTransformPose } from '@datamoc/mw_games/skeleton';
143
+ * const pose = sampleTransformPose({ id: 'idle', duration: 1, frames: [{ time: 0, rotations: {} }] }, 0.5);
144
+ * ```
145
+ */
146
+ export function sampleTransformPose(clip, time, skeleton) {
97
147
  const frames = clip.frames;
98
- if (frames.length === 0)
99
- return {};
100
- let clock = time;
101
- if (clip.loop && clip.duration > 0) {
102
- clock = clock % clip.duration;
103
- if (clock < 0)
104
- clock += clip.duration;
105
- }
106
- else if (clock >= clip.duration) {
107
- //a one-shot holds its last frame past the end
108
- return { ...frames[frames.length - 1].rotations };
148
+ if (!frames.length) {
149
+ if (skeleton)
150
+ validatePose(skeleton, {});
151
+ return { rotations: {} };
109
152
  }
110
- else if (clock < 0) {
111
- return { ...frames[0].rotations };
112
- }
113
- let previous = frames[0];
114
- for (let index = 1; index < frames.length; index++) {
115
- if (frames[index].time > clock) {
116
- const span = frames[index].time - previous.time;
117
- const t = span > 0 ? (clock - previous.time) / span : 0;
118
- const pose = {};
119
- const names = new Set([...Object.keys(previous.rotations), ...Object.keys(frames[index].rotations)]);
120
- for (const name of names) {
121
- const from = previous.rotations[name] ?? 0;
122
- const to = frames[index].rotations[name] ?? 0;
123
- pose[name] = from + (to - from) * t;
153
+ const clock = clip.loop && clip.duration > 0 ? ((time % clip.duration) + clip.duration) % clip.duration : time;
154
+ let pose = frames[0];
155
+ if (!clip.loop && clock >= clip.duration)
156
+ pose = frames[frames.length - 1];
157
+ else if (clock >= frames[0].time) {
158
+ pose = frames[frames.length - 1];
159
+ for (let i = 1; i < frames.length; i++) {
160
+ if (clock < frames[i].time) {
161
+ const span = frames[i].time - frames[i - 1].time;
162
+ pose = blendTransforms(frames[i - 1], frames[i], span > 0 ? (clock - frames[i - 1].time) / span : 0, true);
163
+ break;
124
164
  }
125
- return pose;
126
165
  }
127
- previous = frames[index];
128
166
  }
129
- return { ...previous.rotations };
167
+ const result = blendTransforms(pose, pose, 0, true);
168
+ if (skeleton)
169
+ validatePose(skeleton, result.rotations);
170
+ return result;
130
171
  }
131
172
  /** move a playback's playhead, wrapping a looping clip and clamping a one-shot */
132
173
  export function advancePlayback(playback, dt) {
@@ -158,21 +199,13 @@ export function crossfadeTo(mixer, clip, duration = 0.25, rate = mixer.base.rate
158
199
  }
159
200
  /** mix poses by layer priority: each layer displaces what is beneath it by its weight */
160
201
  export function mixPoses(base, layers) {
161
- const mixed = { ...base };
162
- const sorted = [...layers].sort((a, b) => a.priority - b.priority);
163
- for (const layer of sorted) {
202
+ let mixed = { rotations: base };
203
+ for (const layer of [...layers].sort((a, b) => a.priority - b.priority)) {
164
204
  const weight = Math.max(0, Math.min(1, layer.weight));
165
- if (weight === 0)
166
- continue;
167
- //a layer displaces only the bones it names: an unnamed bone keeps whatever
168
- //the layers beneath it decided, so 'aim' never resets the legs to rest
169
- for (const name of Object.keys(layer.pose)) {
170
- const from = mixed[name] ?? 0;
171
- const to = layer.pose[name];
172
- mixed[name] = from + (to - from) * weight;
173
- }
205
+ if (weight)
206
+ mixed = blendTransforms(mixed, { rotations: layer.pose }, weight, false);
174
207
  }
175
- return mixed;
208
+ return { ...mixed.rotations };
176
209
  }
177
210
  /**
178
211
  * One tick: advance every playback, sample the base (crossfaded when a fade is running),
@@ -180,27 +213,113 @@ export function mixPoses(base, layers) {
180
213
  * the world transforms are what the drawing side needs.
181
214
  */
182
215
  export function advance(mixer, dt) {
216
+ return { ...advancePose(mixer, dt).rotations };
217
+ }
218
+ /** Advance all clip channels together, including crossfades and priority layers.
219
+ * @example
220
+ * ```ts
221
+ * import { create, createMixer, advancePose } from '@datamoc/mw_games/skeleton';
222
+ * const mixer = createMixer(create([{ name: 'body' }]), { id: 'bob', duration: 1,
223
+ * frames: [{ time: 0, rotations: {}, translations: { body: { x: 0, y: 4 } } }] });
224
+ * const pose = advancePose(mixer, 0.1);
225
+ * ```
226
+ */
227
+ export function advancePose(mixer, dt) {
183
228
  mixer.base = advancePlayback(mixer.base, dt);
184
229
  for (const layer of mixer.layers)
185
230
  layer.playback = advancePlayback(layer.playback, dt);
186
- let pose = samplePose(mixer.base.clip, mixer.base.time);
231
+ let pose = sampleTransformPose(mixer.base.clip, mixer.base.time, mixer.skeleton);
187
232
  if (mixer.crossfade) {
188
233
  const fade = mixer.crossfade;
189
234
  fade.from = advancePlayback(fade.from, dt);
190
235
  fade.remaining = Math.max(0, fade.remaining - dt);
191
- const outgoing = samplePose(fade.from.clip, fade.from.time);
236
+ const outgoing = sampleTransformPose(fade.from.clip, fade.from.time, mixer.skeleton);
192
237
  const t = fade.duration > 0 ? 1 - fade.remaining / fade.duration : 1;
193
- const blended = {};
194
- for (const name of new Set([...Object.keys(outgoing), ...Object.keys(pose)]))
195
- blended[name] = (outgoing[name] ?? 0) * (1 - t) + (pose[name] ?? 0) * t;
196
- pose = blended;
238
+ pose = blendTransforms(outgoing, pose, t, true);
197
239
  if (fade.remaining === 0)
198
240
  mixer.crossfade = undefined;
199
241
  }
200
- return mixPoses(pose, mixer.layers.map((layer) => ({
201
- pose: samplePose(layer.playback.clip, layer.playback.time),
202
- weight: layer.weight,
203
- priority: layer.priority,
204
- })));
242
+ for (const layer of [...mixer.layers].sort((a, b) => a.priority - b.priority))
243
+ pose = blendTransforms(pose, sampleTransformPose(layer.playback.clip, layer.playback.time, mixer.skeleton), Math.max(0, Math.min(1, layer.weight)), false);
244
+ return pose;
245
+ }
246
+ function blendTransforms(from, to, weight, union) {
247
+ const rotations = { ...from.rotations };
248
+ for (const name of new Set([...Object.keys(to.rotations), ...(union ? Object.keys(from.rotations) : [])]))
249
+ rotations[name] = (from.rotations[name] ?? 0) * (1 - weight) + (to.rotations[name] ?? 0) * weight;
250
+ const result = { rotations };
251
+ for (const channel of ['translations', 'scales']) {
252
+ const a = from[channel] ?? {};
253
+ const b = to[channel] ?? {};
254
+ const fallback = channel === 'scales' ? 1 : 0;
255
+ const values = { ...a };
256
+ for (const name of new Set([...Object.keys(b), ...(union ? Object.keys(a) : [])])) {
257
+ values[name] = {
258
+ x: (a[name]?.x ?? fallback) * (1 - weight) + (b[name]?.x ?? fallback) * weight,
259
+ y: (a[name]?.y ?? fallback) * (1 - weight) + (b[name]?.y ?? fallback) * weight,
260
+ };
261
+ }
262
+ if (Object.keys(values).length)
263
+ result[channel] = values;
264
+ }
265
+ return result;
266
+ }
267
+ /** Refuse non-finite rotations and absolute local angles outside a joint's bounds.
268
+ * @example
269
+ * ```ts
270
+ * import { create, validatePose } from '@datamoc/mw_games/skeleton';
271
+ * validatePose(create([{ name: 'knee', limits: { min: -120, max: 0 } }]), { knee: -30 });
272
+ * ```
273
+ */
274
+ export function validatePose(skeleton, pose) {
275
+ for (const bone of skeleton.bones) {
276
+ const angle = (bone.rotation ?? 0) + (pose[bone.name] ?? 0);
277
+ if (!Number.isFinite(angle))
278
+ throw new Error(`invalid rotation for bone ${bone.name}`);
279
+ if (bone.limits && (angle < bone.limits.min || angle > bone.limits.max))
280
+ throw new Error(`joint limit for bone ${bone.name}: ${angle} outside [${bone.limits.min}, ${bone.limits.max}]`);
281
+ }
282
+ }
283
+ /** Solve a connected two-bone chain toward a world target without stretching.
284
+ * Positive bend rotates the second bone clockwise in screen coordinates. Origins on the
285
+ * second bone must be zero; the solver accepts rotation-only poses.
286
+ * @example
287
+ * ```ts
288
+ * import { create, solveTwoBoneIK } from '@datamoc/mw_games/skeleton';
289
+ * const rig = create([{ name: 'upper', length: 10 }, { name: 'lower', parent: 'upper', length: 10 }]);
290
+ * const pose = solveTwoBoneIK(rig, 'upper', 'lower', { x: 10, y: 10 });
291
+ * ```
292
+ */
293
+ export function solveTwoBoneIK(skeleton, first, second, target, bend = 1, pose = {}) {
294
+ const upper = skeleton.bones.find((b) => b.name === first);
295
+ const lower = skeleton.bones.find((b) => b.name === second);
296
+ if (!upper || !lower || lower.parent !== first)
297
+ throw new Error(`IK chain ${first}/${second} must be connected`);
298
+ if ((lower.origin?.x ?? 0) !== 0 || (lower.origin?.y ?? 0) !== 0)
299
+ throw new Error(`IK bone ${second} needs a zero origin`);
300
+ const a = upper.length ?? 0, b = lower.length ?? 0;
301
+ if (!(a > 0 && b > 0) || !Number.isFinite(a + b))
302
+ throw new Error(`IK chain ${first}/${second} needs positive finite lengths`);
303
+ if (!Number.isFinite(target.x) || !Number.isFinite(target.y) || (bend !== 1 && bend !== -1))
304
+ throw new Error(`invalid IK target or bend for ${first}/${second}`);
305
+ const transforms = resolve(skeleton, pose);
306
+ const base = transforms.find((bone) => bone.name === first);
307
+ if (!base)
308
+ throw new Error(`IK chain ${first}/${second} resolves no base`);
309
+ const dx = target.x - base.x, dy = target.y - base.y;
310
+ const distance = Math.hypot(dx, dy);
311
+ if (distance > a + b + 1e-9 || distance < Math.abs(a - b) - 1e-9)
312
+ throw new Error(`unreachable IK target for ${first}/${second}`);
313
+ const elbow = bend * Math.acos(Math.max(-1, Math.min(1, (distance * distance - a * a - b * b) / (2 * a * b))));
314
+ const shoulder = Math.atan2(dy, dx) - Math.atan2(b * Math.sin(elbow), a + b * Math.cos(elbow));
315
+ const upperParent = upper.parent ? transforms.find((bone) => bone.name === upper.parent) : undefined;
316
+ const parentAngle = upperParent ? upperParent.angle : 0;
317
+ const result = {
318
+ ...pose,
319
+ [first]: (shoulder * 180) / Math.PI - parentAngle - (upper.rotation ?? 0),
320
+ [second]: (elbow * 180) / Math.PI - (lower.rotation ?? 0),
321
+ };
322
+ validatePose(skeleton, result);
323
+ return result;
205
324
  }
206
325
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skeleton/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skeleton/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAmGH,wFAAwF;AACxF,MAAM,UAAU,SAAS,CAAC,QAAuB;IAChD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,IAAU,EAAQ,EAAE;QAClC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO;QAClC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACrF,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,CAAC,IAAI,oBAAoB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9E,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,MAAM;gBAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACF,CAAC,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC;AACd,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,MAAM,CAAC,KAAsB;IAC5C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAClF,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACnC,mFAAmF;IACnF,KAAK,MAAM,IAAI,IAAI,KAAK;QACvB,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACxE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,CAAC,IAAI,8BAA8B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACzF,OAAO,EAAE,KAAK,EAAE,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,QAAuB,EAAE,IAAI,GAAyB,EAAE;IAC/E,MAAM,SAAS,GACd,OAAQ,IAAsB,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAsB,CAAC,SAAS,CAAC,CAAC,CAAE,IAAa,CAAC;IAC5G,MAAM,YAAY,GAAI,IAAsB,CAAC,YAAY,IAAI,EAAE,CAAC;IAChE,MAAM,MAAM,GAAI,IAAsB,CAAC,MAAM,IAAI,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,eAAe,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;QACxC,MAAM,MAAM,GAAiB;YAC5B,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;YAC7B,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;YAC7B,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;YAC9B,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;SAC7B,CAAC;QACF,MAAM,YAAY,GAAiB,MAAM;YACxC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;YACpF,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,GAAG,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC;QACzF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,GAAG,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC;QACzF,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;QACpF,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE;YACf,IAAI;YACJ,CAAC;YACD,CAAC;YACD,KAAK;YACL,MAAM;YACN,MAAM;YACN,MAAM;YACN,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YACvC,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;SACvC,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,UAAU,CAAC,IAAU,EAAE,IAAY,EAAE,QAAwB;IAC5E,MAAM,MAAM,GAAG,EAAE,GAAG,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAC;IAC1E,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAU,EAAE,IAAY,EAAE,QAAwB;IACrF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACpB,IAAI,QAAQ;YAAE,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACzC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC1B,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/G,IAAI,IAAI,GAAkB,MAAM,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,QAAQ;QAAE,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;SACtE,IAAI,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjD,IAAI,GAAG,eAAe,CACrB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EACb,MAAM,CAAC,CAAC,CAAC,EACT,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,EAClD,IAAI,CACJ,CAAC;gBACF,MAAM;YACP,CAAC;QACF,CAAC;IACF,CAAC;IACD,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACpD,IAAI,QAAQ;QAAE,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IACvD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,eAAe,CAAC,QAAkB,EAAE,EAAU;IAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC9C,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;QACpC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC5B,IAAI,IAAI,GAAG,CAAC;YAAE,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC;IACrC,CAAC;SAAM,CAAC;QACP,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,WAAW,CAAC,QAAuB,EAAE,IAAU,EAAE,IAAI,GAAG,CAAC;IACxE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACtE,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,IAAU,EAAE,QAAQ,GAAG,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI;IAC5F,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;QACrC,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;QAC5B,OAAO;IACR,CAAC;IACD,KAAK,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACtE,KAAK,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,QAAQ,CACvB,IAAU,EACV,MAAuE;IAEvE,IAAI,KAAK,GAAkB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC/C,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACtD,IAAI,MAAM;YAAE,KAAK,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,KAAY,EAAE,EAAU;IAC/C,OAAO,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;AAChD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,EAAU;IACnD,KAAK,CAAC,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACvF,IAAI,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjF,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrF,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,IAAI,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC;YAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IACvD,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC5E,IAAI,GAAG,eAAe,CACrB,IAAI,EACJ,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,EAC7E,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EACtC,KAAK,CACL,CAAC;IACH,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CAAC,IAAmB,EAAE,EAAiB,EAAE,MAAc,EAAE,KAAc;IAC9F,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;IACnG,MAAM,MAAM,GAAkB,EAAE,SAAS,EAAE,CAAC;IAC5C,KAAK,MAAM,OAAO,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAU,EAAE,CAAC;QAC3D,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnF,MAAM,CAAC,IAAI,CAAC,GAAG;gBACd,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,GAAG,MAAM;gBAC9E,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,GAAG,MAAM;aAC9E,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM;YAAE,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;IAC1D,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,QAAuB,EAAE,IAAU;IAC/D,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACvF,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YACtE,MAAM,IAAI,KAAK,CACd,wBAAwB,IAAI,CAAC,IAAI,KAAK,KAAK,aAAa,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,CAC9F,CAAC;IACJ,CAAC;AACF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAC7B,QAAuB,EACvB,KAAa,EACb,MAAc,EACd,MAAgC,EAChC,IAAI,GAAW,CAAC,EAChB,IAAI,GAAS,EAAE;IAEf,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAC5D,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,MAAM,oBAAoB,CAAC,CAAC;IACjH,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,sBAAsB,CAAC,CAAC;IAC1D,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,EAC1B,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IACvB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,MAAM,gCAAgC,CAAC,CAAC;IAC9E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC;QAC1F,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IAC5D,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,MAAM,mBAAmB,CAAC,CAAC;IAC3E,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAC3B,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACpC,IAAI,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI;QAC/D,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,GAAG,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/G,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/F,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrG,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG;QACd,GAAG,IAAI;QACP,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,WAAW,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC;QACzE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC;KACzD,CAAC;IACF,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -0,0 +1,110 @@
1
+ import { Container } from 'pixi.js';
2
+ import { Camera } from '../render/Camera.ts';
3
+ import { WindowStack } from '../ui/WindowStack.ts';
4
+ import type { CompiledPresentation, PresentationItem, PresentationProperties, PresentationValue } from '../../mwl/presentation.ts';
5
+ export type PresentationState = Readonly<Record<string, PresentationValue | readonly PresentationItem[]>>;
6
+ export interface PresentationAdapterContext {
7
+ readonly tokens: Readonly<Record<string, number>>;
8
+ readonly properties: PresentationProperties;
9
+ }
10
+ /** Runtime owns and destroys `view`; destroy detaches adapter-owned subscriptions/resources. */
11
+ export interface PresentationAdapter {
12
+ readonly view: Container;
13
+ update?(dt: number, state: PresentationState): void;
14
+ resize?(width: number, height: number): void;
15
+ restyle?(context: PresentationAdapterContext): void;
16
+ destroy?(): void;
17
+ }
18
+ export interface PresentationRuntimeOptions {
19
+ readonly parent: Container;
20
+ readonly state: () => PresentationState;
21
+ readonly actions: Readonly<Record<string, (item?: PresentationItem) => void>>;
22
+ readonly adapters?: Readonly<Record<string, (context: PresentationAdapterContext) => PresentationAdapter>>;
23
+ readonly translate?: (message: string) => string;
24
+ /** Optional external notification; returned disposer is called at destruction. */
25
+ readonly subscribe?: (refresh: () => void) => () => void;
26
+ }
27
+ /**
28
+ * Instantiates compiled MWL presentation using existing Pixi widgets. The controller owns state
29
+ * and actions; context switches restyle the same views without rebuilding procedural adapters.
30
+ * Kept off the root barrel so a game pays for this runtime only when it imports the subpath.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * import { MwlPresentation } from '@datamoc/mw_games/two-d/presentation';
35
+ * import type { CompiledPresentation } from '@datamoc/mw_games/mwl/presentation';
36
+ * import { Node2D } from '@datamoc/mw_games/two-d/render';
37
+ * declare const data: CompiledPresentation;
38
+ * const ui = new MwlPresentation(data, 'game', { parent: new Node2D(), state: () => ({}), actions: {} });
39
+ * ui.resize(800, 600);
40
+ * ui.update(1 / 60);
41
+ * ui.destroy();
42
+ * ```
43
+ */
44
+ export declare class MwlPresentation<Id extends string = string> {
45
+ private readonly data;
46
+ private readonly options;
47
+ readonly root: Container<import("pixi.js").ContainerChild>;
48
+ readonly windows: WindowStack;
49
+ readonly camera: Camera;
50
+ private readonly nodes;
51
+ private readonly roots;
52
+ private readonly baseTheme;
53
+ private readonly cameraProperties;
54
+ private readonly cameraPath;
55
+ private readonly previousTheme;
56
+ private appliedTheme;
57
+ private context;
58
+ private tokens;
59
+ private viewport;
60
+ private focused;
61
+ private destroyed;
62
+ private unsubscribe?;
63
+ private state;
64
+ private readonly inputListener;
65
+ constructor(data: CompiledPresentation, sceneId: string, options: PresentationRuntimeOptions);
66
+ /** Looks up an instance by its compiled path; repeats add their stable key to the path. */
67
+ get(id: Id): Container | null;
68
+ get focusId(): string | null;
69
+ get activeContext(): string;
70
+ get palette(): Readonly<Record<string, number>>;
71
+ setContext(context?: string): void;
72
+ private applyTheme;
73
+ update(dt?: number): void;
74
+ resize(width: number, height: number): void;
75
+ private createRecord;
76
+ private read;
77
+ private coerce;
78
+ private resolveProperties;
79
+ private refresh;
80
+ private refreshButton;
81
+ private readValues;
82
+ private viewOf;
83
+ private mount;
84
+ private wireButton;
85
+ private wireWindow;
86
+ private reconcile;
87
+ private token;
88
+ private applyProperties;
89
+ private isVisible;
90
+ private layout;
91
+ private layoutNode;
92
+ private measureNode;
93
+ private defaultHeight;
94
+ /** Positions visible children; returns the content height when the node sizes to fit. */
95
+ private placeChildren;
96
+ private paintNode;
97
+ private anchorNode;
98
+ private invoke;
99
+ private isFocusable;
100
+ private focusable;
101
+ private setFocus;
102
+ private navigate;
103
+ /** Offers modal windows input first, then the screen-space buttons. */
104
+ handleAction(action: string): boolean;
105
+ private unmount;
106
+ private dispose;
107
+ private assertAlive;
108
+ destroy(): void;
109
+ }
110
+ //# sourceMappingURL=MwlPresentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MwlPresentation.d.ts","sourceRoot":"","sources":["../../../src/two-d/presentation/MwlPresentation.ts"],"names":[],"mappings":"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"}