@aura3d/animation 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -0
- package/dist/AnimationAction.d.ts +40 -0
- package/dist/AnimationAction.d.ts.map +1 -0
- package/dist/AnimationAction.js +143 -0
- package/dist/AnimationAction.js.map +1 -0
- package/dist/AnimationClip.d.ts +24 -0
- package/dist/AnimationClip.d.ts.map +1 -0
- package/dist/AnimationClip.js +45 -0
- package/dist/AnimationClip.js.map +1 -0
- package/dist/AnimationClipEvents.d.ts +57 -0
- package/dist/AnimationClipEvents.d.ts.map +1 -0
- package/dist/AnimationClipEvents.js +171 -0
- package/dist/AnimationClipEvents.js.map +1 -0
- package/dist/AnimationClipRegistry.d.ts +76 -0
- package/dist/AnimationClipRegistry.d.ts.map +1 -0
- package/dist/AnimationClipRegistry.js +130 -0
- package/dist/AnimationClipRegistry.js.map +1 -0
- package/dist/AnimationController.d.ts +168 -0
- package/dist/AnimationController.d.ts.map +1 -0
- package/dist/AnimationController.js +619 -0
- package/dist/AnimationController.js.map +1 -0
- package/dist/AnimationEvents.d.ts +10 -0
- package/dist/AnimationEvents.d.ts.map +1 -0
- package/dist/AnimationEvents.js +26 -0
- package/dist/AnimationEvents.js.map +1 -0
- package/dist/AnimationLayer.d.ts +27 -0
- package/dist/AnimationLayer.d.ts.map +1 -0
- package/dist/AnimationLayer.js +53 -0
- package/dist/AnimationLayer.js.map +1 -0
- package/dist/AnimationMixer.d.ts +54 -0
- package/dist/AnimationMixer.d.ts.map +1 -0
- package/dist/AnimationMixer.js +319 -0
- package/dist/AnimationMixer.js.map +1 -0
- package/dist/AnimationStateGraph.d.ts +2 -0
- package/dist/AnimationStateGraph.d.ts.map +1 -0
- package/dist/AnimationStateGraph.js +2 -0
- package/dist/AnimationStateGraph.js.map +1 -0
- package/dist/AnimationStateMachine.d.ts +59 -0
- package/dist/AnimationStateMachine.d.ts.map +1 -0
- package/dist/AnimationStateMachine.js +154 -0
- package/dist/AnimationStateMachine.js.map +1 -0
- package/dist/AnimationTrack.d.ts +23 -0
- package/dist/AnimationTrack.d.ts.map +1 -0
- package/dist/AnimationTrack.js +124 -0
- package/dist/AnimationTrack.js.map +1 -0
- package/dist/BlendTree.d.ts +23 -0
- package/dist/BlendTree.d.ts.map +1 -0
- package/dist/BlendTree.js +68 -0
- package/dist/BlendTree.js.map +1 -0
- package/dist/Bone.d.ts +20 -0
- package/dist/Bone.d.ts.map +1 -0
- package/dist/Bone.js +24 -0
- package/dist/Bone.js.map +1 -0
- package/dist/CrowdAnimation.d.ts +13 -0
- package/dist/CrowdAnimation.d.ts.map +1 -0
- package/dist/CrowdAnimation.js +14 -0
- package/dist/CrowdAnimation.js.map +1 -0
- package/dist/ECSAnimationBridge.d.ts +9 -0
- package/dist/ECSAnimationBridge.d.ts.map +1 -0
- package/dist/ECSAnimationBridge.js +24 -0
- package/dist/ECSAnimationBridge.js.map +1 -0
- package/dist/HumanoidRetargeting.d.ts +76 -0
- package/dist/HumanoidRetargeting.d.ts.map +1 -0
- package/dist/HumanoidRetargeting.js +331 -0
- package/dist/HumanoidRetargeting.js.map +1 -0
- package/dist/IK.d.ts +24 -0
- package/dist/IK.d.ts.map +1 -0
- package/dist/IK.js +76 -0
- package/dist/IK.js.map +1 -0
- package/dist/Keyframe.d.ts +50 -0
- package/dist/Keyframe.d.ts.map +1 -0
- package/dist/Keyframe.js +118 -0
- package/dist/Keyframe.js.map +1 -0
- package/dist/LocomotionController.d.ts +47 -0
- package/dist/LocomotionController.d.ts.map +1 -0
- package/dist/LocomotionController.js +106 -0
- package/dist/LocomotionController.js.map +1 -0
- package/dist/MotionMatchingFixtures.d.ts +58 -0
- package/dist/MotionMatchingFixtures.d.ts.map +1 -0
- package/dist/MotionMatchingFixtures.js +175 -0
- package/dist/MotionMatchingFixtures.js.map +1 -0
- package/dist/MotionQuality.d.ts +36 -0
- package/dist/MotionQuality.d.ts.map +1 -0
- package/dist/MotionQuality.js +117 -0
- package/dist/MotionQuality.js.map +1 -0
- package/dist/Retargeting.d.ts +12 -0
- package/dist/Retargeting.d.ts.map +1 -0
- package/dist/Retargeting.js +19 -0
- package/dist/Retargeting.js.map +1 -0
- package/dist/RootMotion.d.ts +21 -0
- package/dist/RootMotion.d.ts.map +1 -0
- package/dist/RootMotion.js +84 -0
- package/dist/RootMotion.js.map +1 -0
- package/dist/SceneAnimationBridge.d.ts +18 -0
- package/dist/SceneAnimationBridge.d.ts.map +1 -0
- package/dist/SceneAnimationBridge.js +69 -0
- package/dist/SceneAnimationBridge.js.map +1 -0
- package/dist/SecondaryAnimationFixtures.d.ts +55 -0
- package/dist/SecondaryAnimationFixtures.d.ts.map +1 -0
- package/dist/SecondaryAnimationFixtures.js +147 -0
- package/dist/SecondaryAnimationFixtures.js.map +1 -0
- package/dist/Skeleton.d.ts +9 -0
- package/dist/Skeleton.d.ts.map +1 -0
- package/dist/Skeleton.js +31 -0
- package/dist/Skeleton.js.map +1 -0
- package/dist/Skinning.d.ts +7 -0
- package/dist/Skinning.d.ts.map +1 -0
- package/dist/Skinning.js +12 -0
- package/dist/Skinning.js.map +1 -0
- package/dist/browser-index.d.ts +39 -0
- package/dist/browser-index.d.ts.map +1 -0
- package/dist/browser-index.js +34 -0
- package/dist/browser-index.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/threejs-compatibility/AnimationAction.d.ts +16 -0
- package/dist/threejs-compatibility/AnimationAction.d.ts.map +1 -0
- package/dist/threejs-compatibility/AnimationAction.js +25 -0
- package/dist/threejs-compatibility/AnimationAction.js.map +1 -0
- package/dist/threejs-compatibility/AnimationClip.d.ts +14 -0
- package/dist/threejs-compatibility/AnimationClip.d.ts.map +1 -0
- package/dist/threejs-compatibility/AnimationClip.js +11 -0
- package/dist/threejs-compatibility/AnimationClip.js.map +1 -0
- package/dist/threejs-compatibility/AnimationDiagnostics.d.ts +44 -0
- package/dist/threejs-compatibility/AnimationDiagnostics.d.ts.map +1 -0
- package/dist/threejs-compatibility/AnimationDiagnostics.js +29 -0
- package/dist/threejs-compatibility/AnimationDiagnostics.js.map +1 -0
- package/dist/threejs-compatibility/AnimationMixer.d.ts +9 -0
- package/dist/threejs-compatibility/AnimationMixer.d.ts.map +1 -0
- package/dist/threejs-compatibility/AnimationMixer.js +24 -0
- package/dist/threejs-compatibility/AnimationMixer.js.map +1 -0
- package/dist/threejs-compatibility/MorphTargetMixer.d.ts +10 -0
- package/dist/threejs-compatibility/MorphTargetMixer.d.ts.map +1 -0
- package/dist/threejs-compatibility/MorphTargetMixer.js +10 -0
- package/dist/threejs-compatibility/MorphTargetMixer.js.map +1 -0
- package/dist/threejs-compatibility/Skeleton.d.ts +10 -0
- package/dist/threejs-compatibility/Skeleton.d.ts.map +1 -0
- package/dist/threejs-compatibility/Skeleton.js +8 -0
- package/dist/threejs-compatibility/Skeleton.js.map +1 -0
- package/dist/threejs-compatibility/SkinnedMesh.d.ts +11 -0
- package/dist/threejs-compatibility/SkinnedMesh.d.ts.map +1 -0
- package/dist/threejs-compatibility/SkinnedMesh.js +16 -0
- package/dist/threejs-compatibility/SkinnedMesh.js.map +1 -0
- package/dist/threejs-compatibility/index.d.ts +12 -0
- package/dist/threejs-compatibility/index.d.ts.map +1 -0
- package/dist/threejs-compatibility/index.js +8 -0
- package/dist/threejs-compatibility/index.js.map +1 -0
- package/package.json +17 -0
- package/src/AnimationAction.ts +166 -0
- package/src/AnimationClip.ts +63 -0
- package/src/AnimationClipEvents.ts +320 -0
- package/src/AnimationClipRegistry.ts +280 -0
- package/src/AnimationController.ts +967 -0
- package/src/AnimationEvents.ts +34 -0
- package/src/AnimationLayer.ts +73 -0
- package/src/AnimationMixer.ts +366 -0
- package/src/AnimationStateGraph.ts +8 -0
- package/src/AnimationStateMachine.ts +217 -0
- package/src/AnimationTrack.ts +176 -0
- package/src/BlendTree.ts +89 -0
- package/src/Bone.ts +35 -0
- package/src/CrowdAnimation.ts +25 -0
- package/src/ECSAnimationBridge.ts +30 -0
- package/src/HumanoidRetargeting.ts +476 -0
- package/src/IK.ts +107 -0
- package/src/Keyframe.ts +159 -0
- package/src/LocomotionController.ts +149 -0
- package/src/MotionMatchingFixtures.ts +254 -0
- package/src/MotionQuality.ts +156 -0
- package/src/Retargeting.ts +29 -0
- package/src/RootMotion.ts +124 -0
- package/src/SceneAnimationBridge.ts +80 -0
- package/src/SecondaryAnimationFixtures.ts +212 -0
- package/src/Skeleton.ts +34 -0
- package/src/Skinning.ts +18 -0
- package/src/browser-index.ts +55 -0
- package/src/index.ts +56 -0
- package/src/threejs-compatibility/AnimationAction.ts +27 -0
- package/src/threejs-compatibility/AnimationClip.ts +16 -0
- package/src/threejs-compatibility/AnimationDiagnostics.ts +42 -0
- package/src/threejs-compatibility/AnimationMixer.ts +24 -0
- package/src/threejs-compatibility/MorphTargetMixer.ts +16 -0
- package/src/threejs-compatibility/Skeleton.ts +9 -0
- package/src/threejs-compatibility/SkinnedMesh.ts +12 -0
- package/src/threejs-compatibility/index.ts +11 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
export class AnimationStateMachine {
|
|
2
|
+
states = new Map();
|
|
3
|
+
parameters = {};
|
|
4
|
+
currentState;
|
|
5
|
+
stateTime = 0;
|
|
6
|
+
constructor(states, initialState) {
|
|
7
|
+
for (const state of states) {
|
|
8
|
+
if (state.duration !== undefined && (!Number.isFinite(state.duration) || state.duration < 0)) {
|
|
9
|
+
throw new Error(`State ${state.name} has invalid duration.`);
|
|
10
|
+
}
|
|
11
|
+
for (const transition of state.transitions ?? []) {
|
|
12
|
+
if (transition.exitTime !== undefined && (!Number.isFinite(transition.exitTime) || transition.exitTime < 0)) {
|
|
13
|
+
throw new Error(`Transition from ${state.name} to ${transition.to} has invalid exit time.`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
this.states.set(state.name, state);
|
|
17
|
+
}
|
|
18
|
+
if (!this.states.has(initialState)) {
|
|
19
|
+
throw new Error(`Initial state ${initialState} does not exist.`);
|
|
20
|
+
}
|
|
21
|
+
for (const state of this.states.values()) {
|
|
22
|
+
if (state.onComplete !== undefined && !this.states.has(state.onComplete)) {
|
|
23
|
+
throw new Error(`State ${state.name} completion target ${state.onComplete} does not exist.`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
this.currentState = initialState;
|
|
27
|
+
this.resetParametersForState(this.requireState(initialState));
|
|
28
|
+
}
|
|
29
|
+
setParameter(name, value) {
|
|
30
|
+
this.parameters[name] = value;
|
|
31
|
+
}
|
|
32
|
+
update(delta = 0) {
|
|
33
|
+
if (!Number.isFinite(delta) || delta < 0) {
|
|
34
|
+
throw new Error("AnimationStateMachine delta must be finite and non-negative.");
|
|
35
|
+
}
|
|
36
|
+
this.stateTime += delta;
|
|
37
|
+
const state = this.requireState(this.currentState);
|
|
38
|
+
if (isStateComplete(state, this.stateTime)) {
|
|
39
|
+
if (state.completedParameter) {
|
|
40
|
+
this.parameters[state.completedParameter] = true;
|
|
41
|
+
}
|
|
42
|
+
if (state.onComplete) {
|
|
43
|
+
this.transitionTo(state.onComplete);
|
|
44
|
+
return this.currentState;
|
|
45
|
+
}
|
|
46
|
+
if (state.terminal || state.oneShot) {
|
|
47
|
+
return this.currentState;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (state.terminal || state.oneShot) {
|
|
51
|
+
return this.currentState;
|
|
52
|
+
}
|
|
53
|
+
const transition = [...(state.transitions ?? [])]
|
|
54
|
+
.filter((candidate) => candidate.condition(this.parameters))
|
|
55
|
+
.filter((candidate) => candidate.exitTime === undefined || this.stateTime >= candidate.exitTime)
|
|
56
|
+
.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0) || a.to.localeCompare(b.to))[0];
|
|
57
|
+
if (transition) {
|
|
58
|
+
if (!this.states.has(transition.to)) {
|
|
59
|
+
throw new Error(`Transition target ${transition.to} does not exist.`);
|
|
60
|
+
}
|
|
61
|
+
consumeParameters(this.parameters, transition.consumeParameters);
|
|
62
|
+
this.transitionTo(transition.to);
|
|
63
|
+
}
|
|
64
|
+
return this.currentState;
|
|
65
|
+
}
|
|
66
|
+
graphSnapshot() {
|
|
67
|
+
const states = [];
|
|
68
|
+
const transitions = [];
|
|
69
|
+
for (const state of this.states.values()) {
|
|
70
|
+
const stateTransitions = state.transitions ?? [];
|
|
71
|
+
states.push({
|
|
72
|
+
name: state.name,
|
|
73
|
+
current: state.name === this.currentState,
|
|
74
|
+
transitionCount: stateTransitions.length,
|
|
75
|
+
...(state.duration === undefined ? {} : { duration: state.duration }),
|
|
76
|
+
...(state.oneShot ? { oneShot: true } : {}),
|
|
77
|
+
...(state.terminal ? { terminal: true } : {}),
|
|
78
|
+
...(state.name === this.currentState && isStateComplete(state, this.stateTime) ? { completed: true } : {}),
|
|
79
|
+
...(state.onComplete === undefined ? {} : { onComplete: state.onComplete })
|
|
80
|
+
});
|
|
81
|
+
stateTransitions.forEach((transition, index) => {
|
|
82
|
+
transitions.push({
|
|
83
|
+
from: state.name,
|
|
84
|
+
to: transition.to,
|
|
85
|
+
index,
|
|
86
|
+
priority: transition.priority ?? 0,
|
|
87
|
+
label: transition.label ?? `${state.name}->${transition.to}`,
|
|
88
|
+
...(transition.exitTime === undefined ? {} : { exitTime: transition.exitTime }),
|
|
89
|
+
...(transition.consumeParameters === undefined || transition.consumeParameters.length === 0
|
|
90
|
+
? {}
|
|
91
|
+
: { consumeParameters: [...transition.consumeParameters] })
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
currentState: this.currentState,
|
|
97
|
+
stateTime: this.stateTime,
|
|
98
|
+
parameters: { ...this.parameters },
|
|
99
|
+
states,
|
|
100
|
+
transitions
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
debugGraph() {
|
|
104
|
+
const snapshot = this.graphSnapshot();
|
|
105
|
+
const lines = [
|
|
106
|
+
`AnimationStateMachine current=${snapshot.currentState} time=${formatNumber(snapshot.stateTime)}`
|
|
107
|
+
];
|
|
108
|
+
for (const state of snapshot.states) {
|
|
109
|
+
lines.push(`state ${state.name}${state.current ? " *" : ""} transitions=${state.transitionCount}`);
|
|
110
|
+
for (const transition of snapshot.transitions.filter((candidate) => candidate.from === state.name)) {
|
|
111
|
+
const exitTime = transition.exitTime === undefined ? "" : ` exit=${formatNumber(transition.exitTime)}`;
|
|
112
|
+
lines.push(` -> ${transition.to} priority=${transition.priority}${exitTime} label=${transition.label}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return lines.join("\n");
|
|
116
|
+
}
|
|
117
|
+
requireState(name) {
|
|
118
|
+
const state = this.states.get(name);
|
|
119
|
+
if (!state) {
|
|
120
|
+
throw new Error(`Current state ${name} does not exist.`);
|
|
121
|
+
}
|
|
122
|
+
return state;
|
|
123
|
+
}
|
|
124
|
+
transitionTo(name) {
|
|
125
|
+
const state = this.requireState(name);
|
|
126
|
+
this.currentState = name;
|
|
127
|
+
this.stateTime = 0;
|
|
128
|
+
this.resetParametersForState(state);
|
|
129
|
+
}
|
|
130
|
+
resetParametersForState(state) {
|
|
131
|
+
consumeParameters(this.parameters, state.resetParametersOnEnter);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function formatNumber(value) {
|
|
135
|
+
return Number(value.toFixed(6)).toString();
|
|
136
|
+
}
|
|
137
|
+
function isStateComplete(state, stateTime) {
|
|
138
|
+
return state.duration !== undefined && stateTime >= state.duration;
|
|
139
|
+
}
|
|
140
|
+
function consumeParameters(parameters, names) {
|
|
141
|
+
for (const name of names ?? []) {
|
|
142
|
+
const value = parameters[name];
|
|
143
|
+
if (typeof value === "boolean") {
|
|
144
|
+
parameters[name] = false;
|
|
145
|
+
}
|
|
146
|
+
else if (typeof value === "number") {
|
|
147
|
+
parameters[name] = 0;
|
|
148
|
+
}
|
|
149
|
+
else if (typeof value === "string") {
|
|
150
|
+
parameters[name] = "";
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=AnimationStateMachine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnimationStateMachine.js","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationStateMachine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type AnimationValue, type Keyframe, type SerializedKeyframe } from "./Keyframe.js";
|
|
2
|
+
export type TrackValueType = "scalar" | "vector3" | "quaternion" | "number-array" | "boolean" | "string";
|
|
3
|
+
export type AnimationTrackDescriptor<T extends AnimationValue = AnimationValue> = {
|
|
4
|
+
readonly target: string;
|
|
5
|
+
readonly valueType: TrackValueType;
|
|
6
|
+
readonly keyframes: readonly Keyframe<T>[];
|
|
7
|
+
};
|
|
8
|
+
export type SerializedAnimationTrack<T extends AnimationValue = AnimationValue> = {
|
|
9
|
+
readonly target: string;
|
|
10
|
+
readonly valueType: TrackValueType;
|
|
11
|
+
readonly keyframes: readonly SerializedKeyframe<T>[];
|
|
12
|
+
};
|
|
13
|
+
export declare class AnimationTrack<T extends AnimationValue = AnimationValue> {
|
|
14
|
+
readonly target: string;
|
|
15
|
+
readonly valueType: TrackValueType;
|
|
16
|
+
readonly keyframes: readonly Keyframe<T>[];
|
|
17
|
+
readonly duration: number;
|
|
18
|
+
constructor(descriptor: AnimationTrackDescriptor<T>);
|
|
19
|
+
sample(time: number): T;
|
|
20
|
+
toJSON(): SerializedAnimationTrack<T>;
|
|
21
|
+
static fromJSON<T extends AnimationValue = AnimationValue>(serialized: SerializedAnimationTrack<T>): AnimationTrack<T>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=AnimationTrack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnimationTrack.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationTrack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmH,KAAK,cAAc,EAAE,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAE7M,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,GAAG,cAAc,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEzG,MAAM,MAAM,wBAAwB,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAAI;IAChF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,wBAAwB,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAAI;IAChF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,SAAS,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;CACtD,CAAC;AAEF,qBAAa,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc;IACnE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,UAAU,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAWnD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC;IA4BvB,MAAM,IAAI,wBAAwB,CAAC,CAAC,CAAC;IAQrC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;CAOvH"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { cloneAnimationValue, deserializeKeyframe, lerpNumber, lerpVec3, serializeKeyframe, slerpQuat, validateKeyframes } from "./Keyframe.js";
|
|
2
|
+
export class AnimationTrack {
|
|
3
|
+
target;
|
|
4
|
+
valueType;
|
|
5
|
+
keyframes;
|
|
6
|
+
duration;
|
|
7
|
+
constructor(descriptor) {
|
|
8
|
+
if (descriptor.target.trim().length === 0) {
|
|
9
|
+
throw new Error("AnimationTrack target cannot be empty.");
|
|
10
|
+
}
|
|
11
|
+
validateKeyframes(descriptor.keyframes);
|
|
12
|
+
this.target = descriptor.target;
|
|
13
|
+
this.valueType = descriptor.valueType;
|
|
14
|
+
this.keyframes = descriptor.keyframes.map((keyframe) => ({ ...keyframe, value: cloneAnimationValue(keyframe.value) }));
|
|
15
|
+
this.duration = this.keyframes[this.keyframes.length - 1].time;
|
|
16
|
+
}
|
|
17
|
+
sample(time) {
|
|
18
|
+
if (!Number.isFinite(time)) {
|
|
19
|
+
throw new Error("AnimationTrack sample time must be finite.");
|
|
20
|
+
}
|
|
21
|
+
if (time <= this.keyframes[0].time) {
|
|
22
|
+
return cloneAnimationValue(this.keyframes[0].value);
|
|
23
|
+
}
|
|
24
|
+
const last = this.keyframes[this.keyframes.length - 1];
|
|
25
|
+
if (time >= last.time) {
|
|
26
|
+
return cloneAnimationValue(last.value);
|
|
27
|
+
}
|
|
28
|
+
for (let index = 0; index < this.keyframes.length - 1; index += 1) {
|
|
29
|
+
const a = this.keyframes[index];
|
|
30
|
+
const b = this.keyframes[index + 1];
|
|
31
|
+
if (time >= a.time && time <= b.time) {
|
|
32
|
+
if (a.interpolation === "step" || b.time === a.time) {
|
|
33
|
+
return cloneAnimationValue(a.value);
|
|
34
|
+
}
|
|
35
|
+
const t = (time - a.time) / (b.time - a.time);
|
|
36
|
+
if (a.interpolation === "cubicspline") {
|
|
37
|
+
return interpolateCubicSpline(this.valueType, a.value, b.value, a.outTangent, b.inTangent, t, b.time - a.time);
|
|
38
|
+
}
|
|
39
|
+
return interpolate(this.valueType, a.value, b.value, t);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return cloneAnimationValue(last.value);
|
|
43
|
+
}
|
|
44
|
+
toJSON() {
|
|
45
|
+
return {
|
|
46
|
+
target: this.target,
|
|
47
|
+
valueType: this.valueType,
|
|
48
|
+
keyframes: this.keyframes.map((keyframe) => serializeKeyframe(keyframe))
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
static fromJSON(serialized) {
|
|
52
|
+
return new AnimationTrack({
|
|
53
|
+
target: serialized.target,
|
|
54
|
+
valueType: serialized.valueType,
|
|
55
|
+
keyframes: serialized.keyframes.map((keyframe) => deserializeKeyframe(keyframe))
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function interpolateCubicSpline(type, a, b, outTangent, inTangent, t, deltaTime) {
|
|
60
|
+
if (outTangent === undefined || inTangent === undefined) {
|
|
61
|
+
throw new Error("CUBICSPLINE keyframes require outTangent on the first keyframe and inTangent on the next keyframe.");
|
|
62
|
+
}
|
|
63
|
+
switch (type) {
|
|
64
|
+
case "scalar":
|
|
65
|
+
return cubicScalar(a, b, outTangent, inTangent, t, deltaTime);
|
|
66
|
+
case "vector3":
|
|
67
|
+
return [
|
|
68
|
+
cubicScalar(a[0], b[0], outTangent[0], inTangent[0], t, deltaTime),
|
|
69
|
+
cubicScalar(a[1], b[1], outTangent[1], inTangent[1], t, deltaTime),
|
|
70
|
+
cubicScalar(a[2], b[2], outTangent[2], inTangent[2], t, deltaTime)
|
|
71
|
+
];
|
|
72
|
+
case "quaternion":
|
|
73
|
+
return normalizeCubicQuaternion(a, b, outTangent, inTangent, t, deltaTime);
|
|
74
|
+
case "number-array":
|
|
75
|
+
return cubicNumberArray(a, b, outTangent, inTangent, t, deltaTime);
|
|
76
|
+
case "boolean":
|
|
77
|
+
case "string":
|
|
78
|
+
throw new Error(`CUBICSPLINE interpolation is not supported for ${type} animation tracks.`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function cubicScalar(a, b, outTangent, inTangent, t, deltaTime) {
|
|
82
|
+
const t2 = t * t;
|
|
83
|
+
const t3 = t2 * t;
|
|
84
|
+
return ((2 * t3 - 3 * t2 + 1) * a +
|
|
85
|
+
(t3 - 2 * t2 + t) * deltaTime * outTangent +
|
|
86
|
+
(-2 * t3 + 3 * t2) * b +
|
|
87
|
+
(t3 - t2) * deltaTime * inTangent);
|
|
88
|
+
}
|
|
89
|
+
function cubicNumberArray(a, b, outTangent, inTangent, t, deltaTime) {
|
|
90
|
+
if (a.length !== b.length || a.length !== outTangent.length || b.length !== inTangent.length) {
|
|
91
|
+
throw new Error("CUBICSPLINE number-array keyframes require matching value and tangent lengths.");
|
|
92
|
+
}
|
|
93
|
+
return a.map((value, index) => cubicScalar(value, b[index], outTangent[index], inTangent[index], t, deltaTime));
|
|
94
|
+
}
|
|
95
|
+
function normalizeCubicQuaternion(a, b, outTangent, inTangent, t, deltaTime) {
|
|
96
|
+
return slerpQuat([0, 0, 0, 1], [
|
|
97
|
+
cubicScalar(a[0], b[0], outTangent[0], inTangent[0], t, deltaTime),
|
|
98
|
+
cubicScalar(a[1], b[1], outTangent[1], inTangent[1], t, deltaTime),
|
|
99
|
+
cubicScalar(a[2], b[2], outTangent[2], inTangent[2], t, deltaTime),
|
|
100
|
+
cubicScalar(a[3], b[3], outTangent[3], inTangent[3], t, deltaTime)
|
|
101
|
+
], 1);
|
|
102
|
+
}
|
|
103
|
+
function interpolate(type, a, b, t) {
|
|
104
|
+
switch (type) {
|
|
105
|
+
case "scalar":
|
|
106
|
+
return lerpNumber(a, b, t);
|
|
107
|
+
case "vector3":
|
|
108
|
+
return lerpVec3(a, b, t);
|
|
109
|
+
case "quaternion":
|
|
110
|
+
return slerpQuat(a, b, t);
|
|
111
|
+
case "number-array":
|
|
112
|
+
return interpolateNumberArray(a, b, t);
|
|
113
|
+
case "boolean":
|
|
114
|
+
case "string":
|
|
115
|
+
return t < 1 ? a : b;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function interpolateNumberArray(a, b, t) {
|
|
119
|
+
if (a.length !== b.length) {
|
|
120
|
+
throw new Error("number-array animation keyframes require matching lengths.");
|
|
121
|
+
}
|
|
122
|
+
return a.map((value, index) => lerpNumber(value, b[index], t));
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=AnimationTrack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnimationTrack.js","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationTrack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,iBAAiB,EAA+D,MAAM,eAAe,CAAC;AAgB7M,MAAM,OAAO,cAAc;IAChB,MAAM,CAAS;IACf,SAAS,CAAiB;IAC1B,SAAS,CAAyB;IAClC,QAAQ,CAAS;IAE1B,YAAY,UAAuC;QACjD,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QACD,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACvH,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,IAAI,CAAC;IAClE,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;YACpC,OAAO,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;QACxD,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAClE,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAE,CAAC;YACjC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC;YACrC,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBACrC,IAAI,CAAC,CAAC,aAAa,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;oBACpD,OAAO,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACtC,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC9C,IAAI,CAAC,CAAC,aAAa,KAAK,aAAa,EAAE,CAAC;oBACtC,OAAO,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAM,CAAC;gBACtH,CAAC;gBACD,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAM,CAAC;YAC/D,CAAC;QACH,CAAC;QACD,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,MAAM;QACJ,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;SACzE,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,QAAQ,CAA4C,UAAuC;QAChG,OAAO,IAAI,cAAc,CAAC;YACxB,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;SACjF,CAAC,CAAC;IACL,CAAC;CACF;AAED,SAAS,sBAAsB,CAC7B,IAAoB,EACpB,CAAiB,EACjB,CAAiB,EACjB,UAAsC,EACtC,SAAqC,EACrC,CAAS,EACT,SAAiB;IAEjB,IAAI,UAAU,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,oGAAoG,CAAC,CAAC;IACxH,CAAC;IACD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,WAAW,CAAC,CAAW,EAAE,CAAW,EAAE,UAAoB,EAAE,SAAmB,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;QACxG,KAAK,SAAS;YACZ,OAAO;gBACL,WAAW,CAAE,CAA8B,CAAC,CAAC,CAAC,EAAG,CAA8B,CAAC,CAAC,CAAC,EAAG,UAAuC,CAAC,CAAC,CAAC,EAAG,SAAsC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;gBAC1L,WAAW,CAAE,CAA8B,CAAC,CAAC,CAAC,EAAG,CAA8B,CAAC,CAAC,CAAC,EAAG,UAAuC,CAAC,CAAC,CAAC,EAAG,SAAsC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;gBAC1L,WAAW,CAAE,CAA8B,CAAC,CAAC,CAAC,EAAG,CAA8B,CAAC,CAAC,CAAC,EAAG,UAAuC,CAAC,CAAC,CAAC,EAAG,SAAsC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;aAC3L,CAAC;QACJ,KAAK,YAAY;YACf,OAAO,wBAAwB,CAAC,CAAqC,EAAE,CAAqC,EAAE,UAA8C,EAAE,SAA6C,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;QAC7N,KAAK,cAAc;YACjB,OAAO,gBAAgB,CAAC,CAAsB,EAAE,CAAsB,EAAE,UAA+B,EAAE,SAA8B,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;QACzJ,KAAK,SAAS,CAAC;QACf,KAAK,QAAQ;YACX,MAAM,IAAI,KAAK,CAAC,kDAAkD,IAAI,oBAAoB,CAAC,CAAC;IAChG,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS,EAAE,UAAkB,EAAE,SAAiB,EAAE,CAAS,EAAE,SAAiB;IAC5G,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAClB,OAAO,CACL,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC;QACzB,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,UAAU;QAC1C,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;QACtB,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,SAAS,GAAG,SAAS,CAClC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,CAAoB,EACpB,CAAoB,EACpB,UAA6B,EAC7B,SAA4B,EAC5B,CAAS,EACT,SAAiB;IAEjB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;QAC7F,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;IACpG,CAAC;IACD,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAE,EAAE,UAAU,CAAC,KAAK,CAAE,EAAE,SAAS,CAAC,KAAK,CAAE,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;AACrH,CAAC;AAED,SAAS,wBAAwB,CAC/B,CAA4C,EAC5C,CAA4C,EAC5C,UAAqD,EACrD,SAAoD,EACpD,CAAS,EACT,SAAiB;IAEjB,OAAO,SAAS,CACd,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACZ;QACE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;QAClE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;QAClE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;QAClE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;KACnE,EACD,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAoB,EAAE,CAAiB,EAAE,CAAiB,EAAE,CAAS;IACxF,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,UAAU,CAAC,CAAW,EAAE,CAAW,EAAE,CAAC,CAAC,CAAC;QACjD,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC,CAA6B,EAAE,CAA6B,EAAE,CAAC,CAAC,CAAC;QACnF,KAAK,YAAY;YACf,OAAO,SAAS,CAAC,CAAqC,EAAE,CAAqC,EAAE,CAAC,CAAC,CAAC;QACpG,KAAK,cAAc;YACjB,OAAO,sBAAsB,CAAC,CAAsB,EAAE,CAAsB,EAAE,CAAC,CAAC,CAAC;QACnF,KAAK,SAAS,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,CAAoB,EAAE,CAAoB,EAAE,CAAS;IACnF,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type BlendTreeChild<T> = {
|
|
2
|
+
readonly value: T;
|
|
3
|
+
readonly threshold: number;
|
|
4
|
+
};
|
|
5
|
+
export type BlendTree2DChild<T> = {
|
|
6
|
+
readonly value: T;
|
|
7
|
+
readonly position: readonly [number, number];
|
|
8
|
+
};
|
|
9
|
+
export type BlendTreeWeight<T> = {
|
|
10
|
+
readonly value: T;
|
|
11
|
+
readonly weight: number;
|
|
12
|
+
};
|
|
13
|
+
export declare class BlendTree1D<T> {
|
|
14
|
+
readonly children: readonly BlendTreeChild<T>[];
|
|
15
|
+
constructor(children: readonly BlendTreeChild<T>[]);
|
|
16
|
+
weights(parameter: number): readonly BlendTreeWeight<T>[];
|
|
17
|
+
}
|
|
18
|
+
export declare class BlendTree2D<T> {
|
|
19
|
+
readonly children: readonly BlendTree2DChild<T>[];
|
|
20
|
+
constructor(children: readonly BlendTree2DChild<T>[]);
|
|
21
|
+
weights(parameter: readonly [number, number]): readonly BlendTreeWeight<T>[];
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=BlendTree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlendTree.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/BlendTree.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC9B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI;IAChC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAC/B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,qBAAa,WAAW,CAAC,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEpC,QAAQ,EAAE,SAAS,cAAc,CAAC,CAAC,CAAC,EAAE;IAOlD,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE;CAsB1D;AAED,qBAAa,WAAW,CAAC,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEtC,QAAQ,EAAE,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAAE;IAYpD,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE;CAwB7E"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export class BlendTree1D {
|
|
2
|
+
children;
|
|
3
|
+
constructor(children) {
|
|
4
|
+
if (children.length === 0) {
|
|
5
|
+
throw new Error("BlendTree1D requires at least one child.");
|
|
6
|
+
}
|
|
7
|
+
this.children = [...children].sort((a, b) => a.threshold - b.threshold);
|
|
8
|
+
}
|
|
9
|
+
weights(parameter) {
|
|
10
|
+
if (!Number.isFinite(parameter)) {
|
|
11
|
+
throw new Error("Blend parameter must be finite.");
|
|
12
|
+
}
|
|
13
|
+
if (this.children.length === 1 || parameter <= this.children[0].threshold) {
|
|
14
|
+
return [{ value: this.children[0].value, weight: 1 }];
|
|
15
|
+
}
|
|
16
|
+
const last = this.children[this.children.length - 1];
|
|
17
|
+
if (parameter >= last.threshold) {
|
|
18
|
+
return [{ value: last.value, weight: 1 }];
|
|
19
|
+
}
|
|
20
|
+
for (let index = 0; index < this.children.length - 1; index += 1) {
|
|
21
|
+
const a = this.children[index];
|
|
22
|
+
const b = this.children[index + 1];
|
|
23
|
+
if (parameter >= a.threshold && parameter <= b.threshold) {
|
|
24
|
+
const span = b.threshold - a.threshold;
|
|
25
|
+
const t = span === 0 ? 0 : (parameter - a.threshold) / span;
|
|
26
|
+
return [{ value: a.value, weight: 1 - t }, { value: b.value, weight: t }];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return [{ value: last.value, weight: 1 }];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export class BlendTree2D {
|
|
33
|
+
children;
|
|
34
|
+
constructor(children) {
|
|
35
|
+
if (children.length === 0) {
|
|
36
|
+
throw new Error("BlendTree2D requires at least one child.");
|
|
37
|
+
}
|
|
38
|
+
for (const child of children) {
|
|
39
|
+
if (!Number.isFinite(child.position[0]) || !Number.isFinite(child.position[1])) {
|
|
40
|
+
throw new Error("BlendTree2D child positions must be finite.");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
this.children = [...children];
|
|
44
|
+
}
|
|
45
|
+
weights(parameter) {
|
|
46
|
+
if (!Number.isFinite(parameter[0]) || !Number.isFinite(parameter[1])) {
|
|
47
|
+
throw new Error("BlendTree2D parameters must be finite.");
|
|
48
|
+
}
|
|
49
|
+
if (this.children.length === 1) {
|
|
50
|
+
return [{ value: this.children[0].value, weight: 1 }];
|
|
51
|
+
}
|
|
52
|
+
const distances = this.children.map((child) => {
|
|
53
|
+
const dx = parameter[0] - child.position[0];
|
|
54
|
+
const dy = parameter[1] - child.position[1];
|
|
55
|
+
return Math.hypot(dx, dy);
|
|
56
|
+
});
|
|
57
|
+
const exactIndex = distances.findIndex((distance) => distance === 0);
|
|
58
|
+
if (exactIndex >= 0) {
|
|
59
|
+
return [{ value: this.children[exactIndex].value, weight: 1 }];
|
|
60
|
+
}
|
|
61
|
+
const inverseDistances = distances.map((distance) => 1 / distance);
|
|
62
|
+
const total = inverseDistances.reduce((sum, weight) => sum + weight, 0);
|
|
63
|
+
return this.children
|
|
64
|
+
.map((child, index) => ({ value: child.value, weight: inverseDistances[index] / total }))
|
|
65
|
+
.filter((weight) => weight.weight > 0);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=BlendTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlendTree.js","sourceRoot":"","sources":["../../../../packages/animation/src/BlendTree.ts"],"names":[],"mappings":"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"}
|
package/dist/Bone.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type Mat4, type Quat, type Vec3 } from "./Keyframe.js";
|
|
2
|
+
export type BoneDescriptor = {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly parentIndex: number;
|
|
5
|
+
readonly translation?: Vec3;
|
|
6
|
+
readonly rotation?: Quat;
|
|
7
|
+
readonly scale?: Vec3;
|
|
8
|
+
readonly inverseBindMatrix?: Mat4;
|
|
9
|
+
};
|
|
10
|
+
export declare class Bone {
|
|
11
|
+
readonly name: string;
|
|
12
|
+
readonly parentIndex: number;
|
|
13
|
+
translation: Vec3;
|
|
14
|
+
rotation: Quat;
|
|
15
|
+
scale: Vec3;
|
|
16
|
+
inverseBindMatrix: Mat4;
|
|
17
|
+
constructor(descriptor: BoneDescriptor);
|
|
18
|
+
localMatrix(): Mat4;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=Bone.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Bone.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/Bone.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AAE3F,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC;CACnC,CAAC;AAEF,qBAAa,IAAI;IACf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,IAAI,CAAC;IAClB,QAAQ,EAAE,IAAI,CAAC;IACf,KAAK,EAAE,IAAI,CAAC;IACZ,iBAAiB,EAAE,IAAI,CAAC;gBAEZ,UAAU,EAAE,cAAc;IAYtC,WAAW,IAAI,IAAI;CAGpB"}
|
package/dist/Bone.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { composeMat4, identityMat4 } from "./Keyframe.js";
|
|
2
|
+
export class Bone {
|
|
3
|
+
name;
|
|
4
|
+
parentIndex;
|
|
5
|
+
translation;
|
|
6
|
+
rotation;
|
|
7
|
+
scale;
|
|
8
|
+
inverseBindMatrix;
|
|
9
|
+
constructor(descriptor) {
|
|
10
|
+
if (descriptor.name.trim().length === 0) {
|
|
11
|
+
throw new Error("Bone name cannot be empty.");
|
|
12
|
+
}
|
|
13
|
+
this.name = descriptor.name;
|
|
14
|
+
this.parentIndex = descriptor.parentIndex;
|
|
15
|
+
this.translation = descriptor.translation ?? [0, 0, 0];
|
|
16
|
+
this.rotation = descriptor.rotation ?? [0, 0, 0, 1];
|
|
17
|
+
this.scale = descriptor.scale ?? [1, 1, 1];
|
|
18
|
+
this.inverseBindMatrix = descriptor.inverseBindMatrix ?? identityMat4();
|
|
19
|
+
}
|
|
20
|
+
localMatrix() {
|
|
21
|
+
return composeMat4(this.translation, this.rotation, this.scale);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=Bone.js.map
|
package/dist/Bone.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Bone.js","sourceRoot":"","sources":["../../../../packages/animation/src/Bone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAmC,MAAM,eAAe,CAAC;AAW3F,MAAM,OAAO,IAAI;IACN,IAAI,CAAS;IACb,WAAW,CAAS;IAC7B,WAAW,CAAO;IAClB,QAAQ,CAAO;IACf,KAAK,CAAO;IACZ,iBAAiB,CAAO;IAExB,YAAY,UAA0B;QACpC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC,iBAAiB,IAAI,YAAY,EAAE,CAAC;IAC1E,CAAC;IAED,WAAW;QACT,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface CrowdAnimationAgent {
|
|
2
|
+
readonly id: string;
|
|
3
|
+
readonly clip: string;
|
|
4
|
+
readonly phase: number;
|
|
5
|
+
readonly speed: number;
|
|
6
|
+
}
|
|
7
|
+
export interface CrowdAnimationSample {
|
|
8
|
+
readonly id: string;
|
|
9
|
+
readonly clip: string;
|
|
10
|
+
readonly time: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function sampleCrowdAnimation(agents: readonly CrowdAnimationAgent[], elapsedSeconds: number): readonly CrowdAnimationSample[];
|
|
13
|
+
//# sourceMappingURL=CrowdAnimation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CrowdAnimation.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/CrowdAnimation.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,mBAAmB,EAAE,EAAE,cAAc,EAAE,MAAM,GAAG,SAAS,oBAAoB,EAAE,CAWpI"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function sampleCrowdAnimation(agents, elapsedSeconds) {
|
|
2
|
+
if (!Number.isFinite(elapsedSeconds) || elapsedSeconds < 0) {
|
|
3
|
+
throw new Error("Crowd animation elapsedSeconds must be finite and non-negative.");
|
|
4
|
+
}
|
|
5
|
+
return agents.map((agent) => {
|
|
6
|
+
if (!agent.id.trim() || !agent.clip.trim())
|
|
7
|
+
throw new Error("Crowd animation agents require id and clip.");
|
|
8
|
+
if (!Number.isFinite(agent.phase) || !Number.isFinite(agent.speed) || agent.speed < 0) {
|
|
9
|
+
throw new Error(`Crowd animation agent ${agent.id} has invalid phase or speed.`);
|
|
10
|
+
}
|
|
11
|
+
return { id: agent.id, clip: agent.clip, time: agent.phase + elapsedSeconds * agent.speed };
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=CrowdAnimation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CrowdAnimation.js","sourceRoot":"","sources":["../../../../packages/animation/src/CrowdAnimation.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,oBAAoB,CAAC,MAAsC,EAAE,cAAsB;IACjG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC3G,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACtF,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,EAAE,8BAA8B,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG,cAAc,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;IAC9F,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AnimationValue } from "./Keyframe.js";
|
|
2
|
+
export type ECSAnimationComponent = Record<string, AnimationValue | undefined>;
|
|
3
|
+
export declare class ECSAnimationBridge {
|
|
4
|
+
private readonly components;
|
|
5
|
+
register(entityName: string, component: ECSAnimationComponent): void;
|
|
6
|
+
unregister(entityName: string): void;
|
|
7
|
+
setAnimationValue(target: string, value: AnimationValue): void;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=ECSAnimationBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ECSAnimationBridge.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/ECSAnimationBridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;AAE/E,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4C;IAEvE,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,qBAAqB,GAAG,IAAI;IAOpE,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIpC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI;CAW/D"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export class ECSAnimationBridge {
|
|
2
|
+
components = new Map();
|
|
3
|
+
register(entityName, component) {
|
|
4
|
+
if (entityName.trim().length === 0) {
|
|
5
|
+
throw new Error("ECS animation target name cannot be empty.");
|
|
6
|
+
}
|
|
7
|
+
this.components.set(entityName, component);
|
|
8
|
+
}
|
|
9
|
+
unregister(entityName) {
|
|
10
|
+
this.components.delete(entityName);
|
|
11
|
+
}
|
|
12
|
+
setAnimationValue(target, value) {
|
|
13
|
+
const [entityName, property] = target.split(".");
|
|
14
|
+
if (!entityName || !property) {
|
|
15
|
+
throw new Error(`Invalid ECS animation target ${target}.`);
|
|
16
|
+
}
|
|
17
|
+
const component = this.components.get(entityName);
|
|
18
|
+
if (!component) {
|
|
19
|
+
throw new Error(`Missing ECS animation target ${entityName}.`);
|
|
20
|
+
}
|
|
21
|
+
component[property] = Array.isArray(value) ? [...value] : value;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ECSAnimationBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ECSAnimationBridge.js","sourceRoot":"","sources":["../../../../packages/animation/src/ECSAnimationBridge.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,kBAAkB;IACZ,UAAU,GAAG,IAAI,GAAG,EAAiC,CAAC;IAEvE,QAAQ,CAAC,UAAkB,EAAE,SAAgC;QAC3D,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC7C,CAAC;IAED,UAAU,CAAC,UAAkB;QAC3B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAED,iBAAiB,CAAC,MAAc,EAAE,KAAqB;QACrD,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,GAAG,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,gCAAgC,UAAU,GAAG,CAAC,CAAC;QACjE,CAAC;QACD,SAAS,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,CAAC,GAAG,KAAK,CAA+B,CAAC,CAAC,CAAC,KAAK,CAAC;IACjG,CAAC;CACF"}
|