@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,363 @@
|
|
|
1
|
+
# Editor-control reference
|
|
2
|
+
|
|
3
|
+
## Contents
|
|
4
|
+
|
|
5
|
+
- [CLI invocation](#cli-invocation--use-the-project-local-cli)
|
|
6
|
+
- [Quick start](#quick-start)
|
|
7
|
+
- [Connection precondition](#precondition-most-verbs-need-a-connected-browser-tab-not-just-vgai-edit-running)
|
|
8
|
+
- [**Drive the running game — `npx volter-game-editor eval`**](#drive-the-running-game--vgai-eval-the-general-door)
|
|
9
|
+
- [CLI reference](#cli-reference)
|
|
10
|
+
- [Entity IDs](#entity-ids)
|
|
11
|
+
- [Typical workflows](#typical-workflows)
|
|
12
|
+
- [SDK](#sdk-programmatic-access)
|
|
13
|
+
|
|
14
|
+
Use the `vgai` CLI to create projects, launch the editor, and control it programmatically. The editor is a browser-based WebGL app; the CLI sends commands to it over HTTP.
|
|
15
|
+
|
|
16
|
+
**Driving a running GAME is a different question from driving the editor**, and
|
|
17
|
+
it has one answer: `npx volter-game-editor eval`. Read that section before the verb list — the
|
|
18
|
+
verbs cover the editor, and a game's own commands are never verbs.
|
|
19
|
+
|
|
20
|
+
## CLI invocation — use the project-local CLI
|
|
21
|
+
|
|
22
|
+
Inside this scaffold, invoke every CLI verb as `npm run --silent vgai -- <verb>`. The
|
|
23
|
+
script points at the versioned `@volter/game-editor` installed with this project. Never
|
|
24
|
+
use a bare global `vgai` command here: another installation can own that binary
|
|
25
|
+
and can silently target the wrong session or apply different manifest rules.
|
|
26
|
+
|
|
27
|
+
## Quick Start
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm run --silent vgai -- create "My Game" # Scaffold a new project in ./my-game
|
|
31
|
+
cd my-game
|
|
32
|
+
npm run --silent vgai -- edit . # Launch editor + open browser
|
|
33
|
+
npm run --silent vgai -- play # Enter play mode
|
|
34
|
+
npm run --silent vgai -- restart # Remount all game roots — acks only when the session is READY
|
|
35
|
+
# again (relay up, tab attached, play measured running); exits
|
|
36
|
+
# non-zero naming the gap otherwise. No sleep-then-play dance.
|
|
37
|
+
npm run --silent vgai -- status # Check editor state
|
|
38
|
+
npm run --silent vgai -- eval --list # Everything you can drive — ask this FIRST
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Port cross-talk:** the default editor port (5173) is shared across every
|
|
42
|
+
VGAI project on the machine. `npm run --silent vgai -- edit .` never silently retargets a
|
|
43
|
+
DIFFERENT project's already-running editor — if one is already open
|
|
44
|
+
elsewhere, this one starts a second instance on a fresh free port and prints
|
|
45
|
+
that URL instead (use `--switch` to retarget the existing one on purpose).
|
|
46
|
+
If you might have another vgai project's tab open in the browser already,
|
|
47
|
+
don't assume it's this project: read the URL `npx volter-game-editor edit` actually prints
|
|
48
|
+
(check `npx volter-game-editor sessions` to see every live session's port → project), or pass
|
|
49
|
+
`npx volter-game-editor edit --port <n>` to pin an explicit port for this project so a stale
|
|
50
|
+
tab from a different project can't be mistaken for this session.
|
|
51
|
+
|
|
52
|
+
## Precondition: most verbs need a connected browser tab, not just `npx volter-game-editor edit` running
|
|
53
|
+
|
|
54
|
+
`npx volter-game-editor edit` starts the dev server and prints a URL — it does **not** by
|
|
55
|
+
itself give the CLI anything to talk to. Every control verb (`play`,
|
|
56
|
+
`select`, `focus`, `show`, `status`, ...) is relayed over HTTP/SSE to an
|
|
57
|
+
actual browser tab that has the editor page open and running; the dev
|
|
58
|
+
server just serves that page. Running `npx volter-game-editor edit` and then immediately
|
|
59
|
+
calling `npx volter-game-editor status` with **no tab ever opened** does not error — it
|
|
60
|
+
returns the last **cached** state from a previous session (or an empty
|
|
61
|
+
default), and prints a prominent multi-line `STALE SNAPSHOT` banner to
|
|
62
|
+
stderr (with the snapshot's age, if known) instead of a hard error, so
|
|
63
|
+
scripts that legitimately want last-known state still get it. Read that
|
|
64
|
+
banner: it means the JSON below it is stale, not live. Before trusting
|
|
65
|
+
`npx volter-game-editor status` (or issuing `play`/`select`/etc. and expecting them to do
|
|
66
|
+
anything), make sure a tab is actually open on the printed URL — a real
|
|
67
|
+
browser, or a Playwright/Puppeteer page you navigated to it yourself.
|
|
68
|
+
|
|
69
|
+
**`--no-open`: skip the browser auto-open.** Only for contexts where NO
|
|
70
|
+
human could possibly be watching (unattended CI). On WSL the auto-open
|
|
71
|
+
reaches the WINDOWS browser, so headless WSL is not a reason to pass this —
|
|
72
|
+
let `npx volter-game-editor edit` auto-open and tell the user the printed URL instead. The
|
|
73
|
+
one legitimate case is a fully unattended CI job that then drives the
|
|
74
|
+
editor itself, e.g. via Playwright:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npm run --silent vgai -- edit . --no-open # ONLY when no human could be watching (e.g. CI)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
// then, in a Playwright script, open a page against the printed URL —
|
|
82
|
+
// use 'load', NOT 'networkidle': the editor dev server keeps a
|
|
83
|
+
// long-lived SSE/websocket connection open for live commands, so the
|
|
84
|
+
// network never goes idle and `waitUntil: 'networkidle'` hangs forever.
|
|
85
|
+
await page.goto('http://localhost:5173', { waitUntil: 'load' });
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Once that page has loaded, it registers as a connected client and `vgai
|
|
89
|
+
status`/`npx volter-game-editor play`/etc. from another shell will reach it for real.
|
|
90
|
+
|
|
91
|
+
## Drive the running game — `npx volter-game-editor eval`, the general door
|
|
92
|
+
|
|
93
|
+
**This is the section to read before the verb list below.** A first-party
|
|
94
|
+
game's control and readout surface is its own ordinary exported modules. There
|
|
95
|
+
is no command registry, provider registry, or fixed game vocabulary to learn.
|
|
96
|
+
`npx volter-game-editor eval` runs literal JS against this project's live session with
|
|
97
|
+
`{ editor, game, page, tools, session }` from `@volter/game-live` already in scope:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
npm run --silent vgai -- eval --list # what's in scope (no session needed)
|
|
101
|
+
npm run --silent vgai -- eval 'return game.run(async ({ modules }) => { const arena = await modules("src/sim/arena.ts"); return arena.readArena(); })'
|
|
102
|
+
npm run --silent vgai -- eval 'return game.run(async ({ modules }) => { const arena = await modules("src/sim/arena.ts"); arena.setupBossWave(); return arena.readArena(); })'
|
|
103
|
+
npm run --silent vgai -- eval 'return game.run(async ({ modules }) => { const tester = await modules("src/bot/tester-station.ts"); return tester.hireTester("sweep"); })'
|
|
104
|
+
npm run --silent vgai -- eval 'await game.waitSimTime({simSeconds: 4})'
|
|
105
|
+
npm run --silent vgai -- eval 'await editor.grid(false)' # the editor half, same door
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
`--list` walks the live binding objects themselves rather than a written list,
|
|
109
|
+
so it cannot go stale — ask it rather than trusting any prose, including this
|
|
110
|
+
page. The game's own source tells you which module functions exist; the
|
|
111
|
+
template's `src/tools/use-game-modules.ts` shows how a literal contribution
|
|
112
|
+
reads the exact same running instances.
|
|
113
|
+
|
|
114
|
+
**NEVER pilot a realtime game from the developer REPL, with synthetic key
|
|
115
|
+
events, rAF loops, wall-clock sleeps, or direct `window.__vgai*`/scene-graph
|
|
116
|
+
reads.** Arrange expensive preconditions with exported setup functions, then
|
|
117
|
+
hire the resident tester to act through the game's real input store.
|
|
118
|
+
`waitSimTime` advances deterministically even while the editor tab is HIDDEN.
|
|
119
|
+
`npx volter-game-editor status` reports the tab's own
|
|
120
|
+
visibility MEASUREMENTS (`visibilityReport` — the reported value, its age,
|
|
121
|
+
and a live tick probe when the loop looks stopped) instead of letting
|
|
122
|
+
`connected: true` read as usable — and instead of asserting a story:
|
|
123
|
+
treat its readings as evidence with an age, never as a verdict about
|
|
124
|
+
what is on the user's screen. A result obtained by puppeteering the page is
|
|
125
|
+
not evidence: it can agree with the pixels while disagreeing with the state
|
|
126
|
+
providers every other tool reads.
|
|
127
|
+
|
|
128
|
+
## When to Use This Skill
|
|
129
|
+
|
|
130
|
+
- **`create` / `edit`** — bootstrap and launch projects
|
|
131
|
+
- **`eval`** — drive or read the running game AND editor; the door above
|
|
132
|
+
- **`play` / `stop` / `restart` / `status` / `screenshot`** — the everyday loop
|
|
133
|
+
- You do NOT need the CLI for scene/asset changes — a three root's document IS its TSX source (`src/world.tsx`, `src/scenes/`, `src/prefabs/`), so editing the world is editing those files; the dev server validates every save and surfaces failures loudly
|
|
134
|
+
|
|
135
|
+
## CLI Reference
|
|
136
|
+
|
|
137
|
+
### Project Management (no running editor needed)
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
npm run --silent vgai -- create <name> [location] # Empty project (default location: ./<name>)
|
|
141
|
+
npm run --silent vgai -- create <name> [location] --template game # Game composition; also empty, website, models
|
|
142
|
+
npm run --silent vgai -- edit [project-path] # Launch editor for project (default: cwd).
|
|
143
|
+
# Reuses the session already serving THIS
|
|
144
|
+
# project; otherwise starts a NEW instance on
|
|
145
|
+
# a free port rather than silently retargeting
|
|
146
|
+
# a different project's editor (see the port
|
|
147
|
+
# cross-talk note above).
|
|
148
|
+
# --switch retarget an existing instance
|
|
149
|
+
# instead of starting a new one
|
|
150
|
+
# --port <n> force a port for a fresh instance
|
|
151
|
+
npm run --silent vgai -- sessions # List live editor sessions (port -> project)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Scene & Project Info (needs running editor)
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
npm run --silent vgai -- open <path> # Switch project in running editor
|
|
158
|
+
npm run --silent vgai -- project # Show current project info
|
|
159
|
+
npm run --silent vgai -- projects # List recent projects
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
`open` / `project` / `projects` stay first-class for a concrete reason: project
|
|
163
|
+
management lives on `EditorClient` and was never lifted onto `@volter/editor-live`'s
|
|
164
|
+
`editor`, so there is no `eval` equivalent to point them at.
|
|
165
|
+
|
|
166
|
+
### Play Control
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
npm run --silent vgai -- play # Enter play mode
|
|
170
|
+
npm run --silent vgai -- restart # Dispose + remount every game root — waits out a relaunching dev
|
|
171
|
+
# server, re-ensures the one tab, and acks only once play is
|
|
172
|
+
# measured running (a failure names the next step)
|
|
173
|
+
npm run --silent vgai -- stop # Exit play mode
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
`pause` / `resume` / `step` were REMOVED — `npx volter-game-editor eval 'editor.pause()'`,
|
|
177
|
+
`editor.resume()`, `editor.step(1)`.
|
|
178
|
+
|
|
179
|
+
Component-source HMR swaps class prototypes onto live instances. That keeps
|
|
180
|
+
runtime state and avoids an editor reload, but it deliberately does not rerun
|
|
181
|
+
`init()`. Use `restart` after changing init-time debug registrations,
|
|
182
|
+
listeners, generated resources, component ownership, or other setup/teardown
|
|
183
|
+
behavior. The same action is always available in the Play bar; when the editor
|
|
184
|
+
knows a source change is structurally unsafe it highlights the button with the
|
|
185
|
+
reason.
|
|
186
|
+
|
|
187
|
+
### Navigation, Panels, and Display — REMOVED, use `npx volter-game-editor eval`
|
|
188
|
+
|
|
189
|
+
Every verb in this group was a 1:1 wrapper over a method `eval` already
|
|
190
|
+
exposes, so they were deleted rather than kept as aliases. Typing one now
|
|
191
|
+
errors with its exact replacement:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
npm run --silent vgai -- eval 'editor.select("<entityId>")' # or "all"
|
|
195
|
+
npm run --silent vgai -- eval 'editor.deselect()'
|
|
196
|
+
npm run --silent vgai -- eval 'editor.focus("<entityId>")' # omit arg = current selection
|
|
197
|
+
npm run --silent vgai -- eval 'editor.view("top")' # top|front|right|perspective
|
|
198
|
+
npm run --silent vgai -- eval 'editor.showPanel("inspector")' # viewport|inspector|console|build
|
|
199
|
+
npm run --silent vgai -- eval 'editor.openAsset("<path>", "<kind>")'
|
|
200
|
+
npm run --silent vgai -- eval 'editor.grid(false)'
|
|
201
|
+
npm run --silent vgai -- eval 'editor.helpers(true)'
|
|
202
|
+
npm run --silent vgai -- eval 'editor.stats(true)'
|
|
203
|
+
npm run --silent vgai -- eval 'editor.shading("wireframe")' # solid|unlit|wireframe|normals|overdraw
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
The advantage is not brevity — it is that one door composes. Selecting an
|
|
207
|
+
entity, framing it, and capturing the result is a single round trip instead of
|
|
208
|
+
four processes:
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
npm run --silent vgai -- eval 'await editor.select(id); await editor.focus(); await editor.shading("wireframe"); return editor.screenshot()'
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Shading is temporary, render-only editor state: it never rewrites scene or
|
|
215
|
+
game materials and is not saved into a scene. Scene and Game remember separate
|
|
216
|
+
session-local modes; `shading` targets whichever viewport is active. Game
|
|
217
|
+
shading applies to compatible first-party Three.js roots, while React/Pixi and
|
|
218
|
+
other adapter-owned layers continue rendering natively. The Scene helper menu
|
|
219
|
+
also exposes independent lights, cameras, colliders, skeletons, audio, and
|
|
220
|
+
bounds toggles; use `setHelperType()` through the SDK when you need one category.
|
|
221
|
+
|
|
222
|
+
### State
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
npm run --silent vgai -- status # Print full editor state as JSON
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
The `status` command returns:
|
|
229
|
+
- `playState` — `stopped`, `playing`, or `paused`
|
|
230
|
+
- `selectedEntityId` / `selectedEntityIds` — current selection
|
|
231
|
+
- `activeViewportTab` — `scene` or `game`
|
|
232
|
+
- `showGrid`, `showHelpers`, `showStats`, `shadingMode` — display state
|
|
233
|
+
- `transformMode`, `transformSpace`, `snapEnabled` — tool state
|
|
234
|
+
- `entityCount` — number of entities in the scene
|
|
235
|
+
- `savePath` — path to the currently open scene file
|
|
236
|
+
- `connected` — whether an editor browser tab is live right now; if
|
|
237
|
+
`false`, everything else in the payload is a cached snapshot (see the
|
|
238
|
+
precondition note above)
|
|
239
|
+
|
|
240
|
+
### Verification — the LIVE playtest, in as many seats as it needs
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
npm run --silent vgai -- eval 'return game.run(async ({ modules }) => { const mechanic = await modules("src/sim/<mechanic>.ts"); mechanic.<setup>(); return mechanic.<read>(); })'
|
|
244
|
+
npm run --silent vgai -- eval 'return game.run(async ({ modules }) => { const tester = await modules("src/bot/tester-station.ts"); return tester.hireTester("<goal>"); })'
|
|
245
|
+
npm run --silent vgai -- eval 'return game.run(async ({ modules }) => { const tester = await modules("src/bot/tester-station.ts"); return tester.describeTester(); })'
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Verification IS the interactive playtest: cheats set the situation, the
|
|
249
|
+
resident tester runs behavior, the event log is read on an interval, and the
|
|
250
|
+
run is redirected until the operator is satisfied. Games
|
|
251
|
+
are fundamentally unpredictable in behavior, so there are no spec files and
|
|
252
|
+
no committed route scripts — the play log (`logs/play-*.jsonl`) is the
|
|
253
|
+
receipt. Repeat with varied seeds, goals and dials; that variation is how
|
|
254
|
+
coverage grows.
|
|
255
|
+
|
|
256
|
+
A multiplayer game is the same playtest in more than one SEAT — instances of
|
|
257
|
+
this game side by side in one editor, each addressed from your program, so
|
|
258
|
+
you can watch them play each other. It is not a different kind of test, and
|
|
259
|
+
it never needs a second browser or a synthetic second player.
|
|
260
|
+
|
|
261
|
+
The playtest loop (exported setup/read functions, the tester's repertoire, and
|
|
262
|
+
sim-time budgets) is documented in the sibling
|
|
263
|
+
`.agents/references/project-manual.md`.
|
|
264
|
+
|
|
265
|
+
Reading and driving the game's own modules is **`npx volter-game-editor eval`'s job,
|
|
266
|
+
permanently**, not a gap waiting on more CLI verbs. A game names its own
|
|
267
|
+
functions, which is exactly why the door is general.
|
|
268
|
+
|
|
269
|
+
### Global Options
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
--url <url> # Editor URL (default: http://localhost:5173)
|
|
273
|
+
# Also: VGAI_EDITOR_URL env var
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
## Entity IDs
|
|
277
|
+
|
|
278
|
+
Entity ids are minted by the active authoring adapter (a three world's are
|
|
279
|
+
keyed on the OID its source carries — stable across reloads). To find one:
|
|
280
|
+
|
|
281
|
+
1. `npm run --silent vgai -- eval 'return editor.hierarchy()'` — the hierarchy panel's
|
|
282
|
+
rows as data, each with its `id` and label
|
|
283
|
+
2. Use that id with `editor.select("<id>")` / `editor.focus("<id>")` through
|
|
284
|
+
`npx volter-game-editor eval`
|
|
285
|
+
|
|
286
|
+
## Typical Workflows
|
|
287
|
+
|
|
288
|
+
### Start a new project from scratch
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
npm run --silent vgai -- create "My Platformer"
|
|
292
|
+
cd my-platformer
|
|
293
|
+
npm run --silent vgai -- edit .
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Show the user an entity you just created/modified
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
# After editing the world's TSX source — select and frame the entity in one round trip:
|
|
300
|
+
npm run --silent vgai -- eval 'await editor.select("<entity-id>"); await editor.focus()'
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Test gameplay
|
|
304
|
+
|
|
305
|
+
```bash
|
|
306
|
+
npm run --silent vgai -- play
|
|
307
|
+
npm run --silent vgai -- eval 'return game.run(async ({ modules }) => { const mechanic = await modules("src/sim/<mechanic>.ts"); mechanic.<setup>(); return mechanic.<read>(); })'
|
|
308
|
+
npm run --silent vgai -- eval 'return game.run(async ({ modules }) => { const tester = await modules("src/bot/tester-station.ts"); return tester.hireTester("<goal>"); })'
|
|
309
|
+
npm run --silent vgai -- eval 'await game.waitSimTime({simSeconds: 5})'
|
|
310
|
+
npm run --silent vgai -- eval 'return game.run(async ({ modules }) => { const mechanic = await modules("src/sim/<mechanic>.ts"); return mechanic.<read>(); })'
|
|
311
|
+
npm run --silent vgai -- screenshot # and LOOK at the pixels
|
|
312
|
+
npm run --silent vgai -- restart # after an init-time source change
|
|
313
|
+
npm run --silent vgai -- stop
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
Arrange and read through the mechanic's own exported functions; let the
|
|
317
|
+
resident tester drive player input. Both halves matter: the scene graph can
|
|
318
|
+
agree with your intent while the module readout every other tool consumes
|
|
319
|
+
disagrees.
|
|
320
|
+
|
|
321
|
+
### Debug a specific view angle
|
|
322
|
+
|
|
323
|
+
```bash
|
|
324
|
+
npm run --silent vgai -- eval 'await editor.view("top"); await editor.shading("wireframe"); await editor.helpers(true)'
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
## SDK (Programmatic Access)
|
|
328
|
+
|
|
329
|
+
For TypeScript automation, use **`@volter/game-live`** — the same surface `npx volter-game-editor eval`
|
|
330
|
+
binds, so anything you prototyped at the command line moves into a script
|
|
331
|
+
unchanged:
|
|
332
|
+
|
|
333
|
+
```typescript
|
|
334
|
+
import { connect } from '@volter/game-live';
|
|
335
|
+
|
|
336
|
+
const { editor, game, tools, session } = await connect();
|
|
337
|
+
await editor.play();
|
|
338
|
+
await game.run(async ({ modules }) => {
|
|
339
|
+
const arena = await modules('src/sim/arena.ts');
|
|
340
|
+
arena.setupBossWave();
|
|
341
|
+
const tester = await modules('src/bot/tester-station.ts');
|
|
342
|
+
tester.hireTester('sweep');
|
|
343
|
+
});
|
|
344
|
+
await game.waitSimTime({ simSeconds: 4 });
|
|
345
|
+
const player = await game.run(async ({ modules }) => {
|
|
346
|
+
const arena = await modules('src/sim/arena.ts');
|
|
347
|
+
return arena.readPlayer();
|
|
348
|
+
});
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
`connect()` ATTACHES to a session `npx volter-game-editor edit` is already serving — it never
|
|
352
|
+
starts one, and fails with a clear "run `npx volter-game-editor edit` first" rather than silently
|
|
353
|
+
booting a second editor. Top-level `editor` / `game` / `page` / `tools`
|
|
354
|
+
singletons are also exported for one-liners.
|
|
355
|
+
|
|
356
|
+
`@volter/editor-sdk`'s `EditorClient` is the lower layer underneath, and remains
|
|
357
|
+
the right import for editor-only automation that has no game running — plus the
|
|
358
|
+
handful of project-management calls (`createProject()`, `openProject()`,
|
|
359
|
+
`getProject()`, `listRecentProjects()`) that `@volter/editor-live` does not re-expose.
|
|
360
|
+
|
|
361
|
+
Run `npm run --silent vgai -- eval --list` for the current member list on every binding.
|
|
362
|
+
It walks the live objects at runtime, so it is accurate in a way this page
|
|
363
|
+
cannot promise to be.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vgai-3d-models
|
|
3
|
+
description: Model and revise game props with ordinary Blender Python through the Blender MCP and export the asset for a reusable Three.js prefab. Use when asked to model a prop, shape, machine, or other game object. For placement, stories and gameplay use vgai-3d-assets; for procedural geometry generated during gameplay use ordinary Three.js.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Model a game asset
|
|
7
|
+
|
|
8
|
+
You are using **Blender in the browser** through the project's Blender MCP.
|
|
9
|
+
Use `execute_blender_code`, `get_scene_info`, `get_object_info`, and
|
|
10
|
+
`get_viewport_screenshot` with ordinary `bpy`, `bmesh` and `mathutils` Python.
|
|
11
|
+
Blender coordinates are **Z-up**, distances are metres, and angles are radians.
|
|
12
|
+
|
|
13
|
+
Start the game's editor with `npm run dev` **in the background**, keep it running
|
|
14
|
+
while authoring, and tell the user its URL. Connect the project's `blender`
|
|
15
|
+
server in `.mcp.json` (`npm run --silent vgai -- blender-mcp`).
|
|
16
|
+
The **Model** document is your Blender viewport; the **Scene** composes game
|
|
17
|
+
objects. Inspect the model there, then inspect its placement in the game.
|
|
18
|
+
|
|
19
|
+
## Model, inspect, refine
|
|
20
|
+
|
|
21
|
+
Work normally in Blender through MCP. Inspect the scene, construct and revise the
|
|
22
|
+
asset, and check screenshots and object bounds as you work. Use meaningful object
|
|
23
|
+
names, parenting and local origins for parts the game must manipulate separately.
|
|
24
|
+
Use project-relative paths for input assets and exports.
|
|
25
|
+
|
|
26
|
+
## Export and place
|
|
27
|
+
|
|
28
|
+
Export the intended asset to `public/models/<asset>.glb` using
|
|
29
|
+
`bpy.ops.export_scene.gltf`, normally `export_format='GLB'`,
|
|
30
|
+
`use_selection=True`, `export_apply=True`. Select only its intended objects.
|
|
31
|
+
The exporter converts Blender's Z-up to glTF's Y-up; do not rotate it again.
|
|
32
|
+
Inspect the exported asset in the game's lighting: a Blender render alone does
|
|
33
|
+
not prove the game appearance, textures, rig or animations survived export.
|
|
34
|
+
|
|
35
|
+
Create `src/prefabs/<Asset>.tsx` and a colocated CSF story, following the
|
|
36
|
+
starter's `HeroBox.tsx` / `HeroBox.stories.tsx` shape. Use ordinary drei
|
|
37
|
+
`useGLTF` and `Clone` for a static model so two placements get separate object
|
|
38
|
+
instances. The public asset is addressed as `/models/<asset>.glb`.
|
|
39
|
+
The prefab owns collisions, interactions and named attachment points. Its story
|
|
40
|
+
makes it discoverable in Content. The scene places the prefab.
|
|
41
|
+
|
|
42
|
+
For an asset revision, edit it in Blender and re-export to the same asset path.
|
|
43
|
+
Check its game placements and preserve the selected starter's studio and
|
|
44
|
+
verification requirements. Before handoff, run the game's build and inspect the
|
|
45
|
+
exported game. Keep input assets and runtime exports in version control;
|
|
46
|
+
keep scratch files in `.vgai/tmp/`.
|
|
47
|
+
|
|
48
|
+
For animation and skinning, also read `vgai-animation-assets`; a static mesh
|
|
49
|
+
export is not proof that an animated character is game-ready.
|
|
50
|
+
|
|
51
|
+
## Where the model lives
|
|
52
|
+
|
|
53
|
+
A model is a `.blend` under `src/models/`, and the bpy script that authored it
|
|
54
|
+
is an ordinary project file beside it (`cube.blend` / `cube.py`) — the script
|
|
55
|
+
is the asset's SOURCE, the `.blend` is what the Model document opens, and the
|
|
56
|
+
session saves the document about a second after your last call. Author through
|
|
57
|
+
this MCP; the document does not run your script for you.
|
|
58
|
+
|
|
59
|
+
## When geometry generation is gameplay
|
|
60
|
+
|
|
61
|
+
Use ordinary Three.js/R3F in the game for runtime procedural geometry — that
|
|
62
|
+
is gameplay, not an asset. Existing TypeScript model builders stay project-owned
|
|
63
|
+
code; for an operation's exact TypeScript signature, look up its one row in
|
|
64
|
+
Blender's own `bpy.ops.mesh` / `bmesh.ops` documentation — this skill deliberately keeps no second table of them.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vgai-ingest-existing-game
|
|
3
|
+
description: >
|
|
4
|
+
Take an existing, unmodified web game (three.js, PixiJS, or React) to FULL
|
|
5
|
+
vgai editor integration: mount it through the adapter seam, declare its
|
|
6
|
+
real capabilities through the game contract, drive every adapter slot to a
|
|
7
|
+
terminal state (implemented, or verified implemented-empty), and prove it
|
|
8
|
+
live through the product's own doors. Use when asked to ingest, adapt,
|
|
9
|
+
integrate, or "make the editor work with" a game that already exists —
|
|
10
|
+
vendored reference games in this repo, or a user's own game folder. Do not
|
|
11
|
+
use for building a NEW game (scaffold instead) or for non-web runtimes
|
|
12
|
+
(Godot/Roblox translate through the import lanes, not ingestion).
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Ingest an existing game — to closure, not to mount
|
|
16
|
+
|
|
17
|
+
**The manual is `docs/BRINGING-AN-EXISTING-GAME.md` — read the section
|
|
18
|
+
titled "The ingestion checklist — what done means" FIRST** (search for that
|
|
19
|
+
heading; the file is long) and keep it open — this skill is the operational
|
|
20
|
+
spine over that checklist, not a replacement. The doctrine that binds you is
|
|
21
|
+
in `docs/ARCHITECTURE-CORE.md` §the adapter seam: every capability slot ends
|
|
22
|
+
**implemented** or **implemented-empty** (a positively-answered, evidence-
|
|
23
|
+
backed absence). "Honest gap" is not an outcome; coverage warnings are work
|
|
24
|
+
orders. Mounting the game is STEP ONE of seven, not the deliverable.
|
|
25
|
+
|
|
26
|
+
## The worked references — read before writing anything
|
|
27
|
+
|
|
28
|
+
- `public/ingest/simcity/` and `public/ingest/server-survival/` — closure
|
|
29
|
+
with ZERO patches: everything bound off the game's published `window`
|
|
30
|
+
objects; the navigation slots show the host-computation form (host BFS
|
|
31
|
+
over the game's own public graph, labeled as the host's in so many
|
|
32
|
+
words).
|
|
33
|
+
- The contract shapes: `packages/project/src/adapter/ingest/game-contract.ts`
|
|
34
|
+
(root · lifecycle · systems.commands/state/hierarchy · systemAdapters) and
|
|
35
|
+
`contract-system-adapters.ts` (the projection that rejects malformed
|
|
36
|
+
claims — a `present` missing required members, or an `empty` without
|
|
37
|
+
evidence, is loudly refused).
|
|
38
|
+
|
|
39
|
+
## Two record-honesty rules, both bought with a measured failure
|
|
40
|
+
|
|
41
|
+
- **Re-derive every host-gap claim in the target's existing record against
|
|
42
|
+
current host source before believing it.** A vendored game's UPSTREAM.md
|
|
43
|
+
is a snapshot: server-survival's said capture was impossible on its three
|
|
44
|
+
version, while the host's structural recognition had long since fixed
|
|
45
|
+
exactly that — and named the game in its docblock. Ask the positive
|
|
46
|
+
question ("how does the host do this today?") against the code; a stale
|
|
47
|
+
note read as truth ends the task early and wrongly.
|
|
48
|
+
- **A reference's literal values are not conventions.** `captureTimeoutMs`
|
|
49
|
+
means "when to REPORT the degrade" (the subscription stays live) and is
|
|
50
|
+
clamped by the adapter — copying a reference's number copies a dead
|
|
51
|
+
number. When a field's meaning matters, read its owner's module header.
|
|
52
|
+
|
|
53
|
+
## The workflow
|
|
54
|
+
|
|
55
|
+
1. **Mount (checklist A–B).** Manifest with an `{ ingest }` root beside the
|
|
56
|
+
game; open through the session (`npx volter-game-editor edit <folder>` — a local editor
|
|
57
|
+
rejects URL params); pin CDN importmaps if any (pattern 4, a recorded
|
|
58
|
+
patch for vendored copies, an ordinary edit in a user's own folder).
|
|
59
|
+
2. **Read the game's real surface before declaring anything.** Its exports,
|
|
60
|
+
its `window` publications, its module structure. Candidate bindings come
|
|
61
|
+
from what the game actually owns — the anti-shim rule: never fabricate a
|
|
62
|
+
datum the game has no referent for. Host-computed queries over the
|
|
63
|
+
game's own data are legitimate and labeled as the host's (simcity's
|
|
64
|
+
navigation); invented facts are not (a fake `disconnected` status).
|
|
65
|
+
3. **Contract (checklist C).** Shim (`ingest.contractShim`) for a copy that
|
|
66
|
+
must stay pristine; recorded patches or direct edits for an owned one.
|
|
67
|
+
Declare only what you traced; guards replicate the game's own
|
|
68
|
+
preconditions. Verbs that crash the game when invoked externally are
|
|
69
|
+
worse than no verbs. State providers are SYNCHRONOUS (the bridge puts
|
|
70
|
+
`debug.state(key)` straight into its reply; a Promise serializes as
|
|
71
|
+
`{}`).
|
|
72
|
+
4. **The refusal worklist (checklist D).** Everything unreachable is
|
|
73
|
+
recorded per-symbol with evidence — then CLOSED: a minimal accessor
|
|
74
|
+
patch (pattern 2) where the game has the value, or implemented-empty
|
|
75
|
+
where it genuinely doesn't. A wrong empty claim is a defect; so is a
|
|
76
|
+
refusal left sitting.
|
|
77
|
+
5. **The FOUR declarable SystemAdapters slots (checklist F).** physics ·
|
|
78
|
+
networking · navigation · audio — each bound through
|
|
79
|
+
`systems.systemAdapters` or declared `{ present: false, evidence }`,
|
|
80
|
+
where the evidence is a grep/read another agent can re-run. The other
|
|
81
|
+
two slots are NOT yours to declare: `debug` is projected from your
|
|
82
|
+
`commands`/`state` (a second door would allow two conflicting debug
|
|
83
|
+
planes), and `renderDebug` is engine-owned, auto-registered from the
|
|
84
|
+
captured renderer — declaring either is a malformed claim the
|
|
85
|
+
projection rejects. Beware the two traps measured on the references: a
|
|
86
|
+
game with a REAL subsystem you almost claimed empty (a
|
|
87
|
+
pathfinder buried in an AI module), and a subsystem-shaped thing that isn't one (simcity's
|
|
88
|
+
random-walk cars are not pathfinding — but its public road graph still
|
|
89
|
+
made the slot bindable).
|
|
90
|
+
6. **Verify live (checklist G).** Through the product's doors only:
|
|
91
|
+
`npx volter-game-editor eval 'game.commands()'`, drive a verb, read state, ⏸/▶ (pause
|
|
92
|
+
must freeze what the game's own pause freezes; input must gate), the
|
|
93
|
+
coverage rows on `npx volter-game-editor status`. Never synthetic key events, never raw
|
|
94
|
+
window reads — the eval seam exists so that is never necessary. (In a
|
|
95
|
+
sandboxed worktree where the CLI's eval form is blocked, the same door
|
|
96
|
+
is `@volter/game-live`'s `connect()` from a script INSIDE the worktree, run
|
|
97
|
+
with `npx tsx`.)
|
|
98
|
+
7. **The ledger.** For vendored copies: lock updated (host-added hashes,
|
|
99
|
+
patches with reverse-apply), `node vendor/games/verify-unaltered.mjs`
|
|
100
|
+
green, UPSTREAM.md carrying every binding and every empty claim with
|
|
101
|
+
its evidence. For a user's folder: the diffs are theirs, visible in
|
|
102
|
+
their own git.
|
|
103
|
+
|
|
104
|
+
## What done means
|
|
105
|
+
|
|
106
|
+
Every checklist row terminal; the coverage report on a live mount shows no
|
|
107
|
+
open work orders except rows the HOST
|
|
108
|
+
currently owes (a row whose honest answer is blocked by a missing or
|
|
109
|
+
defective host seam is a host work order — name it precisely in your
|
|
110
|
+
report, with the read that proves it, and do NOT shim around it per-game;
|
|
111
|
+
a decoy that makes a host instrument read green is fabrication). The total
|
|
112
|
+
cost is written down (manifest + shim + N patched lines).
|