@aura3d/animation 1.1.0 → 1.3.0

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 (121) hide show
  1. package/dist/AnimationClipEvents.d.ts +55 -0
  2. package/dist/AnimationClipEvents.d.ts.map +1 -1
  3. package/dist/AnimationClipEvents.js +136 -0
  4. package/dist/AnimationClipEvents.js.map +1 -1
  5. package/dist/AnimationClipRegistry.d.ts +9 -3
  6. package/dist/AnimationClipRegistry.d.ts.map +1 -1
  7. package/dist/AnimationClipRegistry.js +52 -5
  8. package/dist/AnimationClipRegistry.js.map +1 -1
  9. package/dist/AnimationController.d.ts +6 -6
  10. package/dist/AnimationController.d.ts.map +1 -1
  11. package/dist/AnimationController.js +3 -3
  12. package/dist/AnimationController.js.map +1 -1
  13. package/dist/AnimationMixer.d.ts +10 -0
  14. package/dist/AnimationMixer.d.ts.map +1 -1
  15. package/dist/AnimationMixer.js +35 -0
  16. package/dist/AnimationMixer.js.map +1 -1
  17. package/dist/AnimationStateGraph.d.ts +14 -5
  18. package/dist/AnimationStateGraph.d.ts.map +1 -1
  19. package/dist/AnimationStateGraph.js +25 -2
  20. package/dist/AnimationStateGraph.js.map +1 -1
  21. package/dist/AnimationStateMachine.d.ts +26 -0
  22. package/dist/AnimationStateMachine.d.ts.map +1 -1
  23. package/dist/AnimationStateMachine.js +32 -0
  24. package/dist/AnimationStateMachine.js.map +1 -1
  25. package/dist/Bone.d.ts +4 -0
  26. package/dist/Bone.d.ts.map +1 -1
  27. package/dist/Bone.js +3 -0
  28. package/dist/Bone.js.map +1 -1
  29. package/dist/FighterAnimationAdapter.d.ts +49 -0
  30. package/dist/FighterAnimationAdapter.d.ts.map +1 -0
  31. package/dist/FighterAnimationAdapter.js +71 -0
  32. package/dist/FighterAnimationAdapter.js.map +1 -0
  33. package/dist/FootIk.d.ts +77 -0
  34. package/dist/FootIk.d.ts.map +1 -0
  35. package/dist/FootIk.js +153 -0
  36. package/dist/FootIk.js.map +1 -0
  37. package/dist/HumanoidBoneInference.d.ts +61 -0
  38. package/dist/HumanoidBoneInference.d.ts.map +1 -0
  39. package/dist/HumanoidBoneInference.js +239 -0
  40. package/dist/HumanoidBoneInference.js.map +1 -0
  41. package/dist/HumanoidRetargeting.d.ts +48 -4
  42. package/dist/HumanoidRetargeting.d.ts.map +1 -1
  43. package/dist/HumanoidRetargeting.js +149 -14
  44. package/dist/HumanoidRetargeting.js.map +1 -1
  45. package/dist/IK.d.ts +5 -0
  46. package/dist/IK.d.ts.map +1 -1
  47. package/dist/IK.js +9 -0
  48. package/dist/IK.js.map +1 -1
  49. package/dist/Inertialization.d.ts +65 -0
  50. package/dist/Inertialization.d.ts.map +1 -0
  51. package/dist/Inertialization.js +211 -0
  52. package/dist/Inertialization.js.map +1 -0
  53. package/dist/LocomotionController.d.ts +5 -0
  54. package/dist/LocomotionController.d.ts.map +1 -1
  55. package/dist/LocomotionController.js +3 -0
  56. package/dist/LocomotionController.js.map +1 -1
  57. package/dist/LocomotionKit.d.ts +52 -0
  58. package/dist/LocomotionKit.d.ts.map +1 -0
  59. package/dist/LocomotionKit.js +38 -0
  60. package/dist/LocomotionKit.js.map +1 -0
  61. package/dist/MotionQuality.d.ts +3 -3
  62. package/dist/MotionQuality.d.ts.map +1 -1
  63. package/dist/MotionQuality.js +2 -2
  64. package/dist/MotionQuality.js.map +1 -1
  65. package/dist/RigQuality.d.ts +31 -0
  66. package/dist/RigQuality.d.ts.map +1 -0
  67. package/dist/RigQuality.js +70 -0
  68. package/dist/RigQuality.js.map +1 -0
  69. package/dist/SecondaryAnimationFixtures.d.ts.map +1 -1
  70. package/dist/SecondaryAnimationFixtures.js +1 -3
  71. package/dist/SecondaryAnimationFixtures.js.map +1 -1
  72. package/dist/Skeleton.d.ts +16 -1
  73. package/dist/Skeleton.d.ts.map +1 -1
  74. package/dist/Skeleton.js +42 -0
  75. package/dist/Skeleton.js.map +1 -1
  76. package/dist/SpringBones.d.ts +60 -0
  77. package/dist/SpringBones.d.ts.map +1 -0
  78. package/dist/SpringBones.js +173 -0
  79. package/dist/SpringBones.js.map +1 -0
  80. package/dist/browser-index.d.ts +12 -3
  81. package/dist/browser-index.d.ts.map +1 -1
  82. package/dist/browser-index.js +11 -2
  83. package/dist/browser-index.js.map +1 -1
  84. package/dist/index.d.ts +11 -3
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +10 -2
  87. package/dist/index.js.map +1 -1
  88. package/dist/library/performanceStateGraph.d.ts +42 -0
  89. package/dist/library/performanceStateGraph.d.ts.map +1 -0
  90. package/dist/library/performanceStateGraph.js +101 -0
  91. package/dist/library/performanceStateGraph.js.map +1 -0
  92. package/dist/library/standardHumanoidClips.d.ts +27 -0
  93. package/dist/library/standardHumanoidClips.d.ts.map +1 -0
  94. package/dist/library/standardHumanoidClips.js +357 -0
  95. package/dist/library/standardHumanoidClips.js.map +1 -0
  96. package/package.json +3 -3
  97. package/src/AnimationClipEvents.ts +181 -0
  98. package/src/AnimationClipRegistry.ts +65 -9
  99. package/src/AnimationController.ts +11 -11
  100. package/src/AnimationMixer.ts +36 -0
  101. package/src/AnimationStateGraph.ts +34 -5
  102. package/src/AnimationStateMachine.ts +48 -0
  103. package/src/Bone.ts +5 -0
  104. package/src/FighterAnimationAdapter.ts +124 -0
  105. package/src/FootIk.ts +251 -0
  106. package/src/HumanoidBoneInference.ts +323 -0
  107. package/src/HumanoidRetargeting.ts +180 -19
  108. package/src/IK.ts +10 -0
  109. package/src/Inertialization.ts +269 -0
  110. package/src/LocomotionController.ts +6 -0
  111. package/src/LocomotionKit.ts +89 -0
  112. package/src/MotionQuality.ts +5 -5
  113. package/src/RigQuality.ts +101 -0
  114. package/src/SecondaryAnimationFixtures.ts +1 -3
  115. package/src/Skeleton.ts +45 -1
  116. package/src/SpringBones.ts +243 -0
  117. package/src/browser-index.ts +13 -4
  118. package/src/index.ts +12 -4
  119. package/src/library/performanceStateGraph.ts +117 -0
  120. package/src/library/standardHumanoidClips.ts +442 -0
  121. package/src/Retargeting.ts +0 -29
@@ -0,0 +1,357 @@
1
+ import { AnimationTrack } from "../AnimationTrack.js";
2
+ import { AnimationClipRegistry, createAnimationClipRegistry } from "../AnimationClipRegistry.js";
3
+ import { HUMANOID_BONES } from "../HumanoidRetargeting.js";
4
+ /**
5
+ * The STANDARD performance vocabulary (Phase 2.4). These 8 ids are the contract the Animation
6
+ * Studio drives — every shared library, retarget target, and state graph speaks exactly these.
7
+ */
8
+ export const STANDARD_CLIP_IDS = ["idle", "talk", "gesture", "point", "nod", "walk", "run", "react"];
9
+ /** Locomotion subset of the vocabulary (used by the locomotion blend / studio clip-map check). */
10
+ export const STANDARD_LOCOMOTION_CLIP_IDS = ["idle", "walk", "run"];
11
+ const FRAME_RATE = 30;
12
+ /**
13
+ * The rig-neutral humanoid these clips are authored against. Bone names are the canonical
14
+ * {@link HUMANOID_BONES} (identity bindings), so an identity retarget map is a no-op and the clips
15
+ * can be retargeted onto any inferred character rig via {@link createHumanoidRetargetingMap}.
16
+ */
17
+ export const STANDARD_LIBRARY_RIG = {
18
+ id: "aura3d.standard-humanoid",
19
+ name: "Aura3D Standard Humanoid (shared clip library rig)",
20
+ units: "meters",
21
+ facingAxis: "z",
22
+ scale: 1,
23
+ bones: Object.fromEntries(HUMANOID_BONES.map((bone) => [bone, { name: bone }])),
24
+ metadata: {
25
+ library: "aura3d.standard-humanoid-clips",
26
+ clipVocabulary: [...STANDARD_CLIP_IDS]
27
+ }
28
+ };
29
+ /** Euler (radians, XYZ) -> quaternion. Compact authoring helper for the procedural clips. */
30
+ function euler(x, y, z) {
31
+ const cx = Math.cos(x / 2);
32
+ const sx = Math.sin(x / 2);
33
+ const cy = Math.cos(y / 2);
34
+ const sy = Math.sin(y / 2);
35
+ const cz = Math.cos(z / 2);
36
+ const sz = Math.sin(z / 2);
37
+ return [
38
+ sx * cy * cz - cx * sy * sz,
39
+ cx * sy * cz + sx * cy * sz,
40
+ cx * cy * sz - sx * sy * cz,
41
+ cx * cy * cz + sx * sy * sz
42
+ ];
43
+ }
44
+ const IDENTITY = [0, 0, 0, 1];
45
+ /** Build a looping quaternion (rotation) track for a bone from per-frame Euler samples. */
46
+ function rotationTrack(bone, duration, samples) {
47
+ const keyframes = samples.map((sample) => ({
48
+ time: sample.t,
49
+ value: euler(sample.e[0], sample.e[1], sample.e[2]),
50
+ interpolation: "linear"
51
+ }));
52
+ // Pad to duration so the clip loops cleanly back to its first pose.
53
+ if (keyframes[keyframes.length - 1].time < duration) {
54
+ keyframes.push({ time: duration, value: [...keyframes[0].value], interpolation: "linear" });
55
+ }
56
+ return new AnimationTrack({ target: `${bone}.rotation`, valueType: "quaternion", keyframes });
57
+ }
58
+ /** Build a looping vector3 (translation) track for a bone, used for hip bob / sway. */
59
+ function translationTrack(bone, duration, samples) {
60
+ const keyframes = samples.map((sample) => ({
61
+ time: sample.t,
62
+ value: [...sample.p],
63
+ interpolation: "linear"
64
+ }));
65
+ if (keyframes[keyframes.length - 1].time < duration) {
66
+ keyframes.push({ time: duration, value: [...keyframes[0].value], interpolation: "linear" });
67
+ }
68
+ return new AnimationTrack({ target: `${bone}.translation`, valueType: "vector3", keyframes });
69
+ }
70
+ function clip(id, duration, tracks, loop, tags) {
71
+ return {
72
+ id,
73
+ name: id,
74
+ duration,
75
+ frameRate: FRAME_RATE,
76
+ loop,
77
+ tags,
78
+ tracks,
79
+ source: "aura3d.standard-humanoid-clips",
80
+ metadata: { rig: STANDARD_LIBRARY_RIG.id, procedural: true }
81
+ };
82
+ }
83
+ // --- idle: visible breathing + head turns + weight-shift sway -----------------------------------
84
+ // Amplitudes are deliberately readable (not the old ±2° "alive but invisible" idle): spine breathes
85
+ // ~0.16 rad, head turns ~0.34 rad peak-to-peak, hips shift ~6 cm laterally so a viewer can tell the
86
+ // character is standing/living rather than frozen.
87
+ function idleClip() {
88
+ const d = 4;
89
+ return clip("idle", d, [
90
+ // Weight shift left -> right plus a clear breathing bob.
91
+ translationTrack("hips", d, [
92
+ { t: 0, p: [0.03, 0, 0] },
93
+ { t: 1, p: [0.02, 0.03, 0] },
94
+ { t: 2, p: [-0.03, 0.01, 0] },
95
+ { t: 3, p: [-0.02, 0.03, 0] }
96
+ ]),
97
+ // Breathing: spine flexes/extends well past the visibility floor (~0.16 rad swing).
98
+ rotationTrack("spine", d, [
99
+ { t: 0, e: [0.04, 0, 0.04] },
100
+ { t: 1, e: [0.18, 0, 0.03] },
101
+ { t: 2, e: [0.05, 0, -0.05] },
102
+ { t: 3, e: [0.16, 0, -0.03] }
103
+ ]),
104
+ rotationTrack("chest", d, [
105
+ { t: 0, e: [0, 0, 0] },
106
+ { t: 1, e: [0.12, 0, 0.02] },
107
+ { t: 2, e: [0.02, 0, 0] },
108
+ { t: 3, e: [0.1, 0, -0.02] }
109
+ ]),
110
+ // Idle head turns: a slow look-around, ~0.34 rad peak-to-peak yaw + a little pitch.
111
+ rotationTrack("head", d, [
112
+ { t: 0, e: [0.02, 0.18, 0] },
113
+ { t: 1, e: [0.06, 0.1, 0.04] },
114
+ { t: 2, e: [0.04, -0.16, 0] },
115
+ { t: 3, e: [-0.04, -0.06, -0.04] }
116
+ ]),
117
+ rotationTrack("neck", d, [
118
+ { t: 0, e: [0, 0.08, 0] },
119
+ { t: 2, e: [0, -0.08, 0] }
120
+ ])
121
+ ], true, ["idle", "performance", "loop"]);
122
+ }
123
+ // --- talk: real conversational hand gestures + torso + head -------------------------------------
124
+ // A speaking beat must read as "talking with the hands": both arms swing through ~0.5+ rad, the
125
+ // forearms beat with the cadence, the chest counter-rotates, and the head punctuates.
126
+ function talkClip() {
127
+ const d = 2;
128
+ return clip("talk", d, [
129
+ rotationTrack("head", d, [
130
+ { t: 0, e: [0, 0.04, 0] },
131
+ { t: 0.5, e: [0.16, 0.12, 0] },
132
+ { t: 1, e: [-0.1, -0.1, 0] },
133
+ { t: 1.5, e: [0.14, 0.06, 0] }
134
+ ]),
135
+ rotationTrack("neck", d, [
136
+ { t: 0, e: [0, 0, 0] },
137
+ { t: 0.5, e: [0.09, 0.05, 0] },
138
+ { t: 1.5, e: [-0.07, -0.05, 0] }
139
+ ]),
140
+ rotationTrack("chest", d, [
141
+ { t: 0, e: [0, -0.06, 0] },
142
+ { t: 0.6, e: [0.04, 0.12, 0] },
143
+ { t: 1.3, e: [0.02, -0.1, 0] }
144
+ ]),
145
+ // Right hand does the lead gesture: up-and-out beats (~0.55 rad swing in Z plus pitch).
146
+ rotationTrack("rightUpperArm", d, [
147
+ { t: 0, e: [0, 0, -0.2] },
148
+ { t: 0.6, e: [0.45, -0.1, -0.62] },
149
+ { t: 1.2, e: [0.1, 0, -0.25] },
150
+ { t: 1.7, e: [0.35, -0.05, -0.5] }
151
+ ]),
152
+ rotationTrack("rightLowerArm", d, [
153
+ { t: 0, e: [0, 0, -0.35] },
154
+ { t: 0.6, e: [0, -0.2, -0.95] },
155
+ { t: 1.2, e: [0, 0, -0.4] },
156
+ { t: 1.7, e: [0, -0.15, -0.8] }
157
+ ]),
158
+ // Left hand supports with its own beat (~0.5 rad swing).
159
+ rotationTrack("leftUpperArm", d, [
160
+ { t: 0, e: [0, 0, 0.2] },
161
+ { t: 0.8, e: [0.35, 0.1, 0.6] },
162
+ { t: 1.5, e: [0.1, 0, 0.28] }
163
+ ]),
164
+ rotationTrack("leftLowerArm", d, [
165
+ { t: 0, e: [0, 0, 0.3] },
166
+ { t: 0.8, e: [0, 0.15, 0.75] },
167
+ { t: 1.5, e: [0, 0, 0.35] }
168
+ ])
169
+ ], true, ["talk", "performance", "loop", "upper-body"]);
170
+ }
171
+ // --- gesture: one-shot BIG expressive both-arm sweep --------------------------------------------
172
+ // A full presentational sweep: the lead arm raises ~1.1 rad and opens out, the off arm mirrors, the
173
+ // torso opens with it. Unmistakably a "big gesture", not a twitch.
174
+ function gestureClip() {
175
+ const d = 1.1;
176
+ return clip("gesture", d, [
177
+ rotationTrack("rightUpperArm", d, [
178
+ { t: 0, e: [0, 0, -0.2] },
179
+ { t: 0.45, e: [1.1, -0.35, -1.15] },
180
+ { t: 0.8, e: [0.7, -0.2, -0.85] }
181
+ ]),
182
+ rotationTrack("rightLowerArm", d, [
183
+ { t: 0, e: [0, 0, -0.3] },
184
+ { t: 0.45, e: [0, -0.6, -1.2] },
185
+ { t: 0.8, e: [0, -0.3, -0.8] }
186
+ ]),
187
+ rotationTrack("leftUpperArm", d, [
188
+ { t: 0, e: [0, 0, 0.2] },
189
+ { t: 0.5, e: [0.95, 0.35, 1.1] },
190
+ { t: 0.85, e: [0.6, 0.2, 0.8] }
191
+ ]),
192
+ rotationTrack("leftLowerArm", d, [
193
+ { t: 0, e: [0, 0, 0.3] },
194
+ { t: 0.5, e: [0, 0.5, 1.1] }
195
+ ]),
196
+ rotationTrack("chest", d, [
197
+ { t: 0, e: [0, 0, 0] },
198
+ { t: 0.45, e: [-0.08, 0.28, 0] }
199
+ ]),
200
+ rotationTrack("head", d, [
201
+ { t: 0, e: [0, 0, 0] },
202
+ { t: 0.45, e: [-0.12, 0.1, 0] }
203
+ ])
204
+ ], false, ["gesture", "performance", "one-shot", "upper-body"]);
205
+ }
206
+ // --- point: one-shot directional arm extension --------------------------------------------------
207
+ function pointClip() {
208
+ const d = 0.9;
209
+ return clip("point", d, [
210
+ rotationTrack("rightShoulder", d, [
211
+ { t: 0, e: [0, 0, 0] },
212
+ { t: 0.35, e: [0, -0.15, 0] }
213
+ ]),
214
+ rotationTrack("rightUpperArm", d, [
215
+ { t: 0, e: [0, 0, -0.2] },
216
+ { t: 0.35, e: [0, -0.25, -1.55] },
217
+ { t: 0.7, e: [0, -0.25, -1.55] }
218
+ ]),
219
+ rotationTrack("rightLowerArm", d, [
220
+ { t: 0, e: [0, 0, -0.35] },
221
+ { t: 0.35, e: [0, 0, 0] },
222
+ { t: 0.7, e: [0, 0, 0] }
223
+ ]),
224
+ rotationTrack("head", d, [
225
+ { t: 0, e: [0, 0, 0] },
226
+ { t: 0.35, e: [0, -0.35, 0] },
227
+ { t: 0.7, e: [0, -0.3, 0] }
228
+ ])
229
+ ], false, ["point", "performance", "one-shot", "upper-body"]);
230
+ }
231
+ // --- nod: one-shot affirmative head nod ---------------------------------------------------------
232
+ function nodClip() {
233
+ const d = 0.8;
234
+ return clip("nod", d, [
235
+ rotationTrack("head", d, [
236
+ { t: 0, e: [-0.06, 0, 0] },
237
+ { t: 0.2, e: [0.42, 0, 0] },
238
+ { t: 0.4, e: [-0.1, 0, 0] },
239
+ { t: 0.6, e: [0.34, 0, 0] }
240
+ ]),
241
+ rotationTrack("neck", d, [
242
+ { t: 0, e: [-0.02, 0, 0] },
243
+ { t: 0.2, e: [0.18, 0, 0] },
244
+ { t: 0.4, e: [-0.02, 0, 0] },
245
+ { t: 0.6, e: [0.14, 0, 0] }
246
+ ])
247
+ ], false, ["nod", "performance", "one-shot"]);
248
+ }
249
+ // --- react: one-shot surprised recoil (torso + arms + head) -------------------------------------
250
+ function reactClip() {
251
+ const d = 1;
252
+ return clip("react", d, [
253
+ rotationTrack("spine", d, [
254
+ { t: 0, e: [0, 0, 0] },
255
+ { t: 0.18, e: [-0.5, 0, 0] },
256
+ { t: 0.6, e: [-0.18, 0, 0] }
257
+ ]),
258
+ rotationTrack("head", d, [
259
+ { t: 0, e: [0, 0, 0] },
260
+ { t: 0.18, e: [-0.4, 0, 0] },
261
+ { t: 0.6, e: [-0.12, 0, 0] }
262
+ ]),
263
+ rotationTrack("leftUpperArm", d, [
264
+ { t: 0, e: [0, 0, 0.2] },
265
+ { t: 0.2, e: [-0.7, 0, 1.1] },
266
+ { t: 0.6, e: [-0.3, 0, 0.6] }
267
+ ]),
268
+ rotationTrack("rightUpperArm", d, [
269
+ { t: 0, e: [0, 0, -0.2] },
270
+ { t: 0.2, e: [-0.7, 0, -1.1] },
271
+ { t: 0.6, e: [-0.3, 0, -0.6] }
272
+ ]),
273
+ translationTrack("hips", d, [
274
+ { t: 0, p: [0, 0, 0] },
275
+ { t: 0.18, p: [0, 0, -0.12] },
276
+ { t: 0.6, p: [0, 0, -0.04] }
277
+ ])
278
+ ], false, ["react", "performance", "one-shot"]);
279
+ }
280
+ /** Build a symmetric two-step leg/arm cycle for walk or run. */
281
+ function legCycle(id, duration, amplitude, lift, bob) {
282
+ const half = duration / 2;
283
+ return clip(id, duration, [
284
+ // Hip vertical bob (two bobs per stride).
285
+ translationTrack("hips", duration, [
286
+ { t: 0, p: [0, 0, 0] },
287
+ { t: half / 2, p: [0, bob, 0] },
288
+ { t: half, p: [0, 0, 0] },
289
+ { t: half + half / 2, p: [0, bob, 0] }
290
+ ]),
291
+ // Legs swing in opposition.
292
+ rotationTrack("leftUpperLeg", duration, [
293
+ { t: 0, e: [amplitude, 0, 0] },
294
+ { t: half, e: [-amplitude, 0, 0] }
295
+ ]),
296
+ rotationTrack("rightUpperLeg", duration, [
297
+ { t: 0, e: [-amplitude, 0, 0] },
298
+ { t: half, e: [amplitude, 0, 0] }
299
+ ]),
300
+ rotationTrack("leftLowerLeg", duration, [
301
+ { t: 0, e: [0, 0, 0] },
302
+ { t: half / 2, e: [lift, 0, 0] },
303
+ { t: half, e: [0, 0, 0] }
304
+ ]),
305
+ rotationTrack("rightLowerLeg", duration, [
306
+ { t: 0, e: [lift, 0, 0] },
307
+ { t: half / 2, e: [0, 0, 0] },
308
+ { t: half, e: [lift, 0, 0] }
309
+ ]),
310
+ // Arms counter-swing to the legs.
311
+ rotationTrack("leftUpperArm", duration, [
312
+ { t: 0, e: [-amplitude * 0.8, 0, 0.15] },
313
+ { t: half, e: [amplitude * 0.8, 0, 0.15] }
314
+ ]),
315
+ rotationTrack("rightUpperArm", duration, [
316
+ { t: 0, e: [amplitude * 0.8, 0, -0.15] },
317
+ { t: half, e: [-amplitude * 0.8, 0, -0.15] }
318
+ ]),
319
+ rotationTrack("spine", duration, [
320
+ { t: 0, e: [0.05, amplitude * 0.15, 0] },
321
+ { t: half, e: [0.05, -amplitude * 0.15, 0] }
322
+ ])
323
+ ], true, [id, "locomotion", "loop", "lower-body"]);
324
+ }
325
+ // Walk: strong staged stride. Upper-leg swing of ±0.55 rad gives a 1.1 rad peak-to-peak step that
326
+ // reads clearly even on a previz rig; knees lift, arms counter-swing, torso twists.
327
+ function walkClip() {
328
+ return legCycle("walk", 1, 0.55, 0.7, 0.04);
329
+ }
330
+ // Run: bigger and faster (rig permitting) — ±0.9 rad upper-leg swing, deep knee lift, strong bob.
331
+ function runClip() {
332
+ return legCycle("run", 0.6, 0.9, 1.1, 0.07);
333
+ }
334
+ /** Ordered list of all standard library clip definitions (idle first). */
335
+ export function createStandardHumanoidClipDefinitions() {
336
+ return [
337
+ idleClip(),
338
+ talkClip(),
339
+ gestureClip(),
340
+ pointClip(),
341
+ nodClip(),
342
+ walkClip(),
343
+ runClip(),
344
+ reactClip()
345
+ ];
346
+ }
347
+ /**
348
+ * Shared, rig-neutral {@link AnimationClipRegistry} populated with the 8 standard performance clips
349
+ * authored on {@link STANDARD_LIBRARY_RIG} (canonical {@link HUMANOID_BONES}). The clips are COMPACT
350
+ * procedural keyframe loops/one-shots — real, samplable {@link AnimationTrack} data, not mocap and
351
+ * not placeholders. They give the studio a guaranteed, retargetable performance vocabulary even when
352
+ * a source GLB ships only one (or zero) usable clips.
353
+ */
354
+ export function createStandardHumanoidClipRegistry() {
355
+ return createAnimationClipRegistry(createStandardHumanoidClipDefinitions());
356
+ }
357
+ //# sourceMappingURL=standardHumanoidClips.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standardHumanoidClips.js","sourceRoot":"","sources":["../../../../../packages/animation/src/library/standardHumanoidClips.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aura3d/animation",
3
- "version": "1.1.0",
3
+ "version": "1.3.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -12,6 +12,6 @@
12
12
  }
13
13
  },
14
14
  "dependencies": {
15
- "@aura3d/math": "1.1.0"
15
+ "@aura3d/math": "workspace:*"
16
16
  }
17
- }
17
+ }
@@ -318,3 +318,184 @@ function positiveModulo(value: number, divisor: number): number {
318
318
  function clamp(value: number, min: number, max: number): number {
319
319
  return Math.min(max, Math.max(min, value));
320
320
  }
321
+
322
+ // ---- event tracks (authoring container on top of the existing dispatcher/sampler) -------------
323
+ //
324
+ // An event *track* is a named lane of typed markers on a clip's timeline (e.g. a "hitbox" lane, a
325
+ // "footstep" lane, a "vfx" lane). This adds the authoring + active-frame layer the editor and
326
+ // gameplay need WITHOUT rebuilding the dispatcher/sampler above: `toEventSource()` flattens the
327
+ // tracks back into the `AnimationClipEventSource` that `sampleClipEvents` already consumes.
328
+
329
+ export interface AnimationEventTrack<TEvent extends AnimationClipEvent = AnimationClipEvent> {
330
+ readonly name: string;
331
+ readonly type: AnimationClipEventType;
332
+ readonly markers: readonly TEvent[];
333
+ }
334
+
335
+ export interface SerializedAnimationEventTracks<TEvent extends AnimationClipEvent = AnimationClipEvent> {
336
+ readonly schema: "animation-event-tracks/v1";
337
+ readonly clipId: string;
338
+ readonly duration: number;
339
+ readonly tracks: readonly AnimationEventTrack<TEvent>[];
340
+ }
341
+
342
+ export interface ActiveWindow {
343
+ readonly start: number;
344
+ readonly end: number;
345
+ }
346
+
347
+ export interface AddMarkerOptions<TPayload = unknown> {
348
+ readonly id?: string;
349
+ readonly type?: AnimationClipEventType;
350
+ /** Window length (seconds). >0 makes this an active-frame marker (e.g. hitbox on/off). */
351
+ readonly duration?: number;
352
+ readonly payload?: TPayload;
353
+ readonly once?: boolean;
354
+ readonly tags?: readonly string[];
355
+ }
356
+
357
+ /**
358
+ * Authoring container for clip event tracks: add/move/delete typed markers on named lanes, query
359
+ * active-frame windows, flatten to the existing `AnimationClipEventSource`, and serialize. Pure and
360
+ * deterministic — marker ids are assigned from a monotonic counter (no `Date.now`/`Math.random`).
361
+ */
362
+ export class AnimationEventTrackContainer {
363
+ readonly clipId: string;
364
+ duration: number;
365
+ private readonly trackOrder: string[] = [];
366
+ private readonly trackMap = new Map<string, { type: AnimationClipEventType; markers: AnimationClipEvent[] }>();
367
+ private idCounter = 0;
368
+
369
+ constructor(clipId: string, duration: number) {
370
+ if (!Number.isFinite(duration) || duration < 0) {
371
+ throw new Error("Event-track clip duration must be a finite, non-negative number.");
372
+ }
373
+ this.clipId = clipId;
374
+ this.duration = duration;
375
+ }
376
+
377
+ addTrack(name: string, type: AnimationClipEventType = "marker"): this {
378
+ if (!this.trackMap.has(name)) {
379
+ this.trackMap.set(name, { type, markers: [] });
380
+ this.trackOrder.push(name);
381
+ }
382
+ return this;
383
+ }
384
+
385
+ removeTrack(name: string): this {
386
+ if (this.trackMap.delete(name)) {
387
+ this.trackOrder.splice(this.trackOrder.indexOf(name), 1);
388
+ }
389
+ return this;
390
+ }
391
+
392
+ /** Add a marker to a track (auto-creates the track). Returns the marker id. */
393
+ addMarker(trackName: string, time: number, options: AddMarkerOptions = {}): string {
394
+ if (!Number.isFinite(time) || time < 0) {
395
+ throw new Error("Event marker time must be a finite, non-negative number.");
396
+ }
397
+ this.addTrack(trackName, options.type);
398
+ const track = this.trackMap.get(trackName)!;
399
+ const id = options.id ?? `${trackName}#${this.idCounter++}`;
400
+ const marker: AnimationClipEvent = {
401
+ id,
402
+ name: trackName,
403
+ type: options.type ?? track.type,
404
+ time,
405
+ ...(options.duration !== undefined ? { duration: options.duration } : {}),
406
+ ...(options.payload !== undefined ? { payload: options.payload } : {}),
407
+ ...(options.once !== undefined ? { once: options.once } : {}),
408
+ ...(options.tags !== undefined ? { tags: options.tags } : {})
409
+ };
410
+ track.markers.push(marker);
411
+ track.markers.sort((a, b) => a.time - b.time);
412
+ return id;
413
+ }
414
+
415
+ moveMarker(trackName: string, markerId: string, time: number): this {
416
+ if (!Number.isFinite(time) || time < 0) {
417
+ throw new Error("Event marker time must be a finite, non-negative number.");
418
+ }
419
+ const track = this.trackMap.get(trackName);
420
+ const index = track?.markers.findIndex((m) => m.id === markerId) ?? -1;
421
+ if (!track || index < 0) throw new Error(`Marker ${markerId} not found on track ${trackName}.`);
422
+ track.markers[index] = { ...track.markers[index]!, time };
423
+ track.markers.sort((a, b) => a.time - b.time);
424
+ return this;
425
+ }
426
+
427
+ removeMarker(trackName: string, markerId: string): this {
428
+ const track = this.trackMap.get(trackName);
429
+ if (!track) return this;
430
+ const index = track.markers.findIndex((m) => m.id === markerId);
431
+ if (index >= 0) track.markers.splice(index, 1);
432
+ return this;
433
+ }
434
+
435
+ track(name: string): AnimationEventTrack | undefined {
436
+ const track = this.trackMap.get(name);
437
+ return track ? { name, type: track.type, markers: [...track.markers] } : undefined;
438
+ }
439
+
440
+ tracks(): readonly AnimationEventTrack[] {
441
+ return this.trackOrder.map((name) => this.track(name)!);
442
+ }
443
+
444
+ markerCount(): number {
445
+ let count = 0;
446
+ for (const track of this.trackMap.values()) count += track.markers.length;
447
+ return count;
448
+ }
449
+
450
+ /** Flatten every track's markers into the source shape `sampleClipEvents` consumes. */
451
+ toEventSource(): AnimationClipEventSource {
452
+ const events: AnimationClipEvent[] = [];
453
+ for (const name of this.trackOrder) events.push(...this.trackMap.get(name)!.markers);
454
+ return { id: this.clipId, duration: this.duration, events: normalizeClipEvents(events) };
455
+ }
456
+
457
+ /** Active-frame windows for a track: [time, time+duration] for each marker with a duration. */
458
+ activeWindows(trackName: string): readonly ActiveWindow[] {
459
+ const track = this.trackMap.get(trackName);
460
+ if (!track) return [];
461
+ return track.markers
462
+ .filter((m) => (m.duration ?? 0) > 0)
463
+ .map((m) => ({ start: m.time, end: m.time + (m.duration ?? 0) }));
464
+ }
465
+
466
+ /** Whether any active-frame window on a track is open at `time` (hitbox live). */
467
+ isActive(trackName: string, time: number): boolean {
468
+ return this.activeWindows(trackName).some((w) => time >= w.start && time < w.end);
469
+ }
470
+
471
+ serialize(): SerializedAnimationEventTracks {
472
+ return {
473
+ schema: "animation-event-tracks/v1",
474
+ clipId: this.clipId,
475
+ duration: this.duration,
476
+ tracks: this.tracks()
477
+ };
478
+ }
479
+ }
480
+
481
+ export function createAnimationEventTracks(clipId: string, duration: number): AnimationEventTrackContainer {
482
+ return new AnimationEventTrackContainer(clipId, duration);
483
+ }
484
+
485
+ export function deserializeAnimationEventTracks(data: SerializedAnimationEventTracks): AnimationEventTrackContainer {
486
+ const container = new AnimationEventTrackContainer(data.clipId, data.duration);
487
+ for (const track of data.tracks) {
488
+ container.addTrack(track.name, track.type);
489
+ for (const marker of track.markers) {
490
+ container.addMarker(track.name, marker.time, {
491
+ id: marker.id,
492
+ type: marker.type,
493
+ ...(marker.duration !== undefined ? { duration: marker.duration } : {}),
494
+ ...(marker.payload !== undefined ? { payload: marker.payload } : {}),
495
+ ...(marker.once !== undefined ? { once: marker.once } : {}),
496
+ ...(marker.tags !== undefined ? { tags: marker.tags } : {})
497
+ });
498
+ }
499
+ }
500
+ return container;
501
+ }