@developerz.ai/ts23d 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +79 -0
- package/CLAUDE.md +85 -0
- package/LICENSE +21 -0
- package/README.md +380 -2
- package/dist/chunk-11v28977.js +1575 -0
- package/dist/chunk-11v28977.js.map +30 -0
- package/dist/chunk-1ypfs7ga.js +3571 -0
- package/dist/chunk-1ypfs7ga.js.map +42 -0
- package/dist/chunk-4ddzsqtc.js +464 -0
- package/dist/chunk-4ddzsqtc.js.map +19 -0
- package/dist/chunk-a8fxakcj.js +19 -0
- package/dist/chunk-a8fxakcj.js.map +11 -0
- package/dist/chunk-gcyp9b4d.js +755 -0
- package/dist/chunk-gcyp9b4d.js.map +22 -0
- package/dist/chunk-kgvbpqqw.js +44 -0
- package/dist/chunk-kgvbpqqw.js.map +10 -0
- package/dist/chunk-kvcep7ft.js +1919 -0
- package/dist/chunk-kvcep7ft.js.map +43 -0
- package/dist/chunk-ravbb06q.js +89 -0
- package/dist/chunk-ravbb06q.js.map +11 -0
- package/dist/chunk-w1zyhj40.js +1031 -0
- package/dist/chunk-w1zyhj40.js.map +21 -0
- package/dist/chunk-wtqhq529.js +2532 -0
- package/dist/chunk-wtqhq529.js.map +43 -0
- package/dist/chunk-xnt2sdhf.js +836 -0
- package/dist/chunk-xnt2sdhf.js.map +17 -0
- package/dist/cli/args.d.ts +24 -0
- package/dist/cli/bin.d.ts +2 -0
- package/dist/cli/bin.js +307 -0
- package/dist/cli/bin.js.map +14 -0
- package/dist/cli/load.d.ts +2 -0
- package/dist/cli/manifest.d.ts +49 -0
- package/dist/cli/render-cmds.d.ts +12 -0
- package/dist/cli/run.d.ts +1 -0
- package/dist/core/asset.d.ts +10 -0
- package/dist/core/definition.d.ts +148 -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/glb.d.ts +38 -0
- package/dist/export/index.d.ts +4 -0
- package/dist/export/index.js +26 -0
- package/dist/export/index.js.map +9 -0
- package/dist/export/lights.d.ts +8 -0
- package/dist/export/materials.d.ts +23 -0
- package/dist/export/merge-pivots.d.ts +6 -0
- package/dist/export/metadata.d.ts +19 -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 +411 -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 +9 -0
- package/dist/kinds/head-beard.d.ts +6 -0
- package/dist/kinds/head-bust.d.ts +4 -0
- package/dist/kinds/head-extras.d.ts +15 -0
- package/dist/kinds/head-face.d.ts +6 -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 +27 -0
- package/dist/kinds/head-params.d.ts +108 -0
- package/dist/kinds/head-presets.d.ts +19 -0
- package/dist/kinds/head-rim.d.ts +10 -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/generator.d.ts +4 -0
- package/dist/material/index.d.ts +4 -0
- package/dist/material/index.js +38 -0
- package/dist/material/index.js.map +9 -0
- package/dist/material/paint/bond.d.ts +3 -0
- package/dist/material/paint/canvas.d.ts +32 -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 +2 -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/masks.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 +35 -0
- package/dist/material/paint/validate.d.ts +3 -0
- package/dist/material/palette.d.ts +12 -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/trim-sheet.d.ts +22 -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 +20 -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 +52 -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 +80 -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/landscape.md +49 -0
- package/docs/plans/roadmap.md +127 -0
- package/examples/build-with-bun.ts +41 -0
- package/llms.txt +47 -0
- package/package.json +99 -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 +46 -0
- package/recipes/boxcar/boxcar.ts +916 -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 +62 -0
- package/recipes/goblin_head/goblin_head.ts +36 -0
- package/recipes/human_head/README.md +64 -0
- package/recipes/human_head/human_head.ts +37 -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 +183 -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 +66 -0
- package/recipes/orc_head/orc_head.ts +39 -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 +112 -0
- package/src/cli/bin.ts +7 -0
- package/src/cli/load.ts +17 -0
- package/src/cli/manifest.ts +89 -0
- package/src/cli/render-cmds.ts +66 -0
- package/src/cli/run.ts +168 -0
- package/src/core/asset.ts +128 -0
- package/src/core/definition.ts +149 -0
- package/src/core/errors.ts +45 -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/glb.ts +200 -0
- package/src/export/index.ts +18 -0
- package/src/export/lights.ts +49 -0
- package/src/export/materials.ts +126 -0
- package/src/export/merge-pivots.ts +146 -0
- package/src/export/metadata.ts +59 -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 +151 -0
- package/src/kinds/head-beard.ts +133 -0
- package/src/kinds/head-bust.ts +221 -0
- package/src/kinds/head-extras.ts +150 -0
- package/src/kinds/head-face.ts +222 -0
- package/src/kinds/head-geom.ts +31 -0
- package/src/kinds/head-hair.ts +152 -0
- package/src/kinds/head-layout.ts +63 -0
- package/src/kinds/head-mesh.ts +157 -0
- package/src/kinds/head-params.ts +153 -0
- package/src/kinds/head-presets.ts +152 -0
- package/src/kinds/head-rim.ts +128 -0
- package/src/kinds/head.ts +171 -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/generator.ts +56 -0
- package/src/material/index.ts +29 -0
- package/src/material/paint/bond.ts +60 -0
- package/src/material/paint/canvas.ts +91 -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 +100 -0
- package/src/material/paint/default-sheet.ts +61 -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/masks.ts +44 -0
- package/src/material/paint/noise.ts +52 -0
- package/src/material/paint/normal.ts +52 -0
- package/src/material/paint/orm.ts +95 -0
- package/src/material/paint/planks.ts +56 -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 +42 -0
- package/src/material/paint/surface.ts +60 -0
- package/src/material/paint/types.ts +51 -0
- package/src/material/paint/validate.ts +58 -0
- package/src/material/palette.ts +43 -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/trim-sheet.ts +100 -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 +95 -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 +199 -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,81 @@
|
|
|
1
|
+
import {
|
|
2
|
+
box2,
|
|
3
|
+
lathe2,
|
|
4
|
+
cylinder2,
|
|
5
|
+
beam2,
|
|
6
|
+
cell2,
|
|
7
|
+
hydraulicErosion2,
|
|
8
|
+
heightfield2,
|
|
9
|
+
triangulate2,
|
|
10
|
+
lattice2,
|
|
11
|
+
ringXY2,
|
|
12
|
+
loft2,
|
|
13
|
+
gradientNoise22,
|
|
14
|
+
valueNoise22,
|
|
15
|
+
fbm2,
|
|
16
|
+
billow2,
|
|
17
|
+
ridged2,
|
|
18
|
+
warp2,
|
|
19
|
+
terrace2,
|
|
20
|
+
planar2,
|
|
21
|
+
prism2,
|
|
22
|
+
sd2,
|
|
23
|
+
sdf2,
|
|
24
|
+
sculptField2,
|
|
25
|
+
sculpt2,
|
|
26
|
+
arcLengths2,
|
|
27
|
+
transportFrames2,
|
|
28
|
+
sweep2,
|
|
29
|
+
terrainGrid2,
|
|
30
|
+
sampler2,
|
|
31
|
+
slopeMap2,
|
|
32
|
+
thermalErosion2,
|
|
33
|
+
terrainColor2,
|
|
34
|
+
measureText2,
|
|
35
|
+
text2,
|
|
36
|
+
tiled2,
|
|
37
|
+
valueNoise3
|
|
38
|
+
} from "../chunk-wtqhq529.js";
|
|
39
|
+
import"../chunk-kvcep7ft.js";
|
|
40
|
+
import"../chunk-4ddzsqtc.js";
|
|
41
|
+
export {
|
|
42
|
+
arcLengths2 as arcLengths,
|
|
43
|
+
beam2 as beam,
|
|
44
|
+
billow2 as billow,
|
|
45
|
+
box2 as box,
|
|
46
|
+
cell2 as cell,
|
|
47
|
+
cylinder2 as cylinder,
|
|
48
|
+
fbm2 as fbm,
|
|
49
|
+
gradientNoise22 as gradientNoise2,
|
|
50
|
+
heightfield2 as heightfield,
|
|
51
|
+
hydraulicErosion2 as hydraulicErosion,
|
|
52
|
+
lathe2 as lathe,
|
|
53
|
+
lattice2 as lattice,
|
|
54
|
+
loft2 as loft,
|
|
55
|
+
measureText2 as measureText,
|
|
56
|
+
planar2 as planar,
|
|
57
|
+
prism2 as prism,
|
|
58
|
+
ridged2 as ridged,
|
|
59
|
+
ringXY2 as ringXY,
|
|
60
|
+
sampler2 as sampler,
|
|
61
|
+
sculpt2 as sculpt,
|
|
62
|
+
sculptField2 as sculptField,
|
|
63
|
+
sd2 as sd,
|
|
64
|
+
sdf2 as sdf,
|
|
65
|
+
slopeMap2 as slopeMap,
|
|
66
|
+
sweep2 as sweep,
|
|
67
|
+
terrace2 as terrace,
|
|
68
|
+
terrainColor2 as terrainColor,
|
|
69
|
+
terrainGrid2 as terrainGrid,
|
|
70
|
+
text2 as text,
|
|
71
|
+
thermalErosion2 as thermalErosion,
|
|
72
|
+
tiled2 as tiled,
|
|
73
|
+
transportFrames2 as transportFrames,
|
|
74
|
+
triangulate2 as triangulate,
|
|
75
|
+
valueNoise3 as valueNoise,
|
|
76
|
+
valueNoise22 as valueNoise2,
|
|
77
|
+
warp2 as warp
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
//# debugId=5990930430129EC464756E2164756E21
|
|
81
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Vec2, Vec3 } from '../core/index.js';
|
|
2
|
+
/** The profile and segment count lathe was given. */
|
|
3
|
+
interface Facetable {
|
|
4
|
+
readonly profile: readonly Vec2[];
|
|
5
|
+
readonly segments: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function facets(o: Facetable, put: (p: Vec3, n: Vec3, uv: Vec2) => number, tri: (a: number, b: number, c: number) => void, sideUv: (s: number, i: number, r: number) => Vec2): void;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type Mesh, type Vec2, type Vec3 } from '../core/index.js';
|
|
2
|
+
import { type StripId } from '../material/index.js';
|
|
3
|
+
export interface LatheOptions {
|
|
4
|
+
readonly profile: readonly Vec2[];
|
|
5
|
+
readonly segments: number;
|
|
6
|
+
readonly color: Vec3;
|
|
7
|
+
readonly strip?: StripId;
|
|
8
|
+
/** Rotate the lathe axis from Z onto X or Y (wheels spin about Y). */
|
|
9
|
+
readonly axis?: 'x' | 'y' | 'z';
|
|
10
|
+
readonly at?: Vec3;
|
|
11
|
+
/** Close the ends with fans (solid cylinders/wheels). */
|
|
12
|
+
readonly caps?: boolean;
|
|
13
|
+
/** Profile turns sharper than this (degrees) get split normals: a hard rim, not a smear
|
|
14
|
+
* whose averaged normal opposes one band. Default 50. */
|
|
15
|
+
readonly creaseDeg?: number;
|
|
16
|
+
/** 'metres': true-scale strip mapping. Default 'stretch'. */
|
|
17
|
+
readonly uv?: 'stretch' | 'metres';
|
|
18
|
+
/** Flat facets: one normal per segment (an n-sided prism of revolution). */
|
|
19
|
+
readonly faceted?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare function lathe(o: LatheOptions): Mesh;
|
|
22
|
+
/** Convenience: a capped cylinder, the most common lathe. */
|
|
23
|
+
export declare const cylinder: (o: Omit<LatheOptions, 'profile' | 'caps'> & {
|
|
24
|
+
radius: number;
|
|
25
|
+
length: number;
|
|
26
|
+
}) => Mesh;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type Mesh, type Vec3 } from '../core/index.js';
|
|
2
|
+
import { type StripId } from '../material/index.js';
|
|
3
|
+
import { type SectionKind } from './member.js';
|
|
4
|
+
export type TrussPattern = 'warren' | 'pratt' | 'howe' | 'x';
|
|
5
|
+
export interface LatticeOptions {
|
|
6
|
+
readonly from: Vec3;
|
|
7
|
+
readonly to: Vec3;
|
|
8
|
+
/** Chord-to-chord height in metres (at `from`; `depthEnd` tapers it toward `to`). */
|
|
9
|
+
readonly depth: number;
|
|
10
|
+
readonly depthEnd?: number;
|
|
11
|
+
/** Box truss: chord spacing across, metres (and `widthEnd`). Omit for a planar truss. */
|
|
12
|
+
readonly width?: number;
|
|
13
|
+
readonly widthEnd?: number;
|
|
14
|
+
/** Which way depth rises. Default world Z (world X for a vertical truss). */
|
|
15
|
+
readonly up?: Vec3;
|
|
16
|
+
readonly centred?: boolean;
|
|
17
|
+
readonly pattern?: TrussPattern;
|
|
18
|
+
/** Panels along the length. Default ≈ length / depth. */
|
|
19
|
+
readonly bays?: number;
|
|
20
|
+
/** Chord member width, metres. */
|
|
21
|
+
readonly chord: number;
|
|
22
|
+
/** Web member width. Default 0.6 · chord. */
|
|
23
|
+
readonly web?: number;
|
|
24
|
+
readonly section?: SectionKind;
|
|
25
|
+
readonly color: Vec3;
|
|
26
|
+
readonly strip?: StripId;
|
|
27
|
+
}
|
|
28
|
+
export declare function lattice(o: LatticeOptions): Mesh;
|
|
29
|
+
/** Web members of one face as [t0, onTop0, t1, onTop1], in a fixed order (determinism). */
|
|
30
|
+
export declare function webMembers(pattern: TrussPattern, k: number): [number, boolean, number, boolean][];
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Mesh, type Vec3 } from '../core/index.js';
|
|
2
|
+
import { type StripId } from '../material/index.js';
|
|
3
|
+
export type LoftColor = Vec3 | ((ring: readonly Vec3[], i: number, p: Vec3) => Vec3);
|
|
4
|
+
export interface LoftOptions {
|
|
5
|
+
readonly rings: readonly (readonly Vec3[])[];
|
|
6
|
+
/** One colour, or one per vertex from (ring, ring index, point). */
|
|
7
|
+
readonly color: LoftColor;
|
|
8
|
+
readonly strip?: StripId;
|
|
9
|
+
readonly capStart?: boolean;
|
|
10
|
+
readonly capEnd?: boolean;
|
|
11
|
+
readonly uv?: 'length' | 'row' | 'swap';
|
|
12
|
+
}
|
|
13
|
+
/** An elliptical ring in the plane z = centre.z, CCW seen from +Z; `wobble(angle)` scales radius. */
|
|
14
|
+
export declare function ringXY(centre: Vec3, rx: number, ry: number, segments: number, wobble?: (angle: number) => number, phase?: number): Vec3[];
|
|
15
|
+
export declare function loft(o: LoftOptions): Mesh;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { MeshBuilder, Vec2, Vec3 } from '../core/index.js';
|
|
2
|
+
import type { UvRect } from '../material/index.js';
|
|
3
|
+
export type SectionKind = 'square' | 'angle';
|
|
4
|
+
export interface Section {
|
|
5
|
+
/** Profile in the member's (x, y) plane, CCW seen from the far end. */
|
|
6
|
+
readonly ring: readonly Vec2[];
|
|
7
|
+
readonly caps: readonly (readonly [number, number, number])[];
|
|
8
|
+
/** Cumulative perimeter run at each ring vertex, as a fraction 0..1 (V across the strip). */
|
|
9
|
+
readonly run: readonly number[];
|
|
10
|
+
/** Side triangles per member (caps add 2 · caps.length). */
|
|
11
|
+
readonly sideTris: number;
|
|
12
|
+
}
|
|
13
|
+
/** A section of outside width `w`; angle legs are 15% of the width thick. */
|
|
14
|
+
export declare function section(kind: SectionKind, w: number): Section;
|
|
15
|
+
/**
|
|
16
|
+
* Extrude `s` from a to b. `y` is the section's local up (must not be parallel to b − a): put it
|
|
17
|
+
* on the face normal so members lie flush in their truss plane. Caps close both ends.
|
|
18
|
+
*/
|
|
19
|
+
export declare function emitMember(mb: MeshBuilder, s: Section, a: Vec3, b: Vec3, y: Vec3, caps: boolean, color: Vec3, rect: UvRect): void;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Rng } from '../core/index.js';
|
|
2
|
+
export type Noise2 = (x: number, y: number) => number;
|
|
3
|
+
export interface FractalOptions {
|
|
4
|
+
/** Metres per base feature (the first octave's wavelength). Default 1. */
|
|
5
|
+
readonly scale?: number;
|
|
6
|
+
readonly octaves?: number;
|
|
7
|
+
/** Frequency multiplier per octave. Default 2. */
|
|
8
|
+
readonly lacunarity?: number;
|
|
9
|
+
/** Amplitude multiplier per octave (persistence). Default 0.5. */
|
|
10
|
+
readonly gain?: number;
|
|
11
|
+
}
|
|
12
|
+
/** Perlin gradient noise, feature size 1 m, ≈ [−1, 1]. */
|
|
13
|
+
export declare function gradientNoise2(rng: Rng): Noise2;
|
|
14
|
+
/** Value noise (smoothed random lattice), feature size 1 m, [−1, 1]. Blobbier than gradient. */
|
|
15
|
+
export declare function valueNoise2(rng: Rng): Noise2;
|
|
16
|
+
/** Fractal Brownian motion: the default rolling-hills / rough-surface noise, ≈ [−1, 1]. */
|
|
17
|
+
export declare const fbm: (n: Noise2, o?: FractalOptions) => Noise2;
|
|
18
|
+
/** Billow: |noise| octaves, rounded domes and sharp creases (hills, clouds), [−1, 1]. */
|
|
19
|
+
export declare const billow: (n: Noise2, o?: FractalOptions) => Noise2;
|
|
20
|
+
/**
|
|
21
|
+
* Ridged multifractal (Musgrave): inverted |noise| squared, each octave weighted by the last, so
|
|
22
|
+
* detail piles up on the ridgelines and valleys stay smooth. [0, 1].
|
|
23
|
+
*/
|
|
24
|
+
export declare function ridged(n: Noise2, o?: FractalOptions & {
|
|
25
|
+
readonly offset?: number;
|
|
26
|
+
}): Noise2;
|
|
27
|
+
/** Domain warp: sample `n` at a point pushed by two other noises × `amount` metres (Quílez). */
|
|
28
|
+
export declare const warp: (n: Noise2, wx: Noise2, wy: Noise2, amount: number) => Noise2;
|
|
29
|
+
/**
|
|
30
|
+
* Terraces: snap a height to steps of `step` metres. `sharpness` is the share of each step that is
|
|
31
|
+
* a flat tread (0 = no terracing, 1 = flat treads and vertical risers); the rest is a smooth riser.
|
|
32
|
+
* Strata, rice paddies, open-pit benches.
|
|
33
|
+
*/
|
|
34
|
+
export declare function terrace(h: number, step: number, sharpness?: number): number;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Mesh, type Vec3 } from '../core/index.js';
|
|
2
|
+
import { type StripId } from '../material/index.js';
|
|
3
|
+
export interface PlanarOptions {
|
|
4
|
+
/** Counter-clockwise as seen from the side the face points to. */
|
|
5
|
+
readonly points: readonly Vec3[];
|
|
6
|
+
readonly color: Vec3;
|
|
7
|
+
readonly strip?: StripId;
|
|
8
|
+
readonly doubleSided?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function planar(o: PlanarOptions): Mesh;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Mesh, type Vec2, type Vec3 } from '../core/index.js';
|
|
2
|
+
import { type StripId } from '../material/index.js';
|
|
3
|
+
export interface PrismOptions {
|
|
4
|
+
readonly profile: readonly Vec2[];
|
|
5
|
+
readonly depth: number;
|
|
6
|
+
readonly plane?: 'xz' | 'xy' | 'yz';
|
|
7
|
+
/** Extrusion is centred on the plane unless `from` is given (0 = starts at the plane). */
|
|
8
|
+
readonly centred?: boolean;
|
|
9
|
+
readonly color: Vec3;
|
|
10
|
+
readonly strip?: StripId;
|
|
11
|
+
readonly caps?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function prism(o: PrismOptions): Mesh;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Vec3 } from '../core/index.js';
|
|
2
|
+
import { type Field } from './sdf-ops.js';
|
|
3
|
+
export type SculptShape = 'sphere' | 'ellipsoid' | 'capsule' | 'roundBox' | 'cone' | 'torus';
|
|
4
|
+
/** An edit: one shape, or a group of edits folded on their own first (local trims). */
|
|
5
|
+
export type SculptEdit = SculptShapeEdit | SculptGroup;
|
|
6
|
+
/**
|
|
7
|
+
* Edits folded on their own (from nothing), then applied to the sculpt as ONE edit with this
|
|
8
|
+
* op/blend/colour: subtract or intersect inside the group trims only the group's shapes (a
|
|
9
|
+
* half-sphere eyelid, a hair cap stopped at the hairline) and leaves earlier edits alone.
|
|
10
|
+
*/
|
|
11
|
+
export interface SculptGroup {
|
|
12
|
+
readonly group: readonly SculptEdit[];
|
|
13
|
+
readonly op?: 'add' | 'subtract' | 'intersect';
|
|
14
|
+
readonly blend?: number;
|
|
15
|
+
/** Default colour of the group's own edits (and its colour when it carves). */
|
|
16
|
+
readonly color?: Vec3;
|
|
17
|
+
/** Default mirror for the group's edits. */
|
|
18
|
+
readonly mirror?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface SculptShapeEdit {
|
|
21
|
+
readonly shape: SculptShape;
|
|
22
|
+
/** Centre (sphere, ellipsoid, roundBox, torus), base centre (cone) or start (capsule). */
|
|
23
|
+
readonly at: Vec3;
|
|
24
|
+
/**
|
|
25
|
+
* sphere: radius · ellipsoid: [rx, ry, rz] · roundBox: full [x, y, z] · cone: [base radius,
|
|
26
|
+
* top radius, height] along local +Z · torus: [ring radius, tube radius] in local XY ·
|
|
27
|
+
* capsule: radius (segment `at` → `to`).
|
|
28
|
+
*/
|
|
29
|
+
readonly size: number | readonly [number, number] | Vec3;
|
|
30
|
+
/** Capsule end point. */
|
|
31
|
+
readonly to?: Vec3;
|
|
32
|
+
/** Degrees about X, then Y, then Z (world axes), around `at`. */
|
|
33
|
+
readonly rotate?: Vec3;
|
|
34
|
+
/** roundBox edge radius, metres. */
|
|
35
|
+
readonly round?: number;
|
|
36
|
+
readonly op?: 'add' | 'subtract' | 'intersect' | 'paint';
|
|
37
|
+
/** Smooth-blend radius in metres (0 = hard edge). For paint: the colour falloff width. */
|
|
38
|
+
readonly blend?: number;
|
|
39
|
+
readonly color?: Vec3;
|
|
40
|
+
/** Override the sculpt's `mirror` for this edit (e.g. one scar). */
|
|
41
|
+
readonly mirror?: boolean;
|
|
42
|
+
}
|
|
43
|
+
export declare function sculptShape(e: SculptShapeEdit, i: number, mirrorAll: boolean): Field;
|
|
44
|
+
/**
|
|
45
|
+
* A sphere the shape lies in, and how its field compares with the distance to it: every shape's
|
|
46
|
+
* value v satisfies v ≥ scale · (|p − centre| − radius) outside the sphere (scale 1 = exact SDFs;
|
|
47
|
+
* the ellipsoid approximation only guarantees (r_min / r_max)², and nothing inside its sphere).
|
|
48
|
+
*/
|
|
49
|
+
export declare function shapeSphere(e: SculptShapeEdit): {
|
|
50
|
+
c: Vec3;
|
|
51
|
+
r: number;
|
|
52
|
+
scale: number;
|
|
53
|
+
inside: boolean;
|
|
54
|
+
};
|
|
55
|
+
/** Conservative world bounds of an add edit (bounding sphere), grown by its blend radius. */
|
|
56
|
+
export declare function editBounds(e: SculptEdit, mirrorAll: boolean): [Vec3, Vec3];
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Vec3 } from '../core/index.js';
|
|
2
|
+
import { type SculptEdit } from './sculpt-edit.js';
|
|
3
|
+
import type { Field } from './sdf-ops.js';
|
|
4
|
+
export interface Node {
|
|
5
|
+
readonly op: number;
|
|
6
|
+
readonly k: number;
|
|
7
|
+
/** The edit's own colour (shapes), or null. */
|
|
8
|
+
readonly color: Vec3 | null;
|
|
9
|
+
readonly shape: Field | null;
|
|
10
|
+
readonly kids: readonly Node[] | null;
|
|
11
|
+
/** Default colour for this group's edits; its scratch colour buffer. */
|
|
12
|
+
readonly base: Vec3;
|
|
13
|
+
readonly rgb: Float64Array;
|
|
14
|
+
readonly c: Vec3;
|
|
15
|
+
readonly r: number;
|
|
16
|
+
readonly scale: number;
|
|
17
|
+
readonly inside: boolean;
|
|
18
|
+
readonly mirror: boolean;
|
|
19
|
+
readonly under: number;
|
|
20
|
+
}
|
|
21
|
+
export declare function compile(edits: readonly SculptEdit[], base: Vec3, mirror: boolean, path?: string): Node[];
|
|
22
|
+
/** Fold `nodes` at p; writes the blended colour into `rgb` (seeded with `base`) when given. */
|
|
23
|
+
export declare function fold(nodes: readonly Node[], p: Vec3, rgb: Float64Array | null, base: Vec3, sparse?: boolean): number;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Mesh, Vec3 } from '../core/index.js';
|
|
2
|
+
import type { StripId } from '../material/index.js';
|
|
3
|
+
import { type SculptEdit } from './sculpt-edit.js';
|
|
4
|
+
import type { Field } from './sdf-ops.js';
|
|
5
|
+
export type { SculptEdit, SculptGroup, SculptShape, SculptShapeEdit } from './sculpt-edit.js';
|
|
6
|
+
export interface SculptField {
|
|
7
|
+
readonly field: Field;
|
|
8
|
+
/** Blended edit colour at a point (call at surface points). */
|
|
9
|
+
readonly colorAt: (p: Vec3) => Vec3;
|
|
10
|
+
/** Edits' bounds grown by their blend radii. */
|
|
11
|
+
readonly bounds: readonly [Vec3, Vec3];
|
|
12
|
+
}
|
|
13
|
+
export interface SculptOptions {
|
|
14
|
+
readonly edits: readonly SculptEdit[];
|
|
15
|
+
/** Cell edge in metres (the LOD knob). */
|
|
16
|
+
readonly resolution: number;
|
|
17
|
+
/** Colour of edits that give none. */
|
|
18
|
+
readonly color: Vec3;
|
|
19
|
+
readonly mirror?: 'y';
|
|
20
|
+
readonly mesher?: 'nets' | 'cubes';
|
|
21
|
+
readonly strip?: StripId;
|
|
22
|
+
}
|
|
23
|
+
export declare function sculptField(edits: readonly SculptEdit[], o: {
|
|
24
|
+
readonly color: Vec3;
|
|
25
|
+
readonly mirror?: 'y';
|
|
26
|
+
}): SculptField;
|
|
27
|
+
export declare function sculpt(o: SculptOptions): Mesh;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Vec3 } from '../core/index.js';
|
|
2
|
+
import type { Field } from './sdf-ops.js';
|
|
3
|
+
export interface Grid {
|
|
4
|
+
/** Points per axis. */
|
|
5
|
+
readonly nx: number;
|
|
6
|
+
readonly ny: number;
|
|
7
|
+
readonly nz: number;
|
|
8
|
+
/** Position of point (0, 0, 0) and the cell edge, metres. */
|
|
9
|
+
readonly origin: Vec3;
|
|
10
|
+
readonly h: number;
|
|
11
|
+
readonly values: Float32Array;
|
|
12
|
+
/** The clipped field the grid sampled (normals take its gradient). */
|
|
13
|
+
readonly field: Field;
|
|
14
|
+
}
|
|
15
|
+
/** Grid points above this are refused (≈ 80 MB of samples). */
|
|
16
|
+
export declare const MAX_POINTS: number;
|
|
17
|
+
export declare function sampleGrid(raw: Field, bounds: readonly [Vec3, Vec3], h: number, lipschitz: number, symmetricY?: boolean): Grid;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Vec3 } from '../core/index.js';
|
|
2
|
+
export type Field = (p: Vec3) => number;
|
|
3
|
+
/** Shape distances in the shape's own frame (centre/base at the origin). */
|
|
4
|
+
export declare const shapes: {
|
|
5
|
+
sphere: (x: number, y: number, z: number, r: number) => number;
|
|
6
|
+
ellipsoid(x: number, y: number, z: number, rx: number, ry: number, rz: number): number;
|
|
7
|
+
/** Box of half extents (hx, hy, hz) with edges rounded by `r`. */
|
|
8
|
+
roundBox(x: number, y: number, z: number, hx: number, hy: number, hz: number, r: number): number;
|
|
9
|
+
/** Segment (0,0,0) → (0,0,len) with radius r. */
|
|
10
|
+
capsule(x: number, y: number, z: number, len: number, r: number): number;
|
|
11
|
+
/** Capped cone standing on z = 0: base radius r1, top radius r2, height h. */
|
|
12
|
+
cone(x: number, y: number, z: number, r1: number, r2: number, h: number): number;
|
|
13
|
+
/** Ring in the XY plane: major radius R, tube radius r. */
|
|
14
|
+
torus(x: number, y: number, z: number, R: number, r: number): number;
|
|
15
|
+
};
|
|
16
|
+
/** Polynomial smooth-min weight: 1 → all `a`, 0 → all `b`; k = 0 is a hard min. */
|
|
17
|
+
export declare const smoothWeight: (a: number, b: number, k: number) => number;
|
|
18
|
+
/** Field constructors and combinators, world space. */
|
|
19
|
+
export declare const sd: {
|
|
20
|
+
sphere: (at: Vec3, r: number) => Field;
|
|
21
|
+
ellipsoid: (at: Vec3, radii: Vec3) => Field;
|
|
22
|
+
/** Axis-aligned box of full `size` centred on `at`, edges rounded by `round`. */
|
|
23
|
+
box: (at: Vec3, size: Vec3, round?: number) => Field;
|
|
24
|
+
capsule(a: Vec3, b: Vec3, r: number): Field;
|
|
25
|
+
cone: (at: Vec3, r1: number, r2: number, h: number) => Field;
|
|
26
|
+
torus: (at: Vec3, R: number, r: number) => Field;
|
|
27
|
+
union: (...fs: readonly Field[]) => Field;
|
|
28
|
+
intersect: (a: Field, b: Field) => Field;
|
|
29
|
+
/** a minus b. */
|
|
30
|
+
subtract: (a: Field, b: Field) => Field;
|
|
31
|
+
/** Union with a fillet of radius ~k metres between the two. */
|
|
32
|
+
smoothUnion: (k: number, a: Field, b: Field) => Field;
|
|
33
|
+
/** a minus b with a rounded crease of ~k metres. */
|
|
34
|
+
smoothSubtract: (k: number, a: Field, b: Field) => Field;
|
|
35
|
+
/** Push the surface out/in by `amount` metres × noise (∈ [−1, 1]). */
|
|
36
|
+
displace: (f: Field, noise: Field, amount: number) => Field;
|
|
37
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type Mesh, type Vec3 } from '../core/index.js';
|
|
2
|
+
import { type StripId } from '../material/index.js';
|
|
3
|
+
/** One colour, or one per vertex from its position and unit normal (moss on top, dark in cracks). */
|
|
4
|
+
export type SdfColor = Vec3 | ((p: Vec3, n: Vec3) => Vec3);
|
|
5
|
+
export interface SdfOptions {
|
|
6
|
+
/** Signed distance in metres: negative inside. Must not keep the `p` it is given. */
|
|
7
|
+
readonly field: (p: Vec3) => number;
|
|
8
|
+
/** [min, max] corners; the surface is clipped to this box, so it is always closed. */
|
|
9
|
+
readonly bounds: readonly [Vec3, Vec3];
|
|
10
|
+
/** Cell edge in metres (the LOD knob). */
|
|
11
|
+
readonly resolution: number;
|
|
12
|
+
readonly color: SdfColor;
|
|
13
|
+
readonly strip?: StripId;
|
|
14
|
+
readonly mesher?: 'nets' | 'cubes';
|
|
15
|
+
/** Upper bound on |∇field| (1 for exact distances). Raise it for strongly displaced fields so
|
|
16
|
+
* the sparse pass never skips a block that holds surface. Default 1.25. */
|
|
17
|
+
readonly lipschitz?: number;
|
|
18
|
+
/** 'y': the field is mirror-symmetric across y = 0 — snap the grid so the mesh is too. */
|
|
19
|
+
readonly symmetry?: 'y';
|
|
20
|
+
}
|
|
21
|
+
export declare function sdf(o: SdfOptions): Mesh;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type StripId, type UvRect } from '../material/index.js';
|
|
2
|
+
/** Half a texel at the house sheet size: keeps bilinear samples inside the region. */
|
|
3
|
+
export declare const HALF_TEXEL: number;
|
|
4
|
+
/** World metres one strip band covers along V on the house sheet (`scaleMetres`). */
|
|
5
|
+
export declare const stripVMetres: (id: StripId) => number;
|
|
6
|
+
/** U for a run of `metres` along the strip. */
|
|
7
|
+
export declare const stripU: (rect: UvRect, metres: number) => number;
|
|
8
|
+
/** V for a fraction 0..1 of one band. */
|
|
9
|
+
export declare const stripV: (rect: UvRect, frac: number) => number;
|
|
10
|
+
/** V for any metre value, mirrored every band: continuous, never leaves the strip (organic). */
|
|
11
|
+
export declare function mirroredV(rect: UvRect, metres: number, vMetres: number): number;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type Mesh, type Vec2, type Vec3 } from '../core/index.js';
|
|
2
|
+
import { type StripId } from '../material/index.js';
|
|
3
|
+
export interface SweepOptions {
|
|
4
|
+
/** Closed section in the frame's (normal, binormal) plane, either winding; or a circle. */
|
|
5
|
+
readonly section: readonly Vec2[] | {
|
|
6
|
+
readonly radius: number;
|
|
7
|
+
readonly segments: number;
|
|
8
|
+
};
|
|
9
|
+
readonly path: readonly Vec3[];
|
|
10
|
+
/** Section scale per path point (taper). Default 1 everywhere. */
|
|
11
|
+
readonly scale?: readonly number[];
|
|
12
|
+
/** Total section rotation from first to last point, degrees, spread by arc length. */
|
|
13
|
+
readonly twist?: number;
|
|
14
|
+
readonly color: Vec3;
|
|
15
|
+
readonly strip?: StripId;
|
|
16
|
+
/** Close the ends with fans about the path point: both, or just one. */
|
|
17
|
+
readonly caps?: boolean | 'start' | 'end';
|
|
18
|
+
}
|
|
19
|
+
export declare function sweep(o: SweepOptions): Mesh;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Vec3 } from '../core/index.js';
|
|
2
|
+
import type { Noise2 } from './noise.js';
|
|
3
|
+
import { type TerrainGrid } from './terrain-grid.js';
|
|
4
|
+
export interface TerrainPalette {
|
|
5
|
+
readonly forest: Vec3;
|
|
6
|
+
readonly grass: Vec3;
|
|
7
|
+
/** Alpine debris/tundra above the meadows and on deposits. */
|
|
8
|
+
readonly scree: Vec3;
|
|
9
|
+
readonly rock: Vec3;
|
|
10
|
+
readonly snow: Vec3;
|
|
11
|
+
/** Damp ground in gullies and river beds. */
|
|
12
|
+
readonly wet: Vec3;
|
|
13
|
+
}
|
|
14
|
+
export interface TerrainColorOptions {
|
|
15
|
+
readonly palette: TerrainPalette;
|
|
16
|
+
/** Altitude of z = 0 in metres above sea level (z is relative to it). Default 0. */
|
|
17
|
+
readonly datum?: number;
|
|
18
|
+
/** Altitude where forest gives way to meadow, m. */
|
|
19
|
+
readonly treeline: number;
|
|
20
|
+
/** Altitude above which snow lies on gentle slopes, m. */
|
|
21
|
+
readonly snowline: number;
|
|
22
|
+
/** Slope (rise/run) where bare rock takes over: default 0.8 (≈ 39°). */
|
|
23
|
+
readonly rockSlope?: number;
|
|
24
|
+
/** Steepest slope that holds snow: default 1.0 (45°). */
|
|
25
|
+
readonly snowSlope?: number;
|
|
26
|
+
/** Noise in [−1, 1] (metres in) jittering every boundary; `jitter` = its altitude reach, m. */
|
|
27
|
+
readonly noise?: Noise2;
|
|
28
|
+
readonly jitter?: number;
|
|
29
|
+
}
|
|
30
|
+
export declare function terrainColor(g: TerrainGrid, o: TerrainColorOptions): (x: number, y: number, z: number) => Vec3;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface TerrainGrid {
|
|
2
|
+
/** Points along X and Y (cells + 1). Row-major: index = j · nx + i. */
|
|
3
|
+
readonly nx: number;
|
|
4
|
+
readonly ny: number;
|
|
5
|
+
/** [minX, minY, maxX, maxY] in metres. */
|
|
6
|
+
readonly rect: readonly [number, number, number, number];
|
|
7
|
+
readonly z: Float64Array;
|
|
8
|
+
/** Water passage per point, 0..1 (rivers, gullies). Set by hydraulicErosion. */
|
|
9
|
+
readonly flow?: Float64Array;
|
|
10
|
+
/** Sediment laid down per point, 0..1 (scree fans, valley fill). Set by hydraulicErosion. */
|
|
11
|
+
readonly deposit?: Float64Array;
|
|
12
|
+
}
|
|
13
|
+
export interface TerrainGridOptions {
|
|
14
|
+
readonly rect: readonly [number, number, number, number];
|
|
15
|
+
/** Cells per side (points = cells + 1); 256 ≈ 8 m on a 2 km tile. */
|
|
16
|
+
readonly cells: number;
|
|
17
|
+
readonly height: (x: number, y: number) => number;
|
|
18
|
+
}
|
|
19
|
+
export declare function terrainGrid(o: TerrainGridOptions): TerrainGrid;
|
|
20
|
+
/** Bilinear reader of any per-point map of the grid, clamped at the edges, in metres. */
|
|
21
|
+
export declare function sampler(g: TerrainGrid, map?: Float64Array): (x: number, y: number) => number;
|
|
22
|
+
/** Slope (rise / run, tan of the angle) at every point, by central differences. */
|
|
23
|
+
export declare function slopeMap(g: TerrainGrid): Float64Array;
|
|
24
|
+
export interface ThermalOptions {
|
|
25
|
+
/** Stable slope as rise/run: 0.7 ≈ 35° (scree's angle of repose). Default 0.7. */
|
|
26
|
+
readonly talus?: number;
|
|
27
|
+
readonly iterations?: number;
|
|
28
|
+
/** Share of the excess moved per iteration, 0..0.5. Default 0.4. */
|
|
29
|
+
readonly rate?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Thermal erosion: wherever a neighbour sits lower than the talus slope allows, part of the
|
|
33
|
+
* excess slides down to it. Every iteration reads the old heights and writes a new array, so the
|
|
34
|
+
* result is independent of visiting order.
|
|
35
|
+
*/
|
|
36
|
+
export declare function thermalErosion(g: TerrainGrid, o?: ThermalOptions): TerrainGrid;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type TextFont = '5x7' | 'block';
|
|
2
|
+
export interface MeasureOptions {
|
|
3
|
+
/** Cap height in metres (the 7 glyph rows). */
|
|
4
|
+
readonly height: number;
|
|
5
|
+
readonly font?: TextFont;
|
|
6
|
+
/** Gap between glyphs in pixels (1 px = height / 7). Default 1. */
|
|
7
|
+
readonly tracking?: number;
|
|
8
|
+
}
|
|
9
|
+
/** A filled rectangle: columns [c0, c1) from the line start, rows [r0, r1) from the cap line. */
|
|
10
|
+
export interface PixelRect {
|
|
11
|
+
readonly c0: number;
|
|
12
|
+
readonly c1: number;
|
|
13
|
+
readonly r0: number;
|
|
14
|
+
readonly r1: number;
|
|
15
|
+
}
|
|
16
|
+
/** Width of `str` in metres when set at cap `height`. Throws on characters without a glyph. */
|
|
17
|
+
export declare function measureText(str: string, o: MeasureOptions): number;
|
|
18
|
+
/** The line as merged pixel rectangles, plus its width in pixels. */
|
|
19
|
+
export declare function layout(str: string, font: TextFont, tracking: number): {
|
|
20
|
+
rects: PixelRect[];
|
|
21
|
+
width: number;
|
|
22
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Mesh, type Vec3 } from '../core/index.js';
|
|
2
|
+
import { type StripId } from '../material/index.js';
|
|
3
|
+
import { type TextFont } from './text-layout.js';
|
|
4
|
+
export { type MeasureOptions, measureText, type TextFont } from './text-layout.js';
|
|
5
|
+
export interface TextOptions {
|
|
6
|
+
readonly origin: Vec3;
|
|
7
|
+
/** Reading direction. Default +Y (a sign read from +X). */
|
|
8
|
+
readonly along?: Vec3;
|
|
9
|
+
/** Letter up. Default +Z. */
|
|
10
|
+
readonly up?: Vec3;
|
|
11
|
+
/** Cap height in metres. */
|
|
12
|
+
readonly height: number;
|
|
13
|
+
readonly color: Vec3;
|
|
14
|
+
readonly font?: TextFont;
|
|
15
|
+
/** Raised thickness in metres; 0 = flush decal lifted 2 mm. Default 0. */
|
|
16
|
+
readonly depth?: number;
|
|
17
|
+
/** Gap between glyphs in pixels (height / 7). Default 1. */
|
|
18
|
+
readonly tracking?: number;
|
|
19
|
+
readonly align?: 'left' | 'centre' | 'right';
|
|
20
|
+
/** Shrink the cap height so the line fits this width, metres. */
|
|
21
|
+
readonly maxWidth?: number;
|
|
22
|
+
/** Offset (m, along the facing normal) of the surface under a letter piece. `u` = metres along
|
|
23
|
+
* `along` from `origin` (negative left of a centre/right anchor), `v` = metres up from it. */
|
|
24
|
+
readonly surface?: (u: number, v: number) => number;
|
|
25
|
+
readonly strip?: StripId;
|
|
26
|
+
}
|
|
27
|
+
export declare function text(str: string, o: TextOptions): Mesh;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type Mesh, type Vec3 } from '../core/index.js';
|
|
2
|
+
import { type StripId } from '../material/index.js';
|
|
3
|
+
export interface TiledOptions {
|
|
4
|
+
/** One corner of the face. */
|
|
5
|
+
readonly origin: Vec3;
|
|
6
|
+
/** Edge along the strip (texture U), metres. */
|
|
7
|
+
readonly u: Vec3;
|
|
8
|
+
/** The other edge, texture "up" (V), metres. */
|
|
9
|
+
readonly v: Vec3;
|
|
10
|
+
readonly color: Vec3;
|
|
11
|
+
readonly strip?: StripId;
|
|
12
|
+
/** Columns along `u` (vertex density for grime/bending); the LOD knob. Default 1. */
|
|
13
|
+
readonly segments?: number;
|
|
14
|
+
/** Metres the pattern is shifted along U / V (continue a course round a corner). */
|
|
15
|
+
readonly uOffset?: number;
|
|
16
|
+
readonly vOffset?: number;
|
|
17
|
+
/** World metres one strip band spans along V. Default: the house sheet's `scaleMetres`.
|
|
18
|
+
* Raise it to stretch the strip (fewer bands, fewer triangles on a far LOD). */
|
|
19
|
+
readonly vMetres?: number;
|
|
20
|
+
readonly doubleSided?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function tiled(o: TiledOptions): Mesh;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type Vec3 } from '../core/index.js';
|
|
2
|
+
export interface SweepFrame {
|
|
3
|
+
/** Unit tangent. */
|
|
4
|
+
readonly t: Vec3;
|
|
5
|
+
/** Unit normal: section X. */
|
|
6
|
+
readonly n: Vec3;
|
|
7
|
+
/** Unit binormal t × n: section Y. */
|
|
8
|
+
readonly b: Vec3;
|
|
9
|
+
}
|
|
10
|
+
/** Throws unless the path has ≥ 2 points and no zero-length segment. Returns cumulative lengths. */
|
|
11
|
+
export declare function arcLengths(path: readonly Vec3[]): number[];
|
|
12
|
+
/**
|
|
13
|
+
* One frame per path point. The first normal comes from world X when the path starts near
|
|
14
|
+
* vertical, else world Z, so a path in the XZ plane keeps b = ±Y all the way (trunk widths
|
|
15
|
+
* measured across Y stay exact).
|
|
16
|
+
*/
|
|
17
|
+
export declare function transportFrames(path: readonly Vec3[]): SweepFrame[];
|