@flighthq/animation 0.2.1-next.451.d9a4a4e → 0.2.1-next.530.a223ca9
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/animationBlend.d.ts +8 -0
- package/dist/animationBlend.d.ts.map +1 -0
- package/dist/animationBlend.js +124 -0
- package/dist/animationBlend.js.map +1 -0
- package/dist/animationClip.d.ts.map +1 -1
- package/dist/animationClip.js +4 -3
- package/dist/animationClip.js.map +1 -1
- package/dist/animationPlayer.d.ts.map +1 -1
- package/dist/animationPlayer.js +5 -4
- package/dist/animationPlayer.js.map +1 -1
- package/dist/animationTrack.d.ts.map +1 -1
- package/dist/animationTrack.js +7 -6
- package/dist/animationTrack.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
- package/src/animationBlend.test.ts +102 -0
- package/src/animationClip.test.ts +4 -0
- package/src/animationPlayer.test.ts +3 -0
- package/src/animationTrack.test.ts +9 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AnimationSampleAccumulator } from '@flighthq/types';
|
|
2
|
+
export declare function accumulateAnimationSample(accumulator: AnimationSampleAccumulator, sample: ArrayLike<number>, weight: number): void;
|
|
3
|
+
export declare function addAnimationSample(out: number[] | Float32Array, base: ArrayLike<number>, delta: ArrayLike<number>, weight: number, quaternion?: boolean): void;
|
|
4
|
+
export declare function blendAnimationSamples(out: number[] | Float32Array, a: ArrayLike<number>, b: ArrayLike<number>, alpha: number, quaternion?: boolean): void;
|
|
5
|
+
export declare function createAnimationSampleAccumulator(components: number, quaternion?: boolean): AnimationSampleAccumulator;
|
|
6
|
+
export declare function finishAnimationSample(out: number[] | Float32Array, accumulator: Readonly<AnimationSampleAccumulator>): boolean;
|
|
7
|
+
export declare function resetAnimationSampleAccumulator(accumulator: AnimationSampleAccumulator): void;
|
|
8
|
+
//# sourceMappingURL=animationBlend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animationBlend.d.ts","sourceRoot":"","sources":["../src/animationBlend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAKlE,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,0BAA0B,EACvC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EACzB,MAAM,EAAE,MAAM,GACb,IAAI,CAaN;AAMD,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EAAE,GAAG,YAAY,EAC5B,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EACvB,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,UAAQ,GACjB,IAAI,CAyBN;AAID,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EAAE,GAAG,YAAY,EAC5B,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,EACpB,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,EACpB,KAAK,EAAE,MAAM,EACb,UAAU,UAAQ,GACjB,IAAI,CAUN;AAID,wBAAgB,gCAAgC,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,0BAA0B,CAGnH;AAID,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EAAE,GAAG,YAAY,EAC5B,WAAW,EAAE,QAAQ,CAAC,0BAA0B,CAAC,GAChD,OAAO,CAaT;AAGD,wBAAgB,+BAA+B,CAAC,WAAW,EAAE,0BAA0B,GAAG,IAAI,CAG7F"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { createEntity } from '@flighthq/entity';
|
|
2
|
+
// Adds a non-negative weighted sample into caller-owned accumulation state. Quaternion samples are
|
|
3
|
+
// sign-aligned with the current sum so equivalent q/-q inputs do not cancel. No target or clip state
|
|
4
|
+
// is hidden here; callers decide which samples belong in one accumulator.
|
|
5
|
+
export function accumulateAnimationSample(accumulator, sample, weight) {
|
|
6
|
+
if (!(weight > 0))
|
|
7
|
+
return;
|
|
8
|
+
const components = Math.min(accumulator.components, accumulator.values.length, sample.length);
|
|
9
|
+
let sign = 1;
|
|
10
|
+
if (accumulator.quaternion && components >= 4 && accumulator.weight > 0) {
|
|
11
|
+
const values = accumulator.values;
|
|
12
|
+
const dot = values[0] * sample[0] + values[1] * sample[1] + values[2] * sample[2] + values[3] * sample[3];
|
|
13
|
+
if (dot < 0)
|
|
14
|
+
sign = -1;
|
|
15
|
+
}
|
|
16
|
+
for (let component = 0; component < components; component++) {
|
|
17
|
+
accumulator.values[component] += sample[component] * weight * sign;
|
|
18
|
+
}
|
|
19
|
+
accumulator.weight += weight;
|
|
20
|
+
}
|
|
21
|
+
// Adds an additive animation delta to a base sample. Scalar/vector components use
|
|
22
|
+
// `base + delta * weight`. Quaternion deltas are weighted from identity, multiplied onto base, and
|
|
23
|
+
// normalized; this keeps additive rotation compositional rather than treating quaternion components
|
|
24
|
+
// as a vector. `out` may alias either input.
|
|
25
|
+
export function addAnimationSample(out, base, delta, weight, quaternion = false) {
|
|
26
|
+
if (quaternion && out.length >= 4 && base.length >= 4 && delta.length >= 4) {
|
|
27
|
+
writeWeightedQuaternion(_quaternion, delta, weight);
|
|
28
|
+
const ax = base[0], ay = base[1], az = base[2], aw = base[3];
|
|
29
|
+
const bx = _quaternion[0], by = _quaternion[1], bz = _quaternion[2], bw = _quaternion[3];
|
|
30
|
+
writeNormalizedQuaternion(out, aw * bx + ax * bw + ay * bz - az * by, aw * by - ax * bz + ay * bw + az * bx, aw * bz + ax * by - ay * bx + az * bw, aw * bw - ax * bx - ay * by - az * bz);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const components = Math.min(out.length, base.length, delta.length);
|
|
34
|
+
for (let component = 0; component < components; component++) {
|
|
35
|
+
out[component] = base[component] + delta[component] * weight;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Blends two samples by `alpha` (clamped to [0,1]). Scalar/vector components lerp; quaternion inputs
|
|
39
|
+
// slerp over the shortest arc and normalize. `out` may alias either input.
|
|
40
|
+
export function blendAnimationSamples(out, a, b, alpha, quaternion = false) {
|
|
41
|
+
const t = alpha < 0 ? 0 : alpha > 1 ? 1 : alpha;
|
|
42
|
+
if (quaternion && out.length >= 4 && a.length >= 4 && b.length >= 4) {
|
|
43
|
+
slerpQuaternion(out, a, b, t);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const components = Math.min(out.length, a.length, b.length);
|
|
47
|
+
for (let component = 0; component < components; component++) {
|
|
48
|
+
out[component] = a[component] + (b[component] - a[component]) * t;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Allocates reusable target-free accumulation state. The result is an Entity, matching every Flight
|
|
52
|
+
// `create*` product; a bare scalar/vector accumulator pays only its component buffer.
|
|
53
|
+
export function createAnimationSampleAccumulator(components, quaternion = false) {
|
|
54
|
+
const width = Math.max(0, components | 0);
|
|
55
|
+
return createEntity({ components: width, quaternion, values: new Float32Array(width), weight: 0 });
|
|
56
|
+
}
|
|
57
|
+
// Writes a normalized weighted result. Returns false without changing `out` for an empty
|
|
58
|
+
// accumulator. Scalar/vector sums divide by total weight; quaternion sums normalize geometrically.
|
|
59
|
+
export function finishAnimationSample(out, accumulator) {
|
|
60
|
+
if (!(accumulator.weight > 0))
|
|
61
|
+
return false;
|
|
62
|
+
const components = Math.min(out.length, accumulator.components, accumulator.values.length);
|
|
63
|
+
if (accumulator.quaternion && components >= 4) {
|
|
64
|
+
const values = accumulator.values;
|
|
65
|
+
writeNormalizedQuaternion(out, values[0], values[1], values[2], values[3]);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
const inverseWeight = 1 / accumulator.weight;
|
|
69
|
+
for (let component = 0; component < components; component++) {
|
|
70
|
+
out[component] = accumulator.values[component] * inverseWeight;
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
// Clears weighted state in place for reuse without reallocating the component buffer.
|
|
75
|
+
export function resetAnimationSampleAccumulator(accumulator) {
|
|
76
|
+
accumulator.values.fill(0);
|
|
77
|
+
accumulator.weight = 0;
|
|
78
|
+
}
|
|
79
|
+
function slerpQuaternion(out, a, b, alpha) {
|
|
80
|
+
const ax = a[0], ay = a[1], az = a[2], aw = a[3];
|
|
81
|
+
let bx = b[0], by = b[1], bz = b[2], bw = b[3];
|
|
82
|
+
let dot = ax * bx + ay * by + az * bz + aw * bw;
|
|
83
|
+
if (dot < 0) {
|
|
84
|
+
dot = -dot;
|
|
85
|
+
bx = -bx;
|
|
86
|
+
by = -by;
|
|
87
|
+
bz = -bz;
|
|
88
|
+
bw = -bw;
|
|
89
|
+
}
|
|
90
|
+
let scaleA;
|
|
91
|
+
let scaleB;
|
|
92
|
+
if (1 - dot > 1e-6) {
|
|
93
|
+
const angle = Math.acos(Math.min(1, dot));
|
|
94
|
+
const inverseSin = 1 / Math.sin(angle);
|
|
95
|
+
scaleA = Math.sin((1 - alpha) * angle) * inverseSin;
|
|
96
|
+
scaleB = Math.sin(alpha * angle) * inverseSin;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
scaleA = 1 - alpha;
|
|
100
|
+
scaleB = alpha;
|
|
101
|
+
}
|
|
102
|
+
writeNormalizedQuaternion(out, scaleA * ax + scaleB * bx, scaleA * ay + scaleB * by, scaleA * az + scaleB * bz, scaleA * aw + scaleB * bw);
|
|
103
|
+
}
|
|
104
|
+
function writeNormalizedQuaternion(out, x, y, z, w) {
|
|
105
|
+
const length = Math.hypot(x, y, z, w);
|
|
106
|
+
if (length === 0) {
|
|
107
|
+
out[0] = 0;
|
|
108
|
+
out[1] = 0;
|
|
109
|
+
out[2] = 0;
|
|
110
|
+
out[3] = 1;
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const inverseLength = 1 / length;
|
|
114
|
+
out[0] = x * inverseLength;
|
|
115
|
+
out[1] = y * inverseLength;
|
|
116
|
+
out[2] = z * inverseLength;
|
|
117
|
+
out[3] = w * inverseLength;
|
|
118
|
+
}
|
|
119
|
+
function writeWeightedQuaternion(out, delta, weight) {
|
|
120
|
+
slerpQuaternion(out, IDENTITY_QUATERNION, delta, weight);
|
|
121
|
+
}
|
|
122
|
+
const IDENTITY_QUATERNION = new Float32Array([0, 0, 0, 1]);
|
|
123
|
+
const _quaternion = new Float32Array(4);
|
|
124
|
+
//# sourceMappingURL=animationBlend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animationBlend.js","sourceRoot":"","sources":["../src/animationBlend.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animationClip.d.ts","sourceRoot":"","sources":["../src/animationClip.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"animationClip.d.ts","sourceRoot":"","sources":["../src/animationClip.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMvF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,aAAa,CAM/E;AAGD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,GAAG,gBAAgB,CAElG;AAGD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,CAElG;AAGD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,MAAM,CAE9E;AAOD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EAAE,GAAG,YAAY,EAC5B,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAC9G,IAAI,CAON"}
|
package/dist/animationClip.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createEntity } from '@flighthq/entity';
|
|
1
2
|
import { cloneAnimationTrack, sampleAnimationTrack } from './animationTrack';
|
|
2
3
|
// Deep-copies a clip: each channel gets a freshly cloned track (buffers deep-copied) while its opaque
|
|
3
4
|
// `targetRef` is carried by reference (the clip core never interprets it, so it cannot deep-copy it).
|
|
@@ -6,15 +7,15 @@ export function cloneAnimationClip(clip) {
|
|
|
6
7
|
for (const channel of clip.channels) {
|
|
7
8
|
channels.push(createAnimationChannel(cloneAnimationTrack(channel.track), channel.targetRef));
|
|
8
9
|
}
|
|
9
|
-
return { channels, duration: clip.duration };
|
|
10
|
+
return createEntity({ channels, duration: clip.duration });
|
|
10
11
|
}
|
|
11
12
|
// Pairs a track with an opaque target reference (interpreted only by the domain binding layer).
|
|
12
13
|
export function createAnimationChannel(track, targetRef) {
|
|
13
|
-
return { targetRef, track };
|
|
14
|
+
return createEntity({ targetRef, track });
|
|
14
15
|
}
|
|
15
16
|
// Bundles channels into a clip. `duration` defaults to the latest keyframe time across all channels.
|
|
16
17
|
export function createAnimationClip(channels, duration) {
|
|
17
|
-
return { channels, duration: duration ?? computeChannelsDuration(channels) };
|
|
18
|
+
return createEntity({ channels, duration: duration ?? computeChannelsDuration(channels) });
|
|
18
19
|
}
|
|
19
20
|
// Returns the clip's total duration in seconds.
|
|
20
21
|
export function getAnimationClipDuration(clip) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animationClip.js","sourceRoot":"","sources":["../src/animationClip.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"animationClip.js","sourceRoot":"","sources":["../src/animationClip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7E,sGAAsG;AACtG,sGAAsG;AACtG,MAAM,UAAU,kBAAkB,CAAC,IAA6B;IAC9D,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,sBAAsB,CAAC,KAAqB,EAAE,SAAkB;IAC9E,OAAO,YAAY,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,mBAAmB,CAAC,QAA4B,EAAE,QAAiB;IACjF,OAAO,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI,uBAAuB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC7F,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,wBAAwB,CAAC,IAA6B;IACpE,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC;AAED,uGAAuG;AACvG,qGAAqG;AACrG,oGAAoG;AACpG,+FAA+F;AAC/F,wGAAwG;AACxG,MAAM,UAAU,mBAAmB,CACjC,GAA4B,EAC5B,IAA6B,EAC7B,IAAY,EACZ,KAA+G;IAE/G,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC/C,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,QAA+C;IAC9E,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAClC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;QAC1B,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG;YAAE,GAAG,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animationPlayer.d.ts","sourceRoot":"","sources":["../src/animationPlayer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"animationPlayer.d.ts","sourceRoot":"","sources":["../src/animationPlayer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAUzF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAsEhF;AAKD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,eAAe,CAYvF;AAID,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,aAAa,EACnB,IAAI,CAAC,EAAE,QAAQ,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC,GACD,eAAe,CAYjB;AAID,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAG1E;AAID,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,MAAM,CAK1F;AAID,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAEjE;AAGD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAG/E;AAID,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAGjE"}
|
package/dist/animationPlayer.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createEntity } from '@flighthq/entity';
|
|
1
2
|
import { createSignal, emitSignal } from '@flighthq/signals';
|
|
2
3
|
import { AnimationLoopModePingPong, AnimationLoopModeRepeat } from '@flighthq/types';
|
|
3
4
|
// Advances the playhead by `dt` seconds (scaled by `speed`; negative plays backward). When `loop`,
|
|
@@ -86,7 +87,7 @@ export function advanceAnimationPlayer(player, dt) {
|
|
|
86
87
|
// by reference — players are lightweight drivers over a clip; clone the clip separately for independent
|
|
87
88
|
// buffers. The clone starts signal-free (onFinished/onLooped null) so listeners are never shared.
|
|
88
89
|
export function cloneAnimationPlayer(player) {
|
|
89
|
-
return {
|
|
90
|
+
return createEntity({
|
|
90
91
|
clip: player.clip,
|
|
91
92
|
loop: player.loop,
|
|
92
93
|
loopMode: player.loopMode,
|
|
@@ -96,12 +97,12 @@ export function cloneAnimationPlayer(player) {
|
|
|
96
97
|
repeatCount: player.repeatCount,
|
|
97
98
|
speed: player.speed,
|
|
98
99
|
time: player.time,
|
|
99
|
-
};
|
|
100
|
+
});
|
|
100
101
|
}
|
|
101
102
|
// Allocates a player over `clip`. Defaults: looping, 'Repeat' loop mode, infinite repeats, playing,
|
|
102
103
|
// speed 1, time 0, and signal-free (onFinished/onLooped null until enableAnimationPlayerSignals).
|
|
103
104
|
export function createAnimationPlayer(clip, opts) {
|
|
104
|
-
return {
|
|
105
|
+
return createEntity({
|
|
105
106
|
clip,
|
|
106
107
|
loop: opts?.loop ?? true,
|
|
107
108
|
loopMode: opts?.loopMode ?? AnimationLoopModeRepeat,
|
|
@@ -111,7 +112,7 @@ export function createAnimationPlayer(clip, opts) {
|
|
|
111
112
|
repeatCount: opts?.repeatCount ?? -1,
|
|
112
113
|
speed: opts?.speed ?? 1,
|
|
113
114
|
time: opts?.time ?? 0,
|
|
114
|
-
};
|
|
115
|
+
});
|
|
115
116
|
}
|
|
116
117
|
// Allocates and attaches the opt-in player signals (onFinished, onLooped) to a player created before
|
|
117
118
|
// they were needed. Idempotent — calling twice does not create duplicate signals.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animationPlayer.js","sourceRoot":"","sources":["../src/animationPlayer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"animationPlayer.js","sourceRoot":"","sources":["../src/animationPlayer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animationTrack.d.ts","sourceRoot":"","sources":["../src/animationTrack.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"animationTrack.d.ts","sourceRoot":"","sources":["../src/animationTrack.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,cAAc,EAAE,kCAAkC,EAAE,MAAM,iBAAiB,CAAC;AAMlH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,cAAc,CASnF;AAKD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;CACnC,GAAG,cAAc,CASjB;AAOD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,KAAK,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAmDnH;AAOD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,cAAc,CAqBhB;AAKD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,kCAAkC,EAAE,GAAG,IAAI,CAsBnH"}
|
package/dist/animationTrack.js
CHANGED
|
@@ -1,29 +1,30 @@
|
|
|
1
|
+
import { createEntity } from '@flighthq/entity';
|
|
1
2
|
import { AnimationInterpolationLinear } from '@flighthq/types';
|
|
2
3
|
// Deep-copies an AnimationTrack, allocating fresh `times` and `values` buffers (preserving Float32Array
|
|
3
4
|
// vs number[] backing) so the clone shares no mutable state with the source. `easing` is a pure
|
|
4
5
|
// function and is carried by reference; all scalar fields are copied.
|
|
5
6
|
export function cloneAnimationTrack(track) {
|
|
6
|
-
return {
|
|
7
|
+
return createEntity({
|
|
7
8
|
components: track.components,
|
|
8
9
|
easing: track.easing,
|
|
9
10
|
interpolation: track.interpolation,
|
|
10
11
|
quaternion: track.quaternion,
|
|
11
12
|
times: cloneNumberBuffer(track.times),
|
|
12
13
|
values: cloneNumberBuffer(track.values),
|
|
13
|
-
};
|
|
14
|
+
});
|
|
14
15
|
}
|
|
15
16
|
// Allocates an AnimationTrack. `times` must be ascending; `values` is the flat keyframe buffer
|
|
16
17
|
// (`components` numbers per keyframe for step/linear, 3 * `components` for cubic). Defaults:
|
|
17
18
|
// linear interpolation, 1 component, non-quaternion, no easing.
|
|
18
19
|
export function createAnimationTrack(opts) {
|
|
19
|
-
return {
|
|
20
|
+
return createEntity({
|
|
20
21
|
components: opts.components ?? 1,
|
|
21
22
|
easing: opts.easing ?? null,
|
|
22
23
|
interpolation: opts.interpolation ?? AnimationInterpolationLinear,
|
|
23
24
|
quaternion: opts.quaternion ?? false,
|
|
24
25
|
times: opts.times,
|
|
25
26
|
values: opts.values,
|
|
26
|
-
};
|
|
27
|
+
});
|
|
27
28
|
}
|
|
28
29
|
// Samples `track` at time `t`, writing `track.components` numbers into `out`. `t` is clamped to the
|
|
29
30
|
// track's time range (before the first keyframe yields the first value; after the last yields the
|
|
@@ -103,14 +104,14 @@ export function trimAnimationTrack(track, startTime, endTime) {
|
|
|
103
104
|
for (let c = 0; c < stride; c++)
|
|
104
105
|
outValues.push(track.values[off + c]);
|
|
105
106
|
}
|
|
106
|
-
return {
|
|
107
|
+
return createEntity({
|
|
107
108
|
components,
|
|
108
109
|
easing: track.easing,
|
|
109
110
|
interpolation: track.interpolation,
|
|
110
111
|
quaternion: track.quaternion,
|
|
111
112
|
times: outTimes,
|
|
112
113
|
values: outValues,
|
|
113
|
-
};
|
|
114
|
+
});
|
|
114
115
|
}
|
|
115
116
|
// Structurally validates a track, returning null when it is well-formed or an array of diagnostics
|
|
116
117
|
// otherwise. Checks that `times` is strictly ascending and that `values.length` equals
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animationTrack.js","sourceRoot":"","sources":["../src/animationTrack.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"animationTrack.js","sourceRoot":"","sources":["../src/animationTrack.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/animation",
|
|
3
|
-
"version": "0.2.1-next.
|
|
3
|
+
"version": "0.2.1-next.530.a223ca9",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/flighthq/flight.git",
|
|
@@ -32,8 +32,9 @@
|
|
|
32
32
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@flighthq/
|
|
36
|
-
"@flighthq/
|
|
35
|
+
"@flighthq/entity": "0.2.1-next.530.a223ca9",
|
|
36
|
+
"@flighthq/signals": "0.2.1-next.530.a223ca9",
|
|
37
|
+
"@flighthq/types": "0.2.1-next.530.a223ca9"
|
|
37
38
|
},
|
|
38
39
|
"devDependencies": {
|
|
39
40
|
"typescript": "^5.3.0"
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { EntityRuntimeKey } from '@flighthq/types';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
addAnimationSample,
|
|
5
|
+
accumulateAnimationSample,
|
|
6
|
+
blendAnimationSamples,
|
|
7
|
+
createAnimationSampleAccumulator,
|
|
8
|
+
finishAnimationSample,
|
|
9
|
+
resetAnimationSampleAccumulator,
|
|
10
|
+
} from './animationBlend';
|
|
11
|
+
|
|
12
|
+
describe('accumulateAnimationSample', () => {
|
|
13
|
+
it('adds positive weighted samples and ignores zero/negative weights', () => {
|
|
14
|
+
const accumulator = createAnimationSampleAccumulator(2);
|
|
15
|
+
accumulateAnimationSample(accumulator, [2, 4], 2);
|
|
16
|
+
accumulateAnimationSample(accumulator, [100, 100], 0);
|
|
17
|
+
expect(Array.from(accumulator.values)).toEqual([4, 8]);
|
|
18
|
+
expect(accumulator.weight).toBe(2);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('aligns equivalent quaternion hemispheres instead of cancelling q and -q', () => {
|
|
22
|
+
const accumulator = createAnimationSampleAccumulator(4, true);
|
|
23
|
+
accumulateAnimationSample(accumulator, [0, 0, Math.SQRT1_2, Math.SQRT1_2], 1);
|
|
24
|
+
accumulateAnimationSample(accumulator, [0, 0, -Math.SQRT1_2, -Math.SQRT1_2], 1);
|
|
25
|
+
const out = [0, 0, 0, 0];
|
|
26
|
+
expect(finishAnimationSample(out, accumulator)).toBe(true);
|
|
27
|
+
expect(out[2]).toBeCloseTo(Math.SQRT1_2);
|
|
28
|
+
expect(out[3]).toBeCloseTo(Math.SQRT1_2);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe('addAnimationSample', () => {
|
|
33
|
+
it('adds weighted scalar/vector deltas and supports output aliasing', () => {
|
|
34
|
+
const out = [1, 2, 3];
|
|
35
|
+
addAnimationSample(out, out, [2, -2, 4], 0.5);
|
|
36
|
+
expect(out).toEqual([2, 1, 5]);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('multiplies a weighted quaternion delta onto the base', () => {
|
|
40
|
+
const halfTurnZ = [0, 0, 1, 0];
|
|
41
|
+
const out = [0, 0, 0, 0];
|
|
42
|
+
addAnimationSample(out, [0, 0, 0, 1], halfTurnZ, 0.5, true);
|
|
43
|
+
expect(out[2]).toBeCloseTo(Math.SQRT1_2);
|
|
44
|
+
expect(out[3]).toBeCloseTo(Math.SQRT1_2);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe('blendAnimationSamples', () => {
|
|
49
|
+
it('linearly blends components and clamps alpha', () => {
|
|
50
|
+
const out = [0, 0];
|
|
51
|
+
blendAnimationSamples(out, [0, 10], [10, 20], 0.25);
|
|
52
|
+
expect(out).toEqual([2.5, 12.5]);
|
|
53
|
+
blendAnimationSamples(out, [0, 10], [10, 20], 2);
|
|
54
|
+
expect(out).toEqual([10, 20]);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('slerps quaternions over the shortest arc', () => {
|
|
58
|
+
const out = [0, 0, 0, 0];
|
|
59
|
+
blendAnimationSamples(out, [0, 0, 0, 1], [0, 0, -1, 0], 0.5, true);
|
|
60
|
+
expect(Math.abs(out[2])).toBeCloseTo(Math.SQRT1_2);
|
|
61
|
+
expect(Math.abs(out[3])).toBeCloseTo(Math.SQRT1_2);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
describe('createAnimationSampleAccumulator', () => {
|
|
66
|
+
it('creates an Entity with an owned zeroed component buffer', () => {
|
|
67
|
+
const accumulator = createAnimationSampleAccumulator(3);
|
|
68
|
+
expect(EntityRuntimeKey in accumulator).toBe(true);
|
|
69
|
+
expect(accumulator.components).toBe(3);
|
|
70
|
+
expect(Array.from(accumulator.values)).toEqual([0, 0, 0]);
|
|
71
|
+
expect(accumulator.weight).toBe(0);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
describe('finishAnimationSample', () => {
|
|
76
|
+
it('normalizes scalar/vector sums by total weight', () => {
|
|
77
|
+
const accumulator = createAnimationSampleAccumulator(2);
|
|
78
|
+
accumulateAnimationSample(accumulator, [0, 10], 1);
|
|
79
|
+
accumulateAnimationSample(accumulator, [10, 20], 3);
|
|
80
|
+
const out = [0, 0];
|
|
81
|
+
expect(finishAnimationSample(out, accumulator)).toBe(true);
|
|
82
|
+
expect(out).toEqual([7.5, 17.5]);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('returns false and preserves output for an empty accumulator', () => {
|
|
86
|
+
const out = [7];
|
|
87
|
+
expect(finishAnimationSample(out, createAnimationSampleAccumulator(1))).toBe(false);
|
|
88
|
+
expect(out).toEqual([7]);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
describe('resetAnimationSampleAccumulator', () => {
|
|
93
|
+
it('clears state while retaining the owned buffer', () => {
|
|
94
|
+
const accumulator = createAnimationSampleAccumulator(2);
|
|
95
|
+
const values = accumulator.values;
|
|
96
|
+
accumulateAnimationSample(accumulator, [2, 4], 1);
|
|
97
|
+
resetAnimationSampleAccumulator(accumulator);
|
|
98
|
+
expect(accumulator.values).toBe(values);
|
|
99
|
+
expect(Array.from(values)).toEqual([0, 0]);
|
|
100
|
+
expect(accumulator.weight).toBe(0);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
@@ -22,6 +22,7 @@ describe('cloneAnimationClip', () => {
|
|
|
22
22
|
expect(clone.channels[0].track.times).not.toBe(clip.channels[0].track.times);
|
|
23
23
|
expect(clone.channels[0].targetRef).toBe(target);
|
|
24
24
|
expect(clone.duration).toBe(clip.duration);
|
|
25
|
+
expect(EntityRuntimeKey in clone).toBe(true);
|
|
25
26
|
});
|
|
26
27
|
});
|
|
27
28
|
|
|
@@ -32,6 +33,7 @@ describe('createAnimationChannel', () => {
|
|
|
32
33
|
const channel = createAnimationChannel(t, target);
|
|
33
34
|
expect(channel.track).toBe(t);
|
|
34
35
|
expect(channel.targetRef).toBe(target);
|
|
36
|
+
expect(EntityRuntimeKey in channel).toBe(true);
|
|
35
37
|
});
|
|
36
38
|
});
|
|
37
39
|
|
|
@@ -42,6 +44,7 @@ describe('createAnimationClip', () => {
|
|
|
42
44
|
createAnimationChannel(track([0, 2.5]), null),
|
|
43
45
|
]);
|
|
44
46
|
expect(clip.duration).toBe(2.5);
|
|
47
|
+
expect(EntityRuntimeKey in clip).toBe(true);
|
|
45
48
|
});
|
|
46
49
|
|
|
47
50
|
it('honors an explicit duration override', () => {
|
|
@@ -84,3 +87,4 @@ describe('sampleAnimationClip', () => {
|
|
|
84
87
|
expect(calls).toBe(0);
|
|
85
88
|
});
|
|
86
89
|
});
|
|
90
|
+
import { EntityRuntimeKey } from '@flighthq/types';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { connectSignal } from '@flighthq/signals';
|
|
2
|
+
import { EntityRuntimeKey } from '@flighthq/types';
|
|
2
3
|
|
|
3
4
|
import { createAnimationClip } from './animationClip';
|
|
4
5
|
import {
|
|
@@ -135,6 +136,7 @@ describe('cloneAnimationPlayer', () => {
|
|
|
135
136
|
expect(clone.time).toBe(4);
|
|
136
137
|
expect(clone.onFinished).toBeNull();
|
|
137
138
|
expect(clone.onLooped).toBeNull();
|
|
139
|
+
expect(EntityRuntimeKey in clone).toBe(true);
|
|
138
140
|
});
|
|
139
141
|
});
|
|
140
142
|
|
|
@@ -145,6 +147,7 @@ describe('createAnimationPlayer', () => {
|
|
|
145
147
|
expect(p.playing).toBe(true);
|
|
146
148
|
expect(p.speed).toBe(1);
|
|
147
149
|
expect(p.time).toBe(0);
|
|
150
|
+
expect(EntityRuntimeKey in p).toBe(true);
|
|
148
151
|
});
|
|
149
152
|
|
|
150
153
|
it('defaults to Repeat loop mode, infinite repeats, and no signals', () => {
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
AnimationInterpolationCubic,
|
|
3
|
+
AnimationInterpolationLinear,
|
|
4
|
+
AnimationInterpolationStep,
|
|
5
|
+
EntityRuntimeKey,
|
|
6
|
+
} from '@flighthq/types';
|
|
2
7
|
|
|
3
8
|
import {
|
|
4
9
|
cloneAnimationTrack,
|
|
@@ -18,6 +23,7 @@ describe('cloneAnimationTrack', () => {
|
|
|
18
23
|
expect(Array.from(clone.values)).toEqual([0, 0, 2, 4]);
|
|
19
24
|
(clone.values as number[])[0] = 99;
|
|
20
25
|
expect((track.values as number[])[0]).toBe(0);
|
|
26
|
+
expect(EntityRuntimeKey in clone).toBe(true);
|
|
21
27
|
});
|
|
22
28
|
|
|
23
29
|
it('preserves a Float32Array backing', () => {
|
|
@@ -51,6 +57,7 @@ describe('createAnimationTrack', () => {
|
|
|
51
57
|
expect(track.components).toBe(1);
|
|
52
58
|
expect(track.quaternion).toBe(false);
|
|
53
59
|
expect(track.easing).toBeNull();
|
|
60
|
+
expect(EntityRuntimeKey in track).toBe(true);
|
|
54
61
|
});
|
|
55
62
|
});
|
|
56
63
|
|
|
@@ -170,6 +177,7 @@ describe('trimAnimationTrack', () => {
|
|
|
170
177
|
it('keeps in-range keyframes and rebases times to start at 0', () => {
|
|
171
178
|
const track = createAnimationTrack({ times: [0, 1, 2, 3, 4], values: [0, 10, 20, 30, 40] });
|
|
172
179
|
const sub = trimAnimationTrack(track, 1, 3);
|
|
180
|
+
expect(EntityRuntimeKey in sub).toBe(true);
|
|
173
181
|
expect(Array.from(sub.times)).toEqual([0, 1, 2]);
|
|
174
182
|
expect(Array.from(sub.values)).toEqual([10, 20, 30]);
|
|
175
183
|
});
|