@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,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/qa/geometry.ts", "../src/qa/inside.ts", "../src/qa/inspect.ts", "../src/qa/checks.ts", "../src/qa/types.ts", "../src/qa/clash.ts", "../src/qa/floating.ts", "../src/qa/measures.ts", "../src/qa/occlusion.ts", "../src/qa/sanity.ts", "../src/qa/gates.ts", "../src/qa/lods.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"// Exact-enough geometry for QA: point↔triangle distance, a triangle spatial hash, and surface\n// samples. Bounding boxes lie (a diagonal strut's box touches everything); surfaces don't.\n\nimport { boundsOf, type Mesh, type Vec3 } from '../core/index.ts';\n\nconst at = (m: Mesh, i: number): Vec3 => [\n m.positions[i * 3] ?? 0,\n m.positions[i * 3 + 1] ?? 0,\n m.positions[i * 3 + 2] ?? 0,\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 lerp = (a: Vec3, b: Vec3, t: number): Vec3 => [\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n a[2] + (b[2] - a[2]) * t,\n];\n\nexport function triangle(m: Mesh, t: number): [Vec3, Vec3, Vec3] {\n return [\n at(m, m.indices[t * 3] ?? 0),\n at(m, m.indices[t * 3 + 1] ?? 0),\n at(m, m.indices[t * 3 + 2] ?? 0),\n ];\n}\n\n/** Distance from p to triangle abc (Ericson, Real-Time Collision Detection §5.1.5). */\nexport function pointTriangleDistance(p: Vec3, a: Vec3, b: Vec3, c: Vec3): number {\n const ab = sub(b, a);\n const ac = sub(c, a);\n const ap = sub(p, a);\n const d1 = dot(ab, ap);\n const d2 = dot(ac, ap);\n if (d1 <= 0 && d2 <= 0) return Math.hypot(...ap);\n const bp = sub(p, b);\n const d3 = dot(ab, bp);\n const d4 = dot(ac, bp);\n if (d3 >= 0 && d4 <= d3) return Math.hypot(...bp);\n const vc = d1 * d4 - d3 * d2;\n if (vc <= 0 && d1 >= 0 && d3 <= 0) return Math.hypot(...sub(p, lerp(a, b, d1 / (d1 - d3))));\n const cp = sub(p, c);\n const d5 = dot(ab, cp);\n const d6 = dot(ac, cp);\n if (d6 >= 0 && d5 <= d6) return Math.hypot(...cp);\n const vb = d5 * d2 - d1 * d6;\n if (vb <= 0 && d2 >= 0 && d6 <= 0) return Math.hypot(...sub(p, lerp(a, c, d2 / (d2 - d6))));\n const va = d3 * d6 - d5 * d4;\n if (va <= 0 && d4 - d3 >= 0 && d5 - d6 >= 0)\n return Math.hypot(...sub(p, lerp(b, c, (d4 - d3) / (d4 - d3 + (d5 - d6)))));\n const den = 1 / (va + vb + vc);\n const v = vb * den;\n const w = vc * den;\n return Math.hypot(\n ...sub(p, [\n a[0] + ab[0] * v + ac[0] * w,\n a[1] + ab[1] * v + ac[1] * w,\n a[2] + ab[2] * v + ac[2] * w,\n ]),\n );\n}\n\n// Numeric cell keys (no string building per query) — collisions only add candidates, never drop.\nconst key = (x: number, y: number, z: number): number =>\n ((x * 73856093) ^ (y * 19349663) ^ (z * 83492791)) | 0;\n\n/** Triangles bucketed by a uniform grid, so a point only tests its neighbourhood. */\nexport class TriangleGrid {\n private readonly cells = new Map<number, number[]>();\n /** Cell edge: 25 cm for props and vehicles, growing with big meshes (a 330 m tower) so one\n * long triangle never lands in 10⁵ cells. */\n private readonly cell: number;\n private readonly tris: Float64Array;\n /** Per-triangle AABB (min xyz, max xyz) for a cheap reject before the exact distance. */\n private readonly boxes: Float64Array;\n private readonly stamp: Int32Array;\n private query = 0;\n\n constructor(mesh: Mesh) {\n const n = mesh.indices.length / 3;\n this.tris = new Float64Array(n * 9);\n this.boxes = new Float64Array(n * 6);\n this.stamp = new Int32Array(n);\n const b = boundsOf(mesh);\n const diag = Math.hypot(b.max[0] - b.min[0], b.max[1] - b.min[1], b.max[2] - b.min[2]);\n this.cell = Math.max(0.25, diag / 256);\n const CELL = this.cell;\n for (let t = 0; t < n; t++) {\n const [a, b, c] = triangle(mesh, t);\n this.tris.set([...a, ...b, ...c], t * 9);\n for (let k = 0; k < 3; k++) {\n this.boxes[t * 6 + k] = Math.min(a[k] ?? 0, b[k] ?? 0, c[k] ?? 0);\n this.boxes[t * 6 + 3 + k] = Math.max(a[k] ?? 0, b[k] ?? 0, c[k] ?? 0);\n }\n const lo = [0, 1, 2].map((k) => Math.floor(Math.min(a[k] ?? 0, b[k] ?? 0, c[k] ?? 0) / CELL));\n const hi = [0, 1, 2].map((k) => Math.floor(Math.max(a[k] ?? 0, b[k] ?? 0, c[k] ?? 0) / CELL));\n for (let x = lo[0] ?? 0; x <= (hi[0] ?? 0); x++)\n for (let y = lo[1] ?? 0; y <= (hi[1] ?? 0); y++)\n for (let z = lo[2] ?? 0; z <= (hi[2] ?? 0); z++) {\n const k = key(x, y, z);\n const list = this.cells.get(k);\n if (list) list.push(t);\n else this.cells.set(k, [t]);\n }\n }\n }\n\n /** Distance from p to the nearest triangle, if one is within `radius`; else Infinity. */\n nearest(p: Vec3, radius: number): number {\n const CELL = this.cell;\n // Only the cells the query sphere overlaps — usually 1–8, not a fixed 27.\n const [x0, y0, z0] = [\n Math.floor((p[0] - radius) / CELL),\n Math.floor((p[1] - radius) / CELL),\n Math.floor((p[2] - radius) / CELL),\n ];\n const [x1, y1, z1] = [\n Math.floor((p[0] + radius) / CELL),\n Math.floor((p[1] + radius) / CELL),\n Math.floor((p[2] + radius) / CELL),\n ];\n const q = ++this.query;\n const T = this.tris;\n const B = this.boxes;\n let best = Infinity;\n for (let x = x0; x <= x1; x++)\n for (let y = y0; y <= y1; y++)\n for (let z = z0; z <= z1; z++) {\n const list = this.cells.get(key(x, y, z));\n if (!list) continue;\n for (const t of list) {\n if (this.stamp[t] === q) continue;\n this.stamp[t] = q;\n const lim = Math.min(best, radius);\n const o6 = t * 6;\n if (\n p[0] < (B[o6] ?? 0) - lim ||\n p[0] > (B[o6 + 3] ?? 0) + lim ||\n p[1] < (B[o6 + 1] ?? 0) - lim ||\n p[1] > (B[o6 + 4] ?? 0) + lim ||\n p[2] < (B[o6 + 2] ?? 0) - lim ||\n p[2] > (B[o6 + 5] ?? 0) + lim\n )\n continue;\n const o = t * 9;\n const d = pointTriangleDistance(\n p,\n [T[o] ?? 0, T[o + 1] ?? 0, T[o + 2] ?? 0],\n [T[o + 3] ?? 0, T[o + 4] ?? 0, T[o + 5] ?? 0],\n [T[o + 6] ?? 0, T[o + 7] ?? 0, T[o + 8] ?? 0],\n );\n if (d < best) best = d;\n }\n }\n return best <= radius ? best : Infinity;\n }\n}\n\n// Gates and checks ask for the same mesh's samples many times; compute each (mesh, density) once.\nconst sampleCache = new WeakMap<Mesh, Map<string, Vec3[]>>();\n\n/** Vertices plus points along every edge every `step` metres (catches crossing members). */\nexport function surfaceSamples(m: Mesh, step = 0.05, maxPerEdge = 16): Vec3[] {\n const key = `${step}:${maxPerEdge}`;\n const byMesh = sampleCache.get(m) ?? new Map<string, Vec3[]>();\n sampleCache.set(m, byMesh);\n const hit = byMesh.get(key);\n if (hit) return hit;\n const out = sampleMesh(m, step, maxPerEdge);\n byMesh.set(key, out);\n return out;\n}\n\nfunction sampleMesh(m: Mesh, step: number, maxPerEdge: number): Vec3[] {\n const out: Vec3[] = [];\n for (let i = 0; i < m.positions.length / 3; i++) out.push(at(m, i));\n for (let t = 0; t < m.indices.length / 3; t++) {\n const tri = triangle(m, t);\n for (let e = 0; e < 3; e++) {\n const a = tri[e] ?? tri[0];\n const b = tri[(e + 1) % 3] ?? tri[0];\n const n = Math.min(maxPerEdge, Math.floor(Math.hypot(...sub(b, a)) / step));\n for (let s = 1; s < n; s++) out.push(lerp(a, b, s / n));\n }\n out.push(lerp(lerp(tri[0], tri[1], 0.5), tri[2], 1 / 3));\n }\n return out;\n}\n",
|
|
6
|
+
"// Point-in-solid for closed meshes, indexed and allocation-free: axis-aligned rays (+Z, +Y, +X)\n// against triangles bucketed in a 2D grid perpendicular to each ray. An axis-aligned ray hitting a\n// triangle is a 2D point-in-triangle test in the other two axes plus one interpolated depth.\n// Majority of the three rays (short-circuited), so grazing an edge cannot flip the answer.\n// Open sheets (planar decals) are never \"solid\"; penetration only means something vs closed parts.\n\nimport { boundsOf, type Mesh, type Vec3 } from '../core/index.ts';\n\n/** Column size: 20 cm for props and vehicles, growing with the mesh so a 330 m tower's long\n * members don't land in thousands of columns each (answers never depend on the cell size). */\nconst cellFor = (m: Mesh): number => {\n const b = boundsOf(m);\n return Math.max(\n 0.2,\n Math.hypot(b.max[0] - b.min[0], b.max[1] - b.min[1], b.max[2] - b.min[2]) / 256,\n );\n};\n// A tiny fixed offset keeps the query point off shared edges/vertices of axis-aligned geometry.\nconst NUDGE: Vec3 = [1.37e-5, 2.91e-5, 3.73e-5];\nconst OTHER = [\n [1, 2],\n [0, 2],\n [0, 1],\n] as const;\n\nexport class SolidIndex {\n private readonly tri: Float64Array;\n private readonly columns: Map<number, number[]>[] = [new Map(), new Map(), new Map()];\n private readonly cell: number;\n\n constructor(mesh: Mesh) {\n this.cell = cellFor(mesh);\n const CELL = this.cell;\n const n = mesh.indices.length / 3;\n this.tri = new Float64Array(n * 9);\n for (let t = 0; t < n; t++) {\n for (let v = 0; v < 3; v++) {\n const idx = mesh.indices[t * 3 + v] ?? 0;\n for (let k = 0; k < 3; k++) this.tri[t * 9 + v * 3 + k] = mesh.positions[idx * 3 + k] ?? 0;\n }\n for (const axis of [0, 1, 2] as const) {\n const [i, j] = OTHER[axis];\n const T = this.tri;\n const o = t * 9;\n const a = T[o + i] ?? 0;\n const b = T[o + 3 + i] ?? 0;\n const c = T[o + 6 + i] ?? 0;\n const d = T[o + j] ?? 0;\n const e = T[o + 3 + j] ?? 0;\n const f = T[o + 6 + j] ?? 0;\n const u0 = Math.floor(Math.min(a, b, c) / CELL);\n const u1 = Math.floor(Math.max(a, b, c) / CELL);\n const v0 = Math.floor(Math.min(d, e, f) / CELL);\n const v1 = Math.floor(Math.max(d, e, f) / CELL);\n const map = this.columns[axis];\n if (!map) continue;\n for (let u = u0; u <= u1; u++)\n for (let v = v0; v <= v1; v++) {\n const k = (u * 92837111) ^ (v * 689287499);\n const list = map.get(k);\n if (list) list.push(t);\n else map.set(k, [t]);\n }\n }\n }\n }\n\n /** Odd number of crossings of the ray from p along +axis ⇒ inside (for that ray). */\n private parity(px: number, py: number, pz: number, axis: 0 | 1 | 2): boolean {\n const [i, j] = OTHER[axis];\n const p = [px, py, pz];\n const pi = p[i] ?? 0;\n const pj = p[j] ?? 0;\n const pk = p[axis] ?? 0;\n const CELL = this.cell;\n const list = this.columns[axis]?.get(\n (Math.floor(pi / CELL) * 92837111) ^ (Math.floor(pj / CELL) * 689287499),\n );\n if (!list) return false;\n const T = this.tri;\n let n = 0;\n for (const t of list) {\n const o = t * 9;\n const ai = T[o + i] ?? 0;\n const aj = T[o + j] ?? 0;\n const bi = T[o + 3 + i] ?? 0;\n const bj = T[o + 3 + j] ?? 0;\n const ci = T[o + 6 + i] ?? 0;\n const cj = T[o + 6 + j] ?? 0;\n const area = (bi - ai) * (cj - aj) - (bj - aj) * (ci - ai);\n if (Math.abs(area) < 1e-14) continue;\n const w0 = ((bi - pi) * (cj - pj) - (bj - pj) * (ci - pi)) / area;\n const w1 = ((ci - pi) * (aj - pj) - (cj - pj) * (ai - pi)) / area;\n const w2 = 1 - w0 - w1;\n if (w0 < 0 || w1 < 0 || w2 < 0) continue;\n const depth =\n w0 * (T[o + axis] ?? 0) + w1 * (T[o + 3 + axis] ?? 0) + w2 * (T[o + 6 + axis] ?? 0);\n if (depth > pk) n++;\n }\n return n % 2 === 1;\n }\n\n inside(point: Vec3): boolean {\n const x = point[0] + NUDGE[0];\n const y = point[1] + NUDGE[1];\n const z = point[2] + NUDGE[2];\n const vz = this.parity(x, y, z, 2);\n const vy = this.parity(x, y, z, 1);\n return vz === vy ? vz : this.parity(x, y, z, 0);\n }\n}\n\n/** One-off query; build a SolidIndex yourself when testing many points against one mesh. */\nexport const insideSolid = (p: Vec3, m: Mesh): boolean => new SolidIndex(m).inside(p);\n",
|
|
7
|
+
"// Inspector: geometry queries over a compiled asset in world space, for checks, scripts and\n// agents (\"how far is the track from the hull?\", \"does the wheel sink into the fender?\").\n// Part selectors are names or globs: 'track_l_*', 'road_wheel_*_3', '*_hatch'.\n\nimport {\n type Bounds,\n boundsOf,\n type CompiledAsset,\n type Mesh,\n merge,\n worldMeshes,\n} from '../core/index.ts';\nimport { surfaceSamples, TriangleGrid } from './geometry.ts';\nimport { SolidIndex } from './inside.ts';\n\nexport const glob = (pattern: string): RegExp =>\n new RegExp(\n `^${pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replaceAll('*', '.*')\n .replaceAll('?', '.')}$`,\n );\n\nexport interface Penetration {\n /** Deepest sampled point of A inside B's solid, metres (0 = none). */\n readonly depth: number;\n readonly samples: number;\n}\n\nexport interface Inspector {\n readonly asset: CompiledAsset;\n parts(selector: string): string[];\n mesh(selector: string): Mesh | null;\n bounds(selector: string): Bounds | null;\n /** Smallest surface-to-surface distance (0 when touching or intersecting), capped at `max`. */\n distance(a: string, b: string, max?: number): number;\n /** How deep A's surface goes inside B's closed solid. */\n penetration(a: string, b: string): Penetration;\n}\n\nexport function inspect(asset: CompiledAsset): Inspector {\n const world = worldMeshes(asset.parts);\n const parts = (sel: string): string[] => [...world.keys()].filter((n) => glob(sel).test(n));\n // Checks ask about the same parts over and over: build each merged mesh and index once.\n const meshes = new Map<string, Mesh | null>();\n const grids = new Map<string, TriangleGrid>();\n const solids = new Map<string, SolidIndex>();\n const samples = new Map<string, ReturnType<typeof surfaceSamples>>();\n const mesh = (sel: string): Mesh | null => {\n if (!meshes.has(sel)) {\n const ms = parts(sel).flatMap((n) => world.get(n) ?? []);\n meshes.set(sel, ms.length ? merge(ms) : null);\n }\n return meshes.get(sel) ?? null;\n };\n const cached = <T>(map: Map<string, T>, key: string, make: () => T): T => {\n const hit = map.get(key);\n if (hit !== undefined) return hit;\n const v = make();\n map.set(key, v);\n return v;\n };\n const near = (a: Bounds, b: Bounds, eps: number): boolean =>\n [0, 1, 2].every(\n (k) => (a.min[k] ?? 0) <= (b.max[k] ?? 0) + eps && (b.min[k] ?? 0) <= (a.max[k] ?? 0) + eps,\n );\n return {\n asset,\n parts,\n mesh,\n bounds: (sel) => {\n const m = mesh(sel);\n return m ? boundsOf(m) : null;\n },\n distance(a, b, max = 1) {\n const ma = mesh(a);\n const mb = mesh(b);\n if (!ma || !mb || !near(boundsOf(ma), boundsOf(mb), max)) return max;\n const grid = cached(grids, b, () => new TriangleGrid(mb));\n const pts = cached(samples, a, () => surfaceSamples(ma, 0.05, 8));\n // Grow the search radius: \"do they touch?\" is answered at 2 cm without scanning metres.\n for (const r of [0.02, 0.1, 0.5, max].filter((x) => x <= max)) {\n let best = Infinity;\n for (const p of pts) best = Math.min(best, grid.nearest(p, Math.min(r, best)));\n if (best <= r) return best;\n }\n return max;\n },\n penetration(a, b) {\n const ma = mesh(a);\n const mb = mesh(b);\n if (!ma || !mb) return { depth: 0, samples: 0 };\n const bb = boundsOf(mb);\n if (!near(boundsOf(ma), bb, 0)) return { depth: 0, samples: 0 };\n const grid = cached(grids, b, () => new TriangleGrid(mb));\n const solid = cached(solids, b, () => new SolidIndex(mb));\n let depth = 0;\n let count = 0;\n for (const p of cached(samples, `${a}#pen`, () => surfaceSamples(ma, 0.1, 3))) {\n if (!near({ min: p, max: p }, bb, 0) || !solid.inside(p)) continue;\n count++;\n depth = Math.max(depth, grid.nearest(p, 0.5));\n }\n return { depth, samples: count };\n },\n };\n}\n",
|
|
8
|
+
"// Check builders: a recipe states its physical intent in code and QA enforces it at every LOD.\n// checks: [clear('track_*', 'hull_*'), noOverlap('road_wheel_l_*'), touches('turret_body', 'hull_top'),\n// symmetric('_l', '_r', 'y')]\n// Each returns a core `Check`; write your own the same way: (asset) => CheckFinding[].\n\nimport type { Check, CheckFinding } from '../core/index.ts';\nimport { type Inspector, inspect } from './inspect.ts';\n\n// One inspector per compiled asset, shared by every check (its caches are the speed).\nconst inspectors = new WeakMap<object, Inspector>();\nconst inspectorFor = (asset: Parameters<Check>[0]): Inspector => {\n const hit = inspectors.get(asset);\n if (hit) return hit;\n const made = inspect(asset);\n inspectors.set(asset, made);\n return made;\n};\n\nconst CLASH = 0.01;\n\n/** Nothing matching `a` sinks into anything matching `b` (closed solids), with optional min gap. */\nexport const clear =\n (a: string, b: string, minGap = 0): Check =>\n (asset) => {\n const q = inspectorFor(asset);\n const out: CheckFinding[] = [];\n for (const pa of q.parts(a)) {\n for (const pb of q.parts(b)) {\n if (pa === pb) continue;\n const pen = q.penetration(pa, pb);\n if (pen.depth > CLASH) {\n out.push({\n part: pa,\n message: `'${pa}' sinks ${(pen.depth * 100).toFixed(1)} cm into '${pb}'`,\n fix: `move '${pa}' out of '${pb}' (or shrink one); they are declared clear of each other`,\n });\n } else if (minGap > 0) {\n const d = q.distance(pa, pb, minGap);\n if (d < minGap)\n out.push({\n part: pa,\n message: `'${pa}' is ${(d * 100).toFixed(1)} cm from '${pb}', needs ≥ ${minGap * 100} cm`,\n fix: 'open the gap — running clearance, mud, suspension travel',\n });\n }\n }\n }\n return out;\n };\n\n/** No two parts matching the selector interpenetrate (interleaved wheels, stacked crates). */\nexport const noOverlap =\n (selector: string): Check =>\n (asset) => {\n const names = inspectorFor(asset).parts(selector);\n return names.flatMap((a, i) => names.slice(i + 1).flatMap((b) => clear(a, b)(asset)));\n };\n\n/** `a` must touch `b` (surface within 2 cm): a turret sits on its ring, a lamp on its post. */\nexport const touches =\n (a: string, b: string, eps = 0.02): Check =>\n (asset) => {\n const q = inspectorFor(asset);\n // A part dropped at this LOD (detail gating) has nothing to touch: the check doesn't apply.\n if (q.parts(a).length === 0 || q.parts(b).length === 0) return [];\n const d = q.distance(a, b, 1);\n return d <= eps\n ? []\n : [\n {\n part: a,\n message: `'${a}' should touch '${b}' but is ${(d * 100).toFixed(1)} cm away`,\n fix: `seat '${a}' on '${b}'`,\n },\n ];\n };\n\n/** Every part containing `left` has a mirror part (with `right`) reflected across the axis plane. */\nexport const symmetric =\n (left: string, right: string, axis: 'x' | 'y' | 'z' = 'y', tol = 0.02): Check =>\n (asset) => {\n const q = inspectorFor(asset);\n const k = ({ x: 0, y: 1, z: 2 } as const)[axis];\n // Side tokens are whole name segments: `_l` matches `wheel_l_3` and `rod_l`, never `axle_lead`.\n const token = new RegExp(`${left.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}(?=_|$)`);\n return q\n .parts('*')\n .filter((n) => token.test(n))\n .flatMap((l): CheckFinding[] => {\n const r = l.replace(token, right);\n const bl = q.bounds(l);\n const br = q.bounds(r);\n if (!bl || !br)\n return [{ part: l, message: `'${l}' has no mirror '${r}'`, fix: `add '${r}' or rename` }];\n const off = Math.abs(bl.min[k] + br.max[k]) + Math.abs(bl.max[k] + br.min[k]);\n return off > tol * 2\n ? [\n {\n part: l,\n message: `'${l}' and '${r}' are not mirrored across ${axis}=0 (off by ${(off * 50).toFixed(1)} cm)`,\n fix: 'build one side and mirror it — place(mesh, { scale: [1, -1, 1] }) flips winding; prefer reusing the same builder with a sign',\n },\n ]\n : [];\n });\n };\n\n/** Run a recipe's checks; the QA gate calls this. */\nexport const runChecks = (asset: Parameters<Check>[0]): CheckFinding[] =>\n asset.checks.flatMap((c) => [...c(asset)]);\n",
|
|
9
|
+
"// QA vocabulary shared by every gate.\n\nimport type { CompiledAsset } from '../core/index.ts';\n\nexport interface Finding {\n readonly gate: string;\n readonly part?: string;\n readonly message: string;\n readonly fix: string;\n}\n\nexport type Gate = (asset: CompiledAsset) => Finding[];\n\n/** Contact tolerance: surfaces closer than this touch (metres). */\nexport const CONTACT_EPS = 0.02;\n/** Clash tolerance: penetration deeper than this is a clash (metres). */\nexport const CLASH_EPS = 0.01;\n",
|
|
10
|
+
"// Gate: moving parts never cut through anything. Each motion root (a spinning wheel/axle group, a\n// rotor, a sliding crosshead) is swept through its whole motion; any other part whose surface goes\n// deeper than CLASH_EPS into that swept volume fails — wheel vs fender, prop vs cowling, rod vs frame.\n// Spins sweep a solid of revolution (radius profile per axial slice); sways sweep only their\n// sector (the same profile, kept per 5° angular bin and widened by the swing); slides use the\n// moving mesh's bounds extended along the stroke (one side only for `oneWay`).\n\nimport {\n boundsOf,\n type CompiledAsset,\n type Mesh,\n merge,\n type Part,\n type Vec3,\n worldMeshes,\n worldTransforms,\n} from '../core/index.ts';\nimport { surfaceSamples } from './geometry.ts';\nimport { CLASH_EPS, type Finding, type Gate } from './types.ts';\n\nconst SLICES = 24;\n\nfunction subtree(parts: readonly Part[], root: string): Set<string> {\n const out = new Set([root]);\n for (const p of parts) if (p.parent && out.has(p.parent)) out.add(p.name);\n return out;\n}\n\ntype Inside = (p: Vec3) => boolean;\n\n/** A swept volume plus its conservative world AABB, so far-away parts and samples skip the test. */\ninterface Volume {\n readonly inside: Inside;\n readonly min: Vec3;\n readonly max: Vec3;\n}\n\nconst BINS = 72;\nconst TAU = Math.PI * 2;\n\n/**\n * Swept volume of `mesh` rotating about `axis` through `pivot`. `range` (radians, rest = 0)\n * limits it to a sector; omitted = a full revolution.\n */\nfunction spinVolume(\n mesh: Mesh,\n pivot: Vec3,\n axis: Vec3,\n range?: readonly [number, number],\n): Volume {\n const len = Math.hypot(...axis) || 1;\n const u: Vec3 = [axis[0] / len, axis[1] / len, axis[2] / len];\n // A frame around the axis, for the angle of each point.\n const ref: Vec3 = Math.abs(u[0]) < 0.9 ? [1, 0, 0] : [0, 1, 0];\n const dotRef = ref[0] * u[0] + ref[1] * u[1] + ref[2] * u[2];\n const e1raw: Vec3 = [ref[0] - dotRef * u[0], ref[1] - dotRef * u[1], ref[2] - dotRef * u[2]];\n const e1l = Math.hypot(...e1raw) || 1;\n const e1: Vec3 = [e1raw[0] / e1l, e1raw[1] / e1l, e1raw[2] / e1l];\n const e2: Vec3 = [\n u[1] * e1[2] - u[2] * e1[1],\n u[2] * e1[0] - u[0] * e1[2],\n u[0] * e1[1] - u[1] * e1[0],\n ];\n const coords = (p: Vec3): [number, number, number] => {\n const d: Vec3 = [p[0] - pivot[0], p[1] - pivot[1], p[2] - pivot[2]];\n const a = d[0] * u[0] + d[1] * u[1] + d[2] * u[2];\n const x = d[0] * e1[0] + d[1] * e1[1] + d[2] * e1[2];\n const y = d[0] * e2[0] + d[1] * e2[1] + d[2] * e2[2];\n return [a, Math.hypot(x, y), Math.atan2(y, x)];\n };\n const bin = (phi: number): number =>\n Math.floor((((phi % TAU) + TAU) % TAU) / (TAU / BINS)) % BINS;\n const pts = surfaceSamples(mesh, 0.05, 8).map(coords);\n const lo = Math.min(...pts.map((p) => p[0]));\n const hi = Math.max(...pts.map((p) => p[0]));\n const span = Math.max(hi - lo, 1e-6);\n const slice = (a: number): number => Math.min(SLICES - 1, Math.floor(((a - lo) / span) * SLICES));\n // radius[slice * BINS + bin]: farthest body sample in that slice and angular bin (rest pose).\n const radius = new Float64Array(SLICES * BINS).fill(-1);\n for (const [a, r, phi] of pts) {\n const k = slice(a) * BINS + bin(phi);\n radius[k] = Math.max(radius[k] ?? -1, r);\n }\n // Bins a rest-pose bin sweeps into: the swing plus one bin of slack either side.\n const [from, to] = range ?? [0, TAU];\n const steps = range ? Math.ceil((to - from) / (TAU / BINS)) + 2 : BINS;\n const reach = Math.max(...radius) + Math.max(Math.abs(lo), Math.abs(hi));\n return {\n min: [pivot[0] - reach, pivot[1] - reach, pivot[2] - reach],\n max: [pivot[0] + reach, pivot[1] + reach, pivot[2] + reach],\n inside: (p) => {\n const [a, r, phi] = coords(p);\n if (a < lo + CLASH_EPS || a > hi - CLASH_EPS) return false;\n const base = slice(a) * BINS;\n // p is swept if some rest-pose bin, rotated by θ ∈ [from, to], lands on p's angle.\n for (let i = 0; i < Math.min(steps, BINS); i++) {\n const theta = range ? from - TAU / BINS + i * (TAU / BINS) : i * (TAU / BINS);\n if (r < (radius[base + bin(phi - theta)] ?? -1) - CLASH_EPS) return true;\n }\n return false;\n },\n };\n}\n\nfunction slideVolume(mesh: Mesh, offset: Vec3, oneWay = false): Volume {\n const b = boundsOf(mesh);\n // Two-sided strokes reach ±offset; one-way strokes reach rest..rest + offset.\n const neg = (k: number): number =>\n oneWay ? Math.min(0, offset[k] ?? 0) : -Math.abs(offset[k] ?? 0);\n const pos = (k: number): number =>\n oneWay ? Math.max(0, offset[k] ?? 0) : Math.abs(offset[k] ?? 0);\n const lo = [0, 1, 2].map((k) => (b.min[k] ?? 0) + neg(k) + CLASH_EPS);\n const hi = [0, 1, 2].map((k) => (b.max[k] ?? 0) + pos(k) - CLASH_EPS);\n return {\n min: [lo[0] ?? 0, lo[1] ?? 0, lo[2] ?? 0],\n max: [hi[0] ?? 0, hi[1] ?? 0, hi[2] ?? 0],\n inside: (p) => [0, 1, 2].every((k) => (p[k] ?? 0) > (lo[k] ?? 0) && (p[k] ?? 0) < (hi[k] ?? 0)),\n };\n}\n\nconst inBox = (p: Vec3, v: Volume): boolean =>\n p[0] >= v.min[0] &&\n p[0] <= v.max[0] &&\n p[1] >= v.min[1] &&\n p[1] <= v.max[1] &&\n p[2] >= v.min[2] &&\n p[2] <= v.max[2];\n\nexport const clashes: Gate = (asset: CompiledAsset): Finding[] => {\n const meshes = worldMeshes(asset.parts);\n const xf = worldTransforms(asset.parts);\n const findings: Finding[] = [];\n for (const root of asset.parts.filter((p) => p.motion)) {\n const moving = subtree(asset.parts, root.name);\n const body = merge([...moving].flatMap((n) => meshes.get(n) ?? []));\n const t = xf.get(root.name);\n if (!t || body.indices.length === 0 || !root.motion) continue;\n const c = Math.cos(t.yaw);\n const s = Math.sin(t.yaw);\n const rot = (v: Vec3): Vec3 => [v[0] * c - v[1] * s, v[0] * s + v[1] * c, v[2]];\n const m = root.motion;\n const peak = m.kind === 'sway' ? (m.degrees * Math.PI) / 180 : 0;\n const vol =\n m.kind === 'slide'\n ? slideVolume(body, rot(m.offset), m.oneWay)\n : m.kind === 'sway'\n ? spinVolume(body, t.origin, rot(m.axis), m.oneWay ? [0, peak] : [-peak, peak])\n : spinVolume(body, t.origin, rot(m.axis));\n for (const [name, mesh] of meshes) {\n if (moving.has(name) || root.clearOf?.includes(name)) continue;\n const b = boundsOf(mesh);\n if (\n !inBox(b.min, {\n ...vol,\n min: [\n vol.min[0] - (b.max[0] - b.min[0]),\n vol.min[1] - (b.max[1] - b.min[1]),\n vol.min[2] - (b.max[2] - b.min[2]),\n ],\n })\n )\n continue;\n const hits = surfaceSamples(mesh, 0.1, 4).filter(\n (p) => inBox(p, vol) && vol.inside(p),\n ).length;\n if (hits > 0) {\n findings.push({\n gate: 'clashes',\n part: name,\n message: `'${name}' cuts into the swept ${root.motion.kind} of '${root.name}' (${hits} sample${hits === 1 ? '' : 's'} deeper than ${CLASH_EPS * 100} cm)`,\n fix: `move/trim '${name}' or '${root.name}' for running clearance; if they are meant to interlock (an axle through its bearing), list it: clearOf: ['${name}'] on '${root.name}'`,\n });\n }\n }\n }\n return findings;\n};\n",
|
|
11
|
+
"// Gate: everything is attached. A part is grounded if it reaches z≈0 or its SURFACE comes within\n// CONTACT_EPS of a grounded part's surface — transitively. Bounding boxes are only the prefilter.\n\nimport {\n type Bounds,\n boundsOf,\n type CompiledAsset,\n type Mesh,\n worldMeshes,\n} from '../core/index.ts';\nimport { surfaceSamples, TriangleGrid } from './geometry.ts';\nimport { CONTACT_EPS, type Finding, type Gate } from './types.ts';\n\nconst near = (a: Bounds, b: Bounds, eps: number): boolean =>\n [0, 1, 2].every(\n (k) => (a.min[k] ?? 0) <= (b.max[k] ?? 0) + eps && (b.min[k] ?? 0) <= (a.max[k] ?? 0) + eps,\n );\n\nexport function touching(a: Mesh, b: Mesh, grid: TriangleGrid, eps = CONTACT_EPS): boolean {\n const bb = boundsOf(b);\n for (const p of surfaceSamples(a, 0.1, 4)) {\n if (!near({ min: p, max: p }, bb, eps)) continue;\n if (grid.nearest(p, eps) <= eps) return true;\n }\n return false;\n}\n\nexport const floatingParts: Gate = (asset: CompiledAsset): Finding[] => {\n const meshes = [...worldMeshes(asset.parts)];\n const bounds = new Map(meshes.map(([n, m]) => [n, boundsOf(m)]));\n const grids = new Map<string, TriangleGrid>();\n const grid = (n: string, m: Mesh): TriangleGrid => {\n const g = grids.get(n) ?? new TriangleGrid(m);\n grids.set(n, g);\n return g;\n };\n const grounded = new Set(\n meshes.filter(([n]) => (bounds.get(n)?.min[2] ?? 1) <= CONTACT_EPS).map(([n]) => n),\n );\n const frontier = [...grounded];\n while (frontier.length > 0) {\n const g = frontier.pop() ?? '';\n const gm = meshes.find(([n]) => n === g)?.[1];\n const gb = bounds.get(g);\n if (!gm || !gb) continue;\n for (const [n, m] of meshes) {\n const b = bounds.get(n);\n if (grounded.has(n) || !b || !near(b, gb, CONTACT_EPS)) continue;\n if (touching(m, gm, grid(g, gm)) || touching(gm, m, grid(n, m))) {\n grounded.add(n);\n frontier.push(n);\n }\n }\n }\n return meshes\n .filter(([n]) => !grounded.has(n))\n .map(([n]) => ({\n gate: 'floating-parts',\n part: n,\n message: `'${n}' has no surface within ${CONTACT_EPS * 100} cm of anything attached to the ground`,\n fix: 'move it onto what holds it (check `at`, parent and the LOD-gated detail around it) — bounding boxes touching is not enough',\n }));\n};\n",
|
|
12
|
+
"// Gate: the model matches its spec sheet. Each `real.measures` entry (driver diameter, gauge,\n// wheelbase, turret width…) is measured on the LOD0 model and must land within tolerance (2%\n// default — tighter than the overall box, because these are the numbers players notice).\n\nimport {\n type Bounds,\n boundsOf,\n type CompiledAsset,\n type Measure,\n worldMeshes,\n} from '../core/index.ts';\nimport type { Finding, Gate } from './types.ts';\n\nconst AXIS = { x: 0, y: 1, z: 2 } as const;\n\nfunction union(bounds: readonly Bounds[]): Bounds | null {\n if (bounds.length === 0) return null;\n const k = [0, 1, 2] as const;\n return {\n min: k.map((i) => Math.min(...bounds.map((b) => b.min[i]))) as unknown as Bounds['min'],\n max: k.map((i) => Math.max(...bounds.map((b) => b.max[i]))) as unknown as Bounds['max'],\n };\n}\n\nexport function measure(asset: CompiledAsset, m: Measure): number | null {\n const meshes = worldMeshes(asset.parts);\n const of = (prefix: string): Bounds | null =>\n union(\n [...meshes]\n .filter(([n]) => n === prefix || n.startsWith(`${prefix}_`))\n .map(([, mesh]) => boundsOf(mesh)),\n );\n const k = AXIS[m.axis];\n if (m.between) {\n const [a, b] = [of(m.between[0]), of(m.between[1])];\n if (!a || !b) return null;\n return Math.abs((a.min[k] + a.max[k]) / 2 - (b.min[k] + b.max[k]) / 2);\n }\n const u = union((m.parts ?? []).map(of).filter((b): b is Bounds => b !== null));\n return u ? u.max[k] - u.min[k] : null;\n}\n\nexport const measures: Gate = (asset): Finding[] => {\n if (asset.lod !== 0 || !asset.real?.measures) return [];\n return asset.real.measures.flatMap((m): Finding[] => {\n const got = measure(asset, m);\n const tol = m.tolerance ?? 0.02;\n if (got === null) {\n return [\n {\n gate: 'measures',\n message: `'${m.label}': no part matches ${JSON.stringify(m.parts ?? m.between)}`,\n fix: 'name the parts the measure refers to, or fix the names in the measure',\n },\n ];\n }\n return Math.abs(got - m.value) / m.value > tol\n ? [\n {\n gate: 'measures',\n message: `${m.label}: ${got.toFixed(3)} m on ${m.axis.toUpperCase()}, spec ${m.value} m (±${tol * 100}%)${m.source ? ` — ${m.source}` : ''}`,\n fix: 'rebuild the part from the spec number; never edit the spec to match the model',\n },\n ]\n : [];\n });\n};\n",
|
|
13
|
+
"// Gates: surfaces a viewer either can't see or can't see cleanly. `zFighting` — a face lying in\n// another part's face, both facing the same way, flickers in every engine. `hiddenParts` — a part\n// entirely inside another closed solid is budget nobody ever sees. Both need a closed partner\n// (point-in-solid); open sheets are skipped, never guessed.\n\nimport {\n type Bounds,\n boundsOf,\n type CompiledAsset,\n type Mesh,\n type Vec3,\n worldMeshes,\n} from '../core/index.ts';\nimport { TriangleGrid } from './geometry.ts';\nimport { SolidIndex } from './inside.ts';\nimport type { Finding, Gate } from './types.ts';\n\nconst overlaps = (a: Bounds, b: Bounds, eps: number): boolean =>\n [0, 1, 2].every(\n (k) => (a.min[k] ?? 0) <= (b.max[k] ?? 0) + eps && (b.min[k] ?? 0) <= (a.max[k] ?? 0) + eps,\n );\nconst contains = (outer: Bounds, inner: Bounds): boolean =>\n [0, 1, 2].every(\n (k) => (outer.min[k] ?? 0) <= (inner.min[k] ?? 0) && (inner.max[k] ?? 0) <= (outer.max[k] ?? 0),\n );\n\n/** Up to `cap` triangle centroids with unit face normals, evenly strided (deterministic). */\nfunction faceSamples(m: Mesh, cap: number): Array<{ p: Vec3; n: Vec3 }> {\n const tris = m.indices.length / 3;\n const step = Math.max(1, Math.floor(tris / cap));\n const out: Array<{ p: Vec3; n: Vec3 }> = [];\n const P = m.positions;\n const v = (i: number): Vec3 => [P[i * 3] ?? 0, P[i * 3 + 1] ?? 0, P[i * 3 + 2] ?? 0];\n for (let t = 0; t < tris; t += step) {\n const a = v(m.indices[t * 3] ?? 0);\n const b = v(m.indices[t * 3 + 1] ?? 0);\n const c = v(m.indices[t * 3 + 2] ?? 0);\n const u: Vec3 = [b[0] - a[0], b[1] - a[1], b[2] - a[2]];\n const w: Vec3 = [c[0] - a[0], c[1] - a[1], c[2] - a[2]];\n const g: Vec3 = [\n u[1] * w[2] - u[2] * w[1],\n u[2] * w[0] - u[0] * w[2],\n u[0] * w[1] - u[1] * w[0],\n ];\n const len = Math.hypot(...g);\n if (len < 1e-10) continue;\n out.push({\n p: [(a[0] + b[0] + c[0]) / 3, (a[1] + b[1] + c[1]) / 3, (a[2] + b[2] + c[2]) / 3],\n n: [g[0] / len, g[1] / len, g[2] / len],\n });\n }\n return out;\n}\n\ninterface Scene {\n readonly names: string[];\n readonly mesh: Map<string, Mesh>;\n readonly bounds: Map<string, Bounds>;\n grid(name: string): TriangleGrid;\n solid(name: string): SolidIndex;\n}\n\nfunction scene(asset: CompiledAsset): Scene {\n const mesh = worldMeshes(asset.parts);\n const bounds = new Map([...mesh].map(([n, m]) => [n, boundsOf(m)]));\n const grids = new Map<string, TriangleGrid>();\n const solids = new Map<string, SolidIndex>();\n const lazy =\n <T>(cache: Map<string, T>, make: (m: Mesh) => T) =>\n (name: string): T => {\n const hit = cache.get(name);\n if (hit) return hit;\n const made = make(\n mesh.get(name) ?? {\n positions: new Float32Array(),\n normals: new Float32Array(),\n uvs: new Float32Array(),\n colors: new Float32Array(),\n indices: new Uint32Array(),\n },\n );\n cache.set(name, made);\n return made;\n };\n return {\n names: [...mesh.keys()],\n mesh,\n bounds,\n grid: lazy(grids, (m) => new TriangleGrid(m)),\n solid: lazy(solids, (m) => new SolidIndex(m)),\n };\n}\n\nconst ON = 2e-4;\nconst PROBE = 2e-3;\n\nexport const zFighting: Gate = (asset) => {\n const s = scene(asset);\n const out: Finding[] = [];\n for (const a of s.names) {\n const ba = s.bounds.get(a);\n const ma = s.mesh.get(a);\n if (!ba || !ma) continue;\n const samples = faceSamples(ma, 256);\n for (const b of s.names) {\n const bb = s.bounds.get(b);\n if (a === b || !bb || !overlaps(ba, bb, ON)) continue;\n let hits = 0;\n for (const { p, n } of samples) {\n if (!overlaps({ min: p, max: p }, bb, ON) || s.grid(b).nearest(p, ON) > ON) continue;\n const solid = s.solid(b);\n const behind = solid.inside([\n p[0] - n[0] * PROBE,\n p[1] - n[1] * PROBE,\n p[2] - n[2] * PROBE,\n ]);\n const front = solid.inside([p[0] + n[0] * PROBE, p[1] + n[1] * PROBE, p[2] + n[2] * PROBE]);\n if (behind && !front) hits++;\n }\n if (hits >= 2)\n out.push({\n gate: 'z-fighting',\n part: a,\n message: `'${a}' has ${hits} face sample(s) lying in '${b}''s surface, facing the same way — it flickers`,\n fix: `stand '${a}' proud of '${b}' by ≥ 2 mm, or inset it, or cut it from '${b}'; coplanar faces never render cleanly`,\n });\n }\n }\n return out;\n};\n\nexport const hiddenParts: Gate = (asset) => {\n const s = scene(asset);\n return s.names.flatMap((a): Finding[] => {\n const ba = s.bounds.get(a);\n const ma = s.mesh.get(a);\n if (!ba || !ma) return [];\n const pts = faceSamples(ma, 64).map((x) => x.p);\n const stride = Math.max(1, Math.floor(ma.positions.length / 192));\n for (let i = 0; i < ma.positions.length / 3; i += stride)\n pts.push([\n ma.positions[i * 3] ?? 0,\n ma.positions[i * 3 + 1] ?? 0,\n ma.positions[i * 3 + 2] ?? 0,\n ]);\n const host = s.names.find((b) => {\n const bb = s.bounds.get(b);\n if (b === a || !bb || !contains(bb, ba)) return false;\n // Inside, and not merely flush with the host's skin (that is seating, not hiding).\n return (\n pts.every((p) => s.solid(b).inside(p)) &&\n pts.every((p) => s.grid(b).nearest(p, PROBE) > PROBE)\n );\n });\n return host\n ? [\n {\n gate: 'hidden-parts',\n part: a,\n message: `'${a}' (${ma.indices.length / 3} tris) is entirely inside '${host}' — nobody can see it`,\n fix: `delete it, gate it behind ctx.lod, or move it out of '${host}'; hidden triangles are wasted budget`,\n },\n ]\n : [];\n });\n};\n",
|
|
14
|
+
"// Gates: per-part mesh sanity a reviewer would spot at once — non-finite numbers (NaN from a\n// zero-length normalize), vertex colours outside [0,1], shading normals that point against the\n// face winding (black or inside-out lighting), and wasted zero-area triangles.\n\nimport type { CompiledAsset, Mesh, Part } from '../core/index.ts';\nimport type { Finding, Gate } from './types.ts';\n\nconst parts = (asset: CompiledAsset): Array<[Part, Mesh]> =>\n asset.parts.flatMap((p): Array<[Part, Mesh]> => (p.mesh ? [[p, p.mesh]] : []));\n\nconst finite = (a: Float32Array): boolean => {\n for (let i = 0; i < a.length; i++) if (!Number.isFinite(a[i] ?? 0)) return false;\n return true;\n};\n\nexport const nonFinite: Gate = (asset) =>\n parts(asset).flatMap(([p, m]): Finding[] => {\n const bad = (\n [\n ['positions', m.positions],\n ['normals', m.normals],\n ['uvs', m.uvs],\n ['colors', m.colors],\n ] as const\n )\n .filter(([, a]) => !finite(a))\n .map(([n]) => n);\n const maxIndex = m.positions.length / 3;\n const outOfRange = m.indices.some((i) => i >= maxIndex);\n if (outOfRange) bad.push('indices' as never);\n return bad.length\n ? [\n {\n gate: 'non-finite',\n part: p.name,\n message: `'${p.name}' has NaN/Infinity or out-of-range data in ${bad.join(', ')}`,\n fix: 'look for a zero-length normalize, a divide by a zero count or segment, or an index past the vertex count',\n },\n ]\n : [];\n });\n\nexport const vertexColors: Gate = (asset) =>\n parts(asset).flatMap(([p, m]): Finding[] => {\n let lo = Infinity;\n let hi = -Infinity;\n for (const c of m.colors) {\n if (c < lo) lo = c;\n if (c > hi) hi = c;\n }\n return lo < -1e-6 || hi > 1 + 1e-6\n ? [\n {\n gate: 'vertex-colors',\n part: p.name,\n message: `'${p.name}' vertex colour spans ${lo.toFixed(3)}…${hi.toFixed(3)}, outside linear [0,1]`,\n fix: 'colours are linear 0–1 (use the palette / material helpers); clamp after grime or livery maths',\n },\n ]\n : [];\n });\n\n/** Per triangle: geometric normal (from winding) vs the mean of its three vertex normals. */\nfunction windingStats(m: Mesh): {\n flipped: number;\n area: number;\n flippedArea: number;\n counted: number;\n} {\n const P = m.positions;\n const N = m.normals;\n let flipped = 0;\n let area = 0;\n let flippedArea = 0;\n let counted = 0;\n for (let t = 0; t < m.indices.length; t += 3) {\n const a = (m.indices[t] ?? 0) * 3;\n const b = (m.indices[t + 1] ?? 0) * 3;\n const c = (m.indices[t + 2] ?? 0) * 3;\n const ux = (P[b] ?? 0) - (P[a] ?? 0);\n const uy = (P[b + 1] ?? 0) - (P[a + 1] ?? 0);\n const uz = (P[b + 2] ?? 0) - (P[a + 2] ?? 0);\n const vx = (P[c] ?? 0) - (P[a] ?? 0);\n const vy = (P[c + 1] ?? 0) - (P[a + 1] ?? 0);\n const vz = (P[c + 2] ?? 0) - (P[a + 2] ?? 0);\n const gx = uy * vz - uz * vy;\n const gy = uz * vx - ux * vz;\n const gz = ux * vy - uy * vx;\n const len = Math.hypot(gx, gy, gz);\n if (len < 1e-12) continue;\n counted++;\n const nx = (N[a] ?? 0) + (N[b] ?? 0) + (N[c] ?? 0);\n const ny = (N[a + 1] ?? 0) + (N[b + 1] ?? 0) + (N[c + 1] ?? 0);\n const nz = (N[a + 2] ?? 0) + (N[b + 2] ?? 0) + (N[c + 2] ?? 0);\n area += len;\n // Against the face by more than ~95°: the lighting is inside out, not just smoothed.\n if ((gx * nx + gy * ny + gz * nz) / (len * (Math.hypot(nx, ny, nz) || 1)) < -0.1) {\n flipped++;\n flippedArea += len;\n }\n }\n return { flipped, area, flippedArea, counted };\n}\n\n/** Shading normals must agree with the winding (the side a renderer culls/lights). */\nexport const normalsMatchWinding: Gate = (asset) =>\n parts(asset).flatMap(([p, m]): Finding[] => {\n const s = windingStats(m);\n // 1% of a part's area tolerates a few pinched poles on smooth caps.\n return s.flipped > 0 && s.flippedArea > s.area * 0.01\n ? [\n {\n gate: 'normals-winding',\n part: p.name,\n message: `'${p.name}': ${s.flipped} triangle(s) (${((100 * s.flippedArea) / s.area).toFixed(1)}% of its area) have vertex normals opposing their face — inverted winding, or normals smoothed across a hard crease`,\n fix: 'split normals at creases (lathe crease angle / weightedNormals hardAngle), or fix the mirrored piece: a negative-scale place() flips winding but not normals',\n },\n ]\n : [];\n });\n\n/** Zero-area triangles: invisible, but they cost index bandwidth and skew QA sampling. */\nexport const degenerateTriangles: Gate = (asset) =>\n parts(asset).flatMap(([p, m]): Finding[] => {\n const tris = m.indices.length / 3;\n const zero = tris - windingStats(m).counted;\n return zero > tris * 0.05\n ? [\n {\n gate: 'degenerate-triangles',\n part: p.name,\n message: `'${p.name}': ${zero} of ${tris} triangles have zero area`,\n fix: 'a ring/lathe with a zero radius emits fans of slivers: cap it with a point instead, or skip the segment',\n },\n ]\n : [];\n });\n",
|
|
15
|
+
"// The QA gate: checks a compiled asset must pass before it ships. A failing gate is a build\n// error (exit 1), not a warning — an agent iterates until it prints PASS.\n\nimport {\n type Bounds,\n boundsOf,\n type CompiledAsset,\n notImplemented,\n toWorld,\n triangleCount,\n worldTransforms,\n} from '../core/index.ts';\nimport { runChecks } from './checks.ts';\nimport { clashes } from './clash.ts';\nimport { floatingParts } from './floating.ts';\nimport { measures } from './measures.ts';\nimport { hiddenParts } from './occlusion.ts';\nimport { nonFinite, normalsMatchWinding, vertexColors } from './sanity.ts';\nimport type { Finding, Gate } from './types.ts';\n\nconst worldBounds = (asset: CompiledAsset): Map<string, Bounds> => {\n const xf = worldTransforms(asset.parts);\n const out = new Map<string, Bounds>();\n for (const p of asset.parts) {\n const t = xf.get(p.name);\n if (!t || !p.mesh || p.mesh.indices.length === 0) continue;\n const b = boundsOf(p.mesh);\n const corners = [0, 1, 2, 3, 4, 5, 6, 7].map((i) =>\n toWorld(t, [\n i & 1 ? b.max[0] : b.min[0],\n i & 2 ? b.max[1] : b.min[1],\n i & 4 ? b.max[2] : b.min[2],\n ]),\n );\n const axis = (k: 0 | 1 | 2, f: (...v: number[]) => number): number =>\n f(...corners.map((c) => c[k]));\n out.set(p.name, {\n min: [axis(0, Math.min), axis(1, Math.min), axis(2, Math.min)],\n max: [axis(0, Math.max), axis(1, Math.max), axis(2, Math.max)],\n });\n }\n return out;\n};\n\nexport const triangleBudget: Gate = (asset) => {\n const tris = asset.parts.reduce((s, p) => s + (p.mesh ? triangleCount(p.mesh) : 0), 0);\n const cap = asset.budget.triangles[asset.lod];\n return tris > cap\n ? [\n {\n gate: 'triangle-budget',\n message: `LOD${asset.lod} has ${tris} triangles, budget ${cap}`,\n fix: 'drop detail at this LOD (read ctx.lod) or raise the budget with a reason',\n },\n ]\n : [];\n};\n\nexport const partNames: Gate = (asset) =>\n asset.parts\n .filter((p) => !/^[a-z][a-z0-9_]*$/.test(p.name))\n .map((p) => ({\n gate: 'part-names',\n part: p.name,\n message: `part '${p.name}' is not snake_case`,\n fix: 'rename it — engines bind to node names like axle_0, door_l',\n }));\n\n/** Overall bounding box vs the recipe's `real` dimensions: catches a 6 m tank modelled at 7.4 m. */\nexport const proportions: Gate = (asset) => {\n const real = asset.real;\n if (!real || asset.lod !== 0) return [];\n const boxes = [...worldBounds(asset).values()];\n const span = (k: 0 | 1 | 2): number =>\n Math.max(...boxes.map((b) => b.max[k])) - Math.min(...boxes.map((b) => b.min[k]));\n const tol = real.tolerance ?? 0.05;\n return (\n [\n ['length', 0, real.length],\n ['width', 1, real.width],\n ['height', 2, real.height],\n ] as const\n ).flatMap(([axis, k, want]) => {\n const got = span(k);\n return Math.abs(got - want) / want > tol\n ? [\n {\n gate: 'proportions',\n message: `${axis} ${got.toFixed(2)} m vs real ${want} m (±${tol * 100}%)`,\n fix: `rescale along ${'XYZ'[k]} — re-derive the lengths from the sources, don't fudge the tolerance`,\n },\n ]\n : [];\n });\n};\n\n/** Planned gates, signatures fixed: docs/idea/06-qa.md. */\nexport const silhouetteIoU = (_asset: CompiledAsset, _referencePng: Uint8Array): number =>\n notImplemented('silhouette IoU gate');\n\n/** The recipe's own `checks`, each finding reported under the gate name `check`. */\nexport const recipeChecks: Gate = (asset) =>\n runChecks(asset).map((f) => ({\n gate: 'check',\n ...(f.part ? { part: f.part } : {}),\n message: f.message,\n fix: f.fix,\n }));\n\nexport const DEFAULT_GATES: readonly Gate[] = [\n triangleBudget,\n floatingParts,\n clashes,\n partNames,\n proportions,\n measures,\n recipeChecks,\n nonFinite,\n vertexColors,\n hiddenParts,\n normalsMatchWinding,\n];\n\nexport function runQa(asset: CompiledAsset, gates: readonly Gate[] = DEFAULT_GATES): Finding[] {\n return gates.flatMap((g) => g(asset));\n}\n",
|
|
16
|
+
"// Gates across the LOD chain (they need all three compiled LODs at once): triangle counts fall\n// LOD0 ≥ LOD1 ≥ LOD2, the far LODs keep the near one's silhouette box (no popping when the engine\n// switches), and every pivot the engine binds to (groups, moving parts) survives at every LOD.\n\nimport { type Bounds, boundsOf, type CompiledAsset, worldMeshes } from '../core/index.ts';\nimport type { Finding } from './types.ts';\n\n/** A gate over the whole LOD chain, index = LOD. */\nexport type LodGate = (lods: readonly CompiledAsset[]) => Finding[];\n\nconst tris = (a: CompiledAsset): number =>\n a.parts.reduce((s, p) => s + (p.mesh ? p.mesh.indices.length / 3 : 0), 0);\n\nexport const lodTriangles: LodGate = (lods) =>\n lods.slice(1).flatMap((a, i): Finding[] => {\n const prev = lods[i];\n if (!prev || tris(a) <= tris(prev)) return [];\n return [\n {\n gate: 'lod-triangles',\n message: `LOD${a.lod} has ${tris(a)} triangles, more than LOD${prev.lod} (${tris(prev)})`,\n fix: 'each LOD must be cheaper than the one before: read ctx.lod / ctx.pick([...]) and drop segments or detail parts',\n },\n ];\n });\n\nfunction assetBounds(a: CompiledAsset): Bounds | null {\n const all = [...worldMeshes(a.parts).values()].map(boundsOf);\n if (all.length === 0) return null;\n const k = [0, 1, 2] as const;\n const lo = k.map((i) => Math.min(...all.map((b) => b.min[i])));\n const hi = k.map((i) => Math.max(...all.map((b) => b.max[i])));\n return {\n min: [lo[0] ?? 0, lo[1] ?? 0, lo[2] ?? 0],\n max: [hi[0] ?? 0, hi[1] ?? 0, hi[2] ?? 0],\n };\n}\n\n/** LOD1/LOD2 overall box within `tol` of LOD0's span per side (min 5 cm). */\nexport const lodSilhouette =\n (tol = 0.05): LodGate =>\n (lods) => {\n const ref = lods[0] ? assetBounds(lods[0]) : null;\n if (!ref) return [];\n return lods.slice(1).flatMap((a): Finding[] => {\n const b = assetBounds(a);\n if (!b) return [];\n const off = ([0, 1, 2] as const).flatMap((k) => {\n const lim = Math.max(0.05, (ref.max[k] - ref.min[k]) * tol);\n const d = Math.max(Math.abs(b.min[k] - ref.min[k]), Math.abs(b.max[k] - ref.max[k]));\n return d > lim ? [`${'XYZ'[k]} by ${(d * 100).toFixed(0)} cm`] : [];\n });\n return off.length\n ? [\n {\n gate: 'lod-silhouette',\n message: `LOD${a.lod} outline differs from LOD0 on ${off.join(', ')} — it will pop on LOD switch`,\n fix: 'keep the big masses at every LOD (drop detail, not extent): a far LOD is the same shape with fewer segments',\n },\n ]\n : [];\n });\n };\n\n/** Pivots = what an engine binds code to: empty groups and parts with motion. */\nconst pivots = (a: CompiledAsset): string[] =>\n a.parts.filter((p) => p.mesh === null || p.motion !== null).map((p) => p.name);\n\nexport const lodPivots: LodGate = (lods) => {\n const ref = lods[0];\n if (!ref) return [];\n const want = pivots(ref);\n return lods.slice(1).flatMap((a): Finding[] => {\n const have = new Set(a.parts.map((p) => p.name));\n const missing = want.filter((n) => !have.has(n));\n return missing.length\n ? [\n {\n gate: 'lod-pivots',\n message: `LOD${a.lod} drops pivot(s) ${missing.slice(0, 6).join(', ')}${missing.length > 6 ? ` (+${missing.length - 6})` : ''} that LOD0 has — game code driving them breaks at that LOD`,\n fix: 'keep the group/moving part at every LOD and gate only its geometry: ctx.group(name) always, detail meshes behind ctx.lod',\n },\n ]\n : [];\n });\n};\n\n/** Default chain gates: only what every gallery recipe passes today. `lodSilhouette` and\n * `lodPivots` are opt-in until the recipes they flag are fixed (see their findings). */\nexport const DEFAULT_LOD_GATES: readonly LodGate[] = [lodTriangles];\n\nexport function runLodQa(\n lods: readonly CompiledAsset[],\n gates: readonly LodGate[] = DEFAULT_LOD_GATES,\n): Finding[] {\n return gates.flatMap((g) => g(lods));\n}\n"
|
|
17
|
+
],
|
|
18
|
+
"mappings": "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",
|
|
19
|
+
"debugId": "D719F42A62E0985B64756E2164756E21",
|
|
20
|
+
"names": []
|
|
21
|
+
}
|