@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,35 @@
1
+ import type { CellId, StripId } from '../trim-sheet.js';
2
+ export interface PaintedSheet {
3
+ readonly size: number;
4
+ /** RGBA8, sRGB. Near-greyscale: hue comes from vertex colour multiplied over it. */
5
+ readonly albedo: Uint8Array;
6
+ /** RGBA8, tangent-space (glTF / OpenGL, +Y toward decreasing V). */
7
+ readonly normal: Uint8Array;
8
+ /** R = occlusion, G = roughness, B = metalness. */
9
+ readonly orm: Uint8Array;
10
+ }
11
+ export type StripKind = 'bond' | 'planks' | 'plates' | 'noise' | 'flat' | 'slate' | 'concrete' | 'glass';
12
+ export interface StripRecipe {
13
+ readonly kind: StripKind;
14
+ /**
15
+ * World metres the strip's V span represents (its U span is always `stripRect().metres`).
16
+ * Pick the typical face height the strip is stretched over; texels are anisotropic if needed.
17
+ */
18
+ readonly scaleMetres: number;
19
+ readonly roughness: number;
20
+ readonly metalness?: number;
21
+ /** Brick/plank courses, rivet pitch, etc. — read per kind (see each painter's header). */
22
+ readonly params?: Readonly<Record<string, number>>;
23
+ }
24
+ /** A cell stamped from PNG bytes (8-bit grey/RGB/RGBA, non-interlaced), e.g. a kubeez.com decal. */
25
+ export interface CellImage {
26
+ readonly image: Uint8Array;
27
+ }
28
+ export interface SheetRecipe {
29
+ readonly seed: number;
30
+ readonly size?: 512 | 1024 | 2048;
31
+ /** Missing strips fall back to `DEFAULT_SHEET`'s recipe for that strip. */
32
+ readonly strips: Readonly<Partial<Record<StripId, StripRecipe>>>;
33
+ /** Cells painted from code, or stamped from a supplied image (e.g. a kubeez.com decal). */
34
+ readonly cells?: Readonly<Partial<Record<CellId, StripRecipe | CellImage>>>;
35
+ }
@@ -0,0 +1,3 @@
1
+ import type { SheetRecipe, StripRecipe } from './types.js';
2
+ export declare function validateStrip(where: string, r: StripRecipe): void;
3
+ export declare function validateSheet(recipe: SheetRecipe): void;
@@ -0,0 +1,12 @@
1
+ import type { Vec3 } from '../core/index.js';
2
+ export type Palette = Readonly<Record<string, Vec3>>;
3
+ /** sRGB hex → linear RGB, the space glTF vertex colours are in. */
4
+ export declare function hex(value: string): Vec3;
5
+ export declare function definePalette(entries: Readonly<Record<string, string>>): Palette;
6
+ /** Era/region palettes ship as data; recipes extend them with object spread. */
7
+ export declare const palettes: {
8
+ readonly victorianRail: Readonly<Record<string, Vec3>>;
9
+ readonly artDeco: Readonly<Record<string, Vec3>>;
10
+ readonly modernGlass: Readonly<Record<string, Vec3>>;
11
+ readonly harbour: Readonly<Record<string, Vec3>>;
12
+ };
@@ -0,0 +1,2 @@
1
+ import type { ShaderParams } from './shader.js';
2
+ export declare function godotSource(p: ShaderParams): string;
@@ -0,0 +1,2 @@
1
+ import type { ShaderParams } from './shader.js';
2
+ export declare function threeSource(p: ShaderParams): string;
@@ -0,0 +1,46 @@
1
+ import type { Surface } from '../core/index.js';
2
+ import { type UvRect } from './trim-sheet.js';
3
+ export interface ShaderHints {
4
+ /** Vertex sway for vegetation. Weight from the `_WIND` attribute or mesh-local height. */
5
+ readonly wind?: {
6
+ readonly strength: number;
7
+ readonly source?: 'attribute' | 'height';
8
+ /** Metres of height at which sway reaches full weight (height source). Default 4. */
9
+ readonly height?: number;
10
+ readonly hz?: number;
11
+ };
12
+ /** Emissive mask on window cells at night: `ratio` of windows lit. */
13
+ readonly windowGlow?: {
14
+ readonly color: string;
15
+ readonly ratio: number;
16
+ readonly intensity?: number;
17
+ };
18
+ /** Wear/grime mask strength 0..1 and how high ground grime climbs (metres). */
19
+ readonly wear?: {
20
+ readonly amount: number;
21
+ readonly grimeHeight?: number;
22
+ };
23
+ /** The surface the material is for: 'cutout' adds alpha test + double-sided. */
24
+ readonly surface?: Surface;
25
+ }
26
+ /** Resolved, validated numbers both emitters print. */
27
+ export interface ShaderParams {
28
+ readonly windStrength: number;
29
+ readonly windAttribute: boolean;
30
+ readonly windHeight: number;
31
+ readonly windHz: number;
32
+ readonly glow: readonly [number, number, number];
33
+ readonly glowRatio: number;
34
+ readonly glowIntensity: number;
35
+ readonly wear: number;
36
+ readonly grimeHeight: number;
37
+ readonly cutout: boolean;
38
+ readonly blend: boolean;
39
+ readonly glowRects: readonly UvRect[];
40
+ readonly glassRect: UvRect;
41
+ }
42
+ export declare function resolveHints(h: ShaderHints): ShaderParams;
43
+ /** A three.js (r18x, WebGPU/TSL) TypeScript module: `createTrimMaterial(maps)` + `upgradeTrimMaterials(root)`. */
44
+ export declare function threeMaterialSource(hints?: ShaderHints): string;
45
+ /** A Godot 4 spatial shader (.gdshader) with the same features and uniform names. */
46
+ export declare function godotShaderSource(hints?: ShaderHints): string;
@@ -0,0 +1,22 @@
1
+ export type StripId = 'plain' | 'brick' | 'stone' | 'slate' | 'iron' | 'wood' | 'glass' | 'concrete';
2
+ export type DecalCellId = 'window_sash' | 'door_panel' | 'clock' | 'smokebox' | 'sign' | 'porthole';
3
+ /** Cutout leaf cards: the anchor (twig base) is the cell's bottom-centre, growth toward +V. */
4
+ export type FoliageCellId = 'foliage_broadleaf' | 'foliage_maple' | 'foliage_maple_autumn' | 'foliage_birch' | 'foliage_acacia' | 'foliage_palm' | 'foliage_spruce' | 'foliage_spruce_snow' | 'foliage_willow' | 'foliage_reeds' | 'foliage_needles';
5
+ export type CellId = DecalCellId | FoliageCellId;
6
+ export interface UvRect {
7
+ readonly u0: number;
8
+ readonly v0: number;
9
+ readonly u1: number;
10
+ readonly v1: number;
11
+ /** Metres of world surface one full rect covers, so texel density is equal across assets. */
12
+ readonly metres: number;
13
+ }
14
+ export declare const TRIM_SHEET_SIZE = 1024;
15
+ export declare function stripRect(id: StripId): UvRect;
16
+ /** Cells sit in the lower half (V ≥ 0.5), 8 per row: decals on row 0, foliage from row 1. */
17
+ export declare function cellRect(id: CellId): UvRect;
18
+ export declare const STRIPS: readonly StripId[];
19
+ export declare const CELLS: readonly CellId[];
20
+ export declare const DECAL_CELLS: readonly DecalCellId[];
21
+ export declare const FOLIAGE_CELLS: readonly FoliageCellId[];
22
+ export declare const isFoliage: (id: CellId) => id is FoliageCellId;
@@ -0,0 +1,25 @@
1
+ import { type Mesh, type Vec3 } from '../core/index.js';
2
+ export interface GenerateRequest {
3
+ readonly prompt?: string;
4
+ /** PNG/JPEG bytes of a reference or concept image. */
5
+ readonly image?: Uint8Array;
6
+ readonly seed: number;
7
+ /** Fit the result into this box (metres), Z up, base on the ground. */
8
+ readonly fit: Vec3;
9
+ readonly targetTriangles: number;
10
+ }
11
+ export interface MeshGenerator {
12
+ /** e.g. 'trellis-2', 'hunyuan3d-2.1', 'sf3d'. Part of the cache key. */
13
+ readonly model: string;
14
+ generate(request: GenerateRequest): Promise<Mesh>;
15
+ }
16
+ /** Talks to a local server (e.g. a ComfyUI / gradio wrapper) at `endpoint`. Planned: M5. */
17
+ export declare function localGenerator(_o: {
18
+ model: string;
19
+ endpoint: string;
20
+ }): MeshGenerator;
21
+ /** Import an existing GLB (a CC0 base mesh, a sculpt, a generator's output) as a part. Planned: M5. */
22
+ export declare function importGlb(_bytes: Uint8Array, _o: {
23
+ fit: Vec3;
24
+ recolor?: Vec3;
25
+ }): Mesh;
@@ -0,0 +1,17 @@
1
+ export interface ImageRequest {
2
+ readonly prompt: string;
3
+ readonly seed: number;
4
+ readonly width: number;
5
+ readonly height: number;
6
+ /** e.g. 'decal', 'tileable', 'reference', 'concept'. */
7
+ readonly purpose: 'decal' | 'tileable' | 'reference' | 'concept';
8
+ }
9
+ export interface ImageSource {
10
+ readonly name: string;
11
+ generate(request: ImageRequest): Promise<Uint8Array>;
12
+ }
13
+ /** kubeez.com image generation. Reads the key from the caller, never from ambient env. */
14
+ export declare function kubeezImages(_o: {
15
+ apiKey: string;
16
+ model?: string;
17
+ }): ImageSource;
@@ -0,0 +1,2 @@
1
+ export { type GenerateRequest, importGlb, localGenerator, type MeshGenerator, } from './generator.js';
2
+ export { type ImageRequest, type ImageSource, kubeezImages } from './images.js';
@@ -0,0 +1,14 @@
1
+ import {
2
+ localGenerator2,
3
+ importGlb2,
4
+ kubeezImages2
5
+ } from "../chunk-a8fxakcj.js";
6
+ import"../chunk-4ddzsqtc.js";
7
+ export {
8
+ importGlb2 as importGlb,
9
+ kubeezImages2 as kubeezImages,
10
+ localGenerator2 as localGenerator
11
+ };
12
+
13
+ //# debugId=12BB55DFBFF53CDF64756E2164756E21
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "12BB55DFBFF53CDF64756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,17 @@
1
+ import { type CompiledAsset, type Mesh } from '../core/index.js';
2
+ export interface AoOptions {
3
+ /** Rays per vertex. Default 24. */
4
+ readonly samples?: number;
5
+ /** Occluders farther than this (metres) don't count. Default 1. */
6
+ readonly radius?: number;
7
+ /** 0 = no change, 1 = fully occluded vertices go black. Default 0.6. */
8
+ readonly strength?: number;
9
+ /** Treat z = 0 as a ground plane (contact shadow under the asset). Default true. */
10
+ readonly ground?: boolean;
11
+ }
12
+ export declare function bakeAo(mesh: Mesh, o?: AoOptions, occluder?: Mesh): Mesh;
13
+ /**
14
+ * Bake AO across a whole compiled asset: every part is occluded by every other (a wheel darkens
15
+ * the hull behind it). Colours only change, so parts keep their local meshes and pivots.
16
+ */
17
+ export declare function bakeAoAsset(asset: CompiledAsset, o?: AoOptions): CompiledAsset;
@@ -0,0 +1,15 @@
1
+ import type { Mesh, Vec3 } from '../core/index.js';
2
+ export interface GrimeZone {
3
+ readonly at: Vec3;
4
+ readonly radius: number;
5
+ /** 0..1 darkening at the centre. */
6
+ readonly strength: number;
7
+ }
8
+ export interface GrimeOptions {
9
+ /** Height (m) below which mud/dust builds up toward the ground. */
10
+ readonly ground?: number;
11
+ /** Darkening at z = 0. */
12
+ readonly groundStrength?: number;
13
+ readonly zones?: readonly GrimeZone[];
14
+ }
15
+ export declare function grime(mesh: Mesh, o: GrimeOptions): Mesh;
@@ -0,0 +1,6 @@
1
+ export { type AoOptions, bakeAo, bakeAoAsset } from './bake-ao.js';
2
+ export { type GrimeOptions, type GrimeZone, grime } from './grime.js';
3
+ export { type Livery, type LiveryRule, livery } from './livery.js';
4
+ export { type OptimizeOptions, type OptimizeReport, optimize } from './optimize.js';
5
+ export { RayGrid } from './ray-grid.js';
6
+ export { type WeightedNormalsOptions, weightedNormals } from './weighted-normals.js';
@@ -0,0 +1,22 @@
1
+ import {
2
+ RayGrid2,
3
+ bakeAo2,
4
+ bakeAoAsset2,
5
+ grime2,
6
+ livery2,
7
+ optimize2,
8
+ weightedNormals2
9
+ } from "../chunk-xnt2sdhf.js";
10
+ import"../chunk-4ddzsqtc.js";
11
+ export {
12
+ RayGrid2 as RayGrid,
13
+ bakeAo2 as bakeAo,
14
+ bakeAoAsset2 as bakeAoAsset,
15
+ grime2 as grime,
16
+ livery2 as livery,
17
+ optimize2 as optimize,
18
+ weightedNormals2 as weightedNormals
19
+ };
20
+
21
+ //# debugId=FB4A86370A140D3564756E2164756E21
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "FB4A86370A140D3564756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,19 @@
1
+ import type { Mesh, Vec2, Vec3 } from '../core/index.js';
2
+ export interface LiveryRule {
3
+ readonly color: Vec3;
4
+ /** Height band [z0, z1] (metres). */
5
+ readonly z?: readonly [number, number];
6
+ /** Along-length band [x0, x1] (metres, +X forward). */
7
+ readonly x?: readonly [number, number];
8
+ /** Polygon in the side elevation (x, z): the region a stripe or panel covers. */
9
+ readonly poly?: readonly Vec2[];
10
+ /** Only faces whose normal points this way (n·axis > 0.5; roof: n.z > 0.55). */
11
+ readonly facing?: 'roof' | 'under' | 'front' | 'back' | 'side';
12
+ /** Multiply into the existing colour instead of replacing it (weathering, shading). */
13
+ readonly multiply?: boolean;
14
+ }
15
+ export interface Livery {
16
+ readonly base?: Vec3;
17
+ readonly rules: readonly LiveryRule[];
18
+ }
19
+ export declare function livery(mesh: Mesh, l: Livery): Mesh;
@@ -0,0 +1,15 @@
1
+ /** Reorder triangles for an LRU cache of 32 (Forsyth). Returns a new index buffer. */
2
+ export declare function forsyth(indices: Uint32Array, vertexCount: number): Uint32Array;
3
+ /** Renumber vertices in order of first use; unreferenced vertices are dropped. */
4
+ export declare function fetchOrder(indices: Uint32Array, vertexCount: number): {
5
+ indices: Uint32Array;
6
+ order: Uint32Array;
7
+ };
8
+ export interface CacheStats {
9
+ /** Average cache misses per triangle (0.5 ideal on a regular grid, 3 worst). */
10
+ readonly acmr: number;
11
+ /** Misses per unique vertex (1.0 ideal). */
12
+ readonly atvr: number;
13
+ }
14
+ /** Simulate a FIFO post-transform cache (16 entries, the meshoptimizer/NVIDIA convention). */
15
+ export declare function cacheStats(indices: Uint32Array, vertexCount: number, size?: number): CacheStats;
@@ -0,0 +1,15 @@
1
+ import type { Mesh } from '../core/index.js';
2
+ export interface WeldTolerance {
3
+ /** Position grid, metres. */
4
+ readonly position: number;
5
+ readonly normal: number;
6
+ readonly uv: number;
7
+ readonly color: number;
8
+ }
9
+ export declare const DEFAULT_WELD: WeldTolerance;
10
+ export interface Welded {
11
+ readonly mesh: Mesh;
12
+ readonly degenerate: number;
13
+ readonly duplicate: number;
14
+ }
15
+ export declare function weld(m: Mesh, t?: WeldTolerance): Welded;
@@ -0,0 +1,28 @@
1
+ import type { Mesh } from '../core/index.js';
2
+ export interface OptimizeOptions {
3
+ /** Merge vertices closer than this (metres) with matching normal/uv/colour. Default 1e-5. */
4
+ readonly weldEpsilon?: number;
5
+ /** Reorder for the vertex cache (Forsyth). Default true. */
6
+ readonly vertexCache?: boolean;
7
+ }
8
+ export interface OptimizeReport {
9
+ readonly verticesBefore: number;
10
+ readonly verticesAfter: number;
11
+ readonly trianglesBefore: number;
12
+ readonly trianglesAfter: number;
13
+ /** Zero-area / collapsed triangles dropped. */
14
+ readonly degenerate: number;
15
+ /** Exact duplicate triangles (same winding) dropped. */
16
+ readonly duplicate: number;
17
+ /** Average cache miss ratio per triangle before (FIFO 16). */
18
+ readonly acmrBefore: number;
19
+ /** Average cache miss ratio per triangle after reordering (lower is better, ~0.6–0.8 is good). */
20
+ readonly acmr: number;
21
+ /** Cache misses per vertex before / after (1.0 is ideal). */
22
+ readonly atvrBefore: number;
23
+ readonly atvr: number;
24
+ }
25
+ export declare function optimize(mesh: Mesh, o?: OptimizeOptions): {
26
+ mesh: Mesh;
27
+ report: OptimizeReport;
28
+ };
@@ -0,0 +1,23 @@
1
+ import { type Mesh, type Vec3 } from '../core/index.js';
2
+ export declare class RayGrid {
3
+ private readonly tri;
4
+ /** Per triangle: v0, e1 = v1 − v0, e2 = v2 − v0 (Möller–Trumbore inputs, computed once). */
5
+ private readonly edges;
6
+ /** Per triangle: unnormalised plane normal e1 × e2 and its offset n·v0. */
7
+ private readonly planes;
8
+ private readonly start;
9
+ private readonly list;
10
+ private readonly min;
11
+ private readonly res;
12
+ private readonly cell;
13
+ private readonly stamp;
14
+ private ray;
15
+ constructor(mesh: Mesh);
16
+ private coord;
17
+ /** Any hit of the ray o + t·d (d unit) for 0 < t ≤ tMax. Scalar arguments: no allocation. */
18
+ hit(ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, tMax: number): boolean;
19
+ /** Möller–Trumbore on cached v0, e1, e2 (the same arithmetic as deriving them per ray). */
20
+ private test;
21
+ /** True if the ray o + t·d (d unit) hits any triangle for 0 < t ≤ tMax. */
22
+ occluded(o: Vec3, d: Vec3, tMax: number): boolean;
23
+ }
@@ -0,0 +1,8 @@
1
+ import type { Mesh } from '../core/index.js';
2
+ export interface WeightedNormalsOptions {
3
+ /** Faces meeting at more than this many degrees keep a hard edge. Default 40. */
4
+ readonly hardAngle?: number;
5
+ /** Positions closer than this (metres) count as one point. Default 1e-5. */
6
+ readonly epsilon?: number;
7
+ }
8
+ export declare function weightedNormals(m: Mesh, o?: WeightedNormalsOptions): Mesh;
@@ -0,0 +1,17 @@
1
+ import { type Mesh, type Vec3 } from '../core/index.js';
2
+ import type { StripId } from '../material/index.js';
3
+ export interface BeamOptions {
4
+ readonly from: Vec3;
5
+ readonly to: Vec3;
6
+ /** Side of a square section, or diameter of a round one. */
7
+ readonly width: number;
8
+ readonly height?: number;
9
+ readonly segments?: number;
10
+ readonly color: Vec3;
11
+ readonly strip?: StripId;
12
+ /** Which way the section's local Y faces (roll). Default: world Z, or X for vertical beams. */
13
+ readonly up?: Vec3;
14
+ /** End caps; turn off for lattice members whose ends are buried in joints (−⅓ triangles). */
15
+ readonly caps?: boolean;
16
+ }
17
+ export declare function beam(o: BeamOptions): Mesh;
@@ -0,0 +1,13 @@
1
+ import { type Mesh, type Vec3 } from '../core/index.js';
2
+ import { type StripId } from '../material/index.js';
3
+ type FaceName = 'top' | 'bottom' | 'front' | 'back' | 'left' | 'right';
4
+ export interface BevelBoxInput {
5
+ readonly half: Vec3;
6
+ readonly centre: Vec3;
7
+ readonly bevel: number;
8
+ readonly color: Vec3;
9
+ readonly strip: StripId;
10
+ readonly omit: readonly FaceName[];
11
+ }
12
+ export declare function bevelBox(o: BevelBoxInput): Mesh;
13
+ export {};
@@ -0,0 +1,16 @@
1
+ import { type Mesh, type Vec3 } from '../core/index.js';
2
+ import { type StripId } from '../material/index.js';
3
+ export interface BoxOptions {
4
+ /** Width (X), depth (Y), height (Z) in metres. */
5
+ readonly size: Vec3;
6
+ readonly color: Vec3;
7
+ readonly strip?: StripId;
8
+ /** Centre of the base face. */
9
+ readonly at?: Vec3;
10
+ /** Skip faces nobody sees (e.g. the bottom on the ground). */
11
+ readonly omit?: readonly ('top' | 'bottom' | 'front' | 'back' | 'left' | 'right')[];
12
+ /** Chamfer width in metres on every edge (12 + 8 extra faces, 44 triangles). LOD it:
13
+ * `bevel: ctx.pick([0.02, 0.01, 0])`. Must stay under half the smallest size. Default 0. */
14
+ readonly bevel?: number;
15
+ }
16
+ export declare function box(o: BoxOptions): Mesh;
@@ -0,0 +1,20 @@
1
+ import { type Mesh, type Vec3 } from '../core/index.js';
2
+ import { type CellId, type StripId } from '../material/index.js';
3
+ export interface CellOptions {
4
+ /** Bottom-left corner as seen from the front. */
5
+ readonly origin: Vec3;
6
+ /** Width edge (cell U), metres. */
7
+ readonly u: Vec3;
8
+ /** Height edge (cell V, up), metres. */
9
+ readonly v: Vec3;
10
+ readonly color: Vec3;
11
+ readonly cell: CellId;
12
+ /** Recess depth in metres (> 0 behind the plane, < 0 proud of it). Default 0. */
13
+ readonly inset?: number;
14
+ /** Strip the reveal faces tile at true scale. Default 'plain'. */
15
+ readonly reveal?: StripId;
16
+ readonly revealColor?: Vec3;
17
+ /** Both sides (leaf cards, hanging signs). Not with an inset. */
18
+ readonly doubleSided?: boolean;
19
+ }
20
+ export declare function cell(o: CellOptions): Mesh;
@@ -0,0 +1,12 @@
1
+ import { type Vec3 } from '../core/index.js';
2
+ export declare function invalid(cause: string, fix: string): never;
3
+ /** Two edge vectors spanning a real parallelogram; returns |u|, |v| and the unit normal u×v. */
4
+ export declare function spanOf(what: string, origin: Vec3, u: Vec3, v: Vec3): {
5
+ lu: number;
6
+ lv: number;
7
+ n: Vec3;
8
+ };
9
+ /** An integer count in [min, max]. */
10
+ export declare function count(what: string, n: number, min: number, max: number): number;
11
+ /** A finite number > 0. */
12
+ export declare function positive(what: string, n: number, example: string): number;
@@ -0,0 +1,11 @@
1
+ import type { Mesh } from '../core/index.js';
2
+ /** Undirected edges walked a different number of times a→b than b→a (0 = closed, oriented). */
3
+ export declare function openEdges(m: Mesh): number;
4
+ /** Directed edges used more than once: 0 = 2-manifold (given openEdges = 0). */
5
+ export declare function nonManifoldEdges(m: Mesh): number;
6
+ /**
7
+ * Triangles whose winding (b − a) × (c − a) clearly disagrees with their mean vertex normal
8
+ * (cosine < −0.1; inside-out scores ≈ −1). Slivers whose face normal lies in the surface
9
+ * (cosine ≈ 0, e.g. surface nets at sub-cell features) are orientation-ambiguous, not counted.
10
+ */
11
+ export declare function windingFlips(m: Mesh): number;
@@ -0,0 +1,22 @@
1
+ import type { Rng } from '../core/index.js';
2
+ import type { TerrainGrid } from './terrain-grid.js';
3
+ export interface ErosionOptions {
4
+ /** Droplets simulated. ~1 per grid point is mild, 2–3 is strongly carved. Default 70 000. */
5
+ readonly droplets?: number;
6
+ /** Steps a droplet lives. Default 30. */
7
+ readonly lifetime?: number;
8
+ /** 0 = droplets follow the gradient exactly, 1 = they never turn. Default 0.05. */
9
+ readonly inertia?: number;
10
+ /** Sediment a droplet can carry per unit of speed × water × drop. Default 4. */
11
+ readonly capacity?: number;
12
+ readonly minCapacity?: number;
13
+ /** Share of spare capacity eroded per step. Default 0.3. */
14
+ readonly erode?: number;
15
+ /** Share of surplus sediment deposited per step. Default 0.3. */
16
+ readonly deposit?: number;
17
+ readonly evaporate?: number;
18
+ readonly gravity?: number;
19
+ /** Erosion brush radius in grid cells (wider = smoother gullies). Default 3. */
20
+ readonly radius?: number;
21
+ }
22
+ export declare function hydraulicErosion(g: TerrainGrid, rng: Rng, o?: ErosionOptions): TerrainGrid;
@@ -0,0 +1,3 @@
1
+ export declare const GLYPHS: Readonly<Record<string, readonly number[]>>;
2
+ /** Every character `text` can set (lower case is accepted and set as upper case). */
3
+ export declare const SUPPORTED_CHARS: string;
@@ -0,0 +1,16 @@
1
+ import { type Mesh, type Vec3 } from '../core/index.js';
2
+ import { type StripId } from '../material/index.js';
3
+ export interface HeightfieldOptions {
4
+ /** [minX, minY, maxX, maxY] in metres. */
5
+ readonly rect: readonly [number, number, number, number];
6
+ readonly cells: readonly [number, number];
7
+ readonly height: (x: number, y: number) => number;
8
+ /** Vertex colour per point (e.g. darker in ruts, greener on slopes). */
9
+ readonly color: Vec3 | ((x: number, y: number, z: number) => Vec3);
10
+ readonly strip?: StripId;
11
+ /** Close the sides down to this z (e.g. 0): flat-shaded walls, outward normals. */
12
+ readonly skirt?: number;
13
+ /** Wall colour; default: the terrain colour at the top edge. */
14
+ readonly skirtColor?: Vec3;
15
+ }
16
+ export declare function heightfield(o: HeightfieldOptions): Mesh;
@@ -0,0 +1,23 @@
1
+ export { type BeamOptions, beam } from './beam.js';
2
+ export { type BoxOptions, box } from './box.js';
3
+ export { type CellOptions, cell } from './cell.js';
4
+ export { type ErosionOptions, hydraulicErosion } from './erosion.js';
5
+ export { type HeightfieldOptions, heightfield } from './heightfield.js';
6
+ export { cylinder, type LatheOptions, lathe } from './lathe.js';
7
+ export { type LatticeOptions, lattice, type TrussPattern } from './lattice.js';
8
+ export { type LoftColor, type LoftOptions, loft, ringXY } from './loft.js';
9
+ export type { SectionKind } from './member.js';
10
+ export { billow, type FractalOptions, fbm, gradientNoise2, type Noise2, ridged, terrace, valueNoise2, warp, } from './noise.js';
11
+ export { type PlanarOptions, planar } from './planar.js';
12
+ export { type PrismOptions, prism } from './prism.js';
13
+ export { type SculptEdit, type SculptField, type SculptOptions, type SculptShape, sculpt, sculptField, } from './sculpt.js';
14
+ export { type SdfColor, type SdfOptions, sdf } from './sdf.js';
15
+ export { type Field, sd } from './sdf-ops.js';
16
+ export { type SweepOptions, sweep } from './sweep.js';
17
+ export { type TerrainColorOptions, type TerrainPalette, terrainColor } from './terrain-color.js';
18
+ export { sampler, slopeMap, type TerrainGrid, type TerrainGridOptions, type ThermalOptions, terrainGrid, thermalErosion, } from './terrain-grid.js';
19
+ export { type MeasureOptions, measureText, type TextFont, type TextOptions, text, } from './text.js';
20
+ export { type TiledOptions, tiled } from './tiled.js';
21
+ export { arcLengths, type SweepFrame, transportFrames } from './transport.js';
22
+ export { triangulate } from './triangulate.js';
23
+ export { valueNoise } from './value-noise.js';