@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,475 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `project.bake.preview` — the module LOOK.
|
|
3
|
+
*
|
|
4
|
+
* The read-only sibling of `project.bake.module`. Same front half exactly
|
|
5
|
+
* (`module-source.ts`: the path-escape guard, the dynamic import,
|
|
6
|
+
* the builder call, the typed refusals), then it stops where the bake begins:
|
|
7
|
+
* the exported GLB stays IN MEMORY and is handed to the live editor session,
|
|
8
|
+
* which rasterizes it into the standard four-view contact sheet. Nothing is
|
|
9
|
+
* written under `public/`, no provenance record is created, and the project's
|
|
10
|
+
* asset namespace is untouched — a look is not an export
|
|
11
|
+
* (ARCHITECTURE-CORE §Agent surface, the look-verb decision).
|
|
12
|
+
*
|
|
13
|
+
* The PNGs land under `<project>/.vgai/screenshots/` — the same
|
|
14
|
+
* machine-written-evidence namespace `vgai screenshot` already writes to,
|
|
15
|
+
* beside the run artifacts and the session file, and gitignored like the rest of
|
|
16
|
+
* it.
|
|
17
|
+
*
|
|
18
|
+
* A live session is REQUIRED and cannot be worked around: Node has no GPU, so
|
|
19
|
+
* "build the model here, photograph it there" is the whole shape of this
|
|
20
|
+
* tool. With no session it refuses by name and points at `vgai edit`, rather
|
|
21
|
+
* than building an Object3D nobody will ever see.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
25
|
+
import { basename, join } from 'node:path';
|
|
26
|
+
import { ToolError } from '@volter/editor-sdk/tools/errors';
|
|
27
|
+
import { defineTool, type ToolErrorDefinition } from '@volter/editor-sdk/tools/registry';
|
|
28
|
+
import * as THREE from 'three';
|
|
29
|
+
import { z } from 'zod';
|
|
30
|
+
import {
|
|
31
|
+
assertRenderableGeometry,
|
|
32
|
+
buildFromModule,
|
|
33
|
+
computeMeshStats,
|
|
34
|
+
countMeshes,
|
|
35
|
+
EMPTY_GEOMETRY_ERROR,
|
|
36
|
+
EXPORT_NOT_CALLABLE_ERROR,
|
|
37
|
+
MODULE_NOT_FOUND_ERROR,
|
|
38
|
+
NOT_AN_OBJECT3D_ERROR,
|
|
39
|
+
PATH_ESCAPES_PROJECT_ERROR,
|
|
40
|
+
} from '../contributions/module-source';
|
|
41
|
+
import { exportObject3DToGlb, installNodeThreePolyfills } from '../lib/bake/gltf-bake';
|
|
42
|
+
import { disposeObject3D } from '../lib/bake/object3d-lifecycle';
|
|
43
|
+
|
|
44
|
+
const LIVE_MODULE = '@volter/editor-live';
|
|
45
|
+
|
|
46
|
+
export const NO_EDITOR_SESSION_ERROR: ToolErrorDefinition = {
|
|
47
|
+
code: 'NO_EDITOR_SESSION',
|
|
48
|
+
summary:
|
|
49
|
+
'No live editor session for this project — rasterization happens in the editor, so a look ' +
|
|
50
|
+
'is impossible without one. Run `vgai edit <project>`.',
|
|
51
|
+
data: z.object({ projectRoot: z.string(), reason: z.string() }),
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export const INVALID_LOOK_PARAMS_ERROR: ToolErrorDefinition = {
|
|
55
|
+
code: 'INVALID_LOOK_PARAMS',
|
|
56
|
+
summary:
|
|
57
|
+
'The look parameters contradict each other: `time` requires `clip`, and `orbit` stages ' +
|
|
58
|
+
'its own cameras so it cannot combine with azimuth/elevation/distance/clip/time.',
|
|
59
|
+
data: z.object({ orbit: z.number().optional(), time: z.number().optional() }),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export const BakePreviewInputSchema = z.object({
|
|
63
|
+
modulePath: z
|
|
64
|
+
.string()
|
|
65
|
+
.min(1)
|
|
66
|
+
.describe(
|
|
67
|
+
'Project-relative (or absolute, inside the project) path to a TypeScript module that ' +
|
|
68
|
+
'exports a builder function returning a native THREE.Object3D — the same module ' +
|
|
69
|
+
'reference `project.bake.module` takes.',
|
|
70
|
+
),
|
|
71
|
+
exportName: z
|
|
72
|
+
.string()
|
|
73
|
+
.min(1)
|
|
74
|
+
.default('default')
|
|
75
|
+
.describe("Name of the module export to call. Defaults to the module's default export."),
|
|
76
|
+
size: z
|
|
77
|
+
.number()
|
|
78
|
+
.int()
|
|
79
|
+
.positive()
|
|
80
|
+
.optional()
|
|
81
|
+
.describe('Square pixel size of each view (editor default when omitted).'),
|
|
82
|
+
background: z
|
|
83
|
+
.enum(['neutral', 'transparent'])
|
|
84
|
+
.optional()
|
|
85
|
+
.describe("Asset Lab backdrop for every view (editor default 'neutral' when omitted)."),
|
|
86
|
+
orbit: z
|
|
87
|
+
.number()
|
|
88
|
+
.int()
|
|
89
|
+
.min(2)
|
|
90
|
+
.max(24)
|
|
91
|
+
.optional()
|
|
92
|
+
.describe(
|
|
93
|
+
'Walk around the model instead of taking the four fixed views: this many frames at ' +
|
|
94
|
+
'evenly spaced headings, written as orbit-01.png… with a contact sheet. Every frame ' +
|
|
95
|
+
'shares one framing scale, so the subject holds still while the camera moves.',
|
|
96
|
+
),
|
|
97
|
+
azimuth: z
|
|
98
|
+
.number()
|
|
99
|
+
.finite()
|
|
100
|
+
.optional()
|
|
101
|
+
.describe(
|
|
102
|
+
'Free capture camera: ONE view from this heading in degrees (0 = the model\u2019s ' +
|
|
103
|
+
'declared front, same convention as the turntable yaw) instead of the four fixed ' +
|
|
104
|
+
'views. Combines with elevation/distance; cannot combine with orbit.',
|
|
105
|
+
),
|
|
106
|
+
elevation: z
|
|
107
|
+
.number()
|
|
108
|
+
.min(-90)
|
|
109
|
+
.max(90)
|
|
110
|
+
.optional()
|
|
111
|
+
.describe('Free capture camera elevation in degrees above level (defaults to 0).'),
|
|
112
|
+
distance: z
|
|
113
|
+
.number()
|
|
114
|
+
.positive()
|
|
115
|
+
.optional()
|
|
116
|
+
.describe(
|
|
117
|
+
'Free capture camera distance in meters from the framing center (auto-fit when omitted).',
|
|
118
|
+
),
|
|
119
|
+
clip: z
|
|
120
|
+
.string()
|
|
121
|
+
.min(1)
|
|
122
|
+
.optional()
|
|
123
|
+
.describe(
|
|
124
|
+
'Pose the model with this named animation clip (from the builder\u2019s own ' +
|
|
125
|
+
'`root.animations`) before capturing. Fails loudly naming the clips that exist.',
|
|
126
|
+
),
|
|
127
|
+
time: z
|
|
128
|
+
.number()
|
|
129
|
+
.min(0)
|
|
130
|
+
.optional()
|
|
131
|
+
.describe('Clip time in seconds to sample the pose at (defaults to 0; requires clip).'),
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* The `--orbit <n>` shot set: n turntable headings, evenly spaced, starting at
|
|
136
|
+
* the front. Zero-padded labels because they are also FILENAMES, and
|
|
137
|
+
* `orbit-10` sorting before `orbit-2` is how a contact sheet's reading order
|
|
138
|
+
* stops matching the camera's.
|
|
139
|
+
*/
|
|
140
|
+
export function orbitShotSet(frames: number): {
|
|
141
|
+
name: string;
|
|
142
|
+
shots: Array<{ label: string; view: 'turntable'; yaw: number }>;
|
|
143
|
+
} {
|
|
144
|
+
const width = String(frames).length;
|
|
145
|
+
return {
|
|
146
|
+
name: 'orbit',
|
|
147
|
+
shots: Array.from({ length: frames }, (_, index) => ({
|
|
148
|
+
label: `orbit-${String(index + 1).padStart(Math.max(2, width), '0')}`,
|
|
149
|
+
view: 'turntable' as const,
|
|
150
|
+
yaw: (index * Math.PI * 2) / frames,
|
|
151
|
+
})),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export const BakePreviewResultSchema = z.object({
|
|
156
|
+
directory: z
|
|
157
|
+
.string()
|
|
158
|
+
.describe('Project-relative directory the PNGs were written to, under .vgai/screenshots/.'),
|
|
159
|
+
files: z
|
|
160
|
+
.array(z.string())
|
|
161
|
+
.describe(
|
|
162
|
+
'Project-relative paths of every PNG written — the four views (or the orbit frames) ' +
|
|
163
|
+
'plus the contact sheet.',
|
|
164
|
+
),
|
|
165
|
+
contactSheet: z.string().describe('Project-relative path of the contact sheet PNG.'),
|
|
166
|
+
emptyFrames: z
|
|
167
|
+
.array(z.object({ label: z.string(), message: z.string() }))
|
|
168
|
+
.optional()
|
|
169
|
+
.describe(
|
|
170
|
+
'Orbit frames that framed no geometry. Written anyway — a background-only PNG reads as ' +
|
|
171
|
+
'coverage on a contact sheet unless something says otherwise — and never fatal.',
|
|
172
|
+
),
|
|
173
|
+
width: z.number().describe('Pixel width of each view, as the editor rendered it.'),
|
|
174
|
+
height: z.number().describe('Pixel height of each view, as the editor rendered it.'),
|
|
175
|
+
vertexCount: z.number().describe('Vertices in the built Object3D, counted on the source graph.'),
|
|
176
|
+
triangleCount: z
|
|
177
|
+
.number()
|
|
178
|
+
.describe('Triangles in the built Object3D, counted on the source graph.'),
|
|
179
|
+
meshCount: z.number().describe('Meshes in the built Object3D, counted on the source graph.'),
|
|
180
|
+
boundaryEdgeCount: z
|
|
181
|
+
.number()
|
|
182
|
+
.describe(
|
|
183
|
+
'Edges with one triangle after welding by position: holes, unclosed caps, parts never ' +
|
|
184
|
+
'joined. A closed game asset has zero; the bench shipped 343 unnoticed.',
|
|
185
|
+
),
|
|
186
|
+
boundaryEdgeSamples: z
|
|
187
|
+
.array(z.tuple([z.number(), z.number(), z.number()]))
|
|
188
|
+
.describe('World-space midpoints of up to six open edges — where to look, not just how many.'),
|
|
189
|
+
nonFiniteVertexCount: z
|
|
190
|
+
.number()
|
|
191
|
+
.describe(
|
|
192
|
+
'Vertices whose position is NaN or infinite — a normalize() of a zero vector, a division by ' +
|
|
193
|
+
'zero in build(), a degenerate face through a kit op. Three.js only says "computeBoundingBox: ' +
|
|
194
|
+
'NaN values"; this is the count, so the look can name it.',
|
|
195
|
+
),
|
|
196
|
+
bounds: z
|
|
197
|
+
.object({
|
|
198
|
+
min: z.tuple([z.number(), z.number(), z.number()]),
|
|
199
|
+
max: z.tuple([z.number(), z.number(), z.number()]),
|
|
200
|
+
})
|
|
201
|
+
.describe(
|
|
202
|
+
'World-space bounding box of the built Object3D, metres, Y up — the facts a brief states ' +
|
|
203
|
+
'("0.9 m tall, base at y = 0") answered by the look itself instead of a second door.',
|
|
204
|
+
),
|
|
205
|
+
invertedTriangleCount: z
|
|
206
|
+
.number()
|
|
207
|
+
.describe(
|
|
208
|
+
'Triangles facing INWARD: inside-out closed shells plus non-contiguous winding pairs — what ' +
|
|
209
|
+
"Blender's Face Orientation overlay paints red. The stage lights both sides, so the PNGs " +
|
|
210
|
+
'cannot show these; a non-zero count is a defect the picture hides.',
|
|
211
|
+
),
|
|
212
|
+
glbBytes: z
|
|
213
|
+
.number()
|
|
214
|
+
.describe('Size of the in-memory GLB that was photographed. It was never written to disk.'),
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
/** A `@volter/editor-live` session, narrowed to the one call this tool makes. Declared
|
|
218
|
+
* structurally so the capability takes no build-time dependency on the
|
|
219
|
+
* session client. */
|
|
220
|
+
interface LivePreviewCapture {
|
|
221
|
+
width: number;
|
|
222
|
+
height: number;
|
|
223
|
+
views: Array<{ view: string; base64: string }>;
|
|
224
|
+
contactSheet: { base64: string };
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
interface LivePreviewShotSetCapture {
|
|
228
|
+
width: number;
|
|
229
|
+
height: number;
|
|
230
|
+
shots: Array<{ label: string; base64: string }>;
|
|
231
|
+
warnings?: Array<{ label: string; message: string }>;
|
|
232
|
+
contactSheet: { base64: string };
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
interface LivePreviewSession {
|
|
236
|
+
editor: {
|
|
237
|
+
assetPreview(
|
|
238
|
+
source: { glbBase64: string },
|
|
239
|
+
options?: { width?: number; height?: number; background?: 'neutral' | 'transparent' },
|
|
240
|
+
): Promise<LivePreviewCapture>;
|
|
241
|
+
assetPreviewShots(
|
|
242
|
+
source: { glbBase64: string },
|
|
243
|
+
definition: { name: string; shots: Array<{ label: string; view: 'turntable'; yaw: number }> },
|
|
244
|
+
options?: { width?: number; height?: number; background?: 'neutral' | 'transparent' },
|
|
245
|
+
): Promise<LivePreviewShotSetCapture>;
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/** `src/models/goblin.ts` + `buildGoblin` -> `goblin-buildgoblin`; the default
|
|
250
|
+
* export contributes no suffix. Lowercased and stripped to the same character
|
|
251
|
+
* class an asset name uses, so the directory is always a plain path segment. */
|
|
252
|
+
export function bakePreviewSlug(modulePath: string, exportName: string): string {
|
|
253
|
+
const stem = basename(modulePath).replace(/\.[^.]+$/, '');
|
|
254
|
+
const raw = exportName === 'default' ? stem : `${stem}-${exportName}`;
|
|
255
|
+
const slug = raw
|
|
256
|
+
.toLowerCase()
|
|
257
|
+
.replace(/[^a-z0-9-_]+/g, '-')
|
|
258
|
+
.replace(/^-+|-+$/g, '');
|
|
259
|
+
return slug === '' ? 'module' : slug.slice(0, 64);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
function base64FromBytes(bytes: Uint8Array): string {
|
|
263
|
+
let binary = '';
|
|
264
|
+
for (let offset = 0; offset < bytes.length; offset += 0x8000) {
|
|
265
|
+
binary += String.fromCharCode(...bytes.subarray(offset, offset + 0x8000));
|
|
266
|
+
}
|
|
267
|
+
return btoa(binary);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Build the module's Object3D and export it to an in-memory GLB. Exported for
|
|
272
|
+
* the headless acceptance test: this is the whole Node half, and it is the
|
|
273
|
+
* half that can be proven without a GPU.
|
|
274
|
+
*/
|
|
275
|
+
export async function buildModuleGlbBytes(
|
|
276
|
+
projectRoot: string,
|
|
277
|
+
modulePath: string,
|
|
278
|
+
exportName: string,
|
|
279
|
+
loadModule?: (absolutePath: string) => Promise<unknown>,
|
|
280
|
+
): Promise<{
|
|
281
|
+
glb: Uint8Array;
|
|
282
|
+
vertexCount: number;
|
|
283
|
+
triangleCount: number;
|
|
284
|
+
invertedTriangleCount: number;
|
|
285
|
+
boundaryEdgeCount: number;
|
|
286
|
+
boundaryEdgeSamples: [number, number, number][];
|
|
287
|
+
nonFiniteVertexCount: number;
|
|
288
|
+
meshCount: number;
|
|
289
|
+
bounds: { min: [number, number, number]; max: [number, number, number] };
|
|
290
|
+
}> {
|
|
291
|
+
const restoreGlobals = installNodeThreePolyfills();
|
|
292
|
+
let build: Awaited<ReturnType<typeof buildFromModule>> | undefined;
|
|
293
|
+
try {
|
|
294
|
+
build = await buildFromModule(projectRoot, modulePath, exportName, loadModule);
|
|
295
|
+
const root = build.root;
|
|
296
|
+
const stats = computeMeshStats(root);
|
|
297
|
+
assertRenderableGeometry(stats, modulePath, exportName);
|
|
298
|
+
const meshCount = countMeshes(root);
|
|
299
|
+
// Same carrier as the bake lane: the module's own `Object3D.animations`.
|
|
300
|
+
// The preview GLB reaches the Asset Lab's animation transport, so a look
|
|
301
|
+
// at a builder with actions has to be a look at those actions too — an
|
|
302
|
+
// empty list here made every model module read as un-animated.
|
|
303
|
+
const glb = await exportObject3DToGlb(root, root.animations);
|
|
304
|
+
const box = new THREE.Box3().setFromObject(root);
|
|
305
|
+
const bounds = {
|
|
306
|
+
min: [box.min.x, box.min.y, box.min.z] as [number, number, number],
|
|
307
|
+
max: [box.max.x, box.max.y, box.max.z] as [number, number, number],
|
|
308
|
+
};
|
|
309
|
+
return { glb, ...stats, meshCount, bounds };
|
|
310
|
+
} finally {
|
|
311
|
+
// The builder's OWN teardown when it returned one (a rig's mixers/actions
|
|
312
|
+
// are invisible to a graph walk); otherwise the generic dispose.
|
|
313
|
+
if (build) {
|
|
314
|
+
if (build.dispose) build.dispose();
|
|
315
|
+
else disposeObject3D(build.root);
|
|
316
|
+
}
|
|
317
|
+
restoreGlobals();
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
export const tool = defineTool({
|
|
322
|
+
name: 'project.bake.preview',
|
|
323
|
+
summary: 'Look at a project Object3D module — build it headlessly and photograph it, no bake.',
|
|
324
|
+
description:
|
|
325
|
+
'Imports a project TypeScript module (`modulePath` + `exportName`), calls its exported ' +
|
|
326
|
+
'builder to get a native THREE.Object3D, exports it to an IN-MEMORY GLB, and hands those ' +
|
|
327
|
+
"bytes to the live editor session's Asset Lab for the standard four-view contact sheet — " +
|
|
328
|
+
'or, with `orbit`, for that many evenly spaced headings around the subject. ' +
|
|
329
|
+
'The PNGs are written under <project>/.vgai/screenshots/. Nothing is written under ' +
|
|
330
|
+
'public/, no provenance record is created, and no GLB reaches disk — this is the read-only ' +
|
|
331
|
+
'sibling of project.bake.module, for looking at a builder while iterating on it.',
|
|
332
|
+
input: BakePreviewInputSchema,
|
|
333
|
+
result: BakePreviewResultSchema,
|
|
334
|
+
errors: [
|
|
335
|
+
MODULE_NOT_FOUND_ERROR,
|
|
336
|
+
EXPORT_NOT_CALLABLE_ERROR,
|
|
337
|
+
NOT_AN_OBJECT3D_ERROR,
|
|
338
|
+
EMPTY_GEOMETRY_ERROR,
|
|
339
|
+
PATH_ESCAPES_PROJECT_ERROR,
|
|
340
|
+
NO_EDITOR_SESSION_ERROR,
|
|
341
|
+
INVALID_LOOK_PARAMS_ERROR,
|
|
342
|
+
],
|
|
343
|
+
requires: { project: true, editor: true },
|
|
344
|
+
host: 'node',
|
|
345
|
+
mutates: false,
|
|
346
|
+
supportsDryRun: false,
|
|
347
|
+
longRunning: true,
|
|
348
|
+
permission: {
|
|
349
|
+
risk: 'read',
|
|
350
|
+
summary:
|
|
351
|
+
'Imports and runs a project module, then writes look-only PNGs under .vgai/screenshots/. ' +
|
|
352
|
+
'Never touches the project asset namespace.',
|
|
353
|
+
},
|
|
354
|
+
async impl(input, ctx) {
|
|
355
|
+
const projectRoot = ctx.projectRoot;
|
|
356
|
+
if (!projectRoot) throw new Error('project.bake.preview requires a project root.');
|
|
357
|
+
|
|
358
|
+
// Node-hosted editor extension: load the session client only on
|
|
359
|
+
// invocation so the game's browser bundle never acquires a tooling edge.
|
|
360
|
+
// Resolve the session BEFORE building
|
|
361
|
+
// — a builder that takes seconds should not run just to discover there is
|
|
362
|
+
// nowhere to render it.
|
|
363
|
+
let session: LivePreviewSession;
|
|
364
|
+
try {
|
|
365
|
+
const { connect } = (await import(/* @vite-ignore */ LIVE_MODULE)) as {
|
|
366
|
+
connect(projectDir: string): Promise<LivePreviewSession>;
|
|
367
|
+
};
|
|
368
|
+
session = await connect(projectRoot);
|
|
369
|
+
} catch (error) {
|
|
370
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
371
|
+
throw new ToolError(
|
|
372
|
+
NO_EDITOR_SESSION_ERROR.code,
|
|
373
|
+
'project.bake.preview renders through the live editor session (Node has no GPU), and ' +
|
|
374
|
+
`none is open for this project. Run \`vgai edit ${projectRoot}\` first. (${reason})`,
|
|
375
|
+
{ projectRoot, reason },
|
|
376
|
+
);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
if (input.time !== undefined && input.clip === undefined) {
|
|
380
|
+
throw new ToolError(
|
|
381
|
+
INVALID_LOOK_PARAMS_ERROR.code,
|
|
382
|
+
'project.bake.preview: `time` poses a clip — pass `clip` with it.',
|
|
383
|
+
{ time: input.time },
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
const wantsCamera =
|
|
387
|
+
input.azimuth !== undefined || input.elevation !== undefined || input.distance !== undefined;
|
|
388
|
+
if (input.orbit !== undefined && (wantsCamera || input.clip !== undefined)) {
|
|
389
|
+
throw new ToolError(
|
|
390
|
+
INVALID_LOOK_PARAMS_ERROR.code,
|
|
391
|
+
'project.bake.preview: `orbit` stages its own cameras — it cannot combine with ' +
|
|
392
|
+
'azimuth/elevation/distance/clip/time.',
|
|
393
|
+
{ orbit: input.orbit },
|
|
394
|
+
);
|
|
395
|
+
}
|
|
396
|
+
const built = await buildModuleGlbBytes(
|
|
397
|
+
projectRoot,
|
|
398
|
+
input.modulePath,
|
|
399
|
+
input.exportName,
|
|
400
|
+
ctx.loadProjectModule,
|
|
401
|
+
);
|
|
402
|
+
const source = { glbBase64: base64FromBytes(built.glb) };
|
|
403
|
+
const options = {
|
|
404
|
+
...(input.size !== undefined ? { width: input.size, height: input.size } : {}),
|
|
405
|
+
...(input.background !== undefined ? { background: input.background } : {}),
|
|
406
|
+
...(wantsCamera
|
|
407
|
+
? {
|
|
408
|
+
camera: {
|
|
409
|
+
azimuthDegrees: input.azimuth ?? 0,
|
|
410
|
+
elevationDegrees: input.elevation ?? 0,
|
|
411
|
+
...(input.distance === undefined ? {} : { distance: input.distance }),
|
|
412
|
+
},
|
|
413
|
+
}
|
|
414
|
+
: {}),
|
|
415
|
+
...(input.clip === undefined
|
|
416
|
+
? {}
|
|
417
|
+
: { pose: { clip: input.clip, timeSeconds: input.time ?? 0 } }),
|
|
418
|
+
};
|
|
419
|
+
// One capture call either way; only which frames get named differs.
|
|
420
|
+
const orbit =
|
|
421
|
+
input.orbit === undefined
|
|
422
|
+
? null
|
|
423
|
+
: await session.editor.assetPreviewShots(source, orbitShotSet(input.orbit), options);
|
|
424
|
+
const capture = orbit ?? (await session.editor.assetPreview(source, options));
|
|
425
|
+
|
|
426
|
+
const directory = join(
|
|
427
|
+
'.vgai',
|
|
428
|
+
'screenshots',
|
|
429
|
+
`${bakePreviewSlug(input.modulePath, input.exportName)}-${new Date()
|
|
430
|
+
.toISOString()
|
|
431
|
+
.replace(/[:.]/g, '-')}`,
|
|
432
|
+
);
|
|
433
|
+
await mkdir(join(projectRoot, directory), { recursive: true });
|
|
434
|
+
const files: string[] = [];
|
|
435
|
+
const frames = orbit
|
|
436
|
+
? orbit.shots.map((shot) => ({ name: shot.label, base64: shot.base64 }))
|
|
437
|
+
: (capture as LivePreviewCapture).views.map((view) => ({
|
|
438
|
+
name: view.view,
|
|
439
|
+
base64: view.base64,
|
|
440
|
+
}));
|
|
441
|
+
for (const frame of frames) {
|
|
442
|
+
const relative = join(directory, `${frame.name}.png`);
|
|
443
|
+
await writeFile(join(projectRoot, relative), Buffer.from(frame.base64, 'base64'));
|
|
444
|
+
files.push(relative);
|
|
445
|
+
}
|
|
446
|
+
// The default look photographs the UNDERSIDE too — the lab stage renders
|
|
447
|
+
// it as the sheet's fifth tile and as its own `below.png` frame (both in
|
|
448
|
+
// `views` above), so gills under a cap and a barrel's floor are on the one
|
|
449
|
+
// sheet an agent reads, not in a second image it has to open.
|
|
450
|
+
const contactSheet = join(directory, 'contact-sheet.png');
|
|
451
|
+
await writeFile(
|
|
452
|
+
join(projectRoot, contactSheet),
|
|
453
|
+
Buffer.from(capture.contactSheet.base64, 'base64'),
|
|
454
|
+
);
|
|
455
|
+
files.push(contactSheet);
|
|
456
|
+
|
|
457
|
+
return {
|
|
458
|
+
directory,
|
|
459
|
+
files,
|
|
460
|
+
contactSheet,
|
|
461
|
+
...(orbit?.warnings?.length ? { emptyFrames: orbit.warnings } : {}),
|
|
462
|
+
width: capture.width,
|
|
463
|
+
height: capture.height,
|
|
464
|
+
vertexCount: built.vertexCount,
|
|
465
|
+
triangleCount: built.triangleCount,
|
|
466
|
+
meshCount: built.meshCount,
|
|
467
|
+
invertedTriangleCount: built.invertedTriangleCount,
|
|
468
|
+
boundaryEdgeCount: built.boundaryEdgeCount,
|
|
469
|
+
boundaryEdgeSamples: built.boundaryEdgeSamples,
|
|
470
|
+
nonFiniteVertexCount: built.nonFiniteVertexCount,
|
|
471
|
+
bounds: built.bounds,
|
|
472
|
+
glbBytes: built.glb.byteLength,
|
|
473
|
+
};
|
|
474
|
+
},
|
|
475
|
+
});
|