@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,89 @@
|
|
|
1
|
+
# 13 — The professional game-asset pipeline, free CC0 libraries, and where ts23d sits
|
|
2
|
+
|
|
3
|
+
**The studio pipeline is blockout → high poly → low poly → UV → bake → texture → present. ts23d collapses most of it into one compile: the recipe is the blockout and the low poly, the trim sheet replaces per-asset UV + bake + texture, and `shot` / `hero` / `review` are the presentation. What it borrows from the pipeline is the taste: bevels, roughness variation, consistent texel density, readable silhouettes.** This page records the pipeline as practitioners describe it, the free CC0 libraries (with exact licence wording) that can feed ts23d as inputs, and the gaps. Research as of 2026-11-07; "Proposed" items are **planned, not shipped**. Neutral positioning: artists, DCC tools and AI generators all produce good assets; ts23d is the free, code-based option.
|
|
4
|
+
|
|
5
|
+
## The pipeline as practitioners describe it
|
|
6
|
+
|
|
7
|
+
| Stage | What happens | Typical tools | ts23d equivalent | Where |
|
|
8
|
+
|---|---|---|---|---|
|
|
9
|
+
| Reference | Photos, drawings, specs, front/side sheets | PureRef, browser | `recipes/<name>/README.md` written first; `real` + `sources` + `measures` | CLAUDE.md recipe loop |
|
|
10
|
+
| **Blockout** | Primitive masses at real scale, read the silhouette in-engine | Any DCC | Step 2 "Masses", `proportions` ±5% / `measures` ±2% gates | [05](05-agent-loop.md) |
|
|
11
|
+
| High poly | Sub-D or sculpt with every bevel and detail, for baking only | ZBrush, Blender, Maya | Not a separate artefact: LOD0 *is* the dense mesh; SDF normals come from the exact field | `src/primitives/sdf.ts` |
|
|
12
|
+
| Low poly | Game mesh around the high poly; hard edges at UV splits | DCC, retopo tools | Same recipe at LOD1/LOD2, gated by `ctx.lod`, never decimated | [02](02-dsl.md), CLAUDE.md |
|
|
13
|
+
| UV | Unwrap, pack, consistent texel density | RizomUV, Blender | Primitives author UVs onto the trim sheet at true metres | `src/material/trim-sheet.ts` |
|
|
14
|
+
| **Bake** | High → low: normal, AO, curvature, ID; cage controls the ray search so hard edges shade soft | Marmoset Toolbag, Substance, xNormal, Blender | Vertex AO (`bakeAo`), weighted normals, field-gradient normals; no per-asset maps by design | `src/passes/bake-ao.ts`, `weighted-normals.ts` |
|
|
15
|
+
| Texture | Smart materials on baked maps: edge wear from curvature, dirt from AO, roughness breakup | Substance Painter, ArmorPaint | Procedural trim sheet + vertex colour + `grime` / `livery`; edge wear planned ([11](11-materials-authoring.md)) | `src/material/paint/`, `src/passes/` |
|
|
16
|
+
| Present | Marmoset turntable, ArtStation renders, in-engine shots | Marmoset, engine | `t3d shot` (six views), `t3d hero` (beauty), `t3d review` (AI review pack) | `src/render/` |
|
|
17
|
+
|
|
18
|
+
Order varies: some artists build the high poly first and the low poly around it, others go blockout → mid → high → low; hard-surface flows often add an in-between mesh ([Polycount thread](https://polycount.com/discussion/comment/1771950), practitioner opinions). The bake cage "allows the baker to search for high-poly detail as if edges were soft, while the actual low-poly retains hard edges" (Gnomon course description, [Creating Props for Games](https://bit.thegnomonworkshop.com/workshops/creating-props-for-games-vol-1)).
|
|
19
|
+
|
|
20
|
+
## The two realism keys
|
|
21
|
+
|
|
22
|
+
**Bevels.** Real objects have no razor edges; a 1–5 mm chamfer catches a highlight and reads as "manufactured" even at a distance. Studios fake bevels in textures to save triangles: Insomniac's "Ultimate Trim" (GDC 2015, Sunset Overdrive) is a sheet of horizontal trim strips with 45° normal-map bevels, standardised so materials swap without re-UVing ([GDC Vault](https://gdcvault.com/play/1022323/The-Ultimate-Trim-Texturing-Techniques), [CG Channel summary](https://www.cgchannel.com/2019/07/download-justen-lazarros-free-ultimate-trim-texturing-tools)). The Last of Us Part I used baked-bevel trims to save texture memory ([80.lv](https://80.lv/articles/the-last-of-us-remake-s-trim-pipeline-in-substance-3d-explained)).
|
|
23
|
+
ts23d today: geometric bevels via `box({ bevel })` + `weightedNormals` (the mid-poly look; `src/primitives/bevel-box.ts`).
|
|
24
|
+
|
|
25
|
+
**Roughness variation.** A flat roughness value reads as plastic CG; smudges, wear and dirt varying the specular response read as a material. ts23d today: every painter writes a `rough` layer with mottling; there is no gate on it. Proposed: `roughnessVariation` + a flat-roughness test ([11](11-materials-authoring.md)).
|
|
26
|
+
|
|
27
|
+
### Trim sheets
|
|
28
|
+
|
|
29
|
+
ts23d's sheet *is* a trim sheet in the studio sense ([ADR 003](../decisions/003-shared-trim-sheet.md) → [ADR 008](../decisions/008-surface-materials.md)): 28 strip rows tiling along U, then decal and foliage cells, one 2048² set (`src/material/trim-sheet.ts`). What studio trims have that ts23d's lacks:
|
|
30
|
+
|
|
31
|
+
| Studio trim feature | ts23d | Proposed |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| Bevel/edge strips with baked 45° normal + worn edge | No; bevels are geometry | A `worn_edge` strip; map `box({ bevel })` chamfers onto it (S–M) |
|
|
34
|
+
| Strip heights doubling (small to large trims) | Equal 64 px rows | Only if a recipe needs fine trims; layout change = ADR |
|
|
35
|
+
| Decals over trims (bolts, vents, grates) as floating quads | Cells, mapped by `cell()` | `decal()` primitive: a quad offset 1–2 mm along the normal, cutout surface (S) |
|
|
36
|
+
|
|
37
|
+
### Texel density
|
|
38
|
+
|
|
39
|
+
Examples from vendor docs: 10.24 px/cm first person, 5.12 px/cm third person, 2.56 px/cm or less top-down; closer cameras need more ([Maxon](https://help.maxon.net/c4d/en-us/Content/html/Texel_Density.html)). ts23d's strips give 1024 px/m along U at 2048² (a strip spans 2 m), constant across assets by construction; along V it depends on `scaleMetres`. The planned texel-density gate (roadmap M2) should measure both axes.
|
|
40
|
+
|
|
41
|
+
## Free CC0 libraries
|
|
42
|
+
|
|
43
|
+
All five below state CC0 or public-domain terms. CC0 means no attribution required and commercial use and redistribution allowed; it also means **no warranty** (no indemnity for trademarks, likeness or third-party IP depicted). Verified on each site 2026-11-07 unless noted.
|
|
44
|
+
|
|
45
|
+
| Library | What | Licence wording | Exceptions | Fits ts23d as |
|
|
46
|
+
|---|---|---|---|---|
|
|
47
|
+
| [Poly Haven](https://polyhaven.com/license) | HDRIs, PBR textures, models | "Our assets are all licensed as CC0"; "You can redistribute them"; "You do not need to give credit" | Site content other than the assets (logos, renders) is protected | **HDRIs** for the Blender bridge's Cycles renders ([12](12-blender-bridge.md)) and a future image-based-light option in `beauty()`; texture calibration |
|
|
48
|
+
| [ambientCG](https://docs.ambientcg.com/license/) | PBR materials, HDRIs, models | "provided under the Creative Commons CC0 1.0 Universal License"; "You don't need to give credit" | None stated | Calibrating `MaterialDef` roughness/albedo; CC0 **height** maps as strip sources ([11](11-materials-authoring.md)) |
|
|
49
|
+
| [cgbookcase](https://www.cgbookcase.com) | PBR textures (hundreds of sets) | CC0 per the author's announcements ([BlenderNation 2018](https://www.blendernation.com/2018/09/14/250-free-cc0-high-quality-pbr-textures-from-cgbookcase-com/), [CG Channel 2019](https://www.cgchannel.com/2019/03/download-380-free-pbr-texture-sets-from-cgbookcase-com/)) | **Licence page not reachable when checked (404)**; verify on the site before vendoring | Same as ambientCG |
|
|
50
|
+
| [Kenney](https://kenney.nl/support) | Low-poly game kits, UI, audio | "all game assets on the asset pages are public domain licensed (CC0)"; "Attribution is not required" | "Do not use our logo" | `importGlb` (planned, M5) inputs; scale/style references for stylised recipes |
|
|
51
|
+
| [Quaternius](https://quaternius.com/packs/fantasypropsmegakit.html) | Low-poly models, some rigged/animated, glTF included | CC0, "free to use in personal, educational and commercial projects" (pack pages; [OpenGameArt mirrors](https://opengameart.org/content/low-poly-rpg-pack)) | None stated | `importGlb` inputs: rigged characters for what recipes do weakly ([07](07-what-fits.md)) |
|
|
52
|
+
|
|
53
|
+
Other licences to know, **not** CC0: Sketchfab downloads carry per-model CC-BY / CC-BY-NC etc. (check each); Fab/Quixel Megascans have their own EULA; Substance Source is subscription content. None of these should be vendored into the repo.
|
|
54
|
+
|
|
55
|
+
### How CC0 assets enter ts23d without breaking determinism
|
|
56
|
+
|
|
57
|
+
| Rule | Why |
|
|
58
|
+
|---|---|
|
|
59
|
+
| **Vendor, never fetch at build time.** Commit the file (or publish it with the package) with its sha256 | A URL can change or vanish; bytes in git cannot |
|
|
60
|
+
| **Record provenance in `sources`** (URL, licence, date) and in GLB XMP (`KHR_xmp_json_ld`, shipped) | CC0 needs no credit, but provenance is how a reviewer checks it |
|
|
61
|
+
| **Images are inputs, not the only path** ([04](04-materials.md#image-sources)) | The sheet must still paint with no image present |
|
|
62
|
+
| **Imported meshes go through `importGlb` → fit → recolour onto the sheet** | Keeps one material and real units |
|
|
63
|
+
| A `licence` field per vendored input, checked by a script in `bun run verify` (proposed) | "A rule without a script is a suggestion" (CLAUDE.md) |
|
|
64
|
+
|
|
65
|
+
## Where ts23d differs on purpose
|
|
66
|
+
|
|
67
|
+
| Studio practice | ts23d choice | Reason |
|
|
68
|
+
|---|---|---|
|
|
69
|
+
| Per-asset baked normal/AO/curvature maps | One shared sheet; wear in vertex data | One draw call, swap palette by recipe edit ([ADR 008](../decisions/008-surface-materials.md)) |
|
|
70
|
+
| Decimate the high poly for LODs | LOD-gated emission from one source | Cleaner silhouettes, named parts survive every LOD |
|
|
71
|
+
| Hand UVs | UVs by construction at true metres | Agents don't unwrap; consistent density for free |
|
|
72
|
+
| Quad retopology | Triangles, vertex-cache ordered (`optimize`) | Engines draw triangles; ts23d doesn't subdivide |
|
|
73
|
+
|
|
74
|
+
## Next steps for ts23d (prioritised)
|
|
75
|
+
|
|
76
|
+
1. **Texel-density gate** (px/m along U and V per part; V-stretch warning). S–M. Already on roadmap M2.
|
|
77
|
+
2. **`worn_edge` strip + bevel-to-strip mapping** in `box({ bevel })`: the Ultimate-Trim idea with real geometry. S–M.
|
|
78
|
+
3. **`decal()` primitive**: offset quad on a cell, cutout surface, for bolts/vents/grates. S.
|
|
79
|
+
4. **Vendored-input convention + `licence` check** in `bun run verify` (sha256, URL, licence, date per file under `assets/vendor/` or similar). S.
|
|
80
|
+
5. **Roughness-variation knob + flat-roughness test** ([11](11-materials-authoring.md)). S.
|
|
81
|
+
6. **CC0 HDRI support**: Poly Haven `.hdr` loader for an optional IBL term in `beauty()` (zero-dep RGBE decode is ~100 lines) and for the Blender bridge. M.
|
|
82
|
+
7. **Document the calibration workflow** in `.claude/skills/author-recipe/SKILL.md`: sample a CC0 texture's albedo/roughness, put the numbers in `MaterialDef`, cite the URL. S.
|
|
83
|
+
|
|
84
|
+
## Sources
|
|
85
|
+
|
|
86
|
+
- Pipeline: [Polycount threads](https://polycount.com/discussion/comment/1771950), [Gnomon: Creating Props for Games](https://bit.thegnomonworkshop.com/workshops/creating-props-for-games-vol-1) (course description) — practitioner accounts, not a standard
|
|
87
|
+
- Trims: [GDC Vault, "The Ultimate Trim: Texturing Techniques of Sunset Overdrive"](https://gdcvault.com/play/1022323/The-Ultimate-Trim-Texturing-Techniques) (Insomniac, 2015), [CG Channel](https://www.cgchannel.com/2019/07/download-justen-lazarros-free-ultimate-trim-texturing-tools), [80.lv on The Last of Us Part I trims](https://80.lv/articles/the-last-of-us-remake-s-trim-pipeline-in-substance-3d-explained)
|
|
88
|
+
- Texel density: [Maxon Cinema 4D docs](https://help.maxon.net/c4d/en-us/Content/html/Texel_Density.html)
|
|
89
|
+
- Licences: [Poly Haven](https://polyhaven.com/license), [ambientCG](https://docs.ambientcg.com/license/), [Kenney](https://kenney.nl/support), [Quaternius](https://quaternius.com/packs/fantasypropsmegakit.html), cgbookcase via [BlenderNation](https://www.blendernation.com/2018/09/14/250-free-cc0-high-quality-pbr-textures-from-cgbookcase-com/) and [CG Channel](https://www.cgchannel.com/2019/03/download-380-free-pbr-texture-sets-from-cgbookcase-com/)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Landscape: AI 3D generators
|
|
2
|
+
|
|
3
|
+
**A neutral survey, as of Oct 2026. ts23d isn't a competitor to these tools; it's a different approach (code recipes, free, no GPU, no service) with different strengths.** Many teams will use both. Prices and features change monthly, so check the linked source before relying on a row.
|
|
4
|
+
|
|
5
|
+
Rows marked **(3rd-party)** come from aggregators or press, not the vendor's own page. Treat them as indicative.
|
|
6
|
+
|
|
7
|
+
## Hosted / commercial
|
|
8
|
+
|
|
9
|
+
| Tool | Inputs | Outputs | Rig / anim | Pricing (as of Oct 2026) | Open? | Source |
|
|
10
|
+
|---|---|---|---|---|---|---|
|
|
11
|
+
| Meshy (Meshy 7.1 / 6) | Text, image, multi-view | GLB / glTF / FBX / OBJ / USDZ / STL / 3MF; PBR (albedo / normal / metal / rough); quad/tri remesh, Low Poly mode, Smart Topology | Auto-rig humanoid + quadruped, 500–600+ motion presets | Free 100 credits/mo, outputs CC BY 4.0. Pro $20 (1,000 cr), Premium $40 (3,000), Ultra $100 (8,000), Studio $70/team. ~20–25 credits per generation | No (paid = private + commercial) | [pricing](https://www.meshy.ai/pricing) · [docs](https://docs.meshy.ai/en/webapp/pricing) · [animate](https://docs.meshy.ai/en/webapp/guides/animate) |
|
|
12
|
+
| Tripo (Tripo 3.x) | Text, image, multi-view | GLB / FBX / OBJ / USD / STL; PBR, smart low-poly, quad topology **(3rd-party)** | Auto-rig + animation | Free ~200–300 cr/mo (public, non-commercial); Pro ~$20/mo (3,000 cr); Max ~$90 (25,000); API per task **(3rd-party)** | No | [docs](https://platform.tripo3d.ai/docs/introduction) · [CostBench](https://www.costbench.com/software/ai-3d-generation/tripo-ai/) |
|
|
13
|
+
| Rodin / Hyper3D (Gen-2.5) | Text, image, multi-view, sketch, 3D ControlNet (bbox / voxel / point cloud), mesh edit | GLB / glTF / FBX / OBJ / USDZ / STL; PBR + UVs; quad/tri, polycount presets (~4K–50K quads) | Not mentioned on official page | Free pay-per-result ($1.50/credit); Creator $30/mo (~60 models); Business $120/mo (~416, API) | No | [pricing](https://hyper3d.ai/pricing) · [site](https://hyper3d.ai/) |
|
|
14
|
+
| Luma Genie | Text (originally) | GLB / OBJ / USDZ (2024 coverage) | No | Free research preview at 2024 launch; current status unclear **(3rd-party)** | No | [The Decoder](https://the-decoder.com/genie-by-luma-ai-is-a-free-text-to-3d-generator-for-discord/) |
|
|
15
|
+
| CSM (Cube) | Image, text | Part-based meshes, AI retopology **(3rd-party)** | Not confirmed | Free tier, then ~$20 / $60 / $499+/mo (May 2026); reported acquired by Google Jan 2026, unconfirmed **(3rd-party)** | No | [CostBench](https://costbench.com/software/ai-3d-generation/csm/) |
|
|
16
|
+
| Kaedim | Concept art, sketches, photos, briefs | Production 3D with review / markup / revision loop | Not stated | No public pricing; $50 trial to $400–$1,200/mo **(3rd-party)** | No (customer owns outputs) | [site](https://www.kaedim3d.com/) |
|
|
17
|
+
| Sloyd | Text, image, multi-image, parametric templates | GLB / OBJ / FBX / STL; polycount + tri/quad control; Unity / Unreal / Blender / Godot / Roblox plugins | AI rig + anim | Guest 1 gen/day personal; Plus $15/mo (50 cr); Pro $50/mo (350 cr) | No | [pricing](https://www.sloyd.ai/pricing) |
|
|
18
|
+
| Autodesk Wonder 3D (Mar 2026) | Text, image | OBJ / STL for Maya / 3ds Max / Flow Studio | Not stated | Free 300 cr/mo at 20/gen; Pro ~$64/mo | No | [Autodesk news](https://adsknews.autodesk.com/en/news/autodesk-flow-studio-launches-wonder-3d-gen-ai-model-to-help-creators-make-3d-characters-and-objects-faster-and-easier/) |
|
|
19
|
+
|
|
20
|
+
## Open weights / self-hosted
|
|
21
|
+
|
|
22
|
+
| Tool | Inputs | Outputs | Rig / anim | Cost / hardware | Licence | Source |
|
|
23
|
+
|---|---|---|---|---|---|---|
|
|
24
|
+
| Hunyuan3D (Tencent) | Open 2.x: image, multi-view. Hosted 3.x: text / image / sketch, up to 4–8 views | Mesh + PBR texture pipeline (Paint 2.1) | No | Open 2.1 free, ~29 GB VRAM shape + texture; hosted ~20 free gens/day then ~$0.02/credit | 2.0 / 2.1 open weights, Tencent community licence (excludes EU / UK / South Korea, terms above 1M MAU, no training other models on outputs); 2.5 / 3.x hosted only | [GitHub](https://github.com/Tencent-Hunyuan/Hunyuan3D-2.1) |
|
|
25
|
+
| TRELLIS.2 (Microsoft) | Single image; can texture an existing mesh | GLB with PBR incl. opacity, 4K textures | No | Free self-hosted; ≥ 24 GB GPU, tested Linux A100 / H100 | MIT | [Hugging Face](https://huggingface.co/microsoft/TRELLIS.2-4B) |
|
|
26
|
+
| Stable Fast 3D / SPAR3D (Stability) | Single image 512² | UV-unwrapped textured mesh, delighted textures, rough/metal; SPAR3D point-cloud editing | No | Free self-host; hosted API credit-based | Stability Community Licence (free under $1M revenue) | [Hugging Face](https://huggingface.co/stabilityai/stable-point-aware-3d) |
|
|
27
|
+
| SAM 3D Objects (Meta, Nov 2025) | Real photos; an object from a cluttered scene | Textured object + pose / layout | No | Free self-hosted | Open weights, custom SAM licence **(3rd-party)** | [Roboflow](https://roboflow.com/model/sam-3d-objects) |
|
|
28
|
+
|
|
29
|
+
## Caveats on the data
|
|
30
|
+
|
|
31
|
+
- The Tripo site returned 403 to our research run; its pricing comes from CostBench.
|
|
32
|
+
- csm.ai did not resolve; the CSM row is entirely third-party.
|
|
33
|
+
- The Luma Genie page now redirects; current status unknown.
|
|
34
|
+
- Gallery themes as shown by vendors: Meshy, riggable characters and stylised props. Rodin, a robot, a sci-fi weapon, a motorcycle, architecture. Sloyd, creatures, avatars, furniture, vehicles, weapons, trees, buildings. Kaedim, products, game props, characters.
|
|
35
|
+
|
|
36
|
+
## Where each approach fits
|
|
37
|
+
|
|
38
|
+
| Strength | Image/text-to-3D generators | Code recipes (ts23d) |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| Organic and sculpted forms | Strong | Weak ([what fits](idea/07-what-fits.md)) |
|
|
41
|
+
| Concept art → textured mesh in seconds | Strong | No |
|
|
42
|
+
| Auto-rigging | Several tools have it; meshes and rigs usually still need cleanup | Rigid part hierarchy only |
|
|
43
|
+
| Parts that line up, repeat or match real dimensions | Weaker | Strong |
|
|
44
|
+
| Named, animatable nodes | Usually one fused mesh | Built in |
|
|
45
|
+
| Determinism, diffable git history | No | Yes |
|
|
46
|
+
| Shared materials, consistent texel density | Per-asset textures | One trim sheet |
|
|
47
|
+
| Cost, licence conditions on outputs | Credits; terms vary by tier | Free; none |
|
|
48
|
+
|
|
49
|
+
The open-weight rows are what the planned [`/neural` adapter](idea/08-neural-adapters.md) wraps for the organic cases, on your own GPU, cached by content hash.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Roadmap
|
|
2
|
+
|
|
3
|
+
**Each milestone ships something an agent can use end to end, gated by `bun run verify`. Scope ends at the GLB, textures and manifest; engines and game code are out of scope.** Ticked = on `main` with a test and, where it makes geometry, a recipe. Order within a milestone is a suggestion; order between milestones is a dependency. No dates promised.
|
|
4
|
+
|
|
5
|
+
Status as of 2026-11-07: **M0 done, M1 done but for recipes, M2 under way.** Every exported entry point that isn't ticked throws `T3D_NOT_IMPLEMENTED` with a pointer here.
|
|
6
|
+
|
|
7
|
+
## M0: Scaffold (0.x)
|
|
8
|
+
|
|
9
|
+
- [x] Mesh IR, `MeshBuilder`, seeded forkable RNG, vector math
|
|
10
|
+
- [x] `defineAsset` / `compile` / `ctx.part` / `ctx.group` / `ctx.use`, LODs by re-run
|
|
11
|
+
- [x] `real` dimensions + `sources` on `defineAsset`
|
|
12
|
+
- [x] Mesh transforms: `place`, `affine`, `frame`, `applyAffine`
|
|
13
|
+
- [x] `Ts23dError` with code + cause + fix
|
|
14
|
+
- [x] Split grammar (`split`, `parseSplit`, `layoutSplit`), Whyte notation
|
|
15
|
+
- [x] Trim-sheet layout, palettes, `hex()`
|
|
16
|
+
- [x] Primitives: `box`, `lathe`, `cylinder`
|
|
17
|
+
- [x] Kinds: `facade`, `setbacks`, `axle`, `trackRun`, `whyteAxles`, `propeller`
|
|
18
|
+
- [x] `grime` pass
|
|
19
|
+
- [x] QA: `triangle-budget`, `floating-parts` (surface contact), `clashes` (swept motion, `clearOf`), `part-names`, `proportions`, `measures` (`real.measures`)
|
|
20
|
+
- [x] GLB writer: one material, baked spin/slide clip, Z-up → Y-up root
|
|
21
|
+
- [x] `defineFamily`: variants and derived families
|
|
22
|
+
- [x] `ctx.emitter`: particle sources as named nodes
|
|
23
|
+
- [x] `sway` motion; `run` clip baked by `t3d build`, opt-in in `toGlb`
|
|
24
|
+
- [x] Recipe `checks` (`clear`, `noOverlap`, `touches`, `symmetric`) and `inspect`
|
|
25
|
+
- [x] `ctx.socket`; surfaces (opaque / cutout / glass / translucent, ≤ 4 materials)
|
|
26
|
+
- [x] CLI output: `out/<asset>/` with GLBs, sheet, manifest; `out/index.json`
|
|
27
|
+
- [x] `heightfield` terrain
|
|
28
|
+
- [x] GLB production pass: front axis +Z, seamless loops, `rest` + `run` clips, u16 indices, u16 colours, shared time accessors, glTF-Validator in tests ([glb-production.md](../architecture/glb-production.md) G1, G2, G4, G5, G10)
|
|
29
|
+
- [x] `mergeToPivots`: static geometry batched into its nearest pivot (default in `toGlb`; `keepParts` opts out)
|
|
30
|
+
- [x] CPU contact sheet: six views, metre grid, header dims
|
|
31
|
+
- [x] CLI: `t3d build | shot | list`, `--out`, `--json`
|
|
32
|
+
- [x] Repo gates: lint, typecheck, boundaries, determinism, filesize, tests, recipes (QA + double-build hash), build
|
|
33
|
+
- [x] Release flow: stamp → PR → tag → OIDC publish
|
|
34
|
+
- [x] Recipes: `tiger_1`, `t34` + `t34_1941` (family), `loco_440` (family; the Jupiter, drivers 1.626 m sourced), `material_swatches`
|
|
35
|
+
- [x] Asset gallery site (every recipe, compiled in the browser)
|
|
36
|
+
- [ ] First npm publish (bootstrap, [PUBLISHING.md](../../PUBLISHING.md))
|
|
37
|
+
|
|
38
|
+
## M1: Architecture primitives
|
|
39
|
+
|
|
40
|
+
- [x] `prism`: extrude a 2D profile in the `xy` / `xz` / `yz` plane
|
|
41
|
+
- [x] `beam`: member between two points, square or round
|
|
42
|
+
- [x] `planar`: flat polygon in 3D
|
|
43
|
+
- [x] `triangulate`: ear clipping
|
|
44
|
+
- [x] `tiled`: quad tiling a strip at true scale
|
|
45
|
+
- [x] `cell`: quad mapped to a decal cell (with `inset` reveals)
|
|
46
|
+
- [x] `roof`: hip, gable, pyramid, mansard, gambrel, shed; `opening` window/door kit, `mass` true-scale masonry
|
|
47
|
+
- [ ] Opt-out for genuinely floating parts (aircraft in flight, hanging signs)
|
|
48
|
+
- [ ] Cross-machine determinism check; a `t3d build` flag for users' recipes
|
|
49
|
+
- [x] Recipe: `eiffel_tower` (188,016 / 21,860 / 1,062 triangles, 1 draw call; profile from Weidman & Pinelis 2004 and Eiffel's 1887 drawing)
|
|
50
|
+
- [x] `lattice` truss primitive (Warren / Pratt / Howe / X)
|
|
51
|
+
- [ ] Recipes: a terrace street, a station, an Art Deco tower, townhouse, gas lamp (landing)
|
|
52
|
+
|
|
53
|
+
## Recipe-agent backlog (unscheduled)
|
|
54
|
+
|
|
55
|
+
- [ ] `orbit` motion + `phase` for side rods and quartering
|
|
56
|
+
- [x] Sector sweep for `sway` clashes; `oneWay` slide / sway
|
|
57
|
+
- [ ] `recipes/_lib/` shared helpers: `trackLoop`, `roadWheel`, decal font with Cyrillic
|
|
58
|
+
- [ ] `subdivide(mesh, maxEdge)` pass for vertex-colour camo
|
|
59
|
+
- [ ] Exact-match option for measure `parts` (today: prefix match)
|
|
60
|
+
- [ ] TriangleGrid filling only the cells a triangle crosses
|
|
61
|
+
|
|
62
|
+
## M2: High definition, cheap to draw
|
|
63
|
+
|
|
64
|
+
Materials:
|
|
65
|
+
- [x] `paintTrimSheet`: procedural albedo / normal / ORM; strips bond, planks, plates, noise, flat, slate, concrete, glass; 6 decal + 11 foliage cells
|
|
66
|
+
- [x] Sheet in the GLB: embedded or shared external PNGs (`--sheet`, `--sheet-size`)
|
|
67
|
+
- [ ] KTX2 profile; fix mip bleed between strips; per-face V mapping on `box`
|
|
68
|
+
- [ ] Image-stamped cells (decals from any `ImageSource`)
|
|
69
|
+
- [ ] Painter curvature + `edgeWear` mask (`params.edgeWear`, `PaintKit.curvature`) ([11](../idea/11-materials-authoring.md))
|
|
70
|
+
- [ ] `edgeWear(mesh)` pass (dihedral / SDF-Laplacian convexity → vertex colour; `_WEAR` attribute for shader sources)
|
|
71
|
+
- [ ] `roughnessVariation` on `MaterialDef` + flat-roughness test
|
|
72
|
+
- [ ] `worn_edge` strip mapped by `box({ bevel })` chamfers; `decal()` offset-quad primitive
|
|
73
|
+
|
|
74
|
+
Optimisation and GLB production (gap ids from [glb-production.md](../architecture/glb-production.md)):
|
|
75
|
+
- [x] `optimize(mesh)`: vertex weld + vertex-cache reorder, reports ACMR (default in export)
|
|
76
|
+
- [ ] Gate: ACMR ceiling
|
|
77
|
+
- [ ] Opt-in `web` profile: `KHR_mesh_quantization` + `EXT_meshopt_compression` (G14). Default stays core glTF: Godot refuses required extensions
|
|
78
|
+
- [ ] `MSFT_lod` single-file LOD set + screen-coverage switch hints (G11)
|
|
79
|
+
- [ ] Placeholder pivots at LOD2 so engine-bound names exist in every LOD (G3)
|
|
80
|
+
- [ ] `engine-names` gate against Godot suffix hints like `_wheel`, `-col` (G6)
|
|
81
|
+
- [ ] Clip naming Godot loops (`*_loop`) (G7)
|
|
82
|
+
- [x] Asset metadata: generator version, copyright, XMP provenance (G8)
|
|
83
|
+
- [ ] Mesh dedupe: identical geometry shares one mesh (G9)
|
|
84
|
+
- [x] Emissive surface (`KHR_materials_emissive_strength`) for lit windows (G13 remainder)
|
|
85
|
+
|
|
86
|
+
Shape:
|
|
87
|
+
- [x] `sweep`: parallel-transport frames, taper, twist
|
|
88
|
+
- [x] `loft` over `rings`, `ringXY` with wobble
|
|
89
|
+
- [x] `hull` (vessel kind) from length / beam / draft / freeboard
|
|
90
|
+
- [ ] Lofted vehicle bodies, fuselages, wings
|
|
91
|
+
|
|
92
|
+
Checking:
|
|
93
|
+
- [ ] `photoMatch(asset, { photo, camera })`: photo · model · overlay in one PNG + silhouette IoU
|
|
94
|
+
- [ ] `silhouetteIoU` gate on top of it
|
|
95
|
+
- [ ] Gates: manifold + outward normals, texel density
|
|
96
|
+
|
|
97
|
+
Exit bar: a 4-4-0 with tender matching [`docs/reference/loco-photo-match.png`](https://raw.githubusercontent.com/developerz-ai/ts23d/main/docs/reference/loco-photo-match.png) (predecessor output: ~16k triangles, 17 named nodes, one embedded trim-sheet material, baked `run`). Recipes: that loco, a harbour tug, a biplane.
|
|
98
|
+
|
|
99
|
+
## M3: Vegetation and engine import adapters
|
|
100
|
+
|
|
101
|
+
- [x] `tree`: Weber–Penn skeleton, leaf cards; presets oak / pine / palm / birch / willow; `trees` family; `treeReal`
|
|
102
|
+
- [x] Recipes: `oak`, `pine`, `palm`
|
|
103
|
+
- [ ] Per-vertex wind weights (crown `sway` today)
|
|
104
|
+
- [ ] LOD2 impostors as crossed billboards from the foliage cells
|
|
105
|
+
- [ ] Species presets as data
|
|
106
|
+
- [x] `threeMaterialSource` (TSL) and `godotShaderSource`: wind, window glow, wear
|
|
107
|
+
- [ ] Engine import adapters as data, not runtime: import settings for Unity (glTFast), Godot, Unreal; mapping extras + shader hints onto each engine's material
|
|
108
|
+
- [ ] Engine collision naming: `ctx.collider` → Godot `-convcolonly`, Unreal `UCX_`, generic extras (G12)
|
|
109
|
+
- [ ] Motion baked into vertex attributes (pivot + spin axis per vertex): a shader animates every wheel in one draw call
|
|
110
|
+
- [ ] Recipes: a park, an orchard
|
|
111
|
+
|
|
112
|
+
## M4: Creatures
|
|
113
|
+
|
|
114
|
+
- [x] `sdf`: surface nets or marching cubes over a signed-distance field; `sculpt` edit lists (Dreams-style)
|
|
115
|
+
- [ ] `creature`: SDF flesh over biped / quadruped / bird skeletons, bones as named parts
|
|
116
|
+
- [ ] Recipes: stylised critters, rocks
|
|
117
|
+
- [ ] `roundCone` sculpt shape + `skin()` (draw-skin capsule chains) ([10](../idea/10-sculpting.md))
|
|
118
|
+
- [ ] Sculpt `form` tags (primary/secondary/tertiary) as an LOD filter + primary-only review view
|
|
119
|
+
- [ ] Group `pose` (pivot + rotate) and `warp` (twist/bend/taper) with declared Lipschitz factors
|
|
120
|
+
- [ ] `ffd()` cage deform pass (Sederberg–Parry)
|
|
121
|
+
- [ ] Sculpt strokes along a path: `crease`, `clay`, `inflate` (then `pinch`, `flatten`); `revolve` SDF shape
|
|
122
|
+
- [ ] `t3d shot --ref front=… side=…` overlays + per-view silhouette IoU
|
|
123
|
+
|
|
124
|
+
## M5: Neural adapters and import
|
|
125
|
+
|
|
126
|
+
- [ ] `localGenerator`: HTTP adapter for a local TRELLIS.2 / Hunyuan3D 2.1 / SF3D server
|
|
127
|
+
- [ ] Content-hash cache under `.ts23d/neural/`; a CI cache miss is an error naming the regenerate command
|
|
128
|
+
- [ ] `importGlb`: any GLB as a part, fitted and recoloured onto the trim sheet
|
|
129
|
+
- [ ] `kubeezImages`: kubeez.com image source for references, decals, texture sources
|
|
130
|
+
- [ ] Recipe: a code-built cart drawn by a generated horse
|
|
131
|
+
- [ ] Optional Blender bridge, never in the gate ([12](../idea/12-blender-bridge.md)): ADR, shared content-hash cache with /neural, `t3d blender doctor | render | remesh | convert`
|
|
132
|
+
- [ ] Vendored-input convention (sha256 + URL + licence) and a `licence` check in `bun run verify`; CC0 HDRI loader for `beauty()` IBL
|
|
133
|
+
|
|
134
|
+
## M6: Reverse direction and reach
|
|
135
|
+
|
|
136
|
+
- [ ] Camera solve for `photoMatch` from ≥ 4 marked correspondences
|
|
137
|
+
- [ ] Reverse direction: a VLM proposes recipe params from photos, scored by silhouette IoU, best kept
|
|
138
|
+
- [ ] MCP server: `build`, `shot`, `list` as tools, PNG inline
|
|
139
|
+
- [ ] Playground: edit a recipe in the browser, see GLB + contact sheet live
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Build assets without the CLI: the library is plain TypeScript, so a script is all you need.
|
|
2
|
+
// Run: bun examples/build-with-bun.ts [out-dir] (Node ≥ 22 works too, against the built dist/)
|
|
3
|
+
// Pick exactly what you want — which LODs, textures or not, QA or not, sheets or not.
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
compile,
|
|
7
|
+
contactSheet,
|
|
8
|
+
DEFAULT_SHEET,
|
|
9
|
+
type Lod,
|
|
10
|
+
paintTrimSheet,
|
|
11
|
+
runQa,
|
|
12
|
+
toGlb,
|
|
13
|
+
} from '@developerz.ai/ts23d';
|
|
14
|
+
import { tiger_1 } from '../recipes/tiger_1/tiger_1.ts';
|
|
15
|
+
|
|
16
|
+
const out = process.argv[2] ?? 'out/example';
|
|
17
|
+
const asset = tiger_1;
|
|
18
|
+
const lods: Lod[] = [0, 2]; // near + far only — your call
|
|
19
|
+
|
|
20
|
+
// Textures are optional: paint once, embed (or pass { external: true } and ship the PNGs).
|
|
21
|
+
const sheet = paintTrimSheet({ ...DEFAULT_SHEET, size: 512 });
|
|
22
|
+
|
|
23
|
+
for (const lod of lods) {
|
|
24
|
+
const compiled = compile(asset, { lod });
|
|
25
|
+
|
|
26
|
+
// QA is a function too: gate however your pipeline wants.
|
|
27
|
+
const findings = runQa(compiled);
|
|
28
|
+
if (findings.length > 0) {
|
|
29
|
+
for (const f of findings) console.error(`LOD${lod} ${f.gate}: ${f.message}\n fix: ${f.fix}`);
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
await Bun.write(
|
|
34
|
+
`${out}/${asset.name}.lod${lod}.glb`,
|
|
35
|
+
toGlb(compiled, { sheet, animations: true }),
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// The six-view contact sheet, for you or your agent to look at.
|
|
40
|
+
await Bun.write(`${out}/${asset.name}.png`, contactSheet(compile(asset, { lod: 0 })));
|
|
41
|
+
console.log(`✔ ${asset.name}: LOD ${lods.join(', ')} + contact sheet → ${out}/`);
|
package/llms.txt
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# ts23d
|
|
2
|
+
|
|
3
|
+
> @developerz.ai/ts23d — a free, deterministic 3D asset generator driven by coding agents. Assets are TypeScript modules (never JSON) built with a DSL: `defineAsset({ name, kind, real, sources, budget, build(ctx) })`, where `build` adds named, pivoted, animatable parts from primitives (`box`, `lathe`, `cylinder`, `prism`, `beam`, `planar`), places detail with `place`/`merge`, composes other assets with `ctx.use`, and gates detail on `ctx.lod`. It compiles to glTF/GLB for any engine (Unity, Unreal, Godot, three.js, Babylon) — ts23d generates assets only, the engine is yours — (3 LODs, one shared trim-sheet material, baked motion), fails a QA gate on floating parts, budget overruns and wrong real-world proportions, and renders a zero-GPU six-view contact-sheet PNG so a vision-capable agent can check its own work. Bun only, zero runtime dependencies, MIT. Status 0.x: stubs throw T3D_NOT_IMPLEMENTED with the roadmap slice that builds them.
|
|
4
|
+
|
|
5
|
+
## Offline (inside your project)
|
|
6
|
+
The npm package ships every doc, skill and example, versioned with the code — read them without internet:
|
|
7
|
+
- `node_modules/@developerz.ai/ts23d/AGENTS.md` — rules and the loop
|
|
8
|
+
- `node_modules/@developerz.ai/ts23d/docs/` — DSL, IR, materials, agent loop, QA, kinds, decisions, roadmap
|
|
9
|
+
- `node_modules/@developerz.ai/ts23d/recipes/<name>/` — idiomatic recipes, each with its research dossier (`README.md`) and committed hero + contact sheet (`out/`)
|
|
10
|
+
- `node_modules/@developerz.ai/ts23d/.claude/skills/author-recipe/SKILL.md` — copy into your `.claude/skills/`
|
|
11
|
+
|
|
12
|
+
## The workflow
|
|
13
|
+
The human names a thing ("Tiger I, mid-production 1943"). The agent researches specs and real photos into `recipes/<name>/README.md` (every number sourced), writes `recipes/<name>.ts` with `sources` + `real.measures` from that dossier, compiles until QA PASS (budget, surface contact, clashes, proportions ±5%, measures ±2%), renders the six-view contact sheet, looks at it, adds LOD-gated detail, and iterates.
|
|
14
|
+
|
|
15
|
+
## Programmatic (no CLI)
|
|
16
|
+
`t3d` is optional: `compile` → `runQa` → `toGlb` / `contactSheet` / `paintTrimSheet` are plain functions returning bytes. Runnable script: `examples/build-with-bun.ts` (also in the npm package).
|
|
17
|
+
|
|
18
|
+
## Start
|
|
19
|
+
- [README](https://raw.githubusercontent.com/developerz-ai/ts23d/main/README.md): what it is, quickstart, the agent loop
|
|
20
|
+
- [AGENTS.md](https://raw.githubusercontent.com/developerz-ai/ts23d/main/AGENTS.md): rules for agents using or changing the library
|
|
21
|
+
- [CLAUDE.md](https://raw.githubusercontent.com/developerz-ai/ts23d/main/CLAUDE.md): commands, axioms, module tiers, CI
|
|
22
|
+
- [Author-recipe skill](https://raw.githubusercontent.com/developerz-ai/ts23d/main/.claude/skills/author-recipe/SKILL.md): the closed loop, step by step, with a skeleton
|
|
23
|
+
|
|
24
|
+
## DSL and concepts
|
|
25
|
+
- [The DSL](https://raw.githubusercontent.com/developerz-ai/ts23d/main/docs/idea/02-dsl.md): defineAsset, ctx API, composition, determinism
|
|
26
|
+
- [IR, units, axes](https://raw.githubusercontent.com/developerz-ai/ts23d/main/docs/idea/03-ir.md)
|
|
27
|
+
- [Materials](https://raw.githubusercontent.com/developerz-ai/ts23d/main/docs/idea/04-materials.md): trim sheet, palettes, generator, image sources (kubeez.com)
|
|
28
|
+
- [Agent loop](https://raw.githubusercontent.com/developerz-ai/ts23d/main/docs/idea/05-agent-loop.md): contact sheet layout, iteration
|
|
29
|
+
- [QA gates](https://raw.githubusercontent.com/developerz-ai/ts23d/main/docs/idea/06-qa.md)
|
|
30
|
+
- [What fits](https://raw.githubusercontent.com/developerz-ai/ts23d/main/docs/idea/07-what-fits.md): hard-surface vs organic; sculpted stylised characters and terrain today; realistic creatures via local-GPU adapters
|
|
31
|
+
- [Kinds](https://raw.githubusercontent.com/developerz-ai/ts23d/main/docs/idea/09-kinds.md): buildings, vehicles, vessels, vegetation, scenes
|
|
32
|
+
|
|
33
|
+
## Reference
|
|
34
|
+
- [Public API barrel](https://raw.githubusercontent.com/developerz-ai/ts23d/main/src/index.ts)
|
|
35
|
+
- [Error codes](https://raw.githubusercontent.com/developerz-ai/ts23d/main/docs/architecture/errors.md): every T3D_* with cause and fix
|
|
36
|
+
- [Module tiers](https://raw.githubusercontent.com/developerz-ai/ts23d/main/docs/architecture/README.md)
|
|
37
|
+
- [glTF capabilities](https://raw.githubusercontent.com/developerz-ai/ts23d/main/docs/architecture/gltf-capabilities.md): every extension, skins, physics drafts; what ts23d writes
|
|
38
|
+
- [Roadmap](https://raw.githubusercontent.com/developerz-ai/ts23d/main/docs/plans/roadmap.md): shipped vs planned
|
|
39
|
+
- [Decisions](https://raw.githubusercontent.com/developerz-ai/ts23d/main/docs/decisions/): why TS not JSON, why one material, why CPU renders
|
|
40
|
+
- [Example recipe: Tiger I](https://raw.githubusercontent.com/developerz-ai/ts23d/main/recipes/tiger_1/tiger_1.ts)
|
|
41
|
+
- [Reference dossier template](https://raw.githubusercontent.com/developerz-ai/ts23d/main/recipes/README.md)
|
|
42
|
+
|
|
43
|
+
## Optional
|
|
44
|
+
- [Landscape](https://raw.githubusercontent.com/developerz-ai/ts23d/main/docs/landscape.md): neutral overview of AI 3D generators and where each approach fits
|
|
45
|
+
- [Gallery](https://developerz-ai.github.io/ts23d/): every asset compiled live in the browser — orbit, LODs, textures, download GLB
|
|
46
|
+
- kubeez.com — recommended for reference/concept images and texture sources
|
|
47
|
+
- developerz.ai — 100% AI-managed software engineering; builds and maintains this project
|
package/package.json
CHANGED
|
@@ -1,6 +1,102 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@developerz.ai/ts23d",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Free, deterministic 3D asset generation in TypeScript — a DSL your coding agent writes, compiled to game-ready glTF.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "developerz.ai",
|
|
8
|
+
"homepage": "https://developerz-ai.github.io/ts23d/",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/developerz-ai/ts23d.git"
|
|
12
|
+
},
|
|
13
|
+
"bugs": "https://github.com/developerz-ai/ts23d/issues",
|
|
14
|
+
"keywords": [
|
|
15
|
+
"3d",
|
|
16
|
+
"procedural",
|
|
17
|
+
"gltf",
|
|
18
|
+
"glb",
|
|
19
|
+
"dsl",
|
|
20
|
+
"game-assets",
|
|
21
|
+
"ai-agents",
|
|
22
|
+
"claude-code",
|
|
23
|
+
"codex",
|
|
24
|
+
"three"
|
|
25
|
+
],
|
|
26
|
+
"sideEffects": false,
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"bun": "./src/index.ts",
|
|
31
|
+
"default": "./dist/index.js"
|
|
32
|
+
},
|
|
33
|
+
"./*": {
|
|
34
|
+
"types": "./dist/*/index.d.ts",
|
|
35
|
+
"bun": "./src/*/index.ts",
|
|
36
|
+
"default": "./dist/*/index.js"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"bin": {
|
|
40
|
+
"t3d": "./dist/cli/bin.js"
|
|
41
|
+
},
|
|
42
|
+
"files": [
|
|
43
|
+
"dist",
|
|
44
|
+
"src",
|
|
45
|
+
"!src/**/*.test.ts",
|
|
46
|
+
"docs",
|
|
47
|
+
"!docs/reference/*.png",
|
|
48
|
+
"recipes",
|
|
49
|
+
"!recipes/*/out",
|
|
50
|
+
"!docs/media",
|
|
51
|
+
"examples",
|
|
52
|
+
"README.md",
|
|
53
|
+
"CLAUDE.md",
|
|
54
|
+
"llms.txt",
|
|
55
|
+
"CHANGELOG.md",
|
|
56
|
+
"LICENSE",
|
|
57
|
+
".claude/skills",
|
|
58
|
+
".claude/agents",
|
|
59
|
+
".claude/commands",
|
|
60
|
+
"!examples/**/*.test.ts"
|
|
61
|
+
],
|
|
62
|
+
"workspaces": [
|
|
63
|
+
"apps/*"
|
|
64
|
+
],
|
|
65
|
+
"scripts": {
|
|
66
|
+
"setup": "bun run scripts/setup.ts",
|
|
67
|
+
"verify": "bun run scripts/verify.ts",
|
|
68
|
+
"lint": "biome check .",
|
|
69
|
+
"lint:fix": "biome check --write .",
|
|
70
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
71
|
+
"test": "bun test src scripts examples",
|
|
72
|
+
"build": "bun run scripts/build.ts",
|
|
73
|
+
"boundaries": "bun run scripts/boundaries.ts",
|
|
74
|
+
"determinism": "bun run scripts/determinism.ts",
|
|
75
|
+
"filesize": "bun run scripts/filesize.ts",
|
|
76
|
+
"recipes": "bun run scripts/recipes.ts",
|
|
77
|
+
"shots": "bun run scripts/shots.ts",
|
|
78
|
+
"textures": "bun run scripts/textures.ts",
|
|
79
|
+
"release": "bun run scripts/release.ts",
|
|
80
|
+
"t3d": "bun run src/cli/bin.ts",
|
|
81
|
+
"site:dev": "bun run --filter @ts23d/site dev",
|
|
82
|
+
"site:build": "bun run --filter @ts23d/site build",
|
|
83
|
+
"site:shots": "bun run scripts/site-shots.ts",
|
|
84
|
+
"bench": "bun run scripts/bench.ts"
|
|
85
|
+
},
|
|
86
|
+
"publishConfig": {
|
|
87
|
+
"access": "public",
|
|
88
|
+
"provenance": true
|
|
89
|
+
},
|
|
90
|
+
"devDependencies": {
|
|
91
|
+
"@biomejs/biome": "2.6.3",
|
|
92
|
+
"@types/bun": "1.4.4",
|
|
93
|
+
"gltf-validator": "2.0.0-dev.3.10",
|
|
94
|
+
"lefthook": "2.2.2",
|
|
95
|
+
"typescript": "7.0.2"
|
|
96
|
+
},
|
|
97
|
+
"trustedDependencies": [],
|
|
98
|
+
"engines": {
|
|
99
|
+
"bun": ">=1.4.4",
|
|
100
|
+
"node": ">=22"
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# recipes/ — one folder per asset
|
|
2
|
+
|
|
3
|
+
Each asset is a folder: `recipes/<name>/<name>.ts` (the recipe), `recipes/<name>/README.md` (this dossier)
|
|
4
|
+
and `recipes/<name>/out/<asset>/` (hero.png, sheet.png, manifest.json — committed, refreshed by
|
|
5
|
+
`bun run shots`, checked by the recipes gate). The dossier is `recipes/<name>/README.md`. The agent writes it BEFORE the recipe; the recipe's
|
|
6
|
+
`sources` and `real.measures` are copied from it, and the `measures` gate proves the model matches.
|
|
7
|
+
Photos are linked, never committed (licences); downloads go to `tmp/refs/<name>/` (gitignored).
|
|
8
|
+
|
|
9
|
+
## Template
|
|
10
|
+
|
|
11
|
+
```md
|
|
12
|
+
# <Name> — <variant / year>
|
|
13
|
+
|
|
14
|
+
## Identity
|
|
15
|
+
Variant chosen and why (one line). What makes it THIS object: the 3–5 signature features.
|
|
16
|
+
|
|
17
|
+
## Specs
|
|
18
|
+
| Dimension | Value (m) | Source |
|
|
19
|
+
|---|---|---|
|
|
20
|
+
| overall length | 6.316 | <url> |
|
|
21
|
+
| width | 3.56 | <url> |
|
|
22
|
+
| height | 3.00 | <url> |
|
|
23
|
+
| road wheel diameter | 0.80 | <url> |
|
|
24
|
+
|
|
25
|
+
## Photos (by view)
|
|
26
|
+
| View | URL | Notes |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| side elevation | <url> | scale reference: wheel diameter |
|
|
29
|
+
| front 3/4 | <url> | |
|
|
30
|
+
| top | <url> | |
|
|
31
|
+
| detail: <thing> | <url> | |
|
|
32
|
+
|
|
33
|
+
## Parts the engine needs
|
|
34
|
+
`turret` (yaw), `gun` (pitch), `road_wheel_*` (spin) …
|
|
35
|
+
|
|
36
|
+
## Open questions
|
|
37
|
+
What the sources disagree on, and which value was chosen.
|
|
38
|
+
```
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Mineable asteroid (`asteroid`, `asteroid_b`, `asteroid_c`)
|
|
2
|
+
|
|
3
|
+
## Identity
|
|
4
|
+
A ~10 m rubble-pile asteroid for a mining game, in three seeded variants: `asteroid` (seed 1,
|
|
5
|
+
5.0 × 3.8 × 3.0 m radii), `asteroid_b` (seed 2, rounder) and `asteroid_c` (seed 3, an elongated
|
|
6
|
+
shard). The rocks are original and procedural.
|
|
7
|
+
|
|
8
|
+
Signature features: a lumpy mass chipped by flat fracture planes; impact craters with raised rims
|
|
9
|
+
and dark floors; very dark carbonaceous rock with lighter dust on up-facing slopes; thin metallic
|
|
10
|
+
ore veins; glowing teal crystal clusters at the mining points.
|
|
11
|
+
|
|
12
|
+
## References
|
|
13
|
+
| Fact | Value | Source |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| C-type (carbonaceous) albedo | 0.03–0.09, ~75 % of asteroids, very dark | https://starlust.org/what-are-the-different-types-of-asteroids |
|
|
16
|
+
| S-type (silicate) albedo | 0.10–0.22 | same |
|
|
17
|
+
| M-type (metallic, nickel-iron) | bright, metallic, the mining target | https://www.esa.int/Science_Exploration/Space_Science/Rosetta/Debris_of_the_Solar_System_Asteroids |
|
|
18
|
+
|
|
19
|
+
The base rock (`#3b3632`/`#4f4841`) is C-type dark. The ore veins (`#b78a45`) stand in for
|
|
20
|
+
M-type metal. The glowing crystals (`#3fe0d0`) are a game convention, not science.
|
|
21
|
+
|
|
22
|
+
## How it is built
|
|
23
|
+
`sdf({ field, resolution: ctx.pick([0.17, 0.38, 0.95]) })` over one field:
|
|
24
|
+
1. An ellipsoid core plus three smooth-unioned ellipsoid lobes.
|
|
25
|
+
2. `valueNoise` displacement: 0.65 m at a 2.8 m feature size, plus 0.12 m pitting at 0.8 m.
|
|
26
|
+
3. Twelve fracture half-spaces, smooth-max'd (k = 0.12 m), which give the angular facets.
|
|
27
|
+
4. Nine craters. Each is a radial rim bump that displaces the surface, then a smooth-subtracted
|
|
28
|
+
bowl sphere. All shape draws come from `ctx.rng.fork('shape')`, so the shape is identical at
|
|
29
|
+
every LOD.
|
|
30
|
+
5. Colour per vertex: blended tone noise, dust where n·z > 0.55, ore veins where |noise| < 0.05
|
|
31
|
+
(teal near crystals), dark crater floors.
|
|
32
|
+
6. `bakeAo` (16 / 8 rays at LOD0 / LOD1) for crevice darkening.
|
|
33
|
+
|
|
34
|
+
The bottom is clipped flat at z = 0 by the SDF bounds, so the rock rests on the ground (or in a
|
|
35
|
+
field). The core sits below every variant's z radius, so the clip always happens.
|
|
36
|
+
|
|
37
|
+
## Parts the engine needs
|
|
38
|
+
`rock` (the mass; also usable as a collider at LOD2), `ore_crystals` (glow), interact sockets
|
|
39
|
+
`mine_point_0…3` (at each cluster, facing into the rock, `data: { resource, yield }`), emitter
|
|
40
|
+
`dust` (`event`, for mining debris).
|
|
41
|
+
|
|
42
|
+
## Open questions
|
|
43
|
+
- `real` is not declared: the size of a procedural rock is a design choice, not a spec, and the
|
|
44
|
+
noise moves its extents by ±10 %. The budget is measured per seed instead.
|
|
45
|
+
- No in-library "surface point along a ray" helper exists, so the recipe bisects its own field to
|
|
46
|
+
seat the crystals. A `sdfSurface(field, from, dir)` helper would make this reusable.
|