@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.
- package/CHANGELOG.md +79 -0
- package/README.md +26 -0
- package/api-surface.json +650 -2
- package/dist/assets/SvgParts.d.ts +31 -0
- package/dist/assets/SvgParts.d.ts.map +1 -0
- package/dist/assets/SvgParts.js +54 -0
- package/dist/assets/SvgParts.js.map +1 -0
- package/dist/assets/SvgSource.d.ts +3 -0
- package/dist/assets/SvgSource.d.ts.map +1 -0
- package/dist/assets/SvgSource.js +22 -0
- package/dist/assets/SvgSource.js.map +1 -0
- package/dist/assets/index.d.ts +2 -0
- package/dist/assets/index.d.ts.map +1 -1
- package/dist/assets/index.js +1 -0
- package/dist/assets/index.js.map +1 -1
- package/dist/assets/svg.d.ts.map +1 -1
- package/dist/assets/svg.js +9 -5
- package/dist/assets/svg.js.map +1 -1
- package/dist/mw_games.global.js +110 -110
- package/dist/mwl/presentation.d.ts +70 -0
- package/dist/mwl/presentation.d.ts.map +1 -0
- package/dist/mwl/presentation.js +419 -0
- package/dist/mwl/presentation.js.map +1 -0
- package/dist/physics/PhysicsWorld.d.ts +49 -17
- package/dist/physics/PhysicsWorld.d.ts.map +1 -1
- package/dist/physics/PhysicsWorld.js +297 -59
- package/dist/physics/PhysicsWorld.js.map +1 -1
- package/dist/physics/XpbdWorld.d.ts +1 -1
- package/dist/physics/XpbdWorld.js +1 -1
- package/dist/physics/cloth/index.d.ts +98 -0
- package/dist/physics/cloth/index.d.ts.map +1 -0
- package/dist/physics/cloth/index.js +207 -0
- package/dist/physics/cloth/index.js.map +1 -0
- package/dist/physics/index.d.ts +4 -0
- package/dist/physics/index.d.ts.map +1 -1
- package/dist/physics/index.js +2 -0
- package/dist/physics/index.js.map +1 -1
- package/dist/physics/spring/index.d.ts +90 -0
- package/dist/physics/spring/index.d.ts.map +1 -0
- package/dist/physics/spring/index.js +97 -0
- package/dist/physics/spring/index.js.map +1 -0
- package/dist/skeleton/index.d.ts +94 -13
- package/dist/skeleton/index.d.ts.map +1 -1
- package/dist/skeleton/index.js +192 -73
- package/dist/skeleton/index.js.map +1 -1
- package/dist/two-d/presentation/MwlPresentation.d.ts +110 -0
- package/dist/two-d/presentation/MwlPresentation.d.ts.map +1 -0
- package/dist/two-d/presentation/MwlPresentation.js +755 -0
- package/dist/two-d/presentation/MwlPresentation.js.map +1 -0
- package/dist/two-d/presentation/index.d.ts +3 -0
- package/dist/two-d/presentation/index.d.ts.map +1 -0
- package/dist/two-d/presentation/index.js +2 -0
- package/dist/two-d/presentation/index.js.map +1 -0
- package/dist/two-d/render/ClothSprite.d.ts +83 -0
- package/dist/two-d/render/ClothSprite.d.ts.map +1 -0
- package/dist/two-d/render/ClothSprite.js +105 -0
- package/dist/two-d/render/ClothSprite.js.map +1 -0
- package/dist/two-d/render/HazeLayer.d.ts +112 -0
- package/dist/two-d/render/HazeLayer.d.ts.map +1 -0
- package/dist/two-d/render/HazeLayer.js +185 -0
- package/dist/two-d/render/HazeLayer.js.map +1 -0
- package/dist/two-d/render/NeonGlow.d.ts +100 -0
- package/dist/two-d/render/NeonGlow.d.ts.map +1 -0
- package/dist/two-d/render/NeonGlow.js +183 -0
- package/dist/two-d/render/NeonGlow.js.map +1 -0
- package/dist/two-d/render/SkeletalSprite.d.ts +5 -2
- package/dist/two-d/render/SkeletalSprite.d.ts.map +1 -1
- package/dist/two-d/render/SkeletalSprite.js +27 -3
- package/dist/two-d/render/SkeletalSprite.js.map +1 -1
- package/dist/two-d/render/SpringSprite.d.ts +40 -0
- package/dist/two-d/render/SpringSprite.d.ts.map +1 -0
- package/dist/two-d/render/SpringSprite.js +39 -0
- package/dist/two-d/render/SpringSprite.js.map +1 -0
- package/dist/two-d/render/SpriteDeform.d.ts +156 -0
- package/dist/two-d/render/SpriteDeform.d.ts.map +1 -0
- package/dist/two-d/render/SpriteDeform.js +278 -0
- package/dist/two-d/render/SpriteDeform.js.map +1 -0
- package/dist/two-d/render/SvgSkeleton.d.ts +54 -0
- package/dist/two-d/render/SvgSkeleton.d.ts.map +1 -0
- package/dist/two-d/render/SvgSkeleton.js +112 -0
- package/dist/two-d/render/SvgSkeleton.js.map +1 -0
- package/dist/two-d/render/index.d.ts +12 -0
- package/dist/two-d/render/index.d.ts.map +1 -1
- package/dist/two-d/render/index.js +6 -0
- package/dist/two-d/render/index.js.map +1 -1
- package/dist/two-d/ui/Bar.d.ts +3 -1
- package/dist/two-d/ui/Bar.d.ts.map +1 -1
- package/dist/two-d/ui/Bar.js +5 -0
- package/dist/two-d/ui/Bar.js.map +1 -1
- package/dist/two-d/ui/Button.d.ts +12 -0
- package/dist/two-d/ui/Button.d.ts.map +1 -1
- package/dist/two-d/ui/Button.js +16 -4
- package/dist/two-d/ui/Button.js.map +1 -1
- package/dist/two-d/ui/Window.d.ts +10 -0
- package/dist/two-d/ui/Window.d.ts.map +1 -1
- package/dist/two-d/ui/Window.js +17 -6
- package/dist/two-d/ui/Window.js.map +1 -1
- package/dist/two-d/ui/index.d.ts +2 -0
- package/dist/two-d/ui/index.d.ts.map +1 -1
- package/dist/two-d/ui/index.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +24 -7
- package/sbom.cdx.json +6 -58
- package/tools/asset-report.d.mts +37 -0
- package/tools/asset-report.mjs +157 -0
- package/tools/compile-resources.d.mts +2 -0
- package/tools/compile-resources.mjs +23 -2
- package/tools/emit-page.d.mts +2 -0
- package/tools/emit-page.mjs +11 -1
- package/tools/verify-scenarios.d.mts +15 -0
- package/tools/verify-scenarios.mjs +129 -0
- package/tools/vite.mjs +4 -1
package/dist/skeleton/index.js
CHANGED
|
@@ -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
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
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
|
-
|
|
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
|
|
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
|
|
69
|
-
*
|
|
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) + (
|
|
78
|
-
const angle = parent ? parent.angle
|
|
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
|
|
82
|
-
const
|
|
83
|
-
const
|
|
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
|
-
|
|
90
|
-
|
|
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
|
|
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
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
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
|
-
|
|
162
|
-
const
|
|
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
|
|
166
|
-
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
201
|
-
pose
|
|
202
|
-
|
|
203
|
-
|
|
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":"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"}
|
|
@@ -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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"}
|