@aura3d/animation 3.0.1 → 4.0.0

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 (175) hide show
  1. package/dist/AnimationController.d.ts +8 -0
  2. package/dist/AnimationController.d.ts.map +1 -1
  3. package/dist/AnimationController.js +93 -0
  4. package/dist/AnimationController.js.map +1 -1
  5. package/dist/AnimationMixer.d.ts.map +1 -1
  6. package/dist/AnimationMixer.js +11 -0
  7. package/dist/AnimationMixer.js.map +1 -1
  8. package/dist/FootIk.d.ts +41 -0
  9. package/dist/FootIk.d.ts.map +1 -1
  10. package/dist/FootIk.js +202 -0
  11. package/dist/FootIk.js.map +1 -1
  12. package/dist/IK.d.ts +26 -0
  13. package/dist/IK.d.ts.map +1 -1
  14. package/dist/IK.js +515 -0
  15. package/dist/IK.js.map +1 -1
  16. package/dist/Keyframe.d.ts.map +1 -1
  17. package/dist/Keyframe.js +13 -12
  18. package/dist/Keyframe.js.map +1 -1
  19. package/dist/SpringBones.d.ts +80 -0
  20. package/dist/SpringBones.d.ts.map +1 -1
  21. package/dist/SpringBones.js +593 -49
  22. package/dist/SpringBones.js.map +1 -1
  23. package/dist/browser-index.d.ts +1 -1
  24. package/dist/browser-index.d.ts.map +1 -1
  25. package/dist/browser-index.js +1 -1
  26. package/dist/browser-index.js.map +1 -1
  27. package/dist/contracts/index.d.ts +2 -0
  28. package/dist/contracts/index.d.ts.map +1 -0
  29. package/dist/contracts/index.js +7 -0
  30. package/dist/contracts/index.js.map +1 -0
  31. package/dist/contracts/pose.d.ts +25 -0
  32. package/dist/contracts/pose.d.ts.map +1 -0
  33. package/dist/contracts/pose.js +41 -0
  34. package/dist/contracts/pose.js.map +1 -0
  35. package/dist/experimental/CrowdAnimation.d.ts +13 -0
  36. package/dist/experimental/CrowdAnimation.d.ts.map +1 -0
  37. package/dist/experimental/CrowdAnimation.js +14 -0
  38. package/dist/experimental/CrowdAnimation.js.map +1 -0
  39. package/dist/index.d.ts +1 -1
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +1 -1
  42. package/dist/index.js.map +1 -1
  43. package/dist/lanes/index.d.ts +17 -0
  44. package/dist/lanes/index.d.ts.map +1 -0
  45. package/dist/lanes/index.js +17 -0
  46. package/dist/lanes/index.js.map +1 -0
  47. package/dist/lanes/prd01.d.ts +6 -0
  48. package/dist/lanes/prd01.d.ts.map +1 -0
  49. package/dist/lanes/prd01.js +6 -0
  50. package/dist/lanes/prd01.js.map +1 -0
  51. package/dist/lanes/prd02.d.ts +6 -0
  52. package/dist/lanes/prd02.d.ts.map +1 -0
  53. package/dist/lanes/prd02.js +6 -0
  54. package/dist/lanes/prd02.js.map +1 -0
  55. package/dist/lanes/prd03.d.ts +6 -0
  56. package/dist/lanes/prd03.d.ts.map +1 -0
  57. package/dist/lanes/prd03.js +6 -0
  58. package/dist/lanes/prd03.js.map +1 -0
  59. package/dist/lanes/prd04.d.ts +6 -0
  60. package/dist/lanes/prd04.d.ts.map +1 -0
  61. package/dist/lanes/prd04.js +6 -0
  62. package/dist/lanes/prd04.js.map +1 -0
  63. package/dist/lanes/prd05.d.ts +6 -0
  64. package/dist/lanes/prd05.d.ts.map +1 -0
  65. package/dist/lanes/prd05.js +6 -0
  66. package/dist/lanes/prd05.js.map +1 -0
  67. package/dist/lanes/prd06.d.ts +37 -0
  68. package/dist/lanes/prd06.d.ts.map +1 -0
  69. package/dist/lanes/prd06.js +26 -0
  70. package/dist/lanes/prd06.js.map +1 -0
  71. package/dist/lanes/prd07.d.ts +6 -0
  72. package/dist/lanes/prd07.d.ts.map +1 -0
  73. package/dist/lanes/prd07.js +6 -0
  74. package/dist/lanes/prd07.js.map +1 -0
  75. package/dist/lanes/prd08.d.ts +6 -0
  76. package/dist/lanes/prd08.d.ts.map +1 -0
  77. package/dist/lanes/prd08.js +6 -0
  78. package/dist/lanes/prd08.js.map +1 -0
  79. package/dist/lanes/prd09.d.ts +6 -0
  80. package/dist/lanes/prd09.d.ts.map +1 -0
  81. package/dist/lanes/prd09.js +6 -0
  82. package/dist/lanes/prd09.js.map +1 -0
  83. package/dist/lanes/prd10.d.ts +6 -0
  84. package/dist/lanes/prd10.d.ts.map +1 -0
  85. package/dist/lanes/prd10.js +6 -0
  86. package/dist/lanes/prd10.js.map +1 -0
  87. package/dist/lanes/prd11.d.ts +6 -0
  88. package/dist/lanes/prd11.d.ts.map +1 -0
  89. package/dist/lanes/prd11.js +6 -0
  90. package/dist/lanes/prd11.js.map +1 -0
  91. package/dist/lanes/prd12.d.ts +6 -0
  92. package/dist/lanes/prd12.d.ts.map +1 -0
  93. package/dist/lanes/prd12.js +6 -0
  94. package/dist/lanes/prd12.js.map +1 -0
  95. package/dist/lanes/prd13.d.ts +6 -0
  96. package/dist/lanes/prd13.d.ts.map +1 -0
  97. package/dist/lanes/prd13.js +6 -0
  98. package/dist/lanes/prd13.js.map +1 -0
  99. package/dist/lanes/prd14.d.ts +6 -0
  100. package/dist/lanes/prd14.d.ts.map +1 -0
  101. package/dist/lanes/prd14.js +6 -0
  102. package/dist/lanes/prd14.js.map +1 -0
  103. package/dist/lanes/prd15.d.ts +6 -0
  104. package/dist/lanes/prd15.d.ts.map +1 -0
  105. package/dist/lanes/prd15.js +6 -0
  106. package/dist/lanes/prd15.js.map +1 -0
  107. package/dist/pose/BoneMask.d.ts +39 -0
  108. package/dist/pose/BoneMask.d.ts.map +1 -0
  109. package/dist/pose/BoneMask.js +160 -0
  110. package/dist/pose/BoneMask.js.map +1 -0
  111. package/dist/pose/CcdIkConstraint.d.ts +38 -0
  112. package/dist/pose/CcdIkConstraint.d.ts.map +1 -0
  113. package/dist/pose/CcdIkConstraint.js +198 -0
  114. package/dist/pose/CcdIkConstraint.js.map +1 -0
  115. package/dist/pose/CompiledClip.d.ts +48 -0
  116. package/dist/pose/CompiledClip.d.ts.map +1 -0
  117. package/dist/pose/CompiledClip.js +209 -0
  118. package/dist/pose/CompiledClip.js.map +1 -0
  119. package/dist/pose/LookAtConstraint.d.ts +48 -0
  120. package/dist/pose/LookAtConstraint.d.ts.map +1 -0
  121. package/dist/pose/LookAtConstraint.js +251 -0
  122. package/dist/pose/LookAtConstraint.js.map +1 -0
  123. package/dist/pose/MotionMetrics.d.ts +136 -0
  124. package/dist/pose/MotionMetrics.d.ts.map +1 -0
  125. package/dist/pose/MotionMetrics.js +253 -0
  126. package/dist/pose/MotionMetrics.js.map +1 -0
  127. package/dist/pose/PoseBuffer.d.ts +23 -0
  128. package/dist/pose/PoseBuffer.d.ts.map +1 -0
  129. package/dist/pose/PoseBuffer.js +48 -0
  130. package/dist/pose/PoseBuffer.js.map +1 -0
  131. package/dist/pose/PoseInertializer.d.ts +38 -0
  132. package/dist/pose/PoseInertializer.d.ts.map +1 -0
  133. package/dist/pose/PoseInertializer.js +208 -0
  134. package/dist/pose/PoseInertializer.js.map +1 -0
  135. package/dist/pose/PoseMixer.d.ts +256 -0
  136. package/dist/pose/PoseMixer.d.ts.map +1 -0
  137. package/dist/pose/PoseMixer.js +848 -0
  138. package/dist/pose/PoseMixer.js.map +1 -0
  139. package/dist/pose/Retarget.d.ts +77 -0
  140. package/dist/pose/Retarget.d.ts.map +1 -0
  141. package/dist/pose/Retarget.js +378 -0
  142. package/dist/pose/Retarget.js.map +1 -0
  143. package/dist/pose/RetargetCache.d.ts +21 -0
  144. package/dist/pose/RetargetCache.d.ts.map +1 -0
  145. package/dist/pose/RetargetCache.js +102 -0
  146. package/dist/pose/RetargetCache.js.map +1 -0
  147. package/dist/pose/RetargetWorker.d.ts +21 -0
  148. package/dist/pose/RetargetWorker.d.ts.map +1 -0
  149. package/dist/pose/RetargetWorker.js +56 -0
  150. package/dist/pose/RetargetWorker.js.map +1 -0
  151. package/dist/pose/SkeletonBinding.d.ts +55 -0
  152. package/dist/pose/SkeletonBinding.d.ts.map +1 -0
  153. package/dist/pose/SkeletonBinding.js +62 -0
  154. package/dist/pose/SkeletonBinding.js.map +1 -0
  155. package/dist/pose/blendKernels.d.ts +32 -0
  156. package/dist/pose/blendKernels.d.ts.map +1 -0
  157. package/dist/pose/blendKernels.js +101 -0
  158. package/dist/pose/blendKernels.js.map +1 -0
  159. package/dist/pose/makeClipAdditive.d.ts +22 -0
  160. package/dist/pose/makeClipAdditive.d.ts.map +1 -0
  161. package/dist/pose/makeClipAdditive.js +101 -0
  162. package/dist/pose/makeClipAdditive.js.map +1 -0
  163. package/dist/pose/poseMixerFlags.d.ts +18 -0
  164. package/dist/pose/poseMixerFlags.d.ts.map +1 -0
  165. package/dist/pose/poseMixerFlags.js +30 -0
  166. package/dist/pose/poseMixerFlags.js.map +1 -0
  167. package/dist/pose/quatFlat.d.ts +16 -0
  168. package/dist/pose/quatFlat.d.ts.map +1 -0
  169. package/dist/pose/quatFlat.js +88 -0
  170. package/dist/pose/quatFlat.js.map +1 -0
  171. package/dist/pose/retarget.worker.d.ts +25 -0
  172. package/dist/pose/retarget.worker.d.ts.map +1 -0
  173. package/dist/pose/retarget.worker.js +22 -0
  174. package/dist/pose/retarget.worker.js.map +1 -0
  175. package/package.json +14 -2
@@ -0,0 +1,102 @@
1
+ /**
2
+ * T3.8 (PRD-06 §7.2, R11) — IndexedDB retarget-bake cache. Entries are keyed by
3
+ * `(engineVersion, sourceHash, targetHash)` so an engine rollback ignores caches
4
+ * written by a newer build (the key namespace changes with the version). Store
5
+ * "bakes" holds `{key → Map<string, CompiledClip>}`; typed arrays survive
6
+ * structured-clone round-trips so clips are stored verbatim.
7
+ */
8
+ /** Bump when the bake semantics change; older namespaces are simply never read. */
9
+ export const AURA3D_RETARGET_ENGINE_VERSION = "prd06-retarget/v1";
10
+ const DB_NAME = "aura3d-retarget";
11
+ const STORE = "bakes";
12
+ function openDatabase() {
13
+ return new Promise((resolve, reject) => {
14
+ const request = indexedDB.open(DB_NAME, 1);
15
+ request.onupgradeneeded = () => {
16
+ const db = request.result;
17
+ if (!db.objectStoreNames.contains(STORE))
18
+ db.createObjectStore(STORE);
19
+ };
20
+ request.onsuccess = () => resolve(request.result);
21
+ request.onerror = () => reject(request.error ?? new Error("IndexedDB open failed"));
22
+ });
23
+ }
24
+ /** Cache-key component: skeleton joint names + rest pose + clip identity. */
25
+ export function retargetSkeletonHash(skeleton) {
26
+ const rest = skeleton.restPose;
27
+ return fnv1a(`${skeleton.boneCount}|${skeleton.jointNames.join(",")}|${skeleton.parentIndices.join(",")}` +
28
+ `|${floatDigest(rest.positions)}|${floatDigest(rest.rotations)}|${floatDigest(rest.scales)}`);
29
+ }
30
+ /** Cache-key component: clip names + durations + track count + key times. */
31
+ export function retargetClipsHash(clips) {
32
+ let acc = "";
33
+ for (const [name, clip] of clips) {
34
+ const tracks = clip.tracks.map((t) => `${t.target}:${t.valueType}:${t.keyframeCount}:${t.times[0] ?? 0}-${t.times[t.keyframeCount - 1] ?? 0}`);
35
+ acc += `${name}|${clip.duration}|${tracks.join(";")}\n`;
36
+ }
37
+ return fnv1a(acc);
38
+ }
39
+ export function retargetCacheKey(engineVersion, sourceHash, targetHash) {
40
+ return `${engineVersion}|${sourceHash}|${targetHash}`;
41
+ }
42
+ /** Read a cached bake, or `undefined` when absent/unavailable. */
43
+ export async function readRetargetCache(key) {
44
+ if (typeof indexedDB === "undefined")
45
+ return undefined;
46
+ try {
47
+ const db = await openDatabase();
48
+ try {
49
+ return await new Promise((resolve) => {
50
+ const tx = db.transaction(STORE, "readonly");
51
+ const request = tx.objectStore(STORE).get(key);
52
+ request.onsuccess = () => resolve(request.result);
53
+ request.onerror = () => resolve(undefined);
54
+ });
55
+ }
56
+ finally {
57
+ db.close();
58
+ }
59
+ }
60
+ catch {
61
+ return undefined;
62
+ }
63
+ }
64
+ /** Write a bake; fire-and-forget safe (storage failures are ignored). */
65
+ export async function writeRetargetCache(key, clips) {
66
+ if (typeof indexedDB === "undefined")
67
+ return;
68
+ try {
69
+ const db = await openDatabase();
70
+ try {
71
+ await new Promise((resolve) => {
72
+ const tx = db.transaction(STORE, "readwrite");
73
+ tx.objectStore(STORE).put(clips, key);
74
+ tx.oncomplete = () => resolve();
75
+ tx.onerror = () => resolve();
76
+ });
77
+ }
78
+ finally {
79
+ db.close();
80
+ }
81
+ }
82
+ catch {
83
+ /* cache is best-effort */
84
+ }
85
+ }
86
+ function floatDigest(values) {
87
+ // 64-bit-ish digest over rounded floats — cheap and stable across sessions.
88
+ let h = 0;
89
+ for (let i = 0; i < values.length; i += 1) {
90
+ h = (h * 33 + Math.round(values[i] * 4096)) | 0;
91
+ }
92
+ return h.toString(36);
93
+ }
94
+ function fnv1a(input) {
95
+ let hash = 0x811c9dc5;
96
+ for (let i = 0; i < input.length; i += 1) {
97
+ hash ^= input.charCodeAt(i);
98
+ hash = Math.imul(hash, 0x01000193);
99
+ }
100
+ return (hash >>> 0).toString(36);
101
+ }
102
+ //# sourceMappingURL=RetargetCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RetargetCache.js","sourceRoot":"","sources":["../../../../../packages/animation/src/pose/RetargetCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * T3.8 (PRD-06 §7.2) — worker-side retarget baking plumbing. `createRetargetWorker`
3
+ * returns a module `Worker` bound to `retarget.worker.js` (the emitted JS;
4
+ * bundlers resolve the `new URL(..., import.meta.url)` form); Node/test
5
+ * environments get `undefined` and callers fall back to an in-process bake.
6
+ */
7
+ import type { CompiledClip } from "./CompiledClip.js";
8
+ import type { SkeletonBinding } from "./SkeletonBinding.js";
9
+ import type { BakeRetargetedClipsOptions } from "./Retarget.js";
10
+ export declare function createRetargetWorker(): Worker | undefined;
11
+ /**
12
+ * Run one bake on `worker`. The worker is single-use: it is terminated after
13
+ * the response so a caller-side leak can't accumulate bake threads.
14
+ */
15
+ export declare function bakeClipsInWorker(worker: Worker, request: {
16
+ readonly sourceSkeleton: SkeletonBinding;
17
+ readonly targetSkeleton: SkeletonBinding;
18
+ readonly clips: ReadonlyMap<string, CompiledClip>;
19
+ readonly options?: BakeRetargetedClipsOptions;
20
+ }): Promise<ReadonlyMap<string, CompiledClip>>;
21
+ //# sourceMappingURL=RetargetWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RetargetWorker.d.ts","sourceRoot":"","sources":["../../../../../packages/animation/src/pose/RetargetWorker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAGhE,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAOzD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IACP,QAAQ,CAAC,cAAc,EAAE,eAAe,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,eAAe,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAClD,QAAQ,CAAC,OAAO,CAAC,EAAE,0BAA0B,CAAC;CAC/C,GACA,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAgC5C"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * T3.8 (PRD-06 §7.2) — worker-side retarget baking plumbing. `createRetargetWorker`
3
+ * returns a module `Worker` bound to `retarget.worker.js` (the emitted JS;
4
+ * bundlers resolve the `new URL(..., import.meta.url)` form); Node/test
5
+ * environments get `undefined` and callers fall back to an in-process bake.
6
+ */
7
+ export function createRetargetWorker() {
8
+ if (typeof Worker === "undefined")
9
+ return undefined;
10
+ try {
11
+ return new Worker(new URL("./retarget.worker.js", import.meta.url), { type: "module" });
12
+ }
13
+ catch {
14
+ return undefined;
15
+ }
16
+ }
17
+ /**
18
+ * Run one bake on `worker`. The worker is single-use: it is terminated after
19
+ * the response so a caller-side leak can't accumulate bake threads.
20
+ */
21
+ export function bakeClipsInWorker(worker, request) {
22
+ return new Promise((resolve, reject) => {
23
+ const requestId = Math.floor(Math.random() * 0xffffffff);
24
+ const done = (fn) => {
25
+ worker.onmessage = null;
26
+ worker.onerror = null;
27
+ worker.terminate();
28
+ fn();
29
+ };
30
+ worker.onmessage = (event) => {
31
+ const response = event.data;
32
+ if (response.requestId !== requestId)
33
+ return;
34
+ const clips = response.clips;
35
+ if (response.kind === "baked" && clips !== undefined) {
36
+ done(() => resolve(clips));
37
+ }
38
+ else {
39
+ done(() => reject(new Error(response.error ?? "retarget worker bake failed")));
40
+ }
41
+ };
42
+ worker.onerror = (event) => {
43
+ done(() => reject(new Error(event.message || "retarget worker error")));
44
+ };
45
+ const request_ = {
46
+ kind: "bake",
47
+ requestId,
48
+ sourceSkeleton: request.sourceSkeleton,
49
+ targetSkeleton: request.targetSkeleton,
50
+ clips: request.clips,
51
+ ...(request.options !== undefined ? { options: request.options } : {})
52
+ };
53
+ worker.postMessage(request_);
54
+ });
55
+ }
56
+ //# sourceMappingURL=RetargetWorker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RetargetWorker.js","sourceRoot":"","sources":["../../../../../packages/animation/src/pose/RetargetWorker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,UAAU,oBAAoB;IAClC,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,CAAC;QACH,OAAO,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,OAKC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,CAAC,EAAc,EAAE,EAAE;YAC9B,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;YACxB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,MAAM,CAAC,SAAS,EAAE,CAAC;YACnB,EAAE,EAAE,CAAC;QACP,CAAC,CAAC;QACF,MAAM,CAAC,SAAS,GAAG,CAAC,KAA2C,EAAE,EAAE;YACjE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;YAC5B,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS;gBAAE,OAAO;YAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC7B,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACrD,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,6BAA6B,CAAC,CAAC,CAAC,CAAC;YACjF,CAAC;QACH,CAAC,CAAC;QACF,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;YACzB,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,uBAAuB,CAAC,CAAC,CAAC,CAAC;QAC1E,CAAC,CAAC;QACF,MAAM,QAAQ,GAA0B;YACtC,IAAI,EAAE,MAAM;YACZ,SAAS;YACT,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvE,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * PRD-06 T1.1 — binds a glTF skin to the live node list by **node index**.
3
+ *
4
+ * `jointNames` are debug/diagnostic only: rigs with duplicate bone names
5
+ * (Mixamo `Spine` reused for a twist joint, symmetric helpers, generated
6
+ * rigs) bind every joint correctly because resolution goes through the
7
+ * skin's `joints[]` node indices, never a name map.
8
+ *
9
+ * The binding captures the **rest pose**: the nodes' local TRS at bind time.
10
+ * The PoseMixer starts each evaluation from it (§6.3), which is what
11
+ * three r185 `PropertyBinding` treats as "original state".
12
+ */
13
+ import type { Quat, Vec3 } from "../Keyframe.js";
14
+ import { type PoseBuffer } from "./PoseBuffer.js";
15
+ /** Structural node view the binding needs — keeps this module scene-free. */
16
+ export interface SkeletonNodeRef {
17
+ readonly name: string;
18
+ /** Local TRS at bind time (glTF node local transform). */
19
+ readonly position: Vec3;
20
+ readonly rotation: Quat;
21
+ readonly scale: Vec3;
22
+ }
23
+ export interface BindSkeletonOptions {
24
+ /** glTF skin `joints[]` — node indices in skin order. */
25
+ readonly joints: readonly number[];
26
+ /** Optional node-index → node lookup. Supply it for every skeleton bind. */
27
+ readonly resolveNode: (nodeIndex: number) => SkeletonNodeRef | undefined;
28
+ /** Diagnostic names, in the same order as `joints` (glTF `jointNames`). */
29
+ readonly jointNames?: readonly string[];
30
+ /**
31
+ * Parent **joint** index per joint (-1 for skin roots), from
32
+ * `skin.skeleton.bones[i].parentIndex`. Needed by `BoneMask`
33
+ * `{bone, descendants}` selectors.
34
+ */
35
+ readonly parentIndices?: readonly number[];
36
+ }
37
+ export interface SkeletonBinding {
38
+ readonly boneCount: number;
39
+ /** Resolved bones in skin joint order. */
40
+ readonly joints: readonly SkeletonNodeRef[];
41
+ /** Node index (`joints[i]` input) per joint — the identity that resolved it. */
42
+ readonly jointNodeIndices: readonly number[];
43
+ /** Diagnostic names, aligned with `joints`. */
44
+ readonly jointNames: readonly string[];
45
+ /** Parent joint index per joint (-1 when unknown or a skin root). */
46
+ readonly parentIndices: readonly number[];
47
+ /** Name → joint indices; a duplicated name maps to *all* its slots. */
48
+ readonly jointIndicesByName: ReadonlyMap<string, readonly number[]>;
49
+ /** Local TRS at bind time; the mixer's evaluation base. */
50
+ readonly restPose: PoseBuffer;
51
+ /** Node indices named in `joints` that `resolveNode` could not find. */
52
+ readonly missingNodeIndices: readonly number[];
53
+ }
54
+ export declare function bindSkeleton(options: BindSkeletonOptions): SkeletonBinding;
55
+ //# sourceMappingURL=SkeletonBinding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkeletonBinding.d.ts","sourceRoot":"","sources":["../../../../../packages/animation/src/pose/SkeletonBinding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEpE,6EAA6E;AAC7E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,4EAA4E;IAC5E,QAAQ,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,eAAe,GAAG,SAAS,CAAC;IACzE,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IAC5C,gFAAgF;IAChF,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,+CAA+C;IAC/C,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,qEAAqE;IACrE,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,uEAAuE;IACvE,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IACpE,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,wEAAwE;IACxE,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;CAChD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,eAAe,CA8C1E"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * PRD-06 T1.1 — binds a glTF skin to the live node list by **node index**.
3
+ *
4
+ * `jointNames` are debug/diagnostic only: rigs with duplicate bone names
5
+ * (Mixamo `Spine` reused for a twist joint, symmetric helpers, generated
6
+ * rigs) bind every joint correctly because resolution goes through the
7
+ * skin's `joints[]` node indices, never a name map.
8
+ *
9
+ * The binding captures the **rest pose**: the nodes' local TRS at bind time.
10
+ * The PoseMixer starts each evaluation from it (§6.3), which is what
11
+ * three r185 `PropertyBinding` treats as "original state".
12
+ */
13
+ import { createPoseBuffer } from "./PoseBuffer.js";
14
+ export function bindSkeleton(options) {
15
+ const { joints, resolveNode, jointNames, parentIndices } = options;
16
+ const boneCount = joints.length;
17
+ const nodes = [];
18
+ const names = [];
19
+ const missing = [];
20
+ const indicesByName = new Map();
21
+ const restPose = createPoseBuffer(boneCount);
22
+ for (let index = 0; index < boneCount; index += 1) {
23
+ const nodeIndex = joints[index];
24
+ const node = resolveNode(nodeIndex);
25
+ const name = node?.name ?? jointNames?.[index] ?? `joint${nodeIndex}`;
26
+ nodes.push(node ?? { name, position: [0, 0, 0], rotation: [0, 0, 0, 1], scale: [1, 1, 1] });
27
+ names.push(name);
28
+ if (!node) {
29
+ missing.push(nodeIndex);
30
+ }
31
+ else {
32
+ restPose.positions[index * 3] = node.position[0];
33
+ restPose.positions[index * 3 + 1] = node.position[1];
34
+ restPose.positions[index * 3 + 2] = node.position[2];
35
+ restPose.rotations[index * 4] = node.rotation[0];
36
+ restPose.rotations[index * 4 + 1] = node.rotation[1];
37
+ restPose.rotations[index * 4 + 2] = node.rotation[2];
38
+ restPose.rotations[index * 4 + 3] = node.rotation[3];
39
+ restPose.scales[index * 3] = node.scale[0];
40
+ restPose.scales[index * 3 + 1] = node.scale[1];
41
+ restPose.scales[index * 3 + 2] = node.scale[2];
42
+ }
43
+ const bucket = indicesByName.get(name);
44
+ if (bucket)
45
+ bucket.push(index);
46
+ else
47
+ indicesByName.set(name, [index]);
48
+ }
49
+ return {
50
+ boneCount,
51
+ joints: nodes,
52
+ jointNodeIndices: [...joints],
53
+ jointNames: names,
54
+ parentIndices: parentIndices
55
+ ? [...parentIndices]
56
+ : new Array(boneCount).fill(-1),
57
+ jointIndicesByName: indicesByName,
58
+ restPose,
59
+ missingNodeIndices: missing
60
+ };
61
+ }
62
+ //# sourceMappingURL=SkeletonBinding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkeletonBinding.js","sourceRoot":"","sources":["../../../../../packages/animation/src/pose/SkeletonBinding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * T1.11 (PRD-06 §10) — value-level r185 blend kernels, the `AnimationValue`
3
+ * twins of {@link PoseMixer}'s flat-buffer math (`accumulate` incremental mix,
4
+ * `accumulateAdditiveAccu`, `applyAdditiveAccumulators`). The legacy
5
+ * `AnimationMixer` facade routes `blendBase`/`additiveContribution` through
6
+ * these under `A3D_QR_ANIMATION_POSE_MIXER` so the pose implementation is the
7
+ * single source of the math; with the flag off the facade keeps its own
8
+ * (identical) bodies until flag removal.
9
+ */
10
+ import { type AnimationValue } from "../Keyframe.js";
11
+ export type PoseBlendChannel = "scalar" | "vector3" | "quaternion" | "number-array";
12
+ export interface PoseBlendAccumulatorLike {
13
+ value: AnimationValue;
14
+ weight: number;
15
+ }
16
+ /** r185 incremental base accumulate: `acc = mix(acc, v, w/(Σ + w))`. */
17
+ export declare function blendBaseValue(current: PoseBlendAccumulatorLike, channel: string, value: AnimationValue, weight: number): void;
18
+ /**
19
+ * r185 additive contribution: vectors/scalars `v * w`; quaternions
20
+ * `slerp(identity, normalize(v), w)` — a single step of the chained
21
+ * `slerp(acc, acc·delta, w)` in `PoseMixer.accumulateAdditiveAccu`.
22
+ */
23
+ export declare function additiveContributionValue(channel: string, value: AnimationValue, weight: number): AnimationValue;
24
+ /**
25
+ * r185 additive apply: `out = base + delta` for vectors/scalars;
26
+ * `out = normalize(base · delta)` for quaternions (weights already folded into
27
+ * `delta` by {@link additiveContributionValue}).
28
+ */
29
+ export declare function applyAdditiveValue(channel: string, base: AnimationValue, delta: AnimationValue): AnimationValue;
30
+ /** Fold a new additive contribution into a running accumulator. */
31
+ export declare function combineAdditiveValue(channel: string, current: AnimationValue, value: AnimationValue, weight: number): AnimationValue;
32
+ //# sourceMappingURL=blendKernels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blendKernels.d.ts","sourceRoot":"","sources":["../../../../../packages/animation/src/pose/blendKernels.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAiD,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEpG,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,GAAG,cAAc,CAAC;AAEpF,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAC5B,OAAO,EAAE,wBAAwB,EACjC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,MAAM,GACb,IAAI,CAsBN;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,CAehH;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,GAAG,cAAc,CAqB/G;AAED,mEAAmE;AACnE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,CAEpI"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * T1.11 (PRD-06 §10) — value-level r185 blend kernels, the `AnimationValue`
3
+ * twins of {@link PoseMixer}'s flat-buffer math (`accumulate` incremental mix,
4
+ * `accumulateAdditiveAccu`, `applyAdditiveAccumulators`). The legacy
5
+ * `AnimationMixer` facade routes `blendBase`/`additiveContribution` through
6
+ * these under `A3D_QR_ANIMATION_POSE_MIXER` so the pose implementation is the
7
+ * single source of the math; with the flag off the facade keeps its own
8
+ * (identical) bodies until flag removal.
9
+ */
10
+ import { cloneAnimationValue, normalizeQuat, slerpQuat } from "../Keyframe.js";
11
+ /** r185 incremental base accumulate: `acc = mix(acc, v, w/(Σ + w))`. */
12
+ export function blendBaseValue(current, channel, value, weight) {
13
+ const total = current.weight + weight;
14
+ const t = weight / total;
15
+ if (channel === "scalar") {
16
+ current.value = current.value + (value - current.value) * t;
17
+ }
18
+ else if (channel === "vector3") {
19
+ const a = current.value;
20
+ const b = value;
21
+ current.value = [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, a[2] + (b[2] - a[2]) * t];
22
+ }
23
+ else if (channel === "quaternion") {
24
+ current.value = slerpQuat(current.value, value, t);
25
+ }
26
+ else if (channel === "number-array") {
27
+ const a = current.value;
28
+ const b = value;
29
+ if (a.length !== b.length) {
30
+ throw new Error("Cannot blend number-array animation values with different lengths.");
31
+ }
32
+ current.value = a.map((component, index) => component + (b[index] - component) * t);
33
+ }
34
+ else {
35
+ current.value = cloneAnimationValue(value);
36
+ }
37
+ current.weight = total;
38
+ }
39
+ /**
40
+ * r185 additive contribution: vectors/scalars `v * w`; quaternions
41
+ * `slerp(identity, normalize(v), w)` — a single step of the chained
42
+ * `slerp(acc, acc·delta, w)` in `PoseMixer.accumulateAdditiveAccu`.
43
+ */
44
+ export function additiveContributionValue(channel, value, weight) {
45
+ if (channel === "scalar") {
46
+ return value * weight;
47
+ }
48
+ if (channel === "vector3") {
49
+ const vector = value;
50
+ return [vector[0] * weight, vector[1] * weight, vector[2] * weight];
51
+ }
52
+ if (channel === "number-array") {
53
+ return value.map((component) => component * weight);
54
+ }
55
+ if (channel === "quaternion") {
56
+ return slerpQuat([0, 0, 0, 1], normalizeQuat(value), weight);
57
+ }
58
+ throw new Error("Additive animation layers require numeric, vector, quaternion, or number-array tracks.");
59
+ }
60
+ /**
61
+ * r185 additive apply: `out = base + delta` for vectors/scalars;
62
+ * `out = normalize(base · delta)` for quaternions (weights already folded into
63
+ * `delta` by {@link additiveContributionValue}).
64
+ */
65
+ export function applyAdditiveValue(channel, base, delta) {
66
+ if (channel === "scalar") {
67
+ return base + delta;
68
+ }
69
+ if (channel === "vector3") {
70
+ const a = base;
71
+ const b = delta;
72
+ return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];
73
+ }
74
+ if (channel === "number-array") {
75
+ const a = base;
76
+ const b = delta;
77
+ if (a.length !== b.length) {
78
+ throw new Error("Cannot add number-array animation values with different lengths.");
79
+ }
80
+ return a.map((component, index) => component + b[index]);
81
+ }
82
+ if (channel === "quaternion") {
83
+ return normalizeQuat(multiplyQuatFlat(base, delta));
84
+ }
85
+ throw new Error("Additive animation layers require numeric, vector, quaternion, or number-array tracks.");
86
+ }
87
+ /** Fold a new additive contribution into a running accumulator. */
88
+ export function combineAdditiveValue(channel, current, value, weight) {
89
+ return applyAdditiveValue(channel, current, additiveContributionValue(channel, value, weight));
90
+ }
91
+ function multiplyQuatFlat(a, b) {
92
+ const [ax, ay, az, aw] = a;
93
+ const [bx, by, bz, bw] = b;
94
+ return [
95
+ aw * bx + ax * bw + ay * bz - az * by,
96
+ aw * by - ax * bz + ay * bw + az * bx,
97
+ aw * bz + ax * by - ay * bx + az * bw,
98
+ aw * bw - ax * bx - ay * by - az * bz
99
+ ];
100
+ }
101
+ //# sourceMappingURL=blendKernels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blendKernels.js","sourceRoot":"","sources":["../../../../../packages/animation/src/pose/blendKernels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * PRD-06 T1.4 — convert a clip to additive form by subtracting a reference
3
+ * pose per track, matching three r185 `AnimationUtils.makeClipAdditive`:
4
+ *
5
+ * - quaternion tracks: `delta = normalize(ref⁻¹ · sample)`
6
+ * - translation **and scale** tracks: `delta = sample − ref`
7
+ * - scalar/number-array tracks: `delta = sample − ref`
8
+ * - boolean/string tracks: passed through (no additive semantics)
9
+ *
10
+ * The reference is frame 0 of the same clip by default, or an explicit
11
+ * `{ clip, time }` pair (e.g. a bind clip). Tracks absent from the reference
12
+ * clip fall back to their own first keyframe, as three does.
13
+ */
14
+ import { AnimationClip } from "../AnimationClip.js";
15
+ export type AdditiveReference = number | {
16
+ readonly clip: AnimationClip;
17
+ readonly time?: number;
18
+ };
19
+ /** Whether a clip was produced by `makeClipAdditive` (three r185 `clip.blendMode`). */
20
+ export declare function isClipAdditive(clip: AnimationClip): boolean;
21
+ export declare function makeClipAdditive(clip: AnimationClip, reference?: AdditiveReference): AnimationClip;
22
+ //# sourceMappingURL=makeClipAdditive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeClipAdditive.d.ts","sourceRoot":"","sources":["../../../../../packages/animation/src/pose/makeClipAdditive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpD,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAIlG,uFAAuF;AACvF,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAE3D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,iBAAiB,GAAG,aAAa,CA+BlG"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * PRD-06 T1.4 — convert a clip to additive form by subtracting a reference
3
+ * pose per track, matching three r185 `AnimationUtils.makeClipAdditive`:
4
+ *
5
+ * - quaternion tracks: `delta = normalize(ref⁻¹ · sample)`
6
+ * - translation **and scale** tracks: `delta = sample − ref`
7
+ * - scalar/number-array tracks: `delta = sample − ref`
8
+ * - boolean/string tracks: passed through (no additive semantics)
9
+ *
10
+ * The reference is frame 0 of the same clip by default, or an explicit
11
+ * `{ clip, time }` pair (e.g. a bind clip). Tracks absent from the reference
12
+ * clip fall back to their own first keyframe, as three does.
13
+ */
14
+ import { AnimationClip } from "../AnimationClip.js";
15
+ import { AnimationTrack } from "../AnimationTrack.js";
16
+ const additiveClips = new WeakSet();
17
+ /** Whether a clip was produced by `makeClipAdditive` (three r185 `clip.blendMode`). */
18
+ export function isClipAdditive(clip) {
19
+ return additiveClips.has(clip);
20
+ }
21
+ export function makeClipAdditive(clip, reference) {
22
+ const referenceClip = typeof reference === "object" && reference !== null ? reference.clip : clip;
23
+ const referenceTime = typeof reference === "number"
24
+ ? reference
25
+ : typeof reference === "object" && reference !== null && reference.time !== undefined
26
+ ? reference.time
27
+ : 0;
28
+ const referenceTracks = new Map();
29
+ for (const track of referenceClip.tracks)
30
+ referenceTracks.set(track.target, track);
31
+ const tracks = clip.tracks.map((track) => {
32
+ const referenceTrack = referenceTracks.get(track.target);
33
+ const referenceValue = referenceTrack
34
+ ? referenceTrack.sample(referenceTime)
35
+ : track.keyframes[0].value;
36
+ const keyframes = track.keyframes.map((keyframe) => ({
37
+ ...keyframe,
38
+ value: subtractValue(track.valueType, keyframe.value, referenceValue)
39
+ }));
40
+ return new AnimationTrack({ target: track.target, valueType: track.valueType, keyframes });
41
+ });
42
+ const additive = new AnimationClip({
43
+ name: `${clip.name}.additive`,
44
+ duration: clip.duration,
45
+ tracks,
46
+ events: clip.events
47
+ });
48
+ additiveClips.add(additive);
49
+ return additive;
50
+ }
51
+ function subtractValue(valueType, value, reference) {
52
+ switch (valueType) {
53
+ case "quaternion": {
54
+ const r = reference;
55
+ const q = value;
56
+ const inv = quatInvertNormalized(r);
57
+ return quatNormalize(quatMultiply(inv, q));
58
+ }
59
+ case "vector3": {
60
+ const r = reference;
61
+ const v = value;
62
+ return [v[0] - r[0], v[1] - r[1], v[2] - r[2]];
63
+ }
64
+ case "scalar":
65
+ return value - reference;
66
+ case "number-array": {
67
+ const r = reference;
68
+ const v = value;
69
+ return v.map((component, index) => component - (r[index] ?? 0));
70
+ }
71
+ case "boolean":
72
+ case "string":
73
+ return value;
74
+ default:
75
+ return value;
76
+ }
77
+ }
78
+ function quatInvertNormalized(q) {
79
+ // Inverse of a unit quaternion is its conjugate; normalize first so
80
+ // non-unit inputs still produce a true inverse (as three does not need to).
81
+ const length = Math.hypot(q[0], q[1], q[2], q[3]);
82
+ if (length <= 1e-9)
83
+ return [0, 0, 0, 1];
84
+ const invLengthSq = 1 / (length * length);
85
+ return [-q[0] * invLengthSq, -q[1] * invLengthSq, -q[2] * invLengthSq, q[3] * invLengthSq];
86
+ }
87
+ function quatMultiply(a, b) {
88
+ return [
89
+ a[3] * b[0] + a[0] * b[3] + a[1] * b[2] - a[2] * b[1],
90
+ a[3] * b[1] - a[0] * b[2] + a[1] * b[3] + a[2] * b[0],
91
+ a[3] * b[2] + a[0] * b[1] - a[1] * b[0] + a[2] * b[3],
92
+ a[3] * b[3] - a[0] * b[0] - a[1] * b[1] - a[2] * b[2]
93
+ ];
94
+ }
95
+ function quatNormalize(q) {
96
+ const length = Math.hypot(q[0], q[1], q[2], q[3]);
97
+ if (length <= 1e-9)
98
+ return [0, 0, 0, 1];
99
+ return [q[0] / length, q[1] / length, q[2] / length, q[3] / length];
100
+ }
101
+ //# sourceMappingURL=makeClipAdditive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeClipAdditive.js","sourceRoot":"","sources":["../../../../../packages/animation/src/pose/makeClipAdditive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * T1.11 (PRD-06 §10) — the `A3D_QR_ANIMATION_POSE_MIXER` read for
3
+ * `@aura3d/animation`. The package cannot import the engine's flag machinery
4
+ * (dependency direction is engine → animation), so a provider seam is
5
+ * installed by the app side (lane barrel `packages/engine/src/lanes/prd06.ts`
6
+ * binds `qrAnimationFlags().on("A3D_QR_ANIMATION_POSE_MIXER")`). Without a
7
+ * provider the env fallback reads `A3D_QR_ANIMATION_POSE_MIXER` directly.
8
+ * Multi-word sub-flags cannot appear in the `A3D_QR=` list (the resolver's
9
+ * short-name form is `lane.sub`, two parts), so the env var and the
10
+ * `qualityRebuild.flags` record are the only sources — matching
11
+ * `applyPerFlagEnv` semantics.
12
+ *
13
+ * Sub-flag semantics (§10): OFF means the legacy blend math runs unchanged —
14
+ * the flag being merely unset is not an implicit opt-in.
15
+ */
16
+ export declare function setPoseMixerBlendFlagProvider(provider: (() => boolean) | undefined): void;
17
+ export declare function poseMixerBlendEnabled(): boolean;
18
+ //# sourceMappingURL=poseMixerFlags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poseMixerFlags.d.ts","sourceRoot":"","sources":["../../../../../packages/animation/src/pose/poseMixerFlags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,CAEzF;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAS/C"}