@aura3d/animation 4.0.3 → 4.0.4

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 (45) hide show
  1. package/dist/AnimationAction.d.ts +55 -1
  2. package/dist/AnimationAction.d.ts.map +1 -1
  3. package/dist/AnimationAction.js +156 -27
  4. package/dist/AnimationAction.js.map +1 -1
  5. package/dist/AnimationEvents.d.ts +1 -1
  6. package/dist/AnimationEvents.d.ts.map +1 -1
  7. package/dist/AnimationEvents.js +33 -14
  8. package/dist/AnimationEvents.js.map +1 -1
  9. package/dist/AnimationMixer.d.ts +35 -0
  10. package/dist/AnimationMixer.d.ts.map +1 -1
  11. package/dist/AnimationMixer.js +60 -10
  12. package/dist/AnimationMixer.js.map +1 -1
  13. package/dist/AnimationObjectGroup.d.ts +28 -0
  14. package/dist/AnimationObjectGroup.d.ts.map +1 -0
  15. package/dist/AnimationObjectGroup.js +242 -0
  16. package/dist/AnimationObjectGroup.js.map +1 -0
  17. package/dist/AnimationTrack.d.ts +18 -2
  18. package/dist/AnimationTrack.d.ts.map +1 -1
  19. package/dist/AnimationTrack.js +62 -0
  20. package/dist/AnimationTrack.js.map +1 -1
  21. package/dist/AnimationUtils.d.ts +56 -0
  22. package/dist/AnimationUtils.d.ts.map +1 -0
  23. package/dist/AnimationUtils.js +202 -0
  24. package/dist/AnimationUtils.js.map +1 -0
  25. package/dist/PropertyBinding.d.ts +93 -0
  26. package/dist/PropertyBinding.d.ts.map +1 -0
  27. package/dist/PropertyBinding.js +393 -0
  28. package/dist/PropertyBinding.js.map +1 -0
  29. package/dist/SceneAnimationBridge.d.ts +23 -1
  30. package/dist/SceneAnimationBridge.d.ts.map +1 -1
  31. package/dist/SceneAnimationBridge.js +152 -14
  32. package/dist/SceneAnimationBridge.js.map +1 -1
  33. package/dist/browser-index.d.ts +3 -0
  34. package/dist/browser-index.d.ts.map +1 -1
  35. package/dist/browser-index.js +3 -0
  36. package/dist/browser-index.js.map +1 -1
  37. package/dist/index.d.ts +3 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +3 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/pose/blendKernels.d.ts +1 -1
  42. package/dist/pose/blendKernels.d.ts.map +1 -1
  43. package/dist/pose/blendKernels.js +3 -3
  44. package/dist/pose/blendKernels.js.map +1 -1
  45. package/package.json +2 -2
@@ -11,15 +11,46 @@ export type AnimationActionSnapshot = {
11
11
  readonly paused: boolean;
12
12
  readonly loopMode: LoopMode;
13
13
  };
14
+ /**
15
+ * Playback signals an {@link AnimationAction} produced during `update` and that
16
+ * the owning {@link AnimationMixer} drains to fire its `loop`/`finished`
17
+ * events (three's `AnimationMixer` event contract). `loopDelta` is signed by
18
+ * playback direction; `finishedDirection` is `0` while the action still runs.
19
+ */
20
+ export type AnimationActionPlaybackSignals = {
21
+ readonly loopDelta: number;
22
+ readonly finishedDirection: -1 | 0 | 1;
23
+ };
14
24
  export declare class AnimationAction {
15
25
  readonly clip: AnimationClip;
16
26
  time: number;
17
27
  weight: number;
28
+ /**
29
+ * Signed playback-rate multiplier. Negative values play the clip backwards —
30
+ * three's `action.timeScale = -1` semantics (SA-01). Repeat loops wrap at the
31
+ * start boundary, `once` finishes at time 0 with direction `-1`, and pingpong
32
+ * bounces at both ends.
33
+ */
18
34
  timeScale: number;
19
35
  loopMode: LoopMode;
36
+ /**
37
+ * Number of clip wraps the action performs before finishing (three's
38
+ * `action.repetitions`). `Infinity` loops forever; `once` mode always
39
+ * finishes after a single pass regardless of this value.
40
+ */
41
+ repetitions: number;
42
+ /**
43
+ * When `true` (three's `clampWhenFinished`), finishing pauses the action with
44
+ * `time` clamped to the boundary it crossed instead of stopping it, so the
45
+ * last evaluated pose persists for blending.
46
+ */
47
+ clampWhenFinished: boolean;
20
48
  playing: boolean;
21
49
  paused: boolean;
22
50
  private pingPongForward;
51
+ private loopsCompleted;
52
+ private signalLoopDelta;
53
+ private signalFinishedDirection;
23
54
  private fadeDuration;
24
55
  private fadeElapsed;
25
56
  private fadeStartWeight;
@@ -30,11 +61,34 @@ export declare class AnimationAction {
30
61
  stop(): this;
31
62
  setWeight(weight: number): this;
32
63
  setTimeScale(timeScale: number): this;
33
- setLoop(loopMode: LoopMode): this;
64
+ /**
65
+ * three's `setLoop(mode, repetitions)`: sets the wrap mode and, when
66
+ * provided, how many boundary crossings the action performs before emitting
67
+ * `finished`. `once` ignores `repetitions` (a single pass by definition);
68
+ * `repeat`/`pingpong` default to `Infinity`.
69
+ */
70
+ setLoop(loopMode: LoopMode, repetitions?: number): this;
34
71
  reset(): this;
35
72
  seek(time: number): this;
36
73
  fadeTo(weight: number, duration: number): this;
74
+ /**
75
+ * Advances playback by `delta` seconds scaled by `timeScale` (signed — a
76
+ * negative product reverses the playhead) and returns the clip marker events
77
+ * crossed. Loop boundaries the action wraps across are recorded for the
78
+ * mixer to consume via {@link consumePlaybackSignals}; when `repetitions` is
79
+ * exhausted or a `once` action reaches its end boundary the action finishes:
80
+ * with `clampWhenFinished` it pauses clamped to that boundary (the last pose
81
+ * keeps blending), otherwise it stops.
82
+ */
37
83
  update(delta: number): readonly AnimationEvent[];
84
+ /**
85
+ * Drains the `loop`/`finished` signals accumulated by the last `update`. The
86
+ * owning {@link AnimationMixer} calls this once per update per action; direct
87
+ * `AnimationAction` users may drain it themselves to observe the same
88
+ * transitions without a mixer.
89
+ */
90
+ consumePlaybackSignals(): AnimationActionPlaybackSignals;
91
+ private finish;
38
92
  snapshot(): AnimationActionSnapshot;
39
93
  }
40
94
  //# sourceMappingURL=AnimationAction.d.ts.map
@@ -1 +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;IAWZ,KAAK,IAAI,IAAI;IAQb,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;IAWxB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAc9C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE;IA0DhD,QAAQ,IAAI,uBAAuB;CAYpC"}
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;;;;;GAKG;AACH,MAAM,MAAM,8BAA8B,GAAG;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACxC,CAAC;AAEF,qBAAa,eAAe;IAC1B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,IAAI,SAAK;IACT,MAAM,SAAK;IACX;;;;;OAKG;IACH,SAAS,SAAK;IACd,QAAQ,EAAE,QAAQ,CAAY;IAC9B;;;;OAIG;IACH,WAAW,SAAY;IACvB;;;;OAIG;IACH,iBAAiB,UAAS;IAC1B,OAAO,UAAS;IAChB,MAAM,UAAS;IACf,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,uBAAuB,CAAiB;IAChD,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;IAmBZ,KAAK,IAAI,IAAI;IAQb,IAAI,IAAI,IAAI;IASZ,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ/B,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQrC;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAWvD,KAAK,IAAI,IAAI;IAUb,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAYxB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAc9C;;;;;;;;OAQG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE;IAsGhD;;;;;OAKG;IACH,sBAAsB,IAAI,8BAA8B;IAUxD,OAAO,CAAC,MAAM;IAYd,QAAQ,IAAI,uBAAuB;CAYpC"}
@@ -3,11 +3,32 @@ export class AnimationAction {
3
3
  clip;
4
4
  time = 0;
5
5
  weight = 1;
6
+ /**
7
+ * Signed playback-rate multiplier. Negative values play the clip backwards —
8
+ * three's `action.timeScale = -1` semantics (SA-01). Repeat loops wrap at the
9
+ * start boundary, `once` finishes at time 0 with direction `-1`, and pingpong
10
+ * bounces at both ends.
11
+ */
6
12
  timeScale = 1;
7
13
  loopMode = "repeat";
14
+ /**
15
+ * Number of clip wraps the action performs before finishing (three's
16
+ * `action.repetitions`). `Infinity` loops forever; `once` mode always
17
+ * finishes after a single pass regardless of this value.
18
+ */
19
+ repetitions = Infinity;
20
+ /**
21
+ * When `true` (three's `clampWhenFinished`), finishing pauses the action with
22
+ * `time` clamped to the boundary it crossed instead of stopping it, so the
23
+ * last evaluated pose persists for blending.
24
+ */
25
+ clampWhenFinished = false;
8
26
  playing = false;
9
27
  paused = false;
10
28
  pingPongForward = true;
29
+ loopsCompleted = 0;
30
+ signalLoopDelta = 0;
31
+ signalFinishedDirection = 0;
11
32
  fadeDuration = 0;
12
33
  fadeElapsed = 0;
13
34
  fadeStartWeight = 1;
@@ -22,6 +43,14 @@ export class AnimationAction {
22
43
  else if (this.clip.tracks.length === 0) {
23
44
  console.warn(`AnimationAction.play: clip "${this.clip.name}" has no tracks; update will emit events but apply no values.`);
24
45
  }
46
+ if (!this.playing && !this.paused) {
47
+ // Restarting a stopped or finished action (three's _activateAction → _reset).
48
+ this.time = 0;
49
+ this.pingPongForward = true;
50
+ this.loopsCompleted = 0;
51
+ this.signalLoopDelta = 0;
52
+ this.signalFinishedDirection = 0;
53
+ }
25
54
  this.playing = true;
26
55
  this.paused = false;
27
56
  return this;
@@ -37,6 +66,8 @@ export class AnimationAction {
37
66
  this.playing = false;
38
67
  this.paused = false;
39
68
  this.time = 0;
69
+ this.pingPongForward = true;
70
+ this.loopsCompleted = 0;
40
71
  return this;
41
72
  }
42
73
  setWeight(weight) {
@@ -47,29 +78,46 @@ export class AnimationAction {
47
78
  return this;
48
79
  }
49
80
  setTimeScale(timeScale) {
50
- if (!Number.isFinite(timeScale) || timeScale < 0) {
51
- throw new Error("AnimationAction timeScale must be finite and non-negative.");
81
+ if (!Number.isFinite(timeScale)) {
82
+ throw new Error("AnimationAction timeScale must be finite.");
52
83
  }
53
84
  this.timeScale = timeScale;
54
85
  return this;
55
86
  }
56
- setLoop(loopMode) {
87
+ /**
88
+ * three's `setLoop(mode, repetitions)`: sets the wrap mode and, when
89
+ * provided, how many boundary crossings the action performs before emitting
90
+ * `finished`. `once` ignores `repetitions` (a single pass by definition);
91
+ * `repeat`/`pingpong` default to `Infinity`.
92
+ */
93
+ setLoop(loopMode, repetitions) {
94
+ if (repetitions !== undefined) {
95
+ if (!(repetitions === Infinity) && (!Number.isFinite(repetitions) || repetitions < 0)) {
96
+ throw new Error(`AnimationAction.setLoop: repetitions must be a non-negative number or Infinity, got ${repetitions}.`);
97
+ }
98
+ this.repetitions = repetitions;
99
+ }
57
100
  this.loopMode = loopMode;
58
101
  return this;
59
102
  }
60
103
  reset() {
61
104
  this.time = 0;
105
+ this.paused = false;
62
106
  this.pingPongForward = true;
107
+ this.loopsCompleted = 0;
108
+ this.signalLoopDelta = 0;
109
+ this.signalFinishedDirection = 0;
63
110
  return this;
64
111
  }
65
112
  seek(time) {
66
113
  if (!Number.isFinite(time) || time < 0) {
67
114
  throw new Error("AnimationAction.seek: time must be finite and non-negative.");
68
115
  }
116
+ const clamped = this.clip.duration > 0 ? Math.min(time, this.clip.duration) : 0;
69
117
  if (this.clip.duration > 0 && time > this.clip.duration) {
70
118
  console.warn(`AnimationAction.seek: time ${time} exceeds clip "${this.clip.name}" duration ${this.clip.duration}; clamped to the duration.`);
71
119
  }
72
- this.time = this.clip.duration > 0 ? Math.min(time, this.clip.duration) : 0;
120
+ this.time = clamped;
73
121
  return this;
74
122
  }
75
123
  fadeTo(weight, duration) {
@@ -85,18 +133,27 @@ export class AnimationAction {
85
133
  }
86
134
  return this;
87
135
  }
136
+ /**
137
+ * Advances playback by `delta` seconds scaled by `timeScale` (signed — a
138
+ * negative product reverses the playhead) and returns the clip marker events
139
+ * crossed. Loop boundaries the action wraps across are recorded for the
140
+ * mixer to consume via {@link consumePlaybackSignals}; when `repetitions` is
141
+ * exhausted or a `once` action reaches its end boundary the action finishes:
142
+ * with `clampWhenFinished` it pauses clamped to that boundary (the last pose
143
+ * keeps blending), otherwise it stops.
144
+ */
88
145
  update(delta) {
89
- if (!Number.isFinite(delta) || delta < 0) {
90
- throw new Error("AnimationAction.update: delta must be finite and non-negative.");
146
+ if (!Number.isFinite(delta)) {
147
+ throw new Error("AnimationAction.update: delta must be finite.");
91
148
  }
92
149
  if (!Number.isFinite(this.weight) || this.weight < 0) {
93
150
  throw new Error("AnimationAction.update: weight must be finite and non-negative; call AnimationAction.setWeight with a valid value.");
94
151
  }
95
- if (!Number.isFinite(this.timeScale) || this.timeScale < 0) {
96
- throw new Error("AnimationAction.update: timeScale must be finite and non-negative; call AnimationAction.setTimeScale with a valid value.");
152
+ if (!Number.isFinite(this.timeScale)) {
153
+ throw new Error("AnimationAction.update: timeScale must be finite; call AnimationAction.setTimeScale with a valid value.");
97
154
  }
98
155
  if (this.fadeDuration > 0) {
99
- this.fadeElapsed = Math.min(this.fadeDuration, this.fadeElapsed + delta);
156
+ this.fadeElapsed = Math.min(this.fadeDuration, this.fadeElapsed + Math.abs(delta));
100
157
  const t = this.fadeElapsed / this.fadeDuration;
101
158
  this.weight = this.fadeStartWeight + (this.fadeTargetWeight - this.fadeStartWeight) * t;
102
159
  if (this.fadeElapsed === this.fadeDuration) {
@@ -108,42 +165,114 @@ export class AnimationAction {
108
165
  }
109
166
  const previous = this.time;
110
167
  const scaledDelta = delta * this.timeScale;
111
- let next = previous + scaledDelta;
168
+ const duration = this.clip.duration;
112
169
  let looped = false;
170
+ let finishedThisUpdate = false;
171
+ let next;
113
172
  if (this.loopMode === "repeat") {
114
- while (next > this.clip.duration) {
115
- next -= this.clip.duration;
173
+ next = previous + scaledDelta;
174
+ if (next >= duration || next < 0) {
175
+ const loopDelta = Math.floor(next / duration);
176
+ next -= duration * loopDelta;
177
+ this.loopsCompleted += Math.abs(loopDelta);
116
178
  looped = true;
179
+ if (this.loopsCompleted >= this.repetitions) {
180
+ next = scaledDelta >= 0 ? duration : 0;
181
+ finishedThisUpdate = true;
182
+ this.finish(scaledDelta >= 0 ? 1 : -1);
183
+ }
184
+ else {
185
+ // three dispatches 'loop' for intermediate wraps but 'finished'
186
+ // instead of 'loop' on the wrap that exhausts repetitions.
187
+ this.signalLoopDelta += loopDelta;
188
+ }
117
189
  }
118
190
  }
119
191
  else if (this.loopMode === "once") {
120
- next = Math.min(next, this.clip.duration);
121
- if (next === this.clip.duration) {
122
- this.playing = false;
192
+ next = previous + scaledDelta;
193
+ if (scaledDelta !== 0) {
194
+ if (next >= duration) {
195
+ next = duration;
196
+ this.finish(1);
197
+ }
198
+ else if (next <= 0) {
199
+ next = 0;
200
+ this.finish(-1);
201
+ }
123
202
  }
124
203
  }
125
204
  else {
126
- if (this.pingPongForward) {
127
- while (next > this.clip.duration) {
128
- next = this.clip.duration - (next - this.clip.duration);
129
- this.pingPongForward = false;
130
- looped = true;
205
+ // pingpong: clip time bounces between the 0 and duration boundaries; each
206
+ // reflection counts one repetition (three's loopCount parity).
207
+ next = this.pingPongForward ? previous + scaledDelta : previous - scaledDelta;
208
+ let crossings = 0;
209
+ let exhausted = false;
210
+ while (!exhausted && (next > duration || next < 0)) {
211
+ next = next > duration ? 2 * duration - next : -next;
212
+ this.pingPongForward = !this.pingPongForward;
213
+ crossings++;
214
+ if (this.loopsCompleted + crossings >= this.repetitions) {
215
+ exhausted = true;
131
216
  }
132
217
  }
133
- else {
134
- next = previous - scaledDelta;
135
- while (next < 0) {
136
- next = -next;
137
- this.pingPongForward = true;
138
- looped = true;
218
+ if (!exhausted) {
219
+ // Landing exactly on the boundary the playhead moves toward counts as a
220
+ // wrap (three counts t === duration as a completed loop).
221
+ const clipVelocity = this.pingPongForward ? scaledDelta : -scaledDelta;
222
+ if ((clipVelocity > 0 && next === duration) || (clipVelocity < 0 && next === 0)) {
223
+ this.pingPongForward = !this.pingPongForward;
224
+ crossings++;
225
+ if (this.loopsCompleted + crossings >= this.repetitions) {
226
+ exhausted = true;
227
+ }
139
228
  }
140
229
  }
230
+ this.loopsCompleted += crossings;
231
+ if (crossings > 0 && !exhausted) {
232
+ this.signalLoopDelta += scaledDelta < 0 ? -crossings : crossings;
233
+ looped = true;
234
+ }
235
+ if (exhausted) {
236
+ // The final parity selects which boundary the clip clamps to (three's
237
+ // loopCount odd/even → duration/0).
238
+ next = this.pingPongForward ? duration : 0;
239
+ this.finish(scaledDelta >= 0 ? 1 : -1);
240
+ }
141
241
  }
142
242
  this.time = next;
143
243
  if (this.clip.events.length === 0) {
144
244
  return [];
145
245
  }
146
- return eventsBetween(this.clip.events, this.clip.name, previous, next, this.clip.duration, looped);
246
+ // A wrap that exhausts `repetitions` clamps the playhead to the boundary —
247
+ // for marker purposes that is a single un-wrapped span from `previous`.
248
+ return eventsBetween(this.clip.events, this.clip.name, previous, next, this.clip.duration, looped && !finishedThisUpdate, scaledDelta >= 0);
249
+ }
250
+ /**
251
+ * Drains the `loop`/`finished` signals accumulated by the last `update`. The
252
+ * owning {@link AnimationMixer} calls this once per update per action; direct
253
+ * `AnimationAction` users may drain it themselves to observe the same
254
+ * transitions without a mixer.
255
+ */
256
+ consumePlaybackSignals() {
257
+ const signals = {
258
+ loopDelta: this.signalLoopDelta,
259
+ finishedDirection: this.signalFinishedDirection
260
+ };
261
+ this.signalLoopDelta = 0;
262
+ this.signalFinishedDirection = 0;
263
+ return signals;
264
+ }
265
+ finish(direction) {
266
+ if (this.signalFinishedDirection !== 0) {
267
+ return;
268
+ }
269
+ this.signalFinishedDirection = direction;
270
+ if (this.clampWhenFinished) {
271
+ this.paused = true;
272
+ }
273
+ else {
274
+ this.playing = false;
275
+ }
147
276
  }
148
277
  snapshot() {
149
278
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"AnimationAction.js","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationAction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AnimationAction.js","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationAction.ts"],"names":[],"mappings":"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"}
@@ -6,5 +6,5 @@ export type AnimationEventMarker = {
6
6
  export type AnimationEvent = AnimationEventMarker & {
7
7
  readonly clipName: string;
8
8
  };
9
- export declare function eventsBetween(markers: readonly AnimationEventMarker[], clipName: string, fromTime: number, toTime: number, duration: number, looped: boolean): readonly AnimationEvent[];
9
+ export declare function eventsBetween(markers: readonly AnimationEventMarker[], clipName: string, fromTime: number, toTime: number, duration: number, looped: boolean, forward?: boolean): readonly AnimationEvent[];
10
10
  //# sourceMappingURL=AnimationEvents.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnimationEvents.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationEvents.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,oBAAoB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,SAAS,cAAc,EAAE,CAuBxL"}
1
+ {"version":3,"file":"AnimationEvents.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationEvents.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,oBAAoB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,UAAO,GAAG,SAAS,cAAc,EAAE,CA0CxM"}
@@ -1,26 +1,45 @@
1
- export function eventsBetween(markers, clipName, fromTime, toTime, duration, looped) {
1
+ export function eventsBetween(markers, clipName, fromTime, toTime, duration, looped, forward = true) {
2
2
  const events = [];
3
3
  if (duration <= 0) {
4
4
  return events;
5
5
  }
6
- if (!looped || toTime >= fromTime) {
6
+ if (forward) {
7
+ if (!looped) {
8
+ for (const marker of markers) {
9
+ if (marker.time > fromTime && marker.time <= toTime) {
10
+ events.push({ ...marker, clipName });
11
+ }
12
+ }
13
+ return events;
14
+ }
15
+ const lateEvents = [];
16
+ const earlyEvents = [];
7
17
  for (const marker of markers) {
8
- if (marker.time > fromTime && marker.time <= toTime) {
9
- events.push({ ...marker, clipName });
18
+ if (marker.time > fromTime && marker.time <= duration) {
19
+ lateEvents.push({ ...marker, clipName });
20
+ }
21
+ else if (marker.time >= 0 && marker.time <= toTime) {
22
+ earlyEvents.push({ ...marker, clipName });
10
23
  }
11
24
  }
12
- return events;
25
+ return [...lateEvents, ...earlyEvents];
13
26
  }
14
- const lateEvents = [];
15
- const earlyEvents = [];
16
- for (const marker of markers) {
17
- if (marker.time > fromTime && marker.time <= duration) {
18
- lateEvents.push({ ...marker, clipName });
19
- }
20
- else if (marker.time >= 0 && marker.time <= toTime) {
21
- earlyEvents.push({ ...marker, clipName });
22
- }
27
+ // Reverse playback (negative timeScale): markers are emitted in the order
28
+ // they are crossed, i.e. descending clip time. A looped wrap crosses from
29
+ // `fromTime` down to 0 and continues from `duration` down to `toTime`.
30
+ if (!looped) {
31
+ const crossed = markers.filter((marker) => marker.time <= fromTime && marker.time > toTime);
32
+ crossed.sort((a, b) => b.time - a.time);
33
+ return crossed.map((marker) => ({ ...marker, clipName }));
23
34
  }
35
+ const lateEvents = markers
36
+ .filter((marker) => marker.time <= fromTime && marker.time >= 0)
37
+ .sort((a, b) => b.time - a.time)
38
+ .map((marker) => ({ ...marker, clipName }));
39
+ const earlyEvents = markers
40
+ .filter((marker) => marker.time <= duration && marker.time > toTime)
41
+ .sort((a, b) => b.time - a.time)
42
+ .map((marker) => ({ ...marker, clipName }));
24
43
  return [...lateEvents, ...earlyEvents];
25
44
  }
26
45
  //# sourceMappingURL=AnimationEvents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnimationEvents.js","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationEvents.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,aAAa,CAAC,OAAwC,EAAE,QAAgB,EAAE,QAAgB,EAAE,MAAc,EAAE,QAAgB,EAAE,MAAe;IAC3J,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAClB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;QAClC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,IAAI,GAAG,QAAQ,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC;gBACpD,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,MAAM,WAAW,GAAqB,EAAE,CAAC;IACzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,IAAI,GAAG,QAAQ,IAAI,MAAM,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;YACtD,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC;YACrD,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,UAAU,EAAE,GAAG,WAAW,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"AnimationEvents.js","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationEvents.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,aAAa,CAAC,OAAwC,EAAE,QAAgB,EAAE,QAAgB,EAAE,MAAc,EAAE,QAAgB,EAAE,MAAe,EAAE,OAAO,GAAG,IAAI;IAC3K,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAClB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,MAAM,CAAC,IAAI,GAAG,QAAQ,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC;oBACpD,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,UAAU,GAAqB,EAAE,CAAC;QACxC,MAAM,WAAW,GAAqB,EAAE,CAAC;QACzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,IAAI,GAAG,QAAQ,IAAI,MAAM,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;gBACtD,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC3C,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC;gBACrD,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,UAAU,EAAE,GAAG,WAAW,CAAC,CAAC;IACzC,CAAC;IACD,0EAA0E;IAC1E,0EAA0E;IAC1E,uEAAuE;IACvE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,QAAQ,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,UAAU,GAAqB,OAAO;SACzC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,QAAQ,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;SAC/D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;SAC/B,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAqB,OAAO;SAC1C,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,QAAQ,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC;SACnE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;SAC/B,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,UAAU,EAAE,GAAG,WAAW,CAAC,CAAC;AACzC,CAAC"}
@@ -30,6 +30,31 @@ export type AnimationApplyError = {
30
30
  readonly target: string;
31
31
  readonly message: string;
32
32
  };
33
+ /**
34
+ * Low-level playback events the mixer dispatches via {@link AnimationMixer.addEventListener}
35
+ * (three's `AnimationMixer` "finished"/"loop" contract, SA-01). Clip marker
36
+ * events remain on {@link AnimationMixer.onEvent}.
37
+ */
38
+ export type AnimationMixerPlaybackEventType = "finished" | "loop";
39
+ export interface AnimationMixerFinishedEvent {
40
+ readonly type: "finished";
41
+ readonly action: AnimationAction;
42
+ /** `1` when the playhead crossed the clip end, `-1` when it crossed the start (negative timeScale). */
43
+ readonly direction: number;
44
+ }
45
+ export interface AnimationMixerLoopEvent {
46
+ readonly type: "loop";
47
+ readonly action: AnimationAction;
48
+ /** Signed count of clip boundaries wrapped during this update (negative in reverse). */
49
+ readonly loopDelta: number;
50
+ }
51
+ export type AnimationMixerPlaybackEvent = AnimationMixerFinishedEvent | AnimationMixerLoopEvent;
52
+ export type AnimationMixerPlaybackEventListener = (event: AnimationMixerPlaybackEvent) => void;
53
+ /** three's event-map overload: listeners narrow to the event matching `type`. */
54
+ export interface AnimationMixerPlaybackEventMap {
55
+ readonly finished: AnimationMixerFinishedEvent;
56
+ readonly loop: AnimationMixerLoopEvent;
57
+ }
33
58
  export declare class AnimationMixer {
34
59
  private readonly options;
35
60
  readonly target: AnimationTarget | undefined;
@@ -39,6 +64,7 @@ export declare class AnimationMixer {
39
64
  private readonly values;
40
65
  private applyErrors;
41
66
  private readonly eventListeners;
67
+ private readonly playbackListeners;
42
68
  private disposed;
43
69
  private warnedEmptyUpdate;
44
70
  private inertialTransition;
@@ -60,6 +86,15 @@ export declare class AnimationMixer {
60
86
  update(delta: number): readonly AnimationEvent[];
61
87
  getValue(target: string): AnimationValue | undefined;
62
88
  onEvent(listener: (event: AnimationEvent) => void): () => void;
89
+ /**
90
+ * three's `mixer.addEventListener("finished" | "loop", listener)` — fires when
91
+ * any registered action crosses its final repetition ("finished", once per
92
+ * finish) or wraps a loop boundary ("loop", with the signed `loopDelta`).
93
+ * Returns an unsubscribe callback.
94
+ */
95
+ addEventListener<K extends AnimationMixerPlaybackEventType>(type: K, listener: (event: AnimationMixerPlaybackEventMap[K]) => void): () => void;
96
+ removeEventListener<K extends AnimationMixerPlaybackEventType>(type: K, listener: (event: AnimationMixerPlaybackEventMap[K]) => void): void;
97
+ private dispatchPlaybackEvent;
63
98
  snapshot(): AnimationMixerSnapshot;
64
99
  dispose(): void;
65
100
  private assertAlive;
@@ -1 +1 @@
1
- {"version":3,"file":"AnimationMixer.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationMixer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AnimationMixer.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationMixer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAiD,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAEnG,OAAO,EAAsC,KAAK,gBAAgB,EAAyB,MAAM,iBAAiB,CAAC;AAInH,MAAM,MAAM,eAAe,GAAG;IAC5B,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IACpE,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACrD,wFAAwF;IACxF,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACvD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,mGAAmG;IACnG,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,uBAAuB,EAAE,CAAC;IACrD,QAAQ,CAAC,MAAM,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,WAAW,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,+BAA+B,GAAG,UAAU,GAAG,MAAM,CAAC;AAElE,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,uGAAuG;IACvG,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,wFAAwF;IACxF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,2BAA2B,GAAG,2BAA2B,GAAG,uBAAuB,CAAC;AAEhG,MAAM,MAAM,mCAAmC,GAAG,CAAC,KAAK,EAAE,2BAA2B,KAAK,IAAI,CAAC;AAE/F,iFAAiF;AACjF,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAC;IAC/C,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;CACxC;AAMD,qBAAa,cAAc;IAaa,OAAO,CAAC,QAAQ,CAAC,OAAO;IAZ9D,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAAC;IAC7C,SAAS,SAAK;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAC5D,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8C;IAC7E,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAwF;IAC1H,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,kBAAkB,CAAgG;gBAE9G,MAAM,CAAC,EAAE,eAAe,EAAmB,OAAO,GAAE,qBAA0B;IAI1F,IAAI,CAAC,IAAI,EAAE,aAAa,GAAG,eAAe;IAQ1C,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAaxC,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAYrC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQrC,OAAO,IAAI,IAAI;IAWf,SAAS,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAc7E;;;;;;OAMG;IACH,iBAAiB,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,eAAe,EAAE,QAAQ,SAAoC,GAAG,IAAI;IAgBjH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE;IAsGhD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAKpD,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI;IAS9D;;;;;OAKG;IACH,gBAAgB,CAAC,CAAC,SAAS,+BAA+B,EACxD,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,KAAK,EAAE,8BAA8B,CAAC,CAAC,CAAC,KAAK,IAAI,GAC3D,MAAM,IAAI;IAiBb,mBAAmB,CAAC,CAAC,SAAS,+BAA+B,EAC3D,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,KAAK,EAAE,8BAA8B,CAAC,CAAC,CAAC,KAAK,IAAI,GAC3D,IAAI;IAWP,OAAO,CAAC,qBAAqB;IAU7B,QAAQ,IAAI,sBAAsB;IAelC,OAAO,IAAI,IAAI;IAWf,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,yBAAyB;IAgBjC,OAAO,CAAC,eAAe;CAOxB"}