@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,410 @@
1
+ /**
2
+ * `aura3d assets resolve "<need>"`: a build-time decision ladder for one asset need.
3
+ *
4
+ * Rungs, in order: (1) an asset already admitted in this project, (2) a directly
5
+ * downloadable, licence-clear model, texture or HDRI from open sources (Khronos samples,
6
+ * Poly Haven, ambientCG, the jsDelivr CC0 mirror), (3) Meshy generation from a text
7
+ * prompt, only with `--allow meshy` and a budget that covers the estimate, (4) a
8
+ * procedural recipe the agent pastes into its scene (primitives, built in code like
9
+ * three.js geometry). Nothing is fetched or generated at runtime: every rung that
10
+ * produces a file goes through admission (sha256, provenance, licence) and typegen.
11
+ */
12
+ import { spawnSync } from "node:child_process";
13
+ import { existsSync, mkdtempSync, readdirSync } from "node:fs";
14
+ import { tmpdir } from "node:os";
15
+ import { join } from "node:path";
16
+ import { readAssetManifest } from "./asset-manifest.js";
17
+ import { runResolve } from "./pull-bridge.js";
18
+ import { runSearch } from "./pull-bridge/search.js";
19
+ export const LADDER_ROLES = ["hero", "prop", "background", "character", "texture", "hdri"];
20
+ /** Meshy credits per role: preview 20 + refine 10; characters add rig 5 + one animation 3. */
21
+ export const MESHY_CREDIT_ESTIMATE = {
22
+ hero: 30,
23
+ prop: 30,
24
+ background: 30,
25
+ character: 38,
26
+ texture: 10,
27
+ hdri: 0,
28
+ };
29
+ /** Triangle budgets per role (docs/agents/asset-workflow.md). */
30
+ export const ROLE_TRIANGLE_BUDGET = {
31
+ hero: 40_000,
32
+ prop: 6_000,
33
+ background: 15_000,
34
+ character: 30_000,
35
+ texture: undefined,
36
+ hdri: undefined,
37
+ };
38
+ const STOP_WORDS = new Set([
39
+ "a", "an", "the", "of", "for", "with", "and", "or", "in", "on", "to", "my", "some",
40
+ "low", "poly", "lowpoly", "high", "detailed", "simple", "stylised", "stylized", "realistic",
41
+ "small", "large", "big", "tiny", "old", "new", "model", "asset", "glb", "gltf", "3d", "game", "pbr",
42
+ "tall", "short", "wide", "narrow", "round", "square", "corner", "straight", "end", "double", "single", "half",
43
+ "top", "bottom", "left", "right", "broken", "damaged", "dark", "variant", "alt", "lod", "pure", "pack", "kit",
44
+ "huge", "giant", "mini", "medium", "big", "little",
45
+ ]);
46
+ /** Singular form good enough for matching English asset nouns. */
47
+ export function singular(word) {
48
+ if (word.length > 4 && word.endsWith("ies"))
49
+ return `${word.slice(0, -3)}y`;
50
+ if (word.length > 4 && /(ches|shes|xes|sses)$/.test(word))
51
+ return word.slice(0, -2);
52
+ if (word.length > 3 && word.endsWith("s") && !word.endsWith("ss"))
53
+ return word.slice(0, -1);
54
+ return word;
55
+ }
56
+ function tokens(text) {
57
+ return text
58
+ .toLowerCase()
59
+ .replace(/([a-z])([A-Z])/g, "$1 $2")
60
+ .split(/[^a-z0-9]+/)
61
+ .filter((token) => token.length > 0);
62
+ }
63
+ /**
64
+ * The head noun of an English need: the last content word. "wooden bridge" -> "bridge",
65
+ * "street lamp" -> "lamp", "oak tree" -> "tree", "sports car" -> "car".
66
+ */
67
+ export function headNoun(need) {
68
+ const words = tokens(need).filter((word) => !STOP_WORDS.has(word) && !/^\d+$/.test(word));
69
+ const last = words.at(-1);
70
+ return last === undefined ? undefined : singular(last);
71
+ }
72
+ /** True when `text` (a title, id or tag list) contains the head noun. */
73
+ export function mentionsNoun(text, noun) {
74
+ const words = new Set(tokens(text).map(singular));
75
+ return words.has(noun) || tokens(text).some((word) => word.startsWith(noun) && word.length <= noun.length + 3);
76
+ }
77
+ /**
78
+ * True when a candidate's own title is the needed thing, not merely mentions it: the title's head
79
+ * noun must be the need's noun. "Bridge Pillar" is a pillar, not a bridge; "Garbage Truck" from a
80
+ * "car-kit" pack is a truck, not a car. Precision over recall: a miss falls through to the next rung.
81
+ */
82
+ export function titleIsNoun(title, noun) {
83
+ const head = headNoun(title.replace(/\([^)]*\)/g, " "));
84
+ if (head === noun)
85
+ return true;
86
+ // "Belfast Sunset (Pure Sky)": the parenthesised qualifier names the kind.
87
+ const qualifier = /\(([^)]*)\)/.exec(title)?.[1];
88
+ return qualifier !== undefined && headNoun(qualifier) === noun;
89
+ }
90
+ function camelName(need) {
91
+ const words = tokens(need).filter((word) => !STOP_WORDS.has(word));
92
+ const base = (words.length > 0 ? words : ["asset"]).slice(-3);
93
+ const name = base.map((word, index) => (index === 0 ? word : word[0].toUpperCase() + word.slice(1))).join("");
94
+ return /^[a-z_]/.test(name) ? name : `asset${name[0].toUpperCase()}${name.slice(1)}`;
95
+ }
96
+ function entryText(entry) {
97
+ return [entry.id, entry.source, ...(entry.nodeNames ?? []), entry.suitabilityReason ?? ""].join(" ");
98
+ }
99
+ function profileFor(role) {
100
+ if (role === "character")
101
+ return "animation-character";
102
+ return "general";
103
+ }
104
+ function searchQuery(need, role) {
105
+ if (role === "texture" && !/\btextures?\b/i.test(need))
106
+ return `${need} texture`;
107
+ if (role === "hdri" && !/\bhdri?\b/i.test(need))
108
+ return `${need} hdri`;
109
+ return need;
110
+ }
111
+ function fitsRole(candidate, role) {
112
+ if (role === "texture" && candidate.format !== undefined && candidate.format !== "texture-set" && candidate.format !== "image") {
113
+ return `format ${candidate.format} is not a texture`;
114
+ }
115
+ if (role === "hdri" && candidate.format !== undefined && candidate.format !== "hdr")
116
+ return `format ${candidate.format} is not an HDRI`;
117
+ if ((role === "hero" || role === "prop" || role === "background" || role === "character") && (candidate.format === "texture-set" || candidate.format === "image" || candidate.format === "hdr")) {
118
+ return `format ${candidate.format} is not a model`;
119
+ }
120
+ const budget = ROLE_TRIANGLE_BUDGET[role];
121
+ if (budget !== undefined && typeof candidate.triangles === "number" && candidate.triangles > budget) {
122
+ return `${candidate.triangles} triangles exceeds the ${role} budget of ${budget}`;
123
+ }
124
+ return undefined;
125
+ }
126
+ export function formatSize(bytes) {
127
+ if (bytes === undefined)
128
+ return "size unknown";
129
+ if (bytes >= 1024 * 1024)
130
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
131
+ return `${Math.max(1, Math.round(bytes / 1024))} KB`;
132
+ }
133
+ export function describeCandidate(candidate) {
134
+ const triangles = typeof candidate.triangles === "number" ? `${candidate.triangles.toLocaleString("en-US")} triangles` : "triangles unknown";
135
+ return `${candidate.title} (${candidate.id}, ${candidate.license}, ${triangles}, ${formatSize(candidate.sizeBytes)})`;
136
+ }
137
+ const defaultMeshyRunner = ({ prompt, outDir, budget, env }) => {
138
+ const command = env["AURA3D_MESHY_CMD"];
139
+ if (!command) {
140
+ return { ok: false, message: "AURA3D_MESHY_CMD is not set: run the printed Meshy commands yourself, then `aura3d assets import-meshy`." };
141
+ }
142
+ // No shell: the prompt is passed as a single argument, never interpolated into a command line.
143
+ const run = spawnSync(command, ["--prompt", prompt, "--out", outDir, "--budget", String(budget)], { env, encoding: "utf8" });
144
+ if (run.status !== 0)
145
+ return { ok: false, message: `${command} exited ${String(run.status)}: ${(run.stderr || run.stdout || "").trim().slice(0, 400)}` };
146
+ return { ok: true, message: (run.stdout || "").trim().slice(0, 400) };
147
+ };
148
+ export function meshyPrompt(need, role) {
149
+ const base = need.trim();
150
+ const style = "stylised, clean topology, game-ready, matte flat colours, no text, no logos, no brand marks";
151
+ if (role === "character")
152
+ return `${base}, single humanoid character in A-pose, full body, ${style}`;
153
+ if (role === "texture")
154
+ return `${base}, seamless tileable surface`;
155
+ return `${base}, single solid closed object, ${style}`;
156
+ }
157
+ export async function runResolveLadder(options) {
158
+ const need = options.need.trim();
159
+ if (!need)
160
+ throw new Error('Usage: aura3d assets resolve "<need>" [--name <id>] [--role hero|prop|background|character|texture|hdri] [--budget credits] [--allow meshy] [--dry-run]');
161
+ const projectDir = options.projectDir ?? process.cwd();
162
+ const env = options.env ?? process.env;
163
+ const role = options.role ?? "prop";
164
+ const name = options.name ?? camelName(need);
165
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name))
166
+ throw new Error(`Aura3D resolve failed: --name must be a valid identifier (got "${name}").`);
167
+ const dryRun = options.dryRun === true;
168
+ const noun = headNoun(need);
169
+ const skipped = [];
170
+ const warnings = [];
171
+ const messages = [];
172
+ const base = { need, headNoun: noun, role, dryRun, name, skipped, warnings, messages };
173
+ // Rung 1: already admitted in this project.
174
+ const manifest = (options.readManifest ?? readAssetManifest)(projectDir);
175
+ const wantsModel = role !== "texture" && role !== "hdri";
176
+ const local = noun === undefined ? undefined : manifest.assets.find((entry) => {
177
+ if (wantsModel && entry.type !== "model")
178
+ return false;
179
+ if (role === "texture" && entry.type !== "texture")
180
+ return false;
181
+ if (role === "hdri" && entry.type !== "environment" && entry.format !== "hdr")
182
+ return false;
183
+ return entry.id === name || mentionsNoun(entryText(entry), noun);
184
+ });
185
+ if (local) {
186
+ messages.push(`Use the admitted asset: model(assets.${local.id}) (${formatSize(local.sizeBytes)}, ${local.hash}).`);
187
+ return { ...base, ok: true, chosen: "project", reason: `"${local.id}" is already admitted in this project and matches "${noun}".`, costCredits: 0, projectAsset: { id: local.id, url: local.url, sizeBytes: local.sizeBytes } };
188
+ }
189
+ skipped.push({ rung: "project", reason: noun === undefined ? "the need has no noun to match" : `no admitted asset matches "${noun}"` });
190
+ // Rung 2: open, licence-clear sources.
191
+ const query = searchQuery(need, role);
192
+ let search;
193
+ try {
194
+ search = await (options.searchFn ?? runSearch)({ query, constraints: { ...options.constraints, profile: options.constraints?.profile ?? profileFor(role) } });
195
+ for (const warning of search.warnings)
196
+ warnings.push(warning);
197
+ }
198
+ catch (error) {
199
+ warnings.push(`open-source search failed: ${error.message}`);
200
+ }
201
+ const rejected = [];
202
+ const candidate = search?.candidates.find((line) => {
203
+ if (!line.autoPullable)
204
+ return false;
205
+ if (noun !== undefined && !mentionsNoun(line.title, noun)) {
206
+ rejected.push(`${line.title}: does not mention "${noun}"`);
207
+ return false;
208
+ }
209
+ const misfit = fitsRole(line, role);
210
+ if (misfit) {
211
+ rejected.push(`${line.title}: ${misfit}`);
212
+ return false;
213
+ }
214
+ if (noun !== undefined && !titleIsNoun(line.title, noun)) {
215
+ rejected.push(`${line.title}: is a ${headNoun(line.title.replace(/\([^)]*\)/g, " ")) ?? "different thing"}, not a ${noun}`);
216
+ return false;
217
+ }
218
+ return true;
219
+ });
220
+ if (candidate) {
221
+ messages.push(`Open source: ${describeCandidate(candidate)}.`);
222
+ if (dryRun) {
223
+ messages.push(`Dry run: would admit it as assets.${name} with sha256, provenance and licence.`);
224
+ return { ...base, ok: true, chosen: "open-source", reason: `licence-clear match for "${noun ?? need}" from ${candidate.source}`, costCredits: 0, candidate };
225
+ }
226
+ const resolved = await (options.resolveFn ?? runResolve)({ query, name, projectDir, candidateId: candidate.id, constraints: { ...options.constraints, profile: options.constraints?.profile ?? profileFor(role) } });
227
+ for (const message of resolved.messages)
228
+ messages.push(message);
229
+ for (const warning of resolved.warnings)
230
+ warnings.push(warning);
231
+ if (resolved.ok) {
232
+ return { ...base, ok: true, chosen: "open-source", reason: `licence-clear match for "${noun ?? need}" from ${candidate.source}`, costCredits: 0, candidate, resolve: resolved };
233
+ }
234
+ skipped.push({ rung: "open-source", reason: `admission of ${candidate.id} failed` });
235
+ }
236
+ else {
237
+ const detail = rejected.length > 0 ? `; rejected: ${rejected.slice(0, 3).join("; ")}` : "";
238
+ skipped.push({ rung: "open-source", reason: `no licence-clear, downloadable match for "${noun ?? need}"${detail}` });
239
+ }
240
+ // Rung 3: Meshy, only when allowed and within budget.
241
+ const estimate = MESHY_CREDIT_ESTIMATE[role];
242
+ const prompt = meshyPrompt(need, role);
243
+ if (role === "hdri") {
244
+ skipped.push({ rung: "meshy", reason: "Meshy does not generate HDRIs" });
245
+ }
246
+ else if (!options.allowMeshy) {
247
+ skipped.push({ rung: "meshy", reason: `needs --allow meshy (estimate ${estimate} credits)` });
248
+ }
249
+ else if ((options.budget ?? 0) < estimate) {
250
+ skipped.push({ rung: "meshy", reason: `--budget ${options.budget ?? 0} is below the ${estimate}-credit estimate` });
251
+ }
252
+ else {
253
+ const outDir = mkdtempSync(join(tmpdir(), "aura3d-meshy-"));
254
+ const commands = [
255
+ `<your Meshy generator> --prompt ${JSON.stringify(prompt)} --out ${outDir} --budget ${estimate}`,
256
+ `aura3d assets import-meshy --input ${outDir} --name ${name} --role ${role === "character" ? "character" : "prop"}`,
257
+ "aura3d assets validate && aura3d assets typegen",
258
+ ];
259
+ if (dryRun) {
260
+ messages.push(`Dry run: would generate with Meshy for about ${estimate} credits.`);
261
+ return { ...base, ok: true, chosen: "meshy", reason: `no project or open-source match; Meshy allowed within budget`, costCredits: 0, meshy: { prompt, estimateCredits: estimate, commands, ran: false } };
262
+ }
263
+ const runner = options.meshyRunner ?? defaultMeshyRunner;
264
+ const ran = runner({ prompt, outDir, budget: estimate, env });
265
+ messages.push(ran.message);
266
+ const produced = existsSync(outDir) && readdirSync(outDir).some((file) => /\.glb$/i.test(file));
267
+ if (ran.ok && produced) {
268
+ messages.push(`Generated into ${outDir}. Admit it: ${commands[1]}, then ${commands[2]}.`);
269
+ return { ...base, ok: true, chosen: "meshy", reason: "no project or open-source match; generated with Meshy within budget", costCredits: estimate, meshy: { prompt, estimateCredits: estimate, commands: commands.slice(1), ran: true } };
270
+ }
271
+ skipped.push({ rung: "meshy", reason: ran.ok ? "the generator produced no GLB" : ran.message });
272
+ messages.push(`Meshy plan (not run): ${commands.join(" then ")}`);
273
+ }
274
+ // Rung 4: procedural recipe for props; characters, textures and HDRIs have none.
275
+ if (role === "character" || role === "texture" || role === "hdri") {
276
+ skipped.push({ rung: "procedural", reason: `no procedural recipe for a ${role}` });
277
+ messages.push(role === "character"
278
+ ? "No character found. Generate one with --allow meshy --budget 40, or admit a licensed file with `aura3d assets add`."
279
+ : `No ${role} found. Admit a licensed file with \`aura3d assets add --type ${role === "hdri" ? "environment" : "texture"}\`.`);
280
+ return { ...base, ok: false, chosen: "none", reason: `nothing in the project or open sources, Meshy not run, and no procedural recipe for a ${role}`, costCredits: 0 };
281
+ }
282
+ const procedural = proceduralRecipe(need, name);
283
+ if (pickRecipeOrUndefined(need) === undefined) {
284
+ messages.push(`No recipe for a ${noun ?? "need like this"}: the box below is a placeholder. For the real thing run with --allow meshy --budget ${estimate || 30}, or admit a licensed file with \`aura3d assets add\`.`);
285
+ }
286
+ messages.push(`Build it in code (${procedural.recipe} recipe): paste the snippet and add \`${name}\` to your scene.`);
287
+ return { ...base, ok: true, chosen: "procedural", reason: "no admitted, open-source or generated asset; build from primitives", costCredits: 0, procedural };
288
+ }
289
+ /** Keyword -> parts, in metres, standing on y = 0. */
290
+ export const PROCEDURAL_RECIPES = {
291
+ crate: [{ shape: "box", size: [1, 1, 1], color: "#8a5a2b", roughness: 0.85, at: [0, 0.5, 0] }],
292
+ barrel: [
293
+ { shape: "cylinder", size: [0.7, 1, 0.7], color: "#7a4a24", roughness: 0.8, at: [0, 0.5, 0] },
294
+ { shape: "cylinder", size: [0.74, 0.06, 0.74], color: "#3c3c40", metallic: 0.8, roughness: 0.4, at: [0, 0.2, 0] },
295
+ { shape: "cylinder", size: [0.74, 0.06, 0.74], color: "#3c3c40", metallic: 0.8, roughness: 0.4, at: [0, 0.8, 0] },
296
+ ],
297
+ table: [
298
+ { shape: "box", size: [1.6, 0.08, 0.9], color: "#9a6b3f", roughness: 0.7, at: [0, 0.74, 0] },
299
+ { shape: "box", size: [0.08, 0.7, 0.08], color: "#7a5230", at: [-0.7, 0.35, -0.35] },
300
+ { shape: "box", size: [0.08, 0.7, 0.08], color: "#7a5230", at: [0.7, 0.35, -0.35] },
301
+ { shape: "box", size: [0.08, 0.7, 0.08], color: "#7a5230", at: [-0.7, 0.35, 0.35] },
302
+ { shape: "box", size: [0.08, 0.7, 0.08], color: "#7a5230", at: [0.7, 0.35, 0.35] },
303
+ ],
304
+ chair: [
305
+ { shape: "box", size: [0.5, 0.06, 0.5], color: "#9a6b3f", at: [0, 0.45, 0] },
306
+ { shape: "box", size: [0.5, 0.5, 0.06], color: "#9a6b3f", at: [0, 0.73, -0.22] },
307
+ { shape: "box", size: [0.05, 0.45, 0.05], color: "#7a5230", at: [-0.21, 0.22, -0.21] },
308
+ { shape: "box", size: [0.05, 0.45, 0.05], color: "#7a5230", at: [0.21, 0.22, -0.21] },
309
+ { shape: "box", size: [0.05, 0.45, 0.05], color: "#7a5230", at: [-0.21, 0.22, 0.21] },
310
+ { shape: "box", size: [0.05, 0.45, 0.05], color: "#7a5230", at: [0.21, 0.22, 0.21] },
311
+ ],
312
+ tree: [
313
+ { shape: "cylinder", size: [0.3, 2, 0.3], color: "#5a3d24", roughness: 0.95, at: [0, 1, 0] },
314
+ { shape: "cone", params: { radius: 1.2, height: 2.6 }, color: "#3f7a3a", roughness: 0.9, at: [0, 3.2, 0] },
315
+ ],
316
+ rock: [
317
+ { shape: "sphere", size: 1.2, color: "#7d7a74", roughness: 1, at: [0, 0.4, 0] },
318
+ { shape: "sphere", size: 0.7, color: "#6f6c66", roughness: 1, at: [0.5, 0.25, 0.2] },
319
+ ],
320
+ fence: [
321
+ { shape: "box", size: [0.1, 1, 0.1], color: "#8b6a45", at: [-1, 0.5, 0] },
322
+ { shape: "box", size: [0.1, 1, 0.1], color: "#8b6a45", at: [0, 0.5, 0] },
323
+ { shape: "box", size: [0.1, 1, 0.1], color: "#8b6a45", at: [1, 0.5, 0] },
324
+ { shape: "box", size: [2.2, 0.1, 0.05], color: "#a07c52", at: [0, 0.75, 0] },
325
+ { shape: "box", size: [2.2, 0.1, 0.05], color: "#a07c52", at: [0, 0.35, 0] },
326
+ ],
327
+ lamp: [
328
+ { shape: "cylinder", size: [0.12, 3.2, 0.12], color: "#2e3238", metallic: 0.8, roughness: 0.4, at: [0, 1.6, 0] },
329
+ { shape: "box", size: [0.5, 0.12, 0.3], color: "#2e3238", metallic: 0.8, roughness: 0.4, at: [0.2, 3.25, 0] },
330
+ { shape: "sphere", size: 0.22, color: "#ffe9b0", roughness: 0.3, at: [0.35, 3.13, 0] },
331
+ ],
332
+ building: [
333
+ { shape: "box", size: [8, 12, 8], color: "#b9b2a6", roughness: 0.9, at: [0, 6, 0] },
334
+ { shape: "box", size: [8.4, 0.4, 8.4], color: "#6f6a62", at: [0, 12.2, 0] },
335
+ ],
336
+ car: [
337
+ { shape: "box", size: [1.8, 0.6, 4.2], color: "#c0392b", roughness: 0.5, metallic: 0.3, at: [0, 0.55, 0] },
338
+ { shape: "box", size: [1.6, 0.5, 2.2], color: "#2c3e50", roughness: 0.2, at: [0, 1.05, -0.2] },
339
+ { shape: "cylinder", size: [0.66, 0.24, 0.66], color: "#1b1b1b", at: [-0.9, 0.33, 1.3] },
340
+ { shape: "cylinder", size: [0.66, 0.24, 0.66], color: "#1b1b1b", at: [0.9, 0.33, 1.3] },
341
+ { shape: "cylinder", size: [0.66, 0.24, 0.66], color: "#1b1b1b", at: [-0.9, 0.33, -1.3] },
342
+ { shape: "cylinder", size: [0.66, 0.24, 0.66], color: "#1b1b1b", at: [0.9, 0.33, -1.3] },
343
+ ],
344
+ };
345
+ const RECIPE_ALIASES = {
346
+ box: "crate", chest: "crate", cask: "barrel", keg: "barrel", desk: "table", bench: "chair", stool: "chair",
347
+ pine: "tree", oak: "tree", bush: "tree", boulder: "rock", stone: "rock", wall: "fence", railing: "fence",
348
+ streetlight: "lamp", light: "lamp", lantern: "lamp", post: "lamp", house: "building", tower: "building", block: "building",
349
+ vehicle: "car", truck: "car", van: "car", taxi: "car", sedan: "car",
350
+ };
351
+ /** The best recipe for a need: the head noun, then any other word, then aliases; a crate as the fallback. */
352
+ export function pickRecipe(need) {
353
+ return pickRecipeOrUndefined(need) ?? "crate";
354
+ }
355
+ /** The recipe for a need, or undefined when no keyword or alias matches (the crate is then a placeholder). */
356
+ export function pickRecipeOrUndefined(need) {
357
+ const words = tokens(need).map(singular);
358
+ const ordered = [headNoun(need), ...words.reverse()].filter((word) => word !== undefined);
359
+ for (const word of ordered) {
360
+ if (PROCEDURAL_RECIPES[word])
361
+ return word;
362
+ const alias = RECIPE_ALIASES[word];
363
+ if (alias)
364
+ return alias;
365
+ }
366
+ return undefined;
367
+ }
368
+ function partCode(part, index, name) {
369
+ const options = [`name: "${name}-${index}"`];
370
+ if (part.size !== undefined)
371
+ options.push(`size: ${Array.isArray(part.size) ? `[${part.size.join(", ")}]` : String(part.size)}`);
372
+ if (part.params)
373
+ options.push(`params: { ${Object.entries(part.params).map(([key, value]) => `${key}: ${value}`).join(", ")} }`);
374
+ const pbr = [`color: "${part.color}"`];
375
+ if (part.roughness !== undefined)
376
+ pbr.push(`roughness: ${part.roughness}`);
377
+ if (part.metallic !== undefined)
378
+ pbr.push(`metallic: ${part.metallic}`);
379
+ options.push(`material: material.pbr({ ${pbr.join(", ")} })`);
380
+ return ` primitives.${part.shape}({ ${options.join(", ")} }).position(${part.at.join(", ")}),`;
381
+ }
382
+ export function proceduralRecipe(need, name) {
383
+ const matched = pickRecipeOrUndefined(need);
384
+ const recipe = matched ?? "crate";
385
+ const parts = PROCEDURAL_RECIPES[recipe];
386
+ const note = matched === undefined ? " PLACEHOLDER: no recipe matches this need; replace it with a real model before shipping." : " Tune sizes and colours.";
387
+ const lines = [
388
+ `import { group, material, primitives } from "../engine/index.js";`,
389
+ ``,
390
+ `// ${need.replace(/[\r\n*/]/g, " ")}: built from primitives (${recipe} recipe), metres, standing on y = 0.${note}`,
391
+ `export const ${name} = group("${name}", [`,
392
+ ...parts.map((part, index) => partCode(part, index, name)),
393
+ `]);`,
394
+ ];
395
+ return { recipe, snippet: lines.join("\n") };
396
+ }
397
+ export function printLadderReport(report, print = console.log) {
398
+ print(`Need: "${report.need}" (role ${report.role}${report.headNoun ? `, matching "${report.headNoun}"` : ""})`);
399
+ print(`Chosen: ${report.chosen}: ${report.reason}`);
400
+ for (const skip of report.skipped)
401
+ print(` skipped ${skip.rung}: ${skip.reason}`);
402
+ print(`Cost: ${report.costCredits} credits${report.dryRun ? " (dry run)" : ""}`);
403
+ for (const message of report.messages)
404
+ print(message);
405
+ if (report.procedural)
406
+ print(`\n${report.procedural.snippet}`);
407
+ for (const warning of report.warnings)
408
+ print(`warning: ${warning}`);
409
+ }
410
+ //# sourceMappingURL=resolve-ladder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-ladder.js","sourceRoot":"","sources":["../../../../packages/aura3d-cli/src/resolve-ladder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * `assets validate --skin`: poses a rigged GLB through the clips it ships and reports the defects that tore the Aura FC athletes:
3
+ * stretched triangles (the "sails" at the hips), thin long flaps, bad or distant skin weights, limb meshes that are not in the
4
+ * pose the skeleton assumes (modelled mid-stride and bound to a straight skeleton) and joint ranges no limb can reach.
5
+ */
6
+ import { type GlbData, type GltfAnimation, type Hierarchy, type SkinInfo, type SkinnedPrimitive, type WorldPose } from "./gltf.js";
7
+ export declare const SKIN_STRETCH = "SKIN_STRETCH";
8
+ export declare const SKIN_FLAP = "SKIN_FLAP";
9
+ export declare const SKIN_WEIGHT_SUM = "SKIN_WEIGHT_SUM";
10
+ export declare const SKIN_WEIGHT_DISTANT = "SKIN_WEIGHT_DISTANT";
11
+ export declare const SKIN_BIND_MISMATCH = "SKIN_BIND_MISMATCH";
12
+ export declare const SKIN_JOINT_RANGE = "SKIN_JOINT_RANGE";
13
+ export declare const SKIN_NO_SKIN = "SKIN_NO_SKIN";
14
+ export type SkinCode = typeof SKIN_STRETCH | typeof SKIN_FLAP | typeof SKIN_WEIGHT_SUM | typeof SKIN_WEIGHT_DISTANT | typeof SKIN_BIND_MISMATCH | typeof SKIN_JOINT_RANGE | typeof SKIN_NO_SKIN;
15
+ export interface SkinThresholds {
16
+ /** A triangle whose worst edge grows past this multiple of its rest length is counted (default 1.6). */
17
+ readonly stretchLimit: number;
18
+ /** A single triangle past this multiple always fails (default 2.5); between the two limits up to `stretchAllowTriangles` (or 0.1% of the triangles) only warn. */
19
+ readonly stretchHardLimit: number;
20
+ readonly stretchAllowTriangles: number;
21
+ /** Longest-edge floor of a flap, as a fraction of the model height (default 0.14). */
22
+ readonly flapEdgeFraction: number;
23
+ /** Area / longest-edge^2 below which a triangle is "thin" (equilateral is 0.43; default 0.08). */
24
+ readonly flapThin: number;
25
+ /** A limb bone whose vertices sit this far off its axis, as a fraction of the bone length, is a bind mismatch (default 0.34). */
26
+ readonly bindOffsetRatio: number;
27
+ /** Vertices with total weight outside 1 +- this fail (default 0.02). */
28
+ readonly weightSumTolerance: number;
29
+ /** An influence >= `distantMinWeight` on a bone farther than this fraction of the model height is "distant" (default 0.5). */
30
+ readonly distantFraction: number;
31
+ readonly distantMinWeight: number;
32
+ /** Humanoid joint ranges in degrees. */
33
+ readonly hipFlexMin: number;
34
+ readonly hipFlexMax: number;
35
+ readonly hipAbductionMax: number;
36
+ readonly kneeMax: number;
37
+ readonly thighTwistMax: number;
38
+ }
39
+ export declare const DEFAULT_SKIN_THRESHOLDS: SkinThresholds;
40
+ export interface SkinAnalysisOptions {
41
+ /** Clip names to pose (default: every animation in the file). */
42
+ readonly clips?: readonly string[];
43
+ /** Poses sampled per clip (default 10). */
44
+ readonly samples?: number;
45
+ readonly thresholds?: Partial<SkinThresholds>;
46
+ /** Codes reported as warnings instead of failures (default: SKIN_BIND_MISMATCH and SKIN_WEIGHT_DISTANT; their effect shows up as SKIN_STRETCH). */
47
+ readonly warnOnly?: readonly SkinCode[];
48
+ /** Report every code as a failure. */
49
+ readonly strict?: boolean;
50
+ /** Skip the check for materials matching this pattern (e.g. a rigid prop sharing the skin). */
51
+ readonly ignoreMaterials?: RegExp;
52
+ }
53
+ export interface SkinFinding {
54
+ readonly code: SkinCode;
55
+ readonly severity: "error" | "warning";
56
+ readonly message: string;
57
+ readonly primitive?: string;
58
+ readonly detail?: Record<string, unknown>;
59
+ }
60
+ export interface SkinPrimitiveReport {
61
+ readonly mesh: number;
62
+ readonly primitive: number;
63
+ readonly material: string;
64
+ readonly vertices: number;
65
+ readonly triangles: number;
66
+ readonly maxStretch: number;
67
+ readonly trianglesOverLimit: number;
68
+ readonly flaps: number;
69
+ readonly maxFlapEdge: number;
70
+ readonly weightSumBad: number;
71
+ readonly weightDistant: number;
72
+ }
73
+ export interface SkinMaterialReport {
74
+ readonly triangles: number;
75
+ readonly maxStretch: number;
76
+ readonly trianglesOverLimit: number;
77
+ readonly flaps: number;
78
+ }
79
+ export interface BindMismatchBone {
80
+ readonly bone: string;
81
+ readonly vertices: number;
82
+ readonly offset: number;
83
+ readonly boneLength: number;
84
+ readonly ratio: number;
85
+ }
86
+ export interface JointRangeRow {
87
+ readonly hipFlexMin: number;
88
+ readonly hipFlexMax: number;
89
+ readonly hipAbductionMax: number;
90
+ readonly kneeMax: number;
91
+ readonly kneeForwardFrames: number;
92
+ readonly thighTwistMax: number;
93
+ }
94
+ export interface SkinReport {
95
+ readonly ok: boolean;
96
+ readonly skinned: boolean;
97
+ readonly modelHeight: number;
98
+ readonly clips: readonly string[];
99
+ readonly samplesPerClip: number;
100
+ readonly thresholds: SkinThresholds;
101
+ readonly skins: readonly {
102
+ readonly index: number;
103
+ readonly jointCount: number;
104
+ readonly primitives: readonly SkinPrimitiveReport[];
105
+ }[];
106
+ readonly materials: Readonly<Record<string, SkinMaterialReport>>;
107
+ readonly bindMismatch: readonly BindMismatchBone[];
108
+ readonly jointRanges: Readonly<Record<string, JointRangeRow>> | null;
109
+ readonly findings: readonly SkinFinding[];
110
+ readonly failures: readonly string[];
111
+ readonly warnings: readonly string[];
112
+ readonly reasonCodes: readonly SkinCode[];
113
+ readonly messages: readonly string[];
114
+ }
115
+ /** Worst posed/rest edge stretch of every triangle over the sampled poses, per primitive, plus thin-flap data. */
116
+ export declare function samplePoses(glb: GlbData, hierarchy: Hierarchy, clips: readonly GltfAnimation[], samples: number): {
117
+ poses: WorldPose[];
118
+ clipOfPose: string[];
119
+ };
120
+ export declare function triangleStretch(skin: SkinInfo, prim: SkinnedPrimitive, poses: readonly WorldPose[], flapEdge: number, flapThin: number, flapOutlier?: number): {
121
+ worst: Float32Array;
122
+ flap: Uint8Array;
123
+ flapEdgeMax: number;
124
+ };
125
+ export interface HumanoidLegs {
126
+ readonly up: number;
127
+ readonly knee: number;
128
+ readonly foot: number;
129
+ }
130
+ /** Recognises Meshy/Mixamo/VRM-style leg bone names; returns null when the rig is not a recognised humanoid. */
131
+ export declare function findHumanoidLegs(hierarchy: Hierarchy): HumanoidLegs[] | null;
132
+ /** Hip/knee/twist ranges of the humanoid legs per clip (degrees); null when the rig is not a recognised humanoid. */
133
+ export declare function jointRanges(glb: GlbData, hierarchy: Hierarchy, clips: readonly GltfAnimation[], samples?: number): Record<string, JointRangeRow> | null;
134
+ /** Per bone: how far the centroid of the vertices it dominates sits from the bone's axis, relative to the bone length (bind pose). */
135
+ export declare function bindMismatch(skins: readonly SkinInfo[], hierarchy: Hierarchy, height: number, ratioLimit: number): BindMismatchBone[];
136
+ export declare function analyzeSkin(glb: GlbData, options?: SkinAnalysisOptions): SkinReport;
137
+ //# sourceMappingURL=analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/skin/analysis.ts"],"names":[],"mappings":"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"}