@developerz.ai/ts23d 0.0.0-stage → 0.2.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 (567) 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 +90 -0
  13. package/CLAUDE.md +85 -0
  14. package/LICENSE +21 -0
  15. package/README.md +385 -2
  16. package/dist/chunk-6b05mnmx.js +19 -0
  17. package/dist/chunk-6b05mnmx.js.map +11 -0
  18. package/dist/chunk-7rtfjh9f.js +45 -0
  19. package/dist/chunk-7rtfjh9f.js.map +10 -0
  20. package/dist/chunk-8j4c28jt.js +4085 -0
  21. package/dist/chunk-8j4c28jt.js.map +46 -0
  22. package/dist/chunk-d1fv6hrm.js +2532 -0
  23. package/dist/chunk-d1fv6hrm.js.map +43 -0
  24. package/dist/chunk-dbq4qf52.js +902 -0
  25. package/dist/chunk-dbq4qf52.js.map +25 -0
  26. package/dist/chunk-drna2rny.js +836 -0
  27. package/dist/chunk-drna2rny.js.map +17 -0
  28. package/dist/chunk-dxvypr7y.js +89 -0
  29. package/dist/chunk-dxvypr7y.js.map +11 -0
  30. package/dist/chunk-f6yme003.js +1589 -0
  31. package/dist/chunk-f6yme003.js.map +30 -0
  32. package/dist/chunk-hg7pf34j.js +465 -0
  33. package/dist/chunk-hg7pf34j.js.map +19 -0
  34. package/dist/chunk-jq4e17tj.js +1031 -0
  35. package/dist/chunk-jq4e17tj.js.map +21 -0
  36. package/dist/chunk-y63c6zcv.js +2668 -0
  37. package/dist/chunk-y63c6zcv.js.map +53 -0
  38. package/dist/cli/args.d.ts +30 -0
  39. package/dist/cli/bin.d.ts +2 -0
  40. package/dist/cli/bin.js +348 -0
  41. package/dist/cli/bin.js.map +15 -0
  42. package/dist/cli/load.d.ts +2 -0
  43. package/dist/cli/manifest.d.ts +53 -0
  44. package/dist/cli/render-cmds.d.ts +12 -0
  45. package/dist/cli/run.d.ts +1 -0
  46. package/dist/cli/texture-cache.d.ts +4 -0
  47. package/dist/core/asset.d.ts +10 -0
  48. package/dist/core/definition.d.ts +155 -0
  49. package/dist/core/errors.d.ts +17 -0
  50. package/dist/core/family.d.ts +23 -0
  51. package/dist/core/index.d.ts +9 -0
  52. package/dist/core/index.js +69 -0
  53. package/dist/core/index.js.map +9 -0
  54. package/dist/core/mesh.d.ts +35 -0
  55. package/dist/core/part.d.ts +114 -0
  56. package/dist/core/png.d.ts +1 -0
  57. package/dist/core/rng.d.ts +12 -0
  58. package/dist/core/transform.d.ts +20 -0
  59. package/dist/core/vec.d.ts +11 -0
  60. package/dist/core/world.d.ts +16 -0
  61. package/dist/export/bin-writer.d.ts +16 -0
  62. package/dist/export/container.d.ts +3 -0
  63. package/dist/export/credits.d.ts +4 -0
  64. package/dist/export/glb-options.d.ts +48 -0
  65. package/dist/export/glb.d.ts +8 -0
  66. package/dist/export/hierarchy.d.ts +23 -0
  67. package/dist/export/index.d.ts +5 -0
  68. package/dist/export/index.js +40 -0
  69. package/dist/export/index.js.map +9 -0
  70. package/dist/export/lights.d.ts +8 -0
  71. package/dist/export/lod-coverage.d.ts +12 -0
  72. package/dist/export/materials.d.ts +23 -0
  73. package/dist/export/merge-pivots.d.ts +6 -0
  74. package/dist/export/metadata.d.ts +21 -0
  75. package/dist/export/motion.d.ts +9 -0
  76. package/dist/export/optimize-parts.d.ts +26 -0
  77. package/dist/export/primitive.d.ts +3 -0
  78. package/dist/export/tangents.d.ts +2 -0
  79. package/dist/export/textures.d.ts +22 -0
  80. package/dist/export/version.d.ts +2 -0
  81. package/dist/grammar/index.d.ts +2 -0
  82. package/dist/grammar/index.js +16 -0
  83. package/dist/grammar/index.js.map +9 -0
  84. package/dist/grammar/split.d.ts +21 -0
  85. package/dist/grammar/whyte.d.ts +5 -0
  86. package/dist/index.d.ts +11 -0
  87. package/dist/index.js +457 -0
  88. package/dist/index.js.map +9 -0
  89. package/dist/kinds/building.d.ts +44 -0
  90. package/dist/kinds/faces.d.ts +27 -0
  91. package/dist/kinds/head-armour.d.ts +5 -0
  92. package/dist/kinds/head-beard.d.ts +6 -0
  93. package/dist/kinds/head-bust.d.ts +5 -0
  94. package/dist/kinds/head-extras.d.ts +15 -0
  95. package/dist/kinds/head-face.d.ts +8 -0
  96. package/dist/kinds/head-garb.d.ts +4 -0
  97. package/dist/kinds/head-geom.d.ts +7 -0
  98. package/dist/kinds/head-hair.d.ts +4 -0
  99. package/dist/kinds/head-layout.d.ts +29 -0
  100. package/dist/kinds/head-mesh.d.ts +31 -0
  101. package/dist/kinds/head-mouth.d.ts +4 -0
  102. package/dist/kinds/head-params.d.ts +116 -0
  103. package/dist/kinds/head-presets.d.ts +19 -0
  104. package/dist/kinds/head-rim.d.ts +10 -0
  105. package/dist/kinds/head-tone.d.ts +10 -0
  106. package/dist/kinds/head-torso.d.ts +35 -0
  107. package/dist/kinds/head.d.ts +39 -0
  108. package/dist/kinds/hull-lines.d.ts +65 -0
  109. package/dist/kinds/hull-skin.d.ts +6 -0
  110. package/dist/kinds/hull.d.ts +14 -0
  111. package/dist/kinds/index.d.ts +16 -0
  112. package/dist/kinds/index.js +78 -0
  113. package/dist/kinds/index.js.map +9 -0
  114. package/dist/kinds/mass.d.ts +15 -0
  115. package/dist/kinds/openings.d.ts +30 -0
  116. package/dist/kinds/planned.d.ts +6 -0
  117. package/dist/kinds/roof-chimney.d.ts +16 -0
  118. package/dist/kinds/roof-shape.d.ts +64 -0
  119. package/dist/kinds/roof.d.ts +31 -0
  120. package/dist/kinds/vegetation-fronds.d.ts +15 -0
  121. package/dist/kinds/vegetation-impostor.d.ts +9 -0
  122. package/dist/kinds/vegetation-leaves.d.ts +15 -0
  123. package/dist/kinds/vegetation-mesh.d.ts +21 -0
  124. package/dist/kinds/vegetation-params.d.ts +90 -0
  125. package/dist/kinds/vegetation-presets.d.ts +20 -0
  126. package/dist/kinds/vegetation-skeleton.d.ts +20 -0
  127. package/dist/kinds/vegetation.d.ts +42 -0
  128. package/dist/kinds/vehicle.d.ts +42 -0
  129. package/dist/material/cc0.d.ts +4 -0
  130. package/dist/material/define.d.ts +34 -0
  131. package/dist/material/generator.d.ts +4 -0
  132. package/dist/material/index.d.ts +9 -0
  133. package/dist/material/index.js +70 -0
  134. package/dist/material/index.js.map +9 -0
  135. package/dist/material/library.d.ts +7 -0
  136. package/dist/material/material-def.d.ts +30 -0
  137. package/dist/material/paint/bond.d.ts +3 -0
  138. package/dist/material/paint/canvas.d.ts +39 -0
  139. package/dist/material/paint/cell.d.ts +4 -0
  140. package/dist/material/paint/cells-round.d.ts +5 -0
  141. package/dist/material/paint/cells.d.ts +7 -0
  142. package/dist/material/paint/compose.d.ts +5 -0
  143. package/dist/material/paint/concrete.d.ts +3 -0
  144. package/dist/material/paint/courses.d.ts +31 -0
  145. package/dist/material/paint/decode-png.d.ts +6 -0
  146. package/dist/material/paint/default-sheet.d.ts +4 -0
  147. package/dist/material/paint/fabric.d.ts +4 -0
  148. package/dist/material/paint/foliage-broad.d.ts +5 -0
  149. package/dist/material/paint/foliage-common.d.ts +35 -0
  150. package/dist/material/paint/foliage-compound.d.ts +4 -0
  151. package/dist/material/paint/foliage-conifer.d.ts +5 -0
  152. package/dist/material/paint/foliage-raster.d.ts +26 -0
  153. package/dist/material/paint/foliage.d.ts +3 -0
  154. package/dist/material/paint/image-strip.d.ts +4 -0
  155. package/dist/material/paint/kit.d.ts +5 -0
  156. package/dist/material/paint/masks.d.ts +3 -0
  157. package/dist/material/paint/metal.d.ts +3 -0
  158. package/dist/material/paint/noise.d.ts +9 -0
  159. package/dist/material/paint/normal.d.ts +8 -0
  160. package/dist/material/paint/orm.d.ts +8 -0
  161. package/dist/material/paint/planks.d.ts +3 -0
  162. package/dist/material/paint/plates.d.ts +3 -0
  163. package/dist/material/paint/shapes.d.ts +8 -0
  164. package/dist/material/paint/slate.d.ts +3 -0
  165. package/dist/material/paint/stamp.d.ts +3 -0
  166. package/dist/material/paint/strip.d.ts +3 -0
  167. package/dist/material/paint/surface.d.ts +5 -0
  168. package/dist/material/paint/types.d.ts +65 -0
  169. package/dist/material/paint/validate.d.ts +3 -0
  170. package/dist/material/palette.d.ts +14 -0
  171. package/dist/material/shader-godot.d.ts +2 -0
  172. package/dist/material/shader-three.d.ts +2 -0
  173. package/dist/material/shader.d.ts +46 -0
  174. package/dist/material/slots.d.ts +5 -0
  175. package/dist/material/texture-source.d.ts +34 -0
  176. package/dist/material/trim-sheet.d.ts +38 -0
  177. package/dist/neural/generator.d.ts +25 -0
  178. package/dist/neural/images.d.ts +17 -0
  179. package/dist/neural/index.d.ts +2 -0
  180. package/dist/neural/index.js +14 -0
  181. package/dist/neural/index.js.map +9 -0
  182. package/dist/passes/bake-ao.d.ts +17 -0
  183. package/dist/passes/grime.d.ts +15 -0
  184. package/dist/passes/index.d.ts +6 -0
  185. package/dist/passes/index.js +22 -0
  186. package/dist/passes/index.js.map +9 -0
  187. package/dist/passes/livery.d.ts +19 -0
  188. package/dist/passes/optimize-cache.d.ts +15 -0
  189. package/dist/passes/optimize-weld.d.ts +15 -0
  190. package/dist/passes/optimize.d.ts +28 -0
  191. package/dist/passes/ray-grid.d.ts +23 -0
  192. package/dist/passes/weighted-normals.d.ts +8 -0
  193. package/dist/primitives/beam.d.ts +17 -0
  194. package/dist/primitives/bevel-box.d.ts +13 -0
  195. package/dist/primitives/box.d.ts +16 -0
  196. package/dist/primitives/cell.d.ts +20 -0
  197. package/dist/primitives/check.d.ts +12 -0
  198. package/dist/primitives/closed.d.ts +11 -0
  199. package/dist/primitives/erosion.d.ts +22 -0
  200. package/dist/primitives/font-5x7.d.ts +3 -0
  201. package/dist/primitives/heightfield.d.ts +16 -0
  202. package/dist/primitives/index.d.ts +23 -0
  203. package/dist/primitives/index.js +81 -0
  204. package/dist/primitives/index.js.map +9 -0
  205. package/dist/primitives/lathe-facets.d.ts +8 -0
  206. package/dist/primitives/lathe.d.ts +26 -0
  207. package/dist/primitives/lattice.d.ts +30 -0
  208. package/dist/primitives/loft.d.ts +15 -0
  209. package/dist/primitives/mc-table.d.ts +2 -0
  210. package/dist/primitives/member.d.ts +19 -0
  211. package/dist/primitives/noise.d.ts +34 -0
  212. package/dist/primitives/planar.d.ts +10 -0
  213. package/dist/primitives/prism.d.ts +13 -0
  214. package/dist/primitives/sculpt-edit.d.ts +56 -0
  215. package/dist/primitives/sculpt-tree.d.ts +23 -0
  216. package/dist/primitives/sculpt.d.ts +27 -0
  217. package/dist/primitives/sdf-grid.d.ts +17 -0
  218. package/dist/primitives/sdf-ops.d.ts +37 -0
  219. package/dist/primitives/sdf.d.ts +21 -0
  220. package/dist/primitives/strip-uv.d.ts +11 -0
  221. package/dist/primitives/surface-nets.d.ts +7 -0
  222. package/dist/primitives/sweep.d.ts +19 -0
  223. package/dist/primitives/terrain-color.d.ts +30 -0
  224. package/dist/primitives/terrain-grid.d.ts +36 -0
  225. package/dist/primitives/text-layout.d.ts +22 -0
  226. package/dist/primitives/text.d.ts +27 -0
  227. package/dist/primitives/tiled.d.ts +22 -0
  228. package/dist/primitives/transport.d.ts +17 -0
  229. package/dist/primitives/triangulate.d.ts +2 -0
  230. package/dist/primitives/value-noise.d.ts +10 -0
  231. package/dist/qa/checks.d.ts +11 -0
  232. package/dist/qa/clash.d.ts +2 -0
  233. package/dist/qa/floating.d.ts +5 -0
  234. package/dist/qa/gates.d.ts +12 -0
  235. package/dist/qa/geometry.d.ts +21 -0
  236. package/dist/qa/index.d.ts +12 -0
  237. package/dist/qa/index.js +78 -0
  238. package/dist/qa/index.js.map +9 -0
  239. package/dist/qa/inside.d.ts +12 -0
  240. package/dist/qa/inspect.d.ts +18 -0
  241. package/dist/qa/lods.d.ts +12 -0
  242. package/dist/qa/measures.d.ts +4 -0
  243. package/dist/qa/occlusion.d.ts +3 -0
  244. package/dist/qa/sanity.d.ts +7 -0
  245. package/dist/qa/types.d.ts +12 -0
  246. package/dist/render/beauty.d.ts +40 -0
  247. package/dist/render/camera.d.ts +33 -0
  248. package/dist/render/depth-map.d.ts +38 -0
  249. package/dist/render/font.d.ts +1 -0
  250. package/dist/render/ground.d.ts +13 -0
  251. package/dist/render/index.d.ts +10 -0
  252. package/dist/render/index.js +47 -0
  253. package/dist/render/index.js.map +9 -0
  254. package/dist/render/lighting.d.ts +27 -0
  255. package/dist/render/lod-strip.d.ts +5 -0
  256. package/dist/render/metrics.d.ts +37 -0
  257. package/dist/render/options.d.ts +28 -0
  258. package/dist/render/photo-match.d.ts +19 -0
  259. package/dist/render/raster.d.ts +25 -0
  260. package/dist/render/resolve.d.ts +11 -0
  261. package/dist/render/review-prompt.d.ts +2 -0
  262. package/dist/render/review-warnings.d.ts +34 -0
  263. package/dist/render/review.d.ts +24 -0
  264. package/dist/render/scene.d.ts +18 -0
  265. package/dist/render/shade.d.ts +22 -0
  266. package/dist/render/sheet.d.ts +15 -0
  267. package/dist/render/texture.d.ts +15 -0
  268. package/dist/render/thumbnail.d.ts +8 -0
  269. package/dist/render/vis-buffer.d.ts +18 -0
  270. package/dist/testing/assert.d.ts +21 -0
  271. package/dist/testing/compiled.d.ts +15 -0
  272. package/dist/testing/hash.d.ts +1 -0
  273. package/dist/testing/index.d.ts +4 -0
  274. package/dist/testing/index.js +134 -0
  275. package/dist/testing/index.js.map +13 -0
  276. package/dist/testing/snapshot.d.ts +13 -0
  277. package/docs/README.md +56 -0
  278. package/docs/architecture/README.md +68 -0
  279. package/docs/architecture/adding-a-kind.md +44 -0
  280. package/docs/architecture/adding-a-primitive.md +49 -0
  281. package/docs/architecture/errors.md +47 -0
  282. package/docs/architecture/glb-production.md +214 -0
  283. package/docs/architecture/gltf-capabilities.md +117 -0
  284. package/docs/architecture/materials.md +151 -0
  285. package/docs/decisions/001-recipe-compiler-over-ai-meshes.md +27 -0
  286. package/docs/decisions/002-typescript-not-json.md +22 -0
  287. package/docs/decisions/003-shared-trim-sheet.md +21 -0
  288. package/docs/decisions/004-z-up-metres.md +21 -0
  289. package/docs/decisions/005-zero-runtime-deps.md +21 -0
  290. package/docs/decisions/006-single-package-subpath-exports.md +20 -0
  291. package/docs/decisions/007-cpu-contact-sheets.md +21 -0
  292. package/docs/decisions/008-surface-materials.md +21 -0
  293. package/docs/decisions/009-gltf-front-axis.md +21 -0
  294. package/docs/decisions/README.md +15 -0
  295. package/docs/idea/01-vision.md +117 -0
  296. package/docs/idea/02-dsl.md +343 -0
  297. package/docs/idea/03-ir.md +97 -0
  298. package/docs/idea/04-materials.md +114 -0
  299. package/docs/idea/05-agent-loop.md +141 -0
  300. package/docs/idea/06-qa.md +101 -0
  301. package/docs/idea/07-what-fits.md +45 -0
  302. package/docs/idea/08-neural-adapters.md +78 -0
  303. package/docs/idea/09-kinds.md +105 -0
  304. package/docs/idea/10-sculpting.md +166 -0
  305. package/docs/idea/11-materials-authoring.md +132 -0
  306. package/docs/idea/12-blender-bridge.md +136 -0
  307. package/docs/idea/13-asset-pipeline-research.md +89 -0
  308. package/docs/landscape.md +49 -0
  309. package/docs/plans/roadmap.md +139 -0
  310. package/examples/build-with-bun.ts +41 -0
  311. package/llms.txt +47 -0
  312. package/package.json +100 -4
  313. package/recipes/README.md +38 -0
  314. package/recipes/asteroid/README.md +46 -0
  315. package/recipes/asteroid/asteroid.ts +336 -0
  316. package/recipes/boulders/README.md +28 -0
  317. package/recipes/boulders/boulders.ts +117 -0
  318. package/recipes/boxcar/README.md +53 -0
  319. package/recipes/boxcar/boxcar.ts +1000 -0
  320. package/recipes/cargo_container_scifi/README.md +52 -0
  321. package/recipes/cargo_container_scifi/cargo_container_scifi.ts +461 -0
  322. package/recipes/dropship/README.md +84 -0
  323. package/recipes/dropship/dropship.ts +1144 -0
  324. package/recipes/eiffel_tower/README.md +110 -0
  325. package/recipes/eiffel_tower/eiffel_tower.ts +781 -0
  326. package/recipes/goblin_head/README.md +75 -0
  327. package/recipes/goblin_head/goblin_head.ts +38 -0
  328. package/recipes/human_head/README.md +68 -0
  329. package/recipes/human_head/human_head.ts +38 -0
  330. package/recipes/loco_440/README.md +32 -0
  331. package/recipes/loco_440/loco_440.ts +1404 -0
  332. package/recipes/material_swatches/README.md +21 -0
  333. package/recipes/material_swatches/material_swatches.ts +189 -0
  334. package/recipes/mountain_range/README.md +45 -0
  335. package/recipes/mountain_range/mountain_range.ts +128 -0
  336. package/recipes/oak/README.md +30 -0
  337. package/recipes/oak/oak.ts +19 -0
  338. package/recipes/orc_head/README.md +78 -0
  339. package/recipes/orc_head/orc_head.ts +41 -0
  340. package/recipes/palm/README.md +30 -0
  341. package/recipes/palm/palm.ts +19 -0
  342. package/recipes/pine/README.md +29 -0
  343. package/recipes/pine/pine.ts +19 -0
  344. package/recipes/signal_gantry/README.md +36 -0
  345. package/recipes/signal_gantry/signal_gantry.ts +522 -0
  346. package/recipes/station_halt/README.md +39 -0
  347. package/recipes/station_halt/station_halt.ts +722 -0
  348. package/recipes/t34/README.md +44 -0
  349. package/recipes/t34/t34.ts +1068 -0
  350. package/recipes/tiger_1/README.md +75 -0
  351. package/recipes/tiger_1/tiger_1.ts +1370 -0
  352. package/recipes/water_tower/README.md +40 -0
  353. package/recipes/water_tower/water_tower.ts +542 -0
  354. package/src/cli/args.ts +125 -0
  355. package/src/cli/bin.ts +7 -0
  356. package/src/cli/load.ts +17 -0
  357. package/src/cli/manifest.ts +95 -0
  358. package/src/cli/render-cmds.ts +66 -0
  359. package/src/cli/run.ts +192 -0
  360. package/src/cli/texture-cache.ts +24 -0
  361. package/src/core/asset.ts +129 -0
  362. package/src/core/definition.ts +156 -0
  363. package/src/core/errors.ts +50 -0
  364. package/src/core/family.ts +50 -0
  365. package/src/core/index.ts +66 -0
  366. package/src/core/mesh.ts +114 -0
  367. package/src/core/part.ts +130 -0
  368. package/src/core/png.ts +49 -0
  369. package/src/core/rng.ts +49 -0
  370. package/src/core/transform.ts +90 -0
  371. package/src/core/vec.ts +26 -0
  372. package/src/core/world.ts +80 -0
  373. package/src/export/bin-writer.ts +79 -0
  374. package/src/export/container.ts +35 -0
  375. package/src/export/credits.ts +25 -0
  376. package/src/export/glb-options.ts +53 -0
  377. package/src/export/glb.ts +187 -0
  378. package/src/export/hierarchy.ts +122 -0
  379. package/src/export/index.ts +34 -0
  380. package/src/export/lights.ts +49 -0
  381. package/src/export/lod-coverage.ts +71 -0
  382. package/src/export/materials.ts +126 -0
  383. package/src/export/merge-pivots.ts +146 -0
  384. package/src/export/metadata.ts +62 -0
  385. package/src/export/motion.ts +70 -0
  386. package/src/export/optimize-parts.ts +80 -0
  387. package/src/export/primitive.ts +35 -0
  388. package/src/export/tangents.ts +75 -0
  389. package/src/export/textures.ts +88 -0
  390. package/src/export/version.ts +6 -0
  391. package/src/grammar/index.ts +4 -0
  392. package/src/grammar/split.ts +87 -0
  393. package/src/grammar/whyte.ts +20 -0
  394. package/src/index.ts +14 -0
  395. package/src/kinds/building.ts +153 -0
  396. package/src/kinds/faces.ts +138 -0
  397. package/src/kinds/head-armour.ts +181 -0
  398. package/src/kinds/head-beard.ts +133 -0
  399. package/src/kinds/head-bust.ts +184 -0
  400. package/src/kinds/head-extras.ts +150 -0
  401. package/src/kinds/head-face.ts +242 -0
  402. package/src/kinds/head-garb.ts +181 -0
  403. package/src/kinds/head-geom.ts +31 -0
  404. package/src/kinds/head-hair.ts +193 -0
  405. package/src/kinds/head-layout.ts +63 -0
  406. package/src/kinds/head-mesh.ts +195 -0
  407. package/src/kinds/head-mouth.ts +111 -0
  408. package/src/kinds/head-params.ts +162 -0
  409. package/src/kinds/head-presets.ts +155 -0
  410. package/src/kinds/head-rim.ts +128 -0
  411. package/src/kinds/head-tone.ts +52 -0
  412. package/src/kinds/head-torso.ts +230 -0
  413. package/src/kinds/head.ts +176 -0
  414. package/src/kinds/hull-lines.ts +160 -0
  415. package/src/kinds/hull-skin.ts +83 -0
  416. package/src/kinds/hull.ts +209 -0
  417. package/src/kinds/index.ts +63 -0
  418. package/src/kinds/mass.ts +110 -0
  419. package/src/kinds/openings.ts +141 -0
  420. package/src/kinds/planned.ts +12 -0
  421. package/src/kinds/roof-chimney.ts +100 -0
  422. package/src/kinds/roof-shape.ts +230 -0
  423. package/src/kinds/roof.ts +250 -0
  424. package/src/kinds/vegetation-fronds.ts +126 -0
  425. package/src/kinds/vegetation-impostor.ts +118 -0
  426. package/src/kinds/vegetation-leaves.ts +168 -0
  427. package/src/kinds/vegetation-mesh.ts +174 -0
  428. package/src/kinds/vegetation-params.ts +147 -0
  429. package/src/kinds/vegetation-presets.ts +184 -0
  430. package/src/kinds/vegetation-skeleton.ts +168 -0
  431. package/src/kinds/vegetation.ts +199 -0
  432. package/src/kinds/vehicle.ts +144 -0
  433. package/src/material/cc0.ts +41 -0
  434. package/src/material/define.ts +130 -0
  435. package/src/material/generator.ts +63 -0
  436. package/src/material/index.ts +60 -0
  437. package/src/material/library.ts +196 -0
  438. package/src/material/material-def.ts +84 -0
  439. package/src/material/paint/bond.ts +60 -0
  440. package/src/material/paint/canvas.ts +101 -0
  441. package/src/material/paint/cell.ts +39 -0
  442. package/src/material/paint/cells-round.ts +119 -0
  443. package/src/material/paint/cells.ts +111 -0
  444. package/src/material/paint/compose.ts +53 -0
  445. package/src/material/paint/concrete.ts +62 -0
  446. package/src/material/paint/courses.ts +85 -0
  447. package/src/material/paint/decode-png.ts +106 -0
  448. package/src/material/paint/default-sheet.ts +73 -0
  449. package/src/material/paint/fabric.ts +63 -0
  450. package/src/material/paint/foliage-broad.ts +126 -0
  451. package/src/material/paint/foliage-common.ts +93 -0
  452. package/src/material/paint/foliage-compound.ts +135 -0
  453. package/src/material/paint/foliage-conifer.ts +143 -0
  454. package/src/material/paint/foliage-raster.ts +196 -0
  455. package/src/material/paint/foliage.ts +23 -0
  456. package/src/material/paint/image-strip.ts +88 -0
  457. package/src/material/paint/kit.ts +37 -0
  458. package/src/material/paint/masks.ts +46 -0
  459. package/src/material/paint/metal.ts +109 -0
  460. package/src/material/paint/noise.ts +52 -0
  461. package/src/material/paint/normal.ts +52 -0
  462. package/src/material/paint/orm.ts +108 -0
  463. package/src/material/paint/planks.ts +101 -0
  464. package/src/material/paint/plates.ts +72 -0
  465. package/src/material/paint/shapes.ts +28 -0
  466. package/src/material/paint/slate.ts +52 -0
  467. package/src/material/paint/stamp.ts +40 -0
  468. package/src/material/paint/strip.ts +48 -0
  469. package/src/material/paint/surface.ts +60 -0
  470. package/src/material/paint/types.ts +94 -0
  471. package/src/material/paint/validate.ts +74 -0
  472. package/src/material/palette.ts +46 -0
  473. package/src/material/shader-godot.ts +77 -0
  474. package/src/material/shader-three.ts +103 -0
  475. package/src/material/shader.ts +100 -0
  476. package/src/material/slots.ts +18 -0
  477. package/src/material/texture-source.ts +86 -0
  478. package/src/material/trim-sheet.ts +166 -0
  479. package/src/neural/generator.ts +37 -0
  480. package/src/neural/images.ts +27 -0
  481. package/src/neural/index.ts +10 -0
  482. package/src/passes/bake-ao.ts +183 -0
  483. package/src/passes/grime.ts +37 -0
  484. package/src/passes/index.ts +8 -0
  485. package/src/passes/livery.ts +66 -0
  486. package/src/passes/optimize-cache.ts +175 -0
  487. package/src/passes/optimize-weld.ts +147 -0
  488. package/src/passes/optimize.ts +85 -0
  489. package/src/passes/ray-grid.ts +237 -0
  490. package/src/passes/weighted-normals.ts +125 -0
  491. package/src/primitives/beam.ts +60 -0
  492. package/src/primitives/bevel-box.ts +140 -0
  493. package/src/primitives/box.ts +90 -0
  494. package/src/primitives/cell.ts +115 -0
  495. package/src/primitives/check.ts +49 -0
  496. package/src/primitives/closed.ts +74 -0
  497. package/src/primitives/erosion.ts +183 -0
  498. package/src/primitives/font-5x7.ts +117 -0
  499. package/src/primitives/heightfield.ts +101 -0
  500. package/src/primitives/index.ts +56 -0
  501. package/src/primitives/lathe-facets.ts +45 -0
  502. package/src/primitives/lathe.ts +174 -0
  503. package/src/primitives/lattice.ts +131 -0
  504. package/src/primitives/loft.ts +174 -0
  505. package/src/primitives/mc-table.ts +41 -0
  506. package/src/primitives/member.ts +130 -0
  507. package/src/primitives/noise.ts +157 -0
  508. package/src/primitives/planar.ts +55 -0
  509. package/src/primitives/prism.ts +85 -0
  510. package/src/primitives/sculpt-edit.ts +212 -0
  511. package/src/primitives/sculpt-tree.ts +226 -0
  512. package/src/primitives/sculpt.ts +80 -0
  513. package/src/primitives/sdf-grid.ts +131 -0
  514. package/src/primitives/sdf-ops.ts +145 -0
  515. package/src/primitives/sdf.ts +83 -0
  516. package/src/primitives/strip-uv.ts +26 -0
  517. package/src/primitives/surface-nets.ts +161 -0
  518. package/src/primitives/sweep.ts +162 -0
  519. package/src/primitives/terrain-color.ts +85 -0
  520. package/src/primitives/terrain-grid.ts +137 -0
  521. package/src/primitives/text-layout.ts +85 -0
  522. package/src/primitives/text.ts +197 -0
  523. package/src/primitives/tiled.ts +93 -0
  524. package/src/primitives/transport.ts +85 -0
  525. package/src/primitives/triangulate.ts +42 -0
  526. package/src/primitives/value-noise.ts +62 -0
  527. package/src/qa/checks.ts +110 -0
  528. package/src/qa/clash.ts +177 -0
  529. package/src/qa/floating.ts +63 -0
  530. package/src/qa/gates.ts +126 -0
  531. package/src/qa/geometry.ts +187 -0
  532. package/src/qa/index.ts +28 -0
  533. package/src/qa/inside.ts +114 -0
  534. package/src/qa/inspect.ts +107 -0
  535. package/src/qa/lods.ts +97 -0
  536. package/src/qa/measures.ts +67 -0
  537. package/src/qa/occlusion.ts +166 -0
  538. package/src/qa/sanity.ts +137 -0
  539. package/src/qa/types.ts +17 -0
  540. package/src/render/beauty.ts +115 -0
  541. package/src/render/camera.ts +142 -0
  542. package/src/render/depth-map.ts +191 -0
  543. package/src/render/font.ts +76 -0
  544. package/src/render/ground.ts +87 -0
  545. package/src/render/index.ts +34 -0
  546. package/src/render/lighting.ts +121 -0
  547. package/src/render/lod-strip.ts +34 -0
  548. package/src/render/metrics.ts +147 -0
  549. package/src/render/options.ts +81 -0
  550. package/src/render/photo-match.ts +28 -0
  551. package/src/render/raster.ts +143 -0
  552. package/src/render/resolve.ts +109 -0
  553. package/src/render/review-prompt.ts +59 -0
  554. package/src/render/review-warnings.ts +92 -0
  555. package/src/render/review.ts +103 -0
  556. package/src/render/scene.ts +119 -0
  557. package/src/render/shade.ts +204 -0
  558. package/src/render/sheet.ts +88 -0
  559. package/src/render/texture.ts +97 -0
  560. package/src/render/thumbnail.ts +75 -0
  561. package/src/render/vis-buffer.ts +119 -0
  562. package/src/testing/assert.ts +115 -0
  563. package/src/testing/compiled.ts +31 -0
  564. package/src/testing/hash.ts +14 -0
  565. package/src/testing/index.ts +14 -0
  566. package/src/testing/snapshot.ts +37 -0
  567. package/src/types/gltf-validator.d.ts +13 -0
@@ -0,0 +1,56 @@
1
+ import type { Vec3 } from '../core/index.js';
2
+ import { type Field } from './sdf-ops.js';
3
+ export type SculptShape = 'sphere' | 'ellipsoid' | 'capsule' | 'roundBox' | 'cone' | 'torus';
4
+ /** An edit: one shape, or a group of edits folded on their own first (local trims). */
5
+ export type SculptEdit = SculptShapeEdit | SculptGroup;
6
+ /**
7
+ * Edits folded on their own (from nothing), then applied to the sculpt as ONE edit with this
8
+ * op/blend/colour: subtract or intersect inside the group trims only the group's shapes (a
9
+ * half-sphere eyelid, a hair cap stopped at the hairline) and leaves earlier edits alone.
10
+ */
11
+ export interface SculptGroup {
12
+ readonly group: readonly SculptEdit[];
13
+ readonly op?: 'add' | 'subtract' | 'intersect';
14
+ readonly blend?: number;
15
+ /** Default colour of the group's own edits (and its colour when it carves). */
16
+ readonly color?: Vec3;
17
+ /** Default mirror for the group's edits. */
18
+ readonly mirror?: boolean;
19
+ }
20
+ export interface SculptShapeEdit {
21
+ readonly shape: SculptShape;
22
+ /** Centre (sphere, ellipsoid, roundBox, torus), base centre (cone) or start (capsule). */
23
+ readonly at: Vec3;
24
+ /**
25
+ * sphere: radius · ellipsoid: [rx, ry, rz] · roundBox: full [x, y, z] · cone: [base radius,
26
+ * top radius, height] along local +Z · torus: [ring radius, tube radius] in local XY ·
27
+ * capsule: radius (segment `at` → `to`).
28
+ */
29
+ readonly size: number | readonly [number, number] | Vec3;
30
+ /** Capsule end point. */
31
+ readonly to?: Vec3;
32
+ /** Degrees about X, then Y, then Z (world axes), around `at`. */
33
+ readonly rotate?: Vec3;
34
+ /** roundBox edge radius, metres. */
35
+ readonly round?: number;
36
+ readonly op?: 'add' | 'subtract' | 'intersect' | 'paint';
37
+ /** Smooth-blend radius in metres (0 = hard edge). For paint: the colour falloff width. */
38
+ readonly blend?: number;
39
+ readonly color?: Vec3;
40
+ /** Override the sculpt's `mirror` for this edit (e.g. one scar). */
41
+ readonly mirror?: boolean;
42
+ }
43
+ export declare function sculptShape(e: SculptShapeEdit, i: number, mirrorAll: boolean): Field;
44
+ /**
45
+ * A sphere the shape lies in, and how its field compares with the distance to it: every shape's
46
+ * value v satisfies v ≥ scale · (|p − centre| − radius) outside the sphere (scale 1 = exact SDFs;
47
+ * the ellipsoid approximation only guarantees (r_min / r_max)², and nothing inside its sphere).
48
+ */
49
+ export declare function shapeSphere(e: SculptShapeEdit): {
50
+ c: Vec3;
51
+ r: number;
52
+ scale: number;
53
+ inside: boolean;
54
+ };
55
+ /** Conservative world bounds of an add edit (bounding sphere), grown by its blend radius. */
56
+ export declare function editBounds(e: SculptEdit, mirrorAll: boolean): [Vec3, Vec3];
@@ -0,0 +1,23 @@
1
+ import type { Vec3 } from '../core/index.js';
2
+ import { type SculptEdit } from './sculpt-edit.js';
3
+ import type { Field } from './sdf-ops.js';
4
+ export interface Node {
5
+ readonly op: number;
6
+ readonly k: number;
7
+ /** The edit's own colour (shapes), or null. */
8
+ readonly color: Vec3 | null;
9
+ readonly shape: Field | null;
10
+ readonly kids: readonly Node[] | null;
11
+ /** Default colour for this group's edits; its scratch colour buffer. */
12
+ readonly base: Vec3;
13
+ readonly rgb: Float64Array;
14
+ readonly c: Vec3;
15
+ readonly r: number;
16
+ readonly scale: number;
17
+ readonly inside: boolean;
18
+ readonly mirror: boolean;
19
+ readonly under: number;
20
+ }
21
+ export declare function compile(edits: readonly SculptEdit[], base: Vec3, mirror: boolean, path?: string): Node[];
22
+ /** Fold `nodes` at p; writes the blended colour into `rgb` (seeded with `base`) when given. */
23
+ export declare function fold(nodes: readonly Node[], p: Vec3, rgb: Float64Array | null, base: Vec3, sparse?: boolean): number;
@@ -0,0 +1,27 @@
1
+ import type { Mesh, Vec3 } from '../core/index.js';
2
+ import type { StripId } from '../material/index.js';
3
+ import { type SculptEdit } from './sculpt-edit.js';
4
+ import type { Field } from './sdf-ops.js';
5
+ export type { SculptEdit, SculptGroup, SculptShape, SculptShapeEdit } from './sculpt-edit.js';
6
+ export interface SculptField {
7
+ readonly field: Field;
8
+ /** Blended edit colour at a point (call at surface points). */
9
+ readonly colorAt: (p: Vec3) => Vec3;
10
+ /** Edits' bounds grown by their blend radii. */
11
+ readonly bounds: readonly [Vec3, Vec3];
12
+ }
13
+ export interface SculptOptions {
14
+ readonly edits: readonly SculptEdit[];
15
+ /** Cell edge in metres (the LOD knob). */
16
+ readonly resolution: number;
17
+ /** Colour of edits that give none. */
18
+ readonly color: Vec3;
19
+ readonly mirror?: 'y';
20
+ readonly mesher?: 'nets' | 'cubes';
21
+ readonly strip?: StripId;
22
+ }
23
+ export declare function sculptField(edits: readonly SculptEdit[], o: {
24
+ readonly color: Vec3;
25
+ readonly mirror?: 'y';
26
+ }): SculptField;
27
+ export declare function sculpt(o: SculptOptions): Mesh;
@@ -0,0 +1,17 @@
1
+ import type { Vec3 } from '../core/index.js';
2
+ import type { Field } from './sdf-ops.js';
3
+ export interface Grid {
4
+ /** Points per axis. */
5
+ readonly nx: number;
6
+ readonly ny: number;
7
+ readonly nz: number;
8
+ /** Position of point (0, 0, 0) and the cell edge, metres. */
9
+ readonly origin: Vec3;
10
+ readonly h: number;
11
+ readonly values: Float32Array;
12
+ /** The clipped field the grid sampled (normals take its gradient). */
13
+ readonly field: Field;
14
+ }
15
+ /** Grid points above this are refused (≈ 80 MB of samples). */
16
+ export declare const MAX_POINTS: number;
17
+ export declare function sampleGrid(raw: Field, bounds: readonly [Vec3, Vec3], h: number, lipschitz: number, symmetricY?: boolean): Grid;
@@ -0,0 +1,37 @@
1
+ import type { Vec3 } from '../core/index.js';
2
+ export type Field = (p: Vec3) => number;
3
+ /** Shape distances in the shape's own frame (centre/base at the origin). */
4
+ export declare const shapes: {
5
+ sphere: (x: number, y: number, z: number, r: number) => number;
6
+ ellipsoid(x: number, y: number, z: number, rx: number, ry: number, rz: number): number;
7
+ /** Box of half extents (hx, hy, hz) with edges rounded by `r`. */
8
+ roundBox(x: number, y: number, z: number, hx: number, hy: number, hz: number, r: number): number;
9
+ /** Segment (0,0,0) → (0,0,len) with radius r. */
10
+ capsule(x: number, y: number, z: number, len: number, r: number): number;
11
+ /** Capped cone standing on z = 0: base radius r1, top radius r2, height h. */
12
+ cone(x: number, y: number, z: number, r1: number, r2: number, h: number): number;
13
+ /** Ring in the XY plane: major radius R, tube radius r. */
14
+ torus(x: number, y: number, z: number, R: number, r: number): number;
15
+ };
16
+ /** Polynomial smooth-min weight: 1 → all `a`, 0 → all `b`; k = 0 is a hard min. */
17
+ export declare const smoothWeight: (a: number, b: number, k: number) => number;
18
+ /** Field constructors and combinators, world space. */
19
+ export declare const sd: {
20
+ sphere: (at: Vec3, r: number) => Field;
21
+ ellipsoid: (at: Vec3, radii: Vec3) => Field;
22
+ /** Axis-aligned box of full `size` centred on `at`, edges rounded by `round`. */
23
+ box: (at: Vec3, size: Vec3, round?: number) => Field;
24
+ capsule(a: Vec3, b: Vec3, r: number): Field;
25
+ cone: (at: Vec3, r1: number, r2: number, h: number) => Field;
26
+ torus: (at: Vec3, R: number, r: number) => Field;
27
+ union: (...fs: readonly Field[]) => Field;
28
+ intersect: (a: Field, b: Field) => Field;
29
+ /** a minus b. */
30
+ subtract: (a: Field, b: Field) => Field;
31
+ /** Union with a fillet of radius ~k metres between the two. */
32
+ smoothUnion: (k: number, a: Field, b: Field) => Field;
33
+ /** a minus b with a rounded crease of ~k metres. */
34
+ smoothSubtract: (k: number, a: Field, b: Field) => Field;
35
+ /** Push the surface out/in by `amount` metres × noise (∈ [−1, 1]). */
36
+ displace: (f: Field, noise: Field, amount: number) => Field;
37
+ };
@@ -0,0 +1,21 @@
1
+ import { type Mesh, type Vec3 } from '../core/index.js';
2
+ import { type StripId } from '../material/index.js';
3
+ /** One colour, or one per vertex from its position and unit normal (moss on top, dark in cracks). */
4
+ export type SdfColor = Vec3 | ((p: Vec3, n: Vec3) => Vec3);
5
+ export interface SdfOptions {
6
+ /** Signed distance in metres: negative inside. Must not keep the `p` it is given. */
7
+ readonly field: (p: Vec3) => number;
8
+ /** [min, max] corners; the surface is clipped to this box, so it is always closed. */
9
+ readonly bounds: readonly [Vec3, Vec3];
10
+ /** Cell edge in metres (the LOD knob). */
11
+ readonly resolution: number;
12
+ readonly color: SdfColor;
13
+ readonly strip?: StripId;
14
+ readonly mesher?: 'nets' | 'cubes';
15
+ /** Upper bound on |∇field| (1 for exact distances). Raise it for strongly displaced fields so
16
+ * the sparse pass never skips a block that holds surface. Default 1.25. */
17
+ readonly lipschitz?: number;
18
+ /** 'y': the field is mirror-symmetric across y = 0 — snap the grid so the mesh is too. */
19
+ readonly symmetry?: 'y';
20
+ }
21
+ export declare function sdf(o: SdfOptions): Mesh;
@@ -0,0 +1,11 @@
1
+ import { type StripId, type UvRect } from '../material/index.js';
2
+ /** Half a texel at the house sheet size: keeps bilinear samples inside the region. */
3
+ export declare const HALF_TEXEL: number;
4
+ /** World metres one strip band covers along V on the house sheet (`scaleMetres`). */
5
+ export declare const stripVMetres: (id: StripId) => number;
6
+ /** U for a run of `metres` along the strip. */
7
+ export declare const stripU: (rect: UvRect, metres: number) => number;
8
+ /** V for a fraction 0..1 of one band. */
9
+ export declare const stripV: (rect: UvRect, frac: number) => number;
10
+ /** V for any metre value, mirrored every band: continuous, never leaves the strip (organic). */
11
+ export declare function mirroredV(rect: UvRect, metres: number, vMetres: number): number;
@@ -0,0 +1,7 @@
1
+ import type { Grid } from './sdf-grid.js';
2
+ export interface RawSurface {
3
+ readonly pos: number[];
4
+ readonly tris: number[];
5
+ }
6
+ export declare function surfaceNets(g: Grid): RawSurface;
7
+ export declare function marchingCubes(g: Grid): RawSurface;
@@ -0,0 +1,19 @@
1
+ import { type Mesh, type Vec2, type Vec3 } from '../core/index.js';
2
+ import { type StripId } from '../material/index.js';
3
+ export interface SweepOptions {
4
+ /** Closed section in the frame's (normal, binormal) plane, either winding; or a circle. */
5
+ readonly section: readonly Vec2[] | {
6
+ readonly radius: number;
7
+ readonly segments: number;
8
+ };
9
+ readonly path: readonly Vec3[];
10
+ /** Section scale per path point (taper). Default 1 everywhere. */
11
+ readonly scale?: readonly number[];
12
+ /** Total section rotation from first to last point, degrees, spread by arc length. */
13
+ readonly twist?: number;
14
+ readonly color: Vec3;
15
+ readonly strip?: StripId;
16
+ /** Close the ends with fans about the path point: both, or just one. */
17
+ readonly caps?: boolean | 'start' | 'end';
18
+ }
19
+ export declare function sweep(o: SweepOptions): Mesh;
@@ -0,0 +1,30 @@
1
+ import type { Vec3 } from '../core/index.js';
2
+ import type { Noise2 } from './noise.js';
3
+ import { type TerrainGrid } from './terrain-grid.js';
4
+ export interface TerrainPalette {
5
+ readonly forest: Vec3;
6
+ readonly grass: Vec3;
7
+ /** Alpine debris/tundra above the meadows and on deposits. */
8
+ readonly scree: Vec3;
9
+ readonly rock: Vec3;
10
+ readonly snow: Vec3;
11
+ /** Damp ground in gullies and river beds. */
12
+ readonly wet: Vec3;
13
+ }
14
+ export interface TerrainColorOptions {
15
+ readonly palette: TerrainPalette;
16
+ /** Altitude of z = 0 in metres above sea level (z is relative to it). Default 0. */
17
+ readonly datum?: number;
18
+ /** Altitude where forest gives way to meadow, m. */
19
+ readonly treeline: number;
20
+ /** Altitude above which snow lies on gentle slopes, m. */
21
+ readonly snowline: number;
22
+ /** Slope (rise/run) where bare rock takes over: default 0.8 (≈ 39°). */
23
+ readonly rockSlope?: number;
24
+ /** Steepest slope that holds snow: default 1.0 (45°). */
25
+ readonly snowSlope?: number;
26
+ /** Noise in [−1, 1] (metres in) jittering every boundary; `jitter` = its altitude reach, m. */
27
+ readonly noise?: Noise2;
28
+ readonly jitter?: number;
29
+ }
30
+ export declare function terrainColor(g: TerrainGrid, o: TerrainColorOptions): (x: number, y: number, z: number) => Vec3;
@@ -0,0 +1,36 @@
1
+ export interface TerrainGrid {
2
+ /** Points along X and Y (cells + 1). Row-major: index = j · nx + i. */
3
+ readonly nx: number;
4
+ readonly ny: number;
5
+ /** [minX, minY, maxX, maxY] in metres. */
6
+ readonly rect: readonly [number, number, number, number];
7
+ readonly z: Float64Array;
8
+ /** Water passage per point, 0..1 (rivers, gullies). Set by hydraulicErosion. */
9
+ readonly flow?: Float64Array;
10
+ /** Sediment laid down per point, 0..1 (scree fans, valley fill). Set by hydraulicErosion. */
11
+ readonly deposit?: Float64Array;
12
+ }
13
+ export interface TerrainGridOptions {
14
+ readonly rect: readonly [number, number, number, number];
15
+ /** Cells per side (points = cells + 1); 256 ≈ 8 m on a 2 km tile. */
16
+ readonly cells: number;
17
+ readonly height: (x: number, y: number) => number;
18
+ }
19
+ export declare function terrainGrid(o: TerrainGridOptions): TerrainGrid;
20
+ /** Bilinear reader of any per-point map of the grid, clamped at the edges, in metres. */
21
+ export declare function sampler(g: TerrainGrid, map?: Float64Array): (x: number, y: number) => number;
22
+ /** Slope (rise / run, tan of the angle) at every point, by central differences. */
23
+ export declare function slopeMap(g: TerrainGrid): Float64Array;
24
+ export interface ThermalOptions {
25
+ /** Stable slope as rise/run: 0.7 ≈ 35° (scree's angle of repose). Default 0.7. */
26
+ readonly talus?: number;
27
+ readonly iterations?: number;
28
+ /** Share of the excess moved per iteration, 0..0.5. Default 0.4. */
29
+ readonly rate?: number;
30
+ }
31
+ /**
32
+ * Thermal erosion: wherever a neighbour sits lower than the talus slope allows, part of the
33
+ * excess slides down to it. Every iteration reads the old heights and writes a new array, so the
34
+ * result is independent of visiting order.
35
+ */
36
+ export declare function thermalErosion(g: TerrainGrid, o?: ThermalOptions): TerrainGrid;
@@ -0,0 +1,22 @@
1
+ export type TextFont = '5x7' | 'block';
2
+ export interface MeasureOptions {
3
+ /** Cap height in metres (the 7 glyph rows). */
4
+ readonly height: number;
5
+ readonly font?: TextFont;
6
+ /** Gap between glyphs in pixels (1 px = height / 7). Default 1. */
7
+ readonly tracking?: number;
8
+ }
9
+ /** A filled rectangle: columns [c0, c1) from the line start, rows [r0, r1) from the cap line. */
10
+ export interface PixelRect {
11
+ readonly c0: number;
12
+ readonly c1: number;
13
+ readonly r0: number;
14
+ readonly r1: number;
15
+ }
16
+ /** Width of `str` in metres when set at cap `height`. Throws on characters without a glyph. */
17
+ export declare function measureText(str: string, o: MeasureOptions): number;
18
+ /** The line as merged pixel rectangles, plus its width in pixels. */
19
+ export declare function layout(str: string, font: TextFont, tracking: number): {
20
+ rects: PixelRect[];
21
+ width: number;
22
+ };
@@ -0,0 +1,27 @@
1
+ import { type Mesh, type Vec3 } from '../core/index.js';
2
+ import { type StripId } from '../material/index.js';
3
+ import { type TextFont } from './text-layout.js';
4
+ export { type MeasureOptions, measureText, type TextFont } from './text-layout.js';
5
+ export interface TextOptions {
6
+ readonly origin: Vec3;
7
+ /** Reading direction. Default +Y (a sign read from +X). */
8
+ readonly along?: Vec3;
9
+ /** Letter up. Default +Z. */
10
+ readonly up?: Vec3;
11
+ /** Cap height in metres. */
12
+ readonly height: number;
13
+ readonly color: Vec3;
14
+ readonly font?: TextFont;
15
+ /** Raised thickness in metres; 0 = flush decal lifted 2 mm. Default 0. */
16
+ readonly depth?: number;
17
+ /** Gap between glyphs in pixels (height / 7). Default 1. */
18
+ readonly tracking?: number;
19
+ readonly align?: 'left' | 'centre' | 'right';
20
+ /** Shrink the cap height so the line fits this width, metres. */
21
+ readonly maxWidth?: number;
22
+ /** Offset (m, along the facing normal) of the surface under a letter piece. `u` = metres along
23
+ * `along` from `origin` (negative left of a centre/right anchor), `v` = metres up from it. */
24
+ readonly surface?: (u: number, v: number) => number;
25
+ readonly strip?: StripId;
26
+ }
27
+ export declare function text(str: string, o: TextOptions): Mesh;
@@ -0,0 +1,22 @@
1
+ import { type Mesh, type Vec3 } from '../core/index.js';
2
+ import { type StripId } from '../material/index.js';
3
+ export interface TiledOptions {
4
+ /** One corner of the face. */
5
+ readonly origin: Vec3;
6
+ /** Edge along the strip (texture U), metres. */
7
+ readonly u: Vec3;
8
+ /** The other edge, texture "up" (V), metres. */
9
+ readonly v: Vec3;
10
+ readonly color: Vec3;
11
+ readonly strip?: StripId;
12
+ /** Columns along `u` (vertex density for grime/bending); the LOD knob. Default 1. */
13
+ readonly segments?: number;
14
+ /** Metres the pattern is shifted along U / V (continue a course round a corner). */
15
+ readonly uOffset?: number;
16
+ readonly vOffset?: number;
17
+ /** World metres one strip band spans along V. Default: the house sheet's `scaleMetres`.
18
+ * Raise it to stretch the strip (fewer bands, fewer triangles on a far LOD). */
19
+ readonly vMetres?: number;
20
+ readonly doubleSided?: boolean;
21
+ }
22
+ export declare function tiled(o: TiledOptions): Mesh;
@@ -0,0 +1,17 @@
1
+ import { type Vec3 } from '../core/index.js';
2
+ export interface SweepFrame {
3
+ /** Unit tangent. */
4
+ readonly t: Vec3;
5
+ /** Unit normal: section X. */
6
+ readonly n: Vec3;
7
+ /** Unit binormal t × n: section Y. */
8
+ readonly b: Vec3;
9
+ }
10
+ /** Throws unless the path has ≥ 2 points and no zero-length segment. Returns cumulative lengths. */
11
+ export declare function arcLengths(path: readonly Vec3[]): number[];
12
+ /**
13
+ * One frame per path point. The first normal comes from world X when the path starts near
14
+ * vertical, else world Z, so a path in the XZ plane keeps b = ±Y all the way (trunk widths
15
+ * measured across Y stay exact).
16
+ */
17
+ export declare function transportFrames(path: readonly Vec3[]): SweepFrame[];
@@ -0,0 +1,2 @@
1
+ import type { Vec2 } from '../core/index.js';
2
+ export declare function triangulate(poly: readonly Vec2[]): [number, number, number][];
@@ -0,0 +1,10 @@
1
+ import type { Rng } from '../core/index.js';
2
+ import type { Field } from './sdf-ops.js';
3
+ /**
4
+ * Seeded fractal value noise in [−1, 1]: `scale` = metres per feature, `octaves` halve the scale
5
+ * and amplitude each time. Same Rng state → same field, bit for bit.
6
+ */
7
+ export declare function valueNoise(rng: Rng, o?: {
8
+ readonly scale?: number;
9
+ readonly octaves?: number;
10
+ }): Field;
@@ -0,0 +1,11 @@
1
+ import type { Check, CheckFinding } from '../core/index.js';
2
+ /** Nothing matching `a` sinks into anything matching `b` (closed solids), with optional min gap. */
3
+ export declare const clear: (a: string, b: string, minGap?: number) => Check;
4
+ /** No two parts matching the selector interpenetrate (interleaved wheels, stacked crates). */
5
+ export declare const noOverlap: (selector: string) => Check;
6
+ /** `a` must touch `b` (surface within 2 cm): a turret sits on its ring, a lamp on its post. */
7
+ export declare const touches: (a: string, b: string, eps?: number) => Check;
8
+ /** Every part containing `left` has a mirror part (with `right`) reflected across the axis plane. */
9
+ export declare const symmetric: (left: string, right: string, axis?: 'x' | 'y' | 'z', tol?: number) => Check;
10
+ /** Run a recipe's checks; the QA gate calls this. */
11
+ export declare const runChecks: (asset: Parameters<Check>[0]) => CheckFinding[];
@@ -0,0 +1,2 @@
1
+ import { type Gate } from './types.js';
2
+ export declare const clashes: Gate;
@@ -0,0 +1,5 @@
1
+ import { type Mesh } from '../core/index.js';
2
+ import { TriangleGrid } from './geometry.js';
3
+ import { type Gate } from './types.js';
4
+ export declare function touching(a: Mesh, b: Mesh, grid: TriangleGrid, eps?: number): boolean;
5
+ export declare const floatingParts: Gate;
@@ -0,0 +1,12 @@
1
+ import { type CompiledAsset } from '../core/index.js';
2
+ import type { Finding, Gate } from './types.js';
3
+ export declare const triangleBudget: Gate;
4
+ export declare const partNames: Gate;
5
+ /** Overall bounding box vs the recipe's `real` dimensions: catches a 6 m tank modelled at 7.4 m. */
6
+ export declare const proportions: Gate;
7
+ /** Planned gates, signatures fixed: docs/idea/06-qa.md. */
8
+ export declare const silhouetteIoU: (_asset: CompiledAsset, _referencePng: Uint8Array) => number;
9
+ /** The recipe's own `checks`, each finding reported under the gate name `check`. */
10
+ export declare const recipeChecks: Gate;
11
+ export declare const DEFAULT_GATES: readonly Gate[];
12
+ export declare function runQa(asset: CompiledAsset, gates?: readonly Gate[]): Finding[];
@@ -0,0 +1,21 @@
1
+ import { type Mesh, type Vec3 } from '../core/index.js';
2
+ export declare function triangle(m: Mesh, t: number): [Vec3, Vec3, Vec3];
3
+ /** Distance from p to triangle abc (Ericson, Real-Time Collision Detection §5.1.5). */
4
+ export declare function pointTriangleDistance(p: Vec3, a: Vec3, b: Vec3, c: Vec3): number;
5
+ /** Triangles bucketed by a uniform grid, so a point only tests its neighbourhood. */
6
+ export declare class TriangleGrid {
7
+ private readonly cells;
8
+ /** Cell edge: 25 cm for props and vehicles, growing with big meshes (a 330 m tower) so one
9
+ * long triangle never lands in 10⁵ cells. */
10
+ private readonly cell;
11
+ private readonly tris;
12
+ /** Per-triangle AABB (min xyz, max xyz) for a cheap reject before the exact distance. */
13
+ private readonly boxes;
14
+ private readonly stamp;
15
+ private query;
16
+ constructor(mesh: Mesh);
17
+ /** Distance from p to the nearest triangle, if one is within `radius`; else Infinity. */
18
+ nearest(p: Vec3, radius: number): number;
19
+ }
20
+ /** Vertices plus points along every edge every `step` metres (catches crossing members). */
21
+ export declare function surfaceSamples(m: Mesh, step?: number, maxPerEdge?: number): Vec3[];
@@ -0,0 +1,12 @@
1
+ export { clear, noOverlap, runChecks, symmetric, touches } from './checks.js';
2
+ export { clashes } from './clash.js';
3
+ export { floatingParts, touching } from './floating.js';
4
+ export { DEFAULT_GATES, partNames, proportions, runQa, silhouetteIoU, triangleBudget, } from './gates.js';
5
+ export { pointTriangleDistance, surfaceSamples, TriangleGrid } from './geometry.js';
6
+ export { insideSolid } from './inside.js';
7
+ export { glob, type Inspector, inspect, type Penetration } from './inspect.js';
8
+ export { DEFAULT_LOD_GATES, type LodGate, lodPivots, lodSilhouette, lodTriangles, runLodQa, } from './lods.js';
9
+ export { measure, measures } from './measures.js';
10
+ export { hiddenParts, zFighting } from './occlusion.js';
11
+ export { degenerateTriangles, nonFinite, normalsMatchWinding, vertexColors } from './sanity.js';
12
+ export { CLASH_EPS, CONTACT_EPS, type Finding, type Gate } from './types.js';
@@ -0,0 +1,78 @@
1
+ import {
2
+ pointTriangleDistance2,
3
+ TriangleGrid2,
4
+ surfaceSamples2,
5
+ insideSolid2,
6
+ glob2,
7
+ inspect2,
8
+ clear2,
9
+ noOverlap2,
10
+ touches2,
11
+ symmetric2,
12
+ runChecks2,
13
+ CONTACT_EPS2,
14
+ CLASH_EPS2,
15
+ clashes2,
16
+ touching2,
17
+ floatingParts2,
18
+ measure2,
19
+ measures2,
20
+ zFighting2,
21
+ hiddenParts2,
22
+ nonFinite2,
23
+ vertexColors2,
24
+ normalsMatchWinding2,
25
+ degenerateTriangles2,
26
+ triangleBudget2,
27
+ partNames2,
28
+ proportions2,
29
+ silhouetteIoU2,
30
+ DEFAULT_GATES2,
31
+ runQa2,
32
+ lodTriangles2,
33
+ lodSilhouette2,
34
+ lodPivots2,
35
+ DEFAULT_LOD_GATES2,
36
+ runLodQa2
37
+ } from "../chunk-jq4e17tj.js";
38
+ import"../chunk-hg7pf34j.js";
39
+ export {
40
+ CLASH_EPS2 as CLASH_EPS,
41
+ CONTACT_EPS2 as CONTACT_EPS,
42
+ DEFAULT_GATES2 as DEFAULT_GATES,
43
+ DEFAULT_LOD_GATES2 as DEFAULT_LOD_GATES,
44
+ TriangleGrid2 as TriangleGrid,
45
+ clashes2 as clashes,
46
+ clear2 as clear,
47
+ degenerateTriangles2 as degenerateTriangles,
48
+ floatingParts2 as floatingParts,
49
+ glob2 as glob,
50
+ hiddenParts2 as hiddenParts,
51
+ insideSolid2 as insideSolid,
52
+ inspect2 as inspect,
53
+ lodPivots2 as lodPivots,
54
+ lodSilhouette2 as lodSilhouette,
55
+ lodTriangles2 as lodTriangles,
56
+ measure2 as measure,
57
+ measures2 as measures,
58
+ noOverlap2 as noOverlap,
59
+ nonFinite2 as nonFinite,
60
+ normalsMatchWinding2 as normalsMatchWinding,
61
+ partNames2 as partNames,
62
+ pointTriangleDistance2 as pointTriangleDistance,
63
+ proportions2 as proportions,
64
+ runChecks2 as runChecks,
65
+ runLodQa2 as runLodQa,
66
+ runQa2 as runQa,
67
+ silhouetteIoU2 as silhouetteIoU,
68
+ surfaceSamples2 as surfaceSamples,
69
+ symmetric2 as symmetric,
70
+ touches2 as touches,
71
+ touching2 as touching,
72
+ triangleBudget2 as triangleBudget,
73
+ vertexColors2 as vertexColors,
74
+ zFighting2 as zFighting
75
+ };
76
+
77
+ //# debugId=D85390BDB209BC4364756E2164756E21
78
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "D85390BDB209BC4364756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,12 @@
1
+ import { type Mesh, type Vec3 } from '../core/index.js';
2
+ export declare class SolidIndex {
3
+ private readonly tri;
4
+ private readonly columns;
5
+ private readonly cell;
6
+ constructor(mesh: Mesh);
7
+ /** Odd number of crossings of the ray from p along +axis ⇒ inside (for that ray). */
8
+ private parity;
9
+ inside(point: Vec3): boolean;
10
+ }
11
+ /** One-off query; build a SolidIndex yourself when testing many points against one mesh. */
12
+ export declare const insideSolid: (p: Vec3, m: Mesh) => boolean;
@@ -0,0 +1,18 @@
1
+ import { type Bounds, type CompiledAsset, type Mesh } from '../core/index.js';
2
+ export declare const glob: (pattern: string) => RegExp;
3
+ export interface Penetration {
4
+ /** Deepest sampled point of A inside B's solid, metres (0 = none). */
5
+ readonly depth: number;
6
+ readonly samples: number;
7
+ }
8
+ export interface Inspector {
9
+ readonly asset: CompiledAsset;
10
+ parts(selector: string): string[];
11
+ mesh(selector: string): Mesh | null;
12
+ bounds(selector: string): Bounds | null;
13
+ /** Smallest surface-to-surface distance (0 when touching or intersecting), capped at `max`. */
14
+ distance(a: string, b: string, max?: number): number;
15
+ /** How deep A's surface goes inside B's closed solid. */
16
+ penetration(a: string, b: string): Penetration;
17
+ }
18
+ export declare function inspect(asset: CompiledAsset): Inspector;
@@ -0,0 +1,12 @@
1
+ import { type CompiledAsset } from '../core/index.js';
2
+ import type { Finding } from './types.js';
3
+ /** A gate over the whole LOD chain, index = LOD. */
4
+ export type LodGate = (lods: readonly CompiledAsset[]) => Finding[];
5
+ export declare const lodTriangles: LodGate;
6
+ /** LOD1/LOD2 overall box within `tol` of LOD0's span per side (min 5 cm). */
7
+ export declare const lodSilhouette: (tol?: number) => LodGate;
8
+ export declare const lodPivots: LodGate;
9
+ /** Default chain gates: only what every gallery recipe passes today. `lodSilhouette` and
10
+ * `lodPivots` are opt-in until the recipes they flag are fixed (see their findings). */
11
+ export declare const DEFAULT_LOD_GATES: readonly LodGate[];
12
+ export declare function runLodQa(lods: readonly CompiledAsset[], gates?: readonly LodGate[]): Finding[];
@@ -0,0 +1,4 @@
1
+ import { type CompiledAsset, type Measure } from '../core/index.js';
2
+ import type { Gate } from './types.js';
3
+ export declare function measure(asset: CompiledAsset, m: Measure): number | null;
4
+ export declare const measures: Gate;
@@ -0,0 +1,3 @@
1
+ import type { Gate } from './types.js';
2
+ export declare const zFighting: Gate;
3
+ export declare const hiddenParts: Gate;
@@ -0,0 +1,7 @@
1
+ import type { Gate } from './types.js';
2
+ export declare const nonFinite: Gate;
3
+ export declare const vertexColors: Gate;
4
+ /** Shading normals must agree with the winding (the side a renderer culls/lights). */
5
+ export declare const normalsMatchWinding: Gate;
6
+ /** Zero-area triangles: invisible, but they cost index bandwidth and skew QA sampling. */
7
+ export declare const degenerateTriangles: Gate;