@aura3d/animation 1.0.6

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 (187) hide show
  1. package/README.md +19 -0
  2. package/dist/AnimationAction.d.ts +40 -0
  3. package/dist/AnimationAction.d.ts.map +1 -0
  4. package/dist/AnimationAction.js +143 -0
  5. package/dist/AnimationAction.js.map +1 -0
  6. package/dist/AnimationClip.d.ts +24 -0
  7. package/dist/AnimationClip.d.ts.map +1 -0
  8. package/dist/AnimationClip.js +45 -0
  9. package/dist/AnimationClip.js.map +1 -0
  10. package/dist/AnimationClipEvents.d.ts +57 -0
  11. package/dist/AnimationClipEvents.d.ts.map +1 -0
  12. package/dist/AnimationClipEvents.js +171 -0
  13. package/dist/AnimationClipEvents.js.map +1 -0
  14. package/dist/AnimationClipRegistry.d.ts +76 -0
  15. package/dist/AnimationClipRegistry.d.ts.map +1 -0
  16. package/dist/AnimationClipRegistry.js +130 -0
  17. package/dist/AnimationClipRegistry.js.map +1 -0
  18. package/dist/AnimationController.d.ts +168 -0
  19. package/dist/AnimationController.d.ts.map +1 -0
  20. package/dist/AnimationController.js +619 -0
  21. package/dist/AnimationController.js.map +1 -0
  22. package/dist/AnimationEvents.d.ts +10 -0
  23. package/dist/AnimationEvents.d.ts.map +1 -0
  24. package/dist/AnimationEvents.js +26 -0
  25. package/dist/AnimationEvents.js.map +1 -0
  26. package/dist/AnimationLayer.d.ts +27 -0
  27. package/dist/AnimationLayer.d.ts.map +1 -0
  28. package/dist/AnimationLayer.js +53 -0
  29. package/dist/AnimationLayer.js.map +1 -0
  30. package/dist/AnimationMixer.d.ts +54 -0
  31. package/dist/AnimationMixer.d.ts.map +1 -0
  32. package/dist/AnimationMixer.js +319 -0
  33. package/dist/AnimationMixer.js.map +1 -0
  34. package/dist/AnimationStateGraph.d.ts +2 -0
  35. package/dist/AnimationStateGraph.d.ts.map +1 -0
  36. package/dist/AnimationStateGraph.js +2 -0
  37. package/dist/AnimationStateGraph.js.map +1 -0
  38. package/dist/AnimationStateMachine.d.ts +59 -0
  39. package/dist/AnimationStateMachine.d.ts.map +1 -0
  40. package/dist/AnimationStateMachine.js +154 -0
  41. package/dist/AnimationStateMachine.js.map +1 -0
  42. package/dist/AnimationTrack.d.ts +23 -0
  43. package/dist/AnimationTrack.d.ts.map +1 -0
  44. package/dist/AnimationTrack.js +124 -0
  45. package/dist/AnimationTrack.js.map +1 -0
  46. package/dist/BlendTree.d.ts +23 -0
  47. package/dist/BlendTree.d.ts.map +1 -0
  48. package/dist/BlendTree.js +68 -0
  49. package/dist/BlendTree.js.map +1 -0
  50. package/dist/Bone.d.ts +20 -0
  51. package/dist/Bone.d.ts.map +1 -0
  52. package/dist/Bone.js +24 -0
  53. package/dist/Bone.js.map +1 -0
  54. package/dist/CrowdAnimation.d.ts +13 -0
  55. package/dist/CrowdAnimation.d.ts.map +1 -0
  56. package/dist/CrowdAnimation.js +14 -0
  57. package/dist/CrowdAnimation.js.map +1 -0
  58. package/dist/ECSAnimationBridge.d.ts +9 -0
  59. package/dist/ECSAnimationBridge.d.ts.map +1 -0
  60. package/dist/ECSAnimationBridge.js +24 -0
  61. package/dist/ECSAnimationBridge.js.map +1 -0
  62. package/dist/HumanoidRetargeting.d.ts +76 -0
  63. package/dist/HumanoidRetargeting.d.ts.map +1 -0
  64. package/dist/HumanoidRetargeting.js +331 -0
  65. package/dist/HumanoidRetargeting.js.map +1 -0
  66. package/dist/IK.d.ts +24 -0
  67. package/dist/IK.d.ts.map +1 -0
  68. package/dist/IK.js +76 -0
  69. package/dist/IK.js.map +1 -0
  70. package/dist/Keyframe.d.ts +50 -0
  71. package/dist/Keyframe.d.ts.map +1 -0
  72. package/dist/Keyframe.js +118 -0
  73. package/dist/Keyframe.js.map +1 -0
  74. package/dist/LocomotionController.d.ts +47 -0
  75. package/dist/LocomotionController.d.ts.map +1 -0
  76. package/dist/LocomotionController.js +106 -0
  77. package/dist/LocomotionController.js.map +1 -0
  78. package/dist/MotionMatchingFixtures.d.ts +58 -0
  79. package/dist/MotionMatchingFixtures.d.ts.map +1 -0
  80. package/dist/MotionMatchingFixtures.js +175 -0
  81. package/dist/MotionMatchingFixtures.js.map +1 -0
  82. package/dist/MotionQuality.d.ts +36 -0
  83. package/dist/MotionQuality.d.ts.map +1 -0
  84. package/dist/MotionQuality.js +117 -0
  85. package/dist/MotionQuality.js.map +1 -0
  86. package/dist/Retargeting.d.ts +12 -0
  87. package/dist/Retargeting.d.ts.map +1 -0
  88. package/dist/Retargeting.js +19 -0
  89. package/dist/Retargeting.js.map +1 -0
  90. package/dist/RootMotion.d.ts +21 -0
  91. package/dist/RootMotion.d.ts.map +1 -0
  92. package/dist/RootMotion.js +84 -0
  93. package/dist/RootMotion.js.map +1 -0
  94. package/dist/SceneAnimationBridge.d.ts +18 -0
  95. package/dist/SceneAnimationBridge.d.ts.map +1 -0
  96. package/dist/SceneAnimationBridge.js +69 -0
  97. package/dist/SceneAnimationBridge.js.map +1 -0
  98. package/dist/SecondaryAnimationFixtures.d.ts +55 -0
  99. package/dist/SecondaryAnimationFixtures.d.ts.map +1 -0
  100. package/dist/SecondaryAnimationFixtures.js +147 -0
  101. package/dist/SecondaryAnimationFixtures.js.map +1 -0
  102. package/dist/Skeleton.d.ts +9 -0
  103. package/dist/Skeleton.d.ts.map +1 -0
  104. package/dist/Skeleton.js +31 -0
  105. package/dist/Skeleton.js.map +1 -0
  106. package/dist/Skinning.d.ts +7 -0
  107. package/dist/Skinning.d.ts.map +1 -0
  108. package/dist/Skinning.js +12 -0
  109. package/dist/Skinning.js.map +1 -0
  110. package/dist/browser-index.d.ts +39 -0
  111. package/dist/browser-index.d.ts.map +1 -0
  112. package/dist/browser-index.js +34 -0
  113. package/dist/browser-index.js.map +1 -0
  114. package/dist/index.d.ts +40 -0
  115. package/dist/index.d.ts.map +1 -0
  116. package/dist/index.js +35 -0
  117. package/dist/index.js.map +1 -0
  118. package/dist/threejs-compatibility/AnimationAction.d.ts +16 -0
  119. package/dist/threejs-compatibility/AnimationAction.d.ts.map +1 -0
  120. package/dist/threejs-compatibility/AnimationAction.js +25 -0
  121. package/dist/threejs-compatibility/AnimationAction.js.map +1 -0
  122. package/dist/threejs-compatibility/AnimationClip.d.ts +14 -0
  123. package/dist/threejs-compatibility/AnimationClip.d.ts.map +1 -0
  124. package/dist/threejs-compatibility/AnimationClip.js +11 -0
  125. package/dist/threejs-compatibility/AnimationClip.js.map +1 -0
  126. package/dist/threejs-compatibility/AnimationDiagnostics.d.ts +44 -0
  127. package/dist/threejs-compatibility/AnimationDiagnostics.d.ts.map +1 -0
  128. package/dist/threejs-compatibility/AnimationDiagnostics.js +29 -0
  129. package/dist/threejs-compatibility/AnimationDiagnostics.js.map +1 -0
  130. package/dist/threejs-compatibility/AnimationMixer.d.ts +9 -0
  131. package/dist/threejs-compatibility/AnimationMixer.d.ts.map +1 -0
  132. package/dist/threejs-compatibility/AnimationMixer.js +24 -0
  133. package/dist/threejs-compatibility/AnimationMixer.js.map +1 -0
  134. package/dist/threejs-compatibility/MorphTargetMixer.d.ts +10 -0
  135. package/dist/threejs-compatibility/MorphTargetMixer.d.ts.map +1 -0
  136. package/dist/threejs-compatibility/MorphTargetMixer.js +10 -0
  137. package/dist/threejs-compatibility/MorphTargetMixer.js.map +1 -0
  138. package/dist/threejs-compatibility/Skeleton.d.ts +10 -0
  139. package/dist/threejs-compatibility/Skeleton.d.ts.map +1 -0
  140. package/dist/threejs-compatibility/Skeleton.js +8 -0
  141. package/dist/threejs-compatibility/Skeleton.js.map +1 -0
  142. package/dist/threejs-compatibility/SkinnedMesh.d.ts +11 -0
  143. package/dist/threejs-compatibility/SkinnedMesh.d.ts.map +1 -0
  144. package/dist/threejs-compatibility/SkinnedMesh.js +16 -0
  145. package/dist/threejs-compatibility/SkinnedMesh.js.map +1 -0
  146. package/dist/threejs-compatibility/index.d.ts +12 -0
  147. package/dist/threejs-compatibility/index.d.ts.map +1 -0
  148. package/dist/threejs-compatibility/index.js +8 -0
  149. package/dist/threejs-compatibility/index.js.map +1 -0
  150. package/package.json +17 -0
  151. package/src/AnimationAction.ts +166 -0
  152. package/src/AnimationClip.ts +63 -0
  153. package/src/AnimationClipEvents.ts +320 -0
  154. package/src/AnimationClipRegistry.ts +280 -0
  155. package/src/AnimationController.ts +967 -0
  156. package/src/AnimationEvents.ts +34 -0
  157. package/src/AnimationLayer.ts +73 -0
  158. package/src/AnimationMixer.ts +366 -0
  159. package/src/AnimationStateGraph.ts +8 -0
  160. package/src/AnimationStateMachine.ts +217 -0
  161. package/src/AnimationTrack.ts +176 -0
  162. package/src/BlendTree.ts +89 -0
  163. package/src/Bone.ts +35 -0
  164. package/src/CrowdAnimation.ts +25 -0
  165. package/src/ECSAnimationBridge.ts +30 -0
  166. package/src/HumanoidRetargeting.ts +476 -0
  167. package/src/IK.ts +107 -0
  168. package/src/Keyframe.ts +159 -0
  169. package/src/LocomotionController.ts +149 -0
  170. package/src/MotionMatchingFixtures.ts +254 -0
  171. package/src/MotionQuality.ts +156 -0
  172. package/src/Retargeting.ts +29 -0
  173. package/src/RootMotion.ts +124 -0
  174. package/src/SceneAnimationBridge.ts +80 -0
  175. package/src/SecondaryAnimationFixtures.ts +212 -0
  176. package/src/Skeleton.ts +34 -0
  177. package/src/Skinning.ts +18 -0
  178. package/src/browser-index.ts +55 -0
  179. package/src/index.ts +56 -0
  180. package/src/threejs-compatibility/AnimationAction.ts +27 -0
  181. package/src/threejs-compatibility/AnimationClip.ts +16 -0
  182. package/src/threejs-compatibility/AnimationDiagnostics.ts +42 -0
  183. package/src/threejs-compatibility/AnimationMixer.ts +24 -0
  184. package/src/threejs-compatibility/MorphTargetMixer.ts +16 -0
  185. package/src/threejs-compatibility/Skeleton.ts +9 -0
  186. package/src/threejs-compatibility/SkinnedMesh.ts +12 -0
  187. package/src/threejs-compatibility/index.ts +11 -0
package/README.md ADDED
@@ -0,0 +1,19 @@
1
+ # @aura3d/animation
2
+
3
+ `@aura3d/animation` owns deterministic clip sampling, mixer state, root motion extraction, skeletal hierarchy data, skinning palette generation, blend trees, state machines, and scene/ECS animation bridges.
4
+
5
+ ## Public API
6
+
7
+ - `AnimationTrack`, `Keyframe`: typed scalar, vector, quaternion, and object keyframe sampling with strict keyframe ordering.
8
+ - `AnimationClip`, `AnimationEvent`: clip duration, track grouping, event metadata, and deterministic serialization.
9
+ - `AnimationAction`, `AnimationMixer`, `AnimationLayer`: playback state, pause/play controls, scrubbing, playback speed, looping, weights, crossfades, event dispatch, and target value application.
10
+ - `Bone`, `Skeleton`, `buildSkinningPalette`: bone hierarchy validation, world matrices, inverse-bind data, and renderer-facing matrix palettes.
11
+ - `BlendTree1D`, `BlendTree2D`, `AnimationStateMachine`: deterministic blend weights, priority-ordered state transitions, and graph debug snapshots.
12
+ - `extractRootMotion`, `applyRootMotion`: vector root-motion deltas for runtime targets, including loop-wrap displacement.
13
+ - `SceneAnimationBridge`, `ECSAnimationBridge`: public adapters that write sampled values into scene nodes and ECS transform-like data.
14
+
15
+ ## Verification
16
+
17
+ Animation sampling, serialization, loop events, browser clip controls, crossfade blending, root motion, state-machine debug graphs, skeleton palettes, scene bridges, inspector evidence, and browser-visible animation pixels are covered by `tests/unit/workstream4.physics-animation.test.ts` and `tests/browser/animation-browser.spec.ts`. Export and import consistency is covered by `pnpm verify:exports` and `pnpm verify:imports`.
18
+
19
+ Runtime support, retargeting limits, and unsupported authoring features are documented in `docs/animation/runtime-support.md`.
@@ -0,0 +1,40 @@
1
+ import type { AnimationClip } from "./AnimationClip.js";
2
+ import { type AnimationEvent } from "./AnimationEvents.js";
3
+ export type LoopMode = "once" | "repeat" | "pingpong";
4
+ export type AnimationActionSnapshot = {
5
+ readonly clipName: string;
6
+ readonly duration: number;
7
+ readonly time: number;
8
+ readonly weight: number;
9
+ readonly timeScale: number;
10
+ readonly playing: boolean;
11
+ readonly paused: boolean;
12
+ readonly loopMode: LoopMode;
13
+ };
14
+ export declare class AnimationAction {
15
+ readonly clip: AnimationClip;
16
+ time: number;
17
+ weight: number;
18
+ timeScale: number;
19
+ loopMode: LoopMode;
20
+ playing: boolean;
21
+ paused: boolean;
22
+ private pingPongForward;
23
+ private fadeDuration;
24
+ private fadeElapsed;
25
+ private fadeStartWeight;
26
+ private fadeTargetWeight;
27
+ constructor(clip: AnimationClip);
28
+ play(): this;
29
+ pause(): this;
30
+ stop(): this;
31
+ setWeight(weight: number): this;
32
+ setTimeScale(timeScale: number): this;
33
+ setLoop(loopMode: LoopMode): this;
34
+ reset(): this;
35
+ seek(time: number): this;
36
+ fadeTo(weight: number, duration: number): this;
37
+ update(delta: number): readonly AnimationEvent[];
38
+ snapshot(): AnimationActionSnapshot;
39
+ }
40
+ //# sourceMappingURL=AnimationAction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnimationAction.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationAction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE1E,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEtD,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B,CAAC;AAEF,qBAAa,eAAe;IAC1B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,IAAI,SAAK;IACT,MAAM,SAAK;IACX,SAAS,SAAK;IACd,QAAQ,EAAE,QAAQ,CAAY;IAC9B,OAAO,UAAS;IAChB,MAAM,UAAS;IACf,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,gBAAgB,CAAK;gBAEjB,IAAI,EAAE,aAAa;IAI/B,IAAI,IAAI,IAAI;IAMZ,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI;IAOZ,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ/B,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQrC,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAKjC,KAAK,IAAI,IAAI;IAMb,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQxB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAc9C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE;IAoDhD,QAAQ,IAAI,uBAAuB;CAYpC"}
@@ -0,0 +1,143 @@
1
+ import { eventsBetween } from "./AnimationEvents.js";
2
+ export class AnimationAction {
3
+ clip;
4
+ time = 0;
5
+ weight = 1;
6
+ timeScale = 1;
7
+ loopMode = "repeat";
8
+ playing = false;
9
+ paused = false;
10
+ pingPongForward = true;
11
+ fadeDuration = 0;
12
+ fadeElapsed = 0;
13
+ fadeStartWeight = 1;
14
+ fadeTargetWeight = 1;
15
+ constructor(clip) {
16
+ this.clip = clip;
17
+ }
18
+ play() {
19
+ this.playing = true;
20
+ this.paused = false;
21
+ return this;
22
+ }
23
+ pause() {
24
+ this.paused = true;
25
+ return this;
26
+ }
27
+ stop() {
28
+ this.playing = false;
29
+ this.paused = false;
30
+ this.time = 0;
31
+ return this;
32
+ }
33
+ setWeight(weight) {
34
+ if (!Number.isFinite(weight) || weight < 0) {
35
+ throw new Error("AnimationAction weight must be finite and non-negative.");
36
+ }
37
+ this.weight = weight;
38
+ return this;
39
+ }
40
+ setTimeScale(timeScale) {
41
+ if (!Number.isFinite(timeScale) || timeScale < 0) {
42
+ throw new Error("AnimationAction timeScale must be finite and non-negative.");
43
+ }
44
+ this.timeScale = timeScale;
45
+ return this;
46
+ }
47
+ setLoop(loopMode) {
48
+ this.loopMode = loopMode;
49
+ return this;
50
+ }
51
+ reset() {
52
+ this.time = 0;
53
+ this.pingPongForward = true;
54
+ return this;
55
+ }
56
+ seek(time) {
57
+ if (!Number.isFinite(time) || time < 0) {
58
+ throw new Error("AnimationAction seek time must be finite and non-negative.");
59
+ }
60
+ this.time = this.clip.duration > 0 ? Math.min(time, this.clip.duration) : 0;
61
+ return this;
62
+ }
63
+ fadeTo(weight, duration) {
64
+ if (!Number.isFinite(duration) || duration < 0 || !Number.isFinite(weight) || weight < 0) {
65
+ throw new Error("AnimationAction fade target and duration must be valid.");
66
+ }
67
+ this.fadeStartWeight = this.weight;
68
+ this.fadeTargetWeight = weight;
69
+ this.fadeDuration = duration;
70
+ this.fadeElapsed = 0;
71
+ if (duration === 0) {
72
+ this.weight = weight;
73
+ }
74
+ return this;
75
+ }
76
+ update(delta) {
77
+ if (!Number.isFinite(delta) || delta < 0) {
78
+ throw new Error("AnimationAction delta must be finite and non-negative.");
79
+ }
80
+ if (this.fadeDuration > 0) {
81
+ this.fadeElapsed = Math.min(this.fadeDuration, this.fadeElapsed + delta);
82
+ const t = this.fadeElapsed / this.fadeDuration;
83
+ this.weight = this.fadeStartWeight + (this.fadeTargetWeight - this.fadeStartWeight) * t;
84
+ if (this.fadeElapsed === this.fadeDuration) {
85
+ this.fadeDuration = 0;
86
+ }
87
+ }
88
+ if (!this.playing || this.paused || this.clip.duration === 0) {
89
+ return [];
90
+ }
91
+ const previous = this.time;
92
+ const scaledDelta = delta * this.timeScale;
93
+ let next = previous + scaledDelta;
94
+ let looped = false;
95
+ if (this.loopMode === "repeat") {
96
+ while (next > this.clip.duration) {
97
+ next -= this.clip.duration;
98
+ looped = true;
99
+ }
100
+ }
101
+ else if (this.loopMode === "once") {
102
+ next = Math.min(next, this.clip.duration);
103
+ if (next === this.clip.duration) {
104
+ this.playing = false;
105
+ }
106
+ }
107
+ else {
108
+ if (this.pingPongForward) {
109
+ while (next > this.clip.duration) {
110
+ next = this.clip.duration - (next - this.clip.duration);
111
+ this.pingPongForward = false;
112
+ looped = true;
113
+ }
114
+ }
115
+ else {
116
+ next = previous - scaledDelta;
117
+ while (next < 0) {
118
+ next = -next;
119
+ this.pingPongForward = true;
120
+ looped = true;
121
+ }
122
+ }
123
+ }
124
+ this.time = next;
125
+ if (this.clip.events.length === 0) {
126
+ return [];
127
+ }
128
+ return eventsBetween(this.clip.events, this.clip.name, previous, next, this.clip.duration, looped);
129
+ }
130
+ snapshot() {
131
+ return {
132
+ clipName: this.clip.name,
133
+ duration: this.clip.duration,
134
+ time: this.time,
135
+ weight: this.weight,
136
+ timeScale: this.timeScale,
137
+ playing: this.playing,
138
+ paused: this.paused,
139
+ loopMode: this.loopMode
140
+ };
141
+ }
142
+ }
143
+ //# sourceMappingURL=AnimationAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnimationAction.js","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationAction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { AnimationEventMarker } from "./AnimationEvents.js";
2
+ import { AnimationTrack, type SerializedAnimationTrack } from "./AnimationTrack.js";
3
+ export type AnimationClipDescriptor = {
4
+ readonly name: string;
5
+ readonly duration?: number;
6
+ readonly tracks: readonly AnimationTrack[];
7
+ readonly events?: readonly AnimationEventMarker[];
8
+ };
9
+ export type SerializedAnimationClip = {
10
+ readonly name: string;
11
+ readonly duration: number;
12
+ readonly tracks: readonly SerializedAnimationTrack[];
13
+ readonly events: readonly AnimationEventMarker[];
14
+ };
15
+ export declare class AnimationClip {
16
+ readonly name: string;
17
+ readonly tracks: readonly AnimationTrack[];
18
+ readonly events: readonly AnimationEventMarker[];
19
+ readonly duration: number;
20
+ constructor(descriptor: AnimationClipDescriptor);
21
+ toJSON(): SerializedAnimationClip;
22
+ static fromJSON(serialized: SerializedAnimationClip): AnimationClip;
23
+ }
24
+ //# sourceMappingURL=AnimationClip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnimationClip.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationClip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,KAAK,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAEpF,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACnD,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACrD,QAAQ,CAAC,MAAM,EAAE,SAAS,oBAAoB,EAAE,CAAC;CAClD,CAAC;AAEF,qBAAa,aAAa;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,UAAU,EAAE,uBAAuB;IAsB/C,MAAM,IAAI,uBAAuB;IASjC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,uBAAuB,GAAG,aAAa;CAQpE"}
@@ -0,0 +1,45 @@
1
+ import { AnimationTrack } from "./AnimationTrack.js";
2
+ export class AnimationClip {
3
+ name;
4
+ tracks;
5
+ events;
6
+ duration;
7
+ constructor(descriptor) {
8
+ if (descriptor.name.trim().length === 0) {
9
+ throw new Error("AnimationClip name cannot be empty.");
10
+ }
11
+ this.name = descriptor.name;
12
+ this.tracks = [...descriptor.tracks];
13
+ this.events = [...(descriptor.events ?? [])].sort((a, b) => a.time - b.time || a.name.localeCompare(b.name));
14
+ const trackDuration = this.tracks.reduce((duration, track) => Math.max(duration, track.duration), 0);
15
+ this.duration = descriptor.duration ?? trackDuration;
16
+ if (!Number.isFinite(this.duration) || this.duration < 0) {
17
+ throw new Error("AnimationClip duration must be finite and non-negative.");
18
+ }
19
+ if (this.duration < trackDuration) {
20
+ throw new Error("AnimationClip duration cannot be shorter than its tracks.");
21
+ }
22
+ for (const event of this.events) {
23
+ if (!Number.isFinite(event.time) || event.time < 0 || event.time > this.duration) {
24
+ throw new Error(`Animation event ${event.name} is outside clip duration.`);
25
+ }
26
+ }
27
+ }
28
+ toJSON() {
29
+ return {
30
+ name: this.name,
31
+ duration: this.duration,
32
+ tracks: this.tracks.map((track) => track.toJSON()),
33
+ events: this.events.map((event) => ({ ...event }))
34
+ };
35
+ }
36
+ static fromJSON(serialized) {
37
+ return new AnimationClip({
38
+ name: serialized.name,
39
+ duration: serialized.duration,
40
+ tracks: serialized.tracks.map((track) => AnimationTrack.fromJSON(track)),
41
+ events: serialized.events
42
+ });
43
+ }
44
+ }
45
+ //# sourceMappingURL=AnimationClip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnimationClip.js","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationClip.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAiC,MAAM,qBAAqB,CAAC;AAgBpF,MAAM,OAAO,aAAa;IACf,IAAI,CAAS;IACb,MAAM,CAA4B;IAClC,MAAM,CAAkC;IACxC,QAAQ,CAAS;IAE1B,YAAY,UAAmC;QAC7C,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7G,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACrG,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,aAAa,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,GAAG,aAAa,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACjF,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,CAAC,IAAI,4BAA4B,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAClD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;SACnD,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,UAAmC;QACjD,OAAO,IAAI,aAAa,CAAC;YACvB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACxE,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,57 @@
1
+ export type AnimationPlaybackDirection = 1 | -1;
2
+ export type AnimationClipEventType = "marker" | "hitbox" | "hurtbox" | "footstep" | "sfx" | "vfx" | "camera" | "state" | "custom" | (string & {});
3
+ export interface AnimationClipEvent<TName extends string = string, TPayload = unknown> {
4
+ readonly id?: string;
5
+ readonly name: TName;
6
+ readonly type?: AnimationClipEventType;
7
+ readonly time: number;
8
+ readonly duration?: number;
9
+ readonly payload?: TPayload;
10
+ readonly once?: boolean;
11
+ readonly tags?: readonly string[];
12
+ }
13
+ export interface AnimationClipEventSource<TEvent extends AnimationClipEvent = AnimationClipEvent> {
14
+ readonly id: string;
15
+ readonly duration: number;
16
+ readonly events?: readonly TEvent[];
17
+ }
18
+ export interface AnimationClipEventSamplingOptions {
19
+ readonly from: number;
20
+ readonly to: number;
21
+ readonly duration?: number;
22
+ readonly loop?: boolean;
23
+ readonly direction?: AnimationPlaybackDirection;
24
+ readonly includeStart?: boolean;
25
+ readonly includeEnd?: boolean;
26
+ readonly loopCount?: number;
27
+ readonly playbackTime?: number;
28
+ }
29
+ export interface AnimationClipEventInvocation<TEvent extends AnimationClipEvent = AnimationClipEvent, TClipId extends string = string> {
30
+ readonly clipId: TClipId;
31
+ readonly event: TEvent;
32
+ readonly time: number;
33
+ readonly previousTime: number;
34
+ readonly localTime: number;
35
+ readonly normalizedTime: number;
36
+ readonly loopCount: number;
37
+ readonly direction: AnimationPlaybackDirection;
38
+ readonly playbackTime?: number;
39
+ }
40
+ export type AnimationClipEventListener<TPayload> = (payload: TPayload) => void;
41
+ export type AnimationClipEventUnsubscribe = () => void;
42
+ export declare class AnimationEventDispatcher<TEventMap = Record<string, unknown>> {
43
+ private readonly listeners;
44
+ on<K extends Extract<keyof TEventMap, string>>(type: K, listener: AnimationClipEventListener<TEventMap[K]>): AnimationClipEventUnsubscribe;
45
+ once<K extends Extract<keyof TEventMap, string>>(type: K, listener: AnimationClipEventListener<TEventMap[K]>): AnimationClipEventUnsubscribe;
46
+ off<K extends Extract<keyof TEventMap, string>>(type: K, listener: AnimationClipEventListener<TEventMap[K]>): void;
47
+ emit<K extends Extract<keyof TEventMap, string>>(type: K, payload: TEventMap[K]): void;
48
+ clear(type?: Extract<keyof TEventMap, string>): void;
49
+ listenerCount(type?: Extract<keyof TEventMap, string>): number;
50
+ }
51
+ export declare function createAnimationClipEvent<TName extends string, TPayload = unknown>(name: TName, time: number, options?: Omit<AnimationClipEvent<TName, TPayload>, "name" | "time">): AnimationClipEvent<TName, TPayload>;
52
+ export declare function normalizeClipEvents<TEvent extends AnimationClipEvent>(events?: readonly TEvent[]): readonly TEvent[];
53
+ export declare function animationClipEventKey(clipId: string, event: AnimationClipEvent): string;
54
+ export declare function sampleClipEvents<TEvent extends AnimationClipEvent, TClipId extends string = string>(source: AnimationClipEventSource<TEvent> & {
55
+ readonly id: TClipId;
56
+ }, options: AnimationClipEventSamplingOptions): AnimationClipEventInvocation<TEvent, TClipId>[];
57
+ //# sourceMappingURL=AnimationClipEvents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnimationClipEvents.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationClipEvents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
1
+ export class AnimationEventDispatcher {
2
+ listeners = new Map();
3
+ on(type, listener) {
4
+ const listeners = this.listeners.get(type) ?? new Set();
5
+ listeners.add(listener);
6
+ this.listeners.set(type, listeners);
7
+ return () => {
8
+ this.off(type, listener);
9
+ };
10
+ }
11
+ once(type, listener) {
12
+ const unsubscribe = this.on(type, (payload) => {
13
+ unsubscribe();
14
+ listener(payload);
15
+ });
16
+ return unsubscribe;
17
+ }
18
+ off(type, listener) {
19
+ const listeners = this.listeners.get(type);
20
+ if (!listeners)
21
+ return;
22
+ listeners.delete(listener);
23
+ if (listeners.size === 0) {
24
+ this.listeners.delete(type);
25
+ }
26
+ }
27
+ emit(type, payload) {
28
+ const listeners = this.listeners.get(type);
29
+ if (!listeners)
30
+ return;
31
+ for (const listener of [...listeners]) {
32
+ listener(payload);
33
+ }
34
+ }
35
+ clear(type) {
36
+ if (type) {
37
+ this.listeners.delete(type);
38
+ return;
39
+ }
40
+ this.listeners.clear();
41
+ }
42
+ listenerCount(type) {
43
+ if (type) {
44
+ return this.listeners.get(type)?.size ?? 0;
45
+ }
46
+ let count = 0;
47
+ for (const listeners of this.listeners.values()) {
48
+ count += listeners.size;
49
+ }
50
+ return count;
51
+ }
52
+ }
53
+ export function createAnimationClipEvent(name, time, options = {}) {
54
+ return {
55
+ ...options,
56
+ name,
57
+ time
58
+ };
59
+ }
60
+ export function normalizeClipEvents(events = []) {
61
+ return [...events].sort((a, b) => {
62
+ if (a.time !== b.time)
63
+ return a.time - b.time;
64
+ return a.name.localeCompare(b.name);
65
+ });
66
+ }
67
+ export function animationClipEventKey(clipId, event) {
68
+ return `${clipId}:${event.id ?? event.name}:${event.type ?? "marker"}:${event.time}`;
69
+ }
70
+ export function sampleClipEvents(source, options) {
71
+ const events = normalizeClipEvents(source.events);
72
+ if (events.length === 0)
73
+ return [];
74
+ const duration = sanitizeDuration(options.duration ?? source.duration);
75
+ const direction = options.direction ?? (options.to >= options.from ? 1 : -1);
76
+ const includeStart = options.includeStart ?? false;
77
+ const includeEnd = options.includeEnd ?? true;
78
+ const loopCount = options.loopCount ?? 0;
79
+ const playbackTime = options.playbackTime;
80
+ if (duration === 0) {
81
+ return events
82
+ .filter((event) => event.time === 0 && includesBoundary(includeStart, includeEnd))
83
+ .map((event) => createInvocation(source.id, event, options.from, 0, duration, loopCount, direction, playbackTime));
84
+ }
85
+ const from = normalizeLocalTime(options.from, duration, options.loop ?? false);
86
+ const to = normalizeLocalTime(options.to, duration, options.loop ?? false);
87
+ const segments = createSamplingSegments(from, to, duration, options.loop ?? false, direction);
88
+ const invocations = [];
89
+ for (let segmentIndex = 0; segmentIndex < segments.length; segmentIndex += 1) {
90
+ const segment = segments[segmentIndex];
91
+ const segmentIncludeStart = segmentIndex === 0 ? includeStart : true;
92
+ const segmentIncludeEnd = segmentIndex === segments.length - 1 ? includeEnd : true;
93
+ const matching = events.filter((event) => eventInSegment(event.time, segment.start, segment.end, segmentIncludeStart, segmentIncludeEnd));
94
+ if (direction === -1) {
95
+ matching.reverse();
96
+ }
97
+ for (const event of matching) {
98
+ invocations.push(createInvocation(source.id, event, options.from, event.time, duration, loopCount + segment.loopOffset, direction, playbackTime));
99
+ }
100
+ }
101
+ return invocations;
102
+ }
103
+ function createSamplingSegments(from, to, duration, loop, direction) {
104
+ if (!loop) {
105
+ return [
106
+ {
107
+ start: Math.min(from, to),
108
+ end: Math.max(from, to),
109
+ loopOffset: 0
110
+ }
111
+ ];
112
+ }
113
+ if (direction === 1) {
114
+ if (to >= from) {
115
+ return [{ start: from, end: to, loopOffset: 0 }];
116
+ }
117
+ return [
118
+ { start: from, end: duration, loopOffset: 0 },
119
+ { start: 0, end: to, loopOffset: 1 }
120
+ ];
121
+ }
122
+ if (to <= from) {
123
+ return [{ start: to, end: from, loopOffset: 0 }];
124
+ }
125
+ return [
126
+ { start: 0, end: from, loopOffset: 0 },
127
+ { start: to, end: duration, loopOffset: 1 }
128
+ ];
129
+ }
130
+ function createInvocation(clipId, event, previousTime, localTime, duration, loopCount, direction, playbackTime) {
131
+ return {
132
+ clipId,
133
+ event,
134
+ time: event.time,
135
+ previousTime,
136
+ localTime,
137
+ normalizedTime: duration > 0 ? event.time / duration : 0,
138
+ loopCount,
139
+ direction,
140
+ playbackTime
141
+ };
142
+ }
143
+ function eventInSegment(time, start, end, includeStart, includeEnd) {
144
+ const startsAfter = includeStart ? time >= start : time > start;
145
+ const endsBefore = includeEnd ? time <= end : time < end;
146
+ return startsAfter && endsBefore;
147
+ }
148
+ function includesBoundary(includeStart, includeEnd) {
149
+ return includeStart || includeEnd;
150
+ }
151
+ function normalizeLocalTime(time, duration, loop) {
152
+ if (!Number.isFinite(time))
153
+ return 0;
154
+ if (!loop)
155
+ return clamp(time, 0, duration);
156
+ return positiveModulo(time, duration);
157
+ }
158
+ function sanitizeDuration(duration) {
159
+ if (!Number.isFinite(duration) || duration <= 0)
160
+ return 0;
161
+ return duration;
162
+ }
163
+ function positiveModulo(value, divisor) {
164
+ if (divisor <= 0)
165
+ return 0;
166
+ return ((value % divisor) + divisor) % divisor;
167
+ }
168
+ function clamp(value, min, max) {
169
+ return Math.min(max, Math.max(min, value));
170
+ }
171
+ //# sourceMappingURL=AnimationClipEvents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnimationClipEvents.js","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationClipEvents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import { type AnimationClipEvent } from "./AnimationClipEvents.js";
2
+ export type AnimationClipId = string;
3
+ export type AnimationTrackTarget = "translation" | "rotation" | "scale" | "morph" | "material" | "visibility" | (string & {});
4
+ export interface AnimationKeyframe<TValue = unknown> {
5
+ readonly time: number;
6
+ readonly value: TValue;
7
+ readonly easing?: string;
8
+ }
9
+ export interface AnimationTrack<TValue = unknown> {
10
+ readonly id?: string;
11
+ readonly target: string;
12
+ readonly property?: AnimationTrackTarget;
13
+ readonly keyframes?: readonly AnimationKeyframe<TValue>[];
14
+ readonly metadata?: Record<string, unknown>;
15
+ }
16
+ export interface AnimationClipSampleContext<TClipId extends string = string, TEvent extends AnimationClipEvent = AnimationClipEvent> {
17
+ readonly clip: RegisteredAnimationClip<TClipId, TEvent>;
18
+ readonly time: number;
19
+ readonly normalizedTime: number;
20
+ readonly playbackState?: unknown;
21
+ }
22
+ export type AnimationClipSampler<TPose = unknown, TClipId extends string = string, TEvent extends AnimationClipEvent = AnimationClipEvent> = (context: AnimationClipSampleContext<TClipId, TEvent>) => TPose;
23
+ export interface AnimationClipDefinition<TClipId extends string = string, TEvent extends AnimationClipEvent = AnimationClipEvent, TPose = unknown> {
24
+ readonly id: TClipId;
25
+ readonly name?: string;
26
+ readonly duration: number;
27
+ readonly frameRate?: number;
28
+ readonly loop?: boolean;
29
+ readonly tags?: readonly string[];
30
+ readonly tracks?: readonly AnimationTrack[];
31
+ readonly events?: readonly TEvent[];
32
+ readonly sample?: AnimationClipSampler<TPose, TClipId, TEvent>;
33
+ readonly source?: string;
34
+ readonly metadata?: Record<string, unknown>;
35
+ }
36
+ export interface RegisteredAnimationClip<TClipId extends string = string, TEvent extends AnimationClipEvent = AnimationClipEvent, TPose = unknown> extends AnimationClipDefinition<TClipId, TEvent, TPose> {
37
+ readonly duration: number;
38
+ readonly loop: boolean;
39
+ readonly tags: readonly string[];
40
+ readonly tracks: readonly AnimationTrack[];
41
+ readonly events: readonly TEvent[];
42
+ readonly registryIndex: number;
43
+ }
44
+ export interface AnimationClipRegistryOptions {
45
+ readonly replace?: boolean;
46
+ }
47
+ export type AnimationClipRegistryDiagnosticSeverity = "info" | "warning" | "error";
48
+ export interface AnimationClipRegistryDiagnostic<TClipId extends string = string> {
49
+ readonly severity: AnimationClipRegistryDiagnosticSeverity;
50
+ readonly code: string;
51
+ readonly message: string;
52
+ readonly clipId?: TClipId;
53
+ }
54
+ export interface AnimationClipManifest<TClipId extends string = string, TEvent extends AnimationClipEvent = AnimationClipEvent, TPose = unknown> {
55
+ readonly clips: readonly AnimationClipDefinition<TClipId, TEvent, TPose>[];
56
+ }
57
+ export declare class AnimationClipRegistry<TClipId extends string = string, TEvent extends AnimationClipEvent = AnimationClipEvent, TPose = unknown> {
58
+ private readonly clips;
59
+ private nextRegistryIndex;
60
+ constructor(clips?: readonly AnimationClipDefinition<TClipId, TEvent, TPose>[], options?: AnimationClipRegistryOptions);
61
+ static fromManifest<TClipId extends string = string, TEvent extends AnimationClipEvent = AnimationClipEvent, TPose = unknown>(manifest: AnimationClipManifest<TClipId, TEvent, TPose>, options?: AnimationClipRegistryOptions): AnimationClipRegistry<TClipId, TEvent, TPose>;
62
+ register(definition: AnimationClipDefinition<TClipId, TEvent, TPose>, options?: AnimationClipRegistryOptions): RegisteredAnimationClip<TClipId, TEvent, TPose>;
63
+ registerMany(definitions: readonly AnimationClipDefinition<TClipId, TEvent, TPose>[], options?: AnimationClipRegistryOptions): readonly RegisteredAnimationClip<TClipId, TEvent, TPose>[];
64
+ get(id: TClipId): RegisteredAnimationClip<TClipId, TEvent, TPose> | undefined;
65
+ require(id: TClipId): RegisteredAnimationClip<TClipId, TEvent, TPose>;
66
+ has(id: TClipId): boolean;
67
+ remove(id: TClipId): boolean;
68
+ clear(): void;
69
+ ids(): readonly TClipId[];
70
+ list(): readonly RegisteredAnimationClip<TClipId, TEvent, TPose>[];
71
+ findByTag(tag: string): readonly RegisteredAnimationClip<TClipId, TEvent, TPose>[];
72
+ toManifest(): AnimationClipManifest<TClipId, TEvent, TPose>;
73
+ diagnose(): readonly AnimationClipRegistryDiagnostic<TClipId>[];
74
+ }
75
+ export declare function createAnimationClipRegistry<TClipId extends string = string, TEvent extends AnimationClipEvent = AnimationClipEvent, TPose = unknown>(clips?: readonly AnimationClipDefinition<TClipId, TEvent, TPose>[], options?: AnimationClipRegistryOptions): AnimationClipRegistry<TClipId, TEvent, TPose>;
76
+ //# sourceMappingURL=AnimationClipRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnimationClipRegistry.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationClipRegistry.ts"],"names":[],"mappings":"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"}