@aura3d/engine 4.1.3 → 4.3.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 (281) hide show
  1. package/README.md +3 -3
  2. package/dist/aura3d-cli/cli-help.d.ts.map +1 -1
  3. package/dist/aura3d-cli/cli-help.js +4 -2
  4. package/dist/aura3d-cli/cli-help.js.map +1 -1
  5. package/dist/aura3d-cli/cli.d.ts.map +1 -1
  6. package/dist/aura3d-cli/cli.js +129 -19
  7. package/dist/aura3d-cli/cli.js.map +1 -1
  8. package/dist/aura3d-cli/commands/assets/index.js +2 -2
  9. package/dist/aura3d-cli/commands/assets/index.js.map +1 -1
  10. package/dist/aura3d-cli/commands/meshyLedger.d.ts +125 -14
  11. package/dist/aura3d-cli/commands/meshyLedger.d.ts.map +1 -1
  12. package/dist/aura3d-cli/commands/meshyLedger.js +262 -35
  13. package/dist/aura3d-cli/commands/meshyLedger.js.map +1 -1
  14. package/dist/aura3d-cli/commands/prd13/run.js +19 -16
  15. package/dist/aura3d-cli/commands/prd13/run.js.map +1 -1
  16. package/dist/aura3d-cli/index.d.ts +8 -0
  17. package/dist/aura3d-cli/index.d.ts.map +1 -1
  18. package/dist/aura3d-cli/index.js +12 -0
  19. package/dist/aura3d-cli/index.js.map +1 -1
  20. package/dist/aura3d-cli/pull-bridge/adapters.d.ts +9 -1
  21. package/dist/aura3d-cli/pull-bridge/adapters.d.ts.map +1 -1
  22. package/dist/aura3d-cli/pull-bridge/adapters.js +30 -7
  23. package/dist/aura3d-cli/pull-bridge/adapters.js.map +1 -1
  24. package/dist/aura3d-cli/pull-bridge/search.d.ts +5 -0
  25. package/dist/aura3d-cli/pull-bridge/search.d.ts.map +1 -1
  26. package/dist/aura3d-cli/pull-bridge/search.js +7 -1
  27. package/dist/aura3d-cli/pull-bridge/search.js.map +1 -1
  28. package/dist/aura3d-cli/pull-bridge.js +1 -1
  29. package/dist/aura3d-cli/pull-bridge.js.map +1 -1
  30. package/dist/aura3d-cli/resolve-ladder.d.ts +123 -0
  31. package/dist/aura3d-cli/resolve-ladder.d.ts.map +1 -0
  32. package/dist/aura3d-cli/resolve-ladder.js +410 -0
  33. package/dist/aura3d-cli/resolve-ladder.js.map +1 -0
  34. package/dist/aura3d-cli/skin/analysis.d.ts +137 -0
  35. package/dist/aura3d-cli/skin/analysis.d.ts.map +1 -0
  36. package/dist/aura3d-cli/skin/analysis.js +382 -0
  37. package/dist/aura3d-cli/skin/analysis.js.map +1 -0
  38. package/dist/aura3d-cli/skin/command.d.ts +71 -0
  39. package/dist/aura3d-cli/skin/command.d.ts.map +1 -0
  40. package/dist/aura3d-cli/skin/command.js +186 -0
  41. package/dist/aura3d-cli/skin/command.js.map +1 -0
  42. package/dist/aura3d-cli/skin/glbEdit.d.ts +14 -0
  43. package/dist/aura3d-cli/skin/glbEdit.d.ts.map +1 -0
  44. package/dist/aura3d-cli/skin/glbEdit.js +152 -0
  45. package/dist/aura3d-cli/skin/glbEdit.js.map +1 -0
  46. package/dist/aura3d-cli/skin/gltf.d.ts +159 -0
  47. package/dist/aura3d-cli/skin/gltf.d.ts.map +1 -0
  48. package/dist/aura3d-cli/skin/gltf.js +379 -0
  49. package/dist/aura3d-cli/skin/gltf.js.map +1 -0
  50. package/dist/aura3d-cli/skin/rebuildLimbs.d.ts +31 -0
  51. package/dist/aura3d-cli/skin/rebuildLimbs.d.ts.map +1 -0
  52. package/dist/aura3d-cli/skin/rebuildLimbs.js +326 -0
  53. package/dist/aura3d-cli/skin/rebuildLimbs.js.map +1 -0
  54. package/dist/aura3d-cli/skin/repair.d.ts +41 -0
  55. package/dist/aura3d-cli/skin/repair.d.ts.map +1 -0
  56. package/dist/aura3d-cli/skin/repair.js +180 -0
  57. package/dist/aura3d-cli/skin/repair.js.map +1 -0
  58. package/dist/create-aura3d/index.js +1 -1
  59. package/dist/debug/index.d.ts +2 -2
  60. package/dist/debug/index.d.ts.map +1 -1
  61. package/dist/debug/index.js +1 -1
  62. package/dist/debug/index.js.map +1 -1
  63. package/dist/debug/safety/frameBoundary.d.ts +33 -0
  64. package/dist/debug/safety/frameBoundary.d.ts.map +1 -0
  65. package/dist/debug/safety/frameBoundary.js +40 -0
  66. package/dist/debug/safety/frameBoundary.js.map +1 -0
  67. package/dist/debug/safety/index.d.ts +1 -0
  68. package/dist/debug/safety/index.d.ts.map +1 -1
  69. package/dist/debug/safety/index.js +1 -0
  70. package/dist/debug/safety/index.js.map +1 -1
  71. package/dist/engine/agent-api/app/actorBoneMatrixLookup.d.ts +22 -0
  72. package/dist/engine/agent-api/app/actorBoneMatrixLookup.d.ts.map +1 -0
  73. package/dist/engine/agent-api/app/actorBoneMatrixLookup.js +24 -0
  74. package/dist/engine/agent-api/app/actorBoneMatrixLookup.js.map +1 -0
  75. package/dist/engine/agent-api/app/canvas.d.ts +16 -0
  76. package/dist/engine/agent-api/app/canvas.d.ts.map +1 -1
  77. package/dist/engine/agent-api/app/canvas.js +15 -0
  78. package/dist/engine/agent-api/app/canvas.js.map +1 -1
  79. package/dist/engine/agent-api/app/createAuraApp.d.ts.map +1 -1
  80. package/dist/engine/agent-api/app/createAuraApp.js +21 -3
  81. package/dist/engine/agent-api/app/createAuraApp.js.map +1 -1
  82. package/dist/engine/agent-api/app/frameLoop.d.ts.map +1 -1
  83. package/dist/engine/agent-api/app/frameLoop.js +21 -3
  84. package/dist/engine/agent-api/app/frameLoop.js.map +1 -1
  85. package/dist/engine/agent-api/app/mountFailure.d.ts +6 -0
  86. package/dist/engine/agent-api/app/mountFailure.d.ts.map +1 -0
  87. package/dist/engine/agent-api/app/mountFailure.js +9 -0
  88. package/dist/engine/agent-api/app/mountFailure.js.map +1 -0
  89. package/dist/engine/agent-api/app/parentFit.d.ts +35 -0
  90. package/dist/engine/agent-api/app/parentFit.d.ts.map +1 -0
  91. package/dist/engine/agent-api/app/parentFit.js +36 -0
  92. package/dist/engine/agent-api/app/parentFit.js.map +1 -0
  93. package/dist/engine/agent-api/compiler/customMaterial.d.ts.map +1 -1
  94. package/dist/engine/agent-api/compiler/customMaterial.js +15 -3
  95. package/dist/engine/agent-api/compiler/customMaterial.js.map +1 -1
  96. package/dist/engine/agent-api/nodes/batched.d.ts +10 -0
  97. package/dist/engine/agent-api/nodes/batched.d.ts.map +1 -1
  98. package/dist/engine/agent-api/nodes/batched.js +7 -5
  99. package/dist/engine/agent-api/nodes/batched.js.map +1 -1
  100. package/dist/engine/agent-api/nodes/builder.d.ts +13 -0
  101. package/dist/engine/agent-api/nodes/builder.d.ts.map +1 -1
  102. package/dist/engine/agent-api/nodes/builder.js +7 -3
  103. package/dist/engine/agent-api/nodes/builder.js.map +1 -1
  104. package/dist/engine/agent-api/nodes/instancedMesh.d.ts +10 -0
  105. package/dist/engine/agent-api/nodes/instancedMesh.d.ts.map +1 -1
  106. package/dist/engine/agent-api/nodes/instancedMesh.js +7 -5
  107. package/dist/engine/agent-api/nodes/instancedMesh.js.map +1 -1
  108. package/dist/engine/agent-api/nodes/types.d.ts +6 -0
  109. package/dist/engine/agent-api/nodes/types.d.ts.map +1 -1
  110. package/dist/engine/lanes/prd06.d.ts.map +1 -1
  111. package/dist/engine/lanes/prd06.js +1 -16
  112. package/dist/engine/lanes/prd06.js.map +1 -1
  113. package/dist/engine/qa/fixedStepLoop.d.ts +2 -0
  114. package/dist/engine/qa/fixedStepLoop.d.ts.map +1 -1
  115. package/dist/engine/qa/fixedStepLoop.js +3 -0
  116. package/dist/engine/qa/fixedStepLoop.js.map +1 -1
  117. package/dist/game/evidence/textureStatus.d.ts +24 -0
  118. package/dist/game/evidence/textureStatus.d.ts.map +1 -0
  119. package/dist/game/evidence/textureStatus.js +27 -0
  120. package/dist/game/evidence/textureStatus.js.map +1 -0
  121. package/dist/game/index.d.ts +5 -0
  122. package/dist/game/index.d.ts.map +1 -1
  123. package/dist/game/index.js +3 -0
  124. package/dist/game/index.js.map +1 -1
  125. package/dist/game/motion/boneAttach.d.ts +42 -0
  126. package/dist/game/motion/boneAttach.d.ts.map +1 -0
  127. package/dist/game/motion/boneAttach.js +166 -0
  128. package/dist/game/motion/boneAttach.js.map +1 -0
  129. package/dist/game/motion/cameraClear.d.ts +35 -0
  130. package/dist/game/motion/cameraClear.d.ts.map +1 -0
  131. package/dist/game/motion/cameraClear.js +64 -0
  132. package/dist/game/motion/cameraClear.js.map +1 -0
  133. package/dist/game/motion/doubleFrame.d.ts +37 -0
  134. package/dist/game/motion/doubleFrame.d.ts.map +1 -0
  135. package/dist/game/motion/doubleFrame.js +59 -0
  136. package/dist/game/motion/doubleFrame.js.map +1 -0
  137. package/dist/game/motion/footSlide.d.ts +32 -0
  138. package/dist/game/motion/footSlide.d.ts.map +1 -0
  139. package/dist/game/motion/footSlide.js +59 -0
  140. package/dist/game/motion/footSlide.js.map +1 -0
  141. package/dist/game/motion/handBounce.d.ts +206 -0
  142. package/dist/game/motion/handBounce.d.ts.map +1 -0
  143. package/dist/game/motion/handBounce.js +267 -0
  144. package/dist/game/motion/handBounce.js.map +1 -0
  145. package/dist/game/motion/impact.d.ts +113 -0
  146. package/dist/game/motion/impact.d.ts.map +1 -0
  147. package/dist/game/motion/impact.js +233 -0
  148. package/dist/game/motion/impact.js.map +1 -0
  149. package/dist/game/motion/index.d.ts +21 -0
  150. package/dist/game/motion/index.d.ts.map +1 -0
  151. package/dist/game/motion/index.js +11 -0
  152. package/dist/game/motion/index.js.map +1 -0
  153. package/dist/game/motion/locomotion.d.ts +55 -0
  154. package/dist/game/motion/locomotion.d.ts.map +1 -0
  155. package/dist/game/motion/locomotion.js +107 -0
  156. package/dist/game/motion/locomotion.js.map +1 -0
  157. package/dist/game/motion/motionGate.d.ts +41 -0
  158. package/dist/game/motion/motionGate.d.ts.map +1 -0
  159. package/dist/game/motion/motionGate.js +71 -0
  160. package/dist/game/motion/motionGate.js.map +1 -0
  161. package/dist/game/motion/presenter.d.ts +37 -0
  162. package/dist/game/motion/presenter.d.ts.map +1 -0
  163. package/dist/game/motion/presenter.js +72 -0
  164. package/dist/game/motion/presenter.js.map +1 -0
  165. package/dist/game/motion/smoothing.d.ts +34 -0
  166. package/dist/game/motion/smoothing.d.ts.map +1 -0
  167. package/dist/game/motion/smoothing.js +92 -0
  168. package/dist/game/motion/smoothing.js.map +1 -0
  169. package/dist/game/session/warmPrograms.d.ts +75 -0
  170. package/dist/game/session/warmPrograms.d.ts.map +1 -0
  171. package/dist/game/session/warmPrograms.js +80 -0
  172. package/dist/game/session/warmPrograms.js.map +1 -0
  173. package/dist/physics/ensure.d.ts +2 -0
  174. package/dist/physics/ensure.d.ts.map +1 -0
  175. package/dist/physics/ensure.js +4 -0
  176. package/dist/physics/ensure.js.map +1 -0
  177. package/dist/physics/index.d.ts +1 -0
  178. package/dist/physics/index.d.ts.map +1 -1
  179. package/dist/physics/index.js +1 -0
  180. package/dist/physics/index.js.map +1 -1
  181. package/dist/physics/world.d.ts +1 -0
  182. package/dist/physics/world.d.ts.map +1 -1
  183. package/dist/physics/world.js +1 -0
  184. package/dist/physics/world.js.map +1 -1
  185. package/dist/physics-rapier/index.d.ts +2 -0
  186. package/dist/physics-rapier/index.d.ts.map +1 -1
  187. package/dist/physics-rapier/index.js +12 -10
  188. package/dist/physics-rapier/index.js.map +1 -1
  189. package/dist/physics-rapier/rapierInit.d.ts +6 -0
  190. package/dist/physics-rapier/rapierInit.d.ts.map +1 -0
  191. package/dist/physics-rapier/rapierInit.js +12 -0
  192. package/dist/physics-rapier/rapierInit.js.map +1 -0
  193. package/dist/physics-rapier/rapierInit.lazy.d.ts +6 -0
  194. package/dist/physics-rapier/rapierInit.lazy.d.ts.map +1 -0
  195. package/dist/physics-rapier/rapierInit.lazy.js +19 -0
  196. package/dist/physics-rapier/rapierInit.lazy.js.map +1 -0
  197. package/dist/rendering/DepthPass.d.ts.map +1 -1
  198. package/dist/rendering/DepthPass.js +30 -8
  199. package/dist/rendering/DepthPass.js.map +1 -1
  200. package/dist/rendering/ForwardPass.d.ts.map +1 -1
  201. package/dist/rendering/ForwardPass.js +7 -0
  202. package/dist/rendering/ForwardPass.js.map +1 -1
  203. package/dist/rendering/Renderer.d.ts +0 -2
  204. package/dist/rendering/Renderer.d.ts.map +1 -1
  205. package/dist/rendering/Renderer.js +6 -16
  206. package/dist/rendering/Renderer.js.map +1 -1
  207. package/dist/rendering/contracts/output.d.ts +9 -1
  208. package/dist/rendering/contracts/output.d.ts.map +1 -1
  209. package/dist/rendering/contracts/output.js.map +1 -1
  210. package/dist/rendering/environment/EnvironmentCache.d.ts.map +1 -1
  211. package/dist/rendering/environment/EnvironmentCache.js +6 -1
  212. package/dist/rendering/environment/EnvironmentCache.js.map +1 -1
  213. package/dist/rendering/environment/neutralEmbedded.d.ts +5 -0
  214. package/dist/rendering/environment/neutralEmbedded.d.ts.map +1 -0
  215. package/dist/rendering/environment/neutralEmbedded.js +1118 -0
  216. package/dist/rendering/environment/neutralEmbedded.js.map +1 -0
  217. package/dist/rendering/environment/neutralEmbeddedLoader.d.ts +5 -0
  218. package/dist/rendering/environment/neutralEmbeddedLoader.d.ts.map +1 -0
  219. package/dist/rendering/environment/neutralEmbeddedLoader.js +32 -0
  220. package/dist/rendering/environment/neutralEmbeddedLoader.js.map +1 -0
  221. package/dist/rendering/output/OutputPass.d.ts +2 -0
  222. package/dist/rendering/output/OutputPass.d.ts.map +1 -1
  223. package/dist/rendering/output/OutputPass.js +26 -3
  224. package/dist/rendering/output/OutputPass.js.map +1 -1
  225. package/dist/rendering/output/ToneMappingOperators.glsl.d.ts +3 -1
  226. package/dist/rendering/output/ToneMappingOperators.glsl.d.ts.map +1 -1
  227. package/dist/rendering/output/ToneMappingOperators.glsl.js +19 -1
  228. package/dist/rendering/output/ToneMappingOperators.glsl.js.map +1 -1
  229. package/dist/rendering/post/v2Stages.d.ts +2 -7
  230. package/dist/rendering/post/v2Stages.d.ts.map +1 -1
  231. package/dist/rendering/post/v2Stages.js +2 -17
  232. package/dist/rendering/post/v2Stages.js.map +1 -1
  233. package/dist/rendering/post/vignetteColor.d.ts +8 -0
  234. package/dist/rendering/post/vignetteColor.d.ts.map +1 -0
  235. package/dist/rendering/post/vignetteColor.js +18 -0
  236. package/dist/rendering/post/vignetteColor.js.map +1 -0
  237. package/dist/rendering/renderer/PostprocessExecution.d.ts +10 -0
  238. package/dist/rendering/renderer/PostprocessExecution.d.ts.map +1 -1
  239. package/dist/rendering/renderer/PostprocessExecution.js +38 -38
  240. package/dist/rendering/renderer/PostprocessExecution.js.map +1 -1
  241. package/dist/rendering/renderer/coreOutputPostRoute.d.ts +25 -17
  242. package/dist/rendering/renderer/coreOutputPostRoute.d.ts.map +1 -1
  243. package/dist/rendering/renderer/coreOutputPostRoute.js +27 -18
  244. package/dist/rendering/renderer/coreOutputPostRoute.js.map +1 -1
  245. package/dist/rendering/renderer/qrSubFlags.d.ts +1 -1
  246. package/dist/rendering/renderer/qrSubFlags.d.ts.map +1 -1
  247. package/dist/rendering/renderer/qrSubFlags.js +2 -8
  248. package/dist/rendering/renderer/qrSubFlags.js.map +1 -1
  249. package/dist/rendering/shaders/chunks/author/index.d.ts.map +1 -1
  250. package/dist/rendering/shaders/chunks/author/index.js +7 -0
  251. package/dist/rendering/shaders/chunks/author/index.js.map +1 -1
  252. package/dist/rendering/shaders/chunks/author/shadow.glsl.d.ts +11 -0
  253. package/dist/rendering/shaders/chunks/author/shadow.glsl.d.ts.map +1 -0
  254. package/dist/rendering/shaders/chunks/author/shadow.glsl.js +57 -0
  255. package/dist/rendering/shaders/chunks/author/shadow.glsl.js.map +1 -0
  256. package/dist/rendering/shadows/DirectionalCascadeFitter.d.ts +20 -0
  257. package/dist/rendering/shadows/DirectionalCascadeFitter.d.ts.map +1 -1
  258. package/dist/rendering/shadows/DirectionalCascadeFitter.js +80 -7
  259. package/dist/rendering/shadows/DirectionalCascadeFitter.js.map +1 -1
  260. package/dist/rendering/shadows/Prd02DepthShaderLibrary.d.ts.map +1 -1
  261. package/dist/rendering/shadows/Prd02DepthShaderLibrary.js +9 -1
  262. package/dist/rendering/shadows/Prd02DepthShaderLibrary.js.map +1 -1
  263. package/dist/rendering/shadows/ShadowSystem.d.ts.map +1 -1
  264. package/dist/rendering/shadows/ShadowSystem.js +7 -2
  265. package/dist/rendering/shadows/ShadowSystem.js.map +1 -1
  266. package/dist/rendering/webgl2/LdrPostprocessShader.d.ts +2 -0
  267. package/dist/rendering/webgl2/LdrPostprocessShader.d.ts.map +1 -1
  268. package/dist/rendering/webgl2/LdrPostprocessShader.js +25 -3
  269. package/dist/rendering/webgl2/LdrPostprocessShader.js.map +1 -1
  270. package/dist/rendering/webgl2/LegacyPost.d.ts +11 -2
  271. package/dist/rendering/webgl2/LegacyPost.d.ts.map +1 -1
  272. package/dist/rendering/webgl2/LegacyPost.js +191 -16
  273. package/dist/rendering/webgl2/LegacyPost.js.map +1 -1
  274. package/package.json +33 -26
  275. package/templates/cinematic-scene/package.json +2 -2
  276. package/templates/mini-game/package.json +2 -2
  277. package/templates/product-viewer/package.json +2 -2
  278. package/templates/production-asset-inspector/package.json +1 -1
  279. package/templates/production-material-studio/package.json +1 -1
  280. package/templates/production-product-configurator/package.json +1 -1
  281. package/templates/production-product-viewer/package.json +1 -1
@@ -0,0 +1,37 @@
1
+ export interface DrawEntry {
2
+ readonly meshId: string;
3
+ readonly skeletonId?: string;
4
+ }
5
+ export interface DoubleFrameFinding {
6
+ readonly kind: "shared-skeleton" | "coincident-model" | "double-blend";
7
+ readonly detail: string;
8
+ readonly ids: readonly string[];
9
+ }
10
+ export interface DoubleFrameReport {
11
+ readonly ok: boolean;
12
+ readonly findings: readonly DoubleFrameFinding[];
13
+ }
14
+ /** Two skinned meshes bound to one skeleton in the same frame draw the pose twice. */
15
+ export declare function detectSharedSkeleton(draws: readonly DrawEntry[]): DoubleFrameFinding[];
16
+ export interface ModelInstance {
17
+ readonly id: string;
18
+ readonly modelId: string;
19
+ readonly position: readonly [number, number, number];
20
+ }
21
+ /** Two instances of the same model at nearly the same place read as a ghost or doubled player. */
22
+ export declare function detectCoincidentModels(instances: readonly ModelInstance[], epsilon?: number): DoubleFrameFinding[];
23
+ export interface AnimLayer {
24
+ readonly name: string;
25
+ readonly clip: string;
26
+ readonly weight: number;
27
+ readonly blendMode?: "override" | "additive";
28
+ }
29
+ /** Override layers summing past 1, or one clip applied on two layers, give the doubled look. */
30
+ export declare function detectDoubleBlend(layers: readonly AnimLayer[]): DoubleFrameFinding[];
31
+ export declare function checkDoubleFrame(input: {
32
+ readonly draws?: readonly DrawEntry[];
33
+ readonly instances?: readonly ModelInstance[];
34
+ readonly layers?: readonly AnimLayer[];
35
+ readonly epsilon?: number;
36
+ }): DoubleFrameReport;
37
+ //# sourceMappingURL=doubleFrame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doubleFrame.d.ts","sourceRoot":"","sources":["../../../../../packages/game/src/motion/doubleFrame.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB,GAAG,cAAc,CAAC;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAClD;AAED,sFAAsF;AACtF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,kBAAkB,EAAE,CAatF;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACtD;AAED,kGAAkG;AAClG,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,SAAS,aAAa,EAAE,EAAE,OAAO,SAAO,GAAG,kBAAkB,EAAE,CAYhH;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;CAC9C;AAED,gGAAgG;AAChG,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,kBAAkB,EAAE,CAWpF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,iBAAiB,CAOtN"}
@@ -0,0 +1,59 @@
1
+ /** Two skinned meshes bound to one skeleton in the same frame draw the pose twice. */
2
+ export function detectSharedSkeleton(draws) {
3
+ const bySkeleton = new Map();
4
+ for (const d of draws) {
5
+ if (d.skeletonId === undefined)
6
+ continue;
7
+ const list = bySkeleton.get(d.skeletonId) ?? [];
8
+ if (!list.includes(d.meshId))
9
+ list.push(d.meshId);
10
+ bySkeleton.set(d.skeletonId, list);
11
+ }
12
+ const out = [];
13
+ for (const [skeleton, meshes] of bySkeleton) {
14
+ if (meshes.length > 1)
15
+ out.push({ kind: "shared-skeleton", detail: `skeleton ${skeleton} drives ${meshes.length} meshes`, ids: meshes });
16
+ }
17
+ return out;
18
+ }
19
+ /** Two instances of the same model at nearly the same place read as a ghost or doubled player. */
20
+ export function detectCoincidentModels(instances, epsilon = 0.08) {
21
+ const out = [];
22
+ for (let i = 0; i < instances.length; i += 1) {
23
+ for (let j = i + 1; j < instances.length; j += 1) {
24
+ const a = instances[i];
25
+ const b = instances[j];
26
+ if (a.modelId !== b.modelId)
27
+ continue;
28
+ const d = Math.hypot(a.position[0] - b.position[0], a.position[1] - b.position[1], a.position[2] - b.position[2]);
29
+ if (d <= epsilon)
30
+ out.push({ kind: "coincident-model", detail: `${a.id} and ${b.id} (${a.modelId}) are ${d.toFixed(3)} m apart`, ids: [a.id, b.id] });
31
+ }
32
+ }
33
+ return out;
34
+ }
35
+ /** Override layers summing past 1, or one clip applied on two layers, give the doubled look. */
36
+ export function detectDoubleBlend(layers) {
37
+ const out = [];
38
+ const active = layers.filter((l) => l.weight > 1e-3);
39
+ const overrideSum = active.filter((l) => (l.blendMode ?? "override") === "override").reduce((s, l) => s + l.weight, 0);
40
+ if (overrideSum > 1.001)
41
+ out.push({ kind: "double-blend", detail: `override layers sum to ${overrideSum.toFixed(3)}`, ids: active.map((l) => l.name) });
42
+ const byClip = new Map();
43
+ for (const l of active)
44
+ byClip.set(l.clip, [...(byClip.get(l.clip) ?? []), l.name]);
45
+ for (const [clip, names] of byClip) {
46
+ if (names.length > 1)
47
+ out.push({ kind: "double-blend", detail: `clip ${clip} is applied on ${names.length} layers`, ids: names });
48
+ }
49
+ return out;
50
+ }
51
+ export function checkDoubleFrame(input) {
52
+ const findings = [
53
+ ...detectSharedSkeleton(input.draws ?? []),
54
+ ...detectCoincidentModels(input.instances ?? [], input.epsilon),
55
+ ...detectDoubleBlend(input.layers ?? [])
56
+ ];
57
+ return { ok: findings.length === 0, findings };
58
+ }
59
+ //# sourceMappingURL=doubleFrame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doubleFrame.js","sourceRoot":"","sources":["../../../../../packages/game/src/motion/doubleFrame.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface FootSlideOptions {
2
+ /** A foot counts as planted when it is within this height of the ground (default 0.06 m). */
3
+ readonly plantedHeight?: number;
4
+ /** Planted foot horizontal speed limit in m/s (default 0.15). */
5
+ readonly threshold?: number;
6
+ /** Minimum foot lift range in metres expected when the body moves faster than `movingSpeed` (default 0.03). */
7
+ readonly minLift?: number;
8
+ readonly movingSpeed?: number;
9
+ }
10
+ export interface FootSlideReport {
11
+ readonly samples: number;
12
+ readonly plantedSamples: number;
13
+ readonly maxPlantedSpeed: number;
14
+ readonly meanPlantedSpeed: number;
15
+ readonly p95PlantedSpeed: number;
16
+ /** Highest minus lowest foot height seen while the body was moving. */
17
+ readonly liftRange: number;
18
+ /** The body moved but the foot never lifted: legs are not stepping. */
19
+ readonly notStepping: boolean;
20
+ readonly passed: boolean;
21
+ }
22
+ export interface FootSlideMeter {
23
+ feed(timeSeconds: number, foot: readonly [number, number, number], extra?: {
24
+ readonly groundHeight?: number;
25
+ readonly bodySpeed?: number;
26
+ }): void;
27
+ report(): FootSlideReport;
28
+ reset(): void;
29
+ }
30
+ /** Objective version of "he is just sliding": world speed of a planted foot, plus a legs-not-stepping check. */
31
+ export declare function createFootSlideMeter(options?: FootSlideOptions): FootSlideMeter;
32
+ //# sourceMappingURL=footSlide.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"footSlide.d.ts","sourceRoot":"","sources":["../../../../../packages/game/src/motion/footSlide.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,6FAA6F;IAC7F,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,+GAA+G;IAC/G,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,uEAAuE;IACvE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,uEAAuE;IACvE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAClJ,MAAM,IAAI,eAAe,CAAC;IAC1B,KAAK,IAAI,IAAI,CAAC;CACf;AAED,gHAAgH;AAChH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,gBAAqB,GAAG,cAAc,CAyDnF"}
@@ -0,0 +1,59 @@
1
+ /** Objective version of "he is just sliding": world speed of a planted foot, plus a legs-not-stepping check. */
2
+ export function createFootSlideMeter(options = {}) {
3
+ const plantedHeight = options.plantedHeight ?? 0.06;
4
+ const threshold = options.threshold ?? 0.15;
5
+ const minLift = options.minLift ?? 0.03;
6
+ const movingSpeed = options.movingSpeed ?? 0.5;
7
+ let prev;
8
+ let speeds = [];
9
+ let samples = 0;
10
+ let loLift = Number.POSITIVE_INFINITY;
11
+ let hiLift = Number.NEGATIVE_INFINITY;
12
+ let movingSamples = 0;
13
+ return {
14
+ feed(t, foot, extra) {
15
+ const ground = extra?.groundHeight ?? 0;
16
+ const h = foot[1] - ground;
17
+ const planted = h <= plantedHeight;
18
+ samples += 1;
19
+ if ((extra?.bodySpeed ?? 0) >= movingSpeed) {
20
+ movingSamples += 1;
21
+ loLift = Math.min(loLift, h);
22
+ hiLift = Math.max(hiLift, h);
23
+ }
24
+ if (prev !== undefined && planted && prev.planted && t > prev.t) {
25
+ const dx = foot[0] - prev.p[0];
26
+ const dz = foot[2] - prev.p[2];
27
+ speeds.push(Math.hypot(dx, dz) / (t - prev.t));
28
+ }
29
+ prev = { t, p: foot, planted };
30
+ },
31
+ report() {
32
+ const sorted = [...speeds].sort((a, b) => a - b);
33
+ const max = sorted.length ? sorted[sorted.length - 1] : 0;
34
+ const mean = sorted.length ? sorted.reduce((s, v) => s + v, 0) / sorted.length : 0;
35
+ const p95 = sorted.length ? sorted[Math.min(sorted.length - 1, Math.floor(sorted.length * 0.95))] : 0;
36
+ const liftRange = movingSamples > 0 ? hiLift - loLift : 0;
37
+ const notStepping = movingSamples > 5 && liftRange < minLift;
38
+ return {
39
+ samples,
40
+ plantedSamples: sorted.length,
41
+ maxPlantedSpeed: max,
42
+ meanPlantedSpeed: mean,
43
+ p95PlantedSpeed: p95,
44
+ liftRange,
45
+ notStepping,
46
+ passed: !notStepping && p95 <= threshold
47
+ };
48
+ },
49
+ reset() {
50
+ prev = undefined;
51
+ speeds = [];
52
+ samples = 0;
53
+ loLift = Number.POSITIVE_INFINITY;
54
+ hiLift = Number.NEGATIVE_INFINITY;
55
+ movingSamples = 0;
56
+ }
57
+ };
58
+ }
59
+ //# sourceMappingURL=footSlide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"footSlide.js","sourceRoot":"","sources":["../../../../../packages/game/src/motion/footSlide.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,206 @@
1
+ export type HandBounceVec3 = readonly [number, number, number];
2
+ export interface HandBounceGait {
3
+ /** Seconds per bounce. */
4
+ readonly period: number;
5
+ /** Palm height above the floor at the meet (top of the bounce). */
6
+ readonly palmTop: number;
7
+ /** Palm height above the floor at the push (lowest the hand is asked to reach). */
8
+ readonly palmPush: number;
9
+ }
10
+ export interface HandBounceOptions {
11
+ /** Which hand bounces the ball. Mirrors the overlay's bone roles. Default "right". */
12
+ readonly hand?: "left" | "right";
13
+ /** Default 0.13 (a basketball). The ball centre is on the floor plus this radius at the bounce. */
14
+ readonly ballRadius?: number;
15
+ /** World Y of the floor. Palm heights are relative to it. Default 0. */
16
+ readonly floorY?: number;
17
+ /** How far below the shoulder the arm alone can reach. Palm targets are clamped to it. Default 0.55. */
18
+ readonly armReach?: number;
19
+ /** Palm centroid rides this far above the ball crown while in contact. Default 0.09. */
20
+ readonly ballGap?: number;
21
+ /** Standing profile; defaults are the Aura Hoops numbers (0.46 s, palm 1.02 to 0.62 m). */
22
+ readonly standing?: Partial<HandBounceGait>;
23
+ /** Running profile (lower apex, shorter period); defaults 0.30 s, palm 0.92 to 0.60 m. */
24
+ readonly running?: Partial<HandBounceGait>;
25
+ /** Horizontal speed (m/s) above which the running profile applies. Default 0.45. */
26
+ readonly runSpeed?: number;
27
+ /** Skeleton bone names; the overlay then names the bones that actually exist. */
28
+ readonly boneNames?: readonly string[];
29
+ /** Phase landmarks of one bounce (0 = palm meets ball at the top). */
30
+ readonly phases?: Partial<HandBouncePhases>;
31
+ }
32
+ export interface HandBouncePhases {
33
+ /** Palm and ball ride together down to here. Default 0.35. */
34
+ readonly rideEnd: number;
35
+ /** The palm turns around here while the ball keeps going down. Default 0.60. */
36
+ readonly palmTurn: number;
37
+ /** The ball meets the floor here. Default 0.66. */
38
+ readonly floorAt: number;
39
+ /** The palm is back on the ball and carries it again from here. Default 0.92. */
40
+ readonly catchFrom: number;
41
+ }
42
+ export interface HandBounceConfig {
43
+ readonly hand: "left" | "right";
44
+ readonly ballRadius: number;
45
+ readonly floorY: number;
46
+ readonly armReach: number;
47
+ readonly ballGap: number;
48
+ readonly standing: HandBounceGait;
49
+ readonly running: HandBounceGait;
50
+ readonly runSpeed: number;
51
+ readonly phases: HandBouncePhases;
52
+ /** Ball centre height at the floor contact. */
53
+ readonly floorBallY: number;
54
+ }
55
+ export interface HandBounceCycle {
56
+ /** Palm target height (world Y). */
57
+ readonly palmY: number;
58
+ /** Ball centre height following the cycle (before it is retargeted to the rendered palm). */
59
+ readonly ballY: number;
60
+ /** 0 to 1: how hard the body works into the push (crouch for a standing handler, waist bend for a runner). */
61
+ readonly effort: number;
62
+ }
63
+ export declare function resolveHandBounceConfig(options?: HandBounceOptions): HandBounceConfig;
64
+ /** Palm height, ball height and body effort for phase `t` (0..1). `shoulderY` is the live world Y of the dribbling shoulder. */
65
+ export declare function handBounceCycle(config: HandBounceConfig, t: number, shoulderY: number, moving?: boolean): HandBounceCycle;
66
+ /**
67
+ * Ball centre height for phase `t`. `palmY` is the palm the ball rides while in contact (pass the RENDERED palm so the ball
68
+ * cannot leave a hand that could not follow its target); `releaseY` is the ball height when it leaves the palm and `catchY`
69
+ * the height of the palm that receives it. In the air the ball falls to the floor and rebounds, so the bounce point is always
70
+ * `config.floorBallY`.
71
+ */
72
+ export declare function handBounceBallY(config: HandBounceConfig, t: number, palmY: number, releaseY: number, catchY: number): number;
73
+ /**
74
+ * 1 while the palm is on the ball (riding down, and the catch at the top), 0 while the ball is free in the air. Anything that
75
+ * offsets the ball from the palm (stride lead, outward nudge) is scaled by `1 - weight`, so the ball is glued to the palm at the
76
+ * contact points however fast the handler runs.
77
+ */
78
+ export declare function handBounceContactWeight(config: HandBounceConfig, phase: number): number;
79
+ /** Horizontal ball position: on the palm at contact, drifting ahead with the handler's stride only while the ball is in the air. */
80
+ export declare function handBounceBallXZ(config: HandBounceConfig, palm: HandBounceVec3, holder: {
81
+ readonly x: number;
82
+ readonly z: number;
83
+ readonly vx: number;
84
+ readonly vz: number;
85
+ }, phase: number): {
86
+ x: number;
87
+ z: number;
88
+ };
89
+ /** Clamp a palm target into the arm's reach sphere around the shoulder (a target the arm cannot reach makes the hand miss the ball). */
90
+ export declare function clampPalmReach(shoulder: HandBounceVec3, target: HandBounceVec3, reach: number): [number, number, number];
91
+ /** Upper-body pitch angles (radians, forward positive) for a handler bouncing the ball: stationary handlers crouch into the push, runners bend at the waist. */
92
+ export declare function handBounceOverlayAngles(effort: number, moving: boolean, leanScale?: number): {
93
+ spine: number;
94
+ chest: number;
95
+ head: number;
96
+ };
97
+ export interface HandBounceOverlayBone {
98
+ /** Pitch about the actor's local X (radians, positive bends forward over the ball). */
99
+ readonly pitch: number;
100
+ }
101
+ export interface HandBounceOverlay {
102
+ /** "overlay" for a runner (apply on top of the locomotion clip), "pose" for a stationary handler (replace the pose). */
103
+ readonly mode: "overlay" | "pose";
104
+ /** Upper-body bones only. Leg, hip and foot bones are never named, so the clip keeps owning the stride. */
105
+ readonly bones: Readonly<Record<string, HandBounceOverlayBone>>;
106
+ readonly effort: number;
107
+ /** Bone names for the dribbling arm (resolved against `boneNames` when given) for the game's arm solver. */
108
+ readonly arm: {
109
+ readonly upper: string;
110
+ readonly forearm: string;
111
+ };
112
+ }
113
+ export interface HandBounceInput {
114
+ /** Horizontal speed in m/s or an explicit flag. */
115
+ readonly moving?: boolean;
116
+ readonly speed?: number;
117
+ /** World Y of the dribbling shoulder (live from the rig). */
118
+ readonly shoulderY: number;
119
+ /** The palm as rendered this frame, if the rig is live; the ball rides it. Without it the cycle's palm height is used. */
120
+ readonly palm?: HandBounceVec3;
121
+ readonly holder: {
122
+ readonly x: number;
123
+ readonly z: number;
124
+ readonly vx: number;
125
+ readonly vz: number;
126
+ };
127
+ /** Dead ball (check, inbound): phase is held at the meet and the ball sits in the palm. */
128
+ readonly hold?: boolean;
129
+ }
130
+ export interface HandBounceFrame {
131
+ readonly phase: number;
132
+ readonly moving: boolean;
133
+ readonly contact: number;
134
+ readonly effort: number;
135
+ readonly palmY: number;
136
+ readonly ball: [number, number, number];
137
+ readonly floorContact: boolean;
138
+ }
139
+ export interface HandBounceState {
140
+ readonly phase: number;
141
+ readonly moving: boolean;
142
+ readonly contact: number;
143
+ readonly effort: number;
144
+ readonly palmY: number;
145
+ readonly ball: readonly [number, number, number];
146
+ readonly releaseY: number;
147
+ readonly floorContact: boolean;
148
+ readonly active: boolean;
149
+ }
150
+ export interface HandBounceRelease {
151
+ readonly position: [number, number, number];
152
+ /** Finite-difference velocity of the ball at the hand: hand it to the pass or shot so the ball leaves without a pop. */
153
+ readonly velocity: [number, number, number];
154
+ }
155
+ export interface HandBounce {
156
+ readonly config: HandBounceConfig;
157
+ /** Advance one fixed step (dt > 0, no wall clock) and place the ball. */
158
+ step(dt: number, input: HandBounceInput): HandBounceFrame;
159
+ state(): HandBounceState;
160
+ /** Palm-free recipe for the body: waist bend, shoulder drop, head. Call after step(). */
161
+ overlay(leanScale?: number): HandBounceOverlay;
162
+ /** Leave the hand: current position and velocity for a pass, shot or drop. Stops the cycle. */
163
+ release(): HandBounceRelease;
164
+ /** Take a loose ball: the cycle resumes at the catch so the palm receives the ball where it is. */
165
+ pickup(ball: HandBounceVec3): void;
166
+ reset(): void;
167
+ }
168
+ export declare function createHandBounce(options?: HandBounceOptions): HandBounce;
169
+ export interface HandBounceSample {
170
+ readonly phase: number;
171
+ readonly palm: HandBounceVec3;
172
+ readonly ball: HandBounceVec3;
173
+ /** False when the ball is not in dribble state (loose, shot, pass): such samples are skipped. */
174
+ readonly dribbling?: boolean;
175
+ }
176
+ export interface HandBounceReport {
177
+ readonly samples: number;
178
+ /** Max palm-to-ball distance at the meet and the catch (m). */
179
+ readonly meetMax: number;
180
+ /** Max palm-to-ball distance at the floor contact (m); NaN when no sample touched the floor. */
181
+ readonly floorContactMax: number;
182
+ /** Highest palm height at the floor contact (m above the floor). */
183
+ readonly floorContactPalmHeightMax: number;
184
+ /** Lowest ball centre minus the ball radius over the floor: 0 when the ball bounces exactly on the floor. */
185
+ readonly floorError: number;
186
+ /** Max palm-to-ball distance over every dribble sample. */
187
+ readonly maxDistance: number;
188
+ readonly floorSamples: number;
189
+ readonly meetSamples: number;
190
+ }
191
+ export interface HandBounceLimits {
192
+ readonly meet: number;
193
+ readonly floorContact: number;
194
+ readonly floorError: number;
195
+ readonly maxDistance: number;
196
+ }
197
+ /** Limits the Aura Hoops dribble is held to. */
198
+ export declare const DEFAULT_HAND_BOUNCE_LIMITS: HandBounceLimits;
199
+ /** Probe: feed per-frame palm and ball world positions of a dribble; returns the distances the game must keep small. Call it from QA hooks and tools/game-checks. */
200
+ export declare function measureHandBall(samples: readonly HandBounceSample[], options?: HandBounceOptions & {
201
+ readonly limits?: Partial<HandBounceLimits>;
202
+ }): HandBounceReport & {
203
+ readonly ok: boolean;
204
+ readonly failures: readonly string[];
205
+ };
206
+ //# sourceMappingURL=handBounce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handBounce.d.ts","sourceRoot":"","sources":["../../../../../packages/game/src/motion/handBounce.ts"],"names":[],"mappings":"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"}