@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.
- package/.claude/agents/bug-hunter.md +21 -0
- package/.claude/agents/docs-author.md +13 -0
- package/.claude/agents/dx-auditor.md +14 -0
- package/.claude/agents/primitive-author.md +22 -0
- package/.claude/agents/recipe-author.md +36 -0
- package/.claude/agents/visual-reviewer.md +23 -0
- package/.claude/commands/feature.md +28 -0
- package/.claude/commands/new-recipe.md +19 -0
- package/.claude/commands/release.md +14 -0
- package/.claude/commands/verify.md +9 -0
- package/.claude/skills/author-recipe/SKILL.md +93 -0
- package/CHANGELOG.md +90 -0
- package/CLAUDE.md +85 -0
- package/LICENSE +21 -0
- package/README.md +385 -2
- package/dist/chunk-6b05mnmx.js +19 -0
- package/dist/chunk-6b05mnmx.js.map +11 -0
- package/dist/chunk-7rtfjh9f.js +45 -0
- package/dist/chunk-7rtfjh9f.js.map +10 -0
- package/dist/chunk-8j4c28jt.js +4085 -0
- package/dist/chunk-8j4c28jt.js.map +46 -0
- package/dist/chunk-d1fv6hrm.js +2532 -0
- package/dist/chunk-d1fv6hrm.js.map +43 -0
- package/dist/chunk-dbq4qf52.js +902 -0
- package/dist/chunk-dbq4qf52.js.map +25 -0
- package/dist/chunk-drna2rny.js +836 -0
- package/dist/chunk-drna2rny.js.map +17 -0
- package/dist/chunk-dxvypr7y.js +89 -0
- package/dist/chunk-dxvypr7y.js.map +11 -0
- package/dist/chunk-f6yme003.js +1589 -0
- package/dist/chunk-f6yme003.js.map +30 -0
- package/dist/chunk-hg7pf34j.js +465 -0
- package/dist/chunk-hg7pf34j.js.map +19 -0
- package/dist/chunk-jq4e17tj.js +1031 -0
- package/dist/chunk-jq4e17tj.js.map +21 -0
- package/dist/chunk-y63c6zcv.js +2668 -0
- package/dist/chunk-y63c6zcv.js.map +53 -0
- package/dist/cli/args.d.ts +30 -0
- package/dist/cli/bin.d.ts +2 -0
- package/dist/cli/bin.js +348 -0
- package/dist/cli/bin.js.map +15 -0
- package/dist/cli/load.d.ts +2 -0
- package/dist/cli/manifest.d.ts +53 -0
- package/dist/cli/render-cmds.d.ts +12 -0
- package/dist/cli/run.d.ts +1 -0
- package/dist/cli/texture-cache.d.ts +4 -0
- package/dist/core/asset.d.ts +10 -0
- package/dist/core/definition.d.ts +155 -0
- package/dist/core/errors.d.ts +17 -0
- package/dist/core/family.d.ts +23 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.js +69 -0
- package/dist/core/index.js.map +9 -0
- package/dist/core/mesh.d.ts +35 -0
- package/dist/core/part.d.ts +114 -0
- package/dist/core/png.d.ts +1 -0
- package/dist/core/rng.d.ts +12 -0
- package/dist/core/transform.d.ts +20 -0
- package/dist/core/vec.d.ts +11 -0
- package/dist/core/world.d.ts +16 -0
- package/dist/export/bin-writer.d.ts +16 -0
- package/dist/export/container.d.ts +3 -0
- package/dist/export/credits.d.ts +4 -0
- package/dist/export/glb-options.d.ts +48 -0
- package/dist/export/glb.d.ts +8 -0
- package/dist/export/hierarchy.d.ts +23 -0
- package/dist/export/index.d.ts +5 -0
- package/dist/export/index.js +40 -0
- package/dist/export/index.js.map +9 -0
- package/dist/export/lights.d.ts +8 -0
- package/dist/export/lod-coverage.d.ts +12 -0
- package/dist/export/materials.d.ts +23 -0
- package/dist/export/merge-pivots.d.ts +6 -0
- package/dist/export/metadata.d.ts +21 -0
- package/dist/export/motion.d.ts +9 -0
- package/dist/export/optimize-parts.d.ts +26 -0
- package/dist/export/primitive.d.ts +3 -0
- package/dist/export/tangents.d.ts +2 -0
- package/dist/export/textures.d.ts +22 -0
- package/dist/export/version.d.ts +2 -0
- package/dist/grammar/index.d.ts +2 -0
- package/dist/grammar/index.js +16 -0
- package/dist/grammar/index.js.map +9 -0
- package/dist/grammar/split.d.ts +21 -0
- package/dist/grammar/whyte.d.ts +5 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +457 -0
- package/dist/index.js.map +9 -0
- package/dist/kinds/building.d.ts +44 -0
- package/dist/kinds/faces.d.ts +27 -0
- package/dist/kinds/head-armour.d.ts +5 -0
- package/dist/kinds/head-beard.d.ts +6 -0
- package/dist/kinds/head-bust.d.ts +5 -0
- package/dist/kinds/head-extras.d.ts +15 -0
- package/dist/kinds/head-face.d.ts +8 -0
- package/dist/kinds/head-garb.d.ts +4 -0
- package/dist/kinds/head-geom.d.ts +7 -0
- package/dist/kinds/head-hair.d.ts +4 -0
- package/dist/kinds/head-layout.d.ts +29 -0
- package/dist/kinds/head-mesh.d.ts +31 -0
- package/dist/kinds/head-mouth.d.ts +4 -0
- package/dist/kinds/head-params.d.ts +116 -0
- package/dist/kinds/head-presets.d.ts +19 -0
- package/dist/kinds/head-rim.d.ts +10 -0
- package/dist/kinds/head-tone.d.ts +10 -0
- package/dist/kinds/head-torso.d.ts +35 -0
- package/dist/kinds/head.d.ts +39 -0
- package/dist/kinds/hull-lines.d.ts +65 -0
- package/dist/kinds/hull-skin.d.ts +6 -0
- package/dist/kinds/hull.d.ts +14 -0
- package/dist/kinds/index.d.ts +16 -0
- package/dist/kinds/index.js +78 -0
- package/dist/kinds/index.js.map +9 -0
- package/dist/kinds/mass.d.ts +15 -0
- package/dist/kinds/openings.d.ts +30 -0
- package/dist/kinds/planned.d.ts +6 -0
- package/dist/kinds/roof-chimney.d.ts +16 -0
- package/dist/kinds/roof-shape.d.ts +64 -0
- package/dist/kinds/roof.d.ts +31 -0
- package/dist/kinds/vegetation-fronds.d.ts +15 -0
- package/dist/kinds/vegetation-impostor.d.ts +9 -0
- package/dist/kinds/vegetation-leaves.d.ts +15 -0
- package/dist/kinds/vegetation-mesh.d.ts +21 -0
- package/dist/kinds/vegetation-params.d.ts +90 -0
- package/dist/kinds/vegetation-presets.d.ts +20 -0
- package/dist/kinds/vegetation-skeleton.d.ts +20 -0
- package/dist/kinds/vegetation.d.ts +42 -0
- package/dist/kinds/vehicle.d.ts +42 -0
- package/dist/material/cc0.d.ts +4 -0
- package/dist/material/define.d.ts +34 -0
- package/dist/material/generator.d.ts +4 -0
- package/dist/material/index.d.ts +9 -0
- package/dist/material/index.js +70 -0
- package/dist/material/index.js.map +9 -0
- package/dist/material/library.d.ts +7 -0
- package/dist/material/material-def.d.ts +30 -0
- package/dist/material/paint/bond.d.ts +3 -0
- package/dist/material/paint/canvas.d.ts +39 -0
- package/dist/material/paint/cell.d.ts +4 -0
- package/dist/material/paint/cells-round.d.ts +5 -0
- package/dist/material/paint/cells.d.ts +7 -0
- package/dist/material/paint/compose.d.ts +5 -0
- package/dist/material/paint/concrete.d.ts +3 -0
- package/dist/material/paint/courses.d.ts +31 -0
- package/dist/material/paint/decode-png.d.ts +6 -0
- package/dist/material/paint/default-sheet.d.ts +4 -0
- package/dist/material/paint/fabric.d.ts +4 -0
- package/dist/material/paint/foliage-broad.d.ts +5 -0
- package/dist/material/paint/foliage-common.d.ts +35 -0
- package/dist/material/paint/foliage-compound.d.ts +4 -0
- package/dist/material/paint/foliage-conifer.d.ts +5 -0
- package/dist/material/paint/foliage-raster.d.ts +26 -0
- package/dist/material/paint/foliage.d.ts +3 -0
- package/dist/material/paint/image-strip.d.ts +4 -0
- package/dist/material/paint/kit.d.ts +5 -0
- package/dist/material/paint/masks.d.ts +3 -0
- package/dist/material/paint/metal.d.ts +3 -0
- package/dist/material/paint/noise.d.ts +9 -0
- package/dist/material/paint/normal.d.ts +8 -0
- package/dist/material/paint/orm.d.ts +8 -0
- package/dist/material/paint/planks.d.ts +3 -0
- package/dist/material/paint/plates.d.ts +3 -0
- package/dist/material/paint/shapes.d.ts +8 -0
- package/dist/material/paint/slate.d.ts +3 -0
- package/dist/material/paint/stamp.d.ts +3 -0
- package/dist/material/paint/strip.d.ts +3 -0
- package/dist/material/paint/surface.d.ts +5 -0
- package/dist/material/paint/types.d.ts +65 -0
- package/dist/material/paint/validate.d.ts +3 -0
- package/dist/material/palette.d.ts +14 -0
- package/dist/material/shader-godot.d.ts +2 -0
- package/dist/material/shader-three.d.ts +2 -0
- package/dist/material/shader.d.ts +46 -0
- package/dist/material/slots.d.ts +5 -0
- package/dist/material/texture-source.d.ts +34 -0
- package/dist/material/trim-sheet.d.ts +38 -0
- package/dist/neural/generator.d.ts +25 -0
- package/dist/neural/images.d.ts +17 -0
- package/dist/neural/index.d.ts +2 -0
- package/dist/neural/index.js +14 -0
- package/dist/neural/index.js.map +9 -0
- package/dist/passes/bake-ao.d.ts +17 -0
- package/dist/passes/grime.d.ts +15 -0
- package/dist/passes/index.d.ts +6 -0
- package/dist/passes/index.js +22 -0
- package/dist/passes/index.js.map +9 -0
- package/dist/passes/livery.d.ts +19 -0
- package/dist/passes/optimize-cache.d.ts +15 -0
- package/dist/passes/optimize-weld.d.ts +15 -0
- package/dist/passes/optimize.d.ts +28 -0
- package/dist/passes/ray-grid.d.ts +23 -0
- package/dist/passes/weighted-normals.d.ts +8 -0
- package/dist/primitives/beam.d.ts +17 -0
- package/dist/primitives/bevel-box.d.ts +13 -0
- package/dist/primitives/box.d.ts +16 -0
- package/dist/primitives/cell.d.ts +20 -0
- package/dist/primitives/check.d.ts +12 -0
- package/dist/primitives/closed.d.ts +11 -0
- package/dist/primitives/erosion.d.ts +22 -0
- package/dist/primitives/font-5x7.d.ts +3 -0
- package/dist/primitives/heightfield.d.ts +16 -0
- package/dist/primitives/index.d.ts +23 -0
- package/dist/primitives/index.js +81 -0
- package/dist/primitives/index.js.map +9 -0
- package/dist/primitives/lathe-facets.d.ts +8 -0
- package/dist/primitives/lathe.d.ts +26 -0
- package/dist/primitives/lattice.d.ts +30 -0
- package/dist/primitives/loft.d.ts +15 -0
- package/dist/primitives/mc-table.d.ts +2 -0
- package/dist/primitives/member.d.ts +19 -0
- package/dist/primitives/noise.d.ts +34 -0
- package/dist/primitives/planar.d.ts +10 -0
- package/dist/primitives/prism.d.ts +13 -0
- package/dist/primitives/sculpt-edit.d.ts +56 -0
- package/dist/primitives/sculpt-tree.d.ts +23 -0
- package/dist/primitives/sculpt.d.ts +27 -0
- package/dist/primitives/sdf-grid.d.ts +17 -0
- package/dist/primitives/sdf-ops.d.ts +37 -0
- package/dist/primitives/sdf.d.ts +21 -0
- package/dist/primitives/strip-uv.d.ts +11 -0
- package/dist/primitives/surface-nets.d.ts +7 -0
- package/dist/primitives/sweep.d.ts +19 -0
- package/dist/primitives/terrain-color.d.ts +30 -0
- package/dist/primitives/terrain-grid.d.ts +36 -0
- package/dist/primitives/text-layout.d.ts +22 -0
- package/dist/primitives/text.d.ts +27 -0
- package/dist/primitives/tiled.d.ts +22 -0
- package/dist/primitives/transport.d.ts +17 -0
- package/dist/primitives/triangulate.d.ts +2 -0
- package/dist/primitives/value-noise.d.ts +10 -0
- package/dist/qa/checks.d.ts +11 -0
- package/dist/qa/clash.d.ts +2 -0
- package/dist/qa/floating.d.ts +5 -0
- package/dist/qa/gates.d.ts +12 -0
- package/dist/qa/geometry.d.ts +21 -0
- package/dist/qa/index.d.ts +12 -0
- package/dist/qa/index.js +78 -0
- package/dist/qa/index.js.map +9 -0
- package/dist/qa/inside.d.ts +12 -0
- package/dist/qa/inspect.d.ts +18 -0
- package/dist/qa/lods.d.ts +12 -0
- package/dist/qa/measures.d.ts +4 -0
- package/dist/qa/occlusion.d.ts +3 -0
- package/dist/qa/sanity.d.ts +7 -0
- package/dist/qa/types.d.ts +12 -0
- package/dist/render/beauty.d.ts +40 -0
- package/dist/render/camera.d.ts +33 -0
- package/dist/render/depth-map.d.ts +38 -0
- package/dist/render/font.d.ts +1 -0
- package/dist/render/ground.d.ts +13 -0
- package/dist/render/index.d.ts +10 -0
- package/dist/render/index.js +47 -0
- package/dist/render/index.js.map +9 -0
- package/dist/render/lighting.d.ts +27 -0
- package/dist/render/lod-strip.d.ts +5 -0
- package/dist/render/metrics.d.ts +37 -0
- package/dist/render/options.d.ts +28 -0
- package/dist/render/photo-match.d.ts +19 -0
- package/dist/render/raster.d.ts +25 -0
- package/dist/render/resolve.d.ts +11 -0
- package/dist/render/review-prompt.d.ts +2 -0
- package/dist/render/review-warnings.d.ts +34 -0
- package/dist/render/review.d.ts +24 -0
- package/dist/render/scene.d.ts +18 -0
- package/dist/render/shade.d.ts +22 -0
- package/dist/render/sheet.d.ts +15 -0
- package/dist/render/texture.d.ts +15 -0
- package/dist/render/thumbnail.d.ts +8 -0
- package/dist/render/vis-buffer.d.ts +18 -0
- package/dist/testing/assert.d.ts +21 -0
- package/dist/testing/compiled.d.ts +15 -0
- package/dist/testing/hash.d.ts +1 -0
- package/dist/testing/index.d.ts +4 -0
- package/dist/testing/index.js +134 -0
- package/dist/testing/index.js.map +13 -0
- package/dist/testing/snapshot.d.ts +13 -0
- package/docs/README.md +56 -0
- package/docs/architecture/README.md +68 -0
- package/docs/architecture/adding-a-kind.md +44 -0
- package/docs/architecture/adding-a-primitive.md +49 -0
- package/docs/architecture/errors.md +47 -0
- package/docs/architecture/glb-production.md +214 -0
- package/docs/architecture/gltf-capabilities.md +117 -0
- package/docs/architecture/materials.md +151 -0
- package/docs/decisions/001-recipe-compiler-over-ai-meshes.md +27 -0
- package/docs/decisions/002-typescript-not-json.md +22 -0
- package/docs/decisions/003-shared-trim-sheet.md +21 -0
- package/docs/decisions/004-z-up-metres.md +21 -0
- package/docs/decisions/005-zero-runtime-deps.md +21 -0
- package/docs/decisions/006-single-package-subpath-exports.md +20 -0
- package/docs/decisions/007-cpu-contact-sheets.md +21 -0
- package/docs/decisions/008-surface-materials.md +21 -0
- package/docs/decisions/009-gltf-front-axis.md +21 -0
- package/docs/decisions/README.md +15 -0
- package/docs/idea/01-vision.md +117 -0
- package/docs/idea/02-dsl.md +343 -0
- package/docs/idea/03-ir.md +97 -0
- package/docs/idea/04-materials.md +114 -0
- package/docs/idea/05-agent-loop.md +141 -0
- package/docs/idea/06-qa.md +101 -0
- package/docs/idea/07-what-fits.md +45 -0
- package/docs/idea/08-neural-adapters.md +78 -0
- package/docs/idea/09-kinds.md +105 -0
- package/docs/idea/10-sculpting.md +166 -0
- package/docs/idea/11-materials-authoring.md +132 -0
- package/docs/idea/12-blender-bridge.md +136 -0
- package/docs/idea/13-asset-pipeline-research.md +89 -0
- package/docs/landscape.md +49 -0
- package/docs/plans/roadmap.md +139 -0
- package/examples/build-with-bun.ts +41 -0
- package/llms.txt +47 -0
- package/package.json +100 -4
- package/recipes/README.md +38 -0
- package/recipes/asteroid/README.md +46 -0
- package/recipes/asteroid/asteroid.ts +336 -0
- package/recipes/boulders/README.md +28 -0
- package/recipes/boulders/boulders.ts +117 -0
- package/recipes/boxcar/README.md +53 -0
- package/recipes/boxcar/boxcar.ts +1000 -0
- package/recipes/cargo_container_scifi/README.md +52 -0
- package/recipes/cargo_container_scifi/cargo_container_scifi.ts +461 -0
- package/recipes/dropship/README.md +84 -0
- package/recipes/dropship/dropship.ts +1144 -0
- package/recipes/eiffel_tower/README.md +110 -0
- package/recipes/eiffel_tower/eiffel_tower.ts +781 -0
- package/recipes/goblin_head/README.md +75 -0
- package/recipes/goblin_head/goblin_head.ts +38 -0
- package/recipes/human_head/README.md +68 -0
- package/recipes/human_head/human_head.ts +38 -0
- package/recipes/loco_440/README.md +32 -0
- package/recipes/loco_440/loco_440.ts +1404 -0
- package/recipes/material_swatches/README.md +21 -0
- package/recipes/material_swatches/material_swatches.ts +189 -0
- package/recipes/mountain_range/README.md +45 -0
- package/recipes/mountain_range/mountain_range.ts +128 -0
- package/recipes/oak/README.md +30 -0
- package/recipes/oak/oak.ts +19 -0
- package/recipes/orc_head/README.md +78 -0
- package/recipes/orc_head/orc_head.ts +41 -0
- package/recipes/palm/README.md +30 -0
- package/recipes/palm/palm.ts +19 -0
- package/recipes/pine/README.md +29 -0
- package/recipes/pine/pine.ts +19 -0
- package/recipes/signal_gantry/README.md +36 -0
- package/recipes/signal_gantry/signal_gantry.ts +522 -0
- package/recipes/station_halt/README.md +39 -0
- package/recipes/station_halt/station_halt.ts +722 -0
- package/recipes/t34/README.md +44 -0
- package/recipes/t34/t34.ts +1068 -0
- package/recipes/tiger_1/README.md +75 -0
- package/recipes/tiger_1/tiger_1.ts +1370 -0
- package/recipes/water_tower/README.md +40 -0
- package/recipes/water_tower/water_tower.ts +542 -0
- package/src/cli/args.ts +125 -0
- package/src/cli/bin.ts +7 -0
- package/src/cli/load.ts +17 -0
- package/src/cli/manifest.ts +95 -0
- package/src/cli/render-cmds.ts +66 -0
- package/src/cli/run.ts +192 -0
- package/src/cli/texture-cache.ts +24 -0
- package/src/core/asset.ts +129 -0
- package/src/core/definition.ts +156 -0
- package/src/core/errors.ts +50 -0
- package/src/core/family.ts +50 -0
- package/src/core/index.ts +66 -0
- package/src/core/mesh.ts +114 -0
- package/src/core/part.ts +130 -0
- package/src/core/png.ts +49 -0
- package/src/core/rng.ts +49 -0
- package/src/core/transform.ts +90 -0
- package/src/core/vec.ts +26 -0
- package/src/core/world.ts +80 -0
- package/src/export/bin-writer.ts +79 -0
- package/src/export/container.ts +35 -0
- package/src/export/credits.ts +25 -0
- package/src/export/glb-options.ts +53 -0
- package/src/export/glb.ts +187 -0
- package/src/export/hierarchy.ts +122 -0
- package/src/export/index.ts +34 -0
- package/src/export/lights.ts +49 -0
- package/src/export/lod-coverage.ts +71 -0
- package/src/export/materials.ts +126 -0
- package/src/export/merge-pivots.ts +146 -0
- package/src/export/metadata.ts +62 -0
- package/src/export/motion.ts +70 -0
- package/src/export/optimize-parts.ts +80 -0
- package/src/export/primitive.ts +35 -0
- package/src/export/tangents.ts +75 -0
- package/src/export/textures.ts +88 -0
- package/src/export/version.ts +6 -0
- package/src/grammar/index.ts +4 -0
- package/src/grammar/split.ts +87 -0
- package/src/grammar/whyte.ts +20 -0
- package/src/index.ts +14 -0
- package/src/kinds/building.ts +153 -0
- package/src/kinds/faces.ts +138 -0
- package/src/kinds/head-armour.ts +181 -0
- package/src/kinds/head-beard.ts +133 -0
- package/src/kinds/head-bust.ts +184 -0
- package/src/kinds/head-extras.ts +150 -0
- package/src/kinds/head-face.ts +242 -0
- package/src/kinds/head-garb.ts +181 -0
- package/src/kinds/head-geom.ts +31 -0
- package/src/kinds/head-hair.ts +193 -0
- package/src/kinds/head-layout.ts +63 -0
- package/src/kinds/head-mesh.ts +195 -0
- package/src/kinds/head-mouth.ts +111 -0
- package/src/kinds/head-params.ts +162 -0
- package/src/kinds/head-presets.ts +155 -0
- package/src/kinds/head-rim.ts +128 -0
- package/src/kinds/head-tone.ts +52 -0
- package/src/kinds/head-torso.ts +230 -0
- package/src/kinds/head.ts +176 -0
- package/src/kinds/hull-lines.ts +160 -0
- package/src/kinds/hull-skin.ts +83 -0
- package/src/kinds/hull.ts +209 -0
- package/src/kinds/index.ts +63 -0
- package/src/kinds/mass.ts +110 -0
- package/src/kinds/openings.ts +141 -0
- package/src/kinds/planned.ts +12 -0
- package/src/kinds/roof-chimney.ts +100 -0
- package/src/kinds/roof-shape.ts +230 -0
- package/src/kinds/roof.ts +250 -0
- package/src/kinds/vegetation-fronds.ts +126 -0
- package/src/kinds/vegetation-impostor.ts +118 -0
- package/src/kinds/vegetation-leaves.ts +168 -0
- package/src/kinds/vegetation-mesh.ts +174 -0
- package/src/kinds/vegetation-params.ts +147 -0
- package/src/kinds/vegetation-presets.ts +184 -0
- package/src/kinds/vegetation-skeleton.ts +168 -0
- package/src/kinds/vegetation.ts +199 -0
- package/src/kinds/vehicle.ts +144 -0
- package/src/material/cc0.ts +41 -0
- package/src/material/define.ts +130 -0
- package/src/material/generator.ts +63 -0
- package/src/material/index.ts +60 -0
- package/src/material/library.ts +196 -0
- package/src/material/material-def.ts +84 -0
- package/src/material/paint/bond.ts +60 -0
- package/src/material/paint/canvas.ts +101 -0
- package/src/material/paint/cell.ts +39 -0
- package/src/material/paint/cells-round.ts +119 -0
- package/src/material/paint/cells.ts +111 -0
- package/src/material/paint/compose.ts +53 -0
- package/src/material/paint/concrete.ts +62 -0
- package/src/material/paint/courses.ts +85 -0
- package/src/material/paint/decode-png.ts +106 -0
- package/src/material/paint/default-sheet.ts +73 -0
- package/src/material/paint/fabric.ts +63 -0
- package/src/material/paint/foliage-broad.ts +126 -0
- package/src/material/paint/foliage-common.ts +93 -0
- package/src/material/paint/foliage-compound.ts +135 -0
- package/src/material/paint/foliage-conifer.ts +143 -0
- package/src/material/paint/foliage-raster.ts +196 -0
- package/src/material/paint/foliage.ts +23 -0
- package/src/material/paint/image-strip.ts +88 -0
- package/src/material/paint/kit.ts +37 -0
- package/src/material/paint/masks.ts +46 -0
- package/src/material/paint/metal.ts +109 -0
- package/src/material/paint/noise.ts +52 -0
- package/src/material/paint/normal.ts +52 -0
- package/src/material/paint/orm.ts +108 -0
- package/src/material/paint/planks.ts +101 -0
- package/src/material/paint/plates.ts +72 -0
- package/src/material/paint/shapes.ts +28 -0
- package/src/material/paint/slate.ts +52 -0
- package/src/material/paint/stamp.ts +40 -0
- package/src/material/paint/strip.ts +48 -0
- package/src/material/paint/surface.ts +60 -0
- package/src/material/paint/types.ts +94 -0
- package/src/material/paint/validate.ts +74 -0
- package/src/material/palette.ts +46 -0
- package/src/material/shader-godot.ts +77 -0
- package/src/material/shader-three.ts +103 -0
- package/src/material/shader.ts +100 -0
- package/src/material/slots.ts +18 -0
- package/src/material/texture-source.ts +86 -0
- package/src/material/trim-sheet.ts +166 -0
- package/src/neural/generator.ts +37 -0
- package/src/neural/images.ts +27 -0
- package/src/neural/index.ts +10 -0
- package/src/passes/bake-ao.ts +183 -0
- package/src/passes/grime.ts +37 -0
- package/src/passes/index.ts +8 -0
- package/src/passes/livery.ts +66 -0
- package/src/passes/optimize-cache.ts +175 -0
- package/src/passes/optimize-weld.ts +147 -0
- package/src/passes/optimize.ts +85 -0
- package/src/passes/ray-grid.ts +237 -0
- package/src/passes/weighted-normals.ts +125 -0
- package/src/primitives/beam.ts +60 -0
- package/src/primitives/bevel-box.ts +140 -0
- package/src/primitives/box.ts +90 -0
- package/src/primitives/cell.ts +115 -0
- package/src/primitives/check.ts +49 -0
- package/src/primitives/closed.ts +74 -0
- package/src/primitives/erosion.ts +183 -0
- package/src/primitives/font-5x7.ts +117 -0
- package/src/primitives/heightfield.ts +101 -0
- package/src/primitives/index.ts +56 -0
- package/src/primitives/lathe-facets.ts +45 -0
- package/src/primitives/lathe.ts +174 -0
- package/src/primitives/lattice.ts +131 -0
- package/src/primitives/loft.ts +174 -0
- package/src/primitives/mc-table.ts +41 -0
- package/src/primitives/member.ts +130 -0
- package/src/primitives/noise.ts +157 -0
- package/src/primitives/planar.ts +55 -0
- package/src/primitives/prism.ts +85 -0
- package/src/primitives/sculpt-edit.ts +212 -0
- package/src/primitives/sculpt-tree.ts +226 -0
- package/src/primitives/sculpt.ts +80 -0
- package/src/primitives/sdf-grid.ts +131 -0
- package/src/primitives/sdf-ops.ts +145 -0
- package/src/primitives/sdf.ts +83 -0
- package/src/primitives/strip-uv.ts +26 -0
- package/src/primitives/surface-nets.ts +161 -0
- package/src/primitives/sweep.ts +162 -0
- package/src/primitives/terrain-color.ts +85 -0
- package/src/primitives/terrain-grid.ts +137 -0
- package/src/primitives/text-layout.ts +85 -0
- package/src/primitives/text.ts +197 -0
- package/src/primitives/tiled.ts +93 -0
- package/src/primitives/transport.ts +85 -0
- package/src/primitives/triangulate.ts +42 -0
- package/src/primitives/value-noise.ts +62 -0
- package/src/qa/checks.ts +110 -0
- package/src/qa/clash.ts +177 -0
- package/src/qa/floating.ts +63 -0
- package/src/qa/gates.ts +126 -0
- package/src/qa/geometry.ts +187 -0
- package/src/qa/index.ts +28 -0
- package/src/qa/inside.ts +114 -0
- package/src/qa/inspect.ts +107 -0
- package/src/qa/lods.ts +97 -0
- package/src/qa/measures.ts +67 -0
- package/src/qa/occlusion.ts +166 -0
- package/src/qa/sanity.ts +137 -0
- package/src/qa/types.ts +17 -0
- package/src/render/beauty.ts +115 -0
- package/src/render/camera.ts +142 -0
- package/src/render/depth-map.ts +191 -0
- package/src/render/font.ts +76 -0
- package/src/render/ground.ts +87 -0
- package/src/render/index.ts +34 -0
- package/src/render/lighting.ts +121 -0
- package/src/render/lod-strip.ts +34 -0
- package/src/render/metrics.ts +147 -0
- package/src/render/options.ts +81 -0
- package/src/render/photo-match.ts +28 -0
- package/src/render/raster.ts +143 -0
- package/src/render/resolve.ts +109 -0
- package/src/render/review-prompt.ts +59 -0
- package/src/render/review-warnings.ts +92 -0
- package/src/render/review.ts +103 -0
- package/src/render/scene.ts +119 -0
- package/src/render/shade.ts +204 -0
- package/src/render/sheet.ts +88 -0
- package/src/render/texture.ts +97 -0
- package/src/render/thumbnail.ts +75 -0
- package/src/render/vis-buffer.ts +119 -0
- package/src/testing/assert.ts +115 -0
- package/src/testing/compiled.ts +31 -0
- package/src/testing/hash.ts +14 -0
- package/src/testing/index.ts +14 -0
- package/src/testing/snapshot.ts +37 -0
- package/src/types/gltf-validator.d.ts +13 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/primitives/bevel-box.ts", "../src/primitives/check.ts", "../src/primitives/box.ts", "../src/primitives/lathe-facets.ts", "../src/primitives/strip-uv.ts", "../src/primitives/lathe.ts", "../src/primitives/beam.ts", "../src/primitives/cell.ts", "../src/primitives/erosion.ts", "../src/primitives/heightfield.ts", "../src/primitives/triangulate.ts", "../src/primitives/member.ts", "../src/primitives/lattice.ts", "../src/primitives/loft.ts", "../src/primitives/noise.ts", "../src/primitives/planar.ts", "../src/primitives/prism.ts", "../src/primitives/sdf-ops.ts", "../src/primitives/sculpt-edit.ts", "../src/primitives/sculpt-tree.ts", "../src/primitives/sdf-grid.ts", "../src/primitives/mc-table.ts", "../src/primitives/surface-nets.ts", "../src/primitives/sdf.ts", "../src/primitives/sculpt.ts", "../src/primitives/transport.ts", "../src/primitives/sweep.ts", "../src/primitives/terrain-grid.ts", "../src/primitives/terrain-color.ts", "../src/primitives/font-5x7.ts", "../src/primitives/text-layout.ts", "../src/primitives/text.ts", "../src/primitives/tiled.ts", "../src/primitives/value-noise.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"// A box with every edge chamfered once (`box({ bevel })`): the hard-surface \"mid-poly\" look. Six\n// faces shrink by `bevel`, 12 chamfer quads take the 45° normal and 8 corner triangles the\n// 3-axis diagonal, all flat per face (own vertices), so a face-weighted-normal pass turns the\n// chamfers into rounded highlights without a bake. UVs: every vertex keeps its own face's mapping\n// (the box's), so the thin chamfer reuses the nearest face's strip texels.\n// triangles = 44 − 2 per omitted face\n\nimport { type Mesh, MeshBuilder, normalize, type Vec3 } from '../core/index.ts';\nimport { type StripId, stripRect } from '../material/index.ts';\n\ntype Sign = 1 | -1;\ntype FaceName = 'top' | 'bottom' | 'front' | 'back' | 'left' | 'right';\n\n/** Face axes as in box.ts: index = axis * 2 + (sign > 0 ? 0 : 1). */\nconst FACES: readonly { name: FaceName; u: Vec3; v: Vec3 }[] = [\n { name: 'front', u: [0, 1, 0], v: [0, 0, 1] },\n { name: 'back', u: [0, -1, 0], v: [0, 0, 1] },\n { name: 'left', u: [-1, 0, 0], v: [0, 0, 1] },\n { name: 'right', u: [1, 0, 0], v: [0, 0, 1] },\n { name: 'top', u: [1, 0, 0], v: [0, 1, 0] },\n { name: 'bottom', u: [1, 0, 0], v: [0, -1, 0] },\n];\nconst SIGNS: readonly Sign[] = [-1, 1];\n\nexport interface BevelBoxInput {\n readonly half: Vec3;\n readonly centre: Vec3;\n readonly bevel: number;\n readonly color: Vec3;\n readonly strip: StripId;\n readonly omit: readonly FaceName[];\n}\n\nexport function bevelBox(o: BevelBoxInput): Mesh {\n const { half, centre, bevel: bv } = o;\n const rect = stripRect(o.strip);\n const b = new MeshBuilder();\n const dot3 = (a: Vec3, c: Vec3): number => a[0] * c[0] + a[1] * c[1] + a[2] * c[2];\n const ext = (a: Vec3): number =>\n Math.abs(a[0]) * half[0] + Math.abs(a[1]) * half[1] + Math.abs(a[2]) * half[2];\n /** Corner s on the face of axis k: inset by the bevel on the two other axes. */\n const point = (s: readonly Sign[], k: number): Vec3 => [\n centre[0] + (s[0] ?? 1) * (half[0] - (k === 0 ? 0 : bv)),\n centre[1] + (s[1] ?? 1) * (half[1] - (k === 1 ? 0 : bv)),\n centre[2] + (s[2] ?? 1) * (half[2] - (k === 2 ? 0 : bv)),\n ];\n const put = (s: readonly Sign[], k: number, n: Vec3): number => {\n const f = FACES[k * 2 + ((s[k] ?? 1) > 0 ? 0 : 1)] ?? { u: n, v: n };\n const p = point(s, k);\n const rel: Vec3 = [p[0] - centre[0], p[1] - centre[1], p[2] - centre[2]];\n const eu = ext(f.u);\n const ev = ext(f.v);\n return b.vertex({\n p,\n n,\n uv: [\n rect.u0 + ((dot3(rel, f.u) + eu) / rect.metres) * (rect.u1 - rect.u0),\n rect.v0 + ((dot3(rel, f.v) + ev) / (2 * ev)) * (rect.v1 - rect.v0),\n ],\n color: o.color,\n });\n };\n /** Emit a polygon, flipping it if its winding disagrees with the outward normal. */\n const poly = (corners: readonly (readonly [readonly Sign[], number])[], n: Vec3): void => {\n const pts = corners.map(([s, k]) => point(s, k));\n const [a = n, c = n, d = n] = pts;\n const e1: Vec3 = [c[0] - a[0], c[1] - a[1], c[2] - a[2]];\n const e2: Vec3 = [d[0] - a[0], d[1] - a[1], d[2] - a[2]];\n const g: Vec3 = [\n e1[1] * e2[2] - e1[2] * e2[1],\n e1[2] * e2[0] - e1[0] * e2[2],\n e1[0] * e2[1] - e1[1] * e2[0],\n ];\n const ids = corners.map(([s, k]) => put(s, k, n));\n if (dot3(g, n) < 0) ids.reverse();\n const [i0 = 0, i1 = 0, i2 = 0, i3] = ids;\n if (i3 === undefined) b.tri(i0, i1, i2);\n else b.quad(i0, i1, i2, i3);\n };\n const unit = (k: number, s: number): Vec3 => [k === 0 ? s : 0, k === 1 ? s : 0, k === 2 ? s : 0];\n const corner = (k: number, sk: Sign, l: number, sl: Sign, m: number, sm: Sign): Sign[] => {\n const s: Sign[] = [1, 1, 1];\n s[k] = sk;\n s[l] = sl;\n s[m] = sm;\n return s;\n };\n // Faces (axis k, sign sk): four corners in a ring over the other two axes.\n for (let k = 0; k < 3; k++) {\n const [l, m] = [(k + 1) % 3, (k + 2) % 3];\n for (const sk of SIGNS) {\n if (o.omit.includes((FACES[k * 2 + (sk > 0 ? 0 : 1)] ?? { name: 'top' }).name)) continue;\n const ring = (\n [\n [-1, -1],\n [1, -1],\n [1, 1],\n [-1, 1],\n ] as const\n ).map(([a, c]) => [corner(k, sk, l, a, m, c), k] as const);\n poly(ring, unit(k, sk));\n }\n }\n // Chamfers along axis m between the faces of axes k and l.\n for (let m = 0; m < 3; m++) {\n const [k, l] = [(m + 1) % 3, (m + 2) % 3];\n for (const sk of SIGNS)\n for (const sl of SIGNS) {\n const lo = corner(k, sk, l, sl, m, -1);\n const hi = corner(k, sk, l, sl, m, 1);\n const n = normalize(\n [0, 1, 2].map((j) => (j === k ? sk : j === l ? sl : 0)) as unknown as Vec3,\n );\n poly(\n [\n [lo, k],\n [hi, k],\n [hi, l],\n [lo, l],\n ],\n n,\n );\n }\n }\n // Corners: one triangle across the three face corners.\n for (const sx of SIGNS)\n for (const sy of SIGNS)\n for (const sz of SIGNS) {\n const s: Sign[] = [sx, sy, sz];\n poly(\n [\n [s, 0],\n [s, 1],\n [s, 2],\n ],\n normalize([sx, sy, sz]),\n );\n }\n return b.build();\n}\n",
|
|
6
|
+
"// Input guards shared by primitives: every bad option throws T3D_RECIPE_INVALID with the fix, so\n// an agent reads what to change instead of debugging NaN geometry downstream.\n\nimport { cross, length, Ts23dError, type Vec3 } from '../core/index.ts';\n\nexport function invalid(cause: string, fix: string): never {\n throw new Ts23dError('T3D_RECIPE_INVALID', { cause, fix });\n}\n\nconst finite = (v: Vec3): boolean => v.every(Number.isFinite);\n\n/** Two edge vectors spanning a real parallelogram; returns |u|, |v| and the unit normal u×v. */\nexport function spanOf(\n what: string,\n origin: Vec3,\n u: Vec3,\n v: Vec3,\n): { lu: number; lv: number; n: Vec3 } {\n if (!finite(origin) || !finite(u) || !finite(v))\n invalid(`${what}: origin/u/v has a NaN or Infinity`, 'pass finite metre vectors');\n const lu = length(u);\n const lv = length(v);\n if (lu < 1e-9 || lv < 1e-9)\n invalid(\n `${what}: edge u (${lu} m) or v (${lv} m) has zero length`,\n 'give u and v the face edges in metres, both non-zero (e.g. u: [4, 0, 0], v: [0, 0, 3])',\n );\n const c = cross(u, v);\n const lc = length(c);\n if (lc < 1e-6 * lu * lv)\n invalid(\n `${what}: u and v are parallel, so the face has no area`,\n 'make v perpendicular to u (u along the face, v up it)',\n );\n return { lu, lv, n: [c[0] / lc, c[1] / lc, c[2] / lc] };\n}\n\n/** An integer count in [min, max]. */\nexport function count(what: string, n: number, min: number, max: number): number {\n if (!Number.isInteger(n) || n < min || n > max)\n invalid(`${what} is ${n}`, `use a whole number from ${min} to ${max}`);\n return n;\n}\n\n/** A finite number > 0. */\nexport function positive(what: string, n: number, example: string): number {\n if (!Number.isFinite(n) || n <= 0) invalid(`${what} is ${n}`, `use a length > 0 m (${example})`);\n return n;\n}\n",
|
|
7
|
+
"// Axis-aligned box, base at z=0 (things stand on the ground). UVs tile a trim strip by metres.\n// Flat normals. `bevel` > 0 chamfers every edge once (bevel-box.ts); 0 keeps these exact bytes.\n\nimport { type Mesh, MeshBuilder, type Vec3 } from '../core/index.ts';\nimport { type StripId, stripRect } from '../material/index.ts';\nimport { bevelBox } from './bevel-box.ts';\nimport { invalid } from './check.ts';\n\nexport interface BoxOptions {\n /** Width (X), depth (Y), height (Z) in metres. */\n readonly size: Vec3;\n readonly color: Vec3;\n readonly strip?: StripId;\n /** Centre of the base face. */\n readonly at?: Vec3;\n /** Skip faces nobody sees (e.g. the bottom on the ground). */\n readonly omit?: readonly ('top' | 'bottom' | 'front' | 'back' | 'left' | 'right')[];\n /** Chamfer width in metres on every edge (12 + 8 extra faces, 44 triangles). LOD it:\n * `bevel: ctx.pick([0.02, 0.01, 0])`. Must stay under half the smallest size. Default 0. */\n readonly bevel?: number;\n}\n\ntype Face = { name: NonNullable<BoxOptions['omit']>[number]; n: Vec3; u: Vec3; v: Vec3 };\nconst FACES: readonly Face[] = [\n { name: 'front', n: [1, 0, 0], u: [0, 1, 0], v: [0, 0, 1] },\n { name: 'back', n: [-1, 0, 0], u: [0, -1, 0], v: [0, 0, 1] },\n { name: 'right', n: [0, -1, 0], u: [1, 0, 0], v: [0, 0, 1] },\n { name: 'left', n: [0, 1, 0], u: [-1, 0, 0], v: [0, 0, 1] },\n { name: 'top', n: [0, 0, 1], u: [1, 0, 0], v: [0, 1, 0] },\n { name: 'bottom', n: [0, 0, -1], u: [1, 0, 0], v: [0, -1, 0] },\n];\n\nexport function box(o: BoxOptions): Mesh {\n const [w, d, h] = o.size;\n const [cx, cy, cz] = o.at ?? [0, 0, 0];\n const half: Vec3 = [w / 2, d / 2, h / 2];\n const centre: Vec3 = [cx, cy, cz + h / 2];\n const bevel = o.bevel ?? 0;\n if (bevel !== 0) {\n const limit = Math.min(w, d, h) / 2;\n if (!(bevel > 0 && bevel < limit))\n invalid(\n `box bevel ${bevel} m does not fit a ${w} × ${d} × ${h} m box`,\n `use 0 < bevel < ${limit} m (half the smallest size), e.g. ${Math.min(0.02, limit / 4)}`,\n );\n return bevelBox({\n half,\n centre,\n bevel,\n color: o.color,\n strip: o.strip ?? 'plain',\n omit: o.omit ?? [],\n });\n }\n const rect = stripRect(o.strip ?? 'plain');\n const b = new MeshBuilder();\n for (const f of FACES) {\n if (o.omit?.includes(f.name)) continue;\n const extent = (axis: Vec3): number =>\n Math.abs(axis[0]) * half[0] + Math.abs(axis[1]) * half[1] + Math.abs(axis[2]) * half[2];\n const eu = extent(f.u);\n const ev = extent(f.v);\n const en = extent(f.n);\n const ids = [\n [-1, -1],\n [1, -1],\n [1, 1],\n [-1, 1],\n ].map(([su = 0, sv = 0]) => {\n const p: Vec3 = [0, 1, 2].map(\n (k) =>\n (centre[k] ?? 0) + (f.n[k] ?? 0) * en + (f.u[k] ?? 0) * eu * su + (f.v[k] ?? 0) * ev * sv,\n ) as unknown as Vec3;\n const uMetres = ((su + 1) / 2) * eu * 2;\n const vFrac = (sv + 1) / 2;\n return b.vertex({\n p,\n n: f.n,\n uv: [\n rect.u0 + (uMetres / rect.metres) * (rect.u1 - rect.u0),\n rect.v0 + vFrac * (rect.v1 - rect.v0),\n ],\n color: o.color,\n });\n });\n const [a = 0, c = 0, e = 0, g = 0] = ids;\n b.quad(a, c, e, g);\n }\n return b.build();\n}\n",
|
|
8
|
+
"// Faceted bands for `lathe({ faceted: true })`: every segment quad gets four vertices of its own\n// and the exact normal of its facet plane, so an n-sided tank, tower or roof shades flat.\n\nimport type { Vec2, Vec3 } from '../core/index.ts';\n\n/** The profile and segment count lathe was given. */\ninterface Facetable {\n readonly profile: readonly Vec2[];\n readonly segments: number;\n}\n\nexport /** Flat-shaded bands: four own vertices per segment quad, normal of the facet plane. */\nfunction facets(\n o: Facetable,\n put: (p: Vec3, n: Vec3, uv: Vec2) => number,\n tri: (a: number, b: number, c: number) => void,\n sideUv: (s: number, i: number, r: number) => Vec2,\n): void {\n const half = Math.PI / o.segments;\n const corner = (s: number): [number, number] => {\n const t = (s / o.segments) * Math.PI * 2 - Math.PI / 2;\n return [Math.cos(t), Math.sin(t)];\n };\n for (let i = 0; i + 1 < o.profile.length; i++) {\n const [r0 = 0, z0 = 0] = o.profile[i] ?? [];\n const [r1 = 0, z1 = 0] = o.profile[i + 1] ?? [];\n for (let s = 0; s < o.segments; s++) {\n const tm = ((s + 0.5) / o.segments) * Math.PI * 2 - Math.PI / 2;\n // The facet's chord sits cos(half) inside the ring, which tilts its normal by that much.\n const nx = (z1 - z0) * Math.cos(tm);\n const ny = (z1 - z0) * Math.sin(tm);\n const nz = -(r1 - r0) * Math.cos(half);\n const l = Math.hypot(nx, ny, nz) || 1;\n const n: Vec3 = [nx / l, ny / l, nz / l];\n const [c0, s0] = corner(s);\n const [c1, s1] = corner(s + 1);\n const a = put([r0 * c0, r0 * s0, z0], n, sideUv(s, i, r0));\n const bb = put([r0 * c1, r0 * s1, z0], n, sideUv(s + 1, i, r0));\n const c = put([r1 * c1, r1 * s1, z1], n, sideUv(s + 1, i + 1, r1));\n const d = put([r1 * c0, r1 * s0, z1], n, sideUv(s, i + 1, r1));\n tri(a, bb, c);\n tri(a, c, d);\n }\n }\n}\n",
|
|
9
|
+
"// True-scale UV mapping onto the trim sheet. U tiles across a strip through the REPEAT sampler\n// (metres / rect.metres); V cannot wrap (the next strip sits there), so V maps one strip band of\n// `vMetres` world metres onto the rect, half a texel inside its edges against bleeding.\n\nimport { DEFAULT_SHEET, type StripId, TRIM_SHEET_SIZE, type UvRect } from '../material/index.ts';\n\n/** Half a texel at the house sheet size: keeps bilinear samples inside the region. */\nexport const HALF_TEXEL = 0.5 / TRIM_SHEET_SIZE;\n\n/** World metres one strip band covers along V on the house sheet (`scaleMetres`). */\nexport const stripVMetres = (id: StripId): number => DEFAULT_SHEET.strips[id]?.scaleMetres ?? 1;\n\n/** U for a run of `metres` along the strip. */\nexport const stripU = (rect: UvRect, metres: number): number =>\n rect.u0 + (metres / rect.metres) * (rect.u1 - rect.u0);\n\n/** V for a fraction 0..1 of one band. */\nexport const stripV = (rect: UvRect, frac: number): number =>\n rect.v0 + HALF_TEXEL + frac * (rect.v1 - rect.v0 - 2 * HALF_TEXEL);\n\n/** V for any metre value, mirrored every band: continuous, never leaves the strip (organic). */\nexport function mirroredV(rect: UvRect, metres: number, vMetres: number): number {\n const t = metres / vMetres;\n const m = t - 2 * Math.floor(t / 2);\n return stripV(rect, m <= 1 ? m : 2 - m);\n}\n",
|
|
10
|
+
"// Surface of revolution around local Z: boilers, wheels, domes, spires, chimneys, tanks.\n// `segments` is the knob LOD turns down; profiles are (radius, z) pairs bottom→top.\n// Rings start at -90° so a vertex always sits at the contact point: a coarse LOD2 wheel still\n// touches its track (the floating-parts gate caught exactly that).\n// Normals: smooth around the axis, split at profile creases; `faceted` gives every segment its own\n// flat normal (n-sided tanks, towers, roofs). UVs: `uv: 'metres'` maps the strip at true scale\n// (arc length × profile length, staves and shingles at real size); default stretches one strip\n// width around and one strip height along the profile.\n\nimport { type Mesh, MeshBuilder, type Vec2, type Vec3 } from '../core/index.ts';\nimport { type StripId, stripRect } from '../material/index.ts';\nimport { facets } from './lathe-facets.ts';\nimport { mirroredV, stripU, stripVMetres } from './strip-uv.ts';\n\nexport interface LatheOptions {\n readonly profile: readonly Vec2[];\n readonly segments: number;\n readonly color: Vec3;\n readonly strip?: StripId;\n /** Rotate the lathe axis from Z onto X or Y (wheels spin about Y). */\n readonly axis?: 'x' | 'y' | 'z';\n readonly at?: Vec3;\n /** Close the ends with fans (solid cylinders/wheels). */\n readonly caps?: boolean;\n /** Profile turns sharper than this (degrees) get split normals: a hard rim, not a smear\n * whose averaged normal opposes one band. Default 50. */\n readonly creaseDeg?: number;\n /** 'metres': true-scale strip mapping. Default 'stretch'. */\n readonly uv?: 'stretch' | 'metres';\n /** Flat facets: one normal per segment (an n-sided prism of revolution). */\n readonly faceted?: boolean;\n}\n\n// Swapping two coordinates is a reflection (det −1): normals are swapped with the points so they\n// still point out, but triangle winding flips, so 'x'/'y' lathes emit their indices reversed.\nconst orient = (p: Vec3, axis: 'x' | 'y' | 'z'): Vec3 =>\n axis === 'z' ? p : axis === 'y' ? [p[0], p[2], p[1]] : [p[2], p[1], p[0]];\n\nexport function lathe(o: LatheOptions): Mesh {\n const axis = o.axis ?? 'z';\n const [ox, oy, oz] = o.at ?? [0, 0, 0];\n const rect = stripRect(o.strip ?? 'plain');\n const b = new MeshBuilder();\n const mirrored = axis !== 'z';\n const tri = (x: number, y: number, z: number): void => {\n if (mirrored) b.tri(x, z, y);\n else b.tri(x, y, z);\n };\n const ring: number[][] = [];\n const put = (p: Vec3, n: Vec3, uv: Vec2): number => {\n const q = orient(p, axis);\n return b.vertex({\n p: [q[0] + ox, q[1] + oy, q[2] + oz],\n n: orient(n, axis),\n uv,\n color: o.color,\n });\n };\n const metres = o.uv === 'metres';\n const vm = stripVMetres(o.strip ?? 'plain');\n const run: number[] = [0];\n for (let i = 1; i < o.profile.length; i++) {\n const [r0 = 0, z0 = 0] = o.profile[i - 1] ?? [];\n const [r1 = 0, z1 = 0] = o.profile[i] ?? [];\n run.push((run[i - 1] ?? 0) + Math.hypot(r1 - r0, z1 - z0));\n }\n /** Side UV at segment s of profile point i (radius r). */\n const sideUv = (s: number, i: number, r: number): Vec2 =>\n metres\n ? [stripU(rect, (Math.PI * 2 * r * s) / o.segments), mirroredV(rect, run[i] ?? 0, vm)]\n : [\n rect.u0 + (s / o.segments) * (rect.u1 - rect.u0),\n rect.v0 + (i / Math.max(1, o.profile.length - 1)) * (rect.v1 - rect.v0),\n ];\n /** Cap UV at direction (cos, sin) · r on a disc (0, 0 = centre). */\n const capUv = (c: number, sn: number, r: number): Vec2 =>\n metres\n ? [stripU(rect, c * r), mirroredV(rect, (sn + 1) * r, vm)]\n : [\n rect.u0 + (0.5 + c / 2) * (rect.u1 - rect.u0),\n rect.v0 + (0.5 + sn / 2) * (rect.v1 - rect.v0),\n ];\n const creaseCos = Math.cos(((o.creaseDeg ?? 50) * Math.PI) / 180);\n /** One ring of segments + 1 vertices at profile point i with normal along chord (dr, dz). */\n const emitRing = (i: number, dr: number, dz: number): number[] => {\n const [r, z] = o.profile[i] ?? [0, 0];\n const len = Math.hypot(dr, dz) || 1;\n const row: number[] = [];\n for (let s = 0; s <= o.segments; s++) {\n const t = (s / o.segments) * Math.PI * 2 - Math.PI / 2;\n const c = Math.cos(t);\n const sn = Math.sin(t);\n row.push(\n put([r * c, r * sn, z], [(dz / len) * c, (dz / len) * sn, -dr / len], sideUv(s, i, r)),\n );\n }\n return row;\n };\n // Each profile point gives the ring that ends the band below (`top`) and the one that starts\n // the band above (`ring`); they are the same ring unless the profile creases there.\n const top: number[][] = [];\n if (o.faceted) facets(o, put, tri, sideUv);\n else\n o.profile.forEach(([r, z], i) => {\n const prev = o.profile[i - 1] ?? o.profile[i] ?? [r, z];\n const next = o.profile[i + 1] ?? o.profile[i] ?? [r, z];\n const ir = r - prev[0];\n const iz = z - prev[1];\n const or = next[0] - r;\n const oz = next[1] - z;\n const li = Math.hypot(ir, iz);\n const lo = Math.hypot(or, oz);\n if (li > 1e-12 && lo > 1e-12 && (ir * or + iz * oz) / (li * lo) < creaseCos) {\n top.push(emitRing(i, ir, iz));\n ring.push(emitRing(i, or, oz));\n return;\n }\n // Profile-tangent normal: perpendicular to the neighbour chord in (r, z).\n const row = emitRing(i, next[0] - prev[0], next[1] - prev[1]);\n top.push(row);\n ring.push(row);\n });\n for (let i = 0; i + 1 < ring.length; i++) {\n for (let s = 0; s < o.segments; s++) {\n const a = ring[i]?.[s] ?? 0;\n const bb = ring[i]?.[s + 1] ?? 0;\n const c = top[i + 1]?.[s + 1] ?? 0;\n const d = top[i + 1]?.[s] ?? 0;\n tri(a, bb, c);\n tri(a, c, d);\n }\n }\n if (o.caps) {\n const ends = [\n { pt: o.profile[0], n: -1 },\n { pt: o.profile[o.profile.length - 1], n: 1 },\n ];\n for (const { pt, n } of ends) {\n if (!pt) continue;\n const centre = put([0, 0, pt[1]], [0, 0, n], capUv(0, 0, pt[0]));\n const rim: number[] = [];\n for (let s = 0; s <= o.segments; s++) {\n const t = (s / o.segments) * Math.PI * 2 - Math.PI / 2;\n rim.push(\n put(\n [pt[0] * Math.cos(t), pt[0] * Math.sin(t), pt[1]],\n [0, 0, n],\n capUv(Math.cos(t), Math.sin(t), pt[0]),\n ),\n );\n }\n for (let s = 0; s < o.segments; s++) {\n const r0 = rim[s] ?? 0;\n const r1 = rim[s + 1] ?? 0;\n if (n > 0) tri(centre, r0, r1);\n else tri(centre, r1, r0);\n }\n }\n }\n return b.build();\n}\n\n/** Convenience: a capped cylinder, the most common lathe. */\nexport const cylinder = (\n o: Omit<LatheOptions, 'profile' | 'caps'> & { radius: number; length: number },\n): Mesh =>\n lathe({\n ...o,\n profile: [\n [o.radius, -o.length / 2],\n [o.radius, o.length / 2],\n ],\n caps: true,\n });\n",
|
|
11
|
+
"// A member between two points: girders, rods, rails, handrails, masts, tow cables, antennae.\n// Square section by default; `segments` ≥ 3 makes it round (pipes, barrels, rods).\n\nimport {\n applyAffine,\n cross,\n frame,\n length,\n type Mesh,\n normalize,\n sub,\n type Vec3,\n} from '../core/index.ts';\nimport type { StripId } from '../material/index.ts';\nimport { box } from './box.ts';\nimport { lathe } from './lathe.ts';\n\nexport interface BeamOptions {\n readonly from: Vec3;\n readonly to: Vec3;\n /** Side of a square section, or diameter of a round one. */\n readonly width: number;\n readonly height?: number;\n readonly segments?: number;\n readonly color: Vec3;\n readonly strip?: StripId;\n /** Which way the section's local Y faces (roll). Default: world Z, or X for vertical beams. */\n readonly up?: Vec3;\n /** End caps; turn off for lattice members whose ends are buried in joints (−⅓ triangles). */\n readonly caps?: boolean;\n}\n\nexport function beam(o: BeamOptions): Mesh {\n const dir = sub(o.to, o.from);\n const len = length(dir);\n const w = normalize(dir);\n const ref: Vec3 = o.up ?? (Math.abs(w[2]) > 0.95 ? [1, 0, 0] : [0, 0, 1]);\n const u = normalize(cross(ref, w));\n const v = cross(w, u);\n // Local Z runs from→to, so the section is built standing on the origin.\n const local =\n o.segments && o.segments >= 3\n ? lathe({\n profile: [\n [o.width / 2, 0],\n [o.width / 2, len],\n ],\n segments: o.segments,\n color: o.color,\n caps: o.caps ?? true,\n ...(o.strip ? { strip: o.strip } : {}),\n })\n : box({\n size: [o.width, o.height ?? o.width, len],\n ...(o.caps === false ? { omit: ['top', 'bottom'] as const } : {}),\n color: o.color,\n ...(o.strip ? { strip: o.strip } : {}),\n });\n return applyAffine(local, frame(u, v, w, o.from));\n}\n",
|
|
12
|
+
"// A quad mapped to ONE fixed trim-sheet cell: windows, doors, clocks, signs, leaf cards. Flat\n// normal u × v; V grows along `v` (keep `v` world-up so the decal stands upright).\n// `inset` > 0 recesses the panel by that depth behind the face plane and closes the gap with four\n// reveal faces (jambs, head, sill) mapped at true scale onto `reveal`: real depth that catches\n// light and shadow, the cheapest trick that makes a facade read as built. `inset` < 0 raises it\n// proud of the plane instead (plaques, sign boards), sides facing out.\n// The surrounding wall must leave the opening free (build it from tiled pieces around it).\n// triangles = (doubleSided ? 4 : 2) + (inset ≠ 0 ? 8 : 0)\n\nimport { type Mesh, MeshBuilder, normalize, type Vec3 } from '../core/index.ts';\nimport { type CellId, cellRect, type StripId, stripRect } from '../material/index.ts';\nimport { invalid, spanOf } from './check.ts';\nimport { HALF_TEXEL, stripU, stripV, stripVMetres } from './strip-uv.ts';\n\nexport interface CellOptions {\n /** Bottom-left corner as seen from the front. */\n readonly origin: Vec3;\n /** Width edge (cell U), metres. */\n readonly u: Vec3;\n /** Height edge (cell V, up), metres. */\n readonly v: Vec3;\n readonly color: Vec3;\n readonly cell: CellId;\n /** Recess depth in metres (> 0 behind the plane, < 0 proud of it). Default 0. */\n readonly inset?: number;\n /** Strip the reveal faces tile at true scale. Default 'plain'. */\n readonly reveal?: StripId;\n readonly revealColor?: Vec3;\n /** Both sides (leaf cards, hanging signs). Not with an inset. */\n readonly doubleSided?: boolean;\n}\n\nconst add3 = (a: Vec3, b: Vec3, s: number): Vec3 => [\n a[0] + b[0] * s,\n a[1] + b[1] * s,\n a[2] + b[2] * s,\n];\n\nexport function cell(o: CellOptions): Mesh {\n const { lu, lv, n } = spanOf('cell', o.origin, o.u, o.v);\n const d = o.inset ?? 0;\n if (!Number.isFinite(d))\n invalid(`cell inset is ${d}`, 'use a finite depth in metres (0.1 = a 10 cm recess)');\n if (d !== 0 && o.doubleSided)\n invalid(\n 'cell: inset with doubleSided',\n 'drop doubleSided for a recessed/raised panel, or set inset: 0',\n );\n const r = cellRect(o.cell);\n const e = HALF_TEXEL;\n const rim: Vec3[] = [\n o.origin,\n add3(o.origin, o.u, 1),\n add3(add3(o.origin, o.u, 1), o.v, 1),\n add3(o.origin, o.v, 1),\n ];\n const face = rim.map((p) => add3(p, n, -d));\n const uvs: [number, number][] = [\n [r.u0 + e, r.v0 + e],\n [r.u1 - e, r.v0 + e],\n [r.u1 - e, r.v1 - e],\n [r.u0 + e, r.v1 - e],\n ];\n const b = new MeshBuilder();\n for (const side of o.doubleSided ? [1, -1] : [1]) {\n const nn: Vec3 = [n[0] * side, n[1] * side, n[2] * side];\n const [i0 = 0, i1 = 0, i2 = 0, i3 = 0] = face.map((p, k) =>\n b.vertex({ p, n: nn, uv: uvs[k] ?? [0, 0], color: o.color }),\n );\n if (side > 0) b.quad(i0, i1, i2, i3);\n else b.quad(i0, i3, i2, i1);\n }\n if (d !== 0) reveals(b, o, rim, face, n, d, [lu, lv, lu, lv]);\n return b.build();\n}\n\n/** Four side quads rim[i] → rim[i+1] → face[i+1] → face[i]; that order is CCW for either sign. */\nfunction reveals(\n b: MeshBuilder,\n o: CellOptions,\n rim: readonly Vec3[],\n face: readonly Vec3[],\n n: Vec3,\n d: number,\n lens: readonly number[],\n): void {\n const strip = o.reveal ?? 'plain';\n const rect = stripRect(strip);\n const fv = Math.min(1, Math.abs(d) / stripVMetres(strip));\n const color = o.revealColor ?? o.color;\n for (let i = 0; i < 4; i++) {\n const a = rim[i] ?? n;\n const c = rim[(i + 1) % 4] ?? n;\n const ed: Vec3 = [c[0] - a[0], c[1] - a[1], c[2] - a[2]];\n // n × edge points into the opening; a recess faces inward, a plaque's sides outward.\n const s = Math.sign(d);\n const nn = normalize([\n (n[1] * ed[2] - n[2] * ed[1]) * s,\n (n[2] * ed[0] - n[0] * ed[2]) * s,\n (n[0] * ed[1] - n[1] * ed[0]) * s,\n ]);\n const len = lens[i] ?? 0;\n const q = [a, c, face[(i + 1) % 4] ?? c, face[i] ?? a];\n const uv: [number, number][] = [\n [stripU(rect, 0), stripV(rect, 0)],\n [stripU(rect, len), stripV(rect, 0)],\n [stripU(rect, len), stripV(rect, fv)],\n [stripU(rect, 0), stripV(rect, fv)],\n ];\n const [j0 = 0, j1 = 0, j2 = 0, j3 = 0] = q.map((p, k) =>\n b.vertex({ p, n: nn, uv: uv[k] ?? [0, 0], color }),\n );\n b.quad(j0, j1, j2, j3);\n }\n}\n",
|
|
13
|
+
"// Hydraulic droplet erosion (Beyer 2015, \"Implementation of a method for hydraulic erosion\"; the\n// Lague variant): thousands of droplets start at random points (from the Rng), roll downhill with\n// inertia, pick up sediment while fast and on steep ground, drop it where they slow or climb, and\n// evaporate. Gullies, carved valleys, alluvial fans and sharp ridges appear: the look of World\n// Machine / Gaea terrain. Heights are normalised to 0..1 while simulating, so the defaults behave\n// the same on any relief; the result is rescaled to metres. Also records flow and deposit maps.\n\nimport type { Rng } from '../core/index.ts';\nimport { count } from './check.ts';\nimport type { TerrainGrid } from './terrain-grid.ts';\n\nexport interface ErosionOptions {\n /** Droplets simulated. ~1 per grid point is mild, 2–3 is strongly carved. Default 70 000. */\n readonly droplets?: number;\n /** Steps a droplet lives. Default 30. */\n readonly lifetime?: number;\n /** 0 = droplets follow the gradient exactly, 1 = they never turn. Default 0.05. */\n readonly inertia?: number;\n /** Sediment a droplet can carry per unit of speed × water × drop. Default 4. */\n readonly capacity?: number;\n readonly minCapacity?: number;\n /** Share of spare capacity eroded per step. Default 0.3. */\n readonly erode?: number;\n /** Share of surplus sediment deposited per step. Default 0.3. */\n readonly deposit?: number;\n readonly evaporate?: number;\n readonly gravity?: number;\n /** Erosion brush radius in grid cells (wider = smoother gullies). Default 3. */\n readonly radius?: number;\n}\n\nconst put = (h: Float64Array, dep: Float64Array, k: number, a: number): void => {\n h[k] = (h[k] ?? 0) + a;\n dep[k] = (dep[k] ?? 0) + a;\n};\n\ninterface Sim {\n readonly h: Float64Array;\n readonly flow: Float64Array;\n readonly dep: Float64Array;\n readonly nx: number;\n readonly ny: number;\n readonly inertia: number;\n readonly capK: number;\n readonly minCap: number;\n readonly erodeK: number;\n readonly depositK: number;\n readonly evap: number;\n readonly gravity: number;\n readonly life: number;\n}\n\ninterface Brush {\n readonly dx: Int32Array;\n readonly dy: Int32Array;\n readonly w: Float64Array;\n}\n\n/** Cell offsets within the radius, weights falling off linearly, summing to 1. */\nfunction makeBrush(radius: number): Brush {\n const dx: number[] = [];\n const dy: number[] = [];\n const w: number[] = [];\n for (let y = -radius; y <= radius; y++)\n for (let x = -radius; x <= radius; x++) {\n const d = Math.sqrt(x * x + y * y);\n if (d < radius) {\n dx.push(x);\n dy.push(y);\n w.push(radius - d);\n }\n }\n const sum = w.reduce((s, v) => s + v, 0);\n return {\n dx: Int32Array.from(dx),\n dy: Int32Array.from(dy),\n w: Float64Array.from(w, (v) => v / sum),\n };\n}\n\n/** One droplet's life. Module-level with scalar locals: no closures for the JIT to trip on. */\nfunction droplet(s: Sim, b: Brush, x0: number, y0: number): void {\n const { h, nx, ny } = s;\n let x = x0;\n let y = y0;\n let dx = 0;\n let dy = 0;\n let speed = 1;\n let water = 1;\n let sediment = 0;\n for (let step = 0; step < s.life; step++) {\n const i = Math.floor(x);\n const j = Math.floor(y);\n const u = x - i;\n const v = y - j;\n const k = j * nx + i;\n const a = h[k] ?? 0;\n const bb = h[k + 1] ?? 0;\n const c = h[k + nx] ?? 0;\n const d = h[k + nx + 1] ?? 0;\n const height = a * (1 - u) * (1 - v) + bb * u * (1 - v) + c * (1 - u) * v + d * u * v;\n const gx = (bb - a) * (1 - v) + (d - c) * v;\n const gy = (c - a) * (1 - u) + (d - bb) * u;\n dx = dx * s.inertia - gx * (1 - s.inertia);\n dy = dy * s.inertia - gy * (1 - s.inertia);\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len === 0) return;\n dx /= len;\n dy /= len;\n x += dx;\n y += dy;\n s.flow[k] = (s.flow[k] ?? 0) + water;\n if (x < 0 || y < 0 || x >= nx - 1 || y >= ny - 1) return;\n const dh = bilinear(h, nx, x, y) - height;\n const cap = Math.max(-dh * speed * water * s.capK, s.minCap);\n if (sediment > cap || dh > 0) {\n // Fill the pit we climbed out of, or drop the surplus: split over the 4 corners.\n const amount = dh > 0 ? Math.min(dh, sediment) : (sediment - cap) * s.depositK;\n sediment -= amount;\n put(h, s.dep, k, amount * (1 - u) * (1 - v));\n put(h, s.dep, k + 1, amount * u * (1 - v));\n put(h, s.dep, k + nx, amount * (1 - u) * v);\n put(h, s.dep, k + nx + 1, amount * u * v);\n } else {\n const amount = Math.min((cap - sediment) * s.erodeK, -dh);\n for (let n = 0; n < b.w.length; n++) {\n const ci = i + (b.dx[n] ?? 0);\n const cj = j + (b.dy[n] ?? 0);\n if (ci < 0 || cj < 0 || ci >= nx || cj >= ny) continue;\n const cell = cj * nx + ci;\n const take = Math.min(h[cell] ?? 0, amount * (b.w[n] ?? 0));\n h[cell] = (h[cell] ?? 0) - take;\n sediment += take;\n }\n }\n speed = Math.sqrt(Math.max(0, speed * speed - dh * s.gravity));\n water *= 1 - s.evap;\n }\n}\n\nfunction bilinear(h: Float64Array, nx: number, x: number, y: number): number {\n const i = Math.floor(x);\n const j = Math.floor(y);\n const u = x - i;\n const v = y - j;\n const k = j * nx + i;\n const a = h[k] ?? 0;\n const b = h[k + 1] ?? 0;\n const c = h[k + nx] ?? 0;\n const d = h[k + nx + 1] ?? 0;\n return a * (1 - u) * (1 - v) + b * u * (1 - v) + c * (1 - u) * v + d * u * v;\n}\n\nexport function hydraulicErosion(g: TerrainGrid, rng: Rng, o: ErosionOptions = {}): TerrainGrid {\n const drops = count('erosion droplets', o.droplets ?? 70000, 0, 10_000_000);\n const life = count('erosion lifetime', o.lifetime ?? 30, 1, 1000);\n const radius = count('erosion radius', o.radius ?? 3, 1, 32);\n const { nx, ny } = g;\n let lo = Number.POSITIVE_INFINITY;\n let hi = Number.NEGATIVE_INFINITY;\n for (const v of g.z) {\n lo = Math.min(lo, v);\n hi = Math.max(hi, v);\n }\n const relief = hi - lo || 1;\n const h = Float64Array.from(g.z, (v) => (v - lo) / relief);\n const flow = new Float64Array(h.length);\n const dep = new Float64Array(h.length);\n const sim: Sim = {\n ...{ h, flow, dep, nx, ny, life, inertia: o.inertia ?? 0.05, capK: o.capacity ?? 4 },\n ...{ minCap: o.minCapacity ?? 0.01, erodeK: o.erode ?? 0.3, depositK: o.deposit ?? 0.3 },\n ...{ evap: o.evaporate ?? 0.01, gravity: o.gravity ?? 4 },\n };\n const brush = makeBrush(radius);\n for (let n = 0; n < drops; n++) droplet(sim, brush, rng.next() * (nx - 2), rng.next() * (ny - 2));\n const norm = (m: Float64Array): Float64Array => {\n let top = 0;\n for (const v of m) top = Math.max(top, v);\n // Square-root compresses the long tail: a few rivers carry most water.\n return top > 0 ? m.map((v) => Math.sqrt(v / top)) : m;\n };\n return { ...g, z: h.map((v) => lo + v * relief), flow: norm(flow), deposit: norm(dep) };\n}\n",
|
|
14
|
+
"// Terrain from a height function over a rectangle: hills, embankments, spoil heaps, battlefield\n// ground for presentation scenes. Smooth normals by central differences; UVs tile in metres.\n// `cells` is the LOD knob — a recipe passes fewer cells at LOD 1/2. `skirt` drops walls from\n// the edges to a base height: a solid map tile / diorama block that stands on z = 0.\n// triangles = 2 · cx · cy + (skirt ? 4 · (cx + cy) : 0)\n\nimport { type Mesh, MeshBuilder, normalize, type Vec3 } from '../core/index.ts';\nimport { type StripId, stripRect } from '../material/index.ts';\nimport { mirroredV, stripVMetres } from './strip-uv.ts';\n\nexport interface HeightfieldOptions {\n /** [minX, minY, maxX, maxY] in metres. */\n readonly rect: readonly [number, number, number, number];\n readonly cells: readonly [number, number];\n readonly height: (x: number, y: number) => number;\n /** Vertex colour per point (e.g. darker in ruts, greener on slopes). */\n readonly color: Vec3 | ((x: number, y: number, z: number) => Vec3);\n readonly strip?: StripId;\n /** Close the sides down to this z (e.g. 0): flat-shaded walls, outward normals. */\n readonly skirt?: number;\n /** Wall colour; default: the terrain colour at the top edge. */\n readonly skirtColor?: Vec3;\n}\n\nexport function heightfield(o: HeightfieldOptions): Mesh {\n const [x0, y0, x1, y1] = o.rect;\n const [nx, ny] = o.cells;\n const dx = (x1 - x0) / nx;\n const dy = (y1 - y0) / ny;\n const rect = stripRect(o.strip ?? 'plain');\n const vm = stripVMetres(o.strip ?? 'plain');\n const b = new MeshBuilder();\n const ids: number[] = [];\n for (let j = 0; j <= ny; j++) {\n for (let i = 0; i <= nx; i++) {\n const x = x0 + i * dx;\n const y = y0 + j * dy;\n const z = o.height(x, y);\n const n = normalize([\n o.height(x - dx, y) - o.height(x + dx, y),\n o.height(x, y - dy) - o.height(x, y + dy),\n 2 * Math.min(dx, dy),\n ]);\n const color = typeof o.color === 'function' ? o.color(x, y, z) : o.color;\n const u = (x - x0) / rect.metres;\n ids.push(\n b.vertex({\n p: [x, y, z],\n n,\n // V mirrors every band: continuous, so no triangle straddles a wrap and smears the strip.\n uv: [rect.u0 + u * (rect.u1 - rect.u0), mirroredV(rect, y - y0, vm)],\n color,\n }),\n );\n }\n }\n const at = (i: number, j: number): number => ids[j * (nx + 1) + i] ?? 0;\n for (let j = 0; j < ny; j++)\n for (let i = 0; i < nx; i++) b.quad(at(i, j), at(i + 1, j), at(i + 1, j + 1), at(i, j + 1));\n if (o.skirt !== undefined) skirt(b, o, rect);\n return b.build();\n}\n\n/** Four walls from the edge vertices down to `o.skirt`, each quad CCW seen from outside. */\nfunction skirt(b: MeshBuilder, o: HeightfieldOptions, rect: ReturnType<typeof stripRect>): void {\n const [x0, y0, x1, y1] = o.rect;\n const [nx, ny] = o.cells;\n const base = o.skirt ?? 0;\n // Edge: start corner, step per cell, cell count, outward normal. Walking CCW seen from above,\n // outside is on the right, so (top a, top b, base b, base a) reversed is CCW from outside.\n const edges: [number, number, number, number, number, Vec3][] = [\n [x0, y0, (x1 - x0) / nx, 0, nx, [0, -1, 0]],\n [x1, y0, 0, (y1 - y0) / ny, ny, [1, 0, 0]],\n [x1, y1, -(x1 - x0) / nx, 0, nx, [0, 1, 0]],\n [x0, y1, 0, -(y1 - y0) / ny, ny, [-1, 0, 0]],\n ];\n const col = (x: number, y: number, z: number): Vec3 =>\n o.skirtColor ?? (typeof o.color === 'function' ? o.color(x, y, z) : o.color);\n const v = (x: number, y: number, z: number, n: Vec3, u: number, color: Vec3): number =>\n b.vertex({\n p: [x, y, z],\n n,\n uv: [rect.u0 + (u / rect.metres) * (rect.u1 - rect.u0), z > base ? rect.v1 : rect.v0],\n color,\n });\n let run = 0;\n for (const [sx, sy, dx, dy, n, nrm] of edges) {\n const step = Math.hypot(dx, dy);\n for (let k = 0; k < n; k++) {\n const [ax, ay, bx, by] = [sx + dx * k, sy + dy * k, sx + dx * (k + 1), sy + dy * (k + 1)];\n const az = o.height(ax, ay);\n const bz = o.height(bx, by);\n const ca = col(ax, ay, az);\n const cb = col(bx, by, bz);\n const ta = v(ax, ay, az, nrm, run, ca);\n const tb = v(bx, by, bz, nrm, run + step, cb);\n b.quad(v(ax, ay, base, nrm, run, ca), v(bx, by, base, nrm, run + step, cb), tb, ta);\n run += step;\n }\n }\n}\n",
|
|
15
|
+
"// Ear-clipping triangulation of a simple 2D polygon (convex or concave, either winding).\n// Returns index triples into the input, counter-clockwise.\n\nimport type { Vec2 } from '../core/index.ts';\n\nconst area = (p: readonly Vec2[]): number =>\n p.reduce((s, a, i) => {\n const b = p[(i + 1) % p.length] ?? a;\n return s + a[0] * b[1] - b[0] * a[1];\n }, 0) / 2;\n\nconst cross = (a: Vec2, b: Vec2, c: Vec2): number =>\n (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n\nfunction inside(p: Vec2, a: Vec2, b: Vec2, c: Vec2): boolean {\n return cross(a, b, p) >= 0 && cross(b, c, p) >= 0 && cross(c, a, p) >= 0;\n}\n\nexport function triangulate(poly: readonly Vec2[]): [number, number, number][] {\n const idx = poly.map((_, i) => i);\n if (area(poly) < 0) idx.reverse();\n const out: [number, number, number][] = [];\n let guard = idx.length * idx.length;\n while (idx.length > 3 && guard-- > 0) {\n for (let i = 0; i < idx.length; i++) {\n const ia = idx[(i + idx.length - 1) % idx.length] ?? 0;\n const ib = idx[i] ?? 0;\n const ic = idx[(i + 1) % idx.length] ?? 0;\n const a = poly[ia] ?? [0, 0];\n const b = poly[ib] ?? [0, 0];\n const c = poly[ic] ?? [0, 0];\n if (cross(a, b, c) <= 0) continue;\n if (idx.some((j) => j !== ia && j !== ib && j !== ic && inside(poly[j] ?? [0, 0], a, b, c)))\n continue;\n out.push([ia, ib, ic]);\n idx.splice(i, 1);\n break;\n }\n }\n if (idx.length === 3) out.push([idx[0] ?? 0, idx[1] ?? 0, idx[2] ?? 0]);\n return out;\n}\n",
|
|
16
|
+
"// One straight structural member written into a shared MeshBuilder: a 2D section (square tube or\n// angle iron) extruded from → to with flat normals. Lattice emits hundreds of these, so there is\n// no per-member Mesh or merge; the section and its cap triangulation are computed once.\n\nimport type { MeshBuilder, Vec2, Vec3 } from '../core/index.ts';\nimport type { UvRect } from '../material/index.ts';\nimport { stripU, stripV } from './strip-uv.ts';\nimport { triangulate } from './triangulate.ts';\n\nexport type SectionKind = 'square' | 'angle';\n\nexport interface Section {\n /** Profile in the member's (x, y) plane, CCW seen from the far end. */\n readonly ring: readonly Vec2[];\n readonly caps: readonly (readonly [number, number, number])[];\n /** Cumulative perimeter run at each ring vertex, as a fraction 0..1 (V across the strip). */\n readonly run: readonly number[];\n /** Side triangles per member (caps add 2 · caps.length). */\n readonly sideTris: number;\n}\n\n/** A section of outside width `w`; angle legs are 15% of the width thick. */\nexport function section(kind: SectionKind, w: number): Section {\n const h = w / 2;\n const t = w * 0.15;\n const ring: Vec2[] =\n kind === 'square'\n ? [\n [-h, -h],\n [h, -h],\n [h, h],\n [-h, h],\n ]\n : [\n [-h, -h],\n [h, -h],\n [h, -h + t],\n [-h + t, -h + t],\n [-h + t, h],\n [-h, h],\n ];\n const lens = ring.map((a, i) => {\n const b = ring[(i + 1) % ring.length] ?? a;\n return Math.hypot(b[0] - a[0], b[1] - a[1]);\n });\n const total = lens.reduce((s, l) => s + l, 0);\n let acc = 0;\n const run = lens.map((l) => {\n const r = acc / total;\n acc += l;\n return r;\n });\n return { ring, caps: triangulate(ring), run, sideTris: ring.length * 2 };\n}\n\n/**\n * Extrude `s` from a to b. `y` is the section's local up (must not be parallel to b − a): put it\n * on the face normal so members lie flush in their truss plane. Caps close both ends.\n */\nexport function emitMember(\n mb: MeshBuilder,\n s: Section,\n a: Vec3,\n b: Vec3,\n y: Vec3,\n caps: boolean,\n color: Vec3,\n rect: UvRect,\n): void {\n const d: Vec3 = [b[0] - a[0], b[1] - a[1], b[2] - a[2]];\n const len = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n const w: Vec3 = [d[0] / len, d[1] / len, d[2] / len];\n // y ⟂ w (Gram–Schmidt), x = y × w so (x, y, w) is right-handed.\n const k = y[0] * w[0] + y[1] * w[1] + y[2] * w[2];\n const yr: Vec3 = [y[0] - w[0] * k, y[1] - w[1] * k, y[2] - w[2] * k];\n const yl = Math.sqrt(yr[0] * yr[0] + yr[1] * yr[1] + yr[2] * yr[2]);\n const yy: Vec3 = [yr[0] / yl, yr[1] / yl, yr[2] / yl];\n const x: Vec3 = [\n yy[1] * w[2] - yy[2] * w[1],\n yy[2] * w[0] - yy[0] * w[2],\n yy[0] * w[1] - yy[1] * w[0],\n ];\n const at = (p: Vec2, end: Vec3): Vec3 => [\n end[0] + x[0] * p[0] + yy[0] * p[1],\n end[1] + x[1] * p[0] + yy[1] * p[1],\n end[2] + x[2] * p[0] + yy[2] * p[1],\n ];\n const n = s.ring.length;\n const u1 = stripU(rect, len);\n const u0 = stripU(rect, 0);\n for (let i = 0; i < n; i++) {\n const p = s.ring[i] ?? [0, 0];\n const q = s.ring[(i + 1) % n] ?? p;\n const ex = q[0] - p[0];\n const ey = q[1] - p[1];\n const el = Math.hypot(ex, ey);\n // Outward 2D normal of a CCW edge is (ey, −ex).\n const nx = ey / el;\n const ny = -ex / el;\n const nrm: Vec3 = [x[0] * nx + yy[0] * ny, x[1] * nx + yy[1] * ny, x[2] * nx + yy[2] * ny];\n const v0 = stripV(rect, s.run[i] ?? 0);\n const v1 = stripV(rect, i + 1 < n ? (s.run[i + 1] ?? 1) : 1);\n const i0 = mb.vertex({ p: at(p, a), n: nrm, uv: [u0, v0], color });\n const i1 = mb.vertex({ p: at(q, a), n: nrm, uv: [u0, v1], color });\n const i2 = mb.vertex({ p: at(q, b), n: nrm, uv: [u1, v1], color });\n const i3 = mb.vertex({ p: at(p, b), n: nrm, uv: [u1, v0], color });\n mb.quad(i0, i1, i2, i3);\n }\n if (!caps) return;\n for (const [end, sign] of [\n [a, -1],\n [b, 1],\n ] as const) {\n const nrm: Vec3 = [w[0] * sign, w[1] * sign, w[2] * sign];\n const first = mb.vertex({\n p: at(s.ring[0] ?? [0, 0], end),\n n: nrm,\n uv: [u0, stripV(rect, 0)],\n color,\n });\n for (let i = 1; i < n; i++) {\n const p = s.ring[i] ?? [0, 0];\n mb.vertex({ p: at(p, end), n: nrm, uv: [u0, stripV(rect, s.run[i] ?? 0)], color });\n }\n for (const [i, j, l] of s.caps) {\n if (sign > 0) mb.tri(first + i, first + j, first + l);\n else mb.tri(first + i, first + l, first + j);\n }\n }\n}\n",
|
|
17
|
+
"// A truss between two points: bridges, girders, crane jibs, signal gantries, pylons, towers.\n// Planar (two chords) or, with `width`, a box truss (four chords, every face braced). Members are\n// square tubes or angle iron with flat normals, written into one builder. `from → to` is the\n// base chord (or the centreline with `centred`); `depth` rises along `up`. Patterns per bay:\n// warren /\\/\\/\\ diagonals only pratt |\\|\\|/|/| verticals, diagonals down to centre\n// howe |/|/|\\|\\| the reverse x |X|X|X| verticals + both diagonals\n// Pratt/Howe put an X in the middle bay when `bays` is odd. LOD knobs: `bays`, `section`, and\n// dropping `width` (box → planar), chosen by the recipe with ctx.pick.\n// triangles = chords·(S + C) + faces·web·S S = 8 square | 12 angle, C = 4 | 8 (end caps)\n// chords = 2 | 4, faces = 1 | 4, web = warren k · pratt/howe 2k + 1 + (k odd) · x 3k + 1\n\nimport { type Mesh, MeshBuilder, normalize, type Vec3 } from '../core/index.ts';\nimport { type StripId, stripRect } from '../material/index.ts';\nimport { count, invalid, positive } from './check.ts';\nimport { emitMember, type SectionKind, section } from './member.ts';\n\nexport type TrussPattern = 'warren' | 'pratt' | 'howe' | 'x';\n\nexport interface LatticeOptions {\n readonly from: Vec3;\n readonly to: Vec3;\n /** Chord-to-chord height in metres (at `from`; `depthEnd` tapers it toward `to`). */\n readonly depth: number;\n readonly depthEnd?: number;\n /** Box truss: chord spacing across, metres (and `widthEnd`). Omit for a planar truss. */\n readonly width?: number;\n readonly widthEnd?: number;\n /** Which way depth rises. Default world Z (world X for a vertical truss). */\n readonly up?: Vec3;\n readonly centred?: boolean;\n readonly pattern?: TrussPattern;\n /** Panels along the length. Default ≈ length / depth. */\n readonly bays?: number;\n /** Chord member width, metres. */\n readonly chord: number;\n /** Web member width. Default 0.6 · chord. */\n readonly web?: number;\n readonly section?: SectionKind;\n readonly color: Vec3;\n readonly strip?: StripId;\n}\n\ntype Line = (t: number) => Vec3;\n\nexport function lattice(o: LatticeOptions): Mesh {\n const d: Vec3 = [o.to[0] - o.from[0], o.to[1] - o.from[1], o.to[2] - o.from[2]];\n const len = Math.hypot(d[0], d[1], d[2]);\n if (!(len > 1e-6))\n invalid('lattice: from and to coincide', 'give the truss two distinct end points in metres');\n const depth = positive('lattice depth', o.depth, 'e.g. 2 for a 2 m deep girder');\n const chord = positive('lattice chord', o.chord, 'e.g. 0.2');\n if (chord >= depth)\n invalid(\n `lattice chord ${chord} m ≥ depth ${depth} m`,\n 'make the chord member thinner than the depth',\n );\n const web = positive('lattice web', o.web ?? chord * 0.6, 'e.g. 0.6 · chord');\n const k = count('lattice bays', o.bays ?? Math.max(1, Math.round(len / depth)), 1, 2000);\n const w = normalize(d);\n const upHint: Vec3 = o.up ?? (Math.abs(w[2]) > 0.95 ? [1, 0, 0] : [0, 0, 1]);\n const dotU = upHint[0] * w[0] + upHint[1] * w[1] + upHint[2] * w[2];\n const upR: Vec3 = [upHint[0] - w[0] * dotU, upHint[1] - w[1] * dotU, upHint[2] - w[2] * dotU];\n if (Math.hypot(upR[0], upR[1], upR[2]) < 1e-6)\n invalid('lattice: up is parallel to from → to', 'pass an `up` perpendicular to the truss axis');\n const up = normalize(upR);\n const side: Vec3 = [\n w[1] * up[2] - w[2] * up[1],\n w[2] * up[0] - w[0] * up[2],\n w[0] * up[1] - w[1] * up[0],\n ];\n const dEnd = positive('lattice depthEnd', o.depthEnd ?? depth, 'e.g. 1');\n const wid = o.width === undefined ? 0 : positive('lattice width', o.width, 'e.g. 2');\n const wEnd =\n o.width === undefined ? 0 : positive('lattice widthEnd', o.widthEnd ?? wid, 'e.g. 1');\n const c0 = o.centred ? -0.5 : 0;\n /** A chord line at lateral sign a (−1/0/+1) and height c (0 = base, 1 = top). */\n const line =\n (a: number, c: number): Line =>\n (t) => {\n const along = len * t;\n const lat = (a * (wid + (wEnd - wid) * t)) / 2;\n const h = (c0 + c) * (depth + (dEnd - depth) * t);\n return [\n o.from[0] + w[0] * along + side[0] * lat + up[0] * h,\n o.from[1] + w[1] * along + side[1] * lat + up[1] * h,\n o.from[2] + w[2] * along + side[2] * lat + up[2] * h,\n ];\n };\n const neg = (v: Vec3): Vec3 => [-v[0], -v[1], -v[2]];\n // Each face: two chord lines, the face normal (members' section up).\n const faces: [Line, Line, Vec3][] =\n o.width === undefined\n ? [[line(0, 0), line(0, 1), side]]\n : [\n [line(-1, 0), line(-1, 1), neg(side)],\n [line(1, 0), line(1, 1), side],\n [line(-1, 1), line(1, 1), up],\n [line(-1, 0), line(1, 0), neg(up)],\n ];\n const chords: Line[] =\n o.width === undefined\n ? [line(0, 0), line(0, 1)]\n : [line(-1, 0), line(1, 0), line(-1, 1), line(1, 1)];\n const rect = stripRect(o.strip ?? 'iron');\n const sc = section(o.section ?? 'square', chord);\n const sw = section(o.section ?? 'square', web);\n const mb = new MeshBuilder();\n for (const c of chords) emitMember(mb, sc, c(0), c(1), up, true, o.color, rect);\n for (const [lo, hi, n] of faces)\n for (const [ta, la, tb, lb] of webMembers(o.pattern ?? 'warren', k))\n emitMember(mb, sw, (la ? hi : lo)(ta), (lb ? hi : lo)(tb), n, false, o.color, rect);\n return mb.build();\n}\n\n/** Web members of one face as [t0, onTop0, t1, onTop1], in a fixed order (determinism). */\nexport function webMembers(pattern: TrussPattern, k: number): [number, boolean, number, boolean][] {\n const out: [number, boolean, number, boolean][] = [];\n const t = (i: number): number => i / k;\n if (pattern !== 'warren') for (let i = 0; i <= k; i++) out.push([t(i), false, t(i), true]);\n for (let i = 0; i < k; i++) {\n const down: [number, boolean, number, boolean] = [t(i), true, t(i + 1), false]; // \"\\\"\n const rise: [number, boolean, number, boolean] = [t(i), false, t(i + 1), true]; // \"/\"\n const middle = k % 2 === 1 && i === (k - 1) / 2;\n const left = i < k / 2;\n if (pattern === 'warren') out.push(i % 2 === 0 ? rise : down);\n else if (pattern === 'x' || middle) out.push(rise, down);\n else if (pattern === 'pratt') out.push(left ? down : rise);\n else out.push(left ? rise : down);\n }\n return out;\n}\n",
|
|
18
|
+
"// Skin ordered closed rings with equal vertex counts: haystacks, grain sacks, wheat stooks, hulls,\n// fuselages, buttressed trunk flares. SMOOTH normals (central differences around and along; caps\n// flat), forced outward whichever way the rings wind. Positions are absolute (no `at`). UVs:\n// 'length' (default) U = metres along the ring centroids, V once around the band; 'row' U =\n// metres around each ring, V along; 'swap' one unscaled wrap (U around 0–1, V along 0–1).\n// Triangles = 2·N·(R−1) + N per cap (N vertices per ring, R rings).\n\nimport { type Mesh, MeshBuilder, Ts23dError, type Vec3 } from '../core/index.ts';\nimport { type StripId, stripRect } from '../material/index.ts';\n\nexport type LoftColor = Vec3 | ((ring: readonly Vec3[], i: number, p: Vec3) => Vec3);\n\nexport interface LoftOptions {\n readonly rings: readonly (readonly Vec3[])[];\n /** One colour, or one per vertex from (ring, ring index, point). */\n readonly color: LoftColor;\n readonly strip?: StripId;\n readonly capStart?: boolean;\n readonly capEnd?: boolean;\n readonly uv?: 'length' | 'row' | 'swap';\n}\n\n/** An elliptical ring in the plane z = centre.z, CCW seen from +Z; `wobble(angle)` scales radius. */\nexport function ringXY(\n centre: Vec3,\n rx: number,\n ry: number,\n segments: number,\n wobble?: (angle: number) => number,\n phase = 0,\n): Vec3[] {\n const out: Vec3[] = [];\n for (let k = 0; k < segments; k++) {\n const a = phase + (k / segments) * Math.PI * 2;\n const w = wobble ? wobble(a) : 1;\n out.push([centre[0] + rx * Math.cos(a) * w, centre[1] + ry * Math.sin(a) * w, centre[2]]);\n }\n return out;\n}\n\nconst invalid = (cause: string, fix: string): Ts23dError =>\n new Ts23dError('T3D_RECIPE_INVALID', { cause, fix });\n\nconst centroid = (r: readonly Vec3[]): Vec3 => {\n let x = 0;\n let y = 0;\n let z = 0;\n for (const p of r) {\n x += p[0];\n y += p[1];\n z += p[2];\n }\n return [x / r.length, y / r.length, z / r.length];\n};\n\nexport function loft(o: LoftOptions): Mesh {\n const R = o.rings.length;\n if (R < 2) throw invalid(`loft has ${R} ring(s)`, 'pass at least 2 rings (bottom → top)');\n const N = o.rings[0]?.length ?? 0;\n if (N < 3) throw invalid(`loft rings have ${N} vertices`, 'give every ring at least 3 vertices');\n for (const [i, r] of o.rings.entries()) {\n if (r.length !== N) {\n throw invalid(\n `loft ring ${i} has ${r.length} vertices, ring 0 has ${N}`,\n 'build every ring with the same vertex count (same `segments` in ringXY)',\n );\n }\n }\n const at = (i: number, k: number): Vec3 => o.rings[i]?.[((k % N) + N) % N] ?? [0, 0, 0];\n const cents = o.rings.map(centroid);\n const along = [0];\n for (let i = 1; i < R; i++) {\n const a = cents[i - 1] ?? [0, 0, 0];\n const b = cents[i] ?? a;\n along.push((along[i - 1] ?? 0) + Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]));\n }\n const total = along[R - 1] || 1;\n // Raw normals (around × along); the sign of their sum against \"outward from the centroid\"\n // decides the winding for the whole loft.\n const raw: Vec3[] = [];\n let facing = 0;\n for (let i = 0; i < R; i++) {\n const c = cents[i] ?? [0, 0, 0];\n const ax = cents[Math.min(R - 1, i + 1)] ?? c;\n const bx = cents[Math.max(0, i - 1)] ?? c;\n const axis: Vec3 = [ax[0] - bx[0], ax[1] - bx[1], ax[2] - bx[2]];\n for (let k = 0; k < N; k++) {\n const p = at(i, k);\n const u0 = at(i, k - 1);\n const u1 = at(i, k + 1);\n const v0 = at(Math.max(0, i - 1), k);\n const v1 = at(Math.min(R - 1, i + 1), k);\n const tu: Vec3 = [u1[0] - u0[0], u1[1] - u0[1], u1[2] - u0[2]];\n const tv: Vec3 = [v1[0] - v0[0], v1[1] - v0[1], v1[2] - v0[2]];\n let n: Vec3 = [\n tu[1] * tv[2] - tu[2] * tv[1],\n tu[2] * tv[0] - tu[0] * tv[2],\n tu[0] * tv[1] - tu[1] * tv[0],\n ];\n if (Math.hypot(n[0], n[1], n[2]) < 1e-12) n = i === 0 ? [-axis[0], -axis[1], -axis[2]] : axis;\n facing += n[0] * (p[0] - c[0]) + n[1] * (p[1] - c[1]) + n[2] * (p[2] - c[2]);\n raw.push(n);\n }\n }\n const flip = facing < 0 ? -1 : 1;\n const rect = stripRect(o.strip ?? 'plain');\n const du = rect.u1 - rect.u0;\n const dv = rect.v1 - rect.v0;\n const mode = o.uv ?? 'length';\n const color = (i: number, p: Vec3): Vec3 =>\n typeof o.color === 'function' ? o.color(o.rings[i] ?? [], i, p) : o.color;\n const b = new MeshBuilder();\n for (let i = 0; i < R; i++) {\n let around = 0;\n for (let k = 0; k <= N; k++) {\n const p = at(i, k);\n if (k > 0) {\n const q = at(i, k - 1);\n around += Math.hypot(p[0] - q[0], p[1] - q[1], p[2] - q[2]);\n }\n const n = raw[i * N + (k % N)] ?? [0, 0, 1];\n const l = (Math.hypot(n[0], n[1], n[2]) || 1) * flip;\n const s = (along[i] ?? 0) / rect.metres;\n const uv: [number, number] =\n mode === 'row'\n ? [rect.u0 + (around / rect.metres) * du, rect.v0 + ((along[i] ?? 0) / total) * dv]\n : mode === 'swap'\n ? [rect.u0 + (k / N) * du, rect.v0 + ((along[i] ?? 0) / total) * dv]\n : [rect.u0 + s * du, rect.v0 + (k / N) * dv];\n b.vertex({ p, n: [n[0] / l, n[1] / l, n[2] / l], uv, color: color(i, p) });\n }\n }\n for (let i = 0; i + 1 < R; i++) {\n const r0 = i * (N + 1);\n const r1 = r0 + N + 1;\n for (let k = 0; k < N; k++) {\n if (flip > 0) b.quad(r0 + k, r0 + k + 1, r1 + k + 1, r1 + k);\n else b.quad(r0 + k, r1 + k, r1 + k + 1, r0 + k + 1);\n }\n }\n const ends: [number, boolean][] = [\n [0, o.capStart === true],\n [R - 1, o.capEnd === true],\n ];\n for (const [i, on] of ends) {\n if (!on) continue;\n const c = cents[i] ?? [0, 0, 0];\n const other = cents[i === 0 ? 1 : R - 2] ?? c;\n const d: Vec3 = [c[0] - other[0], c[1] - other[1], c[2] - other[2]];\n const l = Math.hypot(d[0], d[1], d[2]) || 1;\n const nn: Vec3 = [d[0] / l, d[1] / l, d[2] / l];\n const mid = b.vertex({ p: c, n: nn, uv: [rect.u0, rect.v0], color: color(i, c) });\n for (let k = 0; k < N; k++) {\n const p = at(i, k);\n b.vertex({ p, n: nn, uv: [rect.u0, rect.v1], color: color(i, p) });\n }\n // Cap winding: CCW seen from outside (along nn). Ring order relative to nn sets the sense.\n const e1 = at(i, 0);\n const e2 = at(i, 1);\n const cr: Vec3 = [\n (e1[1] - c[1]) * (e2[2] - c[2]) - (e1[2] - c[2]) * (e2[1] - c[1]),\n (e1[2] - c[2]) * (e2[0] - c[0]) - (e1[0] - c[0]) * (e2[2] - c[2]),\n (e1[0] - c[0]) * (e2[1] - c[1]) - (e1[1] - c[1]) * (e2[0] - c[0]),\n ];\n const ccw = cr[0] * nn[0] + cr[1] * nn[1] + cr[2] * nn[2] >= 0;\n for (let k = 0; k < N; k++) {\n const a = mid + 1 + k;\n const z = mid + 1 + ((k + 1) % N);\n if (ccw) b.tri(mid, a, z);\n else b.tri(mid, z, a);\n }\n }\n return b.build();\n}\n",
|
|
19
|
+
"// Seeded 2D noise kit for terrain and maps: gradient (Perlin) and value noise, fBm, ridged\n// multifractal (Musgrave: sharp ridgelines), billow (rounded hills), domain warp (Quílez: folded,\n// flowing ranges) and terraces. Everything derives from an Rng and uses only + − × ÷ sqrt floor,\n// so the same seed gives the same bits on every engine (no sin/pow/exp in the hot path).\n// A Noise2 takes metres (x, y) and returns roughly [−1, 1] (ridged: [0, 1]).\n\nimport type { Rng } from '../core/index.ts';\n\nexport type Noise2 = (x: number, y: number) => number;\n\nexport interface FractalOptions {\n /** Metres per base feature (the first octave's wavelength). Default 1. */\n readonly scale?: number;\n readonly octaves?: number;\n /** Frequency multiplier per octave. Default 2. */\n readonly lacunarity?: number;\n /** Amplitude multiplier per octave (persistence). Default 0.5. */\n readonly gain?: number;\n}\n\nconst R = Math.SQRT1_2;\n/** Eight unit gradients with exact constants (no trig: bitwise identical everywhere). */\nconst GX = [1, -1, 0, 0, R, -R, R, -R];\nconst GY = [0, 0, 1, -1, R, R, -R, -R];\n\nfunction permutation(rng: Rng): Uint8Array {\n const p = new Uint8Array(512);\n for (let i = 0; i < 256; i++) p[i] = i;\n for (let i = 255; i > 0; i--) {\n const j = rng.int(0, i);\n const t = p[i] ?? 0;\n p[i] = p[j] ?? 0;\n p[j] = t;\n }\n for (let i = 0; i < 256; i++) p[i + 256] = p[i] ?? 0;\n return p;\n}\n\nconst fade = (t: number): number => t * t * t * (t * (t * 6 - 15) + 10);\n\n/** Perlin gradient noise, feature size 1 m, ≈ [−1, 1]. */\nexport function gradientNoise2(rng: Rng): Noise2 {\n const p = permutation(rng);\n const grad = (ix: number, iy: number, dx: number, dy: number): number => {\n const g = (p[(p[ix & 255] ?? 0) + (iy & 255)] ?? 0) & 7;\n return (GX[g] ?? 0) * dx + (GY[g] ?? 0) * dy;\n };\n return (x, y) => {\n const ix = Math.floor(x);\n const iy = Math.floor(y);\n const fx = x - ix;\n const fy = y - iy;\n const u = fade(fx);\n const v = fade(fy);\n const a = grad(ix, iy, fx, fy);\n const b = grad(ix + 1, iy, fx - 1, fy);\n const c = grad(ix, iy + 1, fx, fy - 1);\n const d = grad(ix + 1, iy + 1, fx - 1, fy - 1);\n const top = a + (b - a) * u;\n return (top + (c + (d - c) * u - top) * v) * Math.SQRT2;\n };\n}\n\n/** Value noise (smoothed random lattice), feature size 1 m, [−1, 1]. Blobbier than gradient. */\nexport function valueNoise2(rng: Rng): Noise2 {\n const p = permutation(rng);\n const vals = new Float64Array(256);\n for (let i = 0; i < 256; i++) vals[i] = rng.next() * 2 - 1;\n const at = (ix: number, iy: number): number => vals[p[(p[ix & 255] ?? 0) + (iy & 255)] ?? 0] ?? 0;\n return (x, y) => {\n const ix = Math.floor(x);\n const iy = Math.floor(y);\n const u = fade(x - ix);\n const v = fade(y - iy);\n const top = at(ix, iy) + (at(ix + 1, iy) - at(ix, iy)) * u;\n const bot = at(ix, iy + 1) + (at(ix + 1, iy + 1) - at(ix, iy + 1)) * u;\n return top + (bot - top) * v;\n };\n}\n\n/** Sum octaves of `shape(n(x·f, y·f))`, normalised by the amplitude sum. */\nfunction fractal(n: Noise2, o: FractalOptions, shape: (v: number) => number): Noise2 {\n const s = 1 / (o.scale ?? 1);\n const octaves = o.octaves ?? 5;\n const lac = o.lacunarity ?? 2;\n const gain = o.gain ?? 0.5;\n return (x, y) => {\n let sum = 0;\n let amp = 1;\n let norm = 0;\n let f = s;\n for (let i = 0; i < octaves; i++) {\n // Offset each octave so lattice zeros never line up at the origin.\n sum += amp * shape(n(x * f + i * 17.31, y * f - i * 9.73));\n norm += amp;\n amp *= gain;\n f *= lac;\n }\n return sum / norm;\n };\n}\n\n/** Fractal Brownian motion: the default rolling-hills / rough-surface noise, ≈ [−1, 1]. */\nexport const fbm = (n: Noise2, o: FractalOptions = {}): Noise2 => fractal(n, o, (v) => v);\n\n/** Billow: |noise| octaves, rounded domes and sharp creases (hills, clouds), [−1, 1]. */\nexport const billow = (n: Noise2, o: FractalOptions = {}): Noise2 =>\n fractal(n, o, (v) => 2 * Math.abs(v) - 1);\n\n/**\n * Ridged multifractal (Musgrave): inverted |noise| squared, each octave weighted by the last, so\n * detail piles up on the ridgelines and valleys stay smooth. [0, 1].\n */\nexport function ridged(n: Noise2, o: FractalOptions & { readonly offset?: number } = {}): Noise2 {\n const s = 1 / (o.scale ?? 1);\n const octaves = o.octaves ?? 6;\n const lac = o.lacunarity ?? 2;\n const gain = o.gain ?? 0.5;\n const offset = o.offset ?? 1;\n return (x, y) => {\n let sum = 0;\n let norm = 0;\n let amp = 1;\n let weight = 1;\n let f = s;\n for (let i = 0; i < octaves; i++) {\n const crest = offset - Math.abs(n(x * f + i * 17.31, y * f - i * 9.73));\n const signal = crest * crest * weight;\n weight = Math.min(1, Math.max(0, signal * 2));\n sum += signal * amp;\n norm += amp * offset * offset;\n amp *= gain;\n f *= lac;\n }\n return sum / norm;\n };\n}\n\n/** Domain warp: sample `n` at a point pushed by two other noises × `amount` metres (Quílez). */\nexport const warp =\n (n: Noise2, wx: Noise2, wy: Noise2, amount: number): Noise2 =>\n (x, y) =>\n n(x + amount * wx(x, y), y + amount * wy(x, y));\n\n/**\n * Terraces: snap a height to steps of `step` metres. `sharpness` is the share of each step that is\n * a flat tread (0 = no terracing, 1 = flat treads and vertical risers); the rest is a smooth riser.\n * Strata, rice paddies, open-pit benches.\n */\nexport function terrace(h: number, step: number, sharpness = 0.5): number {\n const k = Math.floor(h / step);\n const t = h / step - k;\n const s = Math.min(1, Math.max(0, sharpness));\n const u = s >= 1 ? 0 : Math.min(1, Math.max(0, (t - s) / (1 - s)));\n const riser = u * u * (3 - 2 * u);\n return (k + t + (riser - t) * s) * step;\n}\n",
|
|
20
|
+
"// A flat polygon in 3D (fan-triangulated in its own plane): panels, decks, hatches, plates,\n// fender tops, sign boards. One-sided; pass `doubleSided` for thin sheets seen from both sides.\n\nimport {\n cross,\n dot,\n type Mesh,\n MeshBuilder,\n normalize,\n sub,\n type Vec2,\n type Vec3,\n} from '../core/index.ts';\nimport { type StripId, stripRect } from '../material/index.ts';\nimport { triangulate } from './triangulate.ts';\n\nexport interface PlanarOptions {\n /** Counter-clockwise as seen from the side the face points to. */\n readonly points: readonly Vec3[];\n readonly color: Vec3;\n readonly strip?: StripId;\n readonly doubleSided?: boolean;\n}\n\nexport function planar(o: PlanarOptions): Mesh {\n const [a = [0, 0, 0], b = [1, 0, 0], c = [0, 1, 0]] = o.points;\n const n = normalize(cross(sub(b, a), sub(c, a)));\n const u = normalize(sub(b, a));\n const v = cross(n, u);\n const flat: Vec2[] = o.points.map((p) => [dot(sub(p, a), u), dot(sub(p, a), v)]);\n const rect = stripRect(o.strip ?? 'plain');\n const tris = triangulate(flat);\n const mb = new MeshBuilder();\n for (const side of o.doubleSided ? [1, -1] : [1]) {\n const nn: Vec3 = [n[0] * side, n[1] * side, n[2] * side];\n const ids = o.points.map((p, i) => {\n const f = flat[i] ?? [0, 0];\n return mb.vertex({\n p,\n n: nn,\n uv: [\n rect.u0 + (f[0] / rect.metres) * (rect.u1 - rect.u0),\n rect.v0 + ((((f[1] / rect.metres) % 1) + 1) % 1) * (rect.v1 - rect.v0),\n ],\n color: o.color,\n });\n });\n for (const [x, y, z] of tris) {\n const [i0 = 0, i1 = 0, i2 = 0] = [ids[x], ids[y], ids[z]];\n if (side > 0) mb.tri(i0, i1, i2);\n else mb.tri(i0, i2, i1);\n }\n }\n return mb.build();\n}\n",
|
|
21
|
+
"// Extrude a 2D profile into a solid: the workhorse for sloped armour, hull side profiles, gables,\n// fins, wings in plan. The profile lives in a named plane and extrudes along the remaining axis.\n// plane 'xz' (side profile, extrude along Y) · 'xy' (plan, extrude up Z) · 'yz' (front, along X)\n\nimport { type Mesh, MeshBuilder, normalize, type Vec2, type Vec3 } from '../core/index.ts';\nimport { type StripId, stripRect } from '../material/index.ts';\nimport { triangulate } from './triangulate.ts';\n\nexport interface PrismOptions {\n readonly profile: readonly Vec2[];\n readonly depth: number;\n readonly plane?: 'xz' | 'xy' | 'yz';\n /** Extrusion is centred on the plane unless `from` is given (0 = starts at the plane). */\n readonly centred?: boolean;\n readonly color: Vec3;\n readonly strip?: StripId;\n readonly caps?: boolean;\n}\n\nconst lift = (plane: 'xz' | 'xy' | 'yz', p: Vec2, d: number): Vec3 =>\n plane === 'xz' ? [p[0], d, p[1]] : plane === 'xy' ? [p[0], p[1], d] : [d, p[0], p[1]];\n\nexport function prism(o: PrismOptions): Mesh {\n const plane = o.plane ?? 'xy';\n const d0 = o.centred === false ? 0 : -o.depth / 2;\n const d1 = d0 + o.depth;\n const rect = stripRect(o.strip ?? 'plain');\n const uv = (u: number, v: number): Vec2 => [\n rect.u0 + (u / rect.metres) * (rect.u1 - rect.u0),\n rect.v0 + (((v % 1) + 1) % 1) * (rect.v1 - rect.v0),\n ];\n const b = new MeshBuilder();\n const n = o.profile.length;\n // Sides: one flat quad per edge, outward normal regardless of winding.\n const sign =\n o.profile.reduce((s, a, i) => {\n const c = o.profile[(i + 1) % n] ?? a;\n return s + a[0] * c[1] - c[0] * a[1];\n }, 0) > 0\n ? 1\n : -1;\n // The extrusion axis flips handedness for 'xz' (Y = Z × X), so outward flips with it.\n const hand = plane === 'xz' ? -1 : 1;\n let run = 0;\n for (let i = 0; i < n; i++) {\n const a = o.profile[i] ?? [0, 0];\n const c = o.profile[(i + 1) % n] ?? a;\n const e: Vec2 = [c[0] - a[0], c[1] - a[1]];\n const len = Math.hypot(e[0], e[1]);\n if (len < 1e-9) continue;\n const n2: Vec2 = [(e[1] / len) * sign, (-e[0] / len) * sign];\n const nrm = normalize(lift(plane, n2, 0));\n const p = [lift(plane, a, d0), lift(plane, c, d0), lift(plane, c, d1), lift(plane, a, d1)];\n const ids = p.map((q, k) =>\n b.vertex({\n p: q,\n n: nrm,\n uv: uv(run + (k === 1 || k === 2 ? len : 0), k >= 2 ? o.depth : 0),\n color: o.color,\n }),\n );\n const [i0 = 0, i1 = 0, i2 = 0, i3 = 0] = ids;\n if (sign * hand > 0) b.quad(i0, i1, i2, i3);\n else b.quad(i0, i3, i2, i1);\n run += len;\n }\n if (o.caps !== false) {\n const tris = triangulate(o.profile);\n for (const [d, s] of [\n [d0, -1],\n [d1, 1],\n ] as const) {\n const nrm = normalize(lift(plane, [0, 0], s));\n const ids = o.profile.map((q) =>\n b.vertex({ p: lift(plane, q, d), n: nrm, uv: uv(q[0], q[1]), color: o.color }),\n );\n for (const [x, y, z] of tris) {\n const [a = 0, c = 0, e = 0] = [ids[x], ids[y], ids[z]];\n if (s * hand > 0) b.tri(a, c, e);\n else b.tri(a, e, c);\n }\n }\n }\n return b.build();\n}\n",
|
|
22
|
+
"// Signed-distance building blocks for `sdf`: exact shape distances (Quílez's formulas), boolean\n// and smooth combinators (noise for `displace`: value-noise.ts). Negative = inside, metres.\n// A field is called once per grid sample, so shapes do scalar maths only (no Vec3 allocation);\n// fields must not keep the `p` they are given (the mesher reuses it).\n\nimport type { Vec3 } from '../core/index.ts';\n\nexport type Field = (p: Vec3) => number;\n\nconst clamp01 = (x: number): number => (x < 0 ? 0 : Math.min(x, 1));\n\n/** Shape distances in the shape's own frame (centre/base at the origin). */\nexport const shapes = {\n sphere: (x: number, y: number, z: number, r: number): number =>\n Math.sqrt(x * x + y * y + z * z) - r,\n ellipsoid(x: number, y: number, z: number, rx: number, ry: number, rz: number): number {\n const k0 = Math.sqrt((x / rx) ** 2 + (y / ry) ** 2 + (z / rz) ** 2);\n const k1 = Math.sqrt((x / (rx * rx)) ** 2 + (y / (ry * ry)) ** 2 + (z / (rz * rz)) ** 2);\n return k1 === 0 ? -Math.min(rx, ry, rz) : (k0 * (k0 - 1)) / k1;\n },\n /** Box of half extents (hx, hy, hz) with edges rounded by `r`. */\n roundBox(x: number, y: number, z: number, hx: number, hy: number, hz: number, r: number): number {\n const qx = Math.abs(x) - hx + r;\n const qy = Math.abs(y) - hy + r;\n const qz = Math.abs(z) - hz + r;\n const ox = Math.max(qx, 0);\n const oy = Math.max(qy, 0);\n const oz = Math.max(qz, 0);\n return Math.sqrt(ox * ox + oy * oy + oz * oz) + Math.min(Math.max(qx, qy, qz), 0) - r;\n },\n /** Segment (0,0,0) → (0,0,len) with radius r. */\n capsule(x: number, y: number, z: number, len: number, r: number): number {\n const t = len > 0 ? Math.min(Math.max(z, 0), len) : 0;\n return Math.sqrt(x * x + y * y + (z - t) * (z - t)) - r;\n },\n /** Capped cone standing on z = 0: base radius r1, top radius r2, height h. */\n cone(x: number, y: number, z: number, r1: number, r2: number, h: number): number {\n const hh = h / 2;\n const qx = Math.sqrt(x * x + y * y);\n const qy = z - hh;\n const cax = qx - Math.min(qx, qy < 0 ? r1 : r2);\n const cay = Math.abs(qy) - hh;\n const k2x = r2 - r1;\n const k2y = 2 * hh;\n const t = clamp01(((r2 - qx) * k2x + (hh - qy) * k2y) / (k2x * k2x + k2y * k2y));\n const cbx = qx - r2 + k2x * t;\n const cby = qy - hh + k2y * t;\n const s = cbx < 0 && cay < 0 ? -1 : 1;\n return s * Math.sqrt(Math.min(cax * cax + cay * cay, cbx * cbx + cby * cby));\n },\n /** Ring in the XY plane: major radius R, tube radius r. */\n torus(x: number, y: number, z: number, R: number, r: number): number {\n const q = Math.sqrt(x * x + y * y) - R;\n return Math.sqrt(q * q + z * z) - r;\n },\n};\n\n/** Polynomial smooth-min weight: 1 → all `a`, 0 → all `b`; k = 0 is a hard min. */\nexport const smoothWeight = (a: number, b: number, k: number): number =>\n k > 0 ? clamp01(0.5 + (0.5 * (b - a)) / k) : a < b ? 1 : 0;\n\n/** Field constructors and combinators, world space. */\nexport const sd = {\n sphere:\n (at: Vec3, r: number): Field =>\n (p) =>\n shapes.sphere(p[0] - at[0], p[1] - at[1], p[2] - at[2], r),\n ellipsoid:\n (at: Vec3, radii: Vec3): Field =>\n (p) =>\n shapes.ellipsoid(p[0] - at[0], p[1] - at[1], p[2] - at[2], radii[0], radii[1], radii[2]),\n /** Axis-aligned box of full `size` centred on `at`, edges rounded by `round`. */\n box:\n (at: Vec3, size: Vec3, round = 0): Field =>\n (p) =>\n shapes.roundBox(\n p[0] - at[0],\n p[1] - at[1],\n p[2] - at[2],\n size[0] / 2,\n size[1] / 2,\n size[2] / 2,\n round,\n ),\n capsule(a: Vec3, b: Vec3, r: number): Field {\n const bx = b[0] - a[0];\n const by = b[1] - a[1];\n const bz = b[2] - a[2];\n const bb = bx * bx + by * by + bz * bz;\n return (p) => {\n const px = p[0] - a[0];\n const py = p[1] - a[1];\n const pz = p[2] - a[2];\n const h = bb > 0 ? clamp01((px * bx + py * by + pz * bz) / bb) : 0;\n return Math.sqrt((px - bx * h) ** 2 + (py - by * h) ** 2 + (pz - bz * h) ** 2) - r;\n };\n },\n cone:\n (at: Vec3, r1: number, r2: number, h: number): Field =>\n (p) =>\n shapes.cone(p[0] - at[0], p[1] - at[1], p[2] - at[2], r1, r2, h),\n torus:\n (at: Vec3, R: number, r: number): Field =>\n (p) =>\n shapes.torus(p[0] - at[0], p[1] - at[1], p[2] - at[2], R, r),\n union:\n (...fs: readonly Field[]): Field =>\n (p) => {\n let d = Number.POSITIVE_INFINITY;\n for (const f of fs) d = Math.min(d, f(p));\n return d;\n },\n intersect:\n (a: Field, b: Field): Field =>\n (p) =>\n Math.max(a(p), b(p)),\n /** a minus b. */\n subtract:\n (a: Field, b: Field): Field =>\n (p) =>\n Math.max(a(p), -b(p)),\n /** Union with a fillet of radius ~k metres between the two. */\n smoothUnion:\n (k: number, a: Field, b: Field): Field =>\n (p) => {\n const da = a(p);\n const db = b(p);\n const h = smoothWeight(da, db, k);\n return db + (da - db) * h - k * h * (1 - h);\n },\n /** a minus b with a rounded crease of ~k metres. */\n smoothSubtract:\n (k: number, a: Field, b: Field): Field =>\n (p) => {\n const da = a(p);\n const db = -b(p);\n const h = smoothWeight(-da, -db, k);\n return da + (db - da) * (1 - h) + k * h * (1 - h);\n },\n /** Push the surface out/in by `amount` metres × noise (∈ [−1, 1]). */\n displace:\n (f: Field, noise: Field, amount: number): Field =>\n (p) =>\n f(p) + amount * noise(p),\n};\n",
|
|
23
|
+
"// One sculpt edit → its distance field (rotated, optionally mirrored across Y) and its bounds.\n// Rotation is precomputed into a 3×3 matrix; evaluation is scalar maths, no allocation.\n\nimport type { Vec3 } from '../core/index.ts';\nimport { invalid } from './check.ts';\nimport { type Field, shapes } from './sdf-ops.ts';\n\nexport type SculptShape = 'sphere' | 'ellipsoid' | 'capsule' | 'roundBox' | 'cone' | 'torus';\n\n/** An edit: one shape, or a group of edits folded on their own first (local trims). */\nexport type SculptEdit = SculptShapeEdit | SculptGroup;\n\n/**\n * Edits folded on their own (from nothing), then applied to the sculpt as ONE edit with this\n * op/blend/colour: subtract or intersect inside the group trims only the group's shapes (a\n * half-sphere eyelid, a hair cap stopped at the hairline) and leaves earlier edits alone.\n */\nexport interface SculptGroup {\n readonly group: readonly SculptEdit[];\n readonly op?: 'add' | 'subtract' | 'intersect';\n readonly blend?: number;\n /** Default colour of the group's own edits (and its colour when it carves). */\n readonly color?: Vec3;\n /** Default mirror for the group's edits. */\n readonly mirror?: boolean;\n}\n\nexport interface SculptShapeEdit {\n readonly shape: SculptShape;\n /** Centre (sphere, ellipsoid, roundBox, torus), base centre (cone) or start (capsule). */\n readonly at: Vec3;\n /**\n * sphere: radius · ellipsoid: [rx, ry, rz] · roundBox: full [x, y, z] · cone: [base radius,\n * top radius, height] along local +Z · torus: [ring radius, tube radius] in local XY ·\n * capsule: radius (segment `at` → `to`).\n */\n readonly size: number | readonly [number, number] | Vec3;\n /** Capsule end point. */\n readonly to?: Vec3;\n /** Degrees about X, then Y, then Z (world axes), around `at`. */\n readonly rotate?: Vec3;\n /** roundBox edge radius, metres. */\n readonly round?: number;\n readonly op?: 'add' | 'subtract' | 'intersect' | 'paint';\n /** Smooth-blend radius in metres (0 = hard edge). For paint: the colour falloff width. */\n readonly blend?: number;\n readonly color?: Vec3;\n /** Override the sculpt's `mirror` for this edit (e.g. one scar). */\n readonly mirror?: boolean;\n}\n\nconst dims = (e: SculptShapeEdit): Vec3 => {\n if (typeof e.size === 'number') return [e.size, e.size, e.size];\n const [a, b, c] = e.size;\n return [a, b, c ?? b];\n};\n\nexport function sculptShape(e: SculptShapeEdit, i: number, mirrorAll: boolean): Field {\n const [a, b, c] = dims(e);\n const where = `sculpt edit ${i} (${e.shape})`;\n if (![a, b, c].every((x) => Number.isFinite(x) && x > 0))\n invalid(`${where}: size has a value ≤ 0`, 'give every size component in metres, > 0');\n if ((e.blend ?? 0) < 0 || !Number.isFinite(e.blend ?? 0))\n invalid(`${where}: blend is ${e.blend}`, 'use a blend radius ≥ 0 m (0.01 = 1 cm fillet)');\n if (e.shape === 'capsule' && !e.to)\n invalid(`${where}: capsule needs \\`to\\``, 'add to: [x, y, z], the far end');\n const [rx, ry, rz] = (e.rotate ?? [0, 0, 0]).map((d) => (d * Math.PI) / 180);\n const [cx, sx, cy, sy, cz, sz] = [\n Math.cos(rx ?? 0),\n Math.sin(rx ?? 0),\n Math.cos(ry ?? 0),\n Math.sin(ry ?? 0),\n Math.cos(rz ?? 0),\n Math.sin(rz ?? 0),\n ];\n // R = Rz · Ry · Rx; local = Rᵀ (p − at).\n const m = [\n cz * cy,\n cz * sy * sx - sz * cx,\n cz * sy * cx + sz * sx,\n sz * cy,\n sz * sy * sx + cz * cx,\n sz * sy * cx - cz * sx,\n -sy,\n cy * sx,\n cy * cx,\n ];\n const [m0 = 1, m1 = 0, m2 = 0, m3 = 0, m4 = 1, m5 = 0, m6 = 0, m7 = 0, m8 = 1] = m;\n const [ox, oy, oz] = e.at;\n const to = e.to ?? e.at;\n const [dx, dy, dz] = [to[0] - ox, to[1] - oy, to[2] - oz];\n const len = Math.sqrt(dx * dx + dy * dy + dz * dz);\n const round = Math.min(e.round ?? 0, a / 2, b / 2, c / 2);\n // The shape kernel in local coordinates, chosen once (no per-call switch).\n const kernel: (x: number, y: number, z: number) => number =\n e.shape === 'sphere'\n ? (x, y, z) => shapes.sphere(x, y, z, a)\n : e.shape === 'ellipsoid'\n ? (x, y, z) => shapes.ellipsoid(x, y, z, a, b, c)\n : e.shape === 'roundBox'\n ? (x, y, z) => shapes.roundBox(x, y, z, a / 2, b / 2, c / 2, round)\n : e.shape === 'cone'\n ? (x, y, z) => shapes.cone(x, y, z, a, b, c)\n : (x, y, z) => shapes.torus(x, y, z, a, b);\n const rotated = e.rotate?.some((d) => d !== 0) ?? false;\n const one =\n e.shape === 'capsule'\n ? (px: number, py: number, pz: number): number => {\n // Capsule in world space along at → to.\n const wx = px - ox;\n const wy = py - oy;\n const wz = pz - oz;\n const t =\n len > 0 ? Math.min(1, Math.max(0, (wx * dx + wy * dy + wz * dz) / (len * len))) : 0;\n return Math.sqrt((wx - dx * t) ** 2 + (wy - dy * t) ** 2 + (wz - dz * t) ** 2) - a;\n }\n : rotated\n ? (px: number, py: number, pz: number): number => {\n const wx = px - ox;\n const wy = py - oy;\n const wz = pz - oz;\n return kernel(\n m0 * wx + m3 * wy + m6 * wz,\n m1 * wx + m4 * wy + m7 * wz,\n m2 * wx + m5 * wy + m8 * wz,\n );\n }\n : // Identity rotation: 1·x + 0·y + 0·z is x, so skipping the product changes no bits.\n (px: number, py: number, pz: number): number => kernel(px - ox, py - oy, pz - oz);\n if (!(e.mirror ?? mirrorAll)) return (p) => one(p[0], p[1], p[2]);\n // Mirrored: min of the shape and its copy across y = 0. Evaluate the nearer copy first; the\n // other only if its bound could undercut it (min is order-free, so this is exact).\n const { c: sc, r: sr, scale, inside } = shapeSphere(e);\n const bound = (dist: number): number => {\n const out = dist - sr;\n return out > 0 ? scale * out : inside ? out : Number.NEGATIVE_INFINITY;\n };\n return (p) => {\n const dx0 = p[0] - sc[0];\n const dz0 = p[2] - sc[2];\n const near = Math.sqrt(dx0 * dx0 + (p[1] - sc[1]) ** 2 + dz0 * dz0);\n const far = Math.sqrt(dx0 * dx0 + (p[1] + sc[1]) ** 2 + dz0 * dz0);\n const [first, second, lb] =\n near <= far ? [p[1], -p[1], bound(far)] : [-p[1], p[1], bound(near)];\n const v = one(p[0], first, p[2]);\n return lb >= v ? v : Math.min(v, one(p[0], second, p[2]));\n };\n}\n\n/**\n * A sphere the shape lies in, and how its field compares with the distance to it: every shape's\n * value v satisfies v ≥ scale · (|p − centre| − radius) outside the sphere (scale 1 = exact SDFs;\n * the ellipsoid approximation only guarantees (r_min / r_max)², and nothing inside its sphere).\n */\nexport function shapeSphere(e: SculptShapeEdit): {\n c: Vec3;\n r: number;\n scale: number;\n inside: boolean;\n} {\n const [a, b, c] = dims(e);\n const to = e.to ?? e.at;\n const centre: Vec3 =\n e.shape === 'capsule'\n ? [(e.at[0] + to[0]) / 2, (e.at[1] + to[1]) / 2, (e.at[2] + to[2]) / 2]\n : e.at;\n const r =\n e.shape === 'sphere'\n ? a\n : e.shape === 'ellipsoid'\n ? Math.max(a, b, c)\n : e.shape === 'roundBox'\n ? Math.hypot(a, b, c) / 2\n : e.shape === 'cone'\n ? c + Math.max(a, b) // loose but unchanged: it also sets the grid bounds\n : e.shape === 'torus'\n ? a + b\n : a + Math.hypot(to[0] - e.at[0], to[1] - e.at[1], to[2] - e.at[2]) / 2;\n const ell = e.shape === 'ellipsoid';\n const lo = Math.min(a, b, c);\n return { c: centre, r, scale: ell ? (lo / r) ** 2 : 1, inside: !ell };\n}\n\n/** Conservative world bounds of an add edit (bounding sphere), grown by its blend radius. */\nexport function editBounds(e: SculptEdit, mirrorAll: boolean): [Vec3, Vec3] {\n if ('group' in e) return groupBounds(e, mirrorAll);\n const { c: centre, r } = shapeSphere(e);\n const g = r + (e.blend ?? 0);\n const lo: [number, number, number] = [centre[0] - g, centre[1] - g, centre[2] - g];\n const hi: [number, number, number] = [centre[0] + g, centre[1] + g, centre[2] + g];\n if (e.mirror ?? mirrorAll) {\n const [l, h] = [lo[1], hi[1]];\n lo[1] = Math.min(l, -h);\n hi[1] = Math.max(h, -l);\n }\n return [lo, hi];\n}\n\nfunction groupBounds(g: SculptGroup, mirrorAll: boolean): [Vec3, Vec3] {\n const lo: [number, number, number] = [Infinity, Infinity, Infinity];\n const hi: [number, number, number] = [-Infinity, -Infinity, -Infinity];\n const k = g.blend ?? 0;\n for (const e of g.group) {\n if ((e.op ?? 'add') !== 'add') continue;\n const [a, b] = editBounds(e, g.mirror ?? mirrorAll);\n for (let i = 0; i < 3; i++) {\n lo[i] = Math.min(lo[i] ?? 0, (a[i] ?? 0) - k);\n hi[i] = Math.max(hi[i] ?? 0, (b[i] ?? 0) + k);\n }\n }\n return [lo, hi];\n}\n",
|
|
24
|
+
"// Sculpt evaluation: the edit list compiled into a tree (groups fold their own edits first) and\n// folded per query point. Sparse: every node carries a bounding sphere with a proven lower bound\n// on its value, and an edit is skipped only when that bound shows its blend weight would be\n// exactly 1 (nothing changes) — so skipping is bit-identical to evaluating, just faster. A weight\n// of 1 passes the running value through untouched (no `v + (d − v)` rounding).\n\nimport type { Vec3 } from '../core/index.ts';\nimport { invalid } from './check.ts';\nimport { type SculptEdit, sculptShape, shapeSphere } from './sculpt-edit.ts';\nimport type { Field } from './sdf-ops.ts';\n\nconst ADD = 0;\nconst SUB = 1;\nconst INTER = 2;\nconst PAINT = 3;\nconst OPS = { add: ADD, subtract: SUB, intersect: INTER, paint: PAINT } as const;\n\nexport interface Node {\n readonly op: number;\n readonly k: number;\n /** The edit's own colour (shapes), or null. */\n readonly color: Vec3 | null;\n readonly shape: Field | null;\n readonly kids: readonly Node[] | null;\n /** Default colour for this group's edits; its scratch colour buffer. */\n readonly base: Vec3;\n readonly rgb: Float64Array;\n // Bound: value ≥ scale · (|p − c| − r) − under outside the sphere (and ≥ |p − c| − r − under\n // inside it when `inside`); `mirror` also tests the sphere mirrored across y = 0.\n readonly c: Vec3;\n readonly r: number;\n readonly scale: number;\n readonly inside: boolean;\n readonly mirror: boolean;\n readonly under: number;\n}\n\nexport function compile(\n edits: readonly SculptEdit[],\n base: Vec3,\n mirror: boolean,\n path = 'sculpt',\n): Node[] {\n if (!edits.some((e) => (e.op ?? 'add') === 'add'))\n invalid(`${path} has no add edits, so nothing to carve from`, \"make the first edit op: 'add'\");\n return edits.map((e, i): Node => {\n const op = OPS[e.op ?? 'add'];\n const k = e.blend ?? 0;\n const m = e.mirror ?? mirror;\n if ('group' in e) {\n const kids = compile(e.group, e.color ?? base, m, `${path} group ${i}`);\n const b = enclose(kids);\n return node(\n op,\n k,\n e.color ?? null,\n null,\n kids,\n e.color ?? base,\n 3,\n b.c,\n b.r,\n b.scale,\n b.inside,\n false,\n b.under,\n );\n }\n const s = shapeSphere(e);\n return node(\n op,\n k,\n e.color ?? null,\n sculptShape(e, i, m),\n null,\n base,\n 0,\n s.c,\n s.r,\n s.scale,\n s.inside,\n m,\n 0,\n );\n });\n}\n\n/** Every node built in one property order: the fold loop stays monomorphic (one hidden class). */\nfunction node(\n op: number,\n k: number,\n color: Vec3 | null,\n shape: Field | null,\n kids: readonly Node[] | null,\n base: Vec3,\n rgb: number,\n c: Vec3,\n r: number,\n scale: number,\n inside: boolean,\n mirror: boolean,\n under: number,\n): Node {\n return {\n op,\n k,\n color,\n shape,\n kids,\n base,\n rgb: new Float64Array(rgb),\n c,\n r,\n scale,\n inside,\n mirror,\n under,\n };\n}\n\n/** One sphere around all add children (and their mirror copies), scale = the weakest child's. */\nfunction enclose(\n kids: readonly Node[],\n): Pick<Node, 'c' | 'r' | 'scale' | 'inside' | 'mirror' | 'under'> {\n const adds = kids.filter((n) => n.op === ADD);\n const spheres = adds.flatMap((n) =>\n n.mirror ? [n, { ...n, c: [n.c[0], -n.c[1], n.c[2]] as Vec3 }] : [n],\n );\n const lo = [0, 1, 2].map((a) => Math.min(...spheres.map((n) => (n.c[a] ?? 0) - n.r)));\n const hi = [0, 1, 2].map((a) => Math.max(...spheres.map((n) => (n.c[a] ?? 0) + n.r)));\n const c: Vec3 = [\n ((lo[0] ?? 0) + (hi[0] ?? 0)) / 2,\n ((lo[1] ?? 0) + (hi[1] ?? 0)) / 2,\n ((lo[2] ?? 0) + (hi[2] ?? 0)) / 2,\n ];\n const r = Math.max(\n ...spheres.map((n) => Math.hypot(n.c[0] - c[0], n.c[1] - c[1], n.c[2] - c[2]) + n.r),\n );\n return {\n c,\n r,\n scale: Math.min(...adds.map((n) => n.scale)),\n inside: adds.every((n) => n.inside),\n mirror: false,\n // Smooth union undershoots the plain min by at most k/4 per blend; children's own undershoot adds.\n under: adds.reduce((u, n) => u + n.k / 4 + n.under, 0),\n };\n}\n\nfunction lowerBound(n: Node, p: Vec3): number {\n const dx = p[0] - n.c[0];\n const dz = p[2] - n.c[2];\n let dy = p[1] - n.c[1];\n let q = dx * dx + dy * dy + dz * dz;\n if (n.mirror) {\n dy = p[1] + n.c[1];\n q = Math.min(q, dx * dx + dy * dy + dz * dz);\n }\n const out = Math.sqrt(q) - n.r;\n if (out > 0) return n.scale * out - n.under;\n return n.inside ? out - n.under : Number.NEGATIVE_INFINITY;\n}\n\nconst clamp01 = (x: number): number => (x < 0 ? 0 : Math.min(x, 1));\n/** Smooth-min weight of `a` against `b` (1 = all a). */\nconst weight = (a: number, b: number, k: number): number =>\n k > 0 ? clamp01(0.5 + (0.5 * (b - a)) / k) : a < b ? 1 : 0;\n/** Margin past which a bound proves the weight is exactly 1, rounding included. */\nconst slack = (d: number): number => 1e-9 * (1 + Math.abs(d));\n\n/** Fold `nodes` at p; writes the blended colour into `rgb` (seeded with `base`) when given. */\nexport function fold(\n nodes: readonly Node[],\n p: Vec3,\n rgb: Float64Array | null,\n base: Vec3,\n sparse = true,\n): number {\n let d = Number.POSITIVE_INFINITY;\n if (rgb) rgb.set(base);\n for (const n of nodes) {\n const k = n.k;\n if (n.op === PAINT) {\n if (!rgb || !n.color || !n.shape) continue;\n const kk = Math.max(k, 1e-9);\n if (sparse && lowerBound(n, p) > kk / 2 + slack(kk)) continue;\n const w = 1 - clamp01(0.5 - n.shape(p) / kk);\n if (w < 1) mix(rgb, n.color, w);\n continue;\n }\n const empty = d === Number.POSITIVE_INFINITY;\n if (empty && n.op !== ADD) continue;\n if (sparse && !empty) {\n if (n.op === ADD && lowerBound(n, p) > d + k + slack(d)) continue;\n if (n.op === SUB && lowerBound(n, p) > k - d + slack(d)) continue;\n }\n const v = n.kids\n ? fold(n.kids, p, rgb ? n.rgb : null, n.base, sparse)\n : n.shape\n ? n.shape(p)\n : 0;\n let w = 0;\n if (empty) d = v;\n else if (n.op === ADD) {\n w = weight(d, v, k);\n if (w !== 1) d = v + (d - v) * w - k * w * (1 - w);\n } else {\n // subtract = smooth max(d, −v); intersect = smooth max(d, v).\n const b = n.op === SUB ? -v : v;\n w = weight(-d, -b, k);\n if (w !== 1) d = -(-b + (-d + b) * w - k * w * (1 - w));\n }\n if (!rgb || w >= 1) continue;\n if (n.kids) {\n if (n.color || n.op === ADD) mixArr(rgb, n.rgb, w);\n } else if (n.color || n.op === ADD) mix(rgb, n.color ?? base, w);\n }\n return d;\n}\n\nconst mix = (rgb: Float64Array, c: Vec3, w: number): void => {\n for (let j = 0; j < 3; j++) rgb[j] = (c[j] ?? 0) + ((rgb[j] ?? 0) - (c[j] ?? 0)) * w;\n};\nconst mixArr = (rgb: Float64Array, c: Float64Array, w: number): void => {\n for (let j = 0; j < 3; j++) rgb[j] = (c[j] ?? 0) + ((rgb[j] ?? 0) - (c[j] ?? 0)) * w;\n};\n",
|
|
25
|
+
"// Samples a signed-distance field on a cubic grid for the meshers. The field is clipped to the\n// bounds box (max with the box's own distance), and the grid has a one-cell positive border, so\n// every surface comes out closed. Sparse: one coarse sample per 8³-cell block; a block whose\n// centre is farther from the surface than `lipschitz` × its half-diagonal cannot hold any of it,\n// so its points take that sign without evaluating the field (a head at 4 mm meshes in ~1 s).\n\nimport type { Vec3 } from '../core/index.ts';\nimport { invalid } from './check.ts';\nimport type { Field } from './sdf-ops.ts';\n\nexport interface Grid {\n /** Points per axis. */\n readonly nx: number;\n readonly ny: number;\n readonly nz: number;\n /** Position of point (0, 0, 0) and the cell edge, metres. */\n readonly origin: Vec3;\n readonly h: number;\n readonly values: Float32Array;\n /** The clipped field the grid sampled (normals take its gradient). */\n readonly field: Field;\n}\n\n/** Grid points above this are refused (≈ 80 MB of samples). */\nexport const MAX_POINTS = 1 << 24;\nconst BLOCK = 4;\n\nexport function sampleGrid(\n raw: Field,\n bounds: readonly [Vec3, Vec3],\n h: number,\n lipschitz: number,\n symmetricY = false,\n): Grid {\n const [lo0, hi0] = bounds;\n if (!Number.isFinite(h) || h <= 0)\n invalid(\n `sdf resolution is ${h}`,\n 'pass the cell edge in metres, e.g. ctx.pick([0.004, 0.012, 0.03])',\n );\n if (\n ![0, 1, 2].every((k) => Number.isFinite(lo0[k] ?? Number.NaN) && (hi0[k] ?? 0) > (lo0[k] ?? 0))\n )\n invalid(\n `sdf bounds [${lo0.join(', ')}] → [${hi0.join(', ')}] are empty or inverted`,\n 'give bounds as [min, max] corners with max > min on every axis, in metres',\n );\n // Mirror-symmetric shapes: bounds ±m cells in y, so y = 0 is a grid plane and every sample\n // has its mirror twin at exactly (j − m − 1) · h — the mesh comes out symmetric.\n const m = Math.ceil(Math.max(Math.abs(lo0[1]), Math.abs(hi0[1])) / h);\n const lo: Vec3 = symmetricY ? [lo0[0], -m * h, lo0[2]] : lo0;\n const hi: Vec3 = symmetricY ? [hi0[0], m * h, hi0[2]] : hi0;\n const size = (k: number): number => Math.ceil(((hi[k] ?? 0) - (lo[k] ?? 0)) / h) + 3;\n const [nx, ny, nz] = [size(0), symmetricY ? 2 * m + 3 : size(1), size(2)];\n const yAt = (j: number): number => (symmetricY ? (j - m - 1) * h : lo[1] - h + j * h);\n if (nx * ny * nz > MAX_POINTS) {\n const vol = [0, 1, 2].reduce((v, k) => v * ((hi[k] ?? 0) - (lo[k] ?? 0)), 1);\n invalid(\n `sdf grid ${nx}×${ny}×${nz} exceeds ${MAX_POINTS} points at ${h} m cells`,\n `use cells ≥ ${Math.cbrt(vol / MAX_POINTS).toPrecision(2)} m, or tighten the bounds`,\n );\n }\n const cx = (lo[0] + hi[0]) / 2;\n const cy = (lo[1] + hi[1]) / 2;\n const cz = (lo[2] + hi[2]) / 2;\n const [bx, by, bz] = [(hi[0] - lo[0]) / 2, (hi[1] - lo[1]) / 2, (hi[2] - lo[2]) / 2];\n const field: Field = (p) => {\n const qx = Math.abs(p[0] - cx) - bx;\n const qy = Math.abs(p[1] - cy) - by;\n const qz = Math.abs(p[2] - cz) - bz;\n const box =\n Math.hypot(Math.max(qx, 0), Math.max(qy, 0), Math.max(qz, 0)) +\n Math.min(Math.max(qx, qy, qz), 0);\n const f = raw(p);\n if (Number.isNaN(f))\n invalid(\n `sdf field returned NaN at [${p.join(', ')}]`,\n 'make the field return a finite distance everywhere in bounds',\n );\n return Math.max(f, box);\n };\n const origin: Vec3 = [lo[0] - h, symmetricY ? -(m + 1) * h : lo[1] - h, lo[2] - h];\n const values = new Float32Array(nx * ny * nz);\n const exact = new Uint8Array(nx * ny * nz);\n const [kx, ky, kz] = [\n Math.ceil((nx - 1) / BLOCK),\n Math.ceil((ny - 1) / BLOCK),\n Math.ceil((nz - 1) / BLOCK),\n ];\n const coarse = new Float32Array(kx * ky * kz);\n const p: [number, number, number] = [0, 0, 0];\n const floor = h * 0.01;\n const reach = lipschitz * BLOCK * h * Math.sqrt(3) * 0.5 + h;\n for (let k = 0; k < kz; k++)\n for (let j = 0; j < ky; j++)\n for (let i = 0; i < kx; i++) {\n p[0] = origin[0] + (i + 0.5) * BLOCK * h;\n p[1] = origin[1] + (j + 0.5) * BLOCK * h;\n p[2] = origin[2] + (k + 0.5) * BLOCK * h;\n const v = field(p);\n coarse[i + kx * (j + ky * k)] = v;\n if (Math.abs(v) > reach) continue;\n // Near the surface: every point of this block (faces included) is sampled exactly.\n for (let z = k * BLOCK; z <= Math.min(nz - 1, (k + 1) * BLOCK); z++)\n for (let y = j * BLOCK; y <= Math.min(ny - 1, (j + 1) * BLOCK); y++)\n for (let x = i * BLOCK; x <= Math.min(nx - 1, (i + 1) * BLOCK); x++)\n exact[x + nx * (y + ny * z)] = 1;\n }\n for (let z = 0; z < nz; z++)\n for (let y = 0; y < ny; y++)\n for (let x = 0; x < nx; x++) {\n const id = x + nx * (y + ny * z);\n if (exact[id]) {\n p[0] = origin[0] + x * h;\n p[1] = yAt(y);\n p[2] = origin[2] + z * h;\n const f = field(p);\n // A sample (near) zero puts vertices of several cells on one grid point: marching cubes\n // then emits slivers. Keep |value| ≥ 1% of a cell (moves the surface ≤ h / 100).\n values[id] = Math.abs(f) >= floor ? f : f < 0 ? -floor : floor;\n } else {\n const b =\n Math.min(kx - 1, Math.floor(x / BLOCK)) +\n kx *\n (Math.min(ky - 1, Math.floor(y / BLOCK)) +\n ky * Math.min(kz - 1, Math.floor(z / BLOCK)));\n values[id] = coarse[b] ?? 1;\n }\n }\n return { nx, ny, nz, origin, h, values, field };\n}\n",
|
|
26
|
+
"// Marching-cubes triangle table (Lorensen & Cline 1987; Paul Bourke's public-domain listing,\n// as shipped by three.js): case → edge triples, one hex digit per edge, cases joined by '.'.\n// Corner bit i set = corner i inside. Corners/edges follow Bourke's numbering (marching-cubes.ts).\n\nconst PACKED =\n '.083.019.183981.12a.08312a.92a029.2832a8a98.3b2.0b28b0.19023b.1b219b98b.3a1ba3.0a108a8ba.3' +\n '903b9ba9.98aa8b.478.430734.019847.419471731.12a847.34730412a.92a902847.2a9297273794.8473b2' +\n '.b47b24204.90184723b.47b94b9b2921.3a13ba784.1ba14b1047b4.47890b9bab03.47b4b99ba.954.954083' +\n '.054150.854835315.12a954.30812a495.52a542402.2a5325354348.95423b.0b208b495.05401523b.21525' +\n '828b485.a3ba13954.4950818a18ba.54050b5bab03.54858aa8b.978579.930953573.078017157.153357.97' +\n '8957a12.a12950530573.802825857a52.2a5253357.7957893b2.95797292027b.23b018178157.b21b17715.' +\n '958857a13a3b.5705097b010aba0.ba0b03a50807570.ba57b5.a65.0835a6.9015a6.1831985a6.165261.165' +\n '126308.965906026.598582526328.23ba65.b08b20a65.01923b5a6.5a61929b298b.63b653513.08b0b50515' +\n 'b6.3b6036065059.65969bb98.5a6478.43047365a.1905a6847.a65197173794.612651478.125526304347.8' +\n '47905065026.739794329596269.3b2784a65.5a647242027b.01947823b5a6.9219b294b7b45a6.8473b53515' +\n 'b6.51b5b610b7b404b.059065036b63847.65969b4797b9.a4964a.4a649a083.a01a60640.83181686461a.14' +\n '9124264.308129249264.024426.832824426.a49a64b23.08228b49a4a6.3b201606461a.64161a48121b8b1.' +\n '964936913b63.8b1810b61914641.3b6360064.648b68.7a678a89a.0730a709a67a.a671a7178180.a67a7117' +\n '3.126168189867.269291679093739.780706602.732672.23ba68a89867.20727b09767a9a7.1801781a767a2' +\n '3b.b21b17a61671.896867916b63136.091b67.7807063b0b60.7b6.76b.308b76.019b76.819831b76.a126b7' +\n '.12a3086b7.2902a96b7.6b72a3a83a98.723627.708760620.276237019.162186198876.a76a17137.a7617a' +\n '187108.03707a0a96a7.76a7a88a9.684b86.36b306046.86b846901.946963931b36.6846b82a1.12a30b06b0' +\n '46.4b846b0292a9.a93a32943b36463.823842462.042462.190234246438.194142246.8138618466a1.a10a0' +\n '6604.4634386a3039a93.a946a4.49576b.083495b76.50154076b.b76834354315.954a1276b.6b712a083495' +\n '.76b54a42a402.348354325a52b76.723762549.954086062687.362376150540.628687218485158.954a1617' +\n '6137.16a176107870954.40a4a503a6a737a.76a7a854a48a.6956b9b89.36b063056095.0b805b01556b.6b36' +\n '35531.12a95b9b8b56.0b306b09656912a.b85b56805a52025.6b36352a3a53.589528562382.956960062.158' +\n '180568382628.156216.13616a386569896.a10a06950560.03856a.a56.b5a75b.b5ab75830.5b75ab190.a75' +\n 'ab7981831.b12b71751.08312717572b.9759279022b7.75272b592328982.25a235375.820852875a25.9015a' +\n '35373a2.982921872a25752.135375.087071175.903935537.987597.5845a8ab8.5045b05abb30.01984a8ab' +\n 'a45.ab4a45b34941314.2512852b8458.04b0b345b2b151b.0250592b5458b85.9452b3.25a352345384.5a252' +\n '4420.3a235a385458019.5a2524192942.845853351.045105.845853905035.945.4b749b9ab.0834979b79ab' +\n '.1ab1b414074b.3143481a474bab4.4b79b492b912.9749b791b2b1083.b74b42240.b74b42834324.29a27923' +\n '7749.9a7974a27870207.37a3a274a1a040a.1a2874.491417713.491417081871.403743.487.9a8ab8.30939' +\n 'bb9a.01a0a88ab.31ab3a.12b1b99b8.30939b1292b9.02b80b.32b.23828aa89.9a2092.23828a0181a8.1a2.' +\n '138918.091.038.';\n\n/** TRI[c] = flat edge-index list for cube case c (length a multiple of 3). */\nexport const TRI: readonly (readonly number[])[] = PACKED.split('.').map((c) =>\n [...c].map((h) => Number.parseInt(h, 16)),\n);\n",
|
|
27
|
+
"// Meshers over a sampled grid (inside = value < 0). Both return positions + triangle indices\n// wound CCW seen from outside; sdf.ts adds normals, UVs and colour.\n// nets: naive surface nets — one vertex per surface cell (mean of its edge crossings), one quad\n// per sign-changing grid edge: triangles = 2 × crossing edges. Even, well-shaped\n// triangles, ~half of marching cubes' count, smooth by construction: the organic default.\n// cubes: marching cubes (Lorensen & Cline) — vertices on the grid edges, the classic table.\n\nimport { TRI } from './mc-table.ts';\nimport type { Grid } from './sdf-grid.ts';\n\nexport interface RawSurface {\n readonly pos: number[];\n readonly tris: number[];\n}\n\n// Cube corners (Bourke numbering) and the 12 edges as corner pairs.\nconst CORNER = [0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1];\nconst EDGE = [0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7];\n\nexport function surfaceNets(g: Grid): RawSurface {\n const { nx, ny, nz, values: v, h, origin: o } = g;\n const cells = new Int32Array((nx - 1) * (ny - 1) * (nz - 1)).fill(-1);\n const pos: number[] = [];\n const c = new Float64Array(8);\n for (let z = 0; z < nz - 1; z++)\n for (let y = 0; y < ny - 1; y++)\n for (let x = 0; x < nx - 1; x++) {\n let mask = 0;\n for (let k = 0; k < 8; k++) {\n const val =\n v[\n x +\n (CORNER[k * 3] ?? 0) +\n nx * (y + (CORNER[k * 3 + 1] ?? 0) + ny * (z + (CORNER[k * 3 + 2] ?? 0)))\n ] ?? 1;\n c[k] = val;\n if (val < 0) mask |= 1 << k;\n }\n if (mask === 0 || mask === 255) continue;\n let sx = 0;\n let sy = 0;\n let sz = 0;\n let n = 0;\n for (let e = 0; e < 12; e++) {\n const a = EDGE[e * 2] ?? 0;\n const b = EDGE[e * 2 + 1] ?? 0;\n const va = c[a] ?? 0;\n const vb = c[b] ?? 0;\n if (va < 0 === vb < 0) continue;\n const t = va / (va - vb);\n sx += (CORNER[a * 3] ?? 0) + t * ((CORNER[b * 3] ?? 0) - (CORNER[a * 3] ?? 0));\n sy +=\n (CORNER[a * 3 + 1] ?? 0) + t * ((CORNER[b * 3 + 1] ?? 0) - (CORNER[a * 3 + 1] ?? 0));\n sz +=\n (CORNER[a * 3 + 2] ?? 0) + t * ((CORNER[b * 3 + 2] ?? 0) - (CORNER[a * 3 + 2] ?? 0));\n n++;\n }\n cells[x + (nx - 1) * (y + (ny - 1) * z)] = pos.length / 3;\n pos.push(o[0] + (x + sx / n) * h, o[1] + (y + sy / n) * h, o[2] + (z + sz / n) * h);\n }\n const tris: number[] = [];\n const cell = (x: number, y: number, z: number): number =>\n cells[x + (nx - 1) * (y + (ny - 1) * z)] ?? 0;\n const P = (i: number, k: number): number => pos[i * 3 + k] ?? 0;\n /** Unit normal of triangle (a, b, c) written into n. */\n const n1 = new Float64Array(3);\n const n2 = new Float64Array(3);\n const normal = (a: number, b: number, c: number, n: Float64Array): void => {\n const ex = P(b, 0) - P(a, 0);\n const ey = P(b, 1) - P(a, 1);\n const ez = P(b, 2) - P(a, 2);\n const fx = P(c, 0) - P(a, 0);\n const fy = P(c, 1) - P(a, 1);\n const fz = P(c, 2) - P(a, 2);\n const x = ey * fz - ez * fy;\n const y = ez * fx - ex * fz;\n const z = ex * fy - ey * fx;\n const l = Math.sqrt(x * x + y * y + z * z) || 1;\n n[0] = x / l;\n n[1] = y / l;\n n[2] = z / l;\n };\n const flatness = (): number =>\n (n1[0] ?? 0) * (n2[0] ?? 0) + (n1[1] ?? 0) * (n2[1] ?? 0) + (n1[2] ?? 0) * (n2[2] ?? 0);\n const quad = (a: number, b: number, cc: number, d: number, out: boolean): void => {\n const [q0, q1, q2, q3] = out ? [a, b, cc, d] : [a, d, cc, b];\n // Split along the diagonal whose two triangles fold least (no creases on thin features).\n normal(q0, q1, q2, n1);\n normal(q0, q2, q3, n2);\n const along02 = flatness();\n normal(q0, q1, q3, n1);\n normal(q1, q2, q3, n2);\n if (along02 >= flatness()) tris.push(q0, q1, q2, q0, q2, q3);\n else tris.push(q0, q1, q3, q1, q2, q3);\n };\n for (let z = 1; z < nz - 1; z++)\n for (let y = 1; y < ny - 1; y++)\n for (let x = 1; x < nx - 1; x++) {\n const inside = (v[x + nx * (y + ny * z)] ?? 1) < 0;\n // Edge +X: cells around it in the (y, z) plane, CCW seen from +X.\n if (x < nx - 1 && inside !== (v[x + 1 + nx * (y + ny * z)] ?? 1) < 0)\n quad(cell(x, y - 1, z - 1), cell(x, y, z - 1), cell(x, y, z), cell(x, y - 1, z), inside);\n if (y < ny - 1 && inside !== (v[x + nx * (y + 1 + ny * z)] ?? 1) < 0)\n quad(cell(x - 1, y, z - 1), cell(x - 1, y, z), cell(x, y, z), cell(x, y, z - 1), inside);\n if (z < nz - 1 && inside !== (v[x + nx * (y + ny * (z + 1))] ?? 1) < 0)\n quad(cell(x - 1, y - 1, z), cell(x, y - 1, z), cell(x, y, z), cell(x - 1, y, z), inside);\n }\n return { pos, tris };\n}\n\nexport function marchingCubes(g: Grid): RawSurface {\n const { nx, ny, nz, values: v, h, origin: o } = g;\n const shared = new Map<number, number>();\n const pos: number[] = [];\n const tris: number[] = [];\n for (let z = 0; z < nz - 1; z++)\n for (let y = 0; y < ny - 1; y++)\n for (let x = 0; x < nx - 1; x++) {\n let mask = 0;\n for (let k = 0; k < 8; k++)\n if (\n (v[\n x +\n (CORNER[k * 3] ?? 0) +\n nx * (y + (CORNER[k * 3 + 1] ?? 0) + ny * (z + (CORNER[k * 3 + 2] ?? 0)))\n ] ?? 1) < 0\n )\n mask |= 1 << k;\n const list = TRI[mask] ?? [];\n for (let t = 0; t < list.length; t += 3)\n for (const j of [0, 2, 1]) {\n const e = list[t + j] ?? 0;\n const a = EDGE[e * 2] ?? 0;\n const b = EDGE[e * 2 + 1] ?? 0;\n const ax = x + (CORNER[a * 3] ?? 0);\n const ay = y + (CORNER[a * 3 + 1] ?? 0);\n const az = z + (CORNER[a * 3 + 2] ?? 0);\n const bx = x + (CORNER[b * 3] ?? 0);\n const by = y + (CORNER[b * 3 + 1] ?? 0);\n const bz = z + (CORNER[b * 3 + 2] ?? 0);\n const ia = ax + nx * (ay + ny * az);\n const ib = bx + nx * (by + ny * bz);\n const lowId = Math.min(ia, ib);\n const key = lowId * 3 + (ax !== bx ? 0 : ay !== by ? 1 : 2);\n let id = shared.get(key);\n if (id === undefined) {\n const va = v[ia] ?? 0;\n const s = va / (va - (v[ib] ?? 0));\n id = pos.length / 3;\n pos.push(\n o[0] + (ax + s * (bx - ax)) * h,\n o[1] + (ay + s * (by - ay)) * h,\n o[2] + (az + s * (bz - az)) * h,\n );\n shared.set(key, id);\n }\n tris.push(id);\n }\n }\n return { pos, tris };\n}\n",
|
|
28
|
+
"// A signed-distance field meshed into a closed surface: rocks, boulders, terrain lumps, sculpted\n// heads (sculpt.ts builds the field). SMOOTH normals from the field gradient (central differences),\n// shared vertices. `resolution` is the cell edge in METRES, the LOD knob:\n// `ctx.pick([0.01, 0.03, 0.08])`. Default mesher is surface nets (see surface-nets.ts for why);\n// `mesher: 'cubes'` for marching cubes. UVs: planar along the normal's dominant axis, U at true\n// metres, V mirrored every band so it never leaves the strip.\n// triangles = 2 × grid edges the surface crosses (nets) ≈ 2 · area / resolution² · 1.5\n\nimport { type Mesh, MeshBuilder, type Vec3 } from '../core/index.ts';\nimport { type StripId, stripRect } from '../material/index.ts';\nimport { invalid } from './check.ts';\nimport { sampleGrid } from './sdf-grid.ts';\nimport { mirroredV, stripU, stripVMetres } from './strip-uv.ts';\nimport { marchingCubes, surfaceNets } from './surface-nets.ts';\n\n/** One colour, or one per vertex from its position and unit normal (moss on top, dark in cracks). */\nexport type SdfColor = Vec3 | ((p: Vec3, n: Vec3) => Vec3);\n\nexport interface SdfOptions {\n /** Signed distance in metres: negative inside. Must not keep the `p` it is given. */\n readonly field: (p: Vec3) => number;\n /** [min, max] corners; the surface is clipped to this box, so it is always closed. */\n readonly bounds: readonly [Vec3, Vec3];\n /** Cell edge in metres (the LOD knob). */\n readonly resolution: number;\n readonly color: SdfColor;\n readonly strip?: StripId;\n readonly mesher?: 'nets' | 'cubes';\n /** Upper bound on |∇field| (1 for exact distances). Raise it for strongly displaced fields so\n * the sparse pass never skips a block that holds surface. Default 1.25. */\n readonly lipschitz?: number;\n /** 'y': the field is mirror-symmetric across y = 0 — snap the grid so the mesh is too. */\n readonly symmetry?: 'y';\n}\n\nexport function sdf(o: SdfOptions): Mesh {\n const lip = o.lipschitz ?? 1.25;\n if (!(lip >= 1)) invalid(`sdf lipschitz is ${lip}`, 'use ≥ 1 (1 = exact distance field)');\n const g = sampleGrid(o.field, o.bounds, o.resolution, lip, o.symmetry === 'y');\n const raw = o.mesher === 'cubes' ? marchingCubes(g) : surfaceNets(g);\n if (raw.tris.length === 0)\n invalid(\n 'sdf field has no surface inside its bounds (never crosses zero)',\n 'return negative distances inside the shape, positive outside, and make bounds contain it',\n );\n const strip = o.strip ?? 'plain';\n const rect = stripRect(strip);\n const vm = stripVMetres(strip);\n const e = g.h * 0.5;\n const q: [number, number, number] = [0, 0, 0];\n const at = (x: number, y: number, z: number): number => {\n q[0] = x;\n q[1] = y;\n q[2] = z;\n return g.field(q);\n };\n const b = new MeshBuilder();\n for (let i = 0; i < raw.pos.length; i += 3) {\n const x = raw.pos[i] ?? 0;\n const y = raw.pos[i + 1] ?? 0;\n const z = raw.pos[i + 2] ?? 0;\n const gx = at(x + e, y, z) - at(x - e, y, z);\n const gy = at(x, y + e, z) - at(x, y - e, z);\n const gz = at(x, y, z + e) - at(x, y, z - e);\n const gl = Math.sqrt(gx * gx + gy * gy + gz * gz);\n const n: Vec3 = gl > 0 ? [gx / gl, gy / gl, gz / gl] : [0, 0, 1];\n const ax = Math.abs(n[0]);\n const ay = Math.abs(n[1]);\n const az = Math.abs(n[2]);\n // Project onto the plane facing the normal's dominant axis; V runs with world up on walls.\n const [s, t] = az >= ax && az >= ay ? [x, y] : ax >= ay ? [y, z] : [x, z];\n const p: Vec3 = [x, y, z];\n b.vertex({\n p,\n n,\n uv: [stripU(rect, s), mirroredV(rect, t, vm)],\n color: typeof o.color === 'function' ? o.color(p, n) : o.color,\n });\n }\n for (let i = 0; i < raw.tris.length; i += 3)\n b.tri(raw.tris[i] ?? 0, raw.tris[i + 1] ?? 0, raw.tris[i + 2] ?? 0);\n return b.build();\n}\n",
|
|
29
|
+
"// Sculpting as an ordered list of SDF edits (the Dreams model): each edit adds, subtracts,\n// intersects or paints a simple shape, blended into everything before it by a smooth-min of\n// radius `blend` metres. Colour rides the same blend weights, so skin, lips, eye whites and tusks\n// come out as vertex colour on ONE mesh. `mirror: 'y'` makes every edit symmetric left/right\n// (Y in our Z-up, +X-front frame); an edit can opt out. Meshed by `sdf` (smooth gradient normals),\n// bounds found from the edits. `resolution` = cell edge in metres: ctx.pick([0.004, 0.012, 0.03]).\n// `sculptField` exposes the field + colour so a recipe can displace it before meshing.\n\nimport type { Mesh, Vec3 } from '../core/index.ts';\nimport type { StripId } from '../material/index.ts';\nimport { invalid } from './check.ts';\nimport { editBounds, type SculptEdit } from './sculpt-edit.ts';\nimport { compile, fold } from './sculpt-tree.ts';\nimport { sdf } from './sdf.ts';\nimport type { Field } from './sdf-ops.ts';\n\nexport type { SculptEdit, SculptGroup, SculptShape, SculptShapeEdit } from './sculpt-edit.ts';\n\nexport interface SculptField {\n readonly field: Field;\n /** Blended edit colour at a point (call at surface points). */\n readonly colorAt: (p: Vec3) => Vec3;\n /** Edits' bounds grown by their blend radii. */\n readonly bounds: readonly [Vec3, Vec3];\n}\n\nexport interface SculptOptions {\n readonly edits: readonly SculptEdit[];\n /** Cell edge in metres (the LOD knob). */\n readonly resolution: number;\n /** Colour of edits that give none. */\n readonly color: Vec3;\n readonly mirror?: 'y';\n readonly mesher?: 'nets' | 'cubes';\n readonly strip?: StripId;\n}\n\nexport function sculptField(\n edits: readonly SculptEdit[],\n o: { readonly color: Vec3; readonly mirror?: 'y' },\n): SculptField {\n if (edits.length === 0)\n invalid('sculpt has no edits', \"start with an { shape: 'sphere', op: 'add', ... } edit\");\n const nodes = compile(edits, o.color, o.mirror === 'y');\n const rgb = new Float64Array(3);\n const adds = edits.filter((e) => (e.op ?? 'add') === 'add');\n const lo = [Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY];\n const hi = [Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY];\n for (const e of adds) {\n const [a, b] = editBounds(e, o.mirror === 'y');\n for (let k = 0; k < 3; k++) {\n lo[k] = Math.min(lo[k] ?? 0, a[k] ?? 0);\n hi[k] = Math.max(hi[k] ?? 0, b[k] ?? 0);\n }\n }\n return {\n field: (p) => fold(nodes, p, null, o.color),\n colorAt: (p) => {\n fold(nodes, p, rgb, o.color);\n return [rgb[0] ?? 0, rgb[1] ?? 0, rgb[2] ?? 0];\n },\n bounds: [\n [lo[0] ?? 0, lo[1] ?? 0, lo[2] ?? 0],\n [hi[0] ?? 0, hi[1] ?? 0, hi[2] ?? 0],\n ],\n };\n}\n\nexport function sculpt(o: SculptOptions): Mesh {\n const s = sculptField(o.edits, { color: o.color, ...(o.mirror ? { mirror: o.mirror } : {}) });\n return sdf({\n field: s.field,\n bounds: s.bounds,\n resolution: o.resolution,\n color: (p) => s.colorAt(p),\n ...(o.mesher ? { mesher: o.mesher } : {}),\n ...(o.mirror === 'y' ? { symmetry: 'y' as const } : {}),\n ...(o.strip ? { strip: o.strip } : {}),\n });\n}\n",
|
|
30
|
+
"// Parallel-transport frames along a polyline (double reflection, Wang et al. 2008): the section\n// never twist-flips at inflections the way Frenet frames do. Shared by `sweep` and by kinds that\n// must place things exactly on a swept surface (leaves on twigs, children on branches).\n\nimport { Ts23dError, type Vec3 } from '../core/index.ts';\n\nexport interface SweepFrame {\n /** Unit tangent. */\n readonly t: Vec3;\n /** Unit normal: section X. */\n readonly n: Vec3;\n /** Unit binormal t × n: section Y. */\n readonly b: Vec3;\n}\n\nconst sub = (a: Vec3, b: Vec3): Vec3 => [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\nconst dot = (a: Vec3, b: Vec3): number => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\nconst unit = (a: Vec3): Vec3 => {\n const l = Math.hypot(a[0], a[1], a[2]) || 1;\n return [a[0] / l, a[1] / l, a[2] / l];\n};\nconst cross = (a: Vec3, b: Vec3): Vec3 => [\n a[1] * b[2] - a[2] * b[1],\n a[2] * b[0] - a[0] * b[2],\n a[0] * b[1] - a[1] * b[0],\n];\nconst reflect = (v: Vec3, axis: Vec3, c: number): Vec3 => {\n const k = (2 / c) * dot(axis, v);\n return [v[0] - k * axis[0], v[1] - k * axis[1], v[2] - k * axis[2]];\n};\n\n/** Throws unless the path has ≥ 2 points and no zero-length segment. Returns cumulative lengths. */\nexport function arcLengths(path: readonly Vec3[]): number[] {\n if (path.length < 2) {\n throw new Ts23dError('T3D_RECIPE_INVALID', {\n cause: `sweep path has ${path.length} point(s)`,\n fix: 'pass at least 2 path points (from → to); a single point has no direction to sweep along',\n });\n }\n const s = [0];\n for (let i = 1; i < path.length; i++) {\n const d = Math.hypot(...sub(path[i] ?? [0, 0, 0], path[i - 1] ?? [0, 0, 0]));\n if (d < 1e-9) {\n throw new Ts23dError('T3D_RECIPE_INVALID', {\n cause: `sweep path points ${i - 1} and ${i} coincide (zero-length segment)`,\n fix: 'make consecutive path points distinct — drop duplicates before sweeping',\n });\n }\n s.push((s[i - 1] ?? 0) + d);\n }\n return s;\n}\n\n/**\n * One frame per path point. The first normal comes from world X when the path starts near\n * vertical, else world Z, so a path in the XZ plane keeps b = ±Y all the way (trunk widths\n * measured across Y stay exact).\n */\nexport function transportFrames(path: readonly Vec3[]): SweepFrame[] {\n arcLengths(path);\n const last = path.length - 1;\n const tangents = path.map((_, i) =>\n unit(sub(path[Math.min(last, i + 1)] ?? [0, 0, 0], path[Math.max(0, i - 1)] ?? [0, 0, 0])),\n );\n const t0 = tangents[0] ?? [0, 0, 1];\n const ref: Vec3 = Math.abs(t0[2]) > 0.9 ? [1, 0, 0] : [0, 0, 1];\n const k = dot(ref, t0);\n let n = unit([ref[0] - k * t0[0], ref[1] - k * t0[1], ref[2] - k * t0[2]]);\n const out: SweepFrame[] = [{ t: t0, n, b: cross(t0, n) }];\n for (let i = 1; i <= last; i++) {\n const p0 = path[i - 1] ?? [0, 0, 0];\n const p1 = path[i] ?? [0, 0, 0];\n const ti = tangents[i - 1] ?? t0;\n const tj = tangents[i] ?? t0;\n const v1 = sub(p1, p0);\n const c1 = dot(v1, v1);\n const nL = reflect(n, v1, c1);\n const tL = reflect(ti, v1, c1);\n const v2 = sub(tj, tL);\n const c2 = dot(v2, v2);\n n = unit(c2 < 1e-12 ? nL : reflect(nL, v2, c2));\n out.push({ t: tj, n, b: cross(tj, n) });\n }\n return out;\n}\n",
|
|
31
|
+
"// Sweep a closed 2D section along a 3D polyline: branches, trunks, roots, pipes, cables, handrails.\n// SMOOTH normals (a swept tube reads as round; caps are flat). Parallel-transport frames, so no\n// twist flip. Positions are absolute: the path is in the caller's space (no `at`). UVs: U runs\n// along the path in true metres (the strip's tiling axis, like `planar`/`tiled`); V goes once\n// around the section inside the strip's band. Triangles = 2·S·(P−1) + S per cap (S section\n// points, P path points).\n\nimport { type Mesh, MeshBuilder, Ts23dError, type Vec2, type Vec3 } from '../core/index.ts';\nimport { type StripId, stripRect } from '../material/index.ts';\nimport { arcLengths, transportFrames } from './transport.ts';\n\nexport interface SweepOptions {\n /** Closed section in the frame's (normal, binormal) plane, either winding; or a circle. */\n readonly section: readonly Vec2[] | { readonly radius: number; readonly segments: number };\n readonly path: readonly Vec3[];\n /** Section scale per path point (taper). Default 1 everywhere. */\n readonly scale?: readonly number[];\n /** Total section rotation from first to last point, degrees, spread by arc length. */\n readonly twist?: number;\n readonly color: Vec3;\n readonly strip?: StripId;\n /** Close the ends with fans about the path point: both, or just one. */\n readonly caps?: boolean | 'start' | 'end';\n}\n\ninterface Section {\n readonly pts: readonly Vec2[];\n /** Outward 2D vertex normals. */\n readonly nrm: readonly Vec2[];\n}\n\nfunction section(s: SweepOptions['section']): Section {\n if (!Array.isArray(s)) {\n const c = s as { radius: number; segments: number };\n if (c.segments < 3 || !(c.radius > 0)) {\n throw new Ts23dError('T3D_RECIPE_INVALID', {\n cause: `sweep circle section has radius ${c.radius} and ${c.segments} segments`,\n fix: 'use radius > 0 and segments >= 3 (pick segments from ctx.lod: e.g. 8 / 5 / 3)',\n });\n }\n const nrm: Vec2[] = [];\n for (let k = 0; k < c.segments; k++) {\n const a = (k / c.segments) * Math.PI * 2;\n nrm.push([Math.cos(a), Math.sin(a)]);\n }\n return { pts: nrm.map(([x, y]) => [x * c.radius, y * c.radius]), nrm };\n }\n const poly = s as readonly Vec2[];\n if (poly.length < 3) {\n throw new Ts23dError('T3D_RECIPE_INVALID', {\n cause: `sweep section has ${poly.length} point(s)`,\n fix: 'pass a closed polygon of at least 3 points, or { radius, segments }',\n });\n }\n const area = poly.reduce((a, p, i) => {\n const q = poly[(i + 1) % poly.length] ?? p;\n return a + p[0] * q[1] - q[0] * p[1];\n }, 0);\n const pts = area < 0 ? [...poly].reverse() : poly;\n const nrm = pts.map((p, i): Vec2 => {\n const a = pts[(i + pts.length - 1) % pts.length] ?? p;\n const b = pts[(i + 1) % pts.length] ?? p;\n const e1 = Math.hypot(p[0] - a[0], p[1] - a[1]) || 1;\n const e2 = Math.hypot(b[0] - p[0], b[1] - p[1]) || 1;\n const x = (p[1] - a[1]) / e1 + (b[1] - p[1]) / e2;\n const y = -(p[0] - a[0]) / e1 - (b[0] - p[0]) / e2;\n const l = Math.hypot(x, y) || 1;\n return [x / l, y / l];\n });\n return { pts, nrm };\n}\n\nexport function sweep(o: SweepOptions): Mesh {\n const arc = arcLengths(o.path);\n const frames = transportFrames(o.path);\n const P = o.path.length;\n if (o.scale && o.scale.length !== P) {\n throw new Ts23dError('T3D_RECIPE_INVALID', {\n cause: `sweep has ${P} path points but ${o.scale.length} scales`,\n fix: 'pass exactly one scale per path point (or omit scale for a constant section)',\n });\n }\n const sec = section(o.section);\n const S = sec.pts.length;\n const total = arc[P - 1] ?? 1;\n const rect = stripRect(o.strip ?? 'plain');\n const du = (rect.u1 - rect.u0) / rect.metres;\n const twist = ((o.twist ?? 0) * Math.PI) / 180;\n const b = new MeshBuilder();\n /** Rim positions per ring (S each), kept for the caps. */\n const rim = new Float64Array(P * S * 3);\n for (let i = 0; i < P; i++) {\n const c = o.path[i] ?? [0, 0, 0];\n const { t, n, b: bn } = frames[i] ?? { t: [0, 0, 1], n: [1, 0, 0], b: [0, 1, 0] };\n const k = o.scale?.[i] ?? 1;\n // Taper slope dk/ds tilts the smooth normal back along the tangent (a cone, not a cylinder).\n const i0 = Math.max(0, i - 1);\n const i1 = Math.min(P - 1, i + 1);\n const slope =\n ((o.scale?.[i1] ?? 1) - (o.scale?.[i0] ?? 1)) / ((arc[i1] ?? 0) - (arc[i0] ?? 0) || 1);\n const rot = (twist * (arc[i] ?? 0)) / total;\n const cr = Math.cos(rot);\n const sr = Math.sin(rot);\n const u = rect.u0 + (arc[i] ?? 0) * du;\n for (let j = 0; j <= S; j++) {\n const [px, py] = sec.pts[j % S] ?? [0, 0];\n const [nx, ny] = sec.nrm[j % S] ?? [1, 0];\n const x = (px * cr - py * sr) * k;\n const y = (px * sr + py * cr) * k;\n const mx = nx * cr - ny * sr;\n const my = nx * sr + ny * cr;\n const back = -slope * (px * nx + py * ny);\n const qx = mx * n[0] + my * bn[0] + back * t[0];\n const qy = mx * n[1] + my * bn[1] + back * t[1];\n const qz = mx * n[2] + my * bn[2] + back * t[2];\n const ql = Math.hypot(qx, qy, qz) || 1;\n const p: Vec3 = [\n c[0] + x * n[0] + y * bn[0],\n c[1] + x * n[1] + y * bn[1],\n c[2] + x * n[2] + y * bn[2],\n ];\n if (j < S) rim.set(p, (i * S + j) * 3);\n b.vertex({\n p,\n n: [qx / ql, qy / ql, qz / ql],\n uv: [u, rect.v0 + (j / S) * (rect.v1 - rect.v0)],\n color: o.color,\n });\n }\n }\n for (let i = 0; i + 1 < P; i++) {\n const r0 = i * (S + 1);\n const r1 = r0 + S + 1;\n for (let j = 0; j < S; j++) b.quad(r0 + j, r0 + j + 1, r1 + j + 1, r1 + j);\n }\n const caps = o.caps === true ? ['start', 'end'] : o.caps ? [o.caps] : [];\n for (const end of caps) {\n const i = end === 'start' ? 0 : P - 1;\n const f = frames[i]?.t ?? [0, 0, 1];\n const sign = end === 'start' ? -1 : 1;\n const nn: Vec3 = [f[0] * sign, f[1] * sign, f[2] * sign];\n const centre = b.vertex({\n p: o.path[i] ?? [0, 0, 0],\n n: nn,\n uv: [rect.u0, rect.v0],\n color: o.color,\n });\n const first = centre + 1;\n for (let j = 0; j < S; j++) {\n const q = (i * S + j) * 3;\n const p: Vec3 = [rim[q] ?? 0, rim[q + 1] ?? 0, rim[q + 2] ?? 0];\n b.vertex({ p, n: nn, uv: [rect.u0, rect.v1], color: o.color });\n }\n for (let j = 0; j < S; j++) {\n const a = first + j;\n const c = first + ((j + 1) % S);\n if (sign > 0) b.tri(centre, a, c);\n else b.tri(centre, c, a);\n }\n }\n return b.build();\n}\n",
|
|
32
|
+
"// A terrain as a regular grid of heights in metres, the working surface for erosion and colouring:\n// sample it from any height function, read it back bilinearly at any (x, y) for `heightfield`\n// (so every LOD meshes the SAME eroded terrain at its own density), and relax it with thermal\n// erosion (material above the talus slope slides down). `flow`/`deposit` come from hydraulic\n// erosion and drive terrain colouring.\n\nimport { count, invalid } from './check.ts';\n\nexport interface TerrainGrid {\n /** Points along X and Y (cells + 1). Row-major: index = j · nx + i. */\n readonly nx: number;\n readonly ny: number;\n /** [minX, minY, maxX, maxY] in metres. */\n readonly rect: readonly [number, number, number, number];\n readonly z: Float64Array;\n /** Water passage per point, 0..1 (rivers, gullies). Set by hydraulicErosion. */\n readonly flow?: Float64Array;\n /** Sediment laid down per point, 0..1 (scree fans, valley fill). Set by hydraulicErosion. */\n readonly deposit?: Float64Array;\n}\n\nexport interface TerrainGridOptions {\n readonly rect: readonly [number, number, number, number];\n /** Cells per side (points = cells + 1); 256 ≈ 8 m on a 2 km tile. */\n readonly cells: number;\n readonly height: (x: number, y: number) => number;\n}\n\nexport function terrainGrid(o: TerrainGridOptions): TerrainGrid {\n const [x0, y0, x1, y1] = o.rect;\n if (!(x1 > x0 && y1 > y0))\n invalid(\n `terrain rect [${o.rect.join(', ')}] is empty`,\n 'pass [minX, minY, maxX, maxY] with max > min',\n );\n const n = count('terrain cells', o.cells, 2, 4096);\n const z = new Float64Array((n + 1) * (n + 1));\n for (let j = 0; j <= n; j++)\n for (let i = 0; i <= n; i++) {\n const h = o.height(x0 + ((x1 - x0) * i) / n, y0 + ((y1 - y0) * j) / n);\n if (!Number.isFinite(h))\n invalid(`terrain height is ${h} at point (${i}, ${j})`, 'return a finite height in metres');\n z[j * (n + 1) + i] = h;\n }\n return { nx: n + 1, ny: n + 1, rect: o.rect, z };\n}\n\n/** Bilinear reader of any per-point map of the grid, clamped at the edges, in metres. */\nexport function sampler(g: TerrainGrid, map: Float64Array = g.z): (x: number, y: number) => number {\n const [x0, y0, x1, y1] = g.rect;\n const sx = (g.nx - 1) / (x1 - x0);\n const sy = (g.ny - 1) / (y1 - y0);\n return (x, y) => {\n const fx = Math.min(g.nx - 1, Math.max(0, (x - x0) * sx));\n const fy = Math.min(g.ny - 1, Math.max(0, (y - y0) * sy));\n const i = Math.min(g.nx - 2, Math.floor(fx));\n const j = Math.min(g.ny - 2, Math.floor(fy));\n const u = fx - i;\n const v = fy - j;\n const k = j * g.nx + i;\n const a = map[k] ?? 0;\n const b = map[k + 1] ?? 0;\n const c = map[k + g.nx] ?? 0;\n const d = map[k + g.nx + 1] ?? 0;\n return a + (b - a) * u + (c + (d - c) * u - (a + (b - a) * u)) * v;\n };\n}\n\n/** Slope (rise / run, tan of the angle) at every point, by central differences. */\nexport function slopeMap(g: TerrainGrid): Float64Array {\n const [x0, y0, x1, y1] = g.rect;\n const dx = (x1 - x0) / (g.nx - 1);\n const dy = (y1 - y0) / (g.ny - 1);\n const out = new Float64Array(g.z.length);\n for (let j = 0; j < g.ny; j++)\n for (let i = 0; i < g.nx; i++) {\n const l = g.z[j * g.nx + Math.max(0, i - 1)] ?? 0;\n const r = g.z[j * g.nx + Math.min(g.nx - 1, i + 1)] ?? 0;\n const b = g.z[Math.max(0, j - 1) * g.nx + i] ?? 0;\n const t = g.z[Math.min(g.ny - 1, j + 1) * g.nx + i] ?? 0;\n const sx = (r - l) / (dx * (Math.min(g.nx - 1, i + 1) - Math.max(0, i - 1)));\n const sy = (t - b) / (dy * (Math.min(g.ny - 1, j + 1) - Math.max(0, j - 1)));\n out[j * g.nx + i] = Math.sqrt(sx * sx + sy * sy);\n }\n return out;\n}\n\nexport interface ThermalOptions {\n /** Stable slope as rise/run: 0.7 ≈ 35° (scree's angle of repose). Default 0.7. */\n readonly talus?: number;\n readonly iterations?: number;\n /** Share of the excess moved per iteration, 0..0.5. Default 0.4. */\n readonly rate?: number;\n}\n\n/**\n * Thermal erosion: wherever a neighbour sits lower than the talus slope allows, part of the\n * excess slides down to it. Every iteration reads the old heights and writes a new array, so the\n * result is independent of visiting order.\n */\nexport function thermalErosion(g: TerrainGrid, o: ThermalOptions = {}): TerrainGrid {\n const talus = o.talus ?? 0.7;\n const rate = Math.min(0.5, Math.max(0, o.rate ?? 0.4));\n const iterations = count('thermal iterations', o.iterations ?? 30, 0, 10000);\n const [x0, , x1] = g.rect;\n const cell = (x1 - x0) / (g.nx - 1);\n const D = [-1, 0, 1, 0, 0, -1, 0, 1, -1, -1, 1, -1, -1, 1, 1, 1];\n const limit = D.map((_, k) => (k < 8 ? talus * cell : talus * cell * Math.SQRT2));\n let z = Float64Array.from(g.z);\n for (let it = 0; it < iterations; it++) {\n const next = Float64Array.from(z);\n for (let j = 1; j < g.ny - 1; j++)\n for (let i = 1; i < g.nx - 1; i++) {\n const k = j * g.nx + i;\n const h = z[k] ?? 0;\n let total = 0;\n let most = 0;\n for (let d = 0; d < 16; d += 2) {\n const ex = h - (z[k + (D[d] ?? 0) + (D[d + 1] ?? 0) * g.nx] ?? 0) - (limit[d] ?? 0);\n if (ex > 0) {\n total += ex;\n if (ex > most) most = ex;\n }\n }\n if (total <= 0) continue;\n const move = rate * most;\n next[k] = (next[k] ?? 0) - move;\n for (let d = 0; d < 16; d += 2) {\n const n = k + (D[d] ?? 0) + (D[d + 1] ?? 0) * g.nx;\n const ex = h - (z[n] ?? 0) - (limit[d] ?? 0);\n if (ex > 0) next[n] = (next[n] ?? 0) + (move * ex) / total;\n }\n }\n z = next;\n }\n return { ...g, z };\n}\n",
|
|
33
|
+
"// Vertex colour for terrain from what shapes real mountainsides: altitude bands (forest below the\n// treeline, meadow above it, bare debris higher up), slope (rock where it is too steep to hold\n// soil or snow), hydraulic deposit (scree fans and valley gravel) and flow (damp, dark gullies),\n// and snow above the snowline on slopes gentle enough to hold it. Returns `(x, y, z) => colour`\n// for `heightfield`'s `color`. Boundaries are jittered by an optional noise so bands never read as\n// contour lines.\n\nimport type { Vec3 } from '../core/index.ts';\nimport type { Noise2 } from './noise.ts';\nimport { sampler, slopeMap, type TerrainGrid } from './terrain-grid.ts';\n\nexport interface TerrainPalette {\n readonly forest: Vec3;\n readonly grass: Vec3;\n /** Alpine debris/tundra above the meadows and on deposits. */\n readonly scree: Vec3;\n readonly rock: Vec3;\n readonly snow: Vec3;\n /** Damp ground in gullies and river beds. */\n readonly wet: Vec3;\n}\n\nexport interface TerrainColorOptions {\n readonly palette: TerrainPalette;\n /** Altitude of z = 0 in metres above sea level (z is relative to it). Default 0. */\n readonly datum?: number;\n /** Altitude where forest gives way to meadow, m. */\n readonly treeline: number;\n /** Altitude above which snow lies on gentle slopes, m. */\n readonly snowline: number;\n /** Slope (rise/run) where bare rock takes over: default 0.8 (≈ 39°). */\n readonly rockSlope?: number;\n /** Steepest slope that holds snow: default 1.0 (45°). */\n readonly snowSlope?: number;\n /** Noise in [−1, 1] (metres in) jittering every boundary; `jitter` = its altitude reach, m. */\n readonly noise?: Noise2;\n readonly jitter?: number;\n}\n\nconst ramp = (a: number, b: number, x: number): number => {\n const t = Math.min(1, Math.max(0, (x - a) / (b - a)));\n return t * t * (3 - 2 * t);\n};\n\nexport function terrainColor(\n g: TerrainGrid,\n o: TerrainColorOptions,\n): (x: number, y: number, z: number) => Vec3 {\n const slope = sampler(g, slopeMap(g));\n const flow = g.flow ? sampler(g, g.flow) : () => 0;\n const dep = g.deposit ? sampler(g, g.deposit) : () => 0;\n const P = o.palette;\n const datum = o.datum ?? 0;\n const rockS = o.rockSlope ?? 0.8;\n const snowS = o.snowSlope ?? 1;\n const jit = o.jitter ?? 60;\n const c = [0, 0, 0];\n const mix = (to: Vec3, w: number): void => {\n for (let k = 0; k < 3; k++) c[k] = (c[k] ?? 0) + ((to[k] ?? 0) - (c[k] ?? 0)) * w;\n };\n return (x, y, z) => {\n const n = o.noise ? o.noise(x, y) : 0;\n const alt = z + datum + n * jit;\n const s = slope(x, y) * (1 + 0.15 * n);\n c[0] = P.forest[0];\n c[1] = P.forest[1];\n c[2] = P.forest[2];\n mix(P.grass, ramp(o.treeline - 80, o.treeline + 80, alt));\n mix(P.scree, 0.85 * ramp(o.treeline + 350, o.treeline + 800, alt));\n // Forest thins on steep ground well below the treeline too.\n mix(P.grass, ramp(0.55, 0.8, s) * (1 - ramp(o.treeline - 80, o.treeline + 80, alt)) * 0.6);\n // Scree: sediment dropped on sloping ground (fans, cones); flat floors stay vegetated.\n mix(\n P.scree,\n ramp(0.4, 0.8, dep(x, y)) * ramp(0.2, 0.45, s) * (1 - ramp(rockS, rockS + 0.3, s)),\n );\n mix(P.wet, 0.7 * ramp(0.35, 0.8, flow(x, y)) * (1 - ramp(o.snowline - 100, o.snowline, alt)));\n mix(P.rock, ramp(rockS - 0.15, rockS + 0.15, s));\n mix(\n P.snow,\n ramp(o.snowline - 60, o.snowline + 120, alt) * (1 - ramp(snowS - 0.3, snowS + 0.2, s)),\n );\n return [c[0] ?? 0, c[1] ?? 0, c[2] ?? 0];\n };\n}\n",
|
|
34
|
+
"// The built-in 5 × 7 glyph table for `text`: Latin A–Z, digits, common punctuation and Cyrillic\n// А–Я + Ё (lower case maps to upper). One entry = 7 rows top → bottom, each a 5-bit number,\n// bit 4 = left column — the classic LCD character-generator shapes, legible down to a few pixels.\n// Primitives (tier 2) cannot import render/font.ts (tier 3), hence this own copy.\n\nconst A = [14, 17, 17, 17, 31, 17, 17];\nconst B = [30, 17, 17, 30, 17, 17, 30];\nconst C = [14, 17, 16, 16, 16, 17, 14];\nconst E = [31, 16, 16, 30, 16, 16, 31];\nconst H = [17, 17, 17, 31, 17, 17, 17];\nconst K = [17, 18, 20, 24, 20, 18, 17];\nconst M = [17, 27, 21, 21, 17, 17, 17];\nconst O = [14, 17, 17, 17, 17, 17, 14];\nconst P = [30, 17, 17, 30, 16, 16, 16];\nconst T = [31, 4, 4, 4, 4, 4, 4];\nconst X = [17, 17, 10, 4, 10, 17, 17];\n\nexport const GLYPHS: Readonly<Record<string, readonly number[]>> = {\n ' ': [0, 0, 0, 0, 0, 0, 0],\n A,\n B,\n C,\n D: [28, 18, 17, 17, 17, 18, 28],\n E,\n F: [31, 16, 16, 30, 16, 16, 16],\n G: [14, 17, 16, 23, 17, 17, 15],\n H,\n I: [14, 4, 4, 4, 4, 4, 14],\n J: [7, 2, 2, 2, 2, 18, 12],\n K,\n L: [16, 16, 16, 16, 16, 16, 31],\n M,\n N: [17, 17, 25, 21, 19, 17, 17],\n O,\n P,\n Q: [14, 17, 17, 17, 21, 18, 13],\n R: [30, 17, 17, 30, 20, 18, 17],\n S: [15, 16, 16, 14, 1, 1, 30],\n T,\n U: [17, 17, 17, 17, 17, 17, 14],\n V: [17, 17, 17, 17, 17, 10, 4],\n W: [17, 17, 17, 21, 21, 21, 10],\n X,\n Y: [17, 17, 10, 4, 4, 4, 4],\n Z: [31, 1, 2, 4, 8, 16, 31],\n '0': [14, 17, 19, 21, 25, 17, 14],\n '1': [4, 12, 4, 4, 4, 4, 14],\n '2': [14, 17, 1, 2, 4, 8, 31],\n '3': [31, 2, 4, 2, 1, 17, 14],\n '4': [2, 6, 10, 18, 31, 2, 2],\n '5': [31, 16, 30, 1, 1, 17, 14],\n '6': [6, 8, 16, 30, 17, 17, 14],\n '7': [31, 1, 2, 4, 8, 8, 8],\n '8': [14, 17, 17, 14, 17, 17, 14],\n '9': [14, 17, 17, 15, 1, 2, 12],\n '.': [0, 0, 0, 0, 0, 12, 12],\n ',': [0, 0, 0, 0, 12, 4, 8],\n '-': [0, 0, 0, 31, 0, 0, 0],\n '/': [0, 1, 2, 4, 8, 16, 0],\n ':': [0, 12, 12, 0, 12, 12, 0],\n \"'\": [12, 4, 8, 0, 0, 0, 0],\n '\"': [10, 10, 10, 0, 0, 0, 0],\n '&': [12, 18, 20, 8, 21, 18, 13],\n '!': [4, 4, 4, 4, 4, 0, 4],\n '?': [14, 17, 1, 2, 4, 0, 4],\n '#': [10, 10, 31, 10, 31, 10, 10],\n '+': [0, 4, 4, 31, 4, 4, 0],\n '=': [0, 0, 31, 0, 31, 0, 0],\n '*': [0, 4, 21, 14, 21, 4, 0],\n '(': [2, 4, 8, 8, 8, 4, 2],\n ')': [8, 4, 2, 2, 2, 4, 8],\n '%': [24, 25, 2, 4, 8, 19, 3],\n '°': [12, 18, 18, 12, 0, 0, 0],\n '№': [18, 26, 26, 22, 22, 18, 21],\n А: A,\n Б: [31, 16, 16, 30, 17, 17, 30],\n В: B,\n Г: [31, 16, 16, 16, 16, 16, 16],\n Д: [6, 10, 10, 10, 10, 31, 17],\n Е: E,\n Ё: [10, 0, 31, 16, 30, 16, 31],\n Ж: [21, 21, 21, 14, 21, 21, 21],\n З: [14, 17, 1, 6, 1, 17, 14],\n И: [17, 17, 19, 21, 25, 17, 17],\n Й: [10, 4, 17, 19, 21, 25, 17],\n К: K,\n Л: [7, 9, 9, 9, 9, 9, 17],\n М: M,\n Н: H,\n О: O,\n П: [31, 17, 17, 17, 17, 17, 17],\n Р: P,\n С: C,\n Т: T,\n У: [17, 17, 17, 15, 1, 17, 14],\n Ф: [4, 14, 21, 21, 21, 14, 4],\n Х: X,\n Ц: [18, 18, 18, 18, 18, 31, 1],\n Ч: [17, 17, 17, 15, 1, 1, 1],\n Ш: [21, 21, 21, 21, 21, 21, 31],\n Щ: [21, 21, 21, 21, 21, 31, 1],\n Ъ: [24, 8, 8, 14, 9, 9, 14],\n Ы: [17, 17, 17, 29, 19, 19, 29],\n Ь: [16, 16, 16, 30, 17, 17, 30],\n Э: [14, 17, 1, 7, 1, 17, 14],\n Ю: [18, 21, 21, 29, 21, 21, 18],\n Я: [15, 17, 17, 15, 5, 9, 17],\n};\n\nconst group = (c: string): number =>\n /[A-Z]/.test(c) ? 0 : /[0-9]/.test(c) ? 1 : /[А-ЯЁ]/.test(c) ? 3 : 2;\n/** Every character `text` can set (lower case is accepted and set as upper case). */\nexport const SUPPORTED_CHARS = Object.keys(GLYPHS)\n .filter((c) => c !== ' ')\n .sort((a, b) => group(a) - group(b) || (a < b ? -1 : a > b ? 1 : 0))\n .join('')\n .concat(' and space');\n",
|
|
35
|
+
"// Lettering layout for `text`: glyph lookup, advances, measureText, and the merge of each glyph's\n// pixels into as few rectangles as possible (runs along a row, then identical runs stacked down\n// the rows), so a stem is one box, not seven. All in pixel units; one pixel = cap height / 7.\n\nimport { invalid } from './check.ts';\nimport { GLYPHS, SUPPORTED_CHARS } from './font-5x7.ts';\n\nexport type TextFont = '5x7' | 'block';\n\nexport interface MeasureOptions {\n /** Cap height in metres (the 7 glyph rows). */\n readonly height: number;\n readonly font?: TextFont;\n /** Gap between glyphs in pixels (1 px = height / 7). Default 1. */\n readonly tracking?: number;\n}\n\n/** A filled rectangle: columns [c0, c1) from the line start, rows [r0, r1) from the cap line. */\nexport interface PixelRect {\n readonly c0: number;\n readonly c1: number;\n readonly r0: number;\n readonly r1: number;\n}\n\nconst SPACE = 3;\n\n/** Rows of one glyph in `font`; block = emboldened (each pixel doubled rightward, 6 wide). */\nfunction rows(ch: string, font: TextFont): { rows: readonly number[]; width: number } {\n const g = GLYPHS[ch] ?? GLYPHS[ch.toUpperCase()];\n if (!g)\n invalid(\n `text: no glyph for ${JSON.stringify(ch)} (U+${(ch.codePointAt(0) ?? 0).toString(16).toUpperCase().padStart(4, '0')})`,\n `use only these characters (lower case is set as upper case): ${SUPPORTED_CHARS}`,\n );\n if (ch === ' ') return { rows: g, width: SPACE };\n return font === 'block' ? { rows: g.map((r) => (r << 1) | r), width: 6 } : { rows: g, width: 5 };\n}\n\n/** Width in pixels of a line. */\nfunction widthPx(str: string, font: TextFont, tracking: number): number {\n const chars = [...str];\n return (\n chars.reduce((w, ch) => w + rows(ch, font).width, 0) + Math.max(0, chars.length - 1) * tracking\n );\n}\n\n/** Width of `str` in metres when set at cap `height`. Throws on characters without a glyph. */\nexport function measureText(str: string, o: MeasureOptions): number {\n return (widthPx(str, o.font ?? '5x7', o.tracking ?? 1) * o.height) / 7;\n}\n\n/** The line as merged pixel rectangles, plus its width in pixels. */\nexport function layout(\n str: string,\n font: TextFont,\n tracking: number,\n): { rects: PixelRect[]; width: number } {\n const rects: PixelRect[] = [];\n let pen = 0;\n for (const ch of str) {\n const g = rows(ch, font);\n let open = new Map<string, { c0: number; c1: number; r0: number }>();\n for (let r = 0; r <= 7; r++) {\n const bits = g.rows[r] ?? 0;\n const next = new Map<string, { c0: number; c1: number; r0: number }>();\n let c = 0;\n while (c < g.width) {\n if (!((bits >> (g.width - 1 - c)) & 1)) {\n c++;\n continue;\n }\n const start = c;\n while (c < g.width && (bits >> (g.width - 1 - c)) & 1) c++;\n const key = `${start},${c}`;\n next.set(key, open.get(key) ?? { c0: start, c1: c, r0: r });\n }\n for (const [key, run] of open)\n if (!next.has(key)) rects.push({ c0: pen + run.c0, c1: pen + run.c1, r0: run.r0, r1: r });\n open = next;\n }\n pen += g.width + tracking;\n }\n return { rects, width: Math.max(0, pen - tracking) };\n}\n",
|
|
36
|
+
"// Lettering as geometry: name boards, wagon and locomotive lettering, hull markings, signs. Each\n// glyph of the built-in 5 × 7 font (font-5x7.ts; Latin, digits, punctuation, Cyrillic) becomes a\n// few merged rectangles: flush decals lifted 2 mm off the surface (depth 0, 2 triangles each) or\n// raised letters (depth > 0: face + 4 sides, 10 each). Flat normals. `surface(u, v)` gives the\n// face's offset under each letter piece, so lettering stays readable across stepped sheathing,\n// posts and battens (pieces split where the offset changes). Reads along `along`, upright along\n// `up`, facing along × up; `origin` is the baseline point at the `align` anchor.\n\nimport { type Mesh, MeshBuilder, normalize, type Vec3 } from '../core/index.ts';\nimport { type StripId, stripRect } from '../material/index.ts';\nimport { invalid } from './check.ts';\nimport { stripU, stripV } from './strip-uv.ts';\nimport { layout, measureText, type PixelRect, type TextFont } from './text-layout.ts';\n\nexport { type MeasureOptions, measureText, type TextFont } from './text-layout.ts';\n\nexport interface TextOptions {\n readonly origin: Vec3;\n /** Reading direction. Default +Y (a sign read from +X). */\n readonly along?: Vec3;\n /** Letter up. Default +Z. */\n readonly up?: Vec3;\n /** Cap height in metres. */\n readonly height: number;\n readonly color: Vec3;\n readonly font?: TextFont;\n /** Raised thickness in metres; 0 = flush decal lifted 2 mm. Default 0. */\n readonly depth?: number;\n /** Gap between glyphs in pixels (height / 7). Default 1. */\n readonly tracking?: number;\n readonly align?: 'left' | 'centre' | 'right';\n /** Shrink the cap height so the line fits this width, metres. */\n readonly maxWidth?: number;\n /** Offset (m, along the facing normal) of the surface under a letter piece. `u` = metres along\n * `along` from `origin` (negative left of a centre/right anchor), `v` = metres up from it. */\n readonly surface?: (u: number, v: number) => number;\n readonly strip?: StripId;\n}\n\nconst LIFT = 0.002;\n\nexport function text(str: string, o: TextOptions): Mesh {\n if (!(Number.isFinite(o.height) && o.height > 0 && o.height < 1000))\n invalid(\n `text height is ${o.height}`,\n 'give the cap height in metres, > 0 (e.g. 0.3 for wagon lettering)',\n );\n const depth = o.depth ?? 0;\n if (!(Number.isFinite(depth) && depth >= 0))\n invalid(`text depth is ${depth}`, 'use 0 (flush) or a raised thickness > 0 m');\n const font = o.font ?? '5x7';\n const tracking = o.tracking ?? 1;\n let height = o.height;\n if (o.maxWidth !== undefined) {\n if (!(o.maxWidth > 0))\n invalid(`text maxWidth is ${o.maxWidth}`, 'give the panel width in metres, > 0');\n const w = measureText(str, { height, font, tracking });\n if (w > o.maxWidth) height *= o.maxWidth / w;\n }\n const along = normalize(o.along ?? [0, 1, 0]);\n const up0 = o.up ?? [0, 0, 1];\n const k = up0[0] * along[0] + up0[1] * along[1] + up0[2] * along[2];\n const upR: Vec3 = [up0[0] - along[0] * k, up0[1] - along[1] * k, up0[2] - along[2] * k];\n if (Math.hypot(upR[0], upR[1], upR[2]) < 1e-9)\n invalid('text: up is parallel to along', 'pass an `up` perpendicular to the reading direction');\n const up = normalize(upR);\n const n: Vec3 = [\n along[1] * up[2] - along[2] * up[1],\n along[2] * up[0] - along[0] * up[2],\n along[0] * up[1] - along[1] * up[0],\n ];\n const px = height / 7;\n const { rects, width } = layout(str, font, tracking);\n const start = o.align === 'centre' ? (-width * px) / 2 : o.align === 'right' ? -width * px : 0;\n const rect = stripRect(o.strip ?? 'plain');\n const b = new MeshBuilder();\n const at = (u: number, v: number, w: number): Vec3 => [\n o.origin[0] + along[0] * u + up[0] * v + n[0] * w,\n o.origin[1] + along[1] * u + up[1] * v + n[1] * w,\n o.origin[2] + along[2] * u + up[2] * v + n[2] * w,\n ];\n /** Quad u0..u1 × v0..v1 at offsets w (per corner), facing `nrm`, CCW from that side. */\n const quad = (\n c: readonly Vec3[],\n nrm: Vec3,\n us: readonly number[],\n vs: readonly number[],\n ): void => {\n const ids = c.map((p, i) =>\n b.vertex({\n p,\n n: nrm,\n uv: [\n stripU(rect, us[i] ?? 0),\n stripV(rect, Math.min(1, Math.max(0, (vs[i] ?? 0) / height))),\n ],\n color: o.color,\n }),\n );\n const [a = n, e = n, f = n] = c;\n const g = [0, 1, 2].map((j) => {\n const [x, y] = [(j + 1) % 3, (j + 2) % 3];\n return (\n ((e[x] ?? 0) - (a[x] ?? 0)) * ((f[y] ?? 0) - (a[y] ?? 0)) -\n ((e[y] ?? 0) - (a[y] ?? 0)) * ((f[x] ?? 0) - (a[x] ?? 0))\n );\n });\n const [i0 = 0, i1 = 0, i2 = 0, i3 = 0] = ids;\n if ((g[0] ?? 0) * nrm[0] + (g[1] ?? 0) * nrm[1] + (g[2] ?? 0) * nrm[2] >= 0)\n b.quad(i0, i1, i2, i3);\n else b.quad(i0, i3, i2, i1);\n };\n const neg = (v: Vec3): Vec3 => [-v[0], -v[1], -v[2]];\n for (const piece of pieces(rects, px, start, o.surface)) {\n const { u0, u1, v0, v1, s } = piece;\n const lo = depth > 0 ? s : s + LIFT;\n const hi = depth > 0 ? s + depth : lo;\n quad(\n [at(u0, v0, hi), at(u1, v0, hi), at(u1, v1, hi), at(u0, v1, hi)],\n n,\n [u0, u1, u1, u0],\n [v0, v0, v1, v1],\n );\n if (depth <= 0) continue;\n // Sides: bottom, right, top, left.\n quad(\n [at(u0, v0, lo), at(u1, v0, lo), at(u1, v0, hi), at(u0, v0, hi)],\n neg(up),\n [u0, u1, u1, u0],\n [0, 0, depth, depth],\n );\n quad(\n [at(u1, v0, lo), at(u1, v1, lo), at(u1, v1, hi), at(u1, v0, hi)],\n along,\n [v0, v1, v1, v0],\n [0, 0, depth, depth],\n );\n quad(\n [at(u1, v1, lo), at(u0, v1, lo), at(u0, v1, hi), at(u1, v1, hi)],\n up,\n [u1, u0, u0, u1],\n [0, 0, depth, depth],\n );\n quad(\n [at(u0, v1, lo), at(u0, v0, lo), at(u0, v0, hi), at(u0, v1, hi)],\n neg(along),\n [v1, v0, v0, v1],\n [0, 0, depth, depth],\n );\n }\n return b.build();\n}\n\ninterface Piece {\n readonly u0: number;\n readonly u1: number;\n readonly v0: number;\n readonly v1: number;\n /** Surface offset under this piece. */\n readonly s: number;\n}\n\n/** Rects in metres, split into column groups wherever the surface offset changes. */\nfunction pieces(\n rects: readonly PixelRect[],\n px: number,\n start: number,\n surface?: (u: number, v: number) => number,\n): Piece[] {\n const out: Piece[] = [];\n for (const r of rects) {\n const v0 = (7 - r.r1) * px;\n const v1 = (7 - r.r0) * px;\n if (!surface) {\n out.push({ u0: start + r.c0 * px, u1: start + r.c1 * px, v0, v1, s: 0 });\n continue;\n }\n // Each column sits on the highest surface anywhere under it (edges and centre, both ways),\n // so a pixel half over a post is lifted onto the post, not buried in it.\n const lift = (c: number): number => {\n let top = Number.NEGATIVE_INFINITY;\n for (const fu of [0.02, 0.5, 0.98])\n for (const v of [v0 + 0.02 * px, (v0 + v1) / 2, v1 - 0.02 * px])\n top = Math.max(top, surface(start + (c + fu) * px, v));\n return top;\n };\n let c = r.c0;\n while (c < r.c1) {\n const s = lift(c);\n let e = c + 1;\n while (e < r.c1 && Math.abs(lift(e) - s) < 1e-6) e++;\n out.push({ u0: start + c * px, u1: start + e * px, v0, v1, s });\n c = e;\n }\n }\n return out;\n}\n",
|
|
37
|
+
"// A flat quad tiling one trim strip at TRUE SCALE: walls, roofs, decks, floors. Flat normal u × v\n// (front = the side u × v points to, CCW). U runs along `u` in metres (the sampler repeats it); V\n// runs up `v` and is cut into one band per `vMetres`, so brick courses keep their real height on a\n// 3 m wall. `uOffset`/`vOffset` phase the pattern so adjacent faces line up.\n// triangles = 2 · segments · bands · (doubleSided ? 2 : 1), bands = ⌈|v| / vMetres⌉ at offset 0\n\nimport { type Mesh, MeshBuilder, type Vec3 } from '../core/index.ts';\nimport { type StripId, stripRect } from '../material/index.ts';\nimport { count, positive, spanOf } from './check.ts';\nimport { stripU, stripV, stripVMetres } from './strip-uv.ts';\n\nexport interface TiledOptions {\n /** One corner of the face. */\n readonly origin: Vec3;\n /** Edge along the strip (texture U), metres. */\n readonly u: Vec3;\n /** The other edge, texture \"up\" (V), metres. */\n readonly v: Vec3;\n readonly color: Vec3;\n readonly strip?: StripId;\n /** Columns along `u` (vertex density for grime/bending); the LOD knob. Default 1. */\n readonly segments?: number;\n /** Metres the pattern is shifted along U / V (continue a course round a corner). */\n readonly uOffset?: number;\n readonly vOffset?: number;\n /** World metres one strip band spans along V. Default: the house sheet's `scaleMetres`.\n * Raise it to stretch the strip (fewer bands, fewer triangles on a far LOD). */\n readonly vMetres?: number;\n readonly doubleSided?: boolean;\n}\n\nexport function tiled(o: TiledOptions): Mesh {\n const { lu, lv, n } = spanOf('tiled', o.origin, o.u, o.v);\n const strip = o.strip ?? 'plain';\n const segs = count('tiled segments', o.segments ?? 1, 1, 4096);\n const vm = positive('tiled vMetres', o.vMetres ?? stripVMetres(strip), 'e.g. 0.45 for brick');\n const rect = stripRect(strip);\n const uOff = o.uOffset ?? 0;\n const b = new MeshBuilder();\n const sides = o.doubleSided ? [1, -1] : [1];\n let t = 0;\n while (t < lv - 1e-9) {\n let local = (o.vOffset ?? 0) + t;\n local -= Math.floor(local / vm) * vm;\n if (vm - local < 1e-9) local = 0;\n const step = Math.min(lv - t, vm - local);\n const fv0 = local / vm;\n const fv1 = (local + step) / vm;\n for (const side of sides) {\n const nn: Vec3 = [n[0] * side, n[1] * side, n[2] * side];\n const first = row(b, o, nn, rect, uOff, lu, segs, t / lv, stripV(rect, fv0));\n row(b, o, nn, rect, uOff, lu, segs, (t + step) / lv, stripV(rect, fv1));\n for (let j = 0; j < segs; j++) {\n const a = first + j;\n const c = first + segs + 1 + j;\n if (side > 0) b.quad(a, a + 1, c + 1, c);\n else b.quad(a, c, c + 1, a + 1);\n }\n }\n t += step;\n }\n return b.build();\n}\n\n/** One row of segs + 1 vertices at fraction `fv` up the face; returns the first index. */\nfunction row(\n b: MeshBuilder,\n o: TiledOptions,\n n: Vec3,\n rect: ReturnType<typeof stripRect>,\n uOff: number,\n lu: number,\n segs: number,\n fv: number,\n v: number,\n): number {\n let first = -1;\n for (let j = 0; j <= segs; j++) {\n const fu = j / segs;\n const id = b.vertex({\n p: [\n o.origin[0] + o.u[0] * fu + o.v[0] * fv,\n o.origin[1] + o.u[1] * fu + o.v[1] * fv,\n o.origin[2] + o.u[2] * fu + o.v[2] * fv,\n ],\n n,\n uv: [stripU(rect, uOff + lu * fu), v],\n color: o.color,\n });\n if (first < 0) first = id;\n }\n return first;\n}\n",
|
|
38
|
+
"// Seeded 3D value noise for SDF displacement (rock pitting, skin wrinkles): a shuffled lattice\n// from the recipe's Rng, quintic-faded trilinear interpolation, fractal octaves. Deterministic.\n\nimport type { Rng } from '../core/index.ts';\nimport type { Field } from './sdf-ops.ts';\n\n/**\n * Seeded fractal value noise in [−1, 1]: `scale` = metres per feature, `octaves` halve the scale\n * and amplitude each time. Same Rng state → same field, bit for bit.\n */\nexport function valueNoise(\n rng: Rng,\n o: { readonly scale?: number; readonly octaves?: number } = {},\n): Field {\n const perm = new Uint8Array(512);\n const vals = new Float64Array(256);\n for (let i = 0; i < 256; i++) {\n perm[i] = i;\n vals[i] = rng.next() * 2 - 1;\n }\n for (let i = 255; i > 0; i--) {\n const j = rng.int(0, i);\n const t = perm[i] ?? 0;\n perm[i] = perm[j] ?? 0;\n perm[j] = t;\n }\n for (let i = 0; i < 256; i++) perm[i + 256] = perm[i] ?? 0;\n const at = (x: number, y: number, z: number): number =>\n vals[perm[(perm[(perm[x & 255] ?? 0) + (y & 255)] ?? 0) + (z & 255)] ?? 0] ?? 0;\n const fade = (t: number): number => t * t * t * (t * (t * 6 - 15) + 10);\n const lerp = (a: number, b: number, t: number): number => a + (b - a) * t;\n const one = (x: number, y: number, z: number): number => {\n const xi = Math.floor(x);\n const yi = Math.floor(y);\n const zi = Math.floor(z);\n const u = fade(x - xi);\n const v = fade(y - yi);\n const w = fade(z - zi);\n const plane = (k: number): number =>\n lerp(\n lerp(at(xi, yi, k), at(xi + 1, yi, k), u),\n lerp(at(xi, yi + 1, k), at(xi + 1, yi + 1, k), u),\n v,\n );\n return lerp(plane(zi), plane(zi + 1), w);\n };\n const s = 1 / (o.scale ?? 1);\n const octaves = o.octaves ?? 3;\n return (p) => {\n let sum = 0;\n let amp = 1;\n let norm = 0;\n let f = s;\n for (let i = 0; i < octaves; i++) {\n sum += amp * one(p[0] * f, p[1] * f, p[2] * f);\n norm += amp;\n amp *= 0.5;\n f *= 2;\n }\n return sum / norm;\n };\n}\n"
|
|
39
|
+
],
|
|
40
|
+
"mappings": "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",
|
|
41
|
+
"debugId": "1A8BAFD57A1802CD64756E2164756E21",
|
|
42
|
+
"names": []
|
|
43
|
+
}
|