@aura3d/animation 4.0.3 → 4.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AnimationAction.d.ts +55 -1
- package/dist/AnimationAction.d.ts.map +1 -1
- package/dist/AnimationAction.js +156 -27
- package/dist/AnimationAction.js.map +1 -1
- package/dist/AnimationEvents.d.ts +1 -1
- package/dist/AnimationEvents.d.ts.map +1 -1
- package/dist/AnimationEvents.js +33 -14
- package/dist/AnimationEvents.js.map +1 -1
- package/dist/AnimationMixer.d.ts +35 -0
- package/dist/AnimationMixer.d.ts.map +1 -1
- package/dist/AnimationMixer.js +60 -10
- package/dist/AnimationMixer.js.map +1 -1
- package/dist/AnimationObjectGroup.d.ts +28 -0
- package/dist/AnimationObjectGroup.d.ts.map +1 -0
- package/dist/AnimationObjectGroup.js +242 -0
- package/dist/AnimationObjectGroup.js.map +1 -0
- package/dist/AnimationTrack.d.ts +18 -2
- package/dist/AnimationTrack.d.ts.map +1 -1
- package/dist/AnimationTrack.js +62 -0
- package/dist/AnimationTrack.js.map +1 -1
- package/dist/AnimationUtils.d.ts +56 -0
- package/dist/AnimationUtils.d.ts.map +1 -0
- package/dist/AnimationUtils.js +202 -0
- package/dist/AnimationUtils.js.map +1 -0
- package/dist/PropertyBinding.d.ts +93 -0
- package/dist/PropertyBinding.d.ts.map +1 -0
- package/dist/PropertyBinding.js +393 -0
- package/dist/PropertyBinding.js.map +1 -0
- package/dist/SceneAnimationBridge.d.ts +23 -1
- package/dist/SceneAnimationBridge.d.ts.map +1 -1
- package/dist/SceneAnimationBridge.js +152 -14
- package/dist/SceneAnimationBridge.js.map +1 -1
- package/dist/browser-index.d.ts +3 -0
- package/dist/browser-index.d.ts.map +1 -1
- package/dist/browser-index.js +3 -0
- package/dist/browser-index.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/pose/blendKernels.d.ts +1 -1
- package/dist/pose/blendKernels.d.ts.map +1 -1
- package/dist/pose/blendKernels.js +3 -3
- package/dist/pose/blendKernels.js.map +1 -1
- 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
|
-
|
|
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;
|
|
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"}
|
package/dist/AnimationAction.js
CHANGED
|
@@ -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)
|
|
51
|
-
throw new Error("AnimationAction timeScale must be finite
|
|
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
|
-
|
|
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 =
|
|
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)
|
|
90
|
-
throw new Error("AnimationAction.update: delta must be finite
|
|
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)
|
|
96
|
-
throw new Error("AnimationAction.update: timeScale must be finite
|
|
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
|
-
|
|
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
|
-
|
|
115
|
-
|
|
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 =
|
|
121
|
-
if (
|
|
122
|
-
|
|
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
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
-
|
|
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":"AACA,OAAO,EAAE,aAAa,EAAuB,MAAM,sBAAsB,CAAC;
|
|
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,
|
|
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"}
|
package/dist/AnimationEvents.js
CHANGED
|
@@ -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 (
|
|
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 <=
|
|
9
|
-
|
|
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
|
|
25
|
+
return [...lateEvents, ...earlyEvents];
|
|
13
26
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"AnimationEvents.js","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationEvents.ts"],"names":[],"mappings":"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"}
|
package/dist/AnimationMixer.d.ts
CHANGED
|
@@ -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":"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;
|
|
1
|
+
{"version":3,"file":"AnimationMixer.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationMixer.ts"],"names":[],"mappings":"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"}
|