@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,15 @@
1
+ import type { Rng } from '../core/index.js';
2
+ import type { SculptEdit } from '../primitives/index.js';
3
+ import type { HeadLayout } from './head-layout.js';
4
+ import type { HeadParams } from './head-params.js';
5
+ /** `minThick`: the blade's floor thickness (≈ a cell), so far LODs keep their ears attached. */
6
+ export declare function earEdits(p: HeadParams, l: HeadLayout, minThick?: number): SculptEdit[];
7
+ /** Lower tusks rising from the jaw past the upper lip, curving out and back (3 cone segments). */
8
+ /** `minR`: radius floor (≈ half a cell) so far LODs keep the tusks. */
9
+ export declare function tuskEdits(p: HeadParams, l: HeadLayout, minR?: number): SculptEdit[];
10
+ /** War paint: thin deep ellipsoids painted through the skin, so each stripe is a clean band of
11
+ * constant width wherever it crosses the surface — two claw marks per cheek, a crest stripe up
12
+ * the forehead, three down the chin. */
13
+ export declare function paintEdits(p: HeadParams, l: HeadLayout): SculptEdit[];
14
+ /** Seeded warts and bumps on the cranium and cheeks. */
15
+ export declare function wartEdits(p: HeadParams, l: HeadLayout, rng: Rng): SculptEdit[];
@@ -0,0 +1,6 @@
1
+ import type { SculptEdit } from '../primitives/index.js';
2
+ import type { HeadLayout } from './head-layout.js';
3
+ import type { HeadParams } from './head-params.js';
4
+ /** Brain case + face plate: the forms the eyes are seated against (head.ts probes them). */
5
+ export declare function primaryEdits(l: HeadLayout): SculptEdit[];
6
+ export declare function skullEdits(p: HeadParams, l: HeadLayout): SculptEdit[];
@@ -0,0 +1,7 @@
1
+ import type { Vec3 } from '../core/index.js';
2
+ /** `rotate` (deg, X→Y→Z) taking local +X onto `d`, then rolling `roll` deg about it. */
3
+ export declare function alongX(d: Vec3, roll?: number): Vec3;
4
+ /** `rotate` taking local +Z (a cone's axis) onto `d`. */
5
+ export declare function alongZ(d: Vec3): Vec3;
6
+ export declare const unit: (d: Vec3) => Vec3;
7
+ export declare const along: (a: Vec3, d: Vec3, t: number) => Vec3;
@@ -0,0 +1,4 @@
1
+ import type { SculptEdit } from '../primitives/index.js';
2
+ import type { HeadLayout } from './head-layout.js';
3
+ import type { HeadParams } from './head-params.js';
4
+ export declare function hairEdits(p: HeadParams, l: HeadLayout): SculptEdit[];
@@ -0,0 +1,29 @@
1
+ import type { Vec3 } from '../core/index.js';
2
+ import type { HeadParams } from './head-params.js';
3
+ export interface HeadLayout {
4
+ /** Cranium ellipsoid centre and radii. */
5
+ readonly cranium: {
6
+ readonly at: Vec3;
7
+ readonly r: Vec3;
8
+ };
9
+ /** Forehead front at the eye line. */
10
+ readonly faceX: number;
11
+ /** Left eye centre (mirror for the right) and eyeball radius. */
12
+ readonly eye: Vec3;
13
+ readonly eyeR: number;
14
+ readonly browZ: number;
15
+ readonly noseZ: number;
16
+ readonly mouthZ: number;
17
+ /** Front of the lips. */
18
+ readonly mouthX: number;
19
+ readonly chin: Vec3;
20
+ /** Jaw hinge (x, z) — the jaw part's pivot. */
21
+ readonly hinge: readonly [number, number];
22
+ /** Left jaw angle (gonion). */
23
+ readonly angle: Vec3;
24
+ /** Top of the head, units. */
25
+ readonly crown: number;
26
+ /** Bottom of the bust (the asset's z = 0), units. */
27
+ readonly base: number;
28
+ }
29
+ export declare function headLayout(p: HeadParams): HeadLayout;
@@ -0,0 +1,27 @@
1
+ import type { Mesh, Vec3 } from '../core/index.js';
2
+ import { type Field, type SculptEdit } from '../primitives/index.js';
3
+ import type { HeadLayout } from './head-layout.js';
4
+ import type { HeadParams } from './head-params.js';
5
+ /** The jaw region (head units): an ellipsoid around chin and lower lip, cut flat at the mouth
6
+ * line. Its skin seam runs along the lips, down the marionette lines and under the chin — creases
7
+ * a face already has — instead of across the cheek. */
8
+ export declare function jawRegion(p: HeadParams, l: HeadLayout): {
9
+ field: Field;
10
+ centre: Vec3;
11
+ radii: Vec3;
12
+ };
13
+ export interface HeadEditSet {
14
+ readonly skull: readonly SculptEdit[];
15
+ readonly ears: readonly SculptEdit[];
16
+ readonly tusks: readonly SculptEdit[];
17
+ readonly bust: readonly SculptEdit[];
18
+ }
19
+ /** `head` and `jaw` meshes in head units at cell size `res` (units). Each is ONE sculpt (skull +
20
+ * ears − region, skull ∩ region + tusks), so the sculpt's range skipping covers every edit. */
21
+ export declare function headAndJaw(p: HeadParams, l: HeadLayout, set: HeadEditSet, res: number): {
22
+ head: Mesh;
23
+ jaw: Mesh;
24
+ };
25
+ export declare function bustMesh(p: HeadParams, set: HeadEditSet, res: number): Mesh;
26
+ /** Eyeball of radius `r` centred on the origin, gazing +X. */
27
+ export declare function eyeMesh(p: HeadParams, r: number, res: number): Mesh;
@@ -0,0 +1,108 @@
1
+ import { type Vec3 } from '../core/index.js';
2
+ export type EarShape = 'round' | 'pointed';
3
+ export type HairStyle = 'none' | 'topknot' | 'mohawk' | 'swept' | 'tufts' | 'braids';
4
+ export type BeardStyle = 'none' | 'short' | 'braided' | 'goatee';
5
+ export type BustStyle = 'pauldrons' | 'hood' | 'tunic';
6
+ export interface HeadColors {
7
+ readonly skin: Vec3;
8
+ /** Darker skin: lips edge, nostrils, inner ear, wrinkles. */
9
+ readonly shade: Vec3;
10
+ readonly lips: Vec3;
11
+ readonly sclera: Vec3;
12
+ readonly iris: Vec3;
13
+ readonly pupil: Vec3;
14
+ readonly teeth: Vec3;
15
+ readonly mouth: Vec3;
16
+ readonly hair: Vec3;
17
+ readonly cloth: Vec3;
18
+ readonly leather: Vec3;
19
+ readonly metal: Vec3;
20
+ /** Cloak / mantle over the shoulders; default `leather`. */
21
+ readonly cape?: Vec3;
22
+ /** Fur trim on the bust (mantle, hood lining); default `leather`. */
23
+ readonly fur?: Vec3;
24
+ /** War paint / tattoo stripes (orc), or none. */
25
+ readonly paint?: Vec3;
26
+ }
27
+ export interface HeadParams {
28
+ /** Chin to crown, metres (adult human ≈ 0.23). */
29
+ readonly height: number;
30
+ /** Full width / depth of the brain case; `height` = crown above the eye line. */
31
+ readonly cranium: {
32
+ readonly width: number;
33
+ readonly depth: number;
34
+ readonly height: number;
35
+ };
36
+ /** Ridge radius, how far it juts past the eyes, and the scowl (inner ends lowered). */
37
+ /** Ridge radius, overhang past the eyes, scowl (inner ends lowered), eyebrow hair radius
38
+ * (omit or 0 = no eyebrows). */
39
+ readonly brow: {
40
+ readonly ridge: number;
41
+ readonly overhang: number;
42
+ readonly scowl: number;
43
+ readonly hair?: number;
44
+ };
45
+ readonly cheeks: {
46
+ readonly size: number;
47
+ readonly width: number;
48
+ };
49
+ /** Half-width at the jaw angle, chin size, lower-jaw jut past the upper lip, chin drop,
50
+ * muzzle (how far mouth and jaw push forward of the brow: prognathism). */
51
+ readonly jaw: {
52
+ readonly muzzle: number;
53
+ readonly width: number;
54
+ readonly chin: number;
55
+ readonly underbite: number;
56
+ readonly drop: number;
57
+ };
58
+ /** Eye line → nose base, nostril half-width, tip radius, hook (droop), bridge projection. */
59
+ readonly nose: {
60
+ readonly length: number;
61
+ readonly width: number;
62
+ readonly tip: number;
63
+ readonly hook: number;
64
+ readonly bridge: number;
65
+ };
66
+ /** Length (root → tip), width, sweep back (deg), tilt up (deg). */
67
+ readonly ears: {
68
+ readonly shape: EarShape;
69
+ readonly length: number;
70
+ readonly width: number;
71
+ readonly sweep: number;
72
+ readonly lift: number;
73
+ };
74
+ /** Eyeball radius, centre-to-midline, eye line (fraction of height), lid angles (deg). */
75
+ readonly eyes: {
76
+ readonly radius: number;
77
+ readonly spacing: number;
78
+ readonly line: number;
79
+ readonly lid: number;
80
+ readonly lowerLid: number;
81
+ };
82
+ /** Half-width, lip thickness, grin (0 = closed line, 1 = wide toothy smile). */
83
+ readonly mouth: {
84
+ readonly width: number;
85
+ readonly lips: number;
86
+ readonly grin: number;
87
+ };
88
+ readonly tusks: {
89
+ readonly length: number;
90
+ readonly radius: number;
91
+ readonly spread: number;
92
+ readonly flare: number;
93
+ } | null;
94
+ readonly neck: {
95
+ readonly radius: number;
96
+ };
97
+ readonly bust: {
98
+ readonly shoulders: number;
99
+ readonly style: BustStyle;
100
+ };
101
+ readonly hair: HairStyle;
102
+ readonly beard: BeardStyle;
103
+ /** Wart / bump count scattered on the skin (seeded). */
104
+ readonly warts: number;
105
+ readonly colors: HeadColors;
106
+ }
107
+ /** Throws T3D_RECIPE_INVALID (with a fix) when `p` cannot make a head. */
108
+ export declare function checkHead(p: HeadParams): HeadParams;
@@ -0,0 +1,19 @@
1
+ import type { HeadParams } from './head-params.js';
2
+ /** Classical proportions, slightly heroic: eye line at half height, thirds brow/nose/chin. */
3
+ export declare const human: HeadParams;
4
+ /** Massive underbitten jaw, tusks, heavy brow over small deep eyes, flat broad nose, thick neck. */
5
+ export declare const orc: HeadParams;
6
+ /** Small and sly: huge leaf ears, long hooked nose, wide toothy grin, big bright eyes. */
7
+ export declare const goblin: HeadParams;
8
+ /** Broad and bearded: wide skull, big bulbous nose, braided beard, deep-set eyes. */
9
+ export declare const dwarf: HeadParams;
10
+ /** Slender and ageless: long swept-back ears, high cheekbones, fine nose, almond eyes. */
11
+ export declare const elf: HeadParams;
12
+ export declare const HEADS: {
13
+ readonly human: HeadParams;
14
+ readonly orc: HeadParams;
15
+ readonly goblin: HeadParams;
16
+ readonly dwarf: HeadParams;
17
+ readonly elf: HeadParams;
18
+ };
19
+ export type HeadPreset = keyof typeof HEADS;
@@ -0,0 +1,10 @@
1
+ import type { Mesh } from '../core/index.js';
2
+ import type { Field } from '../primitives/index.js';
3
+ /** Part ≈ max(skull, side); `side` is the cut field signed so the part is where side < 0;
4
+ * `part` is the part's full field (with ears/tusks), so their vertices are left alone. */
5
+ export declare function sharpenRim(m: Mesh, skull: Field, side: Field, part: Field, res: number): Mesh;
6
+ /**
7
+ * Where a field gradient smears across a hard crease (the jaw cut at coarse cells), a vertex
8
+ * normal can oppose its triangles; those vertices take their area-weighted face normal instead.
9
+ */
10
+ export declare function creaseNormals(m: Mesh, minDot?: number): Mesh;
@@ -0,0 +1,39 @@
1
+ import { type BuildContext, type Rng, type Vec3 } from '../core/index.js';
2
+ import { type HeadLayout } from './head-layout.js';
3
+ import { type HeadEditSet } from './head-mesh.js';
4
+ import { type HeadParams } from './head-params.js';
5
+ import { type HeadPreset } from './head-presets.js';
6
+ /** Overrides: top-level keys replace, nested objects merge one level (`{ jaw: { underbite: 0.1 } }`). */
7
+ export type HeadOverrides = {
8
+ readonly [K in keyof HeadParams]?: Partial<HeadParams[K]>;
9
+ };
10
+ export interface HeadOptions {
11
+ readonly race?: HeadPreset | HeadParams;
12
+ readonly params?: HeadOverrides;
13
+ /** Part-name prefix: `orc` → `orc_head`, `orc_jaw`, `orc_eye_l` … Default none. */
14
+ readonly prefix?: string;
15
+ /** Where the bust base sits, metres. */
16
+ readonly at?: Vec3;
17
+ /** Baked jaw motion (degrees either side of rest, 0 = static pivot). Default 0. */
18
+ readonly jawSway?: number;
19
+ }
20
+ export interface HeadInfo {
21
+ readonly parts: {
22
+ bust: string;
23
+ head: string;
24
+ jaw: string;
25
+ eyeL: string;
26
+ eyeR: string;
27
+ };
28
+ /** Overall height of bust + head, metres. */
29
+ readonly height: number;
30
+ readonly params: HeadParams;
31
+ }
32
+ export declare function headParams(o?: Pick<HeadOptions, 'race' | 'params'>): HeadParams;
33
+ /** Sculpt cell edge per LOD, in head units (× height = metres). */
34
+ export declare const HEAD_RES: readonly [0.02, 0.045, 0.14];
35
+ /** Every edit list of a head, in head units (pure: same params + rng state → same edits). */
36
+ export declare function headEdits(p: HeadParams, rng: Rng, lod?: 0 | 1 | 2): HeadEditSet & {
37
+ layout: HeadLayout;
38
+ };
39
+ export declare function head(ctx: BuildContext, o?: HeadOptions): HeadInfo;
@@ -0,0 +1,65 @@
1
+ import { type Vec3 } from '../core/index.js';
2
+ export interface HullColors {
3
+ /** Above the boot-top. */
4
+ readonly topsides: Vec3;
5
+ /** Below the waterline (antifouling). */
6
+ readonly bottom: Vec3;
7
+ /** The boot-top band at the waterline. Default near-black. */
8
+ readonly boot?: Vec3;
9
+ readonly deck: Vec3;
10
+ /** Inside of the bulwarks and the cap rail. Default = topsides. */
11
+ readonly bulwark?: Vec3;
12
+ }
13
+ export interface HullOptions {
14
+ /** Length overall at the deck, metres. */
15
+ readonly length: number;
16
+ /** Maximum beam at the deck edge. */
17
+ readonly beam: number;
18
+ /** Keel below the waterline. */
19
+ readonly draft: number;
20
+ /** Deck edge above the waterline amidships (lowest point of the sheer). */
21
+ readonly freeboard: number;
22
+ /** Sheer rise of the deck edge at [bow, stern] above amidships. Default [0.035, 0.012]·L. */
23
+ readonly sheer?: readonly [number, number];
24
+ /** 'round' (cruiser / tug) or 'transom' (flat stern). Default 'round'. */
25
+ readonly stern?: 'round' | 'transom';
26
+ /** Transom half-width as a share of the half-beam. Default 0.75. */
27
+ readonly transomWidth?: number;
28
+ /** Bilge: section superellipse exponent, 1.5 (soft V) … 5 (barge). Default 3. */
29
+ readonly fullness?: number;
30
+ /** Plan entrance exponent at the bow: 1.4 sharp … 3 bluff. Default 2. */
31
+ readonly entrance?: number;
32
+ /** Deck-edge breadth over waterline breadth − 1. Default 0.06. */
33
+ readonly flare?: number;
34
+ /** Bottom deadrise, degrees. Default 5. */
35
+ readonly deadriseDeg?: number;
36
+ /** Bulwark height above the deck, metres; 0 = none. Default 0. */
37
+ readonly bulwark?: number;
38
+ /** Deck camber at the centreline, metres. Default beam / 50. */
39
+ readonly camber?: number;
40
+ /** Height of the boot-top band above the waterline. Default 0.3. */
41
+ readonly bootTop?: number;
42
+ readonly colors: HullColors;
43
+ /** A rubbing strake / fender along each side just below the sheer (LOD0/1). */
44
+ readonly fender?: {
45
+ readonly color: Vec3;
46
+ readonly radius?: number;
47
+ };
48
+ /** Waterline amidships. Default [0, 0, 0]. */
49
+ readonly at?: Vec3;
50
+ }
51
+ export interface HullLines {
52
+ readonly L: number;
53
+ /** Deck-edge half-breadth at x (outer hull). */
54
+ readonly halfBreadth: (x: number) => number;
55
+ /** Deck-edge height at x (sheer line), relative to the waterline. */
56
+ readonly deck: (x: number) => number;
57
+ /** Keel / stem / counter height at x. */
58
+ readonly keel: (x: number) => number;
59
+ /** Section point at x for θ ∈ [0, π/2] (0 = keel, π/2 = deck edge), starboard (y ≥ 0). */
60
+ readonly section: (x: number, theta: number) => [number, number];
61
+ }
62
+ export declare function validateHull(o: HullOptions): void;
63
+ export declare function hullLines(o: HullOptions): HullLines;
64
+ /** θ where the section crosses height z (bisection; the section rises monotonically). */
65
+ export declare function thetaAt(lines: HullLines, x: number, z: number): number;
@@ -0,0 +1,6 @@
1
+ import type { MeshBuilder, Vec3 } from '../core/index.js';
2
+ export type Grid = Vec3[][];
3
+ /** Smooth normals over a station × column grid (outward = tj × ti for the starboard side). */
4
+ export declare function normalsOf(g: Grid): Grid;
5
+ /** Emit columns [j0, j1] of a starboard grid and its port mirror. */
6
+ export declare function emitBand(b: MeshBuilder, g: Grid, nrm: Grid, j0: number, j1: number, color: Vec3, mirror: boolean): void;
@@ -0,0 +1,14 @@
1
+ import { type BuildContext, type Lod, type Mesh } from '../core/index.js';
2
+ import { type HullLines, type HullOptions } from './hull-lines.js';
3
+ export type { HullColors, HullLines, HullOptions } from './hull-lines.js';
4
+ export interface HullMesh {
5
+ /** Shell (+ bulwarks + transom). */
6
+ readonly shell: Mesh;
7
+ readonly deck: Mesh;
8
+ readonly lines: HullLines;
9
+ }
10
+ export declare function hullMesh(o: HullOptions, lod?: Lod): HullMesh;
11
+ /** Add `name` (shell) and `name_deck` parts; returns the lines for placing deckhouses and fittings. */
12
+ export declare function hull(ctx: BuildContext, o: HullOptions & {
13
+ readonly name?: string;
14
+ }): HullLines;
@@ -0,0 +1,16 @@
1
+ export { type FacadeOptions, facade, type SetbackTier, type Side, setbacks } from './building.js';
2
+ export { HEAD_RES, type HeadInfo, type HeadOptions, type HeadOverrides, head, headEdits, headParams, } from './head.js';
3
+ export { type BeardStyle, type BustStyle, checkHead, type EarShape, type HairStyle, type HeadColors, type HeadParams, } from './head-params.js';
4
+ export { HEADS, type HeadPreset } from './head-presets.js';
5
+ export { type HullColors, type HullLines, type HullMesh, type HullOptions, hull, hullMesh, } from './hull.js';
6
+ export { hullLines } from './hull-lines.js';
7
+ export { type MassOptions, mass } from './mass.js';
8
+ export { type OpeningOptions, type OpeningSide, opening } from './openings.js';
9
+ export { creature } from './planned.js';
10
+ export { type RoofInfo, type RoofMeshOptions, roof, roofInfo, roofMesh } from './roof.js';
11
+ export type { RoofChimney } from './roof-chimney.js';
12
+ export { type RoofOptions, type RoofSide, type RoofType, ridgeHeight, roofHeightAt, } from './roof-shape.js';
13
+ export { type TreeFamilyParams, type TreeInfo, type TreeOptions, tree, treeParams, treeReal, trees, } from './vegetation.js';
14
+ export type { BranchLevel, CrownShape, LeafParams, LeafShape, TreeParams, } from './vegetation-params.js';
15
+ export { birch, oak, palm, pine, SPECIES, type SpeciesName, willow } from './vegetation-presets.js';
16
+ export { axle, propeller, trackRun, whyteAxles } from './vehicle.js';
@@ -0,0 +1,78 @@
1
+ import {
2
+ mass2,
3
+ opening2,
4
+ facade2,
5
+ setbacks2,
6
+ checkHead2,
7
+ HEADS2,
8
+ headParams2,
9
+ HEAD_RES2,
10
+ headEdits2,
11
+ head2,
12
+ hullLines2,
13
+ hullMesh2,
14
+ hull2,
15
+ creature2,
16
+ roofHeightAt2,
17
+ ridgeHeight2,
18
+ roofMesh2,
19
+ roof2,
20
+ roofInfo2,
21
+ oak2,
22
+ pine2,
23
+ palm2,
24
+ birch2,
25
+ willow2,
26
+ SPECIES2,
27
+ treeParams2,
28
+ tree2,
29
+ treeReal2,
30
+ trees2,
31
+ axle2,
32
+ whyteAxles2,
33
+ trackRun2,
34
+ propeller2
35
+ } from "../chunk-1ypfs7ga.js";
36
+ import"../chunk-ravbb06q.js";
37
+ import"../chunk-wtqhq529.js";
38
+ import"../chunk-kvcep7ft.js";
39
+ import"../chunk-xnt2sdhf.js";
40
+ import"../chunk-4ddzsqtc.js";
41
+ export {
42
+ HEADS2 as HEADS,
43
+ HEAD_RES2 as HEAD_RES,
44
+ SPECIES2 as SPECIES,
45
+ axle2 as axle,
46
+ birch2 as birch,
47
+ checkHead2 as checkHead,
48
+ creature2 as creature,
49
+ facade2 as facade,
50
+ head2 as head,
51
+ headEdits2 as headEdits,
52
+ headParams2 as headParams,
53
+ hull2 as hull,
54
+ hullLines2 as hullLines,
55
+ hullMesh2 as hullMesh,
56
+ mass2 as mass,
57
+ oak2 as oak,
58
+ opening2 as opening,
59
+ palm2 as palm,
60
+ pine2 as pine,
61
+ propeller2 as propeller,
62
+ ridgeHeight2 as ridgeHeight,
63
+ roof2 as roof,
64
+ roofHeightAt2 as roofHeightAt,
65
+ roofInfo2 as roofInfo,
66
+ roofMesh2 as roofMesh,
67
+ setbacks2 as setbacks,
68
+ trackRun2 as trackRun,
69
+ tree2 as tree,
70
+ treeParams2 as treeParams,
71
+ treeReal2 as treeReal,
72
+ trees2 as trees,
73
+ whyteAxles2 as whyteAxles,
74
+ willow2 as willow
75
+ };
76
+
77
+ //# debugId=2A8DC31E36ABDA1E64756E2164756E21
78
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "2A8DC31E36ABDA1E64756E2164756E21",
8
+ "names": []
9
+ }
@@ -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;