@aura3d/animation 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/README.md +19 -0
  2. package/dist/AnimationAction.d.ts +40 -0
  3. package/dist/AnimationAction.d.ts.map +1 -0
  4. package/dist/AnimationAction.js +143 -0
  5. package/dist/AnimationAction.js.map +1 -0
  6. package/dist/AnimationClip.d.ts +24 -0
  7. package/dist/AnimationClip.d.ts.map +1 -0
  8. package/dist/AnimationClip.js +45 -0
  9. package/dist/AnimationClip.js.map +1 -0
  10. package/dist/AnimationClipEvents.d.ts +57 -0
  11. package/dist/AnimationClipEvents.d.ts.map +1 -0
  12. package/dist/AnimationClipEvents.js +171 -0
  13. package/dist/AnimationClipEvents.js.map +1 -0
  14. package/dist/AnimationClipRegistry.d.ts +76 -0
  15. package/dist/AnimationClipRegistry.d.ts.map +1 -0
  16. package/dist/AnimationClipRegistry.js +130 -0
  17. package/dist/AnimationClipRegistry.js.map +1 -0
  18. package/dist/AnimationController.d.ts +168 -0
  19. package/dist/AnimationController.d.ts.map +1 -0
  20. package/dist/AnimationController.js +619 -0
  21. package/dist/AnimationController.js.map +1 -0
  22. package/dist/AnimationEvents.d.ts +10 -0
  23. package/dist/AnimationEvents.d.ts.map +1 -0
  24. package/dist/AnimationEvents.js +26 -0
  25. package/dist/AnimationEvents.js.map +1 -0
  26. package/dist/AnimationLayer.d.ts +27 -0
  27. package/dist/AnimationLayer.d.ts.map +1 -0
  28. package/dist/AnimationLayer.js +53 -0
  29. package/dist/AnimationLayer.js.map +1 -0
  30. package/dist/AnimationMixer.d.ts +54 -0
  31. package/dist/AnimationMixer.d.ts.map +1 -0
  32. package/dist/AnimationMixer.js +319 -0
  33. package/dist/AnimationMixer.js.map +1 -0
  34. package/dist/AnimationStateGraph.d.ts +2 -0
  35. package/dist/AnimationStateGraph.d.ts.map +1 -0
  36. package/dist/AnimationStateGraph.js +2 -0
  37. package/dist/AnimationStateGraph.js.map +1 -0
  38. package/dist/AnimationStateMachine.d.ts +59 -0
  39. package/dist/AnimationStateMachine.d.ts.map +1 -0
  40. package/dist/AnimationStateMachine.js +154 -0
  41. package/dist/AnimationStateMachine.js.map +1 -0
  42. package/dist/AnimationTrack.d.ts +23 -0
  43. package/dist/AnimationTrack.d.ts.map +1 -0
  44. package/dist/AnimationTrack.js +124 -0
  45. package/dist/AnimationTrack.js.map +1 -0
  46. package/dist/BlendTree.d.ts +23 -0
  47. package/dist/BlendTree.d.ts.map +1 -0
  48. package/dist/BlendTree.js +68 -0
  49. package/dist/BlendTree.js.map +1 -0
  50. package/dist/Bone.d.ts +20 -0
  51. package/dist/Bone.d.ts.map +1 -0
  52. package/dist/Bone.js +24 -0
  53. package/dist/Bone.js.map +1 -0
  54. package/dist/CrowdAnimation.d.ts +13 -0
  55. package/dist/CrowdAnimation.d.ts.map +1 -0
  56. package/dist/CrowdAnimation.js +14 -0
  57. package/dist/CrowdAnimation.js.map +1 -0
  58. package/dist/ECSAnimationBridge.d.ts +9 -0
  59. package/dist/ECSAnimationBridge.d.ts.map +1 -0
  60. package/dist/ECSAnimationBridge.js +24 -0
  61. package/dist/ECSAnimationBridge.js.map +1 -0
  62. package/dist/HumanoidRetargeting.d.ts +76 -0
  63. package/dist/HumanoidRetargeting.d.ts.map +1 -0
  64. package/dist/HumanoidRetargeting.js +331 -0
  65. package/dist/HumanoidRetargeting.js.map +1 -0
  66. package/dist/IK.d.ts +24 -0
  67. package/dist/IK.d.ts.map +1 -0
  68. package/dist/IK.js +76 -0
  69. package/dist/IK.js.map +1 -0
  70. package/dist/Keyframe.d.ts +50 -0
  71. package/dist/Keyframe.d.ts.map +1 -0
  72. package/dist/Keyframe.js +118 -0
  73. package/dist/Keyframe.js.map +1 -0
  74. package/dist/LocomotionController.d.ts +47 -0
  75. package/dist/LocomotionController.d.ts.map +1 -0
  76. package/dist/LocomotionController.js +106 -0
  77. package/dist/LocomotionController.js.map +1 -0
  78. package/dist/MotionMatchingFixtures.d.ts +58 -0
  79. package/dist/MotionMatchingFixtures.d.ts.map +1 -0
  80. package/dist/MotionMatchingFixtures.js +175 -0
  81. package/dist/MotionMatchingFixtures.js.map +1 -0
  82. package/dist/MotionQuality.d.ts +36 -0
  83. package/dist/MotionQuality.d.ts.map +1 -0
  84. package/dist/MotionQuality.js +117 -0
  85. package/dist/MotionQuality.js.map +1 -0
  86. package/dist/Retargeting.d.ts +12 -0
  87. package/dist/Retargeting.d.ts.map +1 -0
  88. package/dist/Retargeting.js +19 -0
  89. package/dist/Retargeting.js.map +1 -0
  90. package/dist/RootMotion.d.ts +21 -0
  91. package/dist/RootMotion.d.ts.map +1 -0
  92. package/dist/RootMotion.js +84 -0
  93. package/dist/RootMotion.js.map +1 -0
  94. package/dist/SceneAnimationBridge.d.ts +18 -0
  95. package/dist/SceneAnimationBridge.d.ts.map +1 -0
  96. package/dist/SceneAnimationBridge.js +69 -0
  97. package/dist/SceneAnimationBridge.js.map +1 -0
  98. package/dist/SecondaryAnimationFixtures.d.ts +55 -0
  99. package/dist/SecondaryAnimationFixtures.d.ts.map +1 -0
  100. package/dist/SecondaryAnimationFixtures.js +147 -0
  101. package/dist/SecondaryAnimationFixtures.js.map +1 -0
  102. package/dist/Skeleton.d.ts +9 -0
  103. package/dist/Skeleton.d.ts.map +1 -0
  104. package/dist/Skeleton.js +31 -0
  105. package/dist/Skeleton.js.map +1 -0
  106. package/dist/Skinning.d.ts +7 -0
  107. package/dist/Skinning.d.ts.map +1 -0
  108. package/dist/Skinning.js +12 -0
  109. package/dist/Skinning.js.map +1 -0
  110. package/dist/browser-index.d.ts +39 -0
  111. package/dist/browser-index.d.ts.map +1 -0
  112. package/dist/browser-index.js +34 -0
  113. package/dist/browser-index.js.map +1 -0
  114. package/dist/index.d.ts +40 -0
  115. package/dist/index.d.ts.map +1 -0
  116. package/dist/index.js +35 -0
  117. package/dist/index.js.map +1 -0
  118. package/dist/threejs-compatibility/AnimationAction.d.ts +16 -0
  119. package/dist/threejs-compatibility/AnimationAction.d.ts.map +1 -0
  120. package/dist/threejs-compatibility/AnimationAction.js +25 -0
  121. package/dist/threejs-compatibility/AnimationAction.js.map +1 -0
  122. package/dist/threejs-compatibility/AnimationClip.d.ts +14 -0
  123. package/dist/threejs-compatibility/AnimationClip.d.ts.map +1 -0
  124. package/dist/threejs-compatibility/AnimationClip.js +11 -0
  125. package/dist/threejs-compatibility/AnimationClip.js.map +1 -0
  126. package/dist/threejs-compatibility/AnimationDiagnostics.d.ts +44 -0
  127. package/dist/threejs-compatibility/AnimationDiagnostics.d.ts.map +1 -0
  128. package/dist/threejs-compatibility/AnimationDiagnostics.js +29 -0
  129. package/dist/threejs-compatibility/AnimationDiagnostics.js.map +1 -0
  130. package/dist/threejs-compatibility/AnimationMixer.d.ts +9 -0
  131. package/dist/threejs-compatibility/AnimationMixer.d.ts.map +1 -0
  132. package/dist/threejs-compatibility/AnimationMixer.js +24 -0
  133. package/dist/threejs-compatibility/AnimationMixer.js.map +1 -0
  134. package/dist/threejs-compatibility/MorphTargetMixer.d.ts +10 -0
  135. package/dist/threejs-compatibility/MorphTargetMixer.d.ts.map +1 -0
  136. package/dist/threejs-compatibility/MorphTargetMixer.js +10 -0
  137. package/dist/threejs-compatibility/MorphTargetMixer.js.map +1 -0
  138. package/dist/threejs-compatibility/Skeleton.d.ts +10 -0
  139. package/dist/threejs-compatibility/Skeleton.d.ts.map +1 -0
  140. package/dist/threejs-compatibility/Skeleton.js +8 -0
  141. package/dist/threejs-compatibility/Skeleton.js.map +1 -0
  142. package/dist/threejs-compatibility/SkinnedMesh.d.ts +11 -0
  143. package/dist/threejs-compatibility/SkinnedMesh.d.ts.map +1 -0
  144. package/dist/threejs-compatibility/SkinnedMesh.js +16 -0
  145. package/dist/threejs-compatibility/SkinnedMesh.js.map +1 -0
  146. package/dist/threejs-compatibility/index.d.ts +12 -0
  147. package/dist/threejs-compatibility/index.d.ts.map +1 -0
  148. package/dist/threejs-compatibility/index.js +8 -0
  149. package/dist/threejs-compatibility/index.js.map +1 -0
  150. package/package.json +17 -0
  151. package/src/AnimationAction.ts +166 -0
  152. package/src/AnimationClip.ts +63 -0
  153. package/src/AnimationClipEvents.ts +320 -0
  154. package/src/AnimationClipRegistry.ts +280 -0
  155. package/src/AnimationController.ts +967 -0
  156. package/src/AnimationEvents.ts +34 -0
  157. package/src/AnimationLayer.ts +73 -0
  158. package/src/AnimationMixer.ts +366 -0
  159. package/src/AnimationStateGraph.ts +8 -0
  160. package/src/AnimationStateMachine.ts +217 -0
  161. package/src/AnimationTrack.ts +176 -0
  162. package/src/BlendTree.ts +89 -0
  163. package/src/Bone.ts +35 -0
  164. package/src/CrowdAnimation.ts +25 -0
  165. package/src/ECSAnimationBridge.ts +30 -0
  166. package/src/HumanoidRetargeting.ts +476 -0
  167. package/src/IK.ts +107 -0
  168. package/src/Keyframe.ts +159 -0
  169. package/src/LocomotionController.ts +149 -0
  170. package/src/MotionMatchingFixtures.ts +254 -0
  171. package/src/MotionQuality.ts +156 -0
  172. package/src/Retargeting.ts +29 -0
  173. package/src/RootMotion.ts +124 -0
  174. package/src/SceneAnimationBridge.ts +80 -0
  175. package/src/SecondaryAnimationFixtures.ts +212 -0
  176. package/src/Skeleton.ts +34 -0
  177. package/src/Skinning.ts +18 -0
  178. package/src/browser-index.ts +55 -0
  179. package/src/index.ts +56 -0
  180. package/src/threejs-compatibility/AnimationAction.ts +27 -0
  181. package/src/threejs-compatibility/AnimationClip.ts +16 -0
  182. package/src/threejs-compatibility/AnimationDiagnostics.ts +42 -0
  183. package/src/threejs-compatibility/AnimationMixer.ts +24 -0
  184. package/src/threejs-compatibility/MorphTargetMixer.ts +16 -0
  185. package/src/threejs-compatibility/Skeleton.ts +9 -0
  186. package/src/threejs-compatibility/SkinnedMesh.ts +12 -0
  187. package/src/threejs-compatibility/index.ts +11 -0
@@ -0,0 +1,117 @@
1
+ export class AnimationMotionQualityTracker {
2
+ maxSamples;
3
+ minimumSamples;
4
+ minimumTimeRangeSeconds;
5
+ minimumPoseDiversityScore;
6
+ samples = [];
7
+ constructor(options = {}) {
8
+ this.maxSamples = positiveInteger(options.maxSamples ?? 180, "maxSamples");
9
+ this.minimumSamples = positiveInteger(options.minimumSamples ?? 8, "minimumSamples");
10
+ this.minimumTimeRangeSeconds = nonNegativeFinite(options.minimumTimeRangeSeconds ?? 0.18, "minimumTimeRangeSeconds");
11
+ this.minimumPoseDiversityScore = nonNegativeFinite(options.minimumPoseDiversityScore ?? 0.08, "minimumPoseDiversityScore");
12
+ }
13
+ record(sample) {
14
+ validateSample(sample);
15
+ this.samples.push(sample);
16
+ if (this.samples.length > this.maxSamples) {
17
+ this.samples.shift();
18
+ }
19
+ return this.report();
20
+ }
21
+ report() {
22
+ return summarizeAnimationMotion(this.samples, {
23
+ minimumSamples: this.minimumSamples,
24
+ minimumTimeRangeSeconds: this.minimumTimeRangeSeconds,
25
+ minimumPoseDiversityScore: this.minimumPoseDiversityScore
26
+ });
27
+ }
28
+ reset() {
29
+ this.samples.length = 0;
30
+ }
31
+ }
32
+ export function summarizeAnimationMotion(samples, options = {}) {
33
+ const minimumSamples = positiveInteger(options.minimumSamples ?? 8, "minimumSamples");
34
+ const minimumTimeRangeSeconds = nonNegativeFinite(options.minimumTimeRangeSeconds ?? 0.18, "minimumTimeRangeSeconds");
35
+ const minimumPoseDiversityScore = nonNegativeFinite(options.minimumPoseDiversityScore ?? 0.08, "minimumPoseDiversityScore");
36
+ const ordered = samples.slice().sort((left, right) => left.timeSeconds - right.timeSeconds);
37
+ const sampleCount = ordered.length;
38
+ if (sampleCount === 0) {
39
+ return emptyReport();
40
+ }
41
+ const firstTime = ordered[0].timeSeconds;
42
+ const lastTime = ordered[sampleCount - 1].timeSeconds;
43
+ const timeRangeSeconds = Math.max(0, lastTime - firstTime);
44
+ const activeTrackFrames = ordered.filter((sample) => (sample.tracksApplied ?? 0) > 0).length;
45
+ const activeSkinningFrames = ordered.filter((sample) => (sample.skinningPalettesUpdated ?? 0) > 0).length;
46
+ const animatedSubjectFrames = ordered.filter((sample) => (sample.animatedSubjects ?? 0) > 0).length;
47
+ const strides = ordered.map((sample) => Math.abs(sample.stride ?? 0));
48
+ const averageStride = strides.reduce((sum, value) => sum + value, 0) / sampleCount;
49
+ const poseDiversityScore = computePoseDiversity(ordered);
50
+ return {
51
+ sampleCount,
52
+ timeRangeSeconds: round(timeRangeSeconds),
53
+ activeTrackFrames,
54
+ activeSkinningFrames,
55
+ animatedSubjectFrames,
56
+ averageStride: round(averageStride),
57
+ poseDiversityScore: round(poseDiversityScore),
58
+ healthy: sampleCount >= minimumSamples
59
+ && timeRangeSeconds >= minimumTimeRangeSeconds
60
+ && poseDiversityScore >= minimumPoseDiversityScore
61
+ && (activeTrackFrames > 0 || activeSkinningFrames > 0 || animatedSubjectFrames > 0)
62
+ };
63
+ }
64
+ function computePoseDiversity(samples) {
65
+ if (samples.length < 2)
66
+ return 0;
67
+ let diversity = 0;
68
+ for (let index = 1; index < samples.length; index += 1) {
69
+ const previous = samples[index - 1];
70
+ const current = samples[index];
71
+ diversity += Math.abs(current.timeSeconds - previous.timeSeconds);
72
+ diversity += Math.abs((current.tracksApplied ?? 0) - (previous.tracksApplied ?? 0)) * 0.01;
73
+ diversity += Math.abs((current.skinningPalettesUpdated ?? 0) - (previous.skinningPalettesUpdated ?? 0)) * 0.01;
74
+ diversity += Math.abs((current.stride ?? 0) - (previous.stride ?? 0));
75
+ diversity += Math.abs((current.animatedSubjects ?? 0) - (previous.animatedSubjects ?? 0)) * 0.02;
76
+ }
77
+ return diversity;
78
+ }
79
+ function validateSample(sample) {
80
+ nonNegativeFinite(sample.timeSeconds, "timeSeconds");
81
+ optionalNonNegativeFinite(sample.tracksApplied, "tracksApplied");
82
+ optionalNonNegativeFinite(sample.skinningPalettesUpdated, "skinningPalettesUpdated");
83
+ optionalNonNegativeFinite(sample.stride, "stride");
84
+ optionalNonNegativeFinite(sample.animatedSubjects, "animatedSubjects");
85
+ }
86
+ function optionalNonNegativeFinite(value, label) {
87
+ if (value !== undefined)
88
+ nonNegativeFinite(value, label);
89
+ }
90
+ function nonNegativeFinite(value, label) {
91
+ if (!Number.isFinite(value) || value < 0) {
92
+ throw new RangeError(`Animation motion ${label} must be finite and non-negative.`);
93
+ }
94
+ return value;
95
+ }
96
+ function positiveInteger(value, label) {
97
+ if (!Number.isInteger(value) || value <= 0) {
98
+ throw new RangeError(`Animation motion ${label} must be a positive integer.`);
99
+ }
100
+ return value;
101
+ }
102
+ function emptyReport() {
103
+ return {
104
+ sampleCount: 0,
105
+ timeRangeSeconds: 0,
106
+ activeTrackFrames: 0,
107
+ activeSkinningFrames: 0,
108
+ animatedSubjectFrames: 0,
109
+ averageStride: 0,
110
+ poseDiversityScore: 0,
111
+ healthy: false
112
+ };
113
+ }
114
+ function round(value) {
115
+ return Number(value.toFixed(4));
116
+ }
117
+ //# sourceMappingURL=MotionQuality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MotionQuality.js","sourceRoot":"","sources":["../../../../packages/animation/src/MotionQuality.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Matrix4 } from "@aura3d/math";
2
+ export interface RetargetBoneMap {
3
+ readonly source: string;
4
+ readonly target: string;
5
+ readonly scale?: number;
6
+ }
7
+ export interface RetargetPoseInput {
8
+ readonly sourcePose: ReadonlyMap<string, Matrix4>;
9
+ readonly boneMap: readonly RetargetBoneMap[];
10
+ }
11
+ export declare function retargetPose(input: RetargetPoseInput): Map<string, Matrix4>;
12
+ //# sourceMappingURL=Retargeting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Retargeting.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/Retargeting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;CAC9C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAe3E"}
@@ -0,0 +1,19 @@
1
+ import { Matrix4 } from "@aura3d/math";
2
+ export function retargetPose(input) {
3
+ const output = new Map();
4
+ for (const mapping of input.boneMap) {
5
+ const source = input.sourcePose.get(mapping.source);
6
+ if (!source)
7
+ continue;
8
+ const elements = [...source.elements];
9
+ const scale = mapping.scale ?? 1;
10
+ if (scale !== 1) {
11
+ elements[12] *= scale;
12
+ elements[13] *= scale;
13
+ elements[14] *= scale;
14
+ }
15
+ output.set(mapping.target, new Matrix4(elements));
16
+ }
17
+ return output;
18
+ }
19
+ //# sourceMappingURL=Retargeting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Retargeting.js","sourceRoot":"","sources":["../../../../packages/animation/src/Retargeting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAavC,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC1C,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QACjC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC;YACtB,QAAQ,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC;YACtB,QAAQ,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC;QACxB,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,OAAO,CAAC,QAA0C,CAAC,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { AnimationClip } from "./AnimationClip.js";
2
+ import type { Vec3 } from "./Keyframe.js";
3
+ export type RootMotionExtractionDescriptor = {
4
+ readonly target?: string;
5
+ readonly fromTime: number;
6
+ readonly toTime: number;
7
+ readonly loop?: boolean;
8
+ };
9
+ export type RootMotionSample = {
10
+ readonly target: string;
11
+ readonly fromTime: number;
12
+ readonly toTime: number;
13
+ readonly looped: boolean;
14
+ readonly delta: Vec3;
15
+ };
16
+ export type RootMotionTarget = {
17
+ position: [number, number, number];
18
+ };
19
+ export declare function extractRootMotion(clip: AnimationClip, descriptor: RootMotionExtractionDescriptor): RootMotionSample;
20
+ export declare function applyRootMotion(target: RootMotionTarget, sample: RootMotionSample, scale?: number): RootMotionTarget;
21
+ //# sourceMappingURL=RootMotion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RootMotion.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/RootMotion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,MAAM,8BAA8B,GAAG;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC,CAAC;AAIF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,8BAA8B,GAAG,gBAAgB,CA4BnH;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,SAAI,GAAG,gBAAgB,CAU/G"}
@@ -0,0 +1,84 @@
1
+ const defaultRootMotionTarget = "root.position";
2
+ export function extractRootMotion(clip, descriptor) {
3
+ const target = descriptor.target ?? defaultRootMotionTarget;
4
+ if (!Number.isFinite(descriptor.fromTime) || !Number.isFinite(descriptor.toTime)) {
5
+ throw new Error("Root motion times must be finite.");
6
+ }
7
+ const track = clip.tracks.find((candidate) => candidate.target === target);
8
+ if (!track) {
9
+ throw new Error(`Root motion track "${target}" was not found.`);
10
+ }
11
+ if (track.valueType !== "vector3") {
12
+ throw new Error(`Root motion track "${target}" must be a vector3 track.`);
13
+ }
14
+ const loop = descriptor.loop ?? false;
15
+ const delta = loop
16
+ ? extractLoopingDelta(track, clip.duration, descriptor.fromTime, descriptor.toTime)
17
+ : subtractVec3(sampleVec3(track, clampTime(descriptor.toTime, clip.duration)), sampleVec3(track, clampTime(descriptor.fromTime, clip.duration)));
18
+ return {
19
+ target,
20
+ fromTime: descriptor.fromTime,
21
+ toTime: descriptor.toTime,
22
+ looped: loop,
23
+ delta
24
+ };
25
+ }
26
+ export function applyRootMotion(target, sample, scale = 1) {
27
+ if (!Number.isFinite(scale)) {
28
+ throw new Error("Root motion scale must be finite.");
29
+ }
30
+ target.position = [
31
+ target.position[0] + sample.delta[0] * scale,
32
+ target.position[1] + sample.delta[1] * scale,
33
+ target.position[2] + sample.delta[2] * scale
34
+ ];
35
+ return target;
36
+ }
37
+ function extractLoopingDelta(track, duration, fromTime, toTime) {
38
+ if (!Number.isFinite(duration) || duration <= 0) {
39
+ throw new Error("Looping root motion requires a positive clip duration.");
40
+ }
41
+ let effectiveTo = toTime;
42
+ if (effectiveTo < fromTime) {
43
+ effectiveTo += Math.ceil((fromTime - effectiveTo) / duration) * duration;
44
+ }
45
+ const fromCycle = Math.floor(fromTime / duration);
46
+ const toCycle = Math.floor(effectiveTo / duration);
47
+ const fromWrapped = wrapTime(fromTime, duration);
48
+ const toWrapped = wrapTime(effectiveTo, duration);
49
+ if (fromCycle === toCycle) {
50
+ return subtractVec3(sampleVec3(track, toWrapped), sampleVec3(track, fromWrapped));
51
+ }
52
+ const cycleDelta = subtractVec3(sampleVec3(track, duration), sampleVec3(track, 0));
53
+ const firstPartial = subtractVec3(sampleVec3(track, duration), sampleVec3(track, fromWrapped));
54
+ const wholeCycles = Math.max(0, toCycle - fromCycle - 1);
55
+ const finalPartial = subtractVec3(sampleVec3(track, toWrapped), sampleVec3(track, 0));
56
+ return addVec3(addVec3(firstPartial, scaleVec3(cycleDelta, wholeCycles)), finalPartial);
57
+ }
58
+ function clampTime(time, duration) {
59
+ if (!Number.isFinite(duration) || duration < 0) {
60
+ throw new Error("Root motion clip duration must be finite and non-negative.");
61
+ }
62
+ return Math.max(0, Math.min(duration, time));
63
+ }
64
+ function wrapTime(time, duration) {
65
+ const wrapped = time % duration;
66
+ return wrapped < 0 ? wrapped + duration : wrapped;
67
+ }
68
+ function sampleVec3(track, time) {
69
+ const value = track.sample(time);
70
+ if (!Array.isArray(value) || value.length !== 3 || value.some((component) => typeof component !== "number" || !Number.isFinite(component))) {
71
+ throw new Error(`Root motion track "${track.target}" sampled an invalid vector3 value.`);
72
+ }
73
+ return [value[0], value[1], value[2]];
74
+ }
75
+ function addVec3(a, b) {
76
+ return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];
77
+ }
78
+ function subtractVec3(a, b) {
79
+ return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
80
+ }
81
+ function scaleVec3(a, scale) {
82
+ return [a[0] * scale, a[1] * scale, a[2] * scale];
83
+ }
84
+ //# sourceMappingURL=RootMotion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RootMotion.js","sourceRoot":"","sources":["../../../../packages/animation/src/RootMotion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { AnimationValue } from "./Keyframe.js";
2
+ export type SceneAnimationNode = {
3
+ name?: string;
4
+ position?: [number, number, number];
5
+ rotation?: [number, number, number, number];
6
+ scale?: [number, number, number];
7
+ weights?: number[];
8
+ setPosition?: (value: readonly [number, number, number]) => void;
9
+ setRotation?: (value: readonly [number, number, number, number]) => void;
10
+ setScale?: (value: readonly [number, number, number]) => void;
11
+ setWeights?: (value: readonly number[]) => void;
12
+ };
13
+ export declare class SceneAnimationBridge {
14
+ private readonly nodes;
15
+ register(name: string, node: SceneAnimationNode): void;
16
+ setAnimationValue(target: string, value: AnimationValue): void;
17
+ }
18
+ //# sourceMappingURL=SceneAnimationBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SceneAnimationBridge.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/SceneAnimationBridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IACjE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IACzE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IAC9D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAC;CACjD,CAAC;AAEF,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyC;IAE/D,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,IAAI;IAOtD,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI;CAqB/D"}
@@ -0,0 +1,69 @@
1
+ export class SceneAnimationBridge {
2
+ nodes = new Map();
3
+ register(name, node) {
4
+ if (name.trim().length === 0) {
5
+ throw new Error("Scene animation target name cannot be empty.");
6
+ }
7
+ this.nodes.set(name, node);
8
+ }
9
+ setAnimationValue(target, value) {
10
+ const [nodeName, property] = target.split(".");
11
+ if (!nodeName || !property) {
12
+ throw new Error(`Invalid scene animation target ${target}.`);
13
+ }
14
+ const node = this.nodes.get(nodeName);
15
+ if (!node) {
16
+ throw new Error(`Missing scene animation target ${nodeName}.`);
17
+ }
18
+ if (property === "position" || property === "translation") {
19
+ writeVec3(node, "position", "setPosition", value);
20
+ }
21
+ else if (property === "rotation") {
22
+ writeQuat(node, value);
23
+ }
24
+ else if (property === "scale") {
25
+ writeVec3(node, "scale", "setScale", value);
26
+ }
27
+ else if (property === "weights") {
28
+ writeWeights(node, value);
29
+ }
30
+ else {
31
+ throw new Error(`Unsupported scene animation property ${property}.`);
32
+ }
33
+ }
34
+ }
35
+ function writeWeights(node, value) {
36
+ if (!Array.isArray(value) || value.some((weight) => typeof weight !== "number" || !Number.isFinite(weight))) {
37
+ throw new Error("weights animation value must be a finite number array.");
38
+ }
39
+ const weights = value.map((weight) => Math.max(0, Math.min(1, weight)));
40
+ if (node.setWeights) {
41
+ node.setWeights(weights);
42
+ }
43
+ else {
44
+ node.weights = weights;
45
+ }
46
+ }
47
+ function writeVec3(node, property, setter, value) {
48
+ if (!Array.isArray(value) || value.length !== 3) {
49
+ throw new Error(`${property} animation value must be a vec3.`);
50
+ }
51
+ if (node[setter]) {
52
+ node[setter](value);
53
+ }
54
+ else {
55
+ node[property] = [value[0], value[1], value[2]];
56
+ }
57
+ }
58
+ function writeQuat(node, value) {
59
+ if (!Array.isArray(value) || value.length !== 4) {
60
+ throw new Error("rotation animation value must be a quaternion.");
61
+ }
62
+ if (node.setRotation) {
63
+ node.setRotation(value);
64
+ }
65
+ else {
66
+ node.rotation = [value[0], value[1], value[2], value[3]];
67
+ }
68
+ }
69
+ //# sourceMappingURL=SceneAnimationBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SceneAnimationBridge.js","sourceRoot":"","sources":["../../../../packages/animation/src/SceneAnimationBridge.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,oBAAoB;IACd,KAAK,GAAG,IAAI,GAAG,EAA8B,CAAC;IAE/D,QAAQ,CAAC,IAAY,EAAE,IAAwB;QAC7C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,iBAAiB,CAAC,MAAc,EAAE,KAAqB;QACrD,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,GAAG,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,GAAG,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;YAC1D,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YACnC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAClC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,GAAG,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;CACF;AAED,SAAS,YAAY,CAAC,IAAwB,EAAE,KAAqB;IACnE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAC5G,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAwB,EAAE,QAA8B,EAAE,MAAkC,EAAE,KAAqB;IACpI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,kCAAkC,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAiC,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAwB,EAAE,KAAqB;IAChE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,KAAyC,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC"}
@@ -0,0 +1,55 @@
1
+ import type { Vec3 } from "./Keyframe";
2
+ export interface SecondaryAnimationFixtureOptions {
3
+ readonly stridePhase?: number;
4
+ readonly rootHeight?: number;
5
+ readonly velocity?: Vec3;
6
+ readonly terrainSlope?: number;
7
+ readonly deltaSeconds?: number;
8
+ readonly seed?: number;
9
+ }
10
+ export interface FootIkSample {
11
+ readonly side: "left" | "right";
12
+ readonly sourceFoot: Vec3;
13
+ readonly plantedFoot: Vec3;
14
+ readonly groundNormal: Vec3;
15
+ readonly grounded: boolean;
16
+ readonly verticalCorrection: number;
17
+ readonly targetError: number;
18
+ }
19
+ export interface SpringBoneSample {
20
+ readonly chainName: "ponytail";
21
+ readonly boneCount: number;
22
+ readonly stiffness: number;
23
+ readonly damping: number;
24
+ readonly collisionRadius: number;
25
+ readonly substeps: number;
26
+ readonly gravity: Vec3;
27
+ readonly wind: Vec3;
28
+ readonly rootPosition: Vec3;
29
+ readonly tipPosition: Vec3;
30
+ readonly maxDisplacement: number;
31
+ readonly collisionContacts: number;
32
+ }
33
+ export interface SecondaryAnimationFixture {
34
+ readonly source: "origin-master-foot-ik-spring-bone-adapted";
35
+ readonly footIk: {
36
+ readonly feet: readonly FootIkSample[];
37
+ readonly hipOffset: number;
38
+ readonly averageTargetError: number;
39
+ readonly groundedFeet: number;
40
+ readonly terrainSlope: number;
41
+ };
42
+ readonly springBone: SpringBoneSample;
43
+ readonly productionReadiness: {
44
+ readonly footPlacementTelemetry: boolean;
45
+ readonly hipAdjustmentTelemetry: boolean;
46
+ readonly springChainTelemetry: boolean;
47
+ readonly collisionTelemetry: boolean;
48
+ readonly deterministicReplay: boolean;
49
+ };
50
+ readonly hash: string;
51
+ readonly claimBoundary: string;
52
+ readonly blockedClaims: readonly string[];
53
+ }
54
+ export declare function sampleSecondaryAnimationFixture(options?: SecondaryAnimationFixtureOptions): SecondaryAnimationFixture;
55
+ //# sourceMappingURL=SecondaryAnimationFixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecondaryAnimationFixtures.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/SecondaryAnimationFixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,2CAA2C,CAAC;IAC7D,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,IAAI,EAAE,SAAS,YAAY,EAAE,CAAC;QACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;QACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;KAC/B,CAAC;IACF,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,mBAAmB,EAAE;QAC5B,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;QACzC,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;QACzC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;QACvC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;QACrC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;KACvC,CAAC;IACF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED,wBAAgB,+BAA+B,CAAC,OAAO,GAAE,gCAAqC,GAAG,yBAAyB,CAqDzH"}
@@ -0,0 +1,147 @@
1
+ export function sampleSecondaryAnimationFixture(options = {}) {
2
+ const stridePhase = wrap01(options.stridePhase ?? 0.35);
3
+ const rootHeight = clamp(options.rootHeight ?? 1.08, 0.4, 2.4);
4
+ const velocity = options.velocity ?? [0.9, 0, 0.22];
5
+ const terrainSlope = clamp(options.terrainSlope ?? 0.18, -0.7, 0.7);
6
+ const deltaSeconds = clamp(options.deltaSeconds ?? 1 / 60, 1 / 240, 1 / 10);
7
+ const seed = integerSeed(options.seed ?? 0x3d2025);
8
+ const groundNormal = normalize([-terrainSlope, 1, 0.08]);
9
+ const left = footSample("left", stridePhase, rootHeight, terrainSlope, groundNormal, velocity, seed);
10
+ const right = footSample("right", wrap01(stridePhase + 0.5), rootHeight, terrainSlope, groundNormal, velocity, seed + 17);
11
+ const feet = [left, right];
12
+ const averageTargetError = round(feet.reduce((sum, foot) => sum + foot.targetError, 0) / feet.length);
13
+ const hipOffset = round(-Math.max(...feet.map((foot) => Math.max(0, foot.verticalCorrection))) * 0.72);
14
+ const springBone = springSample(rootHeight, velocity, deltaSeconds, seed);
15
+ const fixture = {
16
+ source: "origin-master-foot-ik-spring-bone-adapted",
17
+ footIk: {
18
+ feet,
19
+ hipOffset,
20
+ averageTargetError,
21
+ groundedFeet: feet.filter((foot) => foot.grounded).length,
22
+ terrainSlope: round(terrainSlope)
23
+ },
24
+ springBone,
25
+ productionReadiness: {
26
+ footPlacementTelemetry: feet.every((foot) => foot.grounded && foot.targetError <= 0.015),
27
+ hipAdjustmentTelemetry: hipOffset < 0,
28
+ springChainTelemetry: springBone.boneCount >= 4 && springBone.maxDisplacement > 0,
29
+ collisionTelemetry: springBone.collisionContacts > 0,
30
+ deterministicReplay: true
31
+ },
32
+ hash: "",
33
+ claimBoundary: "Secondary animation fixture adapts old foot-IK ground placement and spring-bone secondary motion into deterministic telemetry; it does not claim production foot locking, retargeting, full-body IK, cloth/hair simulation, Unity Animation Rigging parity, or Unreal Control Rig parity.",
34
+ blockedClaims: [
35
+ "production foot locking parity",
36
+ "full-body IK solver parity",
37
+ "runtime retargeting parity",
38
+ "production spring-bone collision parity",
39
+ "Unity Animation Rigging parity",
40
+ "Unreal Control Rig parity"
41
+ ]
42
+ };
43
+ return {
44
+ ...fixture,
45
+ hash: stableHash([
46
+ fixture.footIk.groundedFeet,
47
+ fixture.footIk.hipOffset,
48
+ fixture.footIk.averageTargetError,
49
+ fixture.springBone.maxDisplacement,
50
+ fixture.springBone.collisionContacts,
51
+ fixture.springBone.tipPosition.join(",")
52
+ ].join("|"))
53
+ };
54
+ }
55
+ function footSample(side, phase, rootHeight, terrainSlope, normal, velocity, seed) {
56
+ const lateral = side === "left" ? -0.18 : 0.18;
57
+ const stride = Math.sin(phase * Math.PI * 2) * 0.22 + velocity[0] * 0.06;
58
+ const lift = Math.max(0, Math.sin(phase * Math.PI * 2)) * 0.08;
59
+ const jitter = (noise(seed) - 0.5) * 0.01;
60
+ const x = round(stride + jitter);
61
+ const z = round(lateral + velocity[2] * 0.04);
62
+ const sourceY = round(rootHeight - 1.05 + lift);
63
+ const groundY = round(x * terrainSlope - Math.abs(lateral) * 0.04);
64
+ const planted = [x, groundY + 0.035, z];
65
+ const source = [x, sourceY, z];
66
+ const verticalCorrection = round(sourceY - planted[1]);
67
+ return {
68
+ side,
69
+ sourceFoot: source,
70
+ plantedFoot: planted,
71
+ groundNormal: normal,
72
+ grounded: true,
73
+ verticalCorrection,
74
+ targetError: round(Math.abs(planted[1] - (groundY + 0.035)))
75
+ };
76
+ }
77
+ function springSample(rootHeight, velocity, deltaSeconds, seed) {
78
+ const stiffness = 0.62;
79
+ const damping = 0.38;
80
+ const collisionRadius = 0.08;
81
+ const substeps = Math.max(1, Math.min(4, Math.ceil(deltaSeconds / (1 / 120))));
82
+ const rootPosition = [0, round(rootHeight + 0.32), -0.08];
83
+ const wind = [round(velocity[0] * 0.18 + noise(seed + 9) * 0.05), 0, round(0.1 + velocity[2] * 0.08)];
84
+ const gravity = [0, -9.81, 0];
85
+ const displacement = round(Math.hypot(wind[0], wind[2]) * (1 - damping) + 0.055);
86
+ const rawTip = [
87
+ round(rootPosition[0] + wind[0] * 0.38),
88
+ round(rootPosition[1] - 0.42 - displacement * 0.35),
89
+ round(rootPosition[2] + wind[2] * 0.42)
90
+ ];
91
+ const collisionFloor = rootHeight - 0.22;
92
+ const collisionContacts = rawTip[1] < collisionFloor + collisionRadius ? 1 : 0;
93
+ const tipPosition = collisionContacts > 0 ? [rawTip[0], round(collisionFloor + collisionRadius), rawTip[2]] : rawTip;
94
+ return {
95
+ chainName: "ponytail",
96
+ boneCount: 5,
97
+ stiffness,
98
+ damping,
99
+ collisionRadius,
100
+ substeps,
101
+ gravity,
102
+ wind,
103
+ rootPosition,
104
+ tipPosition,
105
+ maxDisplacement: round(distance(rootPosition, tipPosition)),
106
+ collisionContacts
107
+ };
108
+ }
109
+ function wrap01(value) {
110
+ const wrapped = value - Math.floor(value);
111
+ return Number.isFinite(wrapped) ? wrapped : 0;
112
+ }
113
+ function integerSeed(value) {
114
+ if (!Number.isInteger(value))
115
+ throw new Error("Secondary animation fixture seed must be an integer.");
116
+ return value;
117
+ }
118
+ function normalize(value) {
119
+ const length = Math.hypot(value[0], value[1], value[2]);
120
+ if (length <= 1e-6)
121
+ return [0, 1, 0];
122
+ return [round(value[0] / length), round(value[1] / length), round(value[2] / length)];
123
+ }
124
+ function distance(left, right) {
125
+ return Math.hypot(left[0] - right[0], left[1] - right[1], left[2] - right[2]);
126
+ }
127
+ function noise(seed) {
128
+ let value = Math.imul(seed ^ 0x9e3779b9, 0x85ebca6b);
129
+ value ^= value >>> 13;
130
+ value = Math.imul(value, 0xc2b2ae35);
131
+ return ((value ^ (value >>> 16)) >>> 0) / 0xffffffff;
132
+ }
133
+ function clamp(value, min, max) {
134
+ return Math.max(min, Math.min(max, Number.isFinite(value) ? value : min));
135
+ }
136
+ function round(value) {
137
+ return Number(value.toFixed(4));
138
+ }
139
+ function stableHash(value) {
140
+ let hash = 0x811c9dc5;
141
+ for (let index = 0; index < value.length; index += 1) {
142
+ hash ^= value.charCodeAt(index);
143
+ hash = Math.imul(hash, 0x01000193);
144
+ }
145
+ return (hash >>> 0).toString(16).padStart(8, "0");
146
+ }
147
+ //# sourceMappingURL=SecondaryAnimationFixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecondaryAnimationFixtures.js","sourceRoot":"","sources":["../../../../packages/animation/src/SecondaryAnimationFixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Bone, type BoneDescriptor } from "./Bone.js";
2
+ import { type Mat4 } from "./Keyframe.js";
3
+ export declare class Skeleton {
4
+ readonly bones: readonly Bone[];
5
+ constructor(bones: readonly (Bone | BoneDescriptor)[]);
6
+ worldMatrices(): readonly Mat4[];
7
+ matrixPalette(): readonly Mat4[];
8
+ }
9
+ //# sourceMappingURL=Skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Skeleton.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/Skeleton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAgB,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AAExD,qBAAa,QAAQ;IACnB,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;gBAEpB,KAAK,EAAE,SAAS,CAAC,IAAI,GAAG,cAAc,CAAC,EAAE;IAarD,aAAa,IAAI,SAAS,IAAI,EAAE;IAUhC,aAAa,IAAI,SAAS,IAAI,EAAE;CAIjC"}