@developerz.ai/ts23d 0.0.0-stage → 0.1.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 (524) hide show
  1. package/.claude/agents/bug-hunter.md +21 -0
  2. package/.claude/agents/docs-author.md +13 -0
  3. package/.claude/agents/dx-auditor.md +14 -0
  4. package/.claude/agents/primitive-author.md +22 -0
  5. package/.claude/agents/recipe-author.md +36 -0
  6. package/.claude/agents/visual-reviewer.md +23 -0
  7. package/.claude/commands/feature.md +28 -0
  8. package/.claude/commands/new-recipe.md +19 -0
  9. package/.claude/commands/release.md +14 -0
  10. package/.claude/commands/verify.md +9 -0
  11. package/.claude/skills/author-recipe/SKILL.md +93 -0
  12. package/CHANGELOG.md +79 -0
  13. package/CLAUDE.md +85 -0
  14. package/LICENSE +21 -0
  15. package/README.md +380 -2
  16. package/dist/chunk-11v28977.js +1575 -0
  17. package/dist/chunk-11v28977.js.map +30 -0
  18. package/dist/chunk-1ypfs7ga.js +3571 -0
  19. package/dist/chunk-1ypfs7ga.js.map +42 -0
  20. package/dist/chunk-4ddzsqtc.js +464 -0
  21. package/dist/chunk-4ddzsqtc.js.map +19 -0
  22. package/dist/chunk-a8fxakcj.js +19 -0
  23. package/dist/chunk-a8fxakcj.js.map +11 -0
  24. package/dist/chunk-gcyp9b4d.js +755 -0
  25. package/dist/chunk-gcyp9b4d.js.map +22 -0
  26. package/dist/chunk-kgvbpqqw.js +44 -0
  27. package/dist/chunk-kgvbpqqw.js.map +10 -0
  28. package/dist/chunk-kvcep7ft.js +1919 -0
  29. package/dist/chunk-kvcep7ft.js.map +43 -0
  30. package/dist/chunk-ravbb06q.js +89 -0
  31. package/dist/chunk-ravbb06q.js.map +11 -0
  32. package/dist/chunk-w1zyhj40.js +1031 -0
  33. package/dist/chunk-w1zyhj40.js.map +21 -0
  34. package/dist/chunk-wtqhq529.js +2532 -0
  35. package/dist/chunk-wtqhq529.js.map +43 -0
  36. package/dist/chunk-xnt2sdhf.js +836 -0
  37. package/dist/chunk-xnt2sdhf.js.map +17 -0
  38. package/dist/cli/args.d.ts +24 -0
  39. package/dist/cli/bin.d.ts +2 -0
  40. package/dist/cli/bin.js +307 -0
  41. package/dist/cli/bin.js.map +14 -0
  42. package/dist/cli/load.d.ts +2 -0
  43. package/dist/cli/manifest.d.ts +49 -0
  44. package/dist/cli/render-cmds.d.ts +12 -0
  45. package/dist/cli/run.d.ts +1 -0
  46. package/dist/core/asset.d.ts +10 -0
  47. package/dist/core/definition.d.ts +148 -0
  48. package/dist/core/errors.d.ts +17 -0
  49. package/dist/core/family.d.ts +23 -0
  50. package/dist/core/index.d.ts +9 -0
  51. package/dist/core/index.js +69 -0
  52. package/dist/core/index.js.map +9 -0
  53. package/dist/core/mesh.d.ts +35 -0
  54. package/dist/core/part.d.ts +114 -0
  55. package/dist/core/png.d.ts +1 -0
  56. package/dist/core/rng.d.ts +12 -0
  57. package/dist/core/transform.d.ts +20 -0
  58. package/dist/core/vec.d.ts +11 -0
  59. package/dist/core/world.d.ts +16 -0
  60. package/dist/export/bin-writer.d.ts +16 -0
  61. package/dist/export/container.d.ts +3 -0
  62. package/dist/export/glb.d.ts +38 -0
  63. package/dist/export/index.d.ts +4 -0
  64. package/dist/export/index.js +26 -0
  65. package/dist/export/index.js.map +9 -0
  66. package/dist/export/lights.d.ts +8 -0
  67. package/dist/export/materials.d.ts +23 -0
  68. package/dist/export/merge-pivots.d.ts +6 -0
  69. package/dist/export/metadata.d.ts +19 -0
  70. package/dist/export/motion.d.ts +9 -0
  71. package/dist/export/optimize-parts.d.ts +26 -0
  72. package/dist/export/primitive.d.ts +3 -0
  73. package/dist/export/tangents.d.ts +2 -0
  74. package/dist/export/textures.d.ts +22 -0
  75. package/dist/export/version.d.ts +2 -0
  76. package/dist/grammar/index.d.ts +2 -0
  77. package/dist/grammar/index.js +16 -0
  78. package/dist/grammar/index.js.map +9 -0
  79. package/dist/grammar/split.d.ts +21 -0
  80. package/dist/grammar/whyte.d.ts +5 -0
  81. package/dist/index.d.ts +11 -0
  82. package/dist/index.js +411 -0
  83. package/dist/index.js.map +9 -0
  84. package/dist/kinds/building.d.ts +44 -0
  85. package/dist/kinds/faces.d.ts +27 -0
  86. package/dist/kinds/head-armour.d.ts +9 -0
  87. package/dist/kinds/head-beard.d.ts +6 -0
  88. package/dist/kinds/head-bust.d.ts +4 -0
  89. package/dist/kinds/head-extras.d.ts +15 -0
  90. package/dist/kinds/head-face.d.ts +6 -0
  91. package/dist/kinds/head-geom.d.ts +7 -0
  92. package/dist/kinds/head-hair.d.ts +4 -0
  93. package/dist/kinds/head-layout.d.ts +29 -0
  94. package/dist/kinds/head-mesh.d.ts +27 -0
  95. package/dist/kinds/head-params.d.ts +108 -0
  96. package/dist/kinds/head-presets.d.ts +19 -0
  97. package/dist/kinds/head-rim.d.ts +10 -0
  98. package/dist/kinds/head.d.ts +39 -0
  99. package/dist/kinds/hull-lines.d.ts +65 -0
  100. package/dist/kinds/hull-skin.d.ts +6 -0
  101. package/dist/kinds/hull.d.ts +14 -0
  102. package/dist/kinds/index.d.ts +16 -0
  103. package/dist/kinds/index.js +78 -0
  104. package/dist/kinds/index.js.map +9 -0
  105. package/dist/kinds/mass.d.ts +15 -0
  106. package/dist/kinds/openings.d.ts +30 -0
  107. package/dist/kinds/planned.d.ts +6 -0
  108. package/dist/kinds/roof-chimney.d.ts +16 -0
  109. package/dist/kinds/roof-shape.d.ts +64 -0
  110. package/dist/kinds/roof.d.ts +31 -0
  111. package/dist/kinds/vegetation-fronds.d.ts +15 -0
  112. package/dist/kinds/vegetation-impostor.d.ts +9 -0
  113. package/dist/kinds/vegetation-leaves.d.ts +15 -0
  114. package/dist/kinds/vegetation-mesh.d.ts +21 -0
  115. package/dist/kinds/vegetation-params.d.ts +90 -0
  116. package/dist/kinds/vegetation-presets.d.ts +20 -0
  117. package/dist/kinds/vegetation-skeleton.d.ts +20 -0
  118. package/dist/kinds/vegetation.d.ts +42 -0
  119. package/dist/kinds/vehicle.d.ts +42 -0
  120. package/dist/material/generator.d.ts +4 -0
  121. package/dist/material/index.d.ts +4 -0
  122. package/dist/material/index.js +38 -0
  123. package/dist/material/index.js.map +9 -0
  124. package/dist/material/paint/bond.d.ts +3 -0
  125. package/dist/material/paint/canvas.d.ts +32 -0
  126. package/dist/material/paint/cell.d.ts +4 -0
  127. package/dist/material/paint/cells-round.d.ts +5 -0
  128. package/dist/material/paint/cells.d.ts +7 -0
  129. package/dist/material/paint/compose.d.ts +5 -0
  130. package/dist/material/paint/concrete.d.ts +3 -0
  131. package/dist/material/paint/courses.d.ts +31 -0
  132. package/dist/material/paint/decode-png.d.ts +6 -0
  133. package/dist/material/paint/default-sheet.d.ts +2 -0
  134. package/dist/material/paint/foliage-broad.d.ts +5 -0
  135. package/dist/material/paint/foliage-common.d.ts +35 -0
  136. package/dist/material/paint/foliage-compound.d.ts +4 -0
  137. package/dist/material/paint/foliage-conifer.d.ts +5 -0
  138. package/dist/material/paint/foliage-raster.d.ts +26 -0
  139. package/dist/material/paint/foliage.d.ts +3 -0
  140. package/dist/material/paint/masks.d.ts +3 -0
  141. package/dist/material/paint/noise.d.ts +9 -0
  142. package/dist/material/paint/normal.d.ts +8 -0
  143. package/dist/material/paint/orm.d.ts +8 -0
  144. package/dist/material/paint/planks.d.ts +3 -0
  145. package/dist/material/paint/plates.d.ts +3 -0
  146. package/dist/material/paint/shapes.d.ts +8 -0
  147. package/dist/material/paint/slate.d.ts +3 -0
  148. package/dist/material/paint/stamp.d.ts +3 -0
  149. package/dist/material/paint/strip.d.ts +3 -0
  150. package/dist/material/paint/surface.d.ts +5 -0
  151. package/dist/material/paint/types.d.ts +35 -0
  152. package/dist/material/paint/validate.d.ts +3 -0
  153. package/dist/material/palette.d.ts +12 -0
  154. package/dist/material/shader-godot.d.ts +2 -0
  155. package/dist/material/shader-three.d.ts +2 -0
  156. package/dist/material/shader.d.ts +46 -0
  157. package/dist/material/trim-sheet.d.ts +22 -0
  158. package/dist/neural/generator.d.ts +25 -0
  159. package/dist/neural/images.d.ts +17 -0
  160. package/dist/neural/index.d.ts +2 -0
  161. package/dist/neural/index.js +14 -0
  162. package/dist/neural/index.js.map +9 -0
  163. package/dist/passes/bake-ao.d.ts +17 -0
  164. package/dist/passes/grime.d.ts +15 -0
  165. package/dist/passes/index.d.ts +6 -0
  166. package/dist/passes/index.js +22 -0
  167. package/dist/passes/index.js.map +9 -0
  168. package/dist/passes/livery.d.ts +19 -0
  169. package/dist/passes/optimize-cache.d.ts +15 -0
  170. package/dist/passes/optimize-weld.d.ts +15 -0
  171. package/dist/passes/optimize.d.ts +28 -0
  172. package/dist/passes/ray-grid.d.ts +23 -0
  173. package/dist/passes/weighted-normals.d.ts +8 -0
  174. package/dist/primitives/beam.d.ts +17 -0
  175. package/dist/primitives/bevel-box.d.ts +13 -0
  176. package/dist/primitives/box.d.ts +16 -0
  177. package/dist/primitives/cell.d.ts +20 -0
  178. package/dist/primitives/check.d.ts +12 -0
  179. package/dist/primitives/closed.d.ts +11 -0
  180. package/dist/primitives/erosion.d.ts +22 -0
  181. package/dist/primitives/font-5x7.d.ts +3 -0
  182. package/dist/primitives/heightfield.d.ts +16 -0
  183. package/dist/primitives/index.d.ts +23 -0
  184. package/dist/primitives/index.js +81 -0
  185. package/dist/primitives/index.js.map +9 -0
  186. package/dist/primitives/lathe-facets.d.ts +8 -0
  187. package/dist/primitives/lathe.d.ts +26 -0
  188. package/dist/primitives/lattice.d.ts +30 -0
  189. package/dist/primitives/loft.d.ts +15 -0
  190. package/dist/primitives/mc-table.d.ts +2 -0
  191. package/dist/primitives/member.d.ts +19 -0
  192. package/dist/primitives/noise.d.ts +34 -0
  193. package/dist/primitives/planar.d.ts +10 -0
  194. package/dist/primitives/prism.d.ts +13 -0
  195. package/dist/primitives/sculpt-edit.d.ts +56 -0
  196. package/dist/primitives/sculpt-tree.d.ts +23 -0
  197. package/dist/primitives/sculpt.d.ts +27 -0
  198. package/dist/primitives/sdf-grid.d.ts +17 -0
  199. package/dist/primitives/sdf-ops.d.ts +37 -0
  200. package/dist/primitives/sdf.d.ts +21 -0
  201. package/dist/primitives/strip-uv.d.ts +11 -0
  202. package/dist/primitives/surface-nets.d.ts +7 -0
  203. package/dist/primitives/sweep.d.ts +19 -0
  204. package/dist/primitives/terrain-color.d.ts +30 -0
  205. package/dist/primitives/terrain-grid.d.ts +36 -0
  206. package/dist/primitives/text-layout.d.ts +22 -0
  207. package/dist/primitives/text.d.ts +27 -0
  208. package/dist/primitives/tiled.d.ts +22 -0
  209. package/dist/primitives/transport.d.ts +17 -0
  210. package/dist/primitives/triangulate.d.ts +2 -0
  211. package/dist/primitives/value-noise.d.ts +10 -0
  212. package/dist/qa/checks.d.ts +11 -0
  213. package/dist/qa/clash.d.ts +2 -0
  214. package/dist/qa/floating.d.ts +5 -0
  215. package/dist/qa/gates.d.ts +12 -0
  216. package/dist/qa/geometry.d.ts +21 -0
  217. package/dist/qa/index.d.ts +12 -0
  218. package/dist/qa/index.js +78 -0
  219. package/dist/qa/index.js.map +9 -0
  220. package/dist/qa/inside.d.ts +12 -0
  221. package/dist/qa/inspect.d.ts +18 -0
  222. package/dist/qa/lods.d.ts +12 -0
  223. package/dist/qa/measures.d.ts +4 -0
  224. package/dist/qa/occlusion.d.ts +3 -0
  225. package/dist/qa/sanity.d.ts +7 -0
  226. package/dist/qa/types.d.ts +12 -0
  227. package/dist/render/beauty.d.ts +40 -0
  228. package/dist/render/camera.d.ts +33 -0
  229. package/dist/render/depth-map.d.ts +38 -0
  230. package/dist/render/font.d.ts +1 -0
  231. package/dist/render/ground.d.ts +13 -0
  232. package/dist/render/index.d.ts +10 -0
  233. package/dist/render/index.js +47 -0
  234. package/dist/render/index.js.map +9 -0
  235. package/dist/render/lighting.d.ts +20 -0
  236. package/dist/render/lod-strip.d.ts +5 -0
  237. package/dist/render/metrics.d.ts +37 -0
  238. package/dist/render/options.d.ts +28 -0
  239. package/dist/render/photo-match.d.ts +19 -0
  240. package/dist/render/raster.d.ts +25 -0
  241. package/dist/render/resolve.d.ts +11 -0
  242. package/dist/render/review-prompt.d.ts +2 -0
  243. package/dist/render/review-warnings.d.ts +34 -0
  244. package/dist/render/review.d.ts +24 -0
  245. package/dist/render/scene.d.ts +18 -0
  246. package/dist/render/shade.d.ts +22 -0
  247. package/dist/render/sheet.d.ts +15 -0
  248. package/dist/render/texture.d.ts +15 -0
  249. package/dist/render/thumbnail.d.ts +8 -0
  250. package/dist/render/vis-buffer.d.ts +18 -0
  251. package/dist/testing/assert.d.ts +21 -0
  252. package/dist/testing/compiled.d.ts +15 -0
  253. package/dist/testing/hash.d.ts +1 -0
  254. package/dist/testing/index.d.ts +4 -0
  255. package/dist/testing/index.js +134 -0
  256. package/dist/testing/index.js.map +13 -0
  257. package/dist/testing/snapshot.d.ts +13 -0
  258. package/docs/README.md +52 -0
  259. package/docs/architecture/README.md +68 -0
  260. package/docs/architecture/adding-a-kind.md +44 -0
  261. package/docs/architecture/adding-a-primitive.md +49 -0
  262. package/docs/architecture/errors.md +47 -0
  263. package/docs/architecture/glb-production.md +214 -0
  264. package/docs/architecture/gltf-capabilities.md +80 -0
  265. package/docs/decisions/001-recipe-compiler-over-ai-meshes.md +27 -0
  266. package/docs/decisions/002-typescript-not-json.md +22 -0
  267. package/docs/decisions/003-shared-trim-sheet.md +21 -0
  268. package/docs/decisions/004-z-up-metres.md +21 -0
  269. package/docs/decisions/005-zero-runtime-deps.md +21 -0
  270. package/docs/decisions/006-single-package-subpath-exports.md +20 -0
  271. package/docs/decisions/007-cpu-contact-sheets.md +21 -0
  272. package/docs/decisions/008-surface-materials.md +21 -0
  273. package/docs/decisions/009-gltf-front-axis.md +21 -0
  274. package/docs/decisions/README.md +15 -0
  275. package/docs/idea/01-vision.md +117 -0
  276. package/docs/idea/02-dsl.md +343 -0
  277. package/docs/idea/03-ir.md +97 -0
  278. package/docs/idea/04-materials.md +114 -0
  279. package/docs/idea/05-agent-loop.md +141 -0
  280. package/docs/idea/06-qa.md +101 -0
  281. package/docs/idea/07-what-fits.md +45 -0
  282. package/docs/idea/08-neural-adapters.md +78 -0
  283. package/docs/idea/09-kinds.md +105 -0
  284. package/docs/landscape.md +49 -0
  285. package/docs/plans/roadmap.md +127 -0
  286. package/examples/build-with-bun.ts +41 -0
  287. package/llms.txt +47 -0
  288. package/package.json +99 -4
  289. package/recipes/README.md +38 -0
  290. package/recipes/asteroid/README.md +46 -0
  291. package/recipes/asteroid/asteroid.ts +336 -0
  292. package/recipes/boulders/README.md +28 -0
  293. package/recipes/boulders/boulders.ts +117 -0
  294. package/recipes/boxcar/README.md +46 -0
  295. package/recipes/boxcar/boxcar.ts +916 -0
  296. package/recipes/cargo_container_scifi/README.md +52 -0
  297. package/recipes/cargo_container_scifi/cargo_container_scifi.ts +461 -0
  298. package/recipes/dropship/README.md +84 -0
  299. package/recipes/dropship/dropship.ts +1144 -0
  300. package/recipes/eiffel_tower/README.md +110 -0
  301. package/recipes/eiffel_tower/eiffel_tower.ts +781 -0
  302. package/recipes/goblin_head/README.md +62 -0
  303. package/recipes/goblin_head/goblin_head.ts +36 -0
  304. package/recipes/human_head/README.md +64 -0
  305. package/recipes/human_head/human_head.ts +37 -0
  306. package/recipes/loco_440/README.md +32 -0
  307. package/recipes/loco_440/loco_440.ts +1404 -0
  308. package/recipes/material_swatches/README.md +21 -0
  309. package/recipes/material_swatches/material_swatches.ts +183 -0
  310. package/recipes/mountain_range/README.md +45 -0
  311. package/recipes/mountain_range/mountain_range.ts +128 -0
  312. package/recipes/oak/README.md +30 -0
  313. package/recipes/oak/oak.ts +19 -0
  314. package/recipes/orc_head/README.md +66 -0
  315. package/recipes/orc_head/orc_head.ts +39 -0
  316. package/recipes/palm/README.md +30 -0
  317. package/recipes/palm/palm.ts +19 -0
  318. package/recipes/pine/README.md +29 -0
  319. package/recipes/pine/pine.ts +19 -0
  320. package/recipes/signal_gantry/README.md +36 -0
  321. package/recipes/signal_gantry/signal_gantry.ts +522 -0
  322. package/recipes/station_halt/README.md +39 -0
  323. package/recipes/station_halt/station_halt.ts +722 -0
  324. package/recipes/t34/README.md +44 -0
  325. package/recipes/t34/t34.ts +1068 -0
  326. package/recipes/tiger_1/README.md +75 -0
  327. package/recipes/tiger_1/tiger_1.ts +1370 -0
  328. package/recipes/water_tower/README.md +40 -0
  329. package/recipes/water_tower/water_tower.ts +542 -0
  330. package/src/cli/args.ts +112 -0
  331. package/src/cli/bin.ts +7 -0
  332. package/src/cli/load.ts +17 -0
  333. package/src/cli/manifest.ts +89 -0
  334. package/src/cli/render-cmds.ts +66 -0
  335. package/src/cli/run.ts +168 -0
  336. package/src/core/asset.ts +128 -0
  337. package/src/core/definition.ts +149 -0
  338. package/src/core/errors.ts +45 -0
  339. package/src/core/family.ts +50 -0
  340. package/src/core/index.ts +66 -0
  341. package/src/core/mesh.ts +114 -0
  342. package/src/core/part.ts +130 -0
  343. package/src/core/png.ts +49 -0
  344. package/src/core/rng.ts +49 -0
  345. package/src/core/transform.ts +90 -0
  346. package/src/core/vec.ts +26 -0
  347. package/src/core/world.ts +80 -0
  348. package/src/export/bin-writer.ts +79 -0
  349. package/src/export/container.ts +35 -0
  350. package/src/export/glb.ts +200 -0
  351. package/src/export/index.ts +18 -0
  352. package/src/export/lights.ts +49 -0
  353. package/src/export/materials.ts +126 -0
  354. package/src/export/merge-pivots.ts +146 -0
  355. package/src/export/metadata.ts +59 -0
  356. package/src/export/motion.ts +70 -0
  357. package/src/export/optimize-parts.ts +80 -0
  358. package/src/export/primitive.ts +35 -0
  359. package/src/export/tangents.ts +75 -0
  360. package/src/export/textures.ts +88 -0
  361. package/src/export/version.ts +6 -0
  362. package/src/grammar/index.ts +4 -0
  363. package/src/grammar/split.ts +87 -0
  364. package/src/grammar/whyte.ts +20 -0
  365. package/src/index.ts +14 -0
  366. package/src/kinds/building.ts +153 -0
  367. package/src/kinds/faces.ts +138 -0
  368. package/src/kinds/head-armour.ts +151 -0
  369. package/src/kinds/head-beard.ts +133 -0
  370. package/src/kinds/head-bust.ts +221 -0
  371. package/src/kinds/head-extras.ts +150 -0
  372. package/src/kinds/head-face.ts +222 -0
  373. package/src/kinds/head-geom.ts +31 -0
  374. package/src/kinds/head-hair.ts +152 -0
  375. package/src/kinds/head-layout.ts +63 -0
  376. package/src/kinds/head-mesh.ts +157 -0
  377. package/src/kinds/head-params.ts +153 -0
  378. package/src/kinds/head-presets.ts +152 -0
  379. package/src/kinds/head-rim.ts +128 -0
  380. package/src/kinds/head.ts +171 -0
  381. package/src/kinds/hull-lines.ts +160 -0
  382. package/src/kinds/hull-skin.ts +83 -0
  383. package/src/kinds/hull.ts +209 -0
  384. package/src/kinds/index.ts +63 -0
  385. package/src/kinds/mass.ts +110 -0
  386. package/src/kinds/openings.ts +141 -0
  387. package/src/kinds/planned.ts +12 -0
  388. package/src/kinds/roof-chimney.ts +100 -0
  389. package/src/kinds/roof-shape.ts +230 -0
  390. package/src/kinds/roof.ts +250 -0
  391. package/src/kinds/vegetation-fronds.ts +126 -0
  392. package/src/kinds/vegetation-impostor.ts +118 -0
  393. package/src/kinds/vegetation-leaves.ts +168 -0
  394. package/src/kinds/vegetation-mesh.ts +174 -0
  395. package/src/kinds/vegetation-params.ts +147 -0
  396. package/src/kinds/vegetation-presets.ts +184 -0
  397. package/src/kinds/vegetation-skeleton.ts +168 -0
  398. package/src/kinds/vegetation.ts +199 -0
  399. package/src/kinds/vehicle.ts +144 -0
  400. package/src/material/generator.ts +56 -0
  401. package/src/material/index.ts +29 -0
  402. package/src/material/paint/bond.ts +60 -0
  403. package/src/material/paint/canvas.ts +91 -0
  404. package/src/material/paint/cell.ts +39 -0
  405. package/src/material/paint/cells-round.ts +119 -0
  406. package/src/material/paint/cells.ts +111 -0
  407. package/src/material/paint/compose.ts +53 -0
  408. package/src/material/paint/concrete.ts +62 -0
  409. package/src/material/paint/courses.ts +85 -0
  410. package/src/material/paint/decode-png.ts +100 -0
  411. package/src/material/paint/default-sheet.ts +61 -0
  412. package/src/material/paint/foliage-broad.ts +126 -0
  413. package/src/material/paint/foliage-common.ts +93 -0
  414. package/src/material/paint/foliage-compound.ts +135 -0
  415. package/src/material/paint/foliage-conifer.ts +143 -0
  416. package/src/material/paint/foliage-raster.ts +196 -0
  417. package/src/material/paint/foliage.ts +23 -0
  418. package/src/material/paint/masks.ts +44 -0
  419. package/src/material/paint/noise.ts +52 -0
  420. package/src/material/paint/normal.ts +52 -0
  421. package/src/material/paint/orm.ts +95 -0
  422. package/src/material/paint/planks.ts +56 -0
  423. package/src/material/paint/plates.ts +72 -0
  424. package/src/material/paint/shapes.ts +28 -0
  425. package/src/material/paint/slate.ts +52 -0
  426. package/src/material/paint/stamp.ts +40 -0
  427. package/src/material/paint/strip.ts +42 -0
  428. package/src/material/paint/surface.ts +60 -0
  429. package/src/material/paint/types.ts +51 -0
  430. package/src/material/paint/validate.ts +58 -0
  431. package/src/material/palette.ts +43 -0
  432. package/src/material/shader-godot.ts +77 -0
  433. package/src/material/shader-three.ts +103 -0
  434. package/src/material/shader.ts +100 -0
  435. package/src/material/trim-sheet.ts +100 -0
  436. package/src/neural/generator.ts +37 -0
  437. package/src/neural/images.ts +27 -0
  438. package/src/neural/index.ts +10 -0
  439. package/src/passes/bake-ao.ts +183 -0
  440. package/src/passes/grime.ts +37 -0
  441. package/src/passes/index.ts +8 -0
  442. package/src/passes/livery.ts +66 -0
  443. package/src/passes/optimize-cache.ts +175 -0
  444. package/src/passes/optimize-weld.ts +147 -0
  445. package/src/passes/optimize.ts +85 -0
  446. package/src/passes/ray-grid.ts +237 -0
  447. package/src/passes/weighted-normals.ts +125 -0
  448. package/src/primitives/beam.ts +60 -0
  449. package/src/primitives/bevel-box.ts +140 -0
  450. package/src/primitives/box.ts +90 -0
  451. package/src/primitives/cell.ts +115 -0
  452. package/src/primitives/check.ts +49 -0
  453. package/src/primitives/closed.ts +74 -0
  454. package/src/primitives/erosion.ts +183 -0
  455. package/src/primitives/font-5x7.ts +117 -0
  456. package/src/primitives/heightfield.ts +101 -0
  457. package/src/primitives/index.ts +56 -0
  458. package/src/primitives/lathe-facets.ts +45 -0
  459. package/src/primitives/lathe.ts +174 -0
  460. package/src/primitives/lattice.ts +131 -0
  461. package/src/primitives/loft.ts +174 -0
  462. package/src/primitives/mc-table.ts +41 -0
  463. package/src/primitives/member.ts +130 -0
  464. package/src/primitives/noise.ts +157 -0
  465. package/src/primitives/planar.ts +55 -0
  466. package/src/primitives/prism.ts +85 -0
  467. package/src/primitives/sculpt-edit.ts +212 -0
  468. package/src/primitives/sculpt-tree.ts +226 -0
  469. package/src/primitives/sculpt.ts +80 -0
  470. package/src/primitives/sdf-grid.ts +131 -0
  471. package/src/primitives/sdf-ops.ts +145 -0
  472. package/src/primitives/sdf.ts +83 -0
  473. package/src/primitives/strip-uv.ts +26 -0
  474. package/src/primitives/surface-nets.ts +161 -0
  475. package/src/primitives/sweep.ts +162 -0
  476. package/src/primitives/terrain-color.ts +85 -0
  477. package/src/primitives/terrain-grid.ts +137 -0
  478. package/src/primitives/text-layout.ts +85 -0
  479. package/src/primitives/text.ts +197 -0
  480. package/src/primitives/tiled.ts +93 -0
  481. package/src/primitives/transport.ts +85 -0
  482. package/src/primitives/triangulate.ts +42 -0
  483. package/src/primitives/value-noise.ts +62 -0
  484. package/src/qa/checks.ts +110 -0
  485. package/src/qa/clash.ts +177 -0
  486. package/src/qa/floating.ts +63 -0
  487. package/src/qa/gates.ts +126 -0
  488. package/src/qa/geometry.ts +187 -0
  489. package/src/qa/index.ts +28 -0
  490. package/src/qa/inside.ts +114 -0
  491. package/src/qa/inspect.ts +107 -0
  492. package/src/qa/lods.ts +97 -0
  493. package/src/qa/measures.ts +67 -0
  494. package/src/qa/occlusion.ts +166 -0
  495. package/src/qa/sanity.ts +137 -0
  496. package/src/qa/types.ts +17 -0
  497. package/src/render/beauty.ts +115 -0
  498. package/src/render/camera.ts +142 -0
  499. package/src/render/depth-map.ts +191 -0
  500. package/src/render/font.ts +76 -0
  501. package/src/render/ground.ts +87 -0
  502. package/src/render/index.ts +34 -0
  503. package/src/render/lighting.ts +95 -0
  504. package/src/render/lod-strip.ts +34 -0
  505. package/src/render/metrics.ts +147 -0
  506. package/src/render/options.ts +81 -0
  507. package/src/render/photo-match.ts +28 -0
  508. package/src/render/raster.ts +143 -0
  509. package/src/render/resolve.ts +109 -0
  510. package/src/render/review-prompt.ts +59 -0
  511. package/src/render/review-warnings.ts +92 -0
  512. package/src/render/review.ts +103 -0
  513. package/src/render/scene.ts +119 -0
  514. package/src/render/shade.ts +199 -0
  515. package/src/render/sheet.ts +88 -0
  516. package/src/render/texture.ts +97 -0
  517. package/src/render/thumbnail.ts +75 -0
  518. package/src/render/vis-buffer.ts +119 -0
  519. package/src/testing/assert.ts +115 -0
  520. package/src/testing/compiled.ts +31 -0
  521. package/src/testing/hash.ts +14 -0
  522. package/src/testing/index.ts +14 -0
  523. package/src/testing/snapshot.ts +37 -0
  524. package/src/types/gltf-validator.d.ts +13 -0
@@ -0,0 +1 @@
1
+ export declare function run(argv: readonly string[]): Promise<number>;
@@ -0,0 +1,10 @@
1
+ import type { Asset, AssetDefinition, CompiledAsset } from './definition.js';
2
+ import type { Lod } from './part.js';
3
+ export * from './definition.js';
4
+ export * from './part.js';
5
+ export declare function defineAsset(def: AssetDefinition): Asset;
6
+ export declare const isAsset: (value: unknown) => value is Asset;
7
+ export declare function compile(asset: Asset, options?: {
8
+ lod?: Lod;
9
+ seed?: number;
10
+ }): CompiledAsset;
@@ -0,0 +1,148 @@
1
+ import type { Mesh } from './mesh.js';
2
+ import type { EmitterOptions, Lod, Part, PartOptions, SocketOptions, UseOptions } from './part.js';
3
+ import type { Rng } from './rng.js';
4
+ export interface BuildContext {
5
+ readonly lod: Lod;
6
+ readonly seed: number;
7
+ readonly rng: Rng;
8
+ /** The value for this LOD: `ctx.pick([24, 12, 6])` — segments, counts, sizes per detail level. */
9
+ pick<T>(perLod: readonly [T, T, T]): T;
10
+ /** Add a named part. Names are the contract with the engine: `axle_*`, `door_*`, `rotor_*`. */
11
+ part(name: string, mesh: Mesh | null, options?: PartOptions): void;
12
+ /** An empty pivot that other parts parent to. */
13
+ group(name: string, options?: PartOptions): void;
14
+ /** Declare a particle source (smoke, steam, dust, muzzle…) as a named node. */
15
+ emitter(name: string, options: EmitterOptions): void;
16
+ /** Declare an attachment point (seat, mount, camera, audio, light…) as a named node. */
17
+ socket(name: string, options: SocketOptions): void;
18
+ /** Instance another asset inside this one, compiled at this LOD — the composition primitive. */
19
+ use(asset: Asset, options: UseOptions): void;
20
+ }
21
+ export interface Budget {
22
+ /** Triangle ceiling per LOD; QA fails the build above it. */
23
+ readonly triangles: readonly [number, number, number];
24
+ }
25
+ /** Real-world overall dimensions (metres) the QA `proportions` gate holds the model to. */
26
+ export interface RealDimensions {
27
+ /** Along X (front-back). */
28
+ readonly length: number;
29
+ /** Along Y. */
30
+ readonly width: number;
31
+ /** Along Z. */
32
+ readonly height: number;
33
+ /** Allowed relative error per axis; default 0.05. */
34
+ readonly tolerance?: number;
35
+ /** Named spec-sheet dimensions checked against the model (QA `measures`). */
36
+ readonly measures?: readonly Measure[];
37
+ }
38
+ /**
39
+ * One real-world dimension from a source, checked against the model at LOD0: the world-space
40
+ * extent of `parts` (union of their bounds) along `axis`, or the distance between two parts'
41
+ * centres. E.g. driver diameter = extent of `axle_driver_0` on Z; gauge = centre distance of the
42
+ * two rail parts on Y; turret width = extent of `turret_body` on Y.
43
+ */
44
+ export interface Measure {
45
+ readonly label: string;
46
+ readonly value: number;
47
+ readonly axis: 'x' | 'y' | 'z';
48
+ /** Extent of these parts (prefix match: 'axle_driver_0' includes its wheels). */
49
+ readonly parts?: readonly string[];
50
+ /** Or: distance between the centres of exactly two parts along `axis`. */
51
+ readonly between?: readonly [string, string];
52
+ readonly tolerance?: number;
53
+ /** Where this number comes from (one of `sources`, or a page reference). */
54
+ readonly source?: string;
55
+ }
56
+ /** One problem a recipe's own check found. QA turns these into findings named `check`. */
57
+ export interface CheckFinding {
58
+ readonly message: string;
59
+ readonly fix: string;
60
+ readonly part?: string;
61
+ }
62
+ /**
63
+ * A recipe-declared assertion about its own geometry, run by the QA gate at every LOD:
64
+ * "tracks clear the hull", "wheels never overlap", "left matches right". Plain functions —
65
+ * build them with the helpers in /qa (`clear`, `touches`, `noOverlap`, `symmetric`) or write one.
66
+ */
67
+ export type Check = (asset: CompiledAsset) => readonly CheckFinding[];
68
+ /**
69
+ * Triangle budgets per class (LOD0 / LOD1 / LOD2): a starting point, measured on real recipes.
70
+ * `budget: BUDGETS.vehicle` — raise one with a measured reason, never to hide a regression.
71
+ */
72
+ export declare const BUDGETS: {
73
+ readonly prop: {
74
+ readonly triangles: readonly [800, 300, 80];
75
+ };
76
+ readonly detailedProp: {
77
+ readonly triangles: readonly [5000, 1500, 300];
78
+ };
79
+ readonly building: {
80
+ readonly triangles: readonly [20000, 6000, 800];
81
+ };
82
+ readonly vehicle: {
83
+ readonly triangles: readonly [60000, 15000, 1000];
84
+ };
85
+ readonly hero: {
86
+ readonly triangles: readonly [150000, 40000, 2000];
87
+ };
88
+ readonly tree: {
89
+ readonly triangles: readonly [25000, 6000, 300];
90
+ };
91
+ readonly scene: {
92
+ readonly triangles: readonly [500000, 120000, 15000];
93
+ };
94
+ };
95
+ /** A part set that emits light (lamp lenses, lit windows): an emissive material in the GLB. */
96
+ export interface Glow {
97
+ /** Part names or globs: 'headlamp_*', 'window_*'. */
98
+ readonly parts: readonly string[];
99
+ /** Linear RGB 0..1 (`hex('#ffd9a0')`). Default warm white. */
100
+ readonly color?: readonly [number, number, number];
101
+ /** Brightness multiplier (KHR_materials_emissive_strength); 1 = plain glTF. Default 4. */
102
+ readonly strength?: number;
103
+ }
104
+ /** Provenance written into every GLB: `asset.copyright` + an XMP packet. */
105
+ export interface AssetMeta {
106
+ readonly description?: string;
107
+ readonly sources?: readonly string[];
108
+ /** SPDX id or licence URL, e.g. 'CC0-1.0', 'MIT'. */
109
+ readonly license?: string;
110
+ /** e.g. '© 2026 Jane Doe'. */
111
+ readonly copyright?: string;
112
+ readonly creators?: readonly string[];
113
+ }
114
+ export interface AssetDefinition {
115
+ readonly name: string;
116
+ readonly kind: string;
117
+ readonly description?: string;
118
+ /** Where the numbers came from: spec sheets, rosters, drawings, photos. Required for `real`. */
119
+ readonly sources?: readonly string[];
120
+ readonly real?: RealDimensions;
121
+ readonly tags?: readonly string[];
122
+ readonly budget: Budget;
123
+ readonly seed?: number;
124
+ /** The recipe's own physical intent, enforced by QA (see Check). */
125
+ readonly checks?: readonly Check[];
126
+ /** SPDX id or licence URL for the generated asset, e.g. 'CC0-1.0'. Written into the GLB. */
127
+ readonly license?: string;
128
+ readonly copyright?: string;
129
+ readonly creators?: readonly string[];
130
+ /** Emissive part sets; `t3d build` writes them as glowing materials. */
131
+ readonly glow?: readonly Glow[];
132
+ build(ctx: BuildContext): void;
133
+ }
134
+ export interface Asset extends AssetDefinition {
135
+ readonly __ts23d: 'asset';
136
+ }
137
+ export interface CompiledAsset {
138
+ readonly name: string;
139
+ readonly kind: string;
140
+ readonly lod: Lod;
141
+ readonly budget: Budget;
142
+ readonly real: RealDimensions | null;
143
+ readonly checks: readonly Check[];
144
+ readonly parts: readonly Part[];
145
+ /** Provenance carried from the definition (absent when the recipe declares none). */
146
+ readonly meta?: AssetMeta;
147
+ readonly glow?: readonly Glow[];
148
+ }
@@ -0,0 +1,17 @@
1
+ export type ErrorCode = 'T3D_NOT_IMPLEMENTED' | 'T3D_GRAMMAR_SYNTAX' | 'T3D_GRAMMAR_OVERFLOW' | 'T3D_PART_DUPLICATE' | 'T3D_PART_UNKNOWN' | 'T3D_RECIPE_INVALID' | 'T3D_NO_ASSET_EXPORT' | 'T3D_QA_FAILED' | 'T3D_RENDER_OPTIONS' | 'T3D_AMBIENT_RANDOM' | 'T3D_RELEASE' | 'T3D_BENCH';
2
+ export interface ErrorDetails {
3
+ readonly cause: string;
4
+ readonly fix: string;
5
+ }
6
+ export declare class Ts23dError extends Error {
7
+ readonly code: ErrorCode;
8
+ readonly fix: string;
9
+ constructor(code: ErrorCode, details: ErrorDetails);
10
+ toJSON(): {
11
+ code: ErrorCode;
12
+ message: string;
13
+ fix: string;
14
+ };
15
+ }
16
+ /** Placeholder for a planned seam. Names the plan so the agent knows where the work is tracked. */
17
+ export declare function notImplemented(what: string, plan?: string): never;
@@ -0,0 +1,23 @@
1
+ import { type Asset, type AssetDefinition, type BuildContext } from './asset.js';
2
+ type Shared = Omit<AssetDefinition, 'name' | 'build'>;
3
+ export interface FamilyDefinition<P extends object> extends Shared {
4
+ /** Defaults for every parameter; variants override a subset. */
5
+ readonly defaults: P;
6
+ build(ctx: BuildContext, params: Readonly<P>): void;
7
+ }
8
+ export interface Variant<P> extends Partial<Shared> {
9
+ readonly name: string;
10
+ readonly params?: Partial<P>;
11
+ }
12
+ export interface Family<P extends object> {
13
+ readonly defaults: Readonly<P>;
14
+ /** Make one asset of this family. */
15
+ variant(v: Variant<P>): Asset;
16
+ /** Derive a family: new defaults (may add parameters) and optionally a build that wraps ours. */
17
+ extend<Q extends object>(o: {
18
+ readonly defaults: Q;
19
+ readonly build?: (ctx: BuildContext, params: Readonly<P & Q>, base: () => void) => void;
20
+ } & Partial<Shared>): Family<P & Q>;
21
+ }
22
+ export declare function defineFamily<P extends object>(def: FamilyDefinition<P>): Family<P>;
23
+ export {};
@@ -0,0 +1,9 @@
1
+ export { type Asset, type AssetDefinition, BUDGETS, type Budget, type BuildContext, type Check, type CheckFinding, type CompiledAsset, compile, defineAsset, type Emitter, type EmitterOptions, isAsset, type Lod, type Measure, type Motion, type Part, type PartOptions, type RealDimensions, type Slide, type Socket, type SocketOptions, type Spin, type Surface, type Sway, type UseOptions, } from './asset.js';
2
+ export { type ErrorCode, type ErrorDetails, notImplemented, Ts23dError } from './errors.js';
3
+ export { defineFamily, type Family, type FamilyDefinition, type Variant } from './family.js';
4
+ export { type Bounds, boundsOf, type Mesh, MeshBuilder, merge, translate, triangleCount, type Vertex, } from './mesh.js';
5
+ export { encodePng } from './png.js';
6
+ export { createRng, type Rng } from './rng.js';
7
+ export { type Affine, affine, applyAffine, frame, type Placement, place } from './transform.js';
8
+ export { add, cross, dot, length, normalize, type Quat, quatFromAxisAngle, scale, sub, type Vec2, type Vec3, } from './vec.js';
9
+ export { rotateZ, toWorld, type WorldTransform, worldMesh, worldMeshes, worldTransforms, } from './world.js';
@@ -0,0 +1,69 @@
1
+ import {
2
+ Ts23dError2,
3
+ notImplemented2,
4
+ createRng2,
5
+ BUDGETS2,
6
+ defineAsset2,
7
+ isAsset2,
8
+ compile2,
9
+ defineFamily2,
10
+ MeshBuilder2,
11
+ triangleCount2,
12
+ boundsOf2,
13
+ translate2,
14
+ merge2,
15
+ encodePng2,
16
+ affine2,
17
+ frame2,
18
+ applyAffine2,
19
+ place2,
20
+ add2,
21
+ sub2,
22
+ scale2,
23
+ dot2,
24
+ cross2,
25
+ length2,
26
+ normalize2,
27
+ quatFromAxisAngle2,
28
+ worldTransforms2,
29
+ toWorld2,
30
+ rotateZ2,
31
+ worldMesh2,
32
+ worldMeshes2
33
+ } from "../chunk-4ddzsqtc.js";
34
+ export {
35
+ BUDGETS2 as BUDGETS,
36
+ MeshBuilder2 as MeshBuilder,
37
+ Ts23dError2 as Ts23dError,
38
+ add2 as add,
39
+ affine2 as affine,
40
+ applyAffine2 as applyAffine,
41
+ boundsOf2 as boundsOf,
42
+ compile2 as compile,
43
+ createRng2 as createRng,
44
+ cross2 as cross,
45
+ defineAsset2 as defineAsset,
46
+ defineFamily2 as defineFamily,
47
+ dot2 as dot,
48
+ encodePng2 as encodePng,
49
+ frame2 as frame,
50
+ isAsset2 as isAsset,
51
+ length2 as length,
52
+ merge2 as merge,
53
+ normalize2 as normalize,
54
+ notImplemented2 as notImplemented,
55
+ place2 as place,
56
+ quatFromAxisAngle2 as quatFromAxisAngle,
57
+ rotateZ2 as rotateZ,
58
+ scale2 as scale,
59
+ sub2 as sub,
60
+ toWorld2 as toWorld,
61
+ translate2 as translate,
62
+ triangleCount2 as triangleCount,
63
+ worldMesh2 as worldMesh,
64
+ worldMeshes2 as worldMeshes,
65
+ worldTransforms2 as worldTransforms
66
+ };
67
+
68
+ //# debugId=2D08A3E11E7129B164756E2164756E21
69
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "2D08A3E11E7129B164756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,35 @@
1
+ import type { Vec2, Vec3 } from './vec.js';
2
+ export interface Bounds {
3
+ readonly min: Vec3;
4
+ readonly max: Vec3;
5
+ }
6
+ export interface Mesh {
7
+ readonly positions: Float32Array;
8
+ readonly normals: Float32Array;
9
+ readonly uvs: Float32Array;
10
+ readonly colors: Float32Array;
11
+ readonly indices: Uint32Array;
12
+ }
13
+ export interface Vertex {
14
+ readonly p: Vec3;
15
+ readonly n: Vec3;
16
+ readonly uv: Vec2;
17
+ readonly color: Vec3;
18
+ }
19
+ export declare class MeshBuilder {
20
+ private readonly p;
21
+ private readonly n;
22
+ private readonly uv;
23
+ private readonly c;
24
+ private readonly idx;
25
+ vertex(v: Vertex): number;
26
+ tri(a: number, b: number, c: number): this;
27
+ /** Counter-clockwise quad a-b-c-d as seen from the side its normal faces. */
28
+ quad(a: number, b: number, c: number, d: number): this;
29
+ build(): Mesh;
30
+ }
31
+ export declare const triangleCount: (m: Mesh) => number;
32
+ export declare function boundsOf(m: Mesh): Bounds;
33
+ /** Bake a translation into a mesh (parts are authored in parent space, then offset). */
34
+ export declare function translate(m: Mesh, by: Vec3): Mesh;
35
+ export declare function merge(meshes: readonly Mesh[]): Mesh;
@@ -0,0 +1,114 @@
1
+ import type { Mesh } from './mesh.js';
2
+ import type { Vec3 } from './vec.js';
3
+ /** 0 = hero detail, 1 = mid, 2 = far. A recipe reads it and drops detail; it never decimates. */
4
+ export type Lod = 0 | 1 | 2;
5
+ export interface Spin {
6
+ readonly kind: 'spin';
7
+ /** Rotation axis in the part's local space. */
8
+ readonly axis: Vec3;
9
+ /** Revolutions per second of the baked loop. */
10
+ readonly rps: number;
11
+ }
12
+ export interface Slide {
13
+ readonly kind: 'slide';
14
+ /** Peak offset of a sinusoidal back-and-forth (piston rods, sliders). */
15
+ readonly offset: Vec3;
16
+ readonly hz: number;
17
+ /** Move only from rest to rest + offset and back (a sliding door), not to both sides. */
18
+ readonly oneWay?: boolean;
19
+ }
20
+ export interface Sway {
21
+ readonly kind: 'sway';
22
+ /** Rotation axis in the part's local space. */
23
+ readonly axis: Vec3;
24
+ /** Peak angle either side of rest: turret scan, gun elevation, wind in a crown, a door ajar. */
25
+ readonly degrees: number;
26
+ readonly hz: number;
27
+ /** Swing only from rest to +degrees and back (a signal arm dropping, a hatch opening). */
28
+ readonly oneWay?: boolean;
29
+ }
30
+ export type Motion = Spin | Slide | Sway;
31
+ /**
32
+ * A particle source the engine spawns at runtime: exhaust smoke, loco steam, track dust, muzzle
33
+ * flash, chimney smoke, fire. Exported as an empty named node carrying `extras.ts23d.emitter`,
34
+ * so it moves with its parent (a turret, a stack) and any engine can bind its own system to it.
35
+ */
36
+ export interface Emitter {
37
+ readonly kind: 'smoke' | 'steam' | 'dust' | 'muzzle' | 'fire' | 'sparks';
38
+ /** Emission direction in the parent's space; default up (+Z). */
39
+ readonly dir?: Vec3;
40
+ /** Particles per second at full intensity. */
41
+ readonly rate: number;
42
+ /** Seconds a particle lives. */
43
+ readonly life: number;
44
+ /** Start and end size in metres. */
45
+ readonly size: readonly [number, number];
46
+ /** Linear sRGB start colour; engines fade to transparent. */
47
+ readonly color?: Vec3;
48
+ /** Initial speed m/s along `dir`, with cone spread in degrees. */
49
+ readonly speed?: number;
50
+ readonly spreadDeg?: number;
51
+ /** 'always' (chimney), 'moving' (track dust), 'event' (muzzle — fired by game code). */
52
+ readonly when?: 'always' | 'moving' | 'event';
53
+ }
54
+ /**
55
+ * A named attachment point game code binds to: a seat, a weapon mount, a camera, a sound source,
56
+ * a hardpoint, a spawn or interaction point. An empty node with `extras.ts23d.socket`.
57
+ */
58
+ export interface Socket {
59
+ readonly kind: 'seat' | 'mount' | 'camera' | 'audio' | 'attach' | 'spawn' | 'interact' | 'light';
60
+ /** Facing direction in the parent's space; default +X (forward). */
61
+ readonly dir?: Vec3;
62
+ /** Free-form, engine-facing: `{ clip: 'engine_idle' }`, `{ caliber: 88 }`, `{ fov: 60 }`. */
63
+ readonly data?: Readonly<Record<string, string | number | boolean>>;
64
+ }
65
+ export interface SocketOptions extends Socket {
66
+ readonly at?: Vec3;
67
+ readonly parent?: string;
68
+ }
69
+ export interface EmitterOptions extends Emitter {
70
+ readonly at?: Vec3;
71
+ readonly parent?: string;
72
+ }
73
+ /**
74
+ * How a part's surface renders. Everything stays on ONE shared texture set; the GLB carries at
75
+ * most four materials (one per surface in use), so batching still holds:
76
+ * opaque — the default trim-sheet material
77
+ * cutout — alpha-tested, double-sided: leaves, fences, grilles, ash
78
+ * glass — clear: transmission + IOR 1.5 + thin volume (windows, bottles, lamp lenses)
79
+ * translucent — tinted, partly see-through: plastic bottles, liquids, paper, smoke-stained glass
80
+ * Tint comes from vertex colour, as everywhere else.
81
+ */
82
+ export type Surface = 'opaque' | 'cutout' | 'glass' | 'translucent';
83
+ export interface PartOptions {
84
+ /** Pivot in the parent's space; the mesh is authored relative to it. */
85
+ readonly at?: Vec3;
86
+ readonly parent?: string;
87
+ /** Rotation about local Z, radians. A part that also moves goes inside a yawed group. */
88
+ readonly yaw?: number;
89
+ readonly motion?: Motion;
90
+ /** Parts this moving part may legitimately pass through (an axle in its bearing). QA `clashes`. */
91
+ readonly clearOf?: readonly string[];
92
+ readonly surface?: Surface;
93
+ }
94
+ export interface UseOptions {
95
+ /** Prefix for every instanced part: `house_3` → `house_3_roof`, `house_3_door_0`. */
96
+ readonly prefix: string;
97
+ readonly at?: Vec3;
98
+ readonly yaw?: number;
99
+ readonly parent?: string;
100
+ /** Per-instance seed, so ten copies of one recipe are ten variants. */
101
+ readonly seed?: number;
102
+ }
103
+ export interface Part {
104
+ readonly name: string;
105
+ readonly mesh: Mesh | null;
106
+ readonly at: Vec3;
107
+ readonly parent: string | null;
108
+ readonly yaw: number;
109
+ readonly motion: Motion | null;
110
+ readonly clearOf?: readonly string[];
111
+ readonly emitter?: Emitter;
112
+ readonly socket?: Socket;
113
+ readonly surface?: Surface;
114
+ }
@@ -0,0 +1 @@
1
+ export declare function encodePng(width: number, height: number, rgba: Uint8Array): Uint8Array;
@@ -0,0 +1,12 @@
1
+ export interface Rng {
2
+ /** Uniform in [0, 1). */
3
+ next(): number;
4
+ range(min: number, max: number): number;
5
+ int(min: number, maxInclusive: number): number;
6
+ pick<T>(items: readonly T[]): T;
7
+ /** An independent stream keyed by name, so adding a draw in one part never shifts another. */
8
+ fork(name: string): Rng;
9
+ /** A colour varied by ±amount per channel (relative): ten bales, ten slightly different straws. */
10
+ jitter(color: readonly [number, number, number], amount: number): [number, number, number];
11
+ }
12
+ export declare function createRng(seed: number): Rng;
@@ -0,0 +1,20 @@
1
+ import type { Mesh } from './mesh.js';
2
+ import type { Vec3 } from './vec.js';
3
+ /** Row-major 3×3 rotation(·scale) + translation. */
4
+ export interface Affine {
5
+ readonly m: readonly [number, number, number, number, number, number, number, number, number];
6
+ readonly t: Vec3;
7
+ }
8
+ export interface Placement {
9
+ readonly at?: Vec3;
10
+ /** Radians about Z (heading), then Y (pitch), then X (roll). */
11
+ readonly yaw?: number;
12
+ readonly pitch?: number;
13
+ readonly roll?: number;
14
+ readonly scale?: number | Vec3;
15
+ }
16
+ export declare function affine(p: Placement): Affine;
17
+ /** A basis from an explicit frame: local X→u, Y→v, Z→w (all world vectors). */
18
+ export declare const frame: (u: Vec3, v: Vec3, w: Vec3, at?: Vec3) => Affine;
19
+ export declare function applyAffine(mesh: Mesh, a: Affine): Mesh;
20
+ export declare const place: (mesh: Mesh, p: Placement) => Mesh;
@@ -0,0 +1,11 @@
1
+ export type Vec2 = readonly [number, number];
2
+ export type Vec3 = readonly [number, number, number];
3
+ export type Quat = readonly [number, number, number, number];
4
+ export declare const add: (a: Vec3, b: Vec3) => Vec3;
5
+ export declare const sub: (a: Vec3, b: Vec3) => Vec3;
6
+ export declare const scale: (a: Vec3, s: number) => Vec3;
7
+ export declare const dot: (a: Vec3, b: Vec3) => number;
8
+ export declare const cross: (a: Vec3, b: Vec3) => Vec3;
9
+ export declare const length: (a: Vec3) => number;
10
+ export declare const normalize: (a: Vec3) => Vec3;
11
+ export declare function quatFromAxisAngle(axis: Vec3, radians: number): Quat;
@@ -0,0 +1,16 @@
1
+ import type { Part } from './asset.js';
2
+ import type { Mesh } from './mesh.js';
3
+ import type { Vec3 } from './vec.js';
4
+ export interface WorldTransform {
5
+ readonly origin: Vec3;
6
+ readonly yaw: number;
7
+ }
8
+ declare const rotZ: (p: Vec3, yaw: number) => Vec3;
9
+ export declare function worldTransforms(parts: readonly Part[]): Map<string, WorldTransform>;
10
+ export declare function toWorld(t: WorldTransform, p: Vec3): Vec3;
11
+ export declare const rotateZ: typeof rotZ;
12
+ /** A part's mesh baked into world space (positions and normals), ready for QA or rasterising. */
13
+ export declare function worldMesh(mesh: Mesh, t: WorldTransform): Mesh;
14
+ /** Every part with geometry, in world space, keyed by part name. Cached per parts array. */
15
+ export declare function worldMeshes(parts: readonly Part[]): Map<string, Mesh>;
16
+ export {};
@@ -0,0 +1,16 @@
1
+ export declare const ARRAY_BUFFER = 34962;
2
+ export declare const ELEMENT_ARRAY_BUFFER = 34963;
3
+ export interface Json {
4
+ [key: string]: unknown;
5
+ }
6
+ export declare class BinWriter {
7
+ private readonly chunks;
8
+ length: number;
9
+ readonly views: Json[];
10
+ readonly accessors: Json[];
11
+ private push;
12
+ accessor(data: Float32Array | Uint32Array | Uint16Array, type: 'SCALAR' | 'VEC2' | 'VEC3' | 'VEC4', target?: number, bounds?: boolean,
13
+ /** Integer data read as 0..1 (vertex colour as normalised unsigned short). */
14
+ normalized?: boolean): number;
15
+ bytes(): Uint8Array;
16
+ }
@@ -0,0 +1,3 @@
1
+ import type { Json } from './bin-writer.js';
2
+ export declare function packGlb(gltf: Json, body: Uint8Array): Uint8Array;
3
+ export declare function concat(a: Uint8Array, b: Uint8Array): Uint8Array;
@@ -0,0 +1,38 @@
1
+ import type { CompiledAsset } from '../core/index.js';
2
+ import type { OptimizeOptions } from '../passes/index.js';
3
+ import { type GlowRule } from './materials.js';
4
+ import { type GlbMeta } from './metadata.js';
5
+ import { type ExportReport } from './optimize-parts.js';
6
+ import { type SheetBinding } from './textures.js';
7
+ export interface GlbOptions {
8
+ /** Keep every part as its own node (debugging, per-part picking). Default merges to pivots. */
9
+ readonly keepParts?: boolean;
10
+ /**
11
+ * Bake each part's `motion` into a looping `run` clip. Off by default: glTF has no autoplay
12
+ * flag and most viewers play the first clip, while engines usually drive the named pivots
13
+ * from game code. Turn it on for previews, cutscenes and ambient props.
14
+ */
15
+ readonly animations?: boolean;
16
+ /**
17
+ * Bind the painted trim sheet to every material: a `PaintedSheet` embeds the three PNGs (one
18
+ * self-contained file); `{ external: true, prefix? }` references shared `trim_sheet_*.png` by
19
+ * URI. Omitted: no textures, byte-identical to the untextured output.
20
+ */
21
+ readonly sheet?: SheetBinding;
22
+ /**
23
+ * Weld + vertex-cache + vertex-fetch optimisation per primitive (passes/optimize). On by
24
+ * default; `false` writes the meshes exactly as compiled (debugging the IR).
25
+ */
26
+ readonly optimize?: boolean | OptimizeOptions;
27
+ /** Parts that emit light (lamp lenses, lit windows): one emissive material per rule. */
28
+ readonly glow?: readonly GlowRule[];
29
+ /** Provenance: asset.copyright + an XMP packet (title, creators, licence, sources). */
30
+ readonly meta?: GlbMeta;
31
+ }
32
+ /** The GLB bytes plus what the optimiser did (vertex counts, ACMR before/after, per part). */
33
+ export interface GlbResult {
34
+ readonly glb: Uint8Array;
35
+ readonly report: ExportReport;
36
+ }
37
+ export declare function toGlb(input: CompiledAsset, o?: GlbOptions): Uint8Array;
38
+ export declare function exportGlb(input: CompiledAsset, o?: GlbOptions): GlbResult;
@@ -0,0 +1,4 @@
1
+ export { exportGlb, type GlbOptions, type GlbResult, toGlb } from './glb.js';
2
+ export { mergeToPivots } from './merge-pivots.js';
3
+ export { type ExportReport, optimizeParts, type PartOptimizeReport, summarize, } from './optimize-parts.js';
4
+ export { type ExternalSheet, SHEET_MAPS, type SheetBinding, type SheetMap, sheetFileName, sheetPngs, } from './textures.js';
@@ -0,0 +1,26 @@
1
+ import {
2
+ mergeToPivots2,
3
+ summarize2,
4
+ optimizeParts2,
5
+ SHEET_MAPS2,
6
+ sheetFileName2,
7
+ sheetPngs2,
8
+ toGlb2,
9
+ exportGlb2
10
+ } from "../chunk-gcyp9b4d.js";
11
+ import"../chunk-kvcep7ft.js";
12
+ import"../chunk-xnt2sdhf.js";
13
+ import"../chunk-4ddzsqtc.js";
14
+ export {
15
+ SHEET_MAPS2 as SHEET_MAPS,
16
+ exportGlb2 as exportGlb,
17
+ mergeToPivots2 as mergeToPivots,
18
+ optimizeParts2 as optimizeParts,
19
+ sheetFileName2 as sheetFileName,
20
+ sheetPngs2 as sheetPngs,
21
+ summarize2 as summarize,
22
+ toGlb2 as toGlb
23
+ };
24
+
25
+ //# debugId=E49FD25380C5362E64756E2164756E21
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "E49FD25380C5362E64756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,8 @@
1
+ import type { Part, Quat } from '../core/index.js';
2
+ import type { Json } from './bin-writer.js';
3
+ export declare const LIGHTS = "KHR_lights_punctual";
4
+ /** The glTF light for a light socket, or null for any other part. */
5
+ export declare function lightOf(part: Part): {
6
+ light: Json;
7
+ rotation: Quat;
8
+ } | null;
@@ -0,0 +1,23 @@
1
+ import type { Surface } from '../core/index.js';
2
+ import type { Json } from './bin-writer.js';
3
+ /** Materials for the surfaces present, plus each surface's index and the extensions used. */
4
+ export declare function materialsFor(used: ReadonlySet<Surface>, withSheet?: boolean): {
5
+ materials: Json[];
6
+ index: Map<Surface, number>;
7
+ extensionsUsed: string[];
8
+ };
9
+ export declare const EMISSIVE_STRENGTH = "KHR_materials_emissive_strength";
10
+ /** A lit surface: lamp lenses, windows at night, panel glow. */
11
+ export interface GlowRule {
12
+ /** Part names or globs: 'headlamp_*', 'window_*'. */
13
+ readonly parts: readonly string[];
14
+ /** Linear RGB 0..1 (use `hex('#ffd9a0')` from /material). Default warm white. */
15
+ readonly color?: readonly [number, number, number];
16
+ /** Brightness multiplier (KHR_materials_emissive_strength, Ratified); 1 = plain glTF. */
17
+ readonly strength?: number;
18
+ }
19
+ /**
20
+ * The opaque trim material plus emission. emissiveFactor caps at 1 in core glTF; anything
21
+ * brighter rides KHR_materials_emissive_strength (engines without it see the clamped glow).
22
+ */
23
+ export declare function glowMaterial(rule: GlowRule, i: number, withSheet: boolean): Json;
@@ -0,0 +1,6 @@
1
+ import { type CompiledAsset, type Part } from '../core/index.js';
2
+ /** Merged layer parts that glow → index of the glow rule (read by the GLB writer). */
3
+ export declare const glowLayer: WeakMap<Part, number>;
4
+ /** `*`/`?` glob → anchored RegExp (export cannot import /qa: same tier). */
5
+ export declare const globRe: (pattern: string) => RegExp;
6
+ export declare function mergeToPivots(asset: CompiledAsset, glow?: readonly (readonly string[])[]): CompiledAsset;