@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,21 @@
1
+ # Material swatches — the trim sheet on a test board
2
+
3
+ ## Identity
4
+ Not a real-world object: a labelled board that shows every strip and cell of the shared
5
+ procedural trim sheet (`paintTrimSheet`, `DEFAULT_SHEET`), each at true scale. It is the visual
6
+ test of the material generator: if a strip's brick courses, plank widths or slate rows read
7
+ wrong here, they read wrong on every asset.
8
+
9
+ ## Specs
10
+ | Item | Value | Source |
11
+ |---|---|---|
12
+ | strip panel | 2 m wide × the strip's design height | `src/material/trim-sheet.ts` `scaleMetres` |
13
+ | decal / foliage cell | 1 m | `src/material/trim-sheet.ts` |
14
+ | strips | plain, brick, stone, slate, iron, wood, glass, concrete | `StripId` |
15
+
16
+ ## Parts
17
+ One static board: front plinth (8 strips), raised rear plinth (6 decal + 11 foliage cells),
18
+ block-letter labels at LOD0.
19
+
20
+ ## Open questions
21
+ None. Build with `--sheet embed` to see textures in a stock viewer.
@@ -0,0 +1,189 @@
1
+ // Material swatches: every trim-sheet strip and cell on a labelled panel — the visual test of the
2
+ // procedural material generator. Front plinth: the 8 strips, each a 2 m wide panel as tall as the
3
+ // strip's design height (`DEFAULT_SHEET` scaleMetres), so one panel face = one strip rect at true
4
+ // scale, tinted by a representative vertex colour. Rear, raised plinth: the 6 decal cells and the
5
+ // 11 foliage cells (cutout leaf cards standing on their anchor), 1 m each. Labels are block
6
+ // letters (3×5 font, merged pixel runs) on the plinth faces, LOD0 only.
7
+ // Export with `--sheet` (or `toGlb(a, { sheet: paintTrimSheet() })`) to see the textures; the
8
+ // contact sheet is vertex colour only.
9
+
10
+ import {
11
+ box,
12
+ type CellId,
13
+ cellRect,
14
+ DECAL_CELLS,
15
+ DEFAULT_SHEET,
16
+ defineAsset,
17
+ FOLIAGE_CELLS,
18
+ hex,
19
+ type Mesh,
20
+ MeshBuilder,
21
+ merge,
22
+ NATURAL,
23
+ STRIPS,
24
+ type StripId,
25
+ type Vec3,
26
+ } from '@developerz.ai/ts23d';
27
+
28
+ const STONE = hex('#9c968c');
29
+ const INK = hex('#1c1c1c');
30
+ const TINT: Readonly<Partial<Record<StripId, Vec3>>> = {
31
+ plain: hex('#e8e4dc'),
32
+ brick: hex('#9a4a32'),
33
+ stone: hex('#c8bba0'),
34
+ slate: hex('#4a5058'),
35
+ iron: hex('#3f4a3a'),
36
+ wood: hex('#8a6440'),
37
+ glass: hex('#9fc0d0'),
38
+ concrete: hex('#a7a39b'),
39
+ };
40
+
41
+ // 3×5 glyphs, one 3-bit row per entry, top row first (bit 4 = left column).
42
+ const FONT: Readonly<Record<string, readonly number[]>> = {
43
+ a: [2, 5, 7, 5, 5],
44
+ b: [6, 5, 6, 5, 6],
45
+ c: [3, 4, 4, 4, 3],
46
+ d: [6, 5, 5, 5, 6],
47
+ e: [7, 4, 6, 4, 7],
48
+ f: [7, 4, 6, 4, 4],
49
+ g: [3, 4, 5, 5, 3],
50
+ h: [5, 5, 7, 5, 5],
51
+ i: [7, 2, 2, 2, 7],
52
+ j: [1, 1, 1, 5, 2],
53
+ k: [5, 5, 6, 5, 5],
54
+ l: [4, 4, 4, 4, 7],
55
+ m: [5, 7, 7, 5, 5],
56
+ n: [6, 5, 5, 5, 5],
57
+ o: [2, 5, 5, 5, 2],
58
+ p: [6, 5, 6, 4, 4],
59
+ q: [2, 5, 5, 6, 3],
60
+ r: [6, 5, 6, 5, 5],
61
+ s: [3, 4, 2, 1, 6],
62
+ t: [7, 2, 2, 2, 2],
63
+ u: [5, 5, 5, 5, 7],
64
+ v: [5, 5, 5, 5, 2],
65
+ w: [5, 5, 7, 7, 5],
66
+ x: [5, 5, 2, 5, 5],
67
+ y: [5, 5, 2, 2, 2],
68
+ z: [7, 1, 2, 4, 7],
69
+ };
70
+
71
+ /**
72
+ * Block-letter label on a +X-facing plane at x = `faceX`, centred on `y`, baseline at `z`,
73
+ * reading along +Y (a viewer at +X). Horizontal pixel runs merge into one box each.
74
+ */
75
+ function label(text: string, faceX: number, y: number, z: number, px: number): Mesh {
76
+ const parts: Mesh[] = [];
77
+ const chars = [...text.replace(/_/g, ' ')];
78
+ const width = chars.length * 4 * px - px;
79
+ chars.forEach((ch, i) => {
80
+ const rows = FONT[ch];
81
+ if (!rows) return;
82
+ const left = y - width / 2 + i * 4 * px;
83
+ rows.forEach((bits, r) => {
84
+ let c = 0;
85
+ while (c < 3) {
86
+ if (!((bits >> (2 - c)) & 1)) {
87
+ c++;
88
+ continue;
89
+ }
90
+ let run = 0;
91
+ while (c + run < 3 && (bits >> (2 - c - run)) & 1) run++;
92
+ parts.push(
93
+ box({
94
+ size: [0.004, run * px, px],
95
+ at: [faceX + 0.002, left + (c + run / 2) * px, z + (4 - r) * px],
96
+ color: INK,
97
+ omit: ['back'],
98
+ }),
99
+ );
100
+ c += run;
101
+ }
102
+ });
103
+ });
104
+ return merge(parts);
105
+ }
106
+
107
+ /** A +X-facing quad mapping one cell rect: left→right = u0→u1 along +Y, bottom→top = v0→v1. */
108
+ function cellQuad(id: CellId, x: number, y: number, z: number, size: number, color: Vec3): Mesh {
109
+ const r = cellRect(id);
110
+ const b = new MeshBuilder();
111
+ const n: Vec3 = [1, 0, 0];
112
+ const h = size / 2;
113
+ const v = (dy: number, dz: number, u: number, w: number): number =>
114
+ b.vertex({ p: [x, y + dy, z + dz], n, uv: [u, w], color });
115
+ b.quad(
116
+ v(-h, 0, r.u0, r.v0),
117
+ v(h, 0, r.u1, r.v0),
118
+ v(h, size, r.u1, r.v1),
119
+ v(-h, size, r.u0, r.v1),
120
+ );
121
+ return b.build();
122
+ }
123
+
124
+ const FRONT = { x: 0, depth: 1.2, height: 0.2, gap: 0.4 };
125
+ const REAR = { x: -1.6, depth: 1.2, height: 1.4, gap: 0.15 };
126
+
127
+ export const material_swatches = defineAsset({
128
+ name: 'material_swatches',
129
+ kind: 'prop',
130
+ description:
131
+ 'Every trim-sheet strip and cell on labelled panels: the material generator test card.',
132
+ // 24 strip panels (library v2) + decal and foliage cells.
133
+ budget: { triangles: [24000, 1200, 800] },
134
+ build(ctx) {
135
+ const stripSpan = STRIPS.length * 2 + (STRIPS.length - 1) * FRONT.gap;
136
+ const cells: readonly CellId[] = [...DECAL_CELLS, ...FOLIAGE_CELLS];
137
+ const cellSpan = cells.length + (cells.length - 1) * REAR.gap;
138
+ const span = Math.max(stripSpan, cellSpan) + 0.4;
139
+ ctx.part(
140
+ 'plinth_front',
141
+ box({ size: [FRONT.depth, span, FRONT.height], at: [FRONT.x, 0, 0], color: STONE }),
142
+ );
143
+ ctx.part(
144
+ 'plinth_rear',
145
+ box({ size: [REAR.depth, span, REAR.height], at: [REAR.x, 0, 0], color: STONE }),
146
+ );
147
+ const frontFace = FRONT.x + FRONT.depth / 2;
148
+ const rearFace = REAR.x + REAR.depth / 2;
149
+
150
+ STRIPS.forEach((id, i) => {
151
+ const y = -stripSpan / 2 + 1 + i * (2 + FRONT.gap);
152
+ const h = DEFAULT_SHEET.strips[id]?.scaleMetres ?? 1;
153
+ const panel = box({
154
+ size: [0.06, 2, h],
155
+ at: [FRONT.x, y, FRONT.height],
156
+ color: TINT[id] ?? NATURAL,
157
+ strip: id,
158
+ });
159
+ ctx.part(`strip_${id}`, panel, id === 'glass' ? { surface: 'glass' } : {});
160
+ if (ctx.lod === 0) ctx.part(`label_${id}`, label(id, frontFace, y, 0.04, 0.024));
161
+ });
162
+
163
+ cells.forEach((id, i) => {
164
+ const y = -cellSpan / 2 + 0.5 + i * (1 + REAR.gap);
165
+ const foliage = id.startsWith('foliage_');
166
+ if (foliage) {
167
+ // A leaf card standing on its anchor edge, white so the painted colour reads true.
168
+ ctx.part(`cell_${id}`, cellQuad(id, REAR.x, y, REAR.height, 1, [1, 1, 1]), {
169
+ surface: 'cutout',
170
+ });
171
+ } else {
172
+ const back = box({
173
+ size: [0.06, 1, 1],
174
+ at: [REAR.x, y, REAR.height],
175
+ color: TINT.plain ?? NATURAL,
176
+ });
177
+ ctx.part(
178
+ `cell_${id}`,
179
+ merge([back, cellQuad(id, REAR.x + 0.032, y, REAR.height, 1, TINT.plain ?? NATURAL)]),
180
+ );
181
+ }
182
+ if (ctx.lod === 0)
183
+ ctx.part(
184
+ `label_${id}`,
185
+ label(id.replace('foliage_', ''), rearFace, y, REAR.height - 0.12, 0.016),
186
+ );
187
+ });
188
+ },
189
+ });
@@ -0,0 +1,45 @@
1
+ # Mountain range — 2 × 2 km alpine map tile (Northern Alps type)
2
+
3
+ ## Identity
4
+ A game-map terrain tile, not a landmark: one glacial (U-shaped) valley crossing a 2 × 2 km block,
5
+ flanked by ridged massifs whose summits carry snow. What makes it read as *alpine* rather than
6
+ "noise hills": **sharp ridgelines with smooth valley floors** (ridged multifractal), **gullies and
7
+ debris fans carved by water** (hydraulic erosion), **cliff bands capped at a talus angle** (thermal
8
+ erosion), and **altitude zonation**: conifer forest on the valley floor, alpine meadow above the
9
+ treeline, bare rock on anything steep, snow above the snowline wherever the slope can hold it.
10
+ Three seeded variants (`mountain_range`, `_b`, `_c`) show the seed + valley-heading parameters.
11
+
12
+ ## Specs
13
+ All values are general alpine figures cited from prior knowledge, **not re-fetched in this session
14
+ (unsourced / approximate)**; the coordinator may attach sources.
15
+
16
+ | Quantity | Value | Used as | Source |
17
+ |---|---|---|---|
18
+ | tile size | 2000 × 2000 m | `rect` | design choice (map tile) |
19
+ | valley floor altitude (N. Alps, glacial valleys) | 1000–1800 m | measured 1853 / 1751 / 1775 m | unsourced, approximate |
20
+ | summit altitude (in a 2 km tile around such a valley) | 2500–3200 m | measured 2702 / 2714 / 2773 m | unsourced, approximate |
21
+ | local relief valley → ridge over ~1 km | 700–1200 m | ~950 m | unsourced; more than ~1000 m/km makes mean slopes > 45° |
22
+ | treeline (Alps, conifers: spruce, larch, Swiss pine) | 1800–2200 m | 2000 m | unsourced, approximate |
23
+ | climatic snowline (Alps, summer; lower on north faces, early season) | 2600–3200 m; patches to ~2300 m in June | 2480 m (early-summer look; variant c 2550 m) | unsourced, approximate |
24
+ | angle of repose of scree / talus | 30–40° (≈ 34° typical) | thermal `talus` 1.0 (45°) caps cliffs, scree colour on 11–24° deposit fans | unsourced, approximate |
25
+ | slope where bare rock dominates | > ~40° | `rockSlope` 0.85 (40°) | unsourced, approximate |
26
+ | slope above which snow rarely holds | ~50–55° | `snowSlope` 1.2 (50°) | unsourced, approximate |
27
+ | typical valley-side slope | 25–35° | measured (LOD0 normals): median 36° / 40° / 43° (variants a / b / c), p95 ≈ 65° | unsourced, approximate |
28
+
29
+ Units: metres, Z up. z = altitude − 1650 m (the `DATUM`), so the tile stands on z = 0 with a
30
+ skirt ~100 m below the lowest valley point.
31
+
32
+ ## Photos (by view)
33
+ To be added (no web access in this session). Look-alikes to compare against: the Lauterbrunnen and
34
+ Grindelwald valleys (U-shaped glacial troughs), the Zillertal Alps, Dolomites screes for debris fans.
35
+
36
+ ## Parts the engine needs
37
+ `terrain` (one mesh, one draw call): heightfield + skirt. LOD by grid density: 256 / 128 / 64 cells.
38
+
39
+ ## Open questions
40
+ - Snowline: a summer climatic snowline (~2800 m) would leave these summits bare; we chose an
41
+ early-summer look (2480 m) so the tile shows the snow band. Raise `snowline` for late summer.
42
+ - Real alpine tiles of 2 km rarely hold a full valley-to-summit section; relief is compressed
43
+ (~950 m) to keep slopes plausible at this size. Even so the median slope (36–43°) is steeper
44
+ than typical valley sides (25–35°): the ridged noise gives knife-edge crests. Lower `relief` or
45
+ the ridged `gain` for gentler, Pre-Alps terrain.
@@ -0,0 +1,128 @@
1
+ // Mountain range: a 2 × 2 km alpine map tile. Numbers and their caveats: README.md (dossier).
2
+ //
3
+ // Pipeline, all seeded from ctx.rng (three variants = three seeds + valley headings):
4
+ // 1. masses — ridged multifractal (sharp ridgelines, smooth lows) domain-warped so ranges fold,
5
+ // over a U-shaped glacial trough along `valley`, plus low fBm hills.
6
+ // 2. erosion on one 256² grid shared by every LOD — hydraulic droplets carve gullies and drop
7
+ // fans, then thermal erosion caps cliffs at 45°.
8
+ // 3. colour — forest below the treeline, meadow above, rock on steep ground, scree on fans, damp
9
+ // gullies, snow above the snowline where the slope holds it.
10
+ // 4. mesh — heightfield at 256 / 128 / 64 cells by LOD, sampling the eroded grid, with a skirt
11
+ // down to z = 0 (a solid tile). One part, one draw call.
12
+
13
+ import {
14
+ type BuildContext,
15
+ defineFamily,
16
+ fbm,
17
+ gradientNoise2,
18
+ heightfield,
19
+ hex,
20
+ hydraulicErosion,
21
+ ridged,
22
+ sampler,
23
+ terrainColor,
24
+ terrainGrid,
25
+ thermalErosion,
26
+ warp,
27
+ } from '@developerz.ai/ts23d';
28
+
29
+ /** Altitude (m above sea level) of z = 0. */
30
+ const DATUM = 1650;
31
+ const HALF = 1000;
32
+ const RECT = [-HALF, -HALF, HALF, HALF] as const;
33
+
34
+ const PALETTE = {
35
+ forest: hex('#2f4a2a'),
36
+ grass: hex('#6f8a45'),
37
+ scree: hex('#8a8272'),
38
+ rock: hex('#5a5652'),
39
+ snow: hex('#f2f4f7'),
40
+ wet: hex('#4a4a3c'),
41
+ };
42
+
43
+ interface Params {
44
+ /** Unit direction of the main valley in plan. */
45
+ readonly valley: readonly [number, number];
46
+ /** Valley floor and ridge relief, m. */
47
+ readonly floor: number;
48
+ readonly relief: number;
49
+ readonly treeline: number;
50
+ readonly snowline: number;
51
+ /** Hydraulic droplets on the 257² grid (~2 per point carves strongly). */
52
+ readonly droplets: number;
53
+ }
54
+
55
+ function build(ctx: BuildContext, p: Readonly<Params>): void {
56
+ const rng = ctx.rng;
57
+ const [vx, vy] = p.valley;
58
+ const wx = fbm(gradientNoise2(rng.fork('warp-x')), { scale: 900, octaves: 3 });
59
+ const wy = fbm(gradientNoise2(rng.fork('warp-y')), { scale: 900, octaves: 3 });
60
+ const range = warp(
61
+ ridged(gradientNoise2(rng.fork('range')), { scale: 1700, octaves: 6, gain: 0.35 }),
62
+ wx,
63
+ wy,
64
+ 350,
65
+ );
66
+ const hills = fbm(gradientNoise2(rng.fork('hills')), { scale: 700, octaves: 5 });
67
+ const altitude = (x: number, y: number): number => {
68
+ // Distance across the valley axis, meandering by up to 300 m; U-shaped trough profile.
69
+ const along = x * vx + y * vy;
70
+ const across = -x * vy + y * vx - 300 * wx(along * 0.7, 0);
71
+ const d = Math.min(1, (across / 450) ** 2);
72
+ return p.floor + p.relief * range(x, y) * (0.2 + 0.8 * d) + 60 * hills(x, y) + 120 * d;
73
+ };
74
+ let grid = terrainGrid({ rect: RECT, cells: 256, height: (x, y) => altitude(x, y) - DATUM });
75
+ grid = hydraulicErosion(grid, rng.fork('erosion'), { droplets: p.droplets });
76
+ grid = thermalErosion(grid, { talus: 1, iterations: 25 });
77
+ const color = terrainColor(grid, {
78
+ palette: PALETTE,
79
+ datum: DATUM,
80
+ treeline: p.treeline,
81
+ snowline: p.snowline,
82
+ rockSlope: 0.85,
83
+ snowSlope: 1.2,
84
+ noise: fbm(gradientNoise2(rng.fork('jitter')), { scale: 120, octaves: 3 }),
85
+ jitter: 70,
86
+ });
87
+ const cells = ctx.pick([256, 128, 64]);
88
+ ctx.part(
89
+ 'terrain',
90
+ heightfield({
91
+ rect: RECT,
92
+ cells: [cells, cells],
93
+ height: sampler(grid),
94
+ color,
95
+ skirt: 0,
96
+ skirtColor: hex('#5a4a3a'),
97
+ }),
98
+ );
99
+ }
100
+
101
+ export const mountainRange = defineFamily<Params>({
102
+ kind: 'terrain',
103
+ description:
104
+ '2 × 2 km alpine map tile: eroded ridges, a glacial valley, forest, meadow, rock and snow bands.',
105
+ tags: ['terrain', 'landscape', 'alpine', 'erosion', 'map'],
106
+ budget: { triangles: [140000, 40000, 10000] },
107
+ defaults: {
108
+ valley: [1, 0],
109
+ floor: 1720,
110
+ relief: 950,
111
+ treeline: 2000,
112
+ snowline: 2480,
113
+ droplets: 100000,
114
+ },
115
+ build,
116
+ });
117
+
118
+ export const mountain_range = mountainRange.variant({ name: 'mountain_range', seed: 1 });
119
+ export const mountain_range_b = mountainRange.variant({
120
+ name: 'mountain_range_b',
121
+ seed: 2,
122
+ params: { valley: [0.8, 0.6] },
123
+ });
124
+ export const mountain_range_c = mountainRange.variant({
125
+ name: 'mountain_range_c',
126
+ seed: 3,
127
+ params: { valley: [0.6, -0.8], relief: 1050, snowline: 2550 },
128
+ });
@@ -0,0 +1,30 @@
1
+ # Oak — English oak (*Quercus robur*), mature open-grown specimen
2
+
3
+ ## Identity
4
+ A parkland/field oak rather than a forest-grown one: open-grown oaks are as wide as they are tall,
5
+ which is the silhouette people recognise. Signature features: a **short, massive bole** (1–1.5 m)
6
+ that splits low into **several thick, sinuous, near-horizontal limbs**; a **broad domed crown**;
7
+ dense dark-green foliage in lobed clusters; a buttressed root flare.
8
+
9
+ ## Specs
10
+ | Dimension | Value (m) | Source |
11
+ |---|---|---|
12
+ | height (mature) | 22 (range 20–40) | https://en.wikipedia.org/wiki/Quercus_robur · https://www.woodlandtrust.org.uk/trees-woods-and-wildlife/british-trees/a-z-of-british-trees/english-oak/ |
13
+ | crown spread | 22 (open-grown ≈ height) | Woodland Trust (above): "broad, spreading crown" |
14
+ | trunk diameter at breast height (1.3 m) | 1.3 (girth ≈ 4.1 m; Wikipedia gives 4–12 m girth for mature trees) | Wikipedia (above) |
15
+ | crown base (clear bole) | ≈ 4 m | photo-estimated |
16
+
17
+ ## Photos (by view)
18
+ | View | URL | Notes |
19
+ |---|---|---|
20
+ | side, open-grown | https://commons.wikimedia.org/wiki/Category:Quercus_robur_(habitus) | crown ≈ as wide as tall |
21
+ | bole + limbs | https://commons.wikimedia.org/wiki/Category:Quercus_robur_trunks | low split, sinuous limbs |
22
+ | leaves | https://commons.wikimedia.org/wiki/Category:Quercus_robur_leaves | lobed outline → `lobed` card |
23
+
24
+ ## Parts the engine needs
25
+ `trunk`, `roots` (flare), `crown` (sway group, 2° @ 0.4 Hz about X) › `branches`, `leaves`.
26
+
27
+ ## Open questions
28
+ Sizes vary enormously with age and site (20–40 m). We model a ~150-year field oak at 22 × 22 m with
29
+ 1.3 m DBH. Sources were cited from prior knowledge and not re-fetched in this session; re-check the
30
+ numbers if a specific specimen is wanted.
@@ -0,0 +1,19 @@
1
+ // English oak (Quercus robur), open-grown mature specimen: 22 m tall, crown as wide as it is tall,
2
+ // 1.3 m trunk at breast height (≈ 4.1 m girth). Spreading crooked limbs, lobed leaf clusters,
3
+ // buttressed root flare. The `tree` kind does the botany; this file is the spec. recipes/oak/README.md.
4
+
5
+ import { treeReal, trees } from '@developerz.ai/ts23d';
6
+
7
+ const size = { height: 22, spread: 22, dbh: 1.3 };
8
+
9
+ export const oak = trees.variant({
10
+ name: 'oak',
11
+ description:
12
+ 'English oak (Quercus robur), mature open-grown: broad domed crown on a short thick bole',
13
+ sources: [
14
+ 'https://en.wikipedia.org/wiki/Quercus_robur (20–40 m; trunk girth 4–12 m)',
15
+ 'https://www.woodlandtrust.org.uk/trees-woods-and-wildlife/british-trees/a-z-of-british-trees/english-oak/ (mature height 20–40 m, broad spreading crown)',
16
+ ],
17
+ real: treeReal({ ...size, source: 'recipes/oak/README.md' }),
18
+ params: { species: 'oak', ...size },
19
+ });
@@ -0,0 +1,78 @@
1
+ # Orc warrior bust — original stylised design
2
+
3
+ ## Identity
4
+ A brutish orc warlord, read from the 3/4 view by: a **hunched brute silhouette** (trapezius sloping
5
+ from behind the ears to the shoulders, the neck nearly as wide as the head), a **massive
6
+ underbitten jaw** with **lower tusks rising outside the upper lip**, a **heavy brow shelf** (a
7
+ flattened bar with a glabella knot, scowling down at the centre) shadowing **small deep-set ember
8
+ eyes**, a **flat broad nose**, **cheekbone ridges** running back to swept **pointed ears**, a **bound
9
+ warrior's knot** falling to the nape, war paint, **pectorals and deltoids** on the bare chest, and
10
+ **spiked plate pauldrons** (a domed cap and a shingled lame, hollow shells with worn bright rims)
11
+ over a **fur mantle** — cut as a collectible bust on a turned plinth.
12
+
13
+ ## Design spec (head units: 1 = chin to crown = 0.30 m, ≈ 1.3 × human)
14
+ | Feature | Value (units) | Metres | Note |
15
+ |---|---|---|---|
16
+ | chin → crown | 1.00 | 0.300 | the `height` param |
17
+ | overall bust L × W × H | — | 0.405 × 0.660 × 0.587 | `real`, ±5 %; length includes the knot's tail |
18
+ | cranium width / depth / above eye line | 0.70 / 0.74 / 0.31 | 0.21 / 0.22 / 0.09 | low, sloped dome: the face is the mass |
19
+ | eye line | 0.56 | — | higher than human: the jaw is the mass |
20
+ | eyeball radius / spacing | 0.054 / 0.155 | 0.016 / pupils 0.093 apart | `measures` gate, ±2 % |
21
+ | brow ridge / overhang / scowl | 0.075 / 0.06 / 0.04 | | a shelf, not two bumps |
22
+ | jaw half-width at angle / chin | 0.40 / 1.3 | 0.120 | human 0.22; square rounded-box chin |
23
+ | muzzle (prognathism) / underbite / chin drop | 0.10 / 0.10 / 0.10 | | lower lip thickens with the underbite |
24
+ | tusks length / base radius | 0.22 / 0.055 | 0.066 / 0.017 | 3 cone segments from the lower lip, flared |
25
+ | neck radius | 0.38 | 0.114 | |
26
+ | shoulders (half-span) / mass | 1.00 / 1 | 0.300 | `bust.mass` 1 = brute: torso lifted (hunch), thick traps |
27
+ | plinth | 0.17 + hunch | ≈ 0.08 | disc + socle; cut faces painted plinth stone |
28
+
29
+ ## Palette (sRGB)
30
+ | Role | Hex |
31
+ |---|---|
32
+ | skin / shade / lips | `#5c8034` / `#33501e` / `#4f6f30` (painted tone: crevices darker, tops warmer) |
33
+ | eyes: sclera / iris (+ emissive glow `#ff7a1a` × 2.5) | `#8a5a1a` / `#ffb030` |
34
+ | tusks + bone spikes | `#e2d6b0` |
35
+ | hair (warrior's knot) / fur mantle (strands alternate ×0.72) | `#231a14` / `#5e4a34` |
36
+ | war paint (cheek claw marks, crest stripe, chin stripes) | `#8a1c12` |
37
+ | pauldron iron (cap ×1, lame ×0.85, worn rims ×1.3, rivets ×1.35, crest ×0.75) / leather baldric | `#55524d` / `#5a3a22` |
38
+ | plinth / cut faces | `#6f6c6c` (linear 0.16, 0.15, 0.15) / ×1.3 |
39
+
40
+ ## Parts the engine needs
41
+ | Part | Pivot | Motion |
42
+ |---|---|---|
43
+ | `bust` | origin, base on z = 0 | static |
44
+ | `head` | origin | static (skull, neck, ears, hair) |
45
+ | `jaw` | jaw hinge (in front of the ear), opens about +Y | static by default; `head(ctx, { jawSway: 4 })` bakes a sway with `clearOf: ['head']` |
46
+ | `eye_l`, `eye_r` | eyeball centres, gaze +X | static; rotate them to aim |
47
+
48
+ The jaw region is the chin + lower lip (an ellipsoid cut flat at the mouth line), so its seam runs
49
+ along the lips, the marionette lines and under the chin. Its cut faces are painted mouth-dark for
50
+ when it opens; it laps 0.75 cells over the head so no gap shows.
51
+
52
+ ## LODs
53
+ Sculpt cell = 2 % / 4.5 % / 14 % of head height (bust 1.6 ×). LOD0/1 bake vertex AO across all
54
+ parts (16/10 rays); every LOD carries the painted tone (cavity, warm top, cool under). LOD1/2 drop
55
+ the teeth and tongue; LOD2 drops warts, wiry tufts and the AO bake, floors ear/tusk/nose radii at
56
+ about a cell, makes the pauldron plates solid and the plinth one drum so nothing opens or floats.
57
+
58
+ ## References (stylised anatomy, not likeness)
59
+ | Topic | Link | Used for |
60
+ |---|---|---|
61
+ | Loomis head: eye line at half height, brow/nose/chin thirds | https://finearttutorials.com/guide/loomis-method/ | human eye line 0.5, nose base 0.32, mouth 0.22 |
62
+ | Proportions of the head (ears between brow and nose base, head ≈ 5 eyes wide) | https://artyfactory.com/portraits/pencil-portraits/proportions-of-a-head.html | ear placement, eye size vs head width |
63
+ | Primary → secondary → tertiary forms (block brow/cheek/jaw first, then cut lids and folds) | https://www.creativebloq.com/how-to/how-to-sculpt-and-pose-a-cartoon-head-in-zbrush | the edit order in `head-face.ts` |
64
+ | Orc: widen head and jawline to break human proportion; sculpt bony forms (cheekbones) early | https://www.creativebloq.com/3d/how-create-orc-zbrush-61411834 | orc jaw width 0.40 vs human 0.22, zygomatic ridge |
65
+ | Stylised bust method: primary → secondary → tertiary shapes | https://cgzen.gumroad.com/l/stylized-bust | torso masses before gear |
66
+ | Stylised orc head study (silhouette, form language) | https://blenderartists.org/t/orc-head-study-stylized-characters/1655542 | massing check |
67
+ | Stylised hair: large clumps first, hairline → crown, one primary flow direction | https://gamesartist.co.uk/curly-hair-ls/ · https://www.cgchannel.com/2023/03/tutorial-creating-stylized-hairstyles-using-zbrush | `swept` locks in head-hair.ts |
68
+ | Dreams (Media Molecule, Evans, SIGGRAPH 2015): sculptures as ordered SDF edits + smooth-min | https://www.mediamolecule.com/blog/article/siggraph_2015 · slides https://advances.realtimerendering.com/s2015/AlexEvans_SIGGRAPH-2015-sml.pdf | the whole approach |
69
+
70
+ Design is original: no character, logo, name or likeness from any game is copied. "Chunky
71
+ hand-painted stylised fantasy" is the idiom (exaggerated primary forms, generous fillets, flat
72
+ vertex colour with baked AO), not a specific source.
73
+
74
+ ## Known gaps
75
+ Pauldron plates are smooth shells (no hammered dents or scratches); fur strands are cones, not
76
+ noise-broken clumps; no skin pores or wrinkle noise; the jaw part's seam still shows as a faint
77
+ line round the chin up close; the bust's U-cut leaves the belly reading slightly pear-shaped from
78
+ dead front.
@@ -0,0 +1,41 @@
1
+ // Stylised orc warrior bust — an original design in the chunky hand-painted fantasy idiom: massive
2
+ // underbitten jaw with lower tusks rising outside the upper lip, a heavy brow shelf over small ember
3
+ // eyes, flat broad nose, swept ears, a bound warrior's knot, war paint; a hunched brute torso
4
+ // (trapezius from ear to shoulder, pectorals, deltoids) under spiked plate pauldrons and a fur
5
+ // mantle, cut as a collectible bust on a turned plinth. The `head` kind sculpts it (race preset
6
+ // `orc`, chin to crown 0.30 m); this file is the spec.
7
+ // Design dossier: recipes/orc_head/README.md.
8
+
9
+ import { defineAsset, head, hex } from '@developerz.ai/ts23d';
10
+
11
+ export const orc_head = defineAsset({
12
+ name: 'orc_head',
13
+ kind: 'character',
14
+ description:
15
+ 'Stylised orc warrior bust on a plinth: underbite and lower tusks, heavy brow, ember eyes, warrior knot, hunched trapezius, spiked plate pauldrons, fur mantle',
16
+ tags: ['character', 'fantasy', 'orc', 'bust', 'sculpt'],
17
+ license: 'CC0-1.0',
18
+ sources: ['recipes/orc_head/README.md (design dossier: proportions, palette, references)'],
19
+ // Design spec, not a real-world one: overall bust size and eye spacing from the dossier.
20
+ real: {
21
+ length: 0.405,
22
+ width: 0.66,
23
+ height: 0.587,
24
+ measures: [
25
+ {
26
+ label: 'eye spacing (pupil to pupil)',
27
+ value: 0.093,
28
+ axis: 'y',
29
+ between: ['eye_l', 'eye_r'],
30
+ source: '0.155 × 2 head units × 0.30 m',
31
+ },
32
+ ],
33
+ },
34
+ // Measured: sculpt cells 2 % / 4.5 % / 14 % of head height (LOD0/1 also bake vertex AO).
35
+ budget: { triangles: [77000, 15400, 2000] },
36
+ // Ember eyes: the whole eyeball glows (dark amber sclera, bright iris).
37
+ glow: [{ parts: ['eye_*'], color: hex('#ff7a1a'), strength: 2.5 }],
38
+ build(ctx) {
39
+ head(ctx, { race: 'orc' });
40
+ },
41
+ });
@@ -0,0 +1,30 @@
1
+ # Palm — coconut palm (*Cocos nucifera*), mature
2
+
3
+ ## Identity
4
+ The tall variety, typical of beaches. Signature features: a **slender, ringed, bowed stem** of
5
+ nearly constant diameter, slightly swollen at the base; a **starburst crown of ~20–30 pinnate
6
+ fronds** whose leaflets hang in a V and whose lower fronds droop below horizontal; and **coconuts
7
+ clustered under the frond bases**.
8
+
9
+ ## Specs
10
+ | Dimension | Value (m) | Source |
11
+ |---|---|---|
12
+ | height | 20 (up to 30) | https://en.wikipedia.org/wiki/Coconut |
13
+ | stem diameter | 0.35 (typical 0.3–0.4) | https://en.wikipedia.org/wiki/Cocos_nucifera · photo-estimated |
14
+ | frond length | 4–6 (model: ≈ 5.2) | Wikipedia "Coconut": "pinnate leaves 4–6 m long" |
15
+ | crown spread | 9 (≈ 2 × horizontal frond reach) | derived from frond length and droop |
16
+ | fronds | 22 (live crown holds ~25–30) | Wikipedia (above) |
17
+
18
+ ## Photos (by view)
19
+ | View | URL | Notes |
20
+ |---|---|---|
21
+ | habit | https://commons.wikimedia.org/wiki/Category:Cocos_nucifera_(habitus) | bowed stem, crown back over the base |
22
+ | crown detail | https://commons.wikimedia.org/wiki/Category:Cocos_nucifera_leaves | V-folded leaflets |
23
+
24
+ ## Parts the engine needs
25
+ `trunk`, `roots` (root plate), `crown` (sway) › `branches` (rachises + coconuts), `leaves` (leaflets).
26
+
27
+ ## Open questions
28
+ The stem bows (lean 12°, curving back by 24°) so the crown sits back over the base and the
29
+ footprint stays at the crown spread; strongly leaning shoreline palms would also need `real.length`
30
+ widened. Sources were cited from prior knowledge and not re-fetched in this session.
@@ -0,0 +1,19 @@
1
+ // Coconut palm (Cocos nucifera), mature: 20 m bowed stem of 0.35 m, ~22 pinnate fronds 4–6 m
2
+ // long forming a 9 m crown, a hand of coconuts under the frond bases. The `tree` kind does the
3
+ // botany; this file is the spec. recipes/palm/README.md.
4
+
5
+ import { treeReal, trees } from '@developerz.ai/ts23d';
6
+
7
+ const size = { height: 20, spread: 9, dbh: 0.35 };
8
+
9
+ export const palm = trees.variant({
10
+ name: 'palm',
11
+ description:
12
+ 'Coconut palm (Cocos nucifera): slender bowed ringed stem, crown of drooping pinnate fronds',
13
+ sources: [
14
+ 'https://en.wikipedia.org/wiki/Coconut (up to 30 m; pinnate leaves 4–6 m long)',
15
+ 'https://en.wikipedia.org/wiki/Cocos_nucifera',
16
+ ],
17
+ real: treeReal({ ...size, source: 'recipes/palm/README.md' }),
18
+ params: { species: 'palm', ...size },
19
+ });
@@ -0,0 +1,29 @@
1
+ # Pine — Scots pine (*Pinus sylvestris*), mature
2
+
3
+ ## Identity
4
+ The mature form, not the conical sapling. A sapling would read as a generic Christmas-tree conifer;
5
+ an old Scots pine is unmistakable. Signature features: a **long, clean, slightly sinuous bole**
6
+ (the crown sits in the top ~40%); bark that is **grey-brown and plated low down and turns
7
+ orange-red higher up**; a **flat-topped, irregular crown**; **dark blue-green needle pads lying
8
+ level** on gently upturned branch tips.
9
+
10
+ ## Specs
11
+ | Dimension | Value (m) | Source |
12
+ |---|---|---|
13
+ | height (mature) | 25 (range 25–35) | https://en.wikipedia.org/wiki/Pinus_sylvestris |
14
+ | trunk diameter at breast height | 0.6 (up to 1 m) | Wikipedia (above) |
15
+ | crown spread | 9 (typical 6–12) | https://www.woodlandtrust.org.uk/trees-woods-and-wildlife/british-trees/a-z-of-british-trees/scots-pine/ · photo-estimated |
16
+ | clear bole | ≈ 15 m (crown base at ~60% of height) | photo-estimated |
17
+
18
+ ## Photos (by view)
19
+ | View | URL | Notes |
20
+ |---|---|---|
21
+ | habit, mature | https://commons.wikimedia.org/wiki/Category:Pinus_sylvestris_(habitus) | flat top, high crown |
22
+ | upper bark | https://commons.wikimedia.org/wiki/Category:Pinus_sylvestris_bark | orange flaking bark → `barkTop` |
23
+
24
+ ## Parts the engine needs
25
+ `trunk`, `roots`, `crown` (sway) › `branches`, `leaves`.
26
+
27
+ ## Open questions
28
+ Crown spread is not given in most floras. 9 m is estimated from photos of mature open-grown trees.
29
+ Sources were cited from prior knowledge and not re-fetched in this session.
@@ -0,0 +1,19 @@
1
+ // Scots pine (Pinus sylvestris), mature: 25 m tall, 9 m crown in the top half, 0.6 m DBH. Long
2
+ // clean bole turning orange-red up high, flat-topped crown, dark blue-green needle tufts on
3
+ // upturned branch tips. The `tree` kind does the botany; this file is the spec. recipes/pine/README.md.
4
+
5
+ import { treeReal, trees } from '@developerz.ai/ts23d';
6
+
7
+ const size = { height: 25, spread: 9, dbh: 0.6 };
8
+
9
+ export const pine = trees.variant({
10
+ name: 'pine',
11
+ description:
12
+ 'Scots pine (Pinus sylvestris), mature: tall bare bole, orange upper bark, high flat-topped crown',
13
+ sources: [
14
+ 'https://en.wikipedia.org/wiki/Pinus_sylvestris (up to 35 m tall, trunk up to 1 m diameter; orange upper bark)',
15
+ 'https://www.woodlandtrust.org.uk/trees-woods-and-wildlife/british-trees/a-z-of-british-trees/scots-pine/ (mature 35 m; flat-topped crown in age)',
16
+ ],
17
+ real: treeReal({ ...size, source: 'recipes/pine/README.md' }),
18
+ params: { species: 'pine', ...size },
19
+ });