@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
@@ -0,0 +1,154 @@
1
+ export class AnimationStateMachine {
2
+ states = new Map();
3
+ parameters = {};
4
+ currentState;
5
+ stateTime = 0;
6
+ constructor(states, initialState) {
7
+ for (const state of states) {
8
+ if (state.duration !== undefined && (!Number.isFinite(state.duration) || state.duration < 0)) {
9
+ throw new Error(`State ${state.name} has invalid duration.`);
10
+ }
11
+ for (const transition of state.transitions ?? []) {
12
+ if (transition.exitTime !== undefined && (!Number.isFinite(transition.exitTime) || transition.exitTime < 0)) {
13
+ throw new Error(`Transition from ${state.name} to ${transition.to} has invalid exit time.`);
14
+ }
15
+ }
16
+ this.states.set(state.name, state);
17
+ }
18
+ if (!this.states.has(initialState)) {
19
+ throw new Error(`Initial state ${initialState} does not exist.`);
20
+ }
21
+ for (const state of this.states.values()) {
22
+ if (state.onComplete !== undefined && !this.states.has(state.onComplete)) {
23
+ throw new Error(`State ${state.name} completion target ${state.onComplete} does not exist.`);
24
+ }
25
+ }
26
+ this.currentState = initialState;
27
+ this.resetParametersForState(this.requireState(initialState));
28
+ }
29
+ setParameter(name, value) {
30
+ this.parameters[name] = value;
31
+ }
32
+ update(delta = 0) {
33
+ if (!Number.isFinite(delta) || delta < 0) {
34
+ throw new Error("AnimationStateMachine delta must be finite and non-negative.");
35
+ }
36
+ this.stateTime += delta;
37
+ const state = this.requireState(this.currentState);
38
+ if (isStateComplete(state, this.stateTime)) {
39
+ if (state.completedParameter) {
40
+ this.parameters[state.completedParameter] = true;
41
+ }
42
+ if (state.onComplete) {
43
+ this.transitionTo(state.onComplete);
44
+ return this.currentState;
45
+ }
46
+ if (state.terminal || state.oneShot) {
47
+ return this.currentState;
48
+ }
49
+ }
50
+ if (state.terminal || state.oneShot) {
51
+ return this.currentState;
52
+ }
53
+ const transition = [...(state.transitions ?? [])]
54
+ .filter((candidate) => candidate.condition(this.parameters))
55
+ .filter((candidate) => candidate.exitTime === undefined || this.stateTime >= candidate.exitTime)
56
+ .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0) || a.to.localeCompare(b.to))[0];
57
+ if (transition) {
58
+ if (!this.states.has(transition.to)) {
59
+ throw new Error(`Transition target ${transition.to} does not exist.`);
60
+ }
61
+ consumeParameters(this.parameters, transition.consumeParameters);
62
+ this.transitionTo(transition.to);
63
+ }
64
+ return this.currentState;
65
+ }
66
+ graphSnapshot() {
67
+ const states = [];
68
+ const transitions = [];
69
+ for (const state of this.states.values()) {
70
+ const stateTransitions = state.transitions ?? [];
71
+ states.push({
72
+ name: state.name,
73
+ current: state.name === this.currentState,
74
+ transitionCount: stateTransitions.length,
75
+ ...(state.duration === undefined ? {} : { duration: state.duration }),
76
+ ...(state.oneShot ? { oneShot: true } : {}),
77
+ ...(state.terminal ? { terminal: true } : {}),
78
+ ...(state.name === this.currentState && isStateComplete(state, this.stateTime) ? { completed: true } : {}),
79
+ ...(state.onComplete === undefined ? {} : { onComplete: state.onComplete })
80
+ });
81
+ stateTransitions.forEach((transition, index) => {
82
+ transitions.push({
83
+ from: state.name,
84
+ to: transition.to,
85
+ index,
86
+ priority: transition.priority ?? 0,
87
+ label: transition.label ?? `${state.name}->${transition.to}`,
88
+ ...(transition.exitTime === undefined ? {} : { exitTime: transition.exitTime }),
89
+ ...(transition.consumeParameters === undefined || transition.consumeParameters.length === 0
90
+ ? {}
91
+ : { consumeParameters: [...transition.consumeParameters] })
92
+ });
93
+ });
94
+ }
95
+ return {
96
+ currentState: this.currentState,
97
+ stateTime: this.stateTime,
98
+ parameters: { ...this.parameters },
99
+ states,
100
+ transitions
101
+ };
102
+ }
103
+ debugGraph() {
104
+ const snapshot = this.graphSnapshot();
105
+ const lines = [
106
+ `AnimationStateMachine current=${snapshot.currentState} time=${formatNumber(snapshot.stateTime)}`
107
+ ];
108
+ for (const state of snapshot.states) {
109
+ lines.push(`state ${state.name}${state.current ? " *" : ""} transitions=${state.transitionCount}`);
110
+ for (const transition of snapshot.transitions.filter((candidate) => candidate.from === state.name)) {
111
+ const exitTime = transition.exitTime === undefined ? "" : ` exit=${formatNumber(transition.exitTime)}`;
112
+ lines.push(` -> ${transition.to} priority=${transition.priority}${exitTime} label=${transition.label}`);
113
+ }
114
+ }
115
+ return lines.join("\n");
116
+ }
117
+ requireState(name) {
118
+ const state = this.states.get(name);
119
+ if (!state) {
120
+ throw new Error(`Current state ${name} does not exist.`);
121
+ }
122
+ return state;
123
+ }
124
+ transitionTo(name) {
125
+ const state = this.requireState(name);
126
+ this.currentState = name;
127
+ this.stateTime = 0;
128
+ this.resetParametersForState(state);
129
+ }
130
+ resetParametersForState(state) {
131
+ consumeParameters(this.parameters, state.resetParametersOnEnter);
132
+ }
133
+ }
134
+ function formatNumber(value) {
135
+ return Number(value.toFixed(6)).toString();
136
+ }
137
+ function isStateComplete(state, stateTime) {
138
+ return state.duration !== undefined && stateTime >= state.duration;
139
+ }
140
+ function consumeParameters(parameters, names) {
141
+ for (const name of names ?? []) {
142
+ const value = parameters[name];
143
+ if (typeof value === "boolean") {
144
+ parameters[name] = false;
145
+ }
146
+ else if (typeof value === "number") {
147
+ parameters[name] = 0;
148
+ }
149
+ else if (typeof value === "string") {
150
+ parameters[name] = "";
151
+ }
152
+ }
153
+ }
154
+ //# sourceMappingURL=AnimationStateMachine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnimationStateMachine.js","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationStateMachine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type AnimationValue, type Keyframe, type SerializedKeyframe } from "./Keyframe.js";
2
+ export type TrackValueType = "scalar" | "vector3" | "quaternion" | "number-array" | "boolean" | "string";
3
+ export type AnimationTrackDescriptor<T extends AnimationValue = AnimationValue> = {
4
+ readonly target: string;
5
+ readonly valueType: TrackValueType;
6
+ readonly keyframes: readonly Keyframe<T>[];
7
+ };
8
+ export type SerializedAnimationTrack<T extends AnimationValue = AnimationValue> = {
9
+ readonly target: string;
10
+ readonly valueType: TrackValueType;
11
+ readonly keyframes: readonly SerializedKeyframe<T>[];
12
+ };
13
+ export declare class AnimationTrack<T extends AnimationValue = AnimationValue> {
14
+ readonly target: string;
15
+ readonly valueType: TrackValueType;
16
+ readonly keyframes: readonly Keyframe<T>[];
17
+ readonly duration: number;
18
+ constructor(descriptor: AnimationTrackDescriptor<T>);
19
+ sample(time: number): T;
20
+ toJSON(): SerializedAnimationTrack<T>;
21
+ static fromJSON<T extends AnimationValue = AnimationValue>(serialized: SerializedAnimationTrack<T>): AnimationTrack<T>;
22
+ }
23
+ //# sourceMappingURL=AnimationTrack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnimationTrack.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationTrack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmH,KAAK,cAAc,EAAE,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAE7M,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,GAAG,cAAc,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEzG,MAAM,MAAM,wBAAwB,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAAI;IAChF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,wBAAwB,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAAI;IAChF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,SAAS,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;CACtD,CAAC;AAEF,qBAAa,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc;IACnE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,UAAU,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAWnD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC;IA4BvB,MAAM,IAAI,wBAAwB,CAAC,CAAC,CAAC;IAQrC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;CAOvH"}
@@ -0,0 +1,124 @@
1
+ import { cloneAnimationValue, deserializeKeyframe, lerpNumber, lerpVec3, serializeKeyframe, slerpQuat, validateKeyframes } from "./Keyframe.js";
2
+ export class AnimationTrack {
3
+ target;
4
+ valueType;
5
+ keyframes;
6
+ duration;
7
+ constructor(descriptor) {
8
+ if (descriptor.target.trim().length === 0) {
9
+ throw new Error("AnimationTrack target cannot be empty.");
10
+ }
11
+ validateKeyframes(descriptor.keyframes);
12
+ this.target = descriptor.target;
13
+ this.valueType = descriptor.valueType;
14
+ this.keyframes = descriptor.keyframes.map((keyframe) => ({ ...keyframe, value: cloneAnimationValue(keyframe.value) }));
15
+ this.duration = this.keyframes[this.keyframes.length - 1].time;
16
+ }
17
+ sample(time) {
18
+ if (!Number.isFinite(time)) {
19
+ throw new Error("AnimationTrack sample time must be finite.");
20
+ }
21
+ if (time <= this.keyframes[0].time) {
22
+ return cloneAnimationValue(this.keyframes[0].value);
23
+ }
24
+ const last = this.keyframes[this.keyframes.length - 1];
25
+ if (time >= last.time) {
26
+ return cloneAnimationValue(last.value);
27
+ }
28
+ for (let index = 0; index < this.keyframes.length - 1; index += 1) {
29
+ const a = this.keyframes[index];
30
+ const b = this.keyframes[index + 1];
31
+ if (time >= a.time && time <= b.time) {
32
+ if (a.interpolation === "step" || b.time === a.time) {
33
+ return cloneAnimationValue(a.value);
34
+ }
35
+ const t = (time - a.time) / (b.time - a.time);
36
+ if (a.interpolation === "cubicspline") {
37
+ return interpolateCubicSpline(this.valueType, a.value, b.value, a.outTangent, b.inTangent, t, b.time - a.time);
38
+ }
39
+ return interpolate(this.valueType, a.value, b.value, t);
40
+ }
41
+ }
42
+ return cloneAnimationValue(last.value);
43
+ }
44
+ toJSON() {
45
+ return {
46
+ target: this.target,
47
+ valueType: this.valueType,
48
+ keyframes: this.keyframes.map((keyframe) => serializeKeyframe(keyframe))
49
+ };
50
+ }
51
+ static fromJSON(serialized) {
52
+ return new AnimationTrack({
53
+ target: serialized.target,
54
+ valueType: serialized.valueType,
55
+ keyframes: serialized.keyframes.map((keyframe) => deserializeKeyframe(keyframe))
56
+ });
57
+ }
58
+ }
59
+ function interpolateCubicSpline(type, a, b, outTangent, inTangent, t, deltaTime) {
60
+ if (outTangent === undefined || inTangent === undefined) {
61
+ throw new Error("CUBICSPLINE keyframes require outTangent on the first keyframe and inTangent on the next keyframe.");
62
+ }
63
+ switch (type) {
64
+ case "scalar":
65
+ return cubicScalar(a, b, outTangent, inTangent, t, deltaTime);
66
+ case "vector3":
67
+ return [
68
+ cubicScalar(a[0], b[0], outTangent[0], inTangent[0], t, deltaTime),
69
+ cubicScalar(a[1], b[1], outTangent[1], inTangent[1], t, deltaTime),
70
+ cubicScalar(a[2], b[2], outTangent[2], inTangent[2], t, deltaTime)
71
+ ];
72
+ case "quaternion":
73
+ return normalizeCubicQuaternion(a, b, outTangent, inTangent, t, deltaTime);
74
+ case "number-array":
75
+ return cubicNumberArray(a, b, outTangent, inTangent, t, deltaTime);
76
+ case "boolean":
77
+ case "string":
78
+ throw new Error(`CUBICSPLINE interpolation is not supported for ${type} animation tracks.`);
79
+ }
80
+ }
81
+ function cubicScalar(a, b, outTangent, inTangent, t, deltaTime) {
82
+ const t2 = t * t;
83
+ const t3 = t2 * t;
84
+ return ((2 * t3 - 3 * t2 + 1) * a +
85
+ (t3 - 2 * t2 + t) * deltaTime * outTangent +
86
+ (-2 * t3 + 3 * t2) * b +
87
+ (t3 - t2) * deltaTime * inTangent);
88
+ }
89
+ function cubicNumberArray(a, b, outTangent, inTangent, t, deltaTime) {
90
+ if (a.length !== b.length || a.length !== outTangent.length || b.length !== inTangent.length) {
91
+ throw new Error("CUBICSPLINE number-array keyframes require matching value and tangent lengths.");
92
+ }
93
+ return a.map((value, index) => cubicScalar(value, b[index], outTangent[index], inTangent[index], t, deltaTime));
94
+ }
95
+ function normalizeCubicQuaternion(a, b, outTangent, inTangent, t, deltaTime) {
96
+ return slerpQuat([0, 0, 0, 1], [
97
+ cubicScalar(a[0], b[0], outTangent[0], inTangent[0], t, deltaTime),
98
+ cubicScalar(a[1], b[1], outTangent[1], inTangent[1], t, deltaTime),
99
+ cubicScalar(a[2], b[2], outTangent[2], inTangent[2], t, deltaTime),
100
+ cubicScalar(a[3], b[3], outTangent[3], inTangent[3], t, deltaTime)
101
+ ], 1);
102
+ }
103
+ function interpolate(type, a, b, t) {
104
+ switch (type) {
105
+ case "scalar":
106
+ return lerpNumber(a, b, t);
107
+ case "vector3":
108
+ return lerpVec3(a, b, t);
109
+ case "quaternion":
110
+ return slerpQuat(a, b, t);
111
+ case "number-array":
112
+ return interpolateNumberArray(a, b, t);
113
+ case "boolean":
114
+ case "string":
115
+ return t < 1 ? a : b;
116
+ }
117
+ }
118
+ function interpolateNumberArray(a, b, t) {
119
+ if (a.length !== b.length) {
120
+ throw new Error("number-array animation keyframes require matching lengths.");
121
+ }
122
+ return a.map((value, index) => lerpNumber(value, b[index], t));
123
+ }
124
+ //# sourceMappingURL=AnimationTrack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnimationTrack.js","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationTrack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export type BlendTreeChild<T> = {
2
+ readonly value: T;
3
+ readonly threshold: number;
4
+ };
5
+ export type BlendTree2DChild<T> = {
6
+ readonly value: T;
7
+ readonly position: readonly [number, number];
8
+ };
9
+ export type BlendTreeWeight<T> = {
10
+ readonly value: T;
11
+ readonly weight: number;
12
+ };
13
+ export declare class BlendTree1D<T> {
14
+ readonly children: readonly BlendTreeChild<T>[];
15
+ constructor(children: readonly BlendTreeChild<T>[]);
16
+ weights(parameter: number): readonly BlendTreeWeight<T>[];
17
+ }
18
+ export declare class BlendTree2D<T> {
19
+ readonly children: readonly BlendTree2DChild<T>[];
20
+ constructor(children: readonly BlendTree2DChild<T>[]);
21
+ weights(parameter: readonly [number, number]): readonly BlendTreeWeight<T>[];
22
+ }
23
+ //# sourceMappingURL=BlendTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlendTree.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/BlendTree.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC9B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI;IAChC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAC/B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,qBAAa,WAAW,CAAC,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEpC,QAAQ,EAAE,SAAS,cAAc,CAAC,CAAC,CAAC,EAAE;IAOlD,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE;CAsB1D;AAED,qBAAa,WAAW,CAAC,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEtC,QAAQ,EAAE,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAAE;IAYpD,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE;CAwB7E"}
@@ -0,0 +1,68 @@
1
+ export class BlendTree1D {
2
+ children;
3
+ constructor(children) {
4
+ if (children.length === 0) {
5
+ throw new Error("BlendTree1D requires at least one child.");
6
+ }
7
+ this.children = [...children].sort((a, b) => a.threshold - b.threshold);
8
+ }
9
+ weights(parameter) {
10
+ if (!Number.isFinite(parameter)) {
11
+ throw new Error("Blend parameter must be finite.");
12
+ }
13
+ if (this.children.length === 1 || parameter <= this.children[0].threshold) {
14
+ return [{ value: this.children[0].value, weight: 1 }];
15
+ }
16
+ const last = this.children[this.children.length - 1];
17
+ if (parameter >= last.threshold) {
18
+ return [{ value: last.value, weight: 1 }];
19
+ }
20
+ for (let index = 0; index < this.children.length - 1; index += 1) {
21
+ const a = this.children[index];
22
+ const b = this.children[index + 1];
23
+ if (parameter >= a.threshold && parameter <= b.threshold) {
24
+ const span = b.threshold - a.threshold;
25
+ const t = span === 0 ? 0 : (parameter - a.threshold) / span;
26
+ return [{ value: a.value, weight: 1 - t }, { value: b.value, weight: t }];
27
+ }
28
+ }
29
+ return [{ value: last.value, weight: 1 }];
30
+ }
31
+ }
32
+ export class BlendTree2D {
33
+ children;
34
+ constructor(children) {
35
+ if (children.length === 0) {
36
+ throw new Error("BlendTree2D requires at least one child.");
37
+ }
38
+ for (const child of children) {
39
+ if (!Number.isFinite(child.position[0]) || !Number.isFinite(child.position[1])) {
40
+ throw new Error("BlendTree2D child positions must be finite.");
41
+ }
42
+ }
43
+ this.children = [...children];
44
+ }
45
+ weights(parameter) {
46
+ if (!Number.isFinite(parameter[0]) || !Number.isFinite(parameter[1])) {
47
+ throw new Error("BlendTree2D parameters must be finite.");
48
+ }
49
+ if (this.children.length === 1) {
50
+ return [{ value: this.children[0].value, weight: 1 }];
51
+ }
52
+ const distances = this.children.map((child) => {
53
+ const dx = parameter[0] - child.position[0];
54
+ const dy = parameter[1] - child.position[1];
55
+ return Math.hypot(dx, dy);
56
+ });
57
+ const exactIndex = distances.findIndex((distance) => distance === 0);
58
+ if (exactIndex >= 0) {
59
+ return [{ value: this.children[exactIndex].value, weight: 1 }];
60
+ }
61
+ const inverseDistances = distances.map((distance) => 1 / distance);
62
+ const total = inverseDistances.reduce((sum, weight) => sum + weight, 0);
63
+ return this.children
64
+ .map((child, index) => ({ value: child.value, weight: inverseDistances[index] / total }))
65
+ .filter((weight) => weight.weight > 0);
66
+ }
67
+ }
68
+ //# sourceMappingURL=BlendTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlendTree.js","sourceRoot":"","sources":["../../../../packages/animation/src/BlendTree.ts"],"names":[],"mappings":"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"}
package/dist/Bone.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ import { type Mat4, type Quat, type Vec3 } from "./Keyframe.js";
2
+ export type BoneDescriptor = {
3
+ readonly name: string;
4
+ readonly parentIndex: number;
5
+ readonly translation?: Vec3;
6
+ readonly rotation?: Quat;
7
+ readonly scale?: Vec3;
8
+ readonly inverseBindMatrix?: Mat4;
9
+ };
10
+ export declare class Bone {
11
+ readonly name: string;
12
+ readonly parentIndex: number;
13
+ translation: Vec3;
14
+ rotation: Quat;
15
+ scale: Vec3;
16
+ inverseBindMatrix: Mat4;
17
+ constructor(descriptor: BoneDescriptor);
18
+ localMatrix(): Mat4;
19
+ }
20
+ //# sourceMappingURL=Bone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Bone.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/Bone.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AAE3F,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC;CACnC,CAAC;AAEF,qBAAa,IAAI;IACf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,IAAI,CAAC;IAClB,QAAQ,EAAE,IAAI,CAAC;IACf,KAAK,EAAE,IAAI,CAAC;IACZ,iBAAiB,EAAE,IAAI,CAAC;gBAEZ,UAAU,EAAE,cAAc;IAYtC,WAAW,IAAI,IAAI;CAGpB"}
package/dist/Bone.js ADDED
@@ -0,0 +1,24 @@
1
+ import { composeMat4, identityMat4 } from "./Keyframe.js";
2
+ export class Bone {
3
+ name;
4
+ parentIndex;
5
+ translation;
6
+ rotation;
7
+ scale;
8
+ inverseBindMatrix;
9
+ constructor(descriptor) {
10
+ if (descriptor.name.trim().length === 0) {
11
+ throw new Error("Bone name cannot be empty.");
12
+ }
13
+ this.name = descriptor.name;
14
+ this.parentIndex = descriptor.parentIndex;
15
+ this.translation = descriptor.translation ?? [0, 0, 0];
16
+ this.rotation = descriptor.rotation ?? [0, 0, 0, 1];
17
+ this.scale = descriptor.scale ?? [1, 1, 1];
18
+ this.inverseBindMatrix = descriptor.inverseBindMatrix ?? identityMat4();
19
+ }
20
+ localMatrix() {
21
+ return composeMat4(this.translation, this.rotation, this.scale);
22
+ }
23
+ }
24
+ //# sourceMappingURL=Bone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Bone.js","sourceRoot":"","sources":["../../../../packages/animation/src/Bone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAmC,MAAM,eAAe,CAAC;AAW3F,MAAM,OAAO,IAAI;IACN,IAAI,CAAS;IACb,WAAW,CAAS;IAC7B,WAAW,CAAO;IAClB,QAAQ,CAAO;IACf,KAAK,CAAO;IACZ,iBAAiB,CAAO;IAExB,YAAY,UAA0B;QACpC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC,iBAAiB,IAAI,YAAY,EAAE,CAAC;IAC1E,CAAC;IAED,WAAW;QACT,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ export interface CrowdAnimationAgent {
2
+ readonly id: string;
3
+ readonly clip: string;
4
+ readonly phase: number;
5
+ readonly speed: number;
6
+ }
7
+ export interface CrowdAnimationSample {
8
+ readonly id: string;
9
+ readonly clip: string;
10
+ readonly time: number;
11
+ }
12
+ export declare function sampleCrowdAnimation(agents: readonly CrowdAnimationAgent[], elapsedSeconds: number): readonly CrowdAnimationSample[];
13
+ //# sourceMappingURL=CrowdAnimation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CrowdAnimation.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/CrowdAnimation.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,mBAAmB,EAAE,EAAE,cAAc,EAAE,MAAM,GAAG,SAAS,oBAAoB,EAAE,CAWpI"}
@@ -0,0 +1,14 @@
1
+ export function sampleCrowdAnimation(agents, elapsedSeconds) {
2
+ if (!Number.isFinite(elapsedSeconds) || elapsedSeconds < 0) {
3
+ throw new Error("Crowd animation elapsedSeconds must be finite and non-negative.");
4
+ }
5
+ return agents.map((agent) => {
6
+ if (!agent.id.trim() || !agent.clip.trim())
7
+ throw new Error("Crowd animation agents require id and clip.");
8
+ if (!Number.isFinite(agent.phase) || !Number.isFinite(agent.speed) || agent.speed < 0) {
9
+ throw new Error(`Crowd animation agent ${agent.id} has invalid phase or speed.`);
10
+ }
11
+ return { id: agent.id, clip: agent.clip, time: agent.phase + elapsedSeconds * agent.speed };
12
+ });
13
+ }
14
+ //# sourceMappingURL=CrowdAnimation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CrowdAnimation.js","sourceRoot":"","sources":["../../../../packages/animation/src/CrowdAnimation.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,oBAAoB,CAAC,MAAsC,EAAE,cAAsB;IACjG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC3G,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACtF,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,EAAE,8BAA8B,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG,cAAc,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;IAC9F,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { AnimationValue } from "./Keyframe.js";
2
+ export type ECSAnimationComponent = Record<string, AnimationValue | undefined>;
3
+ export declare class ECSAnimationBridge {
4
+ private readonly components;
5
+ register(entityName: string, component: ECSAnimationComponent): void;
6
+ unregister(entityName: string): void;
7
+ setAnimationValue(target: string, value: AnimationValue): void;
8
+ }
9
+ //# sourceMappingURL=ECSAnimationBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ECSAnimationBridge.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/ECSAnimationBridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;AAE/E,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4C;IAEvE,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,qBAAqB,GAAG,IAAI;IAOpE,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIpC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI;CAW/D"}
@@ -0,0 +1,24 @@
1
+ export class ECSAnimationBridge {
2
+ components = new Map();
3
+ register(entityName, component) {
4
+ if (entityName.trim().length === 0) {
5
+ throw new Error("ECS animation target name cannot be empty.");
6
+ }
7
+ this.components.set(entityName, component);
8
+ }
9
+ unregister(entityName) {
10
+ this.components.delete(entityName);
11
+ }
12
+ setAnimationValue(target, value) {
13
+ const [entityName, property] = target.split(".");
14
+ if (!entityName || !property) {
15
+ throw new Error(`Invalid ECS animation target ${target}.`);
16
+ }
17
+ const component = this.components.get(entityName);
18
+ if (!component) {
19
+ throw new Error(`Missing ECS animation target ${entityName}.`);
20
+ }
21
+ component[property] = Array.isArray(value) ? [...value] : value;
22
+ }
23
+ }
24
+ //# sourceMappingURL=ECSAnimationBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ECSAnimationBridge.js","sourceRoot":"","sources":["../../../../packages/animation/src/ECSAnimationBridge.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,kBAAkB;IACZ,UAAU,GAAG,IAAI,GAAG,EAAiC,CAAC;IAEvE,QAAQ,CAAC,UAAkB,EAAE,SAAgC;QAC3D,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC7C,CAAC;IAED,UAAU,CAAC,UAAkB;QAC3B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAED,iBAAiB,CAAC,MAAc,EAAE,KAAqB;QACrD,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,GAAG,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,gCAAgC,UAAU,GAAG,CAAC,CAAC;QACjE,CAAC;QACD,SAAS,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,CAAC,GAAG,KAAK,CAA+B,CAAC,CAAC,CAAC,KAAK,CAAC;IACjG,CAAC;CACF"}