@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,198 @@
1
+ /**
2
+ * T3.4 (PRD-06 §7.1/7.2) — `CcdIkConstraint`: cyclic coordinate descent over a
3
+ * named joint chain — each iteration sweeps tip-to-root rotating every joint so
4
+ * the tip's direction toward the target maximally closes. Cone limits per bone
5
+ * (`coneLimitDeg`), hard cap `iterations ≤ 8`, early-out at `tolerance`
6
+ * (default 1 mm).
7
+ *
8
+ * Pose-space like the rest of the lane: the target arrives world-space and is
9
+ * transformed into model space by `invertTRS(modelMatrix)` before the sweep.
10
+ */
11
+ function jointIndex(skeleton, name) {
12
+ const indices = skeleton.jointIndicesByName.get(name);
13
+ if (!indices || indices.length === 0)
14
+ throw new Error(`CcdIkConstraint: unknown bone "${name}".`);
15
+ return indices[0];
16
+ }
17
+ function frames(pose, skeleton) {
18
+ const cache = new Map();
19
+ const resolve = (joint) => {
20
+ const hit = cache.get(joint);
21
+ if (hit)
22
+ return hit;
23
+ const pos = [pose.positions[joint * 3], pose.positions[joint * 3 + 1], pose.positions[joint * 3 + 2]];
24
+ const rot = [pose.rotations[joint * 4], pose.rotations[joint * 4 + 1], pose.rotations[joint * 4 + 2], pose.rotations[joint * 4 + 3]];
25
+ const scl = [pose.scales[joint * 3], pose.scales[joint * 3 + 1], pose.scales[joint * 3 + 2]];
26
+ const parent = skeleton.parentIndices[joint] ?? -1;
27
+ if (parent < 0 || parent >= skeleton.boneCount || parent === joint) {
28
+ const f = { position: pos, rotation: rot, scale: scl };
29
+ cache.set(joint, f);
30
+ return f;
31
+ }
32
+ const pf = resolve(parent);
33
+ const scaled = [pos[0] * pf.scale[0], pos[1] * pf.scale[1], pos[2] * pf.scale[2]];
34
+ const rotated = rotateVec3(pf.rotation, scaled);
35
+ const f = {
36
+ position: [pf.position[0] + rotated[0], pf.position[1] + rotated[1], pf.position[2] + rotated[2]],
37
+ rotation: multiplyQuat(pf.rotation, rot),
38
+ scale: [pf.scale[0] * scl[0], pf.scale[1] * scl[1], pf.scale[2] * scl[2]]
39
+ };
40
+ cache.set(joint, f);
41
+ return f;
42
+ };
43
+ const out = [];
44
+ for (let i = 0; i < skeleton.boneCount; i += 1)
45
+ out.push(resolve(i));
46
+ return out;
47
+ }
48
+ function rotateVec3(q, v) {
49
+ const [x, y, z, w] = q;
50
+ const tx = 2 * (y * v[2] - z * v[1]);
51
+ const ty = 2 * (z * v[0] - x * v[2]);
52
+ const tz = 2 * (x * v[1] - y * v[0]);
53
+ return [v[0] + w * tx + (y * tz - z * ty), v[1] + w * ty + (z * tx - x * tz), v[2] + w * tz + (x * ty - y * tx)];
54
+ }
55
+ function multiplyQuat(a, b) {
56
+ const [ax, ay, az, aw] = a;
57
+ const [bx, by, bz, bw] = b;
58
+ return [
59
+ ax * bw + aw * bx + ay * bz - az * by,
60
+ ay * bw + aw * by + az * bx - ax * bz,
61
+ az * bw + aw * bz + ax * by - ay * bx,
62
+ aw * bw - ax * bx - ay * by - az * bz
63
+ ];
64
+ }
65
+ function axisAngle(axis, radians) {
66
+ const half = radians / 2;
67
+ const s = Math.sin(half);
68
+ return [axis[0] * s, axis[1] * s, axis[2] * s, Math.cos(half)];
69
+ }
70
+ function normalize(v) {
71
+ const l = Math.hypot(v[0], v[1], v[2]);
72
+ return l <= 1e-9 ? [0, 0, 0] : [v[0] / l, v[1] / l, v[2] / l];
73
+ }
74
+ function invertModelTRS(matrix) {
75
+ const sx = Math.hypot(matrix[0], matrix[1], matrix[2]);
76
+ const sy = Math.hypot(matrix[4], matrix[5], matrix[6]);
77
+ const sz = Math.hypot(matrix[8], matrix[9], matrix[10]);
78
+ const m00 = matrix[0] / (sx || 1), m10 = matrix[1] / (sx || 1), m20 = matrix[2] / (sx || 1);
79
+ const m01 = matrix[4] / (sy || 1), m11 = matrix[5] / (sy || 1), m21 = matrix[6] / (sy || 1);
80
+ const m02 = matrix[8] / (sz || 1), m12 = matrix[9] / (sz || 1), m22 = matrix[10] / (sz || 1);
81
+ const trace = m00 + m11 + m22;
82
+ let q;
83
+ if (trace > 0) {
84
+ const s = 0.5 / Math.sqrt(trace + 1);
85
+ q = [(m21 - m12) * s, (m02 - m20) * s, (m10 - m01) * s, 0.25 / s];
86
+ }
87
+ else if (m00 > m11 && m00 > m22) {
88
+ const s = 2 * Math.sqrt(1 + m00 - m11 - m22);
89
+ q = [0.25 * s, (m01 + m10) / s, (m02 + m20) / s, (m21 - m12) / s];
90
+ }
91
+ else if (m11 > m22) {
92
+ const s = 2 * Math.sqrt(1 + m11 - m00 - m22);
93
+ q = [(m01 + m10) / s, 0.25 * s, (m12 + m21) / s, (m02 - m20) / s];
94
+ }
95
+ else {
96
+ const s = 2 * Math.sqrt(1 + m22 - m00 - m11);
97
+ q = [(m02 + m20) / s, (m12 + m21) / s, 0.25 * s, (m10 - m01) / s];
98
+ }
99
+ const l = Math.hypot(q[0], q[1], q[2], q[3]) || 1;
100
+ return { rotation: [q[0] / l, q[1] / l, q[2] / l, q[3] / l], scale: [sx, sy, sz], position: [matrix[12], matrix[13], matrix[14]] };
101
+ }
102
+ /**
103
+ * Evaluate a CCD chain: sweeps `spec.chain` tip→root up to `iterations` times,
104
+ * rotating each joint by the minimal arc that pulls the tip toward `target`,
105
+ * cone-capped per bone. Writes local rotations back into `pose`.
106
+ */
107
+ export function solveCcdIk(pose, skeleton, modelMatrix, spec, target) {
108
+ const weight = spec.weight ?? 1;
109
+ if (weight <= 0 || spec.chain.length === 0)
110
+ return { iterations: 0, tipError: Infinity, reached: false };
111
+ const maxIterations = Math.min(8, spec.iterations ?? 8);
112
+ const tolerance = spec.tolerance ?? 0.001;
113
+ const invModel = invertModelTRS(modelMatrix);
114
+ const shifted = [target[0] - invModel.position[0], target[1] - invModel.position[1], target[2] - invModel.position[2]];
115
+ const invRot = [-invModel.rotation[0], -invModel.rotation[1], -invModel.rotation[2], invModel.rotation[3]];
116
+ const scaledShift = rotateVec3(invRot, shifted);
117
+ const targetLocal = [
118
+ scaledShift[0] / (invModel.scale[0] || 1),
119
+ scaledShift[1] / (invModel.scale[1] || 1),
120
+ scaledShift[2] / (invModel.scale[2] || 1)
121
+ ];
122
+ const chainIndices = spec.chain.map((name) => jointIndex(skeleton, name));
123
+ const tipIndex = chainIndices[chainIndices.length - 1];
124
+ let iterations = 0;
125
+ let tipError = Infinity;
126
+ for (let iter = 0; iter < maxIterations; iter += 1) {
127
+ const current = frames(pose, skeleton); // refresh after each write below
128
+ tipError = Math.hypot(current[tipIndex].position[0] - targetLocal[0], current[tipIndex].position[1] - targetLocal[1], current[tipIndex].position[2] - targetLocal[2]);
129
+ if (tipError <= tolerance)
130
+ break;
131
+ iterations += 1;
132
+ // Sweep tip→root (chain is ordered root→tip, so walk backwards).
133
+ for (let i = chainIndices.length - 1; i >= 0; i -= 1) {
134
+ const joint = chainIndices[i];
135
+ const snapshot = frames(pose, skeleton);
136
+ const jointPos = snapshot[joint].position;
137
+ const tipPos = snapshot[tipIndex].position;
138
+ const toTip = normalize([tipPos[0] - jointPos[0], tipPos[1] - jointPos[1], tipPos[2] - jointPos[2]]);
139
+ const toTarget = normalize([targetLocal[0] - jointPos[0], targetLocal[1] - jointPos[1], targetLocal[2] - jointPos[2]]);
140
+ if (Math.hypot(toTip[0], toTip[1], toTip[2]) <= 1e-9 || Math.hypot(toTarget[0], toTarget[1], toTarget[2]) <= 1e-9)
141
+ continue;
142
+ const cross = [
143
+ toTip[1] * toTarget[2] - toTip[2] * toTarget[1],
144
+ toTip[2] * toTarget[0] - toTip[0] * toTarget[2],
145
+ toTip[0] * toTarget[1] - toTip[1] * toTarget[0]
146
+ ];
147
+ const crossLen = Math.hypot(cross[0], cross[1], cross[2]);
148
+ const dot = Math.max(-1, Math.min(1, toTip[0] * toTarget[0] + toTip[1] * toTarget[1] + toTip[2] * toTarget[2]));
149
+ let angle = Math.atan2(crossLen, dot);
150
+ const coneLimit = spec.coneLimitDeg?.[spec.chain[i]];
151
+ if (coneLimit !== undefined) {
152
+ angle = Math.min(angle, (coneLimit * Math.PI) / 180);
153
+ }
154
+ if (angle <= 1e-7 || crossLen <= 1e-9)
155
+ continue;
156
+ const axis = [cross[0] / crossLen, cross[1] / crossLen, cross[2] / crossLen];
157
+ const rot = axisAngle(axis, angle);
158
+ const worldNew = multiplyQuat(rot, snapshot[joint].rotation);
159
+ const parent = skeleton.parentIndices[joint] ?? -1;
160
+ const parentRot = parent >= 0 ? snapshot[parent].rotation : [0, 0, 0, 1];
161
+ const inv = [-parentRot[0], -parentRot[1], -parentRot[2], parentRot[3]];
162
+ const local = multiplyQuat(inv, worldNew);
163
+ const ll = Math.hypot(local[0], local[1], local[2], local[3]) || 1;
164
+ // Weight blends the CCD step with the current local rotation.
165
+ const out = new Float32Array(4);
166
+ slerpFlat(pose.rotations, joint * 4, local, weight, out);
167
+ pose.rotations[joint * 4] = out[0];
168
+ pose.rotations[joint * 4 + 1] = out[1];
169
+ pose.rotations[joint * 4 + 2] = out[2];
170
+ pose.rotations[joint * 4 + 3] = out[3];
171
+ }
172
+ }
173
+ return { iterations, tipError, reached: tipError <= tolerance };
174
+ }
175
+ function slerpFlat(current, offset, local, t, out) {
176
+ let ax = current[offset], ay = current[offset + 1], az = current[offset + 2], aw = current[offset + 3];
177
+ let bx = local[0], by = local[1], bz = local[2], bw = local[3];
178
+ let d = ax * bx + ay * by + az * bz + aw * bw;
179
+ if (d < 0) {
180
+ bx = -bx;
181
+ by = -by;
182
+ bz = -bz;
183
+ bw = -bw;
184
+ d = -d;
185
+ }
186
+ let s0 = 1 - t, s1 = t;
187
+ if (d < 0.9995) {
188
+ const theta = Math.acos(d);
189
+ const sin = Math.sin(theta);
190
+ s0 = Math.sin(s0 * theta) / sin;
191
+ s1 = Math.sin(s1 * theta) / sin;
192
+ }
193
+ out[0] = ax * s0 + bx * s1;
194
+ out[1] = ay * s0 + by * s1;
195
+ out[2] = az * s0 + bz * s1;
196
+ out[3] = aw * s0 + bw * s1;
197
+ }
198
+ //# sourceMappingURL=CcdIkConstraint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CcdIkConstraint.js","sourceRoot":"","sources":["../../../../../packages/animation/src/pose/CcdIkConstraint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { AnimationClip } from "../AnimationClip.js";
2
+ import type { AnimationTrack, TrackValueType } from "../AnimationTrack.js";
3
+ import type { AnimationValue } from "../Keyframe.js";
4
+ /**
5
+ * PRD-06 T1.2 — clip compiled for allocation-free sampling: times/values live in
6
+ * flat Float32Arrays, and each playing action carries a per-track cursor
7
+ * (Uint32Array) so interval lookup is amortized O(1) for monotonic playback.
8
+ *
9
+ * Interpolation mirrors `AnimationTrack.sample` (LINEAR / STEP / CUBICSPLINE)
10
+ * with one deliberate deviation: quaternion CUBICSPLINE output is normalized
11
+ * directly instead of `sample`'s `slerpQuat(identity, q, 1)` — that call returns
12
+ * the raw cubic value un-normalized whenever |q.w| < 0.9995.
13
+ */
14
+ export type CompiledTrackCursor = Uint32Array;
15
+ export type CompiledTrack = {
16
+ readonly target: string;
17
+ readonly valueType: TrackValueType;
18
+ readonly times: Float32Array;
19
+ /** Flattened numeric values (stride×keyCount); empty for boolean/string tracks. */
20
+ readonly values: Float32Array;
21
+ /** Non-numeric values for boolean/string tracks; null otherwise. */
22
+ readonly rawValues: readonly AnimationValue[] | null;
23
+ /** Flattened cubic outTangents per keyframe (only when track has cubic keys). */
24
+ readonly outTangents: Float32Array | null;
25
+ /** Flattened cubic inTangents per keyframe (only when track has cubic keys). */
26
+ readonly inTangents: Float32Array | null;
27
+ readonly stride: number;
28
+ /** 0 = linear, 1 = step, 2 = cubicspline; one byte per keyframe. */
29
+ readonly interpolation: Uint8Array;
30
+ readonly keyframeCount: number;
31
+ };
32
+ export type CompiledClip = {
33
+ readonly duration: number;
34
+ readonly tracks: readonly CompiledTrack[];
35
+ };
36
+ export declare function compileTrack(track: AnimationTrack): CompiledTrack;
37
+ export declare function compileClip(clip: AnimationClip): CompiledClip;
38
+ /** One cursor byte per track; callers keep this on the action and reset it on seek. */
39
+ export declare function createTrackCursors(clip: CompiledClip): CompiledTrackCursor;
40
+ /**
41
+ * Sample `track` at `time` into `out` at `outOffset`. For boolean/string tracks
42
+ * the sampled raw value is written to `out[outOffset]` via Number coercion —
43
+ * callers needing the raw value use `sampleRaw` instead.
44
+ */
45
+ export declare function sampleTrackInto(track: CompiledTrack, time: number, cursor: CompiledTrackCursor, cursorIndex: number, out: Float32Array, outOffset: number): void;
46
+ /** Raw-value sample for boolean/string tracks (and a convenience for others). */
47
+ export declare function sampleTrackRaw(track: CompiledTrack, time: number, cursor: CompiledTrackCursor, cursorIndex: number): AnimationValue;
48
+ //# sourceMappingURL=CompiledClip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompiledClip.d.ts","sourceRoot":"","sources":["../../../../../packages/animation/src/pose/CompiledClip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD;;;;;;;;;GASG;AAEH,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAAC;AAE9C,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,mFAAmF;IACnF,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,oEAAoE;IACpE,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,GAAG,IAAI,CAAC;IACrD,iFAAiF;IACjF,QAAQ,CAAC,WAAW,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1C,gFAAgF;IAChF,QAAQ,CAAC,UAAU,EAAE,YAAY,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,QAAQ,CAAC,aAAa,EAAE,UAAU,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;CAC3C,CAAC;AA2BF,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,aAAa,CA0DjE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,CAK7D;AAED,uFAAuF;AACvF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,mBAAmB,CAE1E;AA+BD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,mBAAmB,EAC3B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,MAAM,GAChB,IAAI,CAuDN;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc,CAkBnI"}
@@ -0,0 +1,209 @@
1
+ import { normalizeQuatFlat, slerpQuatFlat } from "./quatFlat.js";
2
+ const INTERP_LINEAR = 0;
3
+ const INTERP_STEP = 1;
4
+ const INTERP_CUBIC = 2;
5
+ function strideFor(valueType, first) {
6
+ switch (valueType) {
7
+ case "scalar":
8
+ return 1;
9
+ case "vector3":
10
+ return 3;
11
+ case "quaternion":
12
+ return 4;
13
+ case "number-array":
14
+ return first.length;
15
+ default:
16
+ return 0;
17
+ }
18
+ }
19
+ function interpolationCode(interpolation) {
20
+ if (interpolation === "step")
21
+ return INTERP_STEP;
22
+ if (interpolation === "cubicspline")
23
+ return INTERP_CUBIC;
24
+ return INTERP_LINEAR;
25
+ }
26
+ export function compileTrack(track) {
27
+ const keyframes = track.keyframes;
28
+ const keyframeCount = keyframes.length;
29
+ const times = new Float32Array(keyframeCount);
30
+ const interpolation = new Uint8Array(keyframeCount);
31
+ const stride = strideFor(track.valueType, keyframes[0].value);
32
+ const numeric = stride > 0;
33
+ const values = numeric ? new Float32Array(keyframeCount * stride) : new Float32Array(0);
34
+ const rawValues = numeric ? null : [];
35
+ let hasCubic = false;
36
+ for (let i = 0; i < keyframeCount; i += 1) {
37
+ const keyframe = keyframes[i];
38
+ times[i] = keyframe.time;
39
+ const code = interpolationCode(keyframe.interpolation);
40
+ interpolation[i] = code;
41
+ if (code === INTERP_CUBIC)
42
+ hasCubic = true;
43
+ if (numeric) {
44
+ const value = keyframe.value;
45
+ const base = i * stride;
46
+ if (stride === 1)
47
+ values[base] = value;
48
+ else
49
+ for (let k = 0; k < stride; k += 1)
50
+ values[base + k] = value[k];
51
+ }
52
+ else {
53
+ rawValues.push(keyframe.value);
54
+ }
55
+ }
56
+ let outTangents = null;
57
+ let inTangents = null;
58
+ if (hasCubic) {
59
+ outTangents = new Float32Array(keyframeCount * stride);
60
+ inTangents = new Float32Array(keyframeCount * stride);
61
+ for (let i = 0; i < keyframeCount; i += 1) {
62
+ const keyframe = keyframes[i];
63
+ const base = i * stride;
64
+ if (keyframe.outTangent !== undefined) {
65
+ const tangent = keyframe.outTangent;
66
+ for (let k = 0; k < stride; k += 1)
67
+ outTangents[base + k] = typeof tangent === "number" ? tangent : tangent[k];
68
+ }
69
+ if (keyframe.inTangent !== undefined) {
70
+ const tangent = keyframe.inTangent;
71
+ for (let k = 0; k < stride; k += 1)
72
+ inTangents[base + k] = typeof tangent === "number" ? tangent : tangent[k];
73
+ }
74
+ }
75
+ }
76
+ return {
77
+ target: track.target,
78
+ valueType: track.valueType,
79
+ times,
80
+ values,
81
+ rawValues,
82
+ outTangents,
83
+ inTangents,
84
+ stride,
85
+ interpolation,
86
+ keyframeCount
87
+ };
88
+ }
89
+ export function compileClip(clip) {
90
+ return {
91
+ duration: clip.duration,
92
+ tracks: clip.tracks.map((track) => compileTrack(track))
93
+ };
94
+ }
95
+ /** One cursor byte per track; callers keep this on the action and reset it on seek. */
96
+ export function createTrackCursors(clip) {
97
+ return new Uint32Array(clip.tracks.length);
98
+ }
99
+ /**
100
+ * Locate the keyframe interval containing `time`, using `cursor` (a slot in the
101
+ * action's Uint32Array) as a search hint. Returns the index of the first
102
+ * keyframe of the interval, or -1 when `time` is outside the clip range (caller
103
+ * clamps to the first/last keyframe in that case).
104
+ */
105
+ function locateInterval(track, time, cursor, cursorIndex) {
106
+ const times = track.times;
107
+ const lastInterval = track.keyframeCount - 2;
108
+ let i = cursor[cursorIndex];
109
+ if (i > lastInterval)
110
+ i = lastInterval;
111
+ while (i < lastInterval && time > times[i + 1])
112
+ i += 1;
113
+ while (i > 0 && time < times[i])
114
+ i -= 1;
115
+ cursor[cursorIndex] = i;
116
+ if (time < times[0] || time > times[track.keyframeCount - 1])
117
+ return -1;
118
+ return i;
119
+ }
120
+ function cubicHermite(a, b, outTangent, inTangent, t, deltaTime) {
121
+ const t2 = t * t;
122
+ const t3 = t2 * t;
123
+ return ((2 * t3 - 3 * t2 + 1) * a +
124
+ (t3 - 2 * t2 + t) * deltaTime * outTangent +
125
+ (-2 * t3 + 3 * t2) * b +
126
+ (t3 - t2) * deltaTime * inTangent);
127
+ }
128
+ /**
129
+ * Sample `track` at `time` into `out` at `outOffset`. For boolean/string tracks
130
+ * the sampled raw value is written to `out[outOffset]` via Number coercion —
131
+ * callers needing the raw value use `sampleRaw` instead.
132
+ */
133
+ export function sampleTrackInto(track, time, cursor, cursorIndex, out, outOffset) {
134
+ const stride = track.stride;
135
+ const keyframeCount = track.keyframeCount;
136
+ const times = track.times;
137
+ const values = track.values;
138
+ if (time <= times[0]) {
139
+ for (let k = 0; k < stride; k += 1)
140
+ out[outOffset + k] = values[k];
141
+ return;
142
+ }
143
+ if (time >= times[keyframeCount - 1]) {
144
+ const base = (keyframeCount - 1) * stride;
145
+ for (let k = 0; k < stride; k += 1)
146
+ out[outOffset + k] = values[base + k];
147
+ return;
148
+ }
149
+ const i = locateInterval(track, time, cursor, cursorIndex);
150
+ const aBase = i * stride;
151
+ const bBase = (i + 1) * stride;
152
+ const aTime = times[i];
153
+ const bTime = times[i + 1];
154
+ const interp = track.interpolation[i];
155
+ if (interp === INTERP_STEP || bTime === aTime) {
156
+ for (let k = 0; k < stride; k += 1)
157
+ out[outOffset + k] = values[aBase + k];
158
+ return;
159
+ }
160
+ const t = (time - aTime) / (bTime - aTime);
161
+ if (interp === INTERP_CUBIC) {
162
+ const deltaTime = bTime - aTime;
163
+ const outTangents = track.outTangents;
164
+ const inTangents = track.inTangents;
165
+ for (let k = 0; k < stride; k += 1) {
166
+ out[outOffset + k] = cubicHermite(values[aBase + k], values[bBase + k], outTangents[aBase + k], inTangents[bBase + k], t, deltaTime);
167
+ }
168
+ if (track.valueType === "quaternion")
169
+ normalizeQuatFlat(out, outOffset);
170
+ return;
171
+ }
172
+ if (track.valueType === "quaternion") {
173
+ slerpQuatFlat(out, outOffset, values, aBase, values, bBase, t);
174
+ return;
175
+ }
176
+ for (let k = 0; k < stride; k += 1) {
177
+ out[outOffset + k] = values[aBase + k] + (values[bBase + k] - values[aBase + k]) * t;
178
+ }
179
+ }
180
+ /** Raw-value sample for boolean/string tracks (and a convenience for others). */
181
+ export function sampleTrackRaw(track, time, cursor, cursorIndex) {
182
+ const times = track.times;
183
+ const keyframeCount = track.keyframeCount;
184
+ if (time <= times[0])
185
+ return track.rawValues ? track.rawValues[0] : firstNumeric(track);
186
+ if (time >= times[keyframeCount - 1]) {
187
+ return track.rawValues ? track.rawValues[keyframeCount - 1] : lastNumeric(track);
188
+ }
189
+ const i = locateInterval(track, time, cursor, cursorIndex);
190
+ const bTime = times[i + 1];
191
+ const t = (time - times[i]) / (bTime - times[i]);
192
+ if (track.rawValues) {
193
+ const interp = track.interpolation[i];
194
+ if (interp === INTERP_STEP || t < 1)
195
+ return track.rawValues[i];
196
+ return track.rawValues[i + 1];
197
+ }
198
+ const scratch = new Float32Array(track.stride);
199
+ sampleTrackInto(track, time, cursor, cursorIndex, scratch, 0);
200
+ return [...scratch];
201
+ }
202
+ function firstNumeric(track) {
203
+ return track.stride === 1 ? track.values[0] : [...track.values.subarray(0, track.stride)];
204
+ }
205
+ function lastNumeric(track) {
206
+ const base = (track.keyframeCount - 1) * track.stride;
207
+ return track.stride === 1 ? track.values[base] : [...track.values.subarray(base, base + track.stride)];
208
+ }
209
+ //# sourceMappingURL=CompiledClip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompiledClip.js","sourceRoot":"","sources":["../../../../../packages/animation/src/pose/CompiledClip.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAsCjE,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,SAAS,SAAS,CAAC,SAAyB,EAAE,KAAqB;IACjE,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC;QACX,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC;QACX,KAAK,YAAY;YACf,OAAO,CAAC,CAAC;QACX,KAAK,cAAc;YACjB,OAAQ,KAA2B,CAAC,MAAM,CAAC;QAC7C;YACE,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,aAAiC;IAC1D,IAAI,aAAa,KAAK,MAAM;QAAE,OAAO,WAAW,CAAC;IACjD,IAAI,aAAa,KAAK,aAAa;QAAE,OAAO,YAAY,CAAC;IACzD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAqB;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IAClC,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,IAAI,UAAU,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,SAAS,GAA4B,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;QAC/B,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;QACzB,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACvD,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACxB,IAAI,IAAI,KAAK,YAAY;YAAE,QAAQ,GAAG,IAAI,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC7B,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC;YACxB,IAAI,MAAM,KAAK,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAe,CAAC;;gBAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC;oBAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAI,KAA2B,CAAC,CAAC,CAAE,CAAC;QAC/F,CAAC;aAAM,CAAC;YACN,SAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,IAAI,WAAW,GAAwB,IAAI,CAAC;IAC5C,IAAI,UAAU,GAAwB,IAAI,CAAC;IAC3C,IAAI,QAAQ,EAAE,CAAC;QACb,WAAW,GAAG,IAAI,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC,CAAC;QACvD,UAAU,GAAG,IAAI,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC,CAAC;QACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC;YACxB,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC;gBACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC;oBAAE,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,OAA6B,CAAC,CAAC,CAAE,CAAC;YACzI,CAAC;YACD,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC;gBACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC;oBAAE,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,OAA6B,CAAC,CAAC,CAAE,CAAC;YACxI,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK;QACL,MAAM;QACN,SAAS;QACT,WAAW;QACX,UAAU;QACV,MAAM;QACN,aAAa;QACb,aAAa;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAmB;IAC7C,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,kBAAkB,CAAC,IAAkB;IACnD,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,KAAoB,EAAE,IAAY,EAAE,MAA2B,EAAE,WAAmB;IAC1G,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,MAAM,YAAY,GAAG,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAE,CAAC;IAC7B,IAAI,CAAC,GAAG,YAAY;QAAE,CAAC,GAAG,YAAY,CAAC;IACvC,OAAO,CAAC,GAAG,YAAY,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE;QAAE,CAAC,IAAI,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE;QAAE,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAE;QAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,YAAY,CAAC,CAAS,EAAE,CAAS,EAAE,UAAkB,EAAE,SAAiB,EAAE,CAAS,EAAE,SAAiB;IAC7G,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;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAoB,EACpB,IAAY,EACZ,MAA2B,EAC3B,WAAmB,EACnB,GAAiB,EACjB,SAAiB;IAEjB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAE5B,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACpE,OAAO;IACT,CAAC;IACD,IAAI,IAAI,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,CAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,CAAE,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC;IACzB,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IACxB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAE,CAAC;IAEvC,IAAI,MAAM,KAAK,WAAW,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;IAE3C,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;QAChC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAY,CAAC;QACvC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAW,CAAC;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,YAAY,CAC/B,MAAM,CAAC,KAAK,GAAG,CAAC,CAAE,EAClB,MAAM,CAAC,KAAK,GAAG,CAAC,CAAE,EAClB,WAAW,CAAC,KAAK,GAAG,CAAC,CAAE,EACvB,UAAU,CAAC,KAAK,GAAG,CAAC,CAAE,EACtB,CAAC,EACD,SAAS,CACV,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY;YAAE,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACxE,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE,CAAC;QACrC,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAE,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAE,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,cAAc,CAAC,KAAoB,EAAE,IAAY,EAAE,MAA2B,EAAE,WAAmB;IACjH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IAC1C,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,CAAE;QAAE,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC1F,IAAI,IAAI,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,CAAE,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;IAC5B,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IACnD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAE,CAAC;QACvC,IAAI,MAAM,KAAK,WAAW,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC;QAChE,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;IACjC,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/C,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,OAAO,CAAmB,CAAC;AACxC,CAAC;AAED,SAAS,YAAY,CAAC,KAAoB;IACxC,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAoB,CAAC;AACjH,CAAC;AACD,SAAS,WAAW,CAAC,KAAoB;IACvC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACtD,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAE,CAAC,CAAC,CAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAoB,CAAC;AAC9H,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * T3.3 (PRD-06 §7.1/7.2) — `LookAtConstraint`: pose-space look-at that
3
+ * distributes the required yaw/pitch across the named bones by weight,
4
+ * enforces `yawLimitDeg`/`pitchLimitDeg` on the aggregate rotation, and
5
+ * smooths applied angles with a critically-damped spring (`halfLife`,
6
+ * default 0.12 s — same convention as PoseInertializer).
7
+ *
8
+ * Stateful: the spring keeps per-constraint applied yaw/pitch; ±180° targets
9
+ * unwrap against the previous applied yaw so sweeping behind the character
10
+ * never snaps sign.
11
+ *
12
+ * `eyes` (optional bone names) aim directly at the target after the weighted
13
+ * pass — eye saccades are instant, not spring-smoothed.
14
+ */
15
+ import type { PoseBuffer } from "./PoseBuffer.js";
16
+ import type { SkeletonBinding } from "./SkeletonBinding.js";
17
+ export interface LookAtConstraintSpec {
18
+ /** Weighted chain (e.g. spine 0.25 / neck 0.35 / head 0.4). Weights need not sum to 1. */
19
+ readonly bones: readonly {
20
+ readonly bone: string;
21
+ readonly weight: number;
22
+ }[];
23
+ /** Model-space forward axis of the bones (default "+z"). */
24
+ readonly forwardAxis?: "+z" | "-z" | "+y";
25
+ /** Aggregate yaw cap about the model-space up axis (default 90°). */
26
+ readonly yawLimitDeg?: number;
27
+ /** Aggregate pitch cap about the rotated right axis (default 60°). */
28
+ readonly pitchLimitDeg?: number;
29
+ /** Optional eye bones that aim at the target directly (full correction). */
30
+ readonly eyes?: readonly string[];
31
+ /** Critically-damped smoothing half-life in seconds (default 0.12). */
32
+ readonly halfLife?: number;
33
+ }
34
+ type Vec3 = readonly [number, number, number];
35
+ export interface LookAtConstraint {
36
+ /** Apply the constraint: writes local rotations of the spec's bones. */
37
+ apply(pose: PoseBuffer, skeleton: SkeletonBinding, modelMatrix: Float32Array | readonly number[], target: Vec3, dt: number): void;
38
+ /** Current smoothed yaw/pitch (radians) — diagnostics. */
39
+ readonly smoothed: {
40
+ readonly yaw: number;
41
+ readonly pitch: number;
42
+ };
43
+ /** Reset the spring (e.g. on teleport). */
44
+ reset(): void;
45
+ }
46
+ export declare function createLookAtConstraint(spec: LookAtConstraintSpec): LookAtConstraint;
47
+ export {};
48
+ //# sourceMappingURL=LookAtConstraint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LookAtConstraint.d.ts","sourceRoot":"","sources":["../../../../../packages/animation/src/pose/LookAtConstraint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,WAAW,oBAAoB;IACnC,0FAA0F;IAC1F,QAAQ,CAAC,KAAK,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9E,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1C,qEAAqE;IACrE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,sEAAsE;IACtE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,KAAK,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AA4G9C,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,GAAG,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClI,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE,2CAA2C;IAC3C,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,gBAAgB,CA8InF"}