@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,15 @@
1
+ import { type Lod, type Mesh, type Vec3 } from '../core/index.js';
2
+ import type { StripId } from '../material/index.js';
3
+ export interface MassOptions {
4
+ /** Width (X), depth (Y), height (Z). */
5
+ readonly size: Vec3;
6
+ /** Centre of the base. */
7
+ readonly at?: Vec3;
8
+ readonly color: Vec3;
9
+ readonly strip?: StripId;
10
+ /** Courses start at this world z (default 0, the ground) so stacked masses line up. */
11
+ readonly courseOrigin?: number;
12
+ /** Skip faces nobody sees (bottom on the ground, top under a roof, a party wall). */
13
+ readonly omit?: readonly ('top' | 'bottom' | 'front' | 'back' | 'left' | 'right')[];
14
+ }
15
+ export declare function mass(o: MassOptions, lod?: Lod): Mesh;
@@ -0,0 +1,30 @@
1
+ import { type Lod, type Mesh, type Vec3 } from '../core/index.js';
2
+ import type { StripId } from '../material/index.js';
3
+ export type OpeningSide = 'front' | 'back' | 'left' | 'right';
4
+ export interface OpeningOptions {
5
+ readonly kind: 'window' | 'door';
6
+ /** Clear opening, metres (UK sash ≈ 0.9 × 1.6; door ≈ 0.9 × 2.1). */
7
+ readonly width: number;
8
+ readonly height: number;
9
+ /** Bottom centre of the opening ON the wall face. */
10
+ readonly at: Vec3;
11
+ /** Which way the wall faces (front = +X, left = +Y). */
12
+ readonly facing: OpeningSide;
13
+ readonly glass: Vec3;
14
+ /** Sash frame / door leaf colour. */
15
+ readonly frame: Vec3;
16
+ /** Reveal (surround) colour: the wall's, so the opening reads recessed. */
17
+ readonly wall: Vec3;
18
+ readonly wallStrip?: StripId;
19
+ /** Sill + lintel colour (dressed stone). */
20
+ readonly trim?: Vec3;
21
+ /** Reveal depth, metres. Default 0.12 (half a brick). */
22
+ readonly depth?: number;
23
+ /** Reveal band width either side. Default 0.1. */
24
+ readonly surround?: number;
25
+ /** Glazing panes [across, up]: 2-over-2 sash = [2, 2]. Default window [2, 2]. */
26
+ readonly panes?: readonly [number, number];
27
+ readonly sill?: boolean;
28
+ readonly lintel?: boolean;
29
+ }
30
+ export declare function opening(o: OpeningOptions, lod?: Lod): Mesh;
@@ -0,0 +1,6 @@
1
+ import { type BuildContext } from '../core/index.js';
2
+ /** Stylised creature from a skeleton + SDF flesh (Spore-like). Realistic ones go via /neural. M4. */
3
+ export declare function creature(_ctx: BuildContext, _o: {
4
+ skeleton: 'biped' | 'quadruped' | 'bird';
5
+ height: number;
6
+ }): void;
@@ -0,0 +1,16 @@
1
+ import { type Lod, type Mesh, type Vec3 } from '../core/index.js';
2
+ import type { StripId } from '../material/index.js';
3
+ export interface RoofChimney {
4
+ /** Centre offset from the roof's `at`, world X/Y metres. */
5
+ readonly at: readonly [number, number];
6
+ /** Stack width (X) and depth (Y). Default [0.9, 0.6]. */
7
+ readonly size?: readonly [number, number];
8
+ /** Height above the highest roof point it touches. Default 0.9. */
9
+ readonly height?: number;
10
+ readonly color: Vec3;
11
+ readonly strip?: StripId;
12
+ /** Clay pots on top (LOD0). Default: one per 0.4 m of width. */
13
+ readonly pots?: number;
14
+ readonly potColor?: Vec3;
15
+ }
16
+ export declare function chimney(c: RoofChimney, heightAt: (x: number, y: number) => number, at: Vec3, lod: Lod): Mesh;
@@ -0,0 +1,64 @@
1
+ import { type Vec2, type Vec3 } from '../core/index.js';
2
+ import type { StripId } from '../material/index.js';
3
+ export type RoofType = 'gable' | 'hip' | 'pyramid' | 'mansard' | 'gambrel' | 'shed';
4
+ export type RoofSide = 'front' | 'back' | 'left' | 'right';
5
+ export interface RoofOptions {
6
+ readonly type: RoofType;
7
+ /** Wall-line width (X) and depth (Y) of the mass the roof sits on, metres. */
8
+ readonly footprint: readonly [number, number];
9
+ /** Main slope, degrees (the lower, steep slope of a mansard or gambrel). */
10
+ readonly pitchDeg: number;
11
+ /** Centre of the footprint at wall-plate height (top of the walls). */
12
+ readonly at: Vec3;
13
+ readonly color: Vec3;
14
+ /** Roofing strip, laid in true-scale courses down the slope. Default 'slate'. */
15
+ readonly strip?: StripId;
16
+ /** Eave overhang past the walls, metres. Default 0.35. */
17
+ readonly overhang?: number;
18
+ /** Gable-end (rake) overhang; default = overhang. Hipped roofs ignore it. */
19
+ readonly rake?: number;
20
+ /** Slab thickness perpendicular to the slope (rafter + battens + slate). Default 0.18. */
21
+ readonly thickness?: number;
22
+ /** Ridge direction; default along the longer side. */
23
+ readonly ridge?: 'x' | 'y';
24
+ /** Shed only: the side the single slope falls toward. Default 'front' (+X). */
25
+ readonly low?: RoofSide;
26
+ /** Mansard / gambrel upper slope, degrees. Default 20 (mansard), 30 (gambrel). */
27
+ readonly upperPitchDeg?: number;
28
+ /** Mansard / gambrel: share of the half-span the lower slope covers in plan. Default 0.3 / 0.45. */
29
+ readonly knee?: number;
30
+ }
31
+ export interface Plane {
32
+ /** z = c + ga·a + gb·b (local, relative to the wall plate). */
33
+ readonly c: number;
34
+ readonly ga: number;
35
+ readonly gb: number;
36
+ }
37
+ export interface RoofShape {
38
+ readonly L: number;
39
+ readonly D: number;
40
+ /** Underside planes and the matching top planes (offset by the perpendicular thickness). */
41
+ readonly under: readonly Plane[];
42
+ readonly top: readonly Plane[];
43
+ /** Plan outline at the eaves (CCW, local a/b). */
44
+ readonly outline: readonly Vec2[];
45
+ /** Local unit axes in world XY: a → ex, b → ey (ex × ey = +Z). */
46
+ readonly ex: Vec2;
47
+ readonly ey: Vec2;
48
+ readonly thickness: number;
49
+ }
50
+ export declare function validateRoof(o: RoofOptions): void;
51
+ export declare function roofShape(o: RoofOptions): RoofShape;
52
+ export declare const zAt: (p: Plane, q: Vec2) => number;
53
+ /** Envelope height (min of planes) at a local plan point. */
54
+ export declare const envelope: (planes: readonly Plane[], q: Vec2) => number;
55
+ /** The plan cell of each plane on the envelope (empty cells dropped), with its plane. */
56
+ export declare function facets(planes: readonly Plane[], outline: readonly Vec2[]): [Plane, Vec2[]][];
57
+ /** Local plan → world XY offset (add `at`). */
58
+ export declare const toWorld: (s: RoofShape, q: Vec2, z: number, at: Vec3) => Vec3;
59
+ /** World XY → local plan. */
60
+ export declare const toLocal: (s: RoofShape, x: number, y: number, at: Vec3) => Vec2;
61
+ /** World z of the roof's top surface at world (x, y) — chimneys, dormers, aerials sit on this. */
62
+ export declare function roofHeightAt(o: RoofOptions, x: number, y: number): number;
63
+ /** World z of the highest point of the roof surface (ridge or apex), slab included. */
64
+ export declare function ridgeHeight(o: RoofOptions): number;
@@ -0,0 +1,31 @@
1
+ import { type BuildContext, type Lod, type Mesh, type Vec3 } from '../core/index.js';
2
+ import type { StripId } from '../material/index.js';
3
+ import { type RoofChimney } from './roof-chimney.js';
4
+ import { type RoofOptions } from './roof-shape.js';
5
+ export interface RoofMeshOptions extends RoofOptions {
6
+ /** Fascia, bargeboards, soffit and ridge caps. Default: the roof colour, darkened. */
7
+ readonly trim?: Vec3;
8
+ /** Gable / shed end infill walls. Default pale render. */
9
+ readonly wall?: {
10
+ readonly color: Vec3;
11
+ readonly strip?: StripId;
12
+ };
13
+ /** Ridge and hip caps (LOD0/1). Default true. */
14
+ readonly caps?: boolean;
15
+ readonly chimneys?: readonly RoofChimney[];
16
+ }
17
+ export interface RoofInfo {
18
+ /** World z of the ridge / apex top. */
19
+ readonly ridge: number;
20
+ /** World z of the lowest eave edge (underside). */
21
+ readonly eave: number;
22
+ /** World z of the top surface at world (x, y). */
23
+ readonly heightAt: (x: number, y: number) => number;
24
+ }
25
+ /** The roof as one mesh at a detail level. Pure: compose with place/merge or pass to ctx.part. */
26
+ export declare function roofMesh(o: RoofMeshOptions, lod?: Lod): Mesh;
27
+ /** Add the roof as part `name` (default 'roof') at the context's LOD; returns its heights. */
28
+ export declare function roof(ctx: BuildContext, o: RoofMeshOptions & {
29
+ readonly name?: string;
30
+ }): RoofInfo;
31
+ export declare function roofInfo(o: RoofOptions): RoofInfo;
@@ -0,0 +1,15 @@
1
+ import { type Mesh, type Rng, type Vec3 } from '../core/index.js';
2
+ import type { CrownShade } from './vegetation-leaves.js';
3
+ import type { LeafParams } from './vegetation-params.js';
4
+ import type { Stem } from './vegetation-skeleton.js';
5
+ /**
6
+ * Leaflets along every frond (stem at `level`). `perSide` leaflets each side; `from` overrides
7
+ * each frond's first rachis point (LOD2 roots them all on the trunk's top cap centre).
8
+ */
9
+ export declare function frondLeaflets(stems: readonly Stem[], level: number, leaf: LeafParams, perSide: number, shade: CrownShade, rng: Rng): Mesh;
10
+ /** Coconuts: `count` spheres hugging the trunk just below the frond bases. */
11
+ export declare function fruit(trunk: Stem, at: number, o: {
12
+ count: number;
13
+ radius: number;
14
+ color: Vec3;
15
+ }, rng: Rng): Mesh;
@@ -0,0 +1,9 @@
1
+ import { type Mesh, type Rng } from '../core/index.js';
2
+ import type { TreeParams } from './vegetation-params.js';
3
+ import type { Stem } from './vegetation-skeleton.js';
4
+ export interface Impostor {
5
+ readonly trunk: Mesh;
6
+ readonly leaves: Mesh;
7
+ }
8
+ export declare function blob(stems: readonly Stem[], p: TreeParams, rng: Rng): Impostor;
9
+ export declare function frondCards(stems: readonly Stem[], p: TreeParams, level: number): Impostor;
@@ -0,0 +1,15 @@
1
+ import { type Mesh, type Rng, type Vec3 } from '../core/index.js';
2
+ import { type LeafParams } from './vegetation-params.js';
3
+ import type { Stem } from './vegetation-skeleton.js';
4
+ /** Crown occlusion: cards deep inside / low in the crown are darker. */
5
+ export interface CrownShade {
6
+ readonly centre: Vec3;
7
+ readonly radius: number;
8
+ readonly zMin: number;
9
+ readonly zMax: number;
10
+ }
11
+ export declare function crownShade(stems: readonly Stem[], level: number): CrownShade;
12
+ /** LOD0: `perStem` cards along the outer 70% of every terminal stem, rooted on a ring vertex. */
13
+ export declare function leafCards(stems: readonly Stem[], level: number, ringSegments: number, leaf: LeafParams, shade: CrownShade, rng: Rng): Mesh;
14
+ /** LOD1: one cluster card per (unemitted) twig, rooted where the twig would leave its parent. */
15
+ export declare function clusterCards(stems: readonly Stem[], level: number, leaf: LeafParams, shade: CrownShade, rng: Rng): Mesh;
@@ -0,0 +1,21 @@
1
+ import { type Mesh, type Rng, type Vec3 } from '../core/index.js';
2
+ import type { TreeParams } from './vegetation-params.js';
3
+ import type { Stem } from './vegetation-skeleton.js';
4
+ export declare const radialSegments: (level: number, lod: number) => number;
5
+ /** Every `step`-th path point (always keeping both ends): LOD1 halves path resolution. */
6
+ export declare function coarsen(st: Stem, step: number): {
7
+ pts: Vec3[];
8
+ radii: number[];
9
+ };
10
+ /** All stems with level in [lo, hi], merged. */
11
+ export declare function stemsMesh(stems: readonly Stem[], lo: number, hi: number, lod: number, color: Vec3): Mesh;
12
+ /** Bark colour by height (bark → barkTop) with seeded marks; rewrites the mesh's colours. */
13
+ export declare function barkTint(m: Mesh, p: TreeParams, top: number, rng: Rng): Mesh;
14
+ /** The trunk, radius scaled by `radiusScale` (the fit's 1/sy keeps DBH exact after scaling). */
15
+ export declare function trunkMesh(trunk: Stem, p: TreeParams, lod: number, radiusScale: number, rng: Rng): Mesh;
16
+ /** Buttressed flare: `p.roots` lobes, wide at the ground, melting into the trunk by ~2·DBH. */
17
+ export declare function rootsMesh(trunk: Stem, p: TreeParams, lod: number, radiusScale: number, rng: Rng): Mesh;
18
+ /** Per-axis factors that bring the union of `meshes` to `target` = [X, Y, Z] spans. */
19
+ export declare function fitFactors(meshes: readonly Mesh[], target: Vec3): Vec3;
20
+ /** Non-uniform scale about the origin; normals by the inverse transpose, renormalised. */
21
+ export declare function scaleMesh(m: Mesh, s: Vec3): Mesh;
@@ -0,0 +1,90 @@
1
+ import type { Vec2, Vec3 } from '../core/index.js';
2
+ /** Crown envelope: how level-1 branch length varies up the trunk (Weber–Penn `Shape`). */
3
+ export type CrownShape = 'conical' | 'spherical' | 'hemispherical' | 'cylindrical' | 'tapered' | 'flame';
4
+ /** One recursion level. Level 0 is the trunk; levels 1–3 are branches, sub-branches, twigs. */
5
+ export interface BranchLevel {
6
+ /** Children per parent (level 1: along the trunk). Ignored for level 0. */
7
+ readonly branches: number;
8
+ /** Level 0: fraction of tree height. Level ≥ 1: fraction of the parent's length. */
9
+ readonly length: number;
10
+ /** ± relative random length variation. */
11
+ readonly lengthVar?: number;
12
+ /** Degrees between child and parent axis at the attachment. */
13
+ readonly downAngle: number;
14
+ /** Added to downAngle from the first child (bottom) to the last (top) of the parent's zone. */
15
+ readonly downAngleV?: number;
16
+ /** Phyllotaxis step about the parent, degrees (golden angle 137.5° by default). */
17
+ readonly rotate?: number;
18
+ /** Total bend over the stem, degrees: + towards the sky, − towards the ground. Trunk: + bends
19
+ * back against `lean` (towards −X). */
20
+ readonly curve?: number;
21
+ /** If set, the second half bends by this instead (S-curves, weeping tips). */
22
+ readonly curveBack?: number;
23
+ /** Seeded wobble per path segment, ± degrees. */
24
+ readonly curveVar?: number;
25
+ /** Where children start along this stem's parent, as a fraction (level 1 uses `baseSize`). */
26
+ readonly start?: number;
27
+ /** Path segments at LOD0 (LOD1 halves them). */
28
+ readonly segments: number;
29
+ }
30
+ export type LeafShape = 'oval' | 'lobed' | 'tuft' | 'strand' | 'frond';
31
+ /** Card outlines: u along the card (0 = stem end), v across (±0.5). */
32
+ export declare const OUTLINES: Record<Exclude<LeafShape, 'frond'>, readonly Vec2[]>;
33
+ export interface LeafParams {
34
+ readonly shape: LeafShape;
35
+ /** Card length at LOD0, metres. Cards stand for a cluster of leaves, not one leaf. */
36
+ readonly size: number;
37
+ /** Card width as a fraction of its length (fronds: leaflet length as a fraction of frond). */
38
+ readonly width: number;
39
+ /** Cards per terminal stem (fronds: leaflets per side). */
40
+ readonly perStem: number;
41
+ /** Where cards start along a terminal stem, 0–1 (default 0.3; tufts sit near the tip). */
42
+ readonly from?: number;
43
+ readonly color: Vec3;
44
+ /** ± relative colour variation per card. */
45
+ readonly colorVar: number;
46
+ /** 0–1: lay cards level, like the horizontal needle pads of a pine. */
47
+ readonly flat?: number;
48
+ /** 0 = cards splay outward, 1 = they hang straight down (willow strands). */
49
+ readonly hang?: number;
50
+ }
51
+ export interface TreeParams {
52
+ readonly shape: CrownShape;
53
+ /** Fraction of the trunk free of branches (clear bole). */
54
+ readonly baseSize: number;
55
+ /** [trunk, level 1, level 2?, level 3?]. */
56
+ readonly levels: readonly BranchLevel[];
57
+ /** Child radius = parent radius · (child length / parent length)^ratioPower. */
58
+ readonly ratioPower: number;
59
+ /** Trunk radius at the top as a fraction of its radius at breast height. */
60
+ readonly taper: number;
61
+ /** Trunk lean from vertical towards +X, degrees. The trunk stays in the XZ plane. */
62
+ readonly lean?: number;
63
+ readonly bark: Vec3;
64
+ /** Bark colour at the top of the trunk (Scots pine's orange upper bark); default `bark`. */
65
+ readonly barkTop?: Vec3;
66
+ /** Dark bark marks scattered per vertex (birch lenticels): colour + fraction of vertices. */
67
+ readonly barkMarks?: {
68
+ readonly color: Vec3;
69
+ readonly amount: number;
70
+ };
71
+ readonly leaves: LeafParams;
72
+ /** Buttress lobes in the root flare at the base (LOD0/1); 0 or absent = no `roots` part. */
73
+ readonly roots?: number;
74
+ /** Fruit hung under the crown (coconuts), merged into `branches`. LOD0 only. */
75
+ readonly fruit?: {
76
+ readonly count: number;
77
+ readonly radius: number;
78
+ readonly color: Vec3;
79
+ };
80
+ /** LOD2 stand-in: a lathe of the crown envelope, or a few coarse frond cards. */
81
+ readonly impostor: 'blob' | 'cards';
82
+ /** Typical mature size this preset was tuned on (used when the caller omits spread/dbh). */
83
+ readonly typical: {
84
+ readonly height: number;
85
+ readonly spread: number;
86
+ readonly dbh: number;
87
+ };
88
+ }
89
+ /** Weber–Penn ShapeRatio; `r` is 1 at the crown base and 0 at the trunk tip. */
90
+ export declare function shapeRatio(shape: CrownShape, r: number): number;
@@ -0,0 +1,20 @@
1
+ import type { TreeParams } from './vegetation-params.js';
2
+ /** Quercus robur (English oak): 20–25 m, crown about as wide; girth 4–12 m. Spreading, crooked limbs. */
3
+ export declare const oak: TreeParams;
4
+ /** Pinus sylvestris (Scots pine): 25–35 m, DBH up to 1 m; long clean bole, orange upper bark,
5
+ * flat-topped crown in the top third, dark blue-green needle tufts on upturned tips. */
6
+ export declare const pine: TreeParams;
7
+ /** Cocos nucifera (coconut palm): up to 30 m; single ringed stem 30–40 cm; 4–6 m pinnate fronds. */
8
+ export declare const palm: TreeParams;
9
+ /** Betula pendula (silver birch): 15–25 m, narrow crown, white bark with black marks, weeping twigs. */
10
+ export declare const birch: TreeParams;
11
+ /** Salix babylonica (weeping willow): 10–15 m, wider than tall; long hanging leafy strands. */
12
+ export declare const willow: TreeParams;
13
+ export declare const SPECIES: {
14
+ readonly oak: TreeParams;
15
+ readonly pine: TreeParams;
16
+ readonly palm: TreeParams;
17
+ readonly birch: TreeParams;
18
+ readonly willow: TreeParams;
19
+ };
20
+ export type SpeciesName = keyof typeof SPECIES;
@@ -0,0 +1,20 @@
1
+ import type { Rng, Vec3 } from '../core/index.js';
2
+ import { type TreeParams } from './vegetation-params.js';
3
+ export interface Stem {
4
+ readonly level: number;
5
+ readonly pts: readonly Vec3[];
6
+ readonly radii: readonly number[];
7
+ readonly length: number;
8
+ /** Index of the parent stem, −1 for the trunk. */
9
+ readonly parent: number;
10
+ /** Attachment point on the parent's bark (cluster cards root here at LOD1). */
11
+ readonly surface: Vec3;
12
+ /** Nominal length before shape/variation: drives the child count. */
13
+ readonly maxLength: number;
14
+ }
15
+ /** Rodrigues rotation of v about unit axis k by angle a (radians). */
16
+ export declare function rotate(v: Vec3, k: Vec3, a: number): Vec3;
17
+ export declare function grow(p: TreeParams, size: {
18
+ height: number;
19
+ dbh: number;
20
+ }, rng: Rng): Stem[];
@@ -0,0 +1,42 @@
1
+ import { type BuildContext, type RealDimensions } from '../core/index.js';
2
+ import type { TreeParams } from './vegetation-params.js';
3
+ export interface TreeOptions {
4
+ /** A preset name (`oak`, `pine`, `palm`, `birch`, `willow`) or a full parameter set. */
5
+ readonly species?: string | TreeParams;
6
+ /** Overrides on top of the species. */
7
+ readonly params?: Partial<TreeParams>;
8
+ /** Total height, metres (ground to crown top). */
9
+ readonly height: number;
10
+ /** Crown spread (X and Y), metres. Default: the species' typical ratio to height. */
11
+ readonly spread?: number;
12
+ /** Trunk diameter at breast height (1.3 m), metres. Default: the species' typical ratio. */
13
+ readonly dbh?: number;
14
+ readonly seed?: number;
15
+ /** Part-name prefix: `oak_3` → `oak_3_trunk`, `oak_3_crown`, … */
16
+ readonly prefix?: string;
17
+ }
18
+ export interface TreeInfo {
19
+ readonly parts: {
20
+ trunk: string;
21
+ crown: string;
22
+ branches: string;
23
+ leaves: string;
24
+ roots: string;
25
+ };
26
+ readonly height: number;
27
+ readonly spread: number;
28
+ readonly dbh: number;
29
+ }
30
+ export declare function treeParams(o: Pick<TreeOptions, 'species' | 'params'>): TreeParams;
31
+ export declare function tree(ctx: BuildContext, o: TreeOptions): TreeInfo;
32
+ /** `real` for a tree recipe: overall envelope plus DBH (trunk across Y) and total height. */
33
+ export declare function treeReal(o: {
34
+ height: number;
35
+ spread: number;
36
+ dbh: number;
37
+ prefix?: string;
38
+ source?: string;
39
+ }): RealDimensions;
40
+ export type TreeFamilyParams = Omit<TreeOptions, 'prefix'>;
41
+ /** One family, many species: `trees.variant({ name: 'oak', params: { species: 'oak', height: 22 } })`. */
42
+ export declare const trees: import("../index.ts").Family<TreeFamilyParams>;
@@ -0,0 +1,42 @@
1
+ import { type BuildContext, type Vec3 } from '../core/index.js';
2
+ /** A pair of wheels on one spinning axle. */
3
+ export declare function axle(ctx: BuildContext, o: {
4
+ name: string;
5
+ at: Vec3;
6
+ radius: number;
7
+ gauge: number;
8
+ width: number;
9
+ color: Vec3;
10
+ rps: number;
11
+ }): void;
12
+ /** Lays out wheel groups from a Whyte arrangement along X; returns axle x-positions per role. */
13
+ export declare function whyteAxles(arrangement: string, o: {
14
+ leading: number;
15
+ driving: number;
16
+ trailing: number;
17
+ spacing: number;
18
+ }): {
19
+ role: string;
20
+ x: number;
21
+ radius: number;
22
+ }[];
23
+ /** One side of a tracked running gear: road wheels (spinning) + a flat track loop. */
24
+ export declare function trackRun(ctx: BuildContext, o: {
25
+ side: 'l' | 'r';
26
+ y: number;
27
+ length: number;
28
+ wheels: number;
29
+ radius: number;
30
+ width: number;
31
+ color: Vec3;
32
+ track: Vec3;
33
+ }): void;
34
+ /** A propeller hub + blades that spin about X (nose direction). */
35
+ export declare function propeller(ctx: BuildContext, o: {
36
+ name: string;
37
+ at: Vec3;
38
+ radius: number;
39
+ blades: number;
40
+ color: Vec3;
41
+ parent?: string;
42
+ }): void;
@@ -0,0 +1,4 @@
1
+ import type { MaterialDef } from './material-def.js';
2
+ /** Poly Haven "Wood Planks Grey" by Rob Tuytel (CC0), 1.5 m square, 1k PNG maps. */
3
+ export declare const CC0_WOOD_PLANKS_GREY: MaterialDef;
4
+ export declare const CC0_MATERIALS: readonly MaterialDef[];
@@ -0,0 +1,34 @@
1
+ import { type MaterialDef } from './material-def.js';
2
+ import type { StripRecipe } from './paint/types.js';
3
+ import { type TextureSource } from './texture-source.js';
4
+ import { type CustomStripId, type StripId } from './trim-sheet.js';
5
+ /**
6
+ * Register a project material and return its strip id for `strip:` options.
7
+ * @example
8
+ * const teak = defineMaterial({ id: 'teak_deck', kind: 'planks', roughness: 0.6,
9
+ * albedo: '#8a5a32', albedo2: '#5a3a1e', params: { width: 0.12, rings: 0.5 } });
10
+ * box({ size: [4, 2, 0.05], strip: teak, color: NATURAL });
11
+ */
12
+ export declare function defineMaterial(def: MaterialDef): CustomStripId;
13
+ /**
14
+ * Forget every defined material (tests; long-lived workers that reload recipes). Built-ins stay.
15
+ * Meshes compiled before the reset keep UVs into rows that may be reassigned.
16
+ */
17
+ export declare function resetMaterials(): void;
18
+ export interface MaterialInfo {
19
+ readonly id: StripId;
20
+ /** classic = greyscale strip tinted by vertex colour; library/defined carry their own colour. */
21
+ readonly origin: 'classic' | 'library' | 'defined';
22
+ readonly recipe: StripRecipe;
23
+ readonly description: string;
24
+ readonly sources: readonly string[];
25
+ }
26
+ /** What a strip is: its recipe, origin, description and sources. Unknown ids throw. */
27
+ export declare function materialOf(id: StripId): MaterialInfo;
28
+ /** Every texture set a defined material references (what `bun run textures` fetches). */
29
+ export declare function textureSources(): readonly TextureSource[];
30
+ /**
31
+ * Credit lines for the image strips a mesh samples: any V coordinate inside such a strip's row
32
+ * counts. Empty when no image strip is used (the GLB stays byte-identical).
33
+ */
34
+ export declare function stripCredits(vs: ArrayLike<number>): string[];
@@ -0,0 +1,4 @@
1
+ import type { PaintedSheet, SheetRecipe } from './paint/types.js';
2
+ export { DEFAULT_SHEET } from './paint/default-sheet.js';
3
+ export type { CellImage, MaterialPainter, MaterialSurface, PaintedSheet, PaintKit, SheetRecipe, StripKind, StripRecipe, } from './paint/types.js';
4
+ export declare function paintTrimSheet(recipe?: SheetRecipe): PaintedSheet;
@@ -0,0 +1,9 @@
1
+ export { CC0_MATERIALS, CC0_WOOD_PLANKS_GREY } from './cc0.js';
2
+ export { defineMaterial, type MaterialInfo, materialOf, resetMaterials, stripCredits, textureSources, } from './define.js';
3
+ export { type CellImage, DEFAULT_SHEET, type MaterialPainter, type MaterialSurface, type PaintedSheet, type PaintKit, paintTrimSheet, type SheetRecipe, type StripKind, type StripRecipe, } from './generator.js';
4
+ export { MATERIAL_LIBRARY } from './library.js';
5
+ export type { MaterialDef } from './material-def.js';
6
+ export { definePalette, hex, NATURAL, type Palette, palettes } from './palette.js';
7
+ export { godotShaderSource, type ShaderHints, threeMaterialSource } from './shader.js';
8
+ export { creditOf, provideTextures, type TextureCache, type TextureFile, type TextureSource, } from './texture-source.js';
9
+ export { type BuiltinStripId, CELLS, type CellId, CLASSIC_STRIPS, type ClassicStripId, CUSTOM_STRIP_SLOTS, type CustomStripId, cellRect, DECAL_CELLS, type DecalCellId, FOLIAGE_CELLS, type FoliageCellId, isFoliage, MATERIAL_STRIPS, type MaterialStripId, STRIP_ROWS, STRIPS, type StripId, stripRect, stripRow, TRIM_SHEET_SIZE, type UvRect, } from './trim-sheet.js';
@@ -0,0 +1,70 @@
1
+ import {
2
+ CC0_WOOD_PLANKS_GREY2,
3
+ CC0_MATERIALS2,
4
+ MATERIAL_LIBRARY2,
5
+ hex2,
6
+ NATURAL2,
7
+ definePalette2,
8
+ palettes2,
9
+ provideTextures2,
10
+ creditOf2,
11
+ DEFAULT_SHEET2,
12
+ STRIP_ROWS2,
13
+ CUSTOM_STRIP_SLOTS2,
14
+ TRIM_SHEET_SIZE2,
15
+ stripRow2,
16
+ stripRect2,
17
+ cellRect2,
18
+ STRIPS2,
19
+ CLASSIC_STRIPS2,
20
+ MATERIAL_STRIPS2,
21
+ CELLS2,
22
+ DECAL_CELLS2,
23
+ FOLIAGE_CELLS2,
24
+ isFoliage2,
25
+ defineMaterial2,
26
+ resetMaterials2,
27
+ materialOf2,
28
+ textureSources2,
29
+ stripCredits2,
30
+ paintTrimSheet2,
31
+ threeMaterialSource2,
32
+ godotShaderSource2
33
+ } from "../chunk-y63c6zcv.js";
34
+ import"../chunk-hg7pf34j.js";
35
+ export {
36
+ CC0_MATERIALS2 as CC0_MATERIALS,
37
+ CC0_WOOD_PLANKS_GREY2 as CC0_WOOD_PLANKS_GREY,
38
+ CELLS2 as CELLS,
39
+ CLASSIC_STRIPS2 as CLASSIC_STRIPS,
40
+ CUSTOM_STRIP_SLOTS2 as CUSTOM_STRIP_SLOTS,
41
+ DECAL_CELLS2 as DECAL_CELLS,
42
+ DEFAULT_SHEET2 as DEFAULT_SHEET,
43
+ FOLIAGE_CELLS2 as FOLIAGE_CELLS,
44
+ MATERIAL_LIBRARY2 as MATERIAL_LIBRARY,
45
+ MATERIAL_STRIPS2 as MATERIAL_STRIPS,
46
+ NATURAL2 as NATURAL,
47
+ STRIPS2 as STRIPS,
48
+ STRIP_ROWS2 as STRIP_ROWS,
49
+ TRIM_SHEET_SIZE2 as TRIM_SHEET_SIZE,
50
+ cellRect2 as cellRect,
51
+ creditOf2 as creditOf,
52
+ defineMaterial2 as defineMaterial,
53
+ definePalette2 as definePalette,
54
+ godotShaderSource2 as godotShaderSource,
55
+ hex2 as hex,
56
+ isFoliage2 as isFoliage,
57
+ materialOf2 as materialOf,
58
+ paintTrimSheet2 as paintTrimSheet,
59
+ palettes2 as palettes,
60
+ provideTextures2 as provideTextures,
61
+ resetMaterials2 as resetMaterials,
62
+ stripCredits2 as stripCredits,
63
+ stripRect2 as stripRect,
64
+ stripRow2 as stripRow,
65
+ textureSources2 as textureSources,
66
+ threeMaterialSource2 as threeMaterialSource
67
+ };
68
+
69
+ //# debugId=DC34FA57446536B164756E2164756E21
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "DC34FA57446536B164756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,7 @@
1
+ import type { MaterialDef } from './material-def.js';
2
+ import type { MaterialStripId } from './trim-sheet.js';
3
+ type Library = Readonly<Record<MaterialStripId, MaterialDef & {
4
+ readonly id: MaterialStripId;
5
+ }>>;
6
+ export declare const MATERIAL_LIBRARY: Library;
7
+ export {};
@@ -0,0 +1,30 @@
1
+ import { type Vec3 } from '../core/index.js';
2
+ import type { MaterialPainter, StripKind, StripRecipe } from './paint/types.js';
3
+ import { type TextureSource } from './texture-source.js';
4
+ export interface MaterialDef {
5
+ /** snake_case, unique; becomes the strip id recipes pass as `strip`. */
6
+ readonly id: string;
7
+ /** Base painter the strip starts from. Default 'noise' (a quiet surface). */
8
+ readonly kind?: StripKind;
9
+ /** World metres the strip's V span represents (typical face height). Default 1. */
10
+ readonly scaleMetres?: number;
11
+ /** Perceptual roughness 0..1 (glTF): 0 mirror, 1 chalk. */
12
+ readonly roughness: number;
13
+ /** 0 dielectric, 1 metal. Default 0. Avoid in-between values except for dirt/oxide blends. */
14
+ readonly metalness?: number;
15
+ /** Intrinsic base colour: sRGB '#rrggbb' or linear RGB. Default white (vertex colour = hue). */
16
+ readonly albedo?: string | Vec3;
17
+ /** Second colour the painter blends to (latewood, rust, verdigris, bare wood under paint). */
18
+ readonly albedo2?: string | Vec3;
19
+ /** Painter knobs for `kind` (see each painter's header in src/material/paint/). */
20
+ readonly params?: Readonly<Record<string, number>>;
21
+ /** Your own layer, painted after `kind`: write height/tone/rough/metal/mix per texel. */
22
+ readonly paint?: MaterialPainter;
23
+ /** Paint from a CC0 texture set (opt-in, needs `bun run textures`) instead of `kind`. */
24
+ readonly texture?: TextureSource;
25
+ readonly description?: string;
26
+ /** Where the numbers come from (URLs). */
27
+ readonly sources?: readonly string[];
28
+ }
29
+ /** Validate a definition and turn it into the strip recipe the sheet painter runs. */
30
+ export declare function toStripRecipe(d: MaterialDef): StripRecipe;
@@ -0,0 +1,3 @@
1
+ import { type Canvas } from './canvas.js';
2
+ import type { StripRecipe } from './types.js';
3
+ export declare function paintBond(c: Canvas, r: StripRecipe, seed: number): void;