@volter/game-editor 0.5.65
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/BUNDLED_NOTICES +11228 -0
- package/LICENSE +686 -0
- package/LICENSE-BLENDER +1409 -0
- package/LICENSE-MCP +21 -0
- package/NOTICE +21 -0
- package/catalog/entries/audio.json +14 -0
- package/catalog/entries/bake.json +36 -0
- package/catalog/entries/blender.json +17 -0
- package/catalog/entries/react-root.json +24 -0
- package/catalog/entries/reflections.json +29 -0
- package/catalog/entries/static-batch.json +25 -0
- package/catalog/project-source/LICENSE +37 -0
- package/catalog/project-source/src/contributions/bake.kind.ts +40 -0
- package/catalog/project-source/src/contributions/builder-document.tsx +65 -0
- package/catalog/project-source/src/contributions/builder-state.ts +27 -0
- package/catalog/project-source/src/contributions/builder-ui.tsx +61 -0
- package/catalog/project-source/src/contributions/module-source.ts +502 -0
- package/catalog/project-source/src/contributions/pages.finder.ts +61 -0
- package/catalog/project-source/src/lib/audio/sfx.ts +255 -0
- package/catalog/project-source/src/lib/bake/asset-seed.ts +128 -0
- package/catalog/project-source/src/lib/bake/bake-schema.ts +65 -0
- package/catalog/project-source/src/lib/bake/clip-layering.ts +203 -0
- package/catalog/project-source/src/lib/bake/gltf-bake.ts +657 -0
- package/catalog/project-source/src/lib/bake/mesh-slice.ts +157 -0
- package/catalog/project-source/src/lib/bake/node-image.ts +463 -0
- package/catalog/project-source/src/lib/bake/object3d-bake.ts +121 -0
- package/catalog/project-source/src/lib/bake/object3d-lifecycle.ts +15 -0
- package/catalog/project-source/src/lib/bake/object3d-source.ts +8 -0
- package/catalog/project-source/src/lib/bake/params.ts +75 -0
- package/catalog/project-source/src/lib/bake/rest-relative-animation.ts +217 -0
- package/catalog/project-source/src/lib/bake/use-model.ts +95 -0
- package/catalog/project-source/src/lib/react-root/index.ts +20 -0
- package/catalog/project-source/src/lib/react-root/react-root-adapter.tsx +57 -0
- package/catalog/project-source/src/lib/reflections/ReflectionProbe.tsx +201 -0
- package/catalog/project-source/src/lib/reflections/index.ts +19 -0
- package/catalog/project-source/src/lib/reflections/probe-controller.ts +75 -0
- package/catalog/project-source/src/lib/reflections/reflection-probe-registry.ts +402 -0
- package/catalog/project-source/src/lib/reflections/volume-reflection-material.ts +416 -0
- package/catalog/project-source/src/lib/static-batch/Frozen.tsx +91 -0
- package/catalog/project-source/src/lib/static-batch/freeze.ts +579 -0
- package/catalog/project-source/src/lib/static-batch/index.ts +44 -0
- package/catalog/project-source/src/lib/static-batch/mutation-watch.ts +149 -0
- package/catalog/project-source/src/lib/static-batch/shadow-cache.ts +171 -0
- package/catalog/project-source/src/tools/bake-module.tool.ts +139 -0
- package/catalog/project-source/src/tools/bake-preview.tool.ts +475 -0
- package/dist/.vite/manifest.json +8304 -0
- package/dist/assets/AssetBudgetPanel-J9--TZPU.js +23 -0
- package/dist/assets/AudioViewer-CR7333fe.js +1 -0
- package/dist/assets/BVHLoader-6bQIXhMX.js +1 -0
- package/dist/assets/BufferGeometryUtils-Nz37EVXf.js +1 -0
- package/dist/assets/CCDIKSolver-CD7vLpsK.js +1 -0
- package/dist/assets/CSS3DRenderer-CL7ABLVK.js +1 -0
- package/dist/assets/CanvasSceneViewport-Bpi6gVTC.js +1 -0
- package/dist/assets/ColladaLoader-aVOPIsCh.js +3 -0
- package/dist/assets/ColorInput-DQBNrW-K.js +1 -0
- package/dist/assets/ConvexGeometry-CAzXlPVG.js +1 -0
- package/dist/assets/ConvexHull-BINCESFp.js +1 -0
- package/dist/assets/CopyShader-BzTUYzf6.js +24 -0
- package/dist/assets/DecalGeometry-160KRdfg.js +1 -0
- package/dist/assets/EXRLoader-Cdans_oJ.js +1 -0
- package/dist/assets/EffectComposer-DQxfsXBZ.js +1 -0
- package/dist/assets/EntityModelDocument-Ccvw66N9.js +1 -0
- package/dist/assets/EnvironmentAssetDocument-Dg-Qq6O6.js +1 -0
- package/dist/assets/FBXLoader-B4MoUtAn.js +1 -0
- package/dist/assets/Fbo-Dz-Soul3.js +1 -0
- package/dist/assets/FontLoader-CvGoVI5a.js +2 -0
- package/dist/assets/GLTFExporter-HgrCle4L.js +1 -0
- package/dist/assets/GameplaySessionTimeline-B52W3FVZ.js +1 -0
- package/dist/assets/Gltf-UHVWKz65.js +2 -0
- package/dist/assets/HDRLoader-THU88oVD.js +5 -0
- package/dist/assets/ImageViewer-Tn7s_MnW.js +1 -0
- package/dist/assets/InspectorCanvasPreview-CEr_Kxna.js +1 -0
- package/dist/assets/InspectorObjectPreview-CVejvLRg.js +1 -0
- package/dist/assets/JsonAssetDocument-C7VGcLhu.js +3 -0
- package/dist/assets/LineSegments2-CsOpKSiM.js +370 -0
- package/dist/assets/MTLLoader-_Xzd4_0p.js +2 -0
- package/dist/assets/MarchingCubes-Bsp4wrzd.js +1 -0
- package/dist/assets/MeshBVH-BiDHDcu-.js +1 -0
- package/dist/assets/ModelAssetDocument-F5GACirk.js +1 -0
- package/dist/assets/NonThreeAuthoringBootstrap-C3woOMxX.js +1 -0
- package/dist/assets/OBJLoader-BhIC6Hwo.js +5 -0
- package/dist/assets/Object3DDocumentViewport-DB7T0NTl.js +2 -0
- package/dist/assets/Object3DPreview-DL8oi7Xs.js +2 -0
- package/dist/assets/OnlineAssetDetail-C6z9RvYK.js +2 -0
- package/dist/assets/OrbitControls-CM3bPray.js +1 -0
- package/dist/assets/OrbitControls-DLpayAaK.js +1 -0
- package/dist/assets/OrthographicCamera-bQozawrh.js +1 -0
- package/dist/assets/PLYLoader-DYQqs5Ik.js +2 -0
- package/dist/assets/PerspectiveCamera-CQ2lh01o.js +1 -0
- package/dist/assets/PlayBar-BR-Vg3Jb.js +2 -0
- package/dist/assets/RGBELoader-BgBcQv8j.js +1 -0
- package/dist/assets/RectAreaLightUniformsLib-CMMoWfll.js +1 -0
- package/dist/assets/RenderPass-DPrn-Uky.js +1 -0
- package/dist/assets/ResolutionPicker-C67vs1F3.js +1 -0
- package/dist/assets/RootSelectionOverlay-BZPlxmXU.js +1 -0
- package/dist/assets/RoundedBox-BDGBg6QZ.js +1 -0
- package/dist/assets/RoundedBoxGeometry-CyUuYPfW.js +1 -0
- package/dist/assets/STLLoader-Dyv3lsxY.js +1 -0
- package/dist/assets/SelectionBox-D_75KrNW.js +1 -0
- package/dist/assets/ShaderPass-QYRpPuFJ.js +1 -0
- package/dist/assets/ShadowEditor-DkImwu1Y.js +1 -0
- package/dist/assets/SimplifyModifier-C8ayvRzd.js +1 -0
- package/dist/assets/SkeletonUtils-Cps8GOC6.js +1 -0
- package/dist/assets/Sky-CQKCgYDs.js +154 -0
- package/dist/assets/SourceAssetViewer-2SWQoUut.js +12 -0
- package/dist/assets/StageHost-BN-IoTef.js +2 -0
- package/dist/assets/StoryPreviewMount-DjyxRCXu.js +1 -0
- package/dist/assets/TDSLoader-D_T8XJ81.js +1 -0
- package/dist/assets/TextGeometry-DOWAEUV0.js +1 -0
- package/dist/assets/ThreeBoardDocument-CVncZyIq.js +2 -0
- package/dist/assets/ThreeIsolationSceneContent-C8C8whSF.js +1 -0
- package/dist/assets/ToolObject3DPreview-BRoDWe4Q.js +1 -0
- package/dist/assets/TrackballControls-DfznuQTh.js +1 -0
- package/dist/assets/TransientHint-BB1fwrvK.js +1 -0
- package/dist/assets/UnrealBloomPass-CR-cS_K5.js +83 -0
- package/dist/assets/VideoViewer-C6kocgIU.js +1 -0
- package/dist/assets/_commonjsHelpers-D6-XlEtG.js +1 -0
- package/dist/assets/active-ingest-CT6jSGhr.js +3 -0
- package/dist/assets/adapter-surface-Y37Nzcyw.js +1 -0
- package/dist/assets/after-paint-CB4bz1-e.js +1 -0
- package/dist/assets/agx-base-srgb-BjWZJgrZ.lut +0 -0
- package/dist/assets/agx-look-medium-high-contrast-D5F_ob1L.lut +0 -0
- package/dist/assets/agx-look-punchy-dxsnycNs.lut +0 -0
- package/dist/assets/animation-clock-CnjZqfJp.js +1 -0
- package/dist/assets/asset-budget-asset.menu-Di3KiQCd.js +1 -0
- package/dist/assets/asset-budget.action-DCzzcuTh.js +1 -0
- package/dist/assets/asset-budget.document-BWU8wnVW.js +1 -0
- package/dist/assets/asset-budget.menu-BGZpT_31.js +1 -0
- package/dist/assets/asset-editor-persistence-BBaONOJt.js +1 -0
- package/dist/assets/asset-loaders-BOy5Ss8k.js +2 -0
- package/dist/assets/asset-parse-error-BHMwBRU3.js +3 -0
- package/dist/assets/assets-BuSoGjBX.js +1 -0
- package/dist/assets/audio-meter-CyiToeUW.js +1 -0
- package/dist/assets/audio-unlock.service-CfUgUQVy.js +1 -0
- package/dist/assets/audio.utility-C6K6jem8.js +1 -0
- package/dist/assets/authoring-CgcOFhGS.js +1 -0
- package/dist/assets/autoplay.service-BZBGNSvt.js +1 -0
- package/dist/assets/axe-LkjAB6Lv.js +30 -0
- package/dist/assets/babylon-authoring-adapter-CL02gWDn.js +1 -0
- package/dist/assets/binding-Bmxqznjk.js +1 -0
- package/dist/assets/binding-identity-DcTpbvyg.js +1 -0
- package/dist/assets/binding-resolver-Dsh-6Vor.js +2 -0
- package/dist/assets/blender-emscripten-engine-9ZIRYNhe.js +2 -0
- package/dist/assets/blender-node-editor.document-iIDkB9sI.js +1 -0
- package/dist/assets/blender-properties-tab-C5CyPydi.js +3 -0
- package/dist/assets/blender-runtime-host-BpBwGv7r.js +4 -0
- package/dist/assets/blender-runtime-skin-DyQ9B6CR.js +7140 -0
- package/dist/assets/blender-runtime.document-lIYhhPtv.js +8 -0
- package/dist/assets/blender-timeline.document-77fx96N7.js +1 -0
- package/dist/assets/blender-uv-editor.document-fsT7B4gV.js +1 -0
- package/dist/assets/blender-version.status-o6dBm3n6.js +1 -0
- package/dist/assets/blender-wali-engine-wTOcrOMC.js +2 -0
- package/dist/assets/blender.command-BtJeWk-A.js +1 -0
- package/dist/assets/blender.keymap-GAQgeklK.js +1 -0
- package/dist/assets/blender.status-ujwGU6dU.js +1 -0
- package/dist/assets/blender.style-Dcem5f_T.js +1 -0
- package/dist/assets/board-guides-DziKSTss.js +1 -0
- package/dist/assets/body-marks-h_xDxiDE.js +1 -0
- package/dist/assets/bridge.command-o5gDNEwa.js +3 -0
- package/dist/assets/browserAll-DeWblVez.js +1 -0
- package/dist/assets/build-profiles.document-kW8iw8Xj.js +2 -0
- package/dist/assets/build-progress.status-BNRLytg2.js +1 -0
- package/dist/assets/build-session-C_sg3CEn.js +9 -0
- package/dist/assets/build.action-lYjTLb7K.js +1 -0
- package/dist/assets/build.command-DIGgUPU_.js +1 -0
- package/dist/assets/build.header-CKajx5U3.js +1 -0
- package/dist/assets/build.menu-BdU0QXny.js +1 -0
- package/dist/assets/build.service-CbBAyeu3.js +1 -0
- package/dist/assets/bus-mixer-CGfWDP3C.js +1 -0
- package/dist/assets/camera-KEsKvOL7.js +1 -0
- package/dist/assets/camera-runtime.inspector-B7unX4g1.js +1 -0
- package/dist/assets/canvas-entry-runtime-SfBxaR9M.js +2 -0
- package/dist/assets/capability-coverage-Czas4C18.js +7 -0
- package/dist/assets/chrome-trace-YZHMz60-.js +1 -0
- package/dist/assets/client-DNXj_opT.js +25 -0
- package/dist/assets/clip-planes-CnAI6DZn.js +1 -0
- package/dist/assets/collaboration-presence-DLoZ7EA3.js +1 -0
- package/dist/assets/collider-Bw0mXlsW.js +1 -0
- package/dist/assets/collider-dimensions-9xoFADXN.js +1 -0
- package/dist/assets/collision-system-DpNUJRJ3.js +1 -0
- package/dist/assets/command-results-CUQD49AB.js +1 -0
- package/dist/assets/component-board-registry-DrIa2csL.js +1 -0
- package/dist/assets/component-board.service-DCwcUssB.js +2 -0
- package/dist/assets/component-board.service-DidCyM4O.js +2 -0
- package/dist/assets/component-verbs.command-7xzfjGMZ.js +1 -0
- package/dist/assets/component-verbs.service-Bv9jId3q.js +1 -0
- package/dist/assets/config-CEZk921y.js +6 -0
- package/dist/assets/configurations-DTBMdaTL.js +1 -0
- package/dist/assets/connection.status-BifnQdOs.js +1 -0
- package/dist/assets/console-bridge-CHcb-xk5.js +1 -0
- package/dist/assets/constraint-De8f1Uiq.js +1 -0
- package/dist/assets/constraints.inspector-B9U9Yj-u.js +1 -0
- package/dist/assets/countdown-timer-CUm74dom.js +1 -0
- package/dist/assets/coverage.service-VTX5Mcsx.js +3 -0
- package/dist/assets/crash-null-boundary-v3a0uEgw.js +1 -0
- package/dist/assets/create-runtime-CVCc1BDx.js +1 -0
- package/dist/assets/curve-7Q79VgU4.js +1 -0
- package/dist/assets/data-asset-4hjS642k.js +5 -0
- package/dist/assets/data-check-core-CQEjuFyt.js +1 -0
- package/dist/assets/data-ref-CQI28C0D.js +1 -0
- package/dist/assets/debug-bridge-CCohG-d-.js +1 -0
- package/dist/assets/debug-registry-Dgvitx8M.js +1 -0
- package/dist/assets/defaults-DKiBJCPN.js +1 -0
- package/dist/assets/deferred-commands-CEMmvL47.js +1 -0
- package/dist/assets/deferred-ingest-play-DCJi_Pgu.js +2 -0
- package/dist/assets/design-time-layers-wYgOTgni.js +1 -0
- package/dist/assets/design-time-mount-registry-DUpXCg1U.js +1 -0
- package/dist/assets/design-time-mount.service-BzY21e1F.js +2 -0
- package/dist/assets/design-time-react-mount-DM9WLrF2.js +1 -0
- package/dist/assets/dev-build-gDYrq68M.js +1 -0
- package/dist/assets/directional-shadow-fit-BVkOKAv2.js +1 -0
- package/dist/assets/document-preview-three-Kbg2GCLm.js +1 -0
- package/dist/assets/dom-authoring-adapter-CY8C7f4T.js +1 -0
- package/dist/assets/draco3d-BBUTcNkz.js +1 -0
- package/dist/assets/draco_decoder-DsQ12WqX.wasm +0 -0
- package/dist/assets/draco_encoder-2Tcju8Ns.wasm +0 -0
- package/dist/assets/edit-mode-audio.service-Bzetwd5B.js +1 -0
- package/dist/assets/edit-mode-authoring-B47TfLqu.js +1 -0
- package/dist/assets/edit-mode-networking.service-YCX6RRb_.js +1 -0
- package/dist/assets/editor-api-BoJIcyZG.js +1 -0
- package/dist/assets/editor-port-C_FeBdeV.js +1 -0
- package/dist/assets/editor-presentation-activity-C7SNSmTd.js +1 -0
- package/dist/assets/entry-adjudication-Cq8Yeb74.js +1 -0
- package/dist/assets/environment-capture-7himRh2L.js +1 -0
- package/dist/assets/esbuild-BHljloGq.wasm +0 -0
- package/dist/assets/events-156d8d12.esm-ErOhDXXB.js +36 -0
- package/dist/assets/extend-B-eOccUm.js +36 -0
- package/dist/assets/extends-CF3RwP-h.js +1 -0
- package/dist/assets/eyedropper-session-bjPXnfeX.js +1 -0
- package/dist/assets/fflate.module-DPuTF8aG.js +6 -0
- package/dist/assets/filmic-srgb-Ct35FIH6.lut +0 -0
- package/dist/assets/first-party-audio-system-DxnGJOER.js +1 -0
- package/dist/assets/first-party-navigation-system-CL5Bquub.js +1 -0
- package/dist/assets/fork-menu-BoVyw2Wu.js +1 -0
- package/dist/assets/frame-debugger-store-D1Mf_5up.js +1 -0
- package/dist/assets/frame-delta-D2nsw_Ht.js +1 -0
- package/dist/assets/frame-pacing-D5acoOzO.js +1 -0
- package/dist/assets/frame-selector-cache-cCeUbcjG.js +1 -0
- package/dist/assets/game-DHOZVb-7.js +1 -0
- package/dist/assets/game-contract-seams-a5YXejOu.js +1 -0
- package/dist/assets/game-css-scope-transform-Eng4wS8E.js +33 -0
- package/dist/assets/game-document.service-DbRfx2V0.js +1 -0
- package/dist/assets/game-eval.command-D-7Dxbj_.js +2 -0
- package/dist/assets/game-input-seams-CIQdetRw.js +1 -0
- package/dist/assets/game-loop-CZvXlY00.js +1 -0
- package/dist/assets/game-module-access-B2mFxv-i.js +1 -0
- package/dist/assets/game.layout-CBASrvQu.js +1 -0
- package/dist/assets/gameplay-export-BoKXm51x.js +1 -0
- package/dist/assets/gameplay-replay-e5umMlXv.js +1 -0
- package/dist/assets/gameplay-rng-trap-CTNhm-UW.js +3 -0
- package/dist/assets/gameplay.command-DxcVYX6F.js +1 -0
- package/dist/assets/generation-DhwCUHPf.css +1 -0
- package/dist/assets/generation-jobs-BQrXbGp_.js +1 -0
- package/dist/assets/generation.service-CDIgObuw.js +1 -0
- package/dist/assets/generations-DzUogZsM.js +1 -0
- package/dist/assets/generations.status-CgOUBCum.js +1 -0
- package/dist/assets/hierarchy-marks-BLPfSIym.js +1 -0
- package/dist/assets/host-pointer-DbGSCjE9.js +1 -0
- package/dist/assets/hosted-asset-materialization-CiIvWkGU.js +2 -0
- package/dist/assets/ibl-override-material-BlmCxFKq.js +6 -0
- package/dist/assets/index-96FBF1Oj.js +1 -0
- package/dist/assets/index-BAWkB0dv.js +1 -0
- package/dist/assets/index-BDnS2b6S.js +1 -0
- package/dist/assets/index-BHp07vN0.js +2 -0
- package/dist/assets/index-BMxv2MNV.js +1 -0
- package/dist/assets/index-BP6wv2A0.js +5 -0
- package/dist/assets/index-BcCBqgM_.js +952 -0
- package/dist/assets/index-Bge9JUr6.js +1 -0
- package/dist/assets/index-BjTCPEQ7.js +134 -0
- package/dist/assets/index-BncK9THk.js +1 -0
- package/dist/assets/index-CJbYy-CF.js +3 -0
- package/dist/assets/index-CVCb_ImQ.js +1 -0
- package/dist/assets/index-CZd9o7Lu.js +1 -0
- package/dist/assets/index-CanA16PU.js +2 -0
- package/dist/assets/index-CinJrH5C.js +9 -0
- package/dist/assets/index-CtzuWnCS.js +1 -0
- package/dist/assets/index-D2fNXpHa.css +1 -0
- package/dist/assets/index-DUpHH6JR.js +3120 -0
- package/dist/assets/index-DUqP1RMl.js +1 -0
- package/dist/assets/index-D_NuPfjr.js +9 -0
- package/dist/assets/index-Da9JhEvW.js +25 -0
- package/dist/assets/index-DgapqSPi.js +7 -0
- package/dist/assets/index-FUuS4qwW.js +562 -0
- package/dist/assets/index-GIL7oGEO.js +4894 -0
- package/dist/assets/index-IEjydI9d.js +1 -0
- package/dist/assets/index-OrYXPk3Z.js +487 -0
- package/dist/assets/index-V1R-e5Bd.js +1 -0
- package/dist/assets/index-bQE2NA0D.js +1 -0
- package/dist/assets/index-gHZae-lw.js +13 -0
- package/dist/assets/index-mjWQmGhM.js +1 -0
- package/dist/assets/index-nmcBqr7Y.js +1 -0
- package/dist/assets/inference-diagnostics-Dhmtfbq_.js +1 -0
- package/dist/assets/ingest-BbYMC2vQ.js +1 -0
- package/dist/assets/ingest-boot-viewport-D5rI_Kk_.js +1 -0
- package/dist/assets/ingest-siblings-Bop2kqVl.js +1 -0
- package/dist/assets/ingest-source-persistence-C_6Hiyra.js +1 -0
- package/dist/assets/ingest.service-BTDnQfM1.js +1 -0
- package/dist/assets/input-manager-DH_hGW6d.js +1 -0
- package/dist/assets/input-router-BNQvtIqw.js +1 -0
- package/dist/assets/inspect-BZfi3mmo.js +1 -0
- package/dist/assets/inspection-CObLhnrs.js +1 -0
- package/dist/assets/instance-fork-actions-D3sRzS3K.js +1 -0
- package/dist/assets/instances.command-D6UkZNO8.js +1 -0
- package/dist/assets/instruments-CKR02Y8I.js +1 -0
- package/dist/assets/json-history-resource-BbxllWfV.js +1 -0
- package/dist/assets/jsx-runtime-DPjLkJKQ.js +9 -0
- package/dist/assets/light-D-_wsKTq.js +1 -0
- package/dist/assets/light-camera-factory-CWbbe9gI.js +1 -0
- package/dist/assets/lil-gui.module.min-BF55BEwA.js +10 -0
- package/dist/assets/live-behaviors-Bxq49Maz.js +1 -0
- package/dist/assets/live-gesture-lock-DJbrjOqf.js +1 -0
- package/dist/assets/loader-CaF_I7Yt.js +1 -0
- package/dist/assets/logger-Dqis-7W1.js +1 -0
- package/dist/assets/loop-gate-report-N52EWFGD.js +1 -0
- package/dist/assets/matcap-texture-CVfalpWT.js +1 -0
- package/dist/assets/material-CpAdjDxn.js +1 -0
- package/dist/assets/material-factory-Bz6h__6g.js +1 -0
- package/dist/assets/mesh-B3WPtNKO.js +1 -0
- package/dist/assets/mesh-shadow-CZnXrw_l.js +1 -0
- package/dist/assets/mikktspace.module-DO88SLib.js +1 -0
- package/dist/assets/model-asset-sections-CFvvihfx.css +1 -0
- package/dist/assets/model-asset-sections.service-CHhFS3ZX.js +1 -0
- package/dist/assets/model.layout-BJUEQYUI.js +1 -0
- package/dist/assets/models.finder-G2jQgIRu.js +1 -0
- package/dist/assets/module-mode-DVBLT9d-.js +2 -0
- package/dist/assets/mount-canvas-ingest-root-DDuAWf_C.js +2 -0
- package/dist/assets/mount-dom-ingest-root-D_EiBgpn.js +2 -0
- package/dist/assets/mount-game-6t9cKNo4.js +1 -0
- package/dist/assets/mount-ingest-root-glv2SSWf.js +2 -0
- package/dist/assets/mount-manifest-CGVxhmAw.js +1 -0
- package/dist/assets/mount-readiness-Ds0HvvLH.js +4 -0
- package/dist/assets/mount-three-ingest-root-hrUt9VVU.js +1 -0
- package/dist/assets/mounted-authoring-Dmg5xmhP.js +1 -0
- package/dist/assets/mounted-story-viewport-source-DjP6RA9U.js +1 -0
- package/dist/assets/native-debug-module-CWicoSGD.js +1 -0
- package/dist/assets/native-entry-surface-BE8LJNdu.js +1 -0
- package/dist/assets/navigation-CIiCx-SM.js +1 -0
- package/dist/assets/navmesh-workflow-store-Cmnm57TB.js +1 -0
- package/dist/assets/navmesh.menu-CAKiH8PW.js +1 -0
- package/dist/assets/navmesh.service-jgDWlgj1.js +1 -0
- package/dist/assets/network.utility-CEu5nHf7.js +1 -0
- package/dist/assets/object-marks-DwvIEBOK.js +1 -0
- package/dist/assets/object3d-authoring-subject-CH5sI2oP.js +1 -0
- package/dist/assets/output-DK8waum9.js +195 -0
- package/dist/assets/particles-Y626p22p.js +1 -0
- package/dist/assets/particles-factory-DnLOHXT8.js +1 -0
- package/dist/assets/pasteboard-materialize-BqSS4QzV.js +20 -0
- package/dist/assets/pasteboard.action-DU3UHtJG.js +2 -0
- package/dist/assets/performance-profiler-D_Jey87L.js +1 -0
- package/dist/assets/physics-registry-B2Jkp8e6.js +1 -0
- package/dist/assets/physics-registry-CUB9cT9p.js +1 -0
- package/dist/assets/pixi-authoring-adapter-CjibysC3.js +1 -0
- package/dist/assets/pixi-live-write-target-DuWydlWb.js +1 -0
- package/dist/assets/pixi-primitive-DlWbUPN9.js +1 -0
- package/dist/assets/pixi-react-root-factory-DYsznYRQ.js +1 -0
- package/dist/assets/pixi-story-model-DNkfnWUV.js +1 -0
- package/dist/assets/pixi-transform-channels-VjdohT11.js +1 -0
- package/dist/assets/play-mode-BFU2PCkG.js +22 -0
- package/dist/assets/play.command-BpqqLqkq.js +2 -0
- package/dist/assets/playtest-BXIL1JEF.js +1 -0
- package/dist/assets/pose-guard-6Osb2cFu.js +1 -0
- package/dist/assets/presentation-BPP5pXeQ.js +1 -0
- package/dist/assets/product-DFhyARJj.js +1 -0
- package/dist/assets/profiler.action-CaXJDp3t.js +1 -0
- package/dist/assets/profiler.menu-BIMF6Bi4.js +1 -0
- package/dist/assets/profiler.utility-BExw9wBO.js +1 -0
- package/dist/assets/project-authoring-session-Bnt6icLr.js +2 -0
- package/dist/assets/project-provenance-BoP3nrle.js +1 -0
- package/dist/assets/prompt-labels-DSMdM2_B.js +1 -0
- package/dist/assets/properties-bone-constraints.inspector-ByT6p7S-.js +1 -0
- package/dist/assets/properties-bone.inspector-z4qJwKO5.js +1 -0
- package/dist/assets/properties-collection.inspector-D0_3ijWU.js +1 -0
- package/dist/assets/properties-constraints.inspector-CESzjuls.js +1 -0
- package/dist/assets/properties-data.inspector-hG8Wgyzb.js +1 -0
- package/dist/assets/properties-material.inspector-CzY0JCQ6.js +1 -0
- package/dist/assets/properties-modifiers.inspector-3dDhwf7g.js +1 -0
- package/dist/assets/properties-object.inspector-CiarfxkT.js +1 -0
- package/dist/assets/properties-output.inspector-DKJxmKSD.js +1 -0
- package/dist/assets/properties-particles.inspector-CCEdYWGm.js +1 -0
- package/dist/assets/properties-physics.inspector-B2c0KUyA.js +1 -0
- package/dist/assets/properties-render.inspector-Bcm0HLRW.js +1 -0
- package/dist/assets/properties-scene.inspector-PIM_eTb_.js +1 -0
- package/dist/assets/properties-texture.inspector-CgFlnyr8.js +1 -0
- package/dist/assets/properties-view-layer.inspector-DGjF_Aqo.js +1 -0
- package/dist/assets/properties-world.inspector-CrMvaRvB.js +1 -0
- package/dist/assets/r3f-design-session-D-4yyDO9.js +2 -0
- package/dist/assets/r3f-physics-binding-BBo8oma9.js +1 -0
- package/dist/assets/r3f-root-factory-z9llD1OU.js +1 -0
- package/dist/assets/r3f-source-authoring-adapter-w6Bc60K-.js +13 -0
- package/dist/assets/rapier-physics-adapter-CaZqWLu0.js +1 -0
- package/dist/assets/rapier-physics-bridge-CMoeVo3Y.js +1 -0
- package/dist/assets/react-18-By2b4xR9.js +1 -0
- package/dist/assets/react-inspector.service-B_neRnSK.js +1 -0
- package/dist/assets/react-root-CEz5NTck.js +1 -0
- package/dist/assets/react-story-board-BDDwiE2H.js +1 -0
- package/dist/assets/react-three-fiber.esm-CycrbDlA.js +1 -0
- package/dist/assets/react-three-rapier.esm-CEfKpvxT.js +1 -0
- package/dist/assets/react-world-authoring-adapter-DmrwM3py.js +1 -0
- package/dist/assets/realm-services-CobQsq_X.js +1 -0
- package/dist/assets/rebind-controller-Dtq19Vb3.js +1 -0
- package/dist/assets/recast-navigation.wasm-compat-Dsoa_MD-.js +1 -0
- package/dist/assets/reflection-probe-Don-M3Fj.js +1 -0
- package/dist/assets/reflection-probe-capture.inspector-CmFUoJCx.js +1 -0
- package/dist/assets/register-render-vitals-BiZk29b2.js +1 -0
- package/dist/assets/registry-02YZjMNp.js +1 -0
- package/dist/assets/relative-path-guard-GiM7Lsz8.js +1 -0
- package/dist/assets/render-audio-control-vMRlePWb.js +1 -0
- package/dist/assets/render-batch-system-0vq7p0VC.js +1 -0
- package/dist/assets/render-census-BrQX_CXv.js +1 -0
- package/dist/assets/render-control-Df3yTiyr.js +1 -0
- package/dist/assets/render-env-D2IV2x5k.js +1 -0
- package/dist/assets/render-features-CPQ_e568.js +1 -0
- package/dist/assets/render-seed-DF4JHy7P.js +1 -0
- package/dist/assets/render-settings-Bw4W9SYF.js +1 -0
- package/dist/assets/render-vitals-BZ5HtvMi.js +1 -0
- package/dist/assets/renderer-config-BqG4O8i9.js +1 -0
- package/dist/assets/resolve-three-SZE_WWUM.js +702 -0
- package/dist/assets/root-seam-contract-Z0VWX3Bk.js +1 -0
- package/dist/assets/rrweb-Cd2ifIRP.js +142 -0
- package/dist/assets/run-ticks-settled-C4ksViyA.js +1 -0
- package/dist/assets/runtime-inspection-l2iFQSsg.js +1 -0
- package/dist/assets/scene-capture-BQKzU0NT.js +1 -0
- package/dist/assets/scene-capture-CGYF-Viw.js +1 -0
- package/dist/assets/scene-document.service-qkDjUrlP.js +2 -0
- package/dist/assets/scene-framing-Cat0GtyJ.js +1 -0
- package/dist/assets/scene-index-B6BZOHMk.js +1 -0
- package/dist/assets/scene-query-C7_N-TpI.js +1 -0
- package/dist/assets/schema-kl9-2B_J.js +1 -0
- package/dist/assets/sculpt.layout-zJF55yCR.js +1 -0
- package/dist/assets/seeded-random-i3mtgBKZ.js +1 -0
- package/dist/assets/session-CZ5JPg-z.js +4877 -0
- package/dist/assets/setup-audio-S8GQF91f.js +1 -0
- package/dist/assets/setup-particles-GCXlnkj_.js +1 -0
- package/dist/assets/setup-physics-BeZ7-LKD.js +1 -0
- package/dist/assets/setup-renderer-DVXaSGin.js +1587 -0
- package/dist/assets/shading.layout-DULYZV6M.js +1 -0
- package/dist/assets/sim-clock-CLflx7kg.js +1 -0
- package/dist/assets/sky-precompute-worker-ChN7J87v.js +1 -0
- package/dist/assets/soft-particle-depth-DGvfQDi1.js +1 -0
- package/dist/assets/source-object3d-authoring-adapter-B-L6Ha6f.js +1 -0
- package/dist/assets/source-persistence-backend-C-aR-B_Y.js +1 -0
- package/dist/assets/spark-renderer-lifecycle-ynWESJcv.js +1 -0
- package/dist/assets/spark.module-4pXQoz5d.js +12120 -0
- package/dist/assets/stage-invalidation-DBg3C3Ta.js +1 -0
- package/dist/assets/stage-keyboard-n-5kKH-m.js +1 -0
- package/dist/assets/stage-overlay-set-B9zp2sLB.js +1 -0
- package/dist/assets/stage-presence-markers-DiGI6A45.js +1 -0
- package/dist/assets/standard-viewport-dressing-CzjAe_0A.js +7 -0
- package/dist/assets/state-bridge-DLP1jLRW.js +1 -0
- package/dist/assets/state-watch.action-BOvQR2qt.js +1 -0
- package/dist/assets/state-watch.menu-CNLvDeeY.js +1 -0
- package/dist/assets/state-watch.utility-Bg1tTTQU.js +1 -0
- package/dist/assets/static-batch-advisor-B13QEH7d.js +1 -0
- package/dist/assets/stats.module-BL02l9NC.js +1 -0
- package/dist/assets/story-arg-descriptors-Ek86ExX7.js +1 -0
- package/dist/assets/story-capture-_gC8dXV-.js +1 -0
- package/dist/assets/story-documents--TDLaPeL.js +3 -0
- package/dist/assets/story-documents.service-BiS_YbNQ.js +1 -0
- package/dist/assets/story-documents.service-CxOPYJ2j.js +1 -0
- package/dist/assets/story-media-presence-BHzk2IV5.js +1 -0
- package/dist/assets/story-mount-turn-DFRTj5hi.js +1 -0
- package/dist/assets/story-pixi-preview-BUrOJZXS.js +1 -0
- package/dist/assets/story-presentation-j2AVN-mK.js +1 -0
- package/dist/assets/story-three-preview-BHEDZzcl.js +2 -0
- package/dist/assets/structural-ids-Dc-7rEwi.js +1 -0
- package/dist/assets/structural-signature-0w-i_ats.js +1 -0
- package/dist/assets/surface-content-Dg9Kkazf.js +1 -0
- package/dist/assets/surface-state-DaxyruCj.js +3 -0
- package/dist/assets/system-adapters-rIC8FSGP.js +1 -0
- package/dist/assets/system-runner-DkOjxEBt.js +1 -0
- package/dist/assets/system-slot-E2mEdiih.js +1 -0
- package/dist/assets/team-playtest.service-DqOinFVA.js +1 -0
- package/dist/assets/texture.layout-DASpHVht.js +1 -0
- package/dist/assets/three-CDSueJyJ.js +1 -0
- package/dist/assets/three-authoring-adapter-CmSQ3Vui.js +1 -0
- package/dist/assets/three-authoring.service-iuHLwtf1.js +2 -0
- package/dist/assets/three-ingest-runtime-QzDYk6tU.js +1 -0
- package/dist/assets/three-projection-core-BmKMZ-nf.js +1 -0
- package/dist/assets/three-viewport-presentation-QBQpSdMh.js +1 -0
- package/dist/assets/three.module-D396a9Mn.js +3840 -0
- package/dist/assets/three.quarks.esm-B1C61jGo.js +1039 -0
- package/dist/assets/tools-B_NJsk05.js +1 -0
- package/dist/assets/transform-writer-BhBBTx33.js +1 -0
- package/dist/assets/transport.header-B-6HQlU2.js +1 -0
- package/dist/assets/trigger-volume-BNK2XzPL.js +1 -0
- package/dist/assets/tuples-CIQ4Bn1U.js +1 -0
- package/dist/assets/tween.module-DciWpAG6.js +1 -0
- package/dist/assets/ui-board-document-Bwtt--xp.js +2 -0
- package/dist/assets/unexported-game-trap-Dm1JYKHy.js +2 -0
- package/dist/assets/unmanaged-root-detector-B8CpbkSN.js +2 -0
- package/dist/assets/upstream-pin-BdgRH6ID.js +1 -0
- package/dist/assets/use-data-Dzq-MytE.js +1 -0
- package/dist/assets/use-live-actor-state-DErbWQWF.js +1 -0
- package/dist/assets/use-selection-DbR73-xd.js +1 -0
- package/dist/assets/user-data-BB2Of6Ht.js +1 -0
- package/dist/assets/utility-view-state-BHypxA33.js +1 -0
- package/dist/assets/uv-editing.layout-BEKHxmHw.js +1 -0
- package/dist/assets/vgai-shared-fontawesome-CU65D4Ij.js +1 -0
- package/dist/assets/vgai-shared-jsx-dev-runtime-DFDKL7fx.js +1 -0
- package/dist/assets/vgai-shared-jsx-runtime-DIqBpTut.js +1 -0
- package/dist/assets/vgai-shared-react-BT7rMc2H.js +1 -0
- package/dist/assets/vgai-shared-react-dom-DFajMqMT.js +1 -0
- package/dist/assets/vgai-shared-react-dom-client-S0ozfl6_.js +1 -0
- package/dist/assets/vgai-shared-three-Bc5PvpLM.js +1 -0
- package/dist/assets/viewport-pick-context-DkawXbEi.js +1 -0
- package/dist/assets/viewport-root-presentation-CWsE56K6.js +1 -0
- package/dist/assets/viewport-shading-BuA88e_A.js +1 -0
- package/dist/assets/viewport-shading-boundary-B_-_gABg.js +82 -0
- package/dist/assets/viewport-surface-status-B3om4Kcf.js +1 -0
- package/dist/assets/vision_bundle-DX0dWqEa.js +15 -0
- package/dist/assets/voxel-surface-DtcsSWRL.js +1 -0
- package/dist/assets/wav-encode-D31zWF6O.js +1 -0
- package/dist/assets/webgl-frame-capture-FlF9zQmW.js +1 -0
- package/dist/assets/webgl-gpu-timer-D3YX7RaD.js +1 -0
- package/dist/assets/webworkerAll-CM2o_dnz.js +1 -0
- package/dist/assets/worker-UrMcrc5_.js +2 -0
- package/dist/assets/world-documents-147tiFZe.js +1 -0
- package/dist/assets/world-root-stage-binding-vwTrtBz6.js +1 -0
- package/dist/assets/world-state-BWG-IcOd.js +1 -0
- package/dist/assets/writer-B-KovzkA.js +5 -0
- package/dist/assets/xstate-animation-binding-Brd0NST6.js +1 -0
- package/dist/assets/xstate-animation-meta-Q3u9zh_m.js +1 -0
- package/dist/assets/xstate-behavior.action-B8UluFBK.js +1 -0
- package/dist/assets/xstate-behavior.document-CKAsE45I.js +1 -0
- package/dist/assets/xstate-behavior.inspector-vJJyuifc.js +1 -0
- package/dist/assets/xstate-behavior.menu-BXbPICIh.js +1 -0
- package/dist/assets/xstate-inspection-BsZv8LS9.js +1 -0
- package/dist/vgai-shared-react.json +10 -0
- package/dist/vgai-shared-three.json +3 -0
- package/dist-node/cli.js +9320 -0
- package/dist-node/create.js +3239 -0
- package/package.json +91 -0
- package/presets.mjs +2 -0
- package/src/contributions.d.ts +4 -0
- package/src/index.ts +38 -0
- package/starter/cube.blend +0 -0
- package/starter/cube.py +81 -0
- package/template/.agents/references/project-manual.md +341 -0
- package/template/.agents/skills/editor/SKILL.md +53 -0
- package/template/.agents/skills/editor/agents/openai.yaml +4 -0
- package/template/.agents/skills/editor/references/editor-control.md +363 -0
- package/template/.agents/skills/vgai-3d-models/SKILL.md +64 -0
- package/template/.agents/skills/vgai-ingest-existing-game/SKILL.md +112 -0
- package/template/.agents/skills/vgai-threejs-authoring/SKILL.md +347 -0
- package/template/.agents/skills/vgai-threejs-authoring/agents/openai.yaml +4 -0
- package/template/.agents/skills/vgai-threejs-authoring/references/helper-catalog.md +65 -0
- package/template/.claude/skills/editor/SKILL.md +53 -0
- package/template/.claude/skills/editor/agents/openai.yaml +4 -0
- package/template/.claude/skills/editor/references/editor-control.md +363 -0
- package/template/.claude/skills/vgai-3d-models/SKILL.md +64 -0
- package/template/.claude/skills/vgai-ingest-existing-game/SKILL.md +112 -0
- package/template/.claude/skills/vgai-threejs-authoring/SKILL.md +347 -0
- package/template/.claude/skills/vgai-threejs-authoring/agents/openai.yaml +4 -0
- package/template/.claude/skills/vgai-threejs-authoring/references/helper-catalog.md +65 -0
- package/template/.github/copilot-instructions.md +6 -0
- package/template/.github/skills/editor/SKILL.md +53 -0
- package/template/.github/skills/editor/agents/openai.yaml +4 -0
- package/template/.github/skills/editor/references/editor-control.md +363 -0
- package/template/.github/skills/vgai-3d-models/SKILL.md +64 -0
- package/template/.github/skills/vgai-ingest-existing-game/SKILL.md +112 -0
- package/template/.github/skills/vgai-threejs-authoring/SKILL.md +347 -0
- package/template/.github/skills/vgai-threejs-authoring/agents/openai.yaml +4 -0
- package/template/.github/skills/vgai-threejs-authoring/references/helper-catalog.md +65 -0
- package/template/.mcp.json +12 -0
- package/template/.vgai/assets.json +1 -0
- package/template/.vgai/provenance.json +4 -0
- package/template/.volter/tracker/validation/.preset.base.mts +178 -0
- package/template/.volter/tracker/validation/preset.mts +186 -0
- package/template/.volter/tracker/visualizer/.extension.base.tsx +14 -0
- package/template/.volter/tracker/visualizer/extension.tsx +14 -0
- package/template/.volter/tracker-config.json +17 -0
- package/template/AGENTS.md +176 -0
- package/template/CLAUDE.md +1 -0
- package/template/DEVLOG.md +20 -0
- package/template/IDIOMS.md +118 -0
- package/template/LICENSE +30 -0
- package/template/README.md +83 -0
- package/template/ROADMAP.md +20 -0
- package/template/asset-manifest.json +3 -0
- package/template/check-idioms.ts +1533 -0
- package/template/index.html +18 -0
- package/template/manifest-entry-modules-plugin.ts +53 -0
- package/template/package.json +62 -0
- package/template/public/jsm/libs/basis/basis_transcoder.js +19 -0
- package/template/public/jsm/libs/basis/basis_transcoder.wasm +0 -0
- package/template/public/jsm/libs/draco/gltf/draco_decoder.js +33 -0
- package/template/public/jsm/libs/draco/gltf/draco_decoder.wasm +0 -0
- package/template/public/jsm/libs/draco/gltf/draco_encoder.js +33 -0
- package/template/public/jsm/libs/draco/gltf/draco_wasm_wrapper.js +116 -0
- package/template/public/shaders/daylight-sky.frag.glsl +15 -0
- package/template/public/shaders/daylight-sky.vert.glsl +7 -0
- package/template/scripts/patch-drei-stats-gl.mjs +35 -0
- package/template/server/colyseus-setup.ts +111 -0
- package/template/server/loopback.ts +76 -0
- package/template/server/main.ts +78 -0
- package/template/server/rooms/arena-room.ts +488 -0
- package/template/server/rooms/game-room.ts +274 -0
- package/template/server/rooms.ts +15 -0
- package/template/server/tsconfig.json +19 -0
- package/template/src/bot/QaTester.tsx +35 -0
- package/template/src/bot/behaviors.ts +203 -0
- package/template/src/bot/bot-station.ts +192 -0
- package/template/src/bot/tester-run.ts +238 -0
- package/template/src/bot/tester-station.ts +193 -0
- package/template/src/components/environment/DaylightSky.tsx +54 -0
- package/template/src/components/environment/Ground.tsx +129 -0
- package/template/src/components/environment/SceneAtmosphere.tsx +14 -0
- package/template/src/components/environment/SoftGroundShadow.tsx +62 -0
- package/template/src/components/environment/SunShadowFit.tsx +141 -0
- package/template/src/contributions/README.md +98 -0
- package/template/src/contributions/analytics.analytics.tsx +26 -0
- package/template/src/contributions/data.document.tsx +35 -0
- package/template/src/contributions/pages.finder.ts +61 -0
- package/template/src/contributions/tester.inspector.tsx +64 -0
- package/template/src/contributions/use-game-modules.ts +80 -0
- package/template/src/data/README.md +17 -0
- package/template/src/input.ts +97 -0
- package/template/src/lib/audio/capability.json +4 -0
- package/template/src/lib/audio/sfx.ts +255 -0
- package/template/src/lib/react-root/capability.json +4 -0
- package/template/src/lib/react-root/index.ts +20 -0
- package/template/src/lib/react-root/react-root-adapter.tsx +57 -0
- package/template/src/lib/reflections/ReflectionProbe.tsx +201 -0
- package/template/src/lib/reflections/capability.json +4 -0
- package/template/src/lib/reflections/index.ts +19 -0
- package/template/src/lib/reflections/probe-controller.ts +75 -0
- package/template/src/lib/reflections/reflection-probe-registry.ts +402 -0
- package/template/src/lib/reflections/volume-reflection-material.ts +416 -0
- package/template/src/lib/static-batch/Frozen.tsx +91 -0
- package/template/src/lib/static-batch/capability.json +4 -0
- package/template/src/lib/static-batch/freeze.ts +579 -0
- package/template/src/lib/static-batch/index.ts +44 -0
- package/template/src/lib/static-batch/mutation-watch.ts +149 -0
- package/template/src/lib/static-batch/shadow-cache.ts +171 -0
- package/template/src/main.ts +63 -0
- package/template/src/manifest-entry-modules.d.ts +3 -0
- package/template/src/prefabs/HeroBox.stories.tsx +23 -0
- package/template/src/prefabs/HeroBox.tsx +35 -0
- package/template/src/scenes/MainScene.tsx +77 -0
- package/template/src/world.tsx +87 -0
- package/template/tsconfig.json +35 -0
- package/template/tsconfig.node.json +32 -0
- package/template/tsconfig.tools.json +22 -0
- package/template/validate-asset-content.ts +27 -0
- package/template/validate-assets.ts +60 -0
- package/template/validate-manifest.ts +55 -0
- package/template/vgai.adapter.ts +76 -0
- package/template/vgai.project.json +24 -0
- package/template/vite.config.ts +247 -0
- package/template-dotfiles/gitignore +63 -0
- package/workbench/src/media/game-cover.css +83 -0
- package/workbench/src/product.contribution.ts +188 -0
- package/workbench/src/vgaiGameSkew.ts +276 -0
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vgai-threejs-authoring
|
|
3
|
+
description: Build, rig, animate, diagnose, and visually refine polished native Three.js scenes and procedural assets with direct Object3D code, reusable construction helpers, geometry libraries, and an inspect-render-critique loop. Use for procedural models, rigid mechanical armatures, environments, static props, stylized materials, lighting, cameras, scene composition, or an agent-focused Blender-like workflow. Use vgai-3d-assets alongside this skill when the result should become a source document and a baked GLB. Do not use for Blender bpy work or imported skeletal retargeting.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# VGAI Three.js Authoring
|
|
7
|
+
|
|
8
|
+
Author ordinary project source against Three.js. Treat the source module and
|
|
9
|
+
live `Object3D` graph as truth. Use helpers for leverage, not as a replacement
|
|
10
|
+
scene language.
|
|
11
|
+
|
|
12
|
+
## Establish the authoring surface
|
|
13
|
+
|
|
14
|
+
1. Read the project instructions and architecture.
|
|
15
|
+
2. Locate the Three root or modeling build entry, existing helpers,
|
|
16
|
+
renderer setup, and verification commands.
|
|
17
|
+
3. Start or reuse the VGAI editor immediately and keep it open.
|
|
18
|
+
4. Capture a fixed-camera visual baseline.
|
|
19
|
+
5. Inspect the live hierarchy, selected-object facts, renderer state, and
|
|
20
|
+
console before changing code.
|
|
21
|
+
|
|
22
|
+
Never introduce a parallel entity tree, semantic operation log, generated
|
|
23
|
+
scene JSON, or wrapper around ordinary Three.js access for agent control. Give
|
|
24
|
+
important objects stable `Object3D.name` values or project metadata.
|
|
25
|
+
|
|
26
|
+
Also use `vgai-3d-assets` for reusable source-backed assets,
|
|
27
|
+
`vgai-animation-assets` for imported skeletons or clips, and
|
|
28
|
+
`vgai-environment-art` for whole-scene art direction.
|
|
29
|
+
|
|
30
|
+
## Choose the lowest sufficient layer
|
|
31
|
+
|
|
32
|
+
Use these layers in order:
|
|
33
|
+
|
|
34
|
+
1. Use Three.js directly for transforms, parenting, materials, lights,
|
|
35
|
+
cameras, curves, standard geometries, loaders, and animation.
|
|
36
|
+
2. Use an existing project helper for repeated high-value construction.
|
|
37
|
+
3. Use official Three.js addons before adding dependencies.
|
|
38
|
+
4. Use a proven specialist library for booleans, BVHs, topology repair, or
|
|
39
|
+
asset optimization.
|
|
40
|
+
5. Add a helper only after the same construction or failure-prone calculation
|
|
41
|
+
appears more than once.
|
|
42
|
+
|
|
43
|
+
Keep alternate library representations temporary. Return a normal
|
|
44
|
+
`BufferGeometry`, `Mesh`, `Group`, or other native `Object3D`.
|
|
45
|
+
|
|
46
|
+
Read [references/helper-catalog.md](references/helper-catalog.md) before adding
|
|
47
|
+
modeling capabilities or dependencies. That catalog answers *which op* — for
|
|
48
|
+
*which surfacing mode* (palette, shader look, tiling projection, card, decal,
|
|
49
|
+
provider retexture, procedural mask) and whether the asset needs UVs at all,
|
|
50
|
+
walk the eight modes cheapest-first in the `vgai-3d-assets` skill's
|
|
51
|
+
`references/surfacing.md`.
|
|
52
|
+
|
|
53
|
+
## Author raw code
|
|
54
|
+
|
|
55
|
+
Write named functions that return real objects:
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
function createObservatory(materials: Materials): THREE.Group {
|
|
59
|
+
const root = new THREE.Group();
|
|
60
|
+
root.name = 'observatory';
|
|
61
|
+
root.add(createTowerShell(materials.ivory), createTelescope(materials));
|
|
62
|
+
return root;
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Prefer hierarchy and local coordinates. Give each substantial assembly a
|
|
67
|
+
meaningful origin. Share materials intentionally. Seed authored randomness.
|
|
68
|
+
Use raw Three.js whenever a helper becomes awkward.
|
|
69
|
+
|
|
70
|
+
## Author shader looks as native GLSL
|
|
71
|
+
|
|
72
|
+
Keep shader source in ordinary `.vert`, `.frag`, or `.glsl` files and bind it
|
|
73
|
+
with `THREE.ShaderMaterial` directly. A sibling `name.vert.glsl` +
|
|
74
|
+
`name.frag.glsl` pair is the portable convention Asset Lab recognizes; it is
|
|
75
|
+
not a VGAI format. Keep authored uniform defaults, defines, textures, and
|
|
76
|
+
material composition beside the owning material in TS/TSX, where the runtime
|
|
77
|
+
actually reads them. Never add a `.shader.json`, uniform sidecar, or generated
|
|
78
|
+
shader graph to duplicate those facts.
|
|
79
|
+
|
|
80
|
+
Open either GLSL file from Content to inspect the pair against a real WebGL
|
|
81
|
+
preview. Asset Lab is visual-only: it does not duplicate the project's coding
|
|
82
|
+
surface or write shader source. Edit the ordinary GLSL files with your normal
|
|
83
|
+
coding tools; the open preview reloads them, and compiler diagnostics name the
|
|
84
|
+
native file, stage, and source line. Use the reflected Inspector uniforms to
|
|
85
|
+
explore values, geometry, and time/resolution inputs, then move accepted
|
|
86
|
+
defaults into the owning TS/TSX—the controls are session-only by design.
|
|
87
|
+
Resolve every compiler diagnostic before judging the look in its real scene,
|
|
88
|
+
because neutral preview geometry cannot prove lighting, depth, transparency,
|
|
89
|
+
postprocessing, or the game's actual texture bindings.
|
|
90
|
+
|
|
91
|
+
## Compose postprocessing directly
|
|
92
|
+
|
|
93
|
+
When a game needs postprocessing, add `@react-three/postprocessing` to that
|
|
94
|
+
project and import its components directly. Do not create a VGAI chain file,
|
|
95
|
+
effect registry, wrapper component, or JSON descriptor. The owning scene's JSX
|
|
96
|
+
is already the ordered chain; conditionally render one effect to bypass it and
|
|
97
|
+
move its JSX child to reorder it. Keep the finishing order restrained: render,
|
|
98
|
+
limited AO, bloom, color grade, anti-aliasing, then output color/tone conversion.
|
|
99
|
+
|
|
100
|
+
A 3D `.cube` color grade is an ordinary portable LUT. Open it from Content for
|
|
101
|
+
Asset Lab's visual before/after comparison; intensity and interpolation there
|
|
102
|
+
are session-only exploration. Load the accepted LUT with Three's
|
|
103
|
+
`LUTCubeLoader`, hand its `texture3D` directly to the library's `LUT` effect,
|
|
104
|
+
and author the accepted strength in TSX. Judge each bypass at the same camera,
|
|
105
|
+
pose, exposure, and simulation time. Asset Lab deliberately has no chain source
|
|
106
|
+
view: edit the ordinary TSX with the project's coding surface and watch the
|
|
107
|
+
running viewport reload it.
|
|
108
|
+
|
|
109
|
+
## Register reusable R3F prefabs
|
|
110
|
+
|
|
111
|
+
An R3F component becomes a Content prefab only when the project declares a
|
|
112
|
+
portable CSF story for it. Colocate `<Name>.stories.tsx`, set
|
|
113
|
+
`meta.component` to the component itself, and author at least one standalone
|
|
114
|
+
representative state. Update the story whenever the prefab's required props or
|
|
115
|
+
display contract changes.
|
|
116
|
+
|
|
117
|
+
The editor mounts the composed story off-screen and photographs that exact
|
|
118
|
+
state. It never infers prefab intent or appearance from export status, scene
|
|
119
|
+
placement, or a GLB path referenced by the component. A storyless component is
|
|
120
|
+
valid scene implementation, but it does not belong in Content. Keep model
|
|
121
|
+
files in Models; the component story may render a model, but does not turn the
|
|
122
|
+
model into the component or the component into an inferred prefab.
|
|
123
|
+
|
|
124
|
+
Use ordinary Storybook `args`, decorators, and loaders for required context.
|
|
125
|
+
For a suspending R3F loader, do not put `<Suspense>` around the story content:
|
|
126
|
+
the preview captures the first commit, so a committed fallback would be the
|
|
127
|
+
photographed subject.
|
|
128
|
+
|
|
129
|
+
## Build for visual quality
|
|
130
|
+
|
|
131
|
+
Establish these before micro-detail:
|
|
132
|
+
|
|
133
|
+
- a readable primary silhouette;
|
|
134
|
+
- asymmetry and at least three depth layers;
|
|
135
|
+
- a clear focal object and subordinate forms;
|
|
136
|
+
- intentional key, fill, and rim light;
|
|
137
|
+
- a restrained material palette with readable value and surface contrast;
|
|
138
|
+
- camera framing chosen for the composition, not merely fitting bounds.
|
|
139
|
+
|
|
140
|
+
Work through three frequency bands:
|
|
141
|
+
|
|
142
|
+
1. Primary forms carry silhouette, proportion, and composition.
|
|
143
|
+
2. Secondary forms explain construction: profiles, frames, ribs, supports,
|
|
144
|
+
openings, joints, and material transitions.
|
|
145
|
+
3. Tertiary accents appear only where the intended camera can read them.
|
|
146
|
+
|
|
147
|
+
A primitive remains blocking geometry until it has deliberate proportions,
|
|
148
|
+
edge treatment, a believable relationship with adjacent forms, and suitable
|
|
149
|
+
surface response. Object count is not a quality metric; count visible authored
|
|
150
|
+
decisions.
|
|
151
|
+
|
|
152
|
+
Treat emissive materials, ambient occlusion, and bloom as accents. If an effect
|
|
153
|
+
erases ribs, frames, texture, or material boundaries, reduce the effect before
|
|
154
|
+
adding geometry.
|
|
155
|
+
|
|
156
|
+
## Author stylized rendering honestly
|
|
157
|
+
|
|
158
|
+
For cel shading, use a nearest-filter gradient ramp with `MeshToonMaterial`.
|
|
159
|
+
For hard linework, combine inverted back-face hulls for silhouettes with
|
|
160
|
+
`EdgesGeometry` for intentional internal creases.
|
|
161
|
+
|
|
162
|
+
Treat style as a runtime-wide contract, not a promise made by one builder.
|
|
163
|
+
Inventory the live material classes after every async GLB and modeled object
|
|
164
|
+
has loaded. A helper that exists but is never imported by the mounted root has
|
|
165
|
+
implemented nothing. Apply the policy to the real runtime graph and expose a
|
|
166
|
+
small debug report so playtests can prove which materials were converted,
|
|
167
|
+
preserved, or excluded.
|
|
168
|
+
|
|
169
|
+
Author the policy per material family and per material slot. Use harder ramps
|
|
170
|
+
for focal props, characters, and readable detail; use a softer, higher-floor
|
|
171
|
+
ramp for broad architectural planes so point lights do not create concentric
|
|
172
|
+
band stains or crush the whole foreground. Preserve intentional Basic,
|
|
173
|
+
transparent/glass, emissive, and special-effect materials. When replacing a
|
|
174
|
+
material, carry forward its maps, vertex colors, alpha test, AO/normal/emissive
|
|
175
|
+
inputs, side, depth, and blend settings. A mixed material array must preserve
|
|
176
|
+
and convert each slot independently.
|
|
177
|
+
|
|
178
|
+
Attach derived ink beneath source meshes so animation and transforms remain
|
|
179
|
+
automatic. Exclude transparent smoke, glass, skies, and soft background forms
|
|
180
|
+
unless the art direction explicitly requires outlines.
|
|
181
|
+
|
|
182
|
+
An ordinary inverted-hull `ShaderMaterial` that expands `position` and
|
|
183
|
+
`normal` is not skinning-safe. Reject `SkinnedMesh` at the outline helper
|
|
184
|
+
boundary unless the shader explicitly includes and proves skinning/morph
|
|
185
|
+
chunks; a caller-side entity whitelist is not sufficient. For character ink,
|
|
186
|
+
use a deformation-aware path and inspect it in bent shoulder, hip, elbow,
|
|
187
|
+
knee, wrist, and ankle poses. Expose and assert that a rigid-only path outlined
|
|
188
|
+
zero skinned meshes.
|
|
189
|
+
|
|
190
|
+
Specify silhouette width in pixels when framing can change. Derive view-space
|
|
191
|
+
offset from depth, projection scale, and drawing-buffer height; refresh the
|
|
192
|
+
height after resize. Keep creases thinner and fade them sooner than
|
|
193
|
+
silhouettes. Prefer dark hues related to each material family over uniform
|
|
194
|
+
black.
|
|
195
|
+
|
|
196
|
+
Author stylized profiles per material family. Control lit/shadow color, band
|
|
197
|
+
threshold and softness, graphic highlight, rim, and thresholded specular
|
|
198
|
+
response. Preserve native Three.js lighting and shadows. `onBeforeCompile` is
|
|
199
|
+
version-sensitive; compile it in real WebGL after Three.js upgrades.
|
|
200
|
+
|
|
201
|
+
Run an ink-off diagnostic. The same fixed-camera frame must remain readable
|
|
202
|
+
through value grouping, shadow hue, highlights, and rims. Contours clarify
|
|
203
|
+
forms; they do not rescue confused materials.
|
|
204
|
+
|
|
205
|
+
Use only visual-inspection boundaries as workflow steps. One style iteration
|
|
206
|
+
produces and inspects, at the same camera and pose: the prior runtime frame,
|
|
207
|
+
toon with ink disabled, toon with ink enabled, and the full game composite.
|
|
208
|
+
Keep typecheck, shader compilation, material census, and scene validation
|
|
209
|
+
inside that same step; they are supporting checks, not separate milestones.
|
|
210
|
+
Reject broad-plane band stains, shadow crush, lost texture identity, mixed PBR/
|
|
211
|
+
toon assets, bind-pose outlines, or HUD/camera mismatch before continuing.
|
|
212
|
+
|
|
213
|
+
Use postprocessing as a finishing layer. A restrained order is render, limited
|
|
214
|
+
AO, restrained bloom, subtle color composite, SMAA, then output color/tone
|
|
215
|
+
conversion. Keep project-owned presentation separate from exported model
|
|
216
|
+
content.
|
|
217
|
+
|
|
218
|
+
## Rig at the correct deformation layer
|
|
219
|
+
|
|
220
|
+
- Use `Object3D` or `Bone` hierarchies for rigid articulated machinery.
|
|
221
|
+
- Use `SkinnedMesh` only for continuous deformation across a joint.
|
|
222
|
+
- Attach rigid accessories directly to their owning joint.
|
|
223
|
+
- Use morph targets for localized shape changes not naturally expressed by a
|
|
224
|
+
joint.
|
|
225
|
+
|
|
226
|
+
Put pivots at physical joint centers and author child geometry in local
|
|
227
|
+
coordinates. A `THREE.Bone` does not require a `SkinnedMesh`; use bones when
|
|
228
|
+
armature semantics and `SkeletonHelper` aid inspection.
|
|
229
|
+
|
|
230
|
+
Keep pose policy separate from construction. Use a deterministic pose function
|
|
231
|
+
for procedural locomotion and exact comparisons. Use native `AnimationClip`
|
|
232
|
+
and `AnimationMixer` when motion must be blended, serialized, edited, or baked.
|
|
233
|
+
Apply contact or IK correction after the base pose.
|
|
234
|
+
|
|
235
|
+
Validate a full cycle. Sample every driven joint and end effector at exact
|
|
236
|
+
times; reject non-finite transforms, duplicate names, insufficient joint
|
|
237
|
+
range, and negligible contact travel. Inspect support and passing poses. Hide
|
|
238
|
+
rig helpers outside diagnostics.
|
|
239
|
+
|
|
240
|
+
Animation cadence is separate from render cadence. For stepped motion,
|
|
241
|
+
quantize pose time while rendering and responding at display refresh rate.
|
|
242
|
+
Derive transforms from stored base values; do not accumulate with `+=` unless
|
|
243
|
+
drift is intentional.
|
|
244
|
+
|
|
245
|
+
## Render self-review is MANDATORY — the look protocol
|
|
246
|
+
|
|
247
|
+
After EVERY modeling milestone — a new mesh, a kit op applied, a material/
|
|
248
|
+
shading change, a fit or weld — render your work and LOOK at the pixels
|
|
249
|
+
before proceeding. Self-reports ("the topology is correct", "tests pass")
|
|
250
|
+
are not visual evidence; only a render is.
|
|
251
|
+
|
|
252
|
+
**Everything below happens inside YOUR project directory.** The one command
|
|
253
|
+
is `npx volter-game-editor screenshot`, and the module lane is the asset loop:
|
|
254
|
+
|
|
255
|
+
1. Look at a builder: `npx volter-game-editor screenshot src/models/<thing>.ts` runs that
|
|
256
|
+
module's default export headlessly in Node, exports the `Object3D` it
|
|
257
|
+
returns to an in-memory GLB, and photographs it in your live editor
|
|
258
|
+
session. `--export <fn>` picks a non-default export. Nothing is written
|
|
259
|
+
under `public/` and no provenance record is created — a look is not an
|
|
260
|
+
export. (It needs a live session for this project: `npx volter-game-editor edit .`.)
|
|
261
|
+
2. Look at a baked file: `npx volter-game-editor screenshot <path.glb>` — front/right/top/
|
|
262
|
+
3-quarter plus a contact sheet, through the Asset Lab.
|
|
263
|
+
3. Ask for canonical angles rather than ad-hoc ones: `--shots <set>`
|
|
264
|
+
resolves the registered `project.<set>.previewShots` tool, and a lib that
|
|
265
|
+
registers a set gets it by default. `--size`/`--width`/`--height` frame
|
|
266
|
+
it; `--compare <ref.glb>` scores silhouette IoU against a reference.
|
|
267
|
+
4. READ every printed PNG before the next edit: silhouette, shading, nothing
|
|
268
|
+
clipped or inside-out, vert/tri budget. A defect you can see is a defect —
|
|
269
|
+
fix it before building more on top of it.
|
|
270
|
+
5. Framing is automatic from your mesh's bounding box — if a render looks
|
|
271
|
+
empty or mis-framed, your geometry (scale/position/origin) is wrong, not
|
|
272
|
+
the camera. The corollary is a real blind spot: an asset lane auto-frames
|
|
273
|
+
its subject, so it can NEVER show you a wrong origin, a floating contact
|
|
274
|
+
plane, or a scale that disagrees with the world. Only a scene shot can —
|
|
275
|
+
`npx volter-game-editor screenshot` with no target (play mode, whole stack) or `vgai
|
|
276
|
+
screenshot <entityId>` (one entity where it stands, under the scene's own
|
|
277
|
+
lighting).
|
|
278
|
+
|
|
279
|
+
> Engine-repo aside — not for game projects. When you are working inside the
|
|
280
|
+
> vgai engine checkout itself (no game project, no editor session), the
|
|
281
|
+
> equivalent is `node packages/engine/e2e/turntable/capture.mjs <subject>`,
|
|
282
|
+
> run from the checkout root; it boots and tears down its own server. Point
|
|
283
|
+
> it at your own builder with `capture.mjs file --module
|
|
284
|
+
> /<repo-relative-path>.ts --export <fn>`, add `--zooms full,top,detail`
|
|
285
|
+
> (detail takes `--focus x,y,z`) for close-ups, and `npx biome check --write
|
|
286
|
+
> <your-file>.ts` before finishing, since unformatted engine files block the
|
|
287
|
+
> repo's lint for everyone.
|
|
288
|
+
|
|
289
|
+
## Run the refinement loop
|
|
290
|
+
|
|
291
|
+
For every meaningful iteration:
|
|
292
|
+
|
|
293
|
+
1. Build or typecheck.
|
|
294
|
+
2. Reload or rebuild the raw source graph.
|
|
295
|
+
3. Inspect names, bounds, hierarchy, camera, renderer statistics, warnings,
|
|
296
|
+
and failed requests.
|
|
297
|
+
4. Freeze procedural motion at a known time.
|
|
298
|
+
5. Capture the same viewport and camera as the baseline.
|
|
299
|
+
6. Identify the largest visible defect.
|
|
300
|
+
7. Make the smallest source change that tests the diagnosis.
|
|
301
|
+
8. Repeat until the pixels are visibly better.
|
|
302
|
+
|
|
303
|
+
When the project has `@volter/editor-live`, make the shared editor view the evidence
|
|
304
|
+
boundary instead of taking an unrelated page screenshot:
|
|
305
|
+
|
|
306
|
+
```ts
|
|
307
|
+
const shown = await editor.present({
|
|
308
|
+
version: 1,
|
|
309
|
+
document: { kind: 'workspace', id: 'workspace:scene' },
|
|
310
|
+
viewport: { camera: 'isometric', frame: 'document' },
|
|
311
|
+
});
|
|
312
|
+
const actual = await editor.currentView();
|
|
313
|
+
const capture = await editor.captureActiveDocument();
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
Treat `actual` as the postcondition and `capture.document` as provenance for
|
|
317
|
+
the pixels. `present()` is an intent, not proof: the active document may have
|
|
318
|
+
degraded, failed to mount, or been changed by the human. Keep the returned
|
|
319
|
+
share link with critique notes so the same subject, camera, diagnostic, and
|
|
320
|
+
utility can be reopened for the next cycle.
|
|
321
|
+
|
|
322
|
+
Do not declare success because code is shorter, more reusable, or produces
|
|
323
|
+
fewer commands.
|
|
324
|
+
|
|
325
|
+
## Validate the deliverable
|
|
326
|
+
|
|
327
|
+
Before finishing:
|
|
328
|
+
|
|
329
|
+
- run project production/type validation;
|
|
330
|
+
- verify no runtime or WebGL shader errors;
|
|
331
|
+
- verify stable names and direct graph inspection;
|
|
332
|
+
- verify derived ink is non-interactive and follows source transforms;
|
|
333
|
+
- verify outline width at default and materially different framing;
|
|
334
|
+
- verify material design with ink disabled;
|
|
335
|
+
- verify every loaded asset participates in the intended runtime material-family policy;
|
|
336
|
+
- verify broad planes have no band stains or crushed readable shadow detail;
|
|
337
|
+
- verify rigid-only outline paths report zero outlined `SkinnedMesh` objects;
|
|
338
|
+
- compare finishing effects at one exact pose;
|
|
339
|
+
- verify deterministic rebuild and bounded animation;
|
|
340
|
+
- verify a full-cycle report has finite, meaningful ranges and travel;
|
|
341
|
+
- verify cleanup and disposal;
|
|
342
|
+
- compare final browser-rendered evidence against the baseline;
|
|
343
|
+
- record generally useful helpers in the catalog while keeping one-off
|
|
344
|
+
assemblies project-owned.
|
|
345
|
+
|
|
346
|
+
When a helper improves one scene but harms another, keep it local until its
|
|
347
|
+
contract is understood.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Native Three.js helper and dependency catalog
|
|
2
|
+
|
|
3
|
+
Use this reference to decide whether a task needs Blender, direct Three.js, a
|
|
4
|
+
small project helper, or a specialist geometry library.
|
|
5
|
+
|
|
6
|
+
**MODELING IS BLENDER'S.** A model is a `.blend`, authored in the real Blender
|
|
7
|
+
running headless in the editor tab, and a game loads the GLB it exports. Reach
|
|
8
|
+
for `vgai-3d-models` (bpy through the Blender MCP).
|
|
9
|
+
|
|
10
|
+
**Add a capability before you look for its source.** Everything under
|
|
11
|
+
`src/lib/` below is a CAPABILITY, not scaffold contents — a fresh project has
|
|
12
|
+
no `src/lib/` directory at all. Run `npx volter-game-editor add <id>` to copy the source in as
|
|
13
|
+
ordinary project files you own and edit; bare `npx volter-game-editor add` lists every
|
|
14
|
+
capability and marks what is already present.
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## Direct Three.js
|
|
18
|
+
|
|
19
|
+
Use directly for `Object3D` hierarchy and transforms; standard geometries,
|
|
20
|
+
`Shape`, extrusion, lathing, tubes, and curves; materials, textures, lights,
|
|
21
|
+
shadows, cameras, loaders, raycasting, and animation; and official addons such
|
|
22
|
+
as `RoundedBoxGeometry` and `BufferGeometryUtils`. Do not wrap ordinary
|
|
23
|
+
property access.
|
|
24
|
+
|
|
25
|
+
## Rigging and validation helpers
|
|
26
|
+
|
|
27
|
+
Keep helpers thin: create named native joints; sample exact-time poses and
|
|
28
|
+
end-effector bounds; report unique names, finite transforms, angular range,
|
|
29
|
+
and contact travel; expose `SkeletonHelper` only as a diagnostic; and convert
|
|
30
|
+
accepted reusable motion into ordinary `AnimationClip`s.
|
|
31
|
+
|
|
32
|
+
Do not wrap `AnimationMixer`, `AnimationClip`, `KeyframeTrack`, or normal bone
|
|
33
|
+
transforms. Rigid machinery attaches parts directly to joints; deforming
|
|
34
|
+
meshes require real normalized skin attributes — weight them in Blender and
|
|
35
|
+
let the glTF exporter write `JOINTS_0`/`WEIGHTS_0`. Blender's automatic
|
|
36
|
+
weighting can report FINISHED having weighted nothing: check the weights.
|
|
37
|
+
|
|
38
|
+
## Geometry libraries
|
|
39
|
+
|
|
40
|
+
- `three-mesh-bvh` for accelerated raycasting, closest-point queries, surface
|
|
41
|
+
placement and large-mesh spatial tests; `three-bvh-csg` for booleans on
|
|
42
|
+
watertight meshes when raw `BufferGeometry` interop matters — validate
|
|
43
|
+
structurally and visually. Both are ordinary libraries you call directly.
|
|
44
|
+
- Evaluate Manifold for robust solids, converting results back to
|
|
45
|
+
`BufferGeometry`.
|
|
46
|
+
- Use Replicad or OpenCascade only when CAD workplanes, precise fillets,
|
|
47
|
+
shells, or face selection justify their cost.
|
|
48
|
+
- Use glTF Transform outside the runtime bundle for welding, pruning,
|
|
49
|
+
simplification, instancing, compression, and texture processing.
|
|
50
|
+
|
|
51
|
+
Learn functional composition from JSCAD, workplanes/selectors from CadQuery,
|
|
52
|
+
and presentation helpers from Drei. Modifier coverage is Blender's own. Do not
|
|
53
|
+
adopt an alternate persistent scene model to imitate them.
|
|
54
|
+
|
|
55
|
+
## Proven prototype surface
|
|
56
|
+
|
|
57
|
+
Proven craft techniques: profile lathing, beveled extrusion, arched frames,
|
|
58
|
+
deterministic canvas textures, CSG, curve pipes, per-material anime profiles,
|
|
59
|
+
pixel-width silhouette ink, distance-faded creases, rigid bone chains,
|
|
60
|
+
exact-time gait validation, stepped pose timing, hard shadows, environment
|
|
61
|
+
lighting, limited AO/bloom, a subtle color composite, and SMAA. Treat them as
|
|
62
|
+
techniques to write in project source, not runtime APIs. Portable GLB ink
|
|
63
|
+
emits ordinary expanded meshes and `LineSegments`; the source-quality
|
|
64
|
+
ink uses project shader hooks and should remain source-only unless an explicit
|
|
65
|
+
import recipe recreates it.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
// A minimal preset that follows the rules. Domain: a simple spec issue whose
|
|
2
|
+
// acceptance criteria are GFM task-list items, each carrying commit-backed
|
|
3
|
+
// evidence as a nested list. The whole thing is ONE strict Zod schema; mdast
|
|
4
|
+
// fills it; rules validate it with injected context.
|
|
5
|
+
//
|
|
6
|
+
// Hard schema = the core fields (id/title/summary/status, id/status/evidence,
|
|
7
|
+
// id) PLUS preset-specific strict fields (a status enum, AC `text`, evidence
|
|
8
|
+
// `commit`). No passthrough, no unknown.
|
|
9
|
+
|
|
10
|
+
// A STANDALONE preset: imports ONLY the public mechanism from `ztrack/preset-kit`.
|
|
11
|
+
import {
|
|
12
|
+
z, toMdast, nodeText, type MdNode,
|
|
13
|
+
check as runCheck, rule, gitWorld,
|
|
14
|
+
type Context, type IssueColumns, type IssueRecord, type Preset, type VisualizerSpec,
|
|
15
|
+
} from 'ztrack/preset-kit';
|
|
16
|
+
|
|
17
|
+
// ── the hard schema (core + preset-specific, all strict) ────────────────────
|
|
18
|
+
export const SpecEvidenceSchema = z.object({
|
|
19
|
+
id: z.string().min(1), // core
|
|
20
|
+
commit: z.string().regex(/^[0-9a-f]{7,40}$/), // preset: evidence is commit-backed
|
|
21
|
+
}).strict();
|
|
22
|
+
|
|
23
|
+
export const SpecAcStatusSchema = z.enum(['pending', 'passed', 'failed']); // preset's status vocabulary
|
|
24
|
+
export const SpecAcSchema = z.object({
|
|
25
|
+
id: z.string().min(1), // core
|
|
26
|
+
status: SpecAcStatusSchema, // core (preset narrows the type)
|
|
27
|
+
evidence: z.array(SpecEvidenceSchema), // core
|
|
28
|
+
text: z.string().min(1), // preset
|
|
29
|
+
}).strict();
|
|
30
|
+
|
|
31
|
+
export const SpecIssueStatusSchema = z.enum(['draft', 'in-review', 'done']);
|
|
32
|
+
export const SpecIssueSchema = z.object({
|
|
33
|
+
id: z.string().min(1), // core
|
|
34
|
+
title: z.string().min(1), // core
|
|
35
|
+
summary: z.string(), // core
|
|
36
|
+
status: SpecIssueStatusSchema, // core (narrowed)
|
|
37
|
+
acceptanceCriteria: z.array(SpecAcSchema), // core
|
|
38
|
+
}).strict();
|
|
39
|
+
|
|
40
|
+
export const SpecRootSchema = z.object({ issues: z.array(SpecIssueSchema) }).strict();
|
|
41
|
+
export type SpecRoot = z.infer<typeof SpecRootSchema>;
|
|
42
|
+
|
|
43
|
+
// ── mdast parse: markdown -> the schema shape (structured, no prose mining) ──
|
|
44
|
+
// MdNode / toMdast / nodeText are rented from the kit (shared mdast mechanism).
|
|
45
|
+
function firstParagraphText(item: MdNode): string {
|
|
46
|
+
const p = (item.children ?? []).find((c) => c.type === 'paragraph');
|
|
47
|
+
return p ? nodeText(p).split('\n')[0]!.trim() : '';
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// designated-position parses (the AC line, the evidence line) — not free-prose mining.
|
|
51
|
+
function splitAcIdText(line: string): { id: string; text: string } {
|
|
52
|
+
const m = /^(\S+)\s+(.+)$/.exec(line);
|
|
53
|
+
return m ? { id: m[1]!, text: m[2]!.trim() } : { id: line, text: line };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function parseSpecIssue(record: IssueRecord): Record<string, unknown> {
|
|
57
|
+
// id/title/status come STRUCTURED from the record's columns; only summary + ACs are
|
|
58
|
+
// parsed from the body.
|
|
59
|
+
const issue: Record<string, unknown> = { id: record.id, title: record.title, status: record.status || 'draft', summary: '', acceptanceCriteria: [] };
|
|
60
|
+
const tree = toMdast(record.body);
|
|
61
|
+
let inAc = false;
|
|
62
|
+
|
|
63
|
+
for (const node of tree.children ?? []) {
|
|
64
|
+
if (node.type === 'heading') {
|
|
65
|
+
inAc = /acceptance criteria/i.test(nodeText(node));
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (node.type === 'paragraph') {
|
|
69
|
+
const summary = /^Summary:\s*(.+)$/im.exec(nodeText(node))?.[1]?.trim();
|
|
70
|
+
if (summary) issue.summary = summary;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (node.type === 'list' && inAc) {
|
|
74
|
+
const acs: unknown[] = [];
|
|
75
|
+
for (const item of node.children ?? []) {
|
|
76
|
+
if (item.type !== 'listItem') continue;
|
|
77
|
+
const { id, text } = splitAcIdText(firstParagraphText(item));
|
|
78
|
+
const status = item.checked === true ? 'passed' : 'pending';
|
|
79
|
+
const evidence: unknown[] = [];
|
|
80
|
+
const nested = (item.children ?? []).find((c) => c.type === 'list');
|
|
81
|
+
for (const evItem of nested?.children ?? []) {
|
|
82
|
+
const commit = /commit:\s*([0-9a-fA-F]+)/.exec(firstParagraphText(evItem))?.[1]?.toLowerCase();
|
|
83
|
+
if (commit) evidence.push({ id: `${id}/ev${evidence.length + 1}`, commit });
|
|
84
|
+
}
|
|
85
|
+
acs.push({ id, status, text, evidence });
|
|
86
|
+
}
|
|
87
|
+
issue.acceptanceCriteria = acs;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return issue;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// The root: each issue's metadata is structured (its record's columns); content from body.
|
|
94
|
+
export function parseSpec(records: IssueRecord[]): unknown {
|
|
95
|
+
return { issues: records.map(parseSpecIssue) };
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// ── serialize: the validated issue -> its STORED form (content body + metadata columns) ──
|
|
99
|
+
// The evidence id is positional (`<acId>/ev<n>`), so it isn't emitted — re-parsing
|
|
100
|
+
// regenerates it. A passed AC is the checked box; pending/failed are unchecked.
|
|
101
|
+
export function serializeSpecIssue(issue: SpecRoot['issues'][number]): { body: string; columns: IssueColumns } {
|
|
102
|
+
const out: string[] = [];
|
|
103
|
+
if (issue.summary) out.push(`Summary: ${issue.summary}`, '');
|
|
104
|
+
out.push('## Acceptance Criteria', '');
|
|
105
|
+
for (const ac of issue.acceptanceCriteria) {
|
|
106
|
+
out.push(`- [${ac.status === 'passed' ? 'x' : ' '}] ${ac.id} ${ac.text}`);
|
|
107
|
+
for (const ev of ac.evidence) out.push(` - commit: ${ev.commit}`);
|
|
108
|
+
}
|
|
109
|
+
return { body: out.join('\n') + '\n', columns: { title: issue.title, status: issue.status } };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// ── rules: declarative records over the engine's derived model ──────────────
|
|
113
|
+
// Duplicate-id detection is universal, so it arrives on the core model (m.duplicateAcIds
|
|
114
|
+
// / m.duplicateIssueIds) — this preset writes no derive and uses no blocking graph.
|
|
115
|
+
type SpecAC = SpecRoot['issues'][number]['acceptanceCriteria'][number];
|
|
116
|
+
type SpecEvidence = SpecAC['evidence'][number];
|
|
117
|
+
|
|
118
|
+
const shaMatches = (a: string, b: string) => a.startsWith(b) || b.startsWith(a);
|
|
119
|
+
|
|
120
|
+
const SPEC_RULES = [
|
|
121
|
+
rule<SpecRoot, { issueId: string; acId: string; ac: SpecAC }>({
|
|
122
|
+
code: 'passed_ac_missing_evidence', select: (m) => m.acs,
|
|
123
|
+
when: ({ ac }) => ac.status === 'passed' && ac.evidence.length === 0,
|
|
124
|
+
message: ({ ac }) => `AC ${ac.id} is passed but cites no commit-backed evidence.`,
|
|
125
|
+
}),
|
|
126
|
+
rule<SpecRoot, { issueId: string; acId: string; evidenceId: string; ev: SpecEvidence }>({
|
|
127
|
+
code: 'evidence_commit_not_found', select: (m) => m.evidence,
|
|
128
|
+
when: ({ ev }, m) => { const c = m.context.git?.existingCommits; return !!c && !c.some((x) => shaMatches(x, ev.commit)); },
|
|
129
|
+
message: ({ ev }) => `Evidence ${ev.id} cites commit ${ev.commit}, which does not exist.`,
|
|
130
|
+
subject: ({ ev }) => ev.commit, // the missing sha — a `ref:` waiver pins to exactly this occurrence
|
|
131
|
+
}),
|
|
132
|
+
rule<SpecRoot, { issueId: string; acId: string }>({
|
|
133
|
+
code: 'duplicate_ac_id', select: (m) => m.duplicateAcIds,
|
|
134
|
+
message: ({ acId }) => `Duplicate AC id ${acId}.`,
|
|
135
|
+
}),
|
|
136
|
+
rule<SpecRoot, { issueId: string }>({
|
|
137
|
+
code: 'duplicate_issue_id', select: (m) => m.duplicateIssueIds,
|
|
138
|
+
message: ({ issueId }) => `Duplicate issue id ${issueId}.`,
|
|
139
|
+
}),
|
|
140
|
+
];
|
|
141
|
+
|
|
142
|
+
// ── the dashboard's vocabulary (VIZ-2), as plain data ────────────────────────────────────────
|
|
143
|
+
// spec's OWN vocabulary — NOT simple-sdlc's default.tsx vocabulary, which this preset's schema
|
|
144
|
+
// doesn't share: a 3-state lifecycle (no ready/in-progress split), no assignee, no PR, and an AC
|
|
145
|
+
// with just id/text (no version, no proof, no image/acVersion-bearing evidence — see
|
|
146
|
+
// SpecAcSchema/SpecEvidenceSchema above). Only map fields this schema actually has; a mapping
|
|
147
|
+
// this preset can't back with a real field (pr, acProof, acEvidence) is simply omitted. Field
|
|
148
|
+
// references and literal labels ONLY (see `VisualizerSpec`, `ztrack/preset-kit`) — no functions,
|
|
149
|
+
// no markup. Installed into your repo verbatim: edit freely, keeping statusOrder in sync with
|
|
150
|
+
// SpecIssueStatusSchema above (`boilerplates/presets/visualizerVocabulary.test.ts` checks that).
|
|
151
|
+
const SPEC_VISUALIZER: VisualizerSpec = {
|
|
152
|
+
statusOrder: ['draft', 'in-review', 'done'], // must equal SpecIssueStatusSchema above
|
|
153
|
+
acUnitLabel: 'Acceptance Criteria',
|
|
154
|
+
acText: { id: 'id', text: 'text' }, // SpecAcSchema.{id,text} — no `version` field to map
|
|
155
|
+
// no assignee/pr: SpecIssueSchema has neither. No acProof: SpecAcSchema has no proof field.
|
|
156
|
+
// No acEvidence: SpecEvidenceSchema is only {id, commit} — no image/acVersion fields to map.
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
export const SpecPreset: Preset<SpecRoot> = {
|
|
160
|
+
name: 'spec',
|
|
161
|
+
schema: SpecRootSchema,
|
|
162
|
+
visualizer: SPEC_VISUALIZER,
|
|
163
|
+
// observed facts: commit existence (no PR model in this preset).
|
|
164
|
+
loadContext: (input) => gitWorld(input.projectRoot, [], { verifyCommits: input.verifyCommits }),
|
|
165
|
+
parse: parseSpec,
|
|
166
|
+
serialize: serializeSpecIssue, // issue -> { body, columns }; the inverse of parse
|
|
167
|
+
rules: SPEC_RULES,
|
|
168
|
+
// `ztrack issue scaffold` starter: a pending AC (green to begin). Mark it [x] + cite a
|
|
169
|
+
// `- commit: <sha>` once the behavior is implemented.
|
|
170
|
+
scaffold: (_title) => `Summary: A short spec of the behavior.\n\n## Acceptance Criteria\n\n- [ ] AC-1 Describe one observable acceptance criterion.\n`,
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
export function checkSpec(records: IssueRecord[], ctx?: Context) {
|
|
174
|
+
return runCheck(SpecPreset, records, ctx);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// The installed entrypoint: the resolver reads the preset off `default`.
|
|
178
|
+
export default SpecPreset;
|