@volter/game-editor 0.5.82 → 0.5.84
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 +22 -22
- package/catalog/entries/blender.json +2 -2
- package/catalog/entries/music.json +2 -2
- package/catalog/entries/reflections.json +1 -1
- package/catalog/project-source/src/lib/reflections/ReflectionProbe.tsx +34 -5
- package/catalog/project-source/src/lib/reflections/index.ts +1 -0
- package/catalog/project-source/src/lib/reflections/probe-controller.ts +44 -3
- package/catalog/project-source/src/lib/reflections/reflection-probe-registry.ts +32 -7
- package/catalog/project-source/src/lib/reflections/volume-reflection-material.ts +638 -160
- package/dist/.vite/manifest.json +2213 -2195
- package/dist/assets/{AssetBudgetPanel-Iip49rxI.js → AssetBudgetPanel-BZy2XeqE.js} +3 -3
- package/dist/assets/{AudioViewer-DmkOvskF.js → AudioViewer-DIuzLzET.js} +1 -1
- package/dist/assets/{CanvasBoardDocument-DCS8uzQo.js → CanvasBoardDocument-3ZxWTKes.js} +1 -1
- package/dist/assets/{CanvasSceneViewport-CfOuQiQ0.js → CanvasSceneViewport-BP7FC2z5.js} +1 -1
- package/dist/assets/{ColorInput-7CPpl8MI.js → ColorInput-Bm2EzmOy.js} +1 -1
- package/dist/assets/EntityModelDocument-Cy-Qproq.js +1 -0
- package/dist/assets/{EnvironmentAssetDocument-DlS6KFJu.js → EnvironmentAssetDocument-B8VmbxfT.js} +1 -1
- package/dist/assets/{GameplaySessionTimeline-C3zH6edi.js → GameplaySessionTimeline-CDcfr07j.js} +1 -1
- package/dist/assets/{ImageViewer-C0lQ6YO0.js → ImageViewer-BNFjkWbV.js} +1 -1
- package/dist/assets/InspectorObjectPreview-DZS_A4lG.js +1 -0
- package/dist/assets/{JsonAssetDocument-DjmH9CQH.js → JsonAssetDocument-BkdsklFn.js} +1 -1
- package/dist/assets/{LiveModuleDocument-Hiot8Q5L.js → LiveModuleDocument-BEDGzgpM.js} +1 -1
- package/dist/assets/{LutAssetDocument-6bBwNMOn.js → LutAssetDocument-RmvH4zzl.js} +1 -1
- package/dist/assets/ModelAssetDocument-BgkVc8nF.js +1 -0
- package/dist/assets/{NonThreeAuthoringBootstrap-DpieYAMC.js → NonThreeAuthoringBootstrap-CcXUHOp3.js} +1 -1
- package/dist/assets/{Object3DDocumentToolbar-BtZkDxKa.js → Object3DDocumentToolbar-DaqNoA9f.js} +1 -1
- package/dist/assets/Object3DDocumentViewport-DFMCzcLc.js +2 -0
- package/dist/assets/{Object3DPreview-DdrYVJUZ.js → Object3DPreview-Dr4GQgGl.js} +1 -1
- package/dist/assets/{OnlineAssetDetail-D06eTe3y.js → OnlineAssetDetail-BPAK7Ras.js} +1 -1
- package/dist/assets/{PlayBar-BbzjgLFJ.js → PlayBar--cmmDXMt.js} +1 -1
- package/dist/assets/{QuarksAssetDocument-wGHNt4ov.js → QuarksAssetDocument-DYr9l2tH.js} +1 -1
- package/dist/assets/{ReactCanvasControls-BL2tOUj6.js → ReactCanvasControls-CoK-IJcH.js} +1 -1
- package/dist/assets/{RootSelectionOverlay-C6Wu8nIs.js → RootSelectionOverlay-Jz5Ll7BT.js} +1 -1
- package/dist/assets/{ShaderAssetDocument-BDi8iNLA.js → ShaderAssetDocument-Fn1SuMaS.js} +3 -3
- package/dist/assets/{ShadowEditor-C3L0UWSH.js → ShadowEditor-IrEJWfde.js} +1 -1
- package/dist/assets/{SourceAssetViewer-D832bARo.js → SourceAssetViewer-C6gxbMdi.js} +1 -1
- package/dist/assets/StageHost-eySsTLUI.js +2 -0
- package/dist/assets/{StoryPreviewMount-CmOEFzZY.js → StoryPreviewMount-CkBS-oOC.js} +1 -1
- package/dist/assets/{ThreeBoardDocument-BtBMGtiQ.js → ThreeBoardDocument-DiQabLNJ.js} +2 -2
- package/dist/assets/{ThreeIsolationSceneContent-BEHNSEsi.js → ThreeIsolationSceneContent-_p4Y5QZ6.js} +1 -1
- package/dist/assets/{ToolObject3DPreview-76LMkfin.js → ToolObject3DPreview-CSADrilV.js} +1 -1
- package/dist/assets/{Toolbar-BEBQdxRz.js → Toolbar-DhQAiAOw.js} +1 -1
- package/dist/assets/{TransientHint-CzsdY8W6.js → TransientHint-B3roDMmv.js} +1 -1
- package/dist/assets/{VideoViewer-Ckrawyuq.js → VideoViewer-DARXMIes.js} +1 -1
- package/dist/assets/{ViewportShadingMenu-BofQt6_4.js → ViewportShadingMenu-DC5996me.js} +1 -1
- package/dist/assets/{active-ingest-D_ryI_R4.js → active-ingest-BQBCy_Hx.js} +3 -3
- package/dist/assets/{animation-clock-QjtJDIsR.js → animation-clock-DAhQxVz9.js} +1 -1
- package/dist/assets/{animation-mixers.service-BInUs1US.js → animation-mixers.service-cc5qCZnh.js} +1 -1
- package/dist/assets/{animation-timeline.utility-DUrfNSwn.js → animation-timeline.utility-DXa0g-qN.js} +1 -1
- package/dist/assets/{asset-budget-asset.menu-DVQEksFp.js → asset-budget-asset.menu-DjEcxL08.js} +1 -1
- package/dist/assets/{asset-budget.action-C-ENAa52.js → asset-budget.action-D7-3Scj7.js} +1 -1
- package/dist/assets/{asset-budget.document-Bb1PyL3H.js → asset-budget.document-Dmn7QkMR.js} +1 -1
- package/dist/assets/{asset-budget.menu-CPi2yjBA.js → asset-budget.menu-djdA3Q-S.js} +1 -1
- package/dist/assets/{asset-editor-persistence-Duoq7o22.js → asset-editor-persistence-Dcy1Joo-.js} +1 -1
- package/dist/assets/{asset-loaders-BftJ2m7-.js → asset-loaders-B0eV8Nk_.js} +1 -1
- package/dist/assets/{asset-preview-BS71mXsZ.js → asset-preview-CGO8kmg5.js} +1 -1
- package/dist/assets/{audio-unlock.service-C3ygvDjU.js → audio-unlock.service-Bgp8fUjH.js} +1 -1
- package/dist/assets/{audio.utility-DF55sgHW.js → audio.utility-DM2IZjJR.js} +1 -1
- package/dist/assets/autoplay.service-aGTnDCDQ.js +1 -0
- package/dist/assets/{babylon-authoring-adapter-CmeehOBt.js → babylon-authoring-adapter-CNYnKhpl.js} +1 -1
- package/dist/assets/{binding-resolver-DUz8C8Fs.js → binding-resolver-By6DQSMJ.js} +2 -2
- package/dist/assets/blender-emscripten-engine-3RrRUwov.js +2 -0
- package/dist/assets/{blender-node-editor.document-B8S2TVMM.js → blender-node-editor.document-DDxLnK24.js} +1 -1
- package/dist/assets/{blender-properties-tab-y-_BeZDx.js → blender-properties-tab-DoLvP4a6.js} +1 -1
- package/dist/assets/{blender-runtime-host-CUH6peXj.js → blender-runtime-host-pYPr56UP.js} +2 -2
- package/dist/assets/{blender-runtime-skin-B1tYITn2.js → blender-runtime-skin-DGw7Uk4l.js} +13 -13
- package/dist/assets/blender-runtime.document-Bvlzayok.js +13 -0
- package/dist/assets/blender-screenshot.menu-BSfC-1EL.js +1 -0
- package/dist/assets/{blender-timeline.document-CeCylyXB.js → blender-timeline.document-D0P1AfdK.js} +1 -1
- package/dist/assets/{blender-uv-editor.document-DEllMw3a.js → blender-uv-editor.document-DEb_AwLC.js} +1 -1
- package/dist/assets/{blender-version.status-CrT9NqK-.js → blender-version.status-LifaPI0C.js} +1 -1
- package/dist/assets/blender-wali-engine-DGwF1KiV.js +2 -0
- package/dist/assets/{blender.command-GIjMG1-m.js → blender.command-DDOcs1dZ.js} +1 -1
- package/dist/assets/{board-guides-B6TEPOPi.js → board-guides-CQWXbsSW.js} +1 -1
- package/dist/assets/bridge.command-CJCc-avL.js +3 -0
- package/dist/assets/{browserAll-k35XRFil.js → browserAll-_6V_eM5P.js} +1 -1
- package/dist/assets/{build-player.document-CHxj4P8q.js → build-player.document-Dz_Mq8Pd.js} +1 -1
- package/dist/assets/{build-profiles.document-CZCk1HYA.js → build-profiles.document-CLCc3EbW.js} +2 -2
- package/dist/assets/{build-progress.status-BNwBxP2a.js → build-progress.status-BfR8rtJ_.js} +1 -1
- package/dist/assets/{build-session-CW2UyYFF.js → build-session-BkZeQ_S3.js} +1 -1
- package/dist/assets/{build.action-EmCcMu47.js → build.action-SVlllu1R.js} +1 -1
- package/dist/assets/{build.command-CzEckGcR.js → build.command-D6c8WqIx.js} +1 -1
- package/dist/assets/{build.header-CsYLpZbh.js → build.header-B_QEABFH.js} +1 -1
- package/dist/assets/{build.menu-CaDkDQuy.js → build.menu-wIEk8uq4.js} +1 -1
- package/dist/assets/{build.service-BcKtbU0-.js → build.service-C24aQmEn.js} +1 -1
- package/dist/assets/{camera-BwWZUyKt.js → camera-AsAJwixA.js} +1 -1
- package/dist/assets/{camera-runtime.inspector-CJyi3zmp.js → camera-runtime.inspector-EWiln7HZ.js} +1 -1
- package/dist/assets/{canvas-design-mount-B_uwZkEU.js → canvas-design-mount-7wA1io5I.js} +4 -4
- package/dist/assets/{canvas-entry-runtime-DskaohHK.js → canvas-entry-runtime-DxHv6Yxk.js} +2 -2
- package/dist/assets/{canvas-preview-frames-BzLeTumX.js → canvas-preview-frames-BJNr8ArE.js} +1 -1
- package/dist/assets/{canvas-story-capture.service-C80CsS8r.js → canvas-story-capture.service-DaHquc4I.js} +2 -2
- package/dist/assets/{capability-coverage-wd6bAhv3.js → capability-coverage-Fjv84QQN.js} +3 -3
- package/dist/assets/collaboration-presence-BYi9wylK.js +1 -0
- package/dist/assets/{collider-Dw2iWV3F.js → collider-BVans4YU.js} +1 -1
- package/dist/assets/{component-board.service-XAxyLCnM.js → component-board.service-6eXUhS3p.js} +2 -2
- package/dist/assets/component-board.service-C1VJog-q.js +2 -0
- package/dist/assets/{component-board.service-CH99sgj0.js → component-board.service-cNKaXoxN.js} +2 -2
- package/dist/assets/{component-contracts.service-DerT0BP-.js → component-contracts.service-B9e64gRX.js} +1 -1
- package/dist/assets/{component-instance-root-Cw_-ajBX.js → component-instance-root-Cw2jcbxa.js} +1 -1
- package/dist/assets/{component-verbs.command-BHK9M2Rk.js → component-verbs.command-CKmDlrFh.js} +1 -1
- package/dist/assets/component-verbs.service-C6MrL6R1.js +1 -0
- package/dist/assets/{config-1rCvm02z.js → config-CXA3itWR.js} +3 -3
- package/dist/assets/{configurations-CRTYw0r9.js → configurations-fjyekkEX.js} +1 -1
- package/dist/assets/{connection.status-D4fjnH24.js → connection.status-DmthQqVz.js} +1 -1
- package/dist/assets/{constraints.inspector-BgnafOLf.js → constraints.inspector-CvJlw3rw.js} +1 -1
- package/dist/assets/{content-bounds-D5pXeHJN.js → content-bounds-vfJMc-IO.js} +1 -1
- package/dist/assets/{contract-system-adapters-rVGdworX.js → contract-system-adapters-BL22QlsE.js} +1 -1
- package/dist/assets/{coverage.service-BNme5Agb.js → coverage.service-BO-eNB08.js} +2 -2
- package/dist/assets/{create-runtime-CcuQTSfy.js → create-runtime-DJ21Fa_i.js} +2 -2
- package/dist/assets/{curve-DorFv33R.js → curve-CiO2-ZoW.js} +1 -1
- package/dist/assets/{data-asset-CAE35Emh.js → data-asset-ByLXUC98.js} +1 -1
- package/dist/assets/{data-ref-DXqRnZsJ.js → data-ref-DpW1ZAc3.js} +1 -1
- package/dist/assets/{debug-bridge-DdCJSEni.js → debug-bridge-Bjh7HoG_.js} +1 -1
- package/dist/assets/{debug-registry-xQJcVubm.js → debug-registry-Bty6AiHN.js} +1 -1
- package/dist/assets/{deferred-ingest-play-CEnsC3uN.js → deferred-ingest-play-BDtHDAut.js} +2 -2
- package/dist/assets/{design-time-canvas-mount-CPRrCPFA.js → design-time-canvas-mount-CpNAFajF.js} +2 -2
- package/dist/assets/{design-time-layers-hmGqBp06.js → design-time-layers-BjbCzOaH.js} +1 -1
- package/dist/assets/{design-time-mount.service-CEmJjRIJ.js → design-time-mount.service-D2nvXCrm.js} +2 -2
- package/dist/assets/{design-time-mount.service-CLL-1Za4.js → design-time-mount.service-x4-8taot.js} +2 -2
- package/dist/assets/{design-time-react-mount-DmXi3GBy.js → design-time-react-mount-DlBtYE3L.js} +1 -1
- package/dist/assets/{document-preview-three-B4j_zNef.js → document-preview-three-CSHYA1BH.js} +1 -1
- package/dist/assets/{dom-authoring-adapter-BklRbjZB.js → dom-authoring-adapter-BRkZp4sE.js} +1 -1
- package/dist/assets/{draco3d-CFWI1XDT.js → draco3d-az59P8mF.js} +1 -1
- package/dist/assets/{edit-mode-audio.service-SUzv0nHs.js → edit-mode-audio.service--N5HyK0y.js} +1 -1
- package/dist/assets/{edit-mode-authoring-CSt3zzmS.js → edit-mode-authoring-BeMAYXYR.js} +1 -1
- package/dist/assets/{edit-mode-networking.service-D6UohrCr.js → edit-mode-networking.service-ByUOzpRh.js} +1 -1
- package/dist/assets/editor-api-dfe-lCMZ.js +1 -0
- package/dist/assets/{editor-layers-CjeYrUlm.js → editor-layers-Djcn6Scw.js} +1 -1
- package/dist/assets/{editor-shell-store-DckLm6m8.js → editor-shell-store-Br2L1Fw1.js} +1 -1
- package/dist/assets/{entity-object-V13bGmay.js → entity-object-BiOrbQZM.js} +1 -1
- package/dist/assets/{extend-BQeRA-aV.js → extend-BMnknpN1.js} +1 -1
- package/dist/assets/fork-menu-BOn71mbn.js +1 -0
- package/dist/assets/{frame-debugger-store-DDxWlDPK.js → frame-debugger-store-DVchJN-z.js} +1 -1
- package/dist/assets/{game-contract-seams-DrYyE5PX.js → game-contract-seams-gIFojMW2.js} +1 -1
- package/dist/assets/{game-css-scope-transform-D5hQWaci.js → game-css-scope-transform-Dab-AkD5.js} +1 -1
- package/dist/assets/{game-document.service-cJ1yKc2V.js → game-document.service-CFLg-vRz.js} +1 -1
- package/dist/assets/{game-eval.command-CKo-W17_.js → game-eval.command-Xch06afq.js} +1 -1
- package/dist/assets/{game-module-access-DuptGLGx.js → game-module-access-BDliSO9v.js} +1 -1
- package/dist/assets/{game-network-CAH_Jsh6.js → game-network-CTdS02CN.js} +3 -3
- package/dist/assets/{gameplay-export-B-JE4uSD.js → gameplay-export-Ct4wopUb.js} +1 -1
- package/dist/assets/gameplay-replay-xk1wnQ88.js +1 -0
- package/dist/assets/{gameplay.command-D4cY3nOq.js → gameplay.command-W3Sq7zn-.js} +1 -1
- package/dist/assets/{generation-jobs-CcCrhKLM.js → generation-jobs-BTP2zuZi.js} +1 -1
- package/dist/assets/{generation.service-CQwmLAOQ.js → generation.service-CHPmGb7B.js} +1 -1
- package/dist/assets/{generations-qfhCRH8C.js → generations-C7ppzxDW.js} +1 -1
- package/dist/assets/{generations.status-CcbR2OfF.js → generations.status-Cxb0-UxC.js} +1 -1
- package/dist/assets/{hierarchy-marks-B1jSqxSv.js → hierarchy-marks-3Iq1RFIh.js} +1 -1
- package/dist/assets/{hosted-asset-materialization-BZf-8JA1.js → hosted-asset-materialization-BK8ZfMnr.js} +2 -2
- package/dist/assets/ibl-override-material-C09OAhCc.js +6 -0
- package/dist/assets/{index-V4J7xfRg.js → index-BXH2Jsun.js} +294 -294
- package/dist/assets/index-CAf6mYXW.js +1 -0
- package/dist/assets/{index-aREcGExk.js → index-CP5WJuE9.js} +1 -1
- package/dist/assets/{index-D_ViOFCz.js → index-D9H8FkR3.js} +2 -2
- package/dist/assets/{index-DrEVdQvN.js → index-DAuA0xMo.js} +1 -1
- package/dist/assets/{index-CHa43s2p.js → index-DkTiDXNY.js} +1 -1
- package/dist/assets/{index-D-RMHSzb.js → index-Kznwz4yS.js} +1 -1
- package/dist/assets/{index-DXtfej3G.js → index-Yw9pOoLh.js} +1 -1
- package/dist/assets/{index-Cj_b0Ygc.js → index-k1tDFKMg.js} +1 -1
- package/dist/assets/{inference-diagnostics-DoZQ1mpg.js → inference-diagnostics-CxWL3UhK.js} +1 -1
- package/dist/assets/{ingest-boot-viewport-DWdOtGGE.js → ingest-boot-viewport-BeYyFYst.js} +1 -1
- package/dist/assets/{ingest-siblings-DyvasVDH.js → ingest-siblings-DGjWGyZo.js} +1 -1
- package/dist/assets/{ingest-source-persistence-CQOJeGhj.js → ingest-source-persistence-BFkLdeMy.js} +1 -1
- package/dist/assets/{ingest.service-CqIcydem.js → ingest.service-adZJNY83.js} +1 -1
- package/dist/assets/{inspect-DiSjB-N1.js → inspect-Dah00n9O.js} +1 -1
- package/dist/assets/instances.command-neq95jyN.js +1 -0
- package/dist/assets/{json-history-resource-CH2nzMZh.js → json-history-resource-DYW614tc.js} +1 -1
- package/dist/assets/layered-pick-Cn98HSnj.js +1 -0
- package/dist/assets/{light-CxiGIJma.js → light-nb6H9zi_.js} +1 -1
- package/dist/assets/{live-project-verbs-CnknlUlT.js → live-project-verbs-CyWrvvzK.js} +1 -1
- package/dist/assets/{machine.document-D7jMrzXt.js → machine.document-BlWIYspE.js} +1 -1
- package/dist/assets/{machines.finder-Dor3O0uf.js → machines.finder-D-nBx1QJ.js} +1 -1
- package/dist/assets/material-CcQQ-mP8.js +1 -0
- package/dist/assets/{material-factory-BN3Lax5C.js → material-factory-CKO4sgCS.js} +1 -1
- package/dist/assets/{mesh-Cj-CYroI.js → mesh-CGB8fhbT.js} +1 -1
- package/dist/assets/{model-asset-sections.service-mC4WJFTA.js → model-asset-sections.service-oZwOlxI-.js} +1 -1
- package/dist/assets/{model-inspection-8o57YSZW.js → model-inspection-B5p-uq9q.js} +1 -1
- package/dist/assets/{model-thumbnail-chePRlH7.js → model-thumbnail-Cgyfafqg.js} +1 -1
- package/dist/assets/{models.finder-CKkT5ZdU.js → models.finder-v4ShdgaO.js} +1 -1
- package/dist/assets/{module-mode-BMiMhHI3.js → module-mode-BBCbx1-D.js} +2 -2
- package/dist/assets/{mount-canvas-ingest-root-B1swVIUJ.js → mount-canvas-ingest-root-9CLvzAsA.js} +2 -2
- package/dist/assets/{mount-dom-ingest-root-B8hO5mht.js → mount-dom-ingest-root-CZA1Dw6t.js} +2 -2
- package/dist/assets/{mount-ingest-root-Cbnh-mSw.js → mount-ingest-root-hudyfrT7.js} +2 -2
- package/dist/assets/{mount-manifest-B7oL1Abg.js → mount-manifest-C_z-xK97.js} +1 -1
- package/dist/assets/{mount-three-ingest-root-BdUJx6ix.js → mount-three-ingest-root-DWoCP70F.js} +1 -1
- package/dist/assets/{mounted-authoring-C47L5H5t.js → mounted-authoring-DMWjUr2Z.js} +1 -1
- package/dist/assets/{mounted-story-viewport-source-CyEK_vaq.js → mounted-story-viewport-source-Iq6tisms.js} +1 -1
- package/dist/assets/{native-debug-module-JJOFtIVz.js → native-debug-module-BO5dlpfD.js} +1 -1
- package/dist/assets/{navigation-ROJM2w84.js → navigation-BzH049Ad.js} +1 -1
- package/dist/assets/{navmesh.menu-DjefqtkI.js → navmesh.menu-CicRFavg.js} +1 -1
- package/dist/assets/{navmesh.service-BPqjEQiq.js → navmesh.service-B0zUTaL0.js} +1 -1
- package/dist/assets/network-observer.service-CvC30rDc.js +1 -0
- package/dist/assets/{network.utility-6Y5u53n8.js → network.utility-DTpK-Ri9.js} +1 -1
- package/dist/assets/{object3d-document-session-registry-DNCOGA3i.js → object3d-document-session-registry-CTeivmwK.js} +2 -2
- package/dist/assets/{oid-transform-DQzN_Gl_.js → oid-transform-xxKy1722.js} +1 -1
- package/dist/assets/{particles-DGdUmqOr.js → particles-CeOU09tg.js} +1 -1
- package/dist/assets/{pixi-authoring-adapter-BRktdcIz.js → pixi-authoring-adapter-qwgLB4nb.js} +1 -1
- package/dist/assets/{pixi-live-write-target-Dg0mdLaa.js → pixi-live-write-target-B-E2O-WC.js} +1 -1
- package/dist/assets/{play.command-4IDAqR5W.js → play.command-CAhUsYcp.js} +2 -2
- package/dist/assets/{presentation-8m-RDKIS.js → presentation-BKcWD0nx.js} +1 -1
- package/dist/assets/{product-t6tauO7R.js → product-C8OFGza7.js} +1 -1
- package/dist/assets/{profiler.action-CXA4IkQB.js → profiler.action-CyjXGHbx.js} +1 -1
- package/dist/assets/{profiler.menu-BgIBv4-I.js → profiler.menu-DXHAGF3Z.js} +1 -1
- package/dist/assets/{profiler.utility-BYoRbfIK.js → profiler.utility-Qx-aaTdo.js} +1 -1
- package/dist/assets/{project-authoring-session-DkekCxNv.js → project-authoring-session-B0YSloNS.js} +2 -2
- package/dist/assets/{properties-bone-constraints.inspector-DXpiCtf9.js → properties-bone-constraints.inspector-C-dwjglB.js} +1 -1
- package/dist/assets/{properties-bone.inspector-wIDsP4c5.js → properties-bone.inspector-CeZIE99V.js} +1 -1
- package/dist/assets/{properties-collection.inspector-5SRPbqfM.js → properties-collection.inspector-DiSBJpTu.js} +1 -1
- package/dist/assets/{properties-constraints.inspector-DIjKz692.js → properties-constraints.inspector-2DxnBAIf.js} +1 -1
- package/dist/assets/{properties-data.inspector-DE6i8biZ.js → properties-data.inspector-DvSzTW7_.js} +1 -1
- package/dist/assets/{properties-material.inspector-Cu1UCPY4.js → properties-material.inspector-XPNSk9iW.js} +1 -1
- package/dist/assets/{properties-modifiers.inspector-DsQzA638.js → properties-modifiers.inspector-8pjl5OY9.js} +1 -1
- package/dist/assets/{properties-object.inspector-C57X0GJq.js → properties-object.inspector-a30WyA7Q.js} +1 -1
- package/dist/assets/{properties-output.inspector-DzrcFuRM.js → properties-output.inspector-B9JochaR.js} +1 -1
- package/dist/assets/{properties-particles.inspector-DGqSnelN.js → properties-particles.inspector-D6rRhjyA.js} +1 -1
- package/dist/assets/{properties-physics.inspector-DIjhtiLe.js → properties-physics.inspector-BcJFxv6L.js} +1 -1
- package/dist/assets/{properties-render.inspector-CX0orwn9.js → properties-render.inspector-DHPbElDL.js} +1 -1
- package/dist/assets/{properties-scene.inspector-DaHNL_sq.js → properties-scene.inspector-ZJueIZwx.js} +1 -1
- package/dist/assets/{properties-texture.inspector-B5hmxPRy.js → properties-texture.inspector-CvUhb-u8.js} +1 -1
- package/dist/assets/{properties-view-layer.inspector-C7hdJgei.js → properties-view-layer.inspector-CaaGgMEq.js} +1 -1
- package/dist/assets/{properties-world.inspector-EWTC6jNw.js → properties-world.inspector-10GD8Fpy.js} +1 -1
- package/dist/assets/{r3f-design-session-CXlGV9hp.js → r3f-design-session-CVxU3s62.js} +2 -2
- package/dist/assets/{r3f-physics-binding-DZSIB0d_.js → r3f-physics-binding-jUszsaB2.js} +1 -1
- package/dist/assets/{r3f-source-authoring-adapter-GR97EmII.js → r3f-source-authoring-adapter-Cmxf0Hvz.js} +1 -1
- package/dist/assets/{react-canvas-navigation-L_mOnybL.js → react-canvas-navigation-B-5CNIty.js} +1 -1
- package/dist/assets/{react-inspector.service-B4P3UnSY.js → react-inspector.service-wpEmCNFv.js} +1 -1
- package/dist/assets/{react-story-board-CT1_3sk_.js → react-story-board-CMghMNcN.js} +1 -1
- package/dist/assets/{react-three-rapier.esm-DyMNYoA_.js → react-three-rapier.esm-LvsEG944.js} +1 -1
- package/dist/assets/{react-world-authoring-adapter-OR1SW2jI.js → react-world-authoring-adapter-qVYWC2NO.js} +1 -1
- package/dist/assets/{realm-services-u0mnjXU9.js → realm-services-DvRrMpdg.js} +1 -1
- package/dist/assets/{reflection-probe-capture.inspector-CTNlSaGW.js → reflection-probe-capture.inspector-vo8ShT8w.js} +1 -1
- package/dist/assets/{registry-wqakYaDW.js → registry-CC-Vb6qS.js} +1 -1
- package/dist/assets/{relative-import-specifier-DXWVQf0o.js → relative-import-specifier-CT_YQo7I.js} +1 -1
- package/dist/assets/{render-env-CN09NtDf.js → render-env-YEmoFtX3.js} +1 -1
- package/dist/assets/{render-features-HCEupUJ6.js → render-features-B7OI7f1i.js} +1 -1
- package/dist/assets/{render-settings-Clt6d05o.js → render-settings-Mh_ddGef.js} +1 -1
- package/dist/assets/{resolve-three-CLzKVMx2.js → resolve-three-0A-COMTr.js} +3 -3
- package/dist/assets/{root-seam-contract-D2uQHWF9.js → root-seam-contract-SVcCHdYl.js} +1 -1
- package/dist/assets/{run-selection-AyelFc9T.js → run-selection-HF9_7IwN.js} +1 -1
- package/dist/assets/{scene-capture-WbPcLfJl.js → scene-capture-BvNIvwYD.js} +1 -1
- package/dist/assets/{scene-document.service-4U6rDhCp.js → scene-document.service-Ck2pGl4I.js} +2 -2
- package/dist/assets/{scene-framing-DzSL2Cld.js → scene-framing-BgT3O3rp.js} +1 -1
- package/dist/assets/{seeded-random-tpdJjdqy.js → seeded-random-BVxDLbEH.js} +1 -1
- package/dist/assets/{setup-renderer-B5vZmCyu.js → setup-renderer-BCSUurTm.js} +1 -1
- package/dist/assets/{source-object3d-authoring-adapter-BQnQ3Qzg.js → source-object3d-authoring-adapter-CShEQbUV.js} +1 -1
- package/dist/assets/{source-persistence-backend-uyd6NiWD.js → source-persistence-backend-DOkAuppW.js} +1 -1
- package/dist/assets/{stage-keyboard-B2yrk2zu.js → stage-keyboard-BJEP_zFM.js} +1 -1
- package/dist/assets/{stage-overlay-set-Cqtz3s06.js → stage-overlay-set-U3RYk04i.js} +1 -1
- package/dist/assets/{stage-presence-markers-BgLs0Aj5.js → stage-presence-markers-C9j53BR-.js} +1 -1
- package/dist/assets/stage-transform-tools-D9eCTssP.js +1 -0
- package/dist/assets/{standard-viewport-dressing-uhv_3JvQ.js → standard-viewport-dressing-CCVrTojE.js} +3 -3
- package/dist/assets/{state-watch.action-BJ08HgcO.js → state-watch.action-fGEIwj5w.js} +1 -1
- package/dist/assets/{state-watch.menu-rAULwijr.js → state-watch.menu-Bvi0XsP3.js} +1 -1
- package/dist/assets/{state-watch.utility-eEbQcj8t.js → state-watch.utility-BNhj8Nnx.js} +1 -1
- package/dist/assets/story-capture-D0GNxNYo.js +1 -0
- package/dist/assets/{story-documents-Cm4jCkW5.js → story-documents-BF53RkDW.js} +2 -2
- package/dist/assets/{story-documents.service-BDvQCslK.js → story-documents.service-cTbf9p1e.js} +1 -1
- package/dist/assets/{story-documents.service-Cgtg6rXn.js → story-documents.service-mW6CBXLc.js} +1 -1
- package/dist/assets/story-media-presence-DsyVqDVF.js +1 -0
- package/dist/assets/{story-pixi-preview-D62Q_vIW.js → story-pixi-preview-DpjZcKtE.js} +1 -1
- package/dist/assets/{story-presentation-CofUdEU7.js → story-presentation-CNkoc9rw.js} +1 -1
- package/dist/assets/{story-three-preview-B9O1wapP.js → story-three-preview--fB-XR3A.js} +2 -2
- package/dist/assets/{studio-environment-BIhqrtFc.js → studio-environment-TibfpTB9.js} +1 -1
- package/dist/assets/{surface-state-DrM3wsrr.js → surface-state-Bt3iAf79.js} +1 -1
- package/dist/assets/{syntactic-prop-specs-BGz0N7Dg.js → syntactic-prop-specs-CN0U9uqz.js} +1 -1
- package/dist/assets/{team-playtest.service-CiE8UJAe.js → team-playtest.service-DiziYIhq.js} +1 -1
- package/dist/assets/{three-BQfhEwUz.js → three-DfbLdx-e.js} +1 -1
- package/dist/assets/{three-authoring-adapter-COBwREQO.js → three-authoring-adapter-CtjX4v6r.js} +1 -1
- package/dist/assets/three-authoring.service-BruYh1LE.js +2 -0
- package/dist/assets/{three-ingest-runtime-BnRF_nJN.js → three-ingest-runtime-V4l_ZpBp.js} +1 -1
- package/dist/assets/three-integration-BxG_D6RK.js +2 -0
- package/dist/assets/three-integration.service-CBSTLULk.js +1 -0
- package/dist/assets/{three-projection-core-PQm-CO61.js → three-projection-core-CyqdOvLG.js} +1 -1
- package/dist/assets/{three-state-C7khRIQE.js → three-state-B9ax7cgA.js} +1 -1
- package/dist/assets/{three-story-capture.service-B0oiGIfp.js → three-story-capture.service-CUVsgZa5.js} +2 -2
- package/dist/assets/three-story-model-NEuWKJe1.js +1 -0
- package/dist/assets/{three-viewport-presentation-B_tBudM-.js → three-viewport-presentation-Da0lYO0_.js} +1 -1
- package/dist/assets/{transform-mode-request-DWM6BdRA.js → transform-mode-request-Bfse_kvX.js} +1 -1
- package/dist/assets/{transport-strip-vgXGDgkI.js → transport-strip-DYbGjuX-.js} +1 -1
- package/dist/assets/transport.header-BglFgDzu.js +1 -0
- package/dist/assets/{tuples-BnYrlQqS.js → tuples-CMTm7T5T.js} +1 -1
- package/dist/assets/ui-board-document-GaFlpf81.js +2 -0
- package/dist/assets/{user-data-CifDDvSr.js → user-data-CYeyy9Su.js} +1 -1
- package/dist/assets/{utility-view-state-BPl8Asup.js → utility-view-state-Ye00iOCB.js} +1 -1
- package/dist/assets/{viewport-door-BCXEYmon.js → viewport-door-CCXNhxOW.js} +1 -1
- package/dist/assets/{viewport-root-presentation-DJLpUuf0.js → viewport-root-presentation-52V6g9Ae.js} +1 -1
- package/dist/assets/{viewport-surface-status-jwLhIK_M.js → viewport-surface-status-BtHfBssH.js} +1 -1
- package/dist/assets/{webworkerAll-P6jePa6X.js → webworkerAll-D7_8g3e0.js} +1 -1
- package/dist/assets/worker-BRY0I3XJ.js +2 -0
- package/dist/assets/{workspace-arrangement-B_OcbQbj.js → workspace-arrangement-D8CXsifv.js} +1 -1
- package/dist/assets/{world-documents-Bx3j867R.js → world-documents-C4AdTIHw.js} +1 -1
- package/dist/assets/{world-root-stage-binding-LEhjWDkn.js → world-root-stage-binding-CvEyzq0c.js} +1 -1
- package/dist/assets/{xstate-animation-binding-Dionc_fC.js → xstate-animation-binding-CmmOqqwV.js} +1 -1
- package/dist/assets/{xstate-animation-meta-XEmD_qc_.js → xstate-animation-meta-BSBJhOAT.js} +1 -1
- package/dist-node/cli.js +21 -18
- package/package.json +16 -16
- package/template/src/lib/reflections/ReflectionProbe.tsx +34 -5
- package/template/src/lib/reflections/index.ts +1 -0
- package/template/src/lib/reflections/probe-controller.ts +44 -3
- package/template/src/lib/reflections/reflection-probe-registry.ts +32 -7
- package/template/src/lib/reflections/volume-reflection-material.ts +638 -160
- package/dist/assets/EntityModelDocument-CplmAib0.js +0 -1
- package/dist/assets/InspectorObjectPreview-Bjc1Tn-I.js +0 -1
- package/dist/assets/ModelAssetDocument-G6ajiV51.js +0 -1
- package/dist/assets/Object3DDocumentViewport-BhH8afDi.js +0 -2
- package/dist/assets/StageHost-Bor1eHEO.js +0 -2
- package/dist/assets/autoplay.service-DaonKf7O.js +0 -1
- package/dist/assets/blender-emscripten-engine-DQljvfR7.js +0 -2
- package/dist/assets/blender-runtime.document-DnSl0twI.js +0 -12
- package/dist/assets/blender-wali-engine-CO-jG_ik.js +0 -2
- package/dist/assets/bridge.command-D6qTcgje.js +0 -3
- package/dist/assets/collaboration-presence-DcPhahtF.js +0 -1
- package/dist/assets/component-board.service-Cd1c9oSN.js +0 -2
- package/dist/assets/component-verbs.service-DsxhVcvk.js +0 -1
- package/dist/assets/editor-api-WeHVNlEo.js +0 -1
- package/dist/assets/fork-menu-Bthg9viY.js +0 -1
- package/dist/assets/gameplay-replay-WyopKGyB.js +0 -1
- package/dist/assets/ibl-override-material-CMo_a49U.js +0 -6
- package/dist/assets/index-yXSK_qPW.js +0 -1
- package/dist/assets/instances.command-COw2QpbN.js +0 -1
- package/dist/assets/layered-pick-BUr1U8lU.js +0 -1
- package/dist/assets/material-B6cH1Oqw.js +0 -1
- package/dist/assets/network-observer.service-GFzXuBMb.js +0 -1
- package/dist/assets/stage-transform-tools-BHcz53td.js +0 -1
- package/dist/assets/story-capture-B8wfSf5s.js +0 -1
- package/dist/assets/story-media-presence-SGlp_afL.js +0 -1
- package/dist/assets/three-authoring.service-C0azvoq8.js +0 -2
- package/dist/assets/three-integration-DeWYFf1x.js +0 -2
- package/dist/assets/three-integration.service-CoWCBTmg.js +0 -1
- package/dist/assets/three-story-model-D7g2pqfJ.js +0 -1
- package/dist/assets/transport.header-CfVHXjrT.js +0 -1
- package/dist/assets/ui-board-document-B_-K9luq.js +0 -2
- package/dist/assets/worker-CJIsrsP6.js +0 -2
package/dist/assets/{xstate-animation-binding-Dionc_fC.js → xstate-animation-binding-CmmOqqwV.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{collectMachineAnimationMeta as V,clipNamesOf as L,isBlendTreeAnimationMeta as S,asBlendTreeDef as z}from"./xstate-animation-meta-
|
|
1
|
+
import{collectMachineAnimationMeta as V,clipNamesOf as L,isBlendTreeAnimationMeta as S,asBlendTreeDef as z}from"./xstate-animation-meta-BSBJhOAT.js";import{cW as J,p as Z,c as _,cQ as ee,l as te,dk as ne,cf as ie,cd as oe}from"./three.core-3arARmh6.js";import"./index-BXH2Jsun.js";import"./index-nmcBqr7Y.js";import"./_commonjsHelpers-D6-XlEtG.js";import"./index-D_NuPfjr.js";import"./jsx-runtime-DPjLkJKQ.js";import"./index-CtzuWnCS.js";import"./index-CinJrH5C.js";import"./index-FUuS4qwW.js";import"./client-DNXj_opT.js";class M extends Error{constructor(i,c){super(i),this.stateId=c,this.name="AnimationBindingError"}}function ae(n){const i=n.logic;if(i?.root)return i;const c=n.getSnapshot();if(c?.machine?.root)return c.machine;throw new M("[bindXStateAnimation] the actor exposes no state machine — only a state-machine actor carries the `meta.animation` this binder reads")}const W=n=>n.layer??"base",B=n=>n.weight??1,I=n=>n.blendMode??"override";function T(n){try{return ne.parseTrackName(n.name).nodeName??""}catch{const i=n.name.indexOf(".");return i<0?n.name:n.name.slice(0,i)}}function C(n,i,c){const o=new Set,l=[];for(const f of i){let u=!1;n.traverse(m=>{m.name===f&&(u=!0,m.traverse(d=>{d.name&&o.add(d.name)}))}),c.has(f)&&(u=!0,o.add(f)),u||l.push(f)}return{names:o,missing:l}}function se(n,i,c,o){const l=new Set(n.tracks.map(T)),f=i.include?C(c,i.include,l):void 0,u=i.exclude?C(c,i.exclude,l):void 0,m=[...f?.missing??[],...u?.missing??[]];if(m.length)throw new M(`[bindXStateAnimation] state "${o}" boneMask names unknown bones/objects: ${m.join(", ")}`,o);const d=n.tracks.filter(p=>{const w=T(p);return(!f||f.names.has(w))&&!u?.names.has(w)});if(d.length===0)throw new M(`[bindXStateAnimation] state "${o}" boneMask removes every track from clip "${n.name}"`,o);return new te(n.name,n.duration,d.map(p=>p.clone()))}function re(n){return n.reduce((i,c)=>c.weight>i.weight?c:i,n[0])}function Se(n,i,c,o={}){const l=i.getRoot(),f=o.root??(l instanceof J?l:void 0);if(!f)throw new M("[bindXStateAnimation] a THREE.Object3D `root` option is required when the mixer uses AnimationObjectGroup");const u=ae(n).root,m=V(u),d=new Map(m.map(t=>[t.stateId,t.meta]));for(const t of m)for(const e of L(t.meta))if(!c.has(e))throw new M(`[bindXStateAnimation] state "${t.stateId}" references clip "${e}", which is not present in the supplied clips map. Known clips: ${[...c.keys()].join(", ")||"(none)"}`,t.stateId);const p=new Map;function w(t,e,s){return W(e)!=="base"||!!e.boneMask||I(e)==="additive"?`${t}\0${s}`:s}for(const{stateId:t,meta:e}of m)for(const s of L(e)){const a=w(t,e,s);if(p.has(a))continue;const r=c.get(s);let h=e.boneMask?se(r,e.boneMask,f,t):r;(h!==r||a!==s)&&(h===r&&(h=r.clone()),h.name=`${r.name}@${W(e)}:${t}`),I(e)==="additive"?(Z.makeClipAdditive(h),h.blendMode=_):h.blendMode=ee,p.set(a,h)}const g=new Map;function K(t,e,s,a){let r=g.get(t);if(!r){const h=p.get(t);if(!h)throw new M(`[bindXStateAnimation] prepared clip "${t}" not found`);const v=i.clipAction(h);v.setEffectiveWeight(0),v.play(),r={action:v,clip:h},g.set(t,r)}return r.action.setLoop(e?ie:oe,1/0),r.action.clampWhenFinished=!e,r.action.timeScale=s,r.action.weight=a,r.action}function N(t){const e=o.selectParameters?o.selectParameters(t):t;return new Map(Object.entries(e??{}))}function D(t,e,s){return(S(e)?ce(z(e.blendTree),N(s)):[{clip:e.clip,weight:1}]).map(({clip:r,weight:h})=>({clip:r,weight:h,actionKey:w(t,e,r)}))}const y=new Map;let O=!1;function R(t,e,s){for(const a of t){if(a.actionKey===e)continue;const r=g.get(a.actionKey)?.action;r&&(s>0?r.fadeOut(s):r.setEffectiveWeight(0))}}function k(t,e){if(!S(t.meta))return;t.natural=D(t.stateId,t.meta,e);const s=B(t.meta);for(const a of t.natural)g.get(a.actionKey)?.action.setEffectiveWeight(a.weight*s)}function P(t,e,s){const a=W(e),r=y.get(a)??null,h=D(t,e,s),v=re(h),H=S(e)?!0:e.loop,Q=S(e)?1:e.speed,x=B(e);for(const b of h)K(b.actionKey,H,Q,x);const $=g.get(v.actionKey).action;$.reset().setEffectiveWeight(x);for(const b of h)b.actionKey!==v.actionKey&&g.get(b.actionKey).action.reset().setEffectiveWeight(0);const A=e.crossfade?.duration??0,U=e.crossfade?.warp??!1;if(!r)A>0&&$.fadeIn(A);else{R(r.natural,r.dominantActionKey,A);const b=g.get(r.dominantActionKey)?.action;b&&A>0?b.crossFadeTo($,A,U):(b?.setEffectiveWeight(0),$.setEffectiveWeight(x))}const j={layer:a,stateId:t,meta:e,natural:h,dominantActionKey:v.actionKey,crossfadeRemaining:A};y.set(a,j),S(e)&&A<=0&&k(j,s)}function q(t){return Object.keys(t.getMeta()).filter(e=>d.has(e))}function X(t){const e=new Map;for(const s of q(t)){const a=d.get(s),r=W(a),h=e.get(r);if(h)throw new M(`[bindXStateAnimation] animated states "${h}" and "${s}" are both active on layer "${r}". Give parallel regions distinct meta.animation.layer names.`,s);e.set(r,s)}for(const[s,a]of y)e.has(s)||(R(a.natural,void 0,0),y.delete(s));for(const[s,a]of e)y.get(s)?.stateId!==a&&P(a,d.get(a),t.context)}const F=n.getSnapshot();X(F);const G=n.subscribe(t=>{O||X(t)});function E(t){if(O)return;const e=t,s=n.getSnapshot().context;for(const a of y.values())a.crossfadeRemaining>0?(a.crossfadeRemaining=Math.max(0,a.crossfadeRemaining-e),a.crossfadeRemaining<=0&&k(a,s)):k(a,s);i.update(e)}const Y={tick:E,actor:n,getParameters:()=>N(n.getSnapshot().context),getActiveLayers:()=>[...y.values()].map(t=>({layer:t.layer,stateId:t.stateId,clips:t.natural.map(e=>e.clip),clipWeights:t.natural.map(e=>({clip:e.clip,weight:g.get(e.actionKey)?.action.getEffectiveWeight()??0})),weight:B(t.meta),blendMode:I(t.meta),...t.meta.boneMask?{boneMask:t.meta.boneMask}:{}})),dispose(){if(!O){O=!0,o.systems?.remove("animation",E),G.unsubscribe();for(const{action:t,clip:e}of g.values())t.stop(),i.uncacheAction(e,t.getRoot());g.clear(),y.clear()}}};return o.systems?.add("animation",E),Y}function ce(n,i){switch(n.type){case"1D":return le(n,i);case"2D":return fe(n,i);case"direct":return de(n);default:return n.children.map(c=>({clip:c.clip,weight:1/n.children.length}))}}function le(n,i){const c=Number(i.get(n.parameter)??0),o=[...n.children].sort((f,u)=>f.threshold-u.threshold),l=o.map(f=>({clip:f.clip,weight:0}));if(o.length===0)return l;if(o.length===1||c<=o[0].threshold)return l[0].weight=1,l;if(c>=o[o.length-1].threshold)return l[l.length-1].weight=1,l;for(let f=0;f<o.length-1;f++){const u=o[f],m=o[f+1];if(c>=u.threshold&&c<=m.threshold){const d=m.threshold-u.threshold,p=d>0?(c-u.threshold)/d:0;return l[f].weight=1-p,l[f+1].weight=p,l}}return l}function fe(n,i){const c=Number(i.get(n.parameter)??0),o=Number(i.get(n.parameterY??"")??0),l=n.children,f=l.map(d=>({clip:d.clip,weight:0}));let u=0;const m=[];for(const d of l){const p=c-d.threshold,w=o-(d.thresholdY??0),g=Math.sqrt(p*p+w*w),K=g<.001?1e3:1/g;m.push(K),u+=K}if(u>0)for(let d=0;d<f.length;d++)f[d].weight=m[d]/u;return f}function de(n){const i=n.children.map(o=>({clip:o.clip,weight:o.weight??0})),c=i.reduce((o,l)=>o+l.weight,0);if(c>0)for(const o of i)o.weight/=c;return i}export{M as AnimationBindingError,Se as bindXStateAnimation,ce as evaluateBlendTree,ae as machineOfXStateActor};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{dZ as b,d_ as u,u as o,v as c,w as n,x as l,c6 as r,c5 as m,c4 as f}from"./index-BXH2Jsun.js";import"./index-nmcBqr7Y.js";import"./_commonjsHelpers-D6-XlEtG.js";import"./index-D_NuPfjr.js";import"./jsx-runtime-DPjLkJKQ.js";import"./index-CtzuWnCS.js";import"./index-CinJrH5C.js";import"./index-FUuS4qwW.js";import"./client-DNXj_opT.js";const d=o({clip:n().min(1).describe("Animation clip name this child plays"),threshold:r().describe("1D/2D blend position on the primary parameter axis"),thresholdY:r().optional().describe("2D blend position on the secondary parameter axis (2D blend trees only)"),weight:r().min(0).optional().describe('Explicit weight for "direct" blend trees (ignored by 1D/2D)')}).strict(),y=o({type:l("1D").describe("Interpolates linearly between sorted children by threshold"),parameter:n().min(1).describe("Context/selector value driving the blend"),children:c(d).min(2,"1D blend tree needs at least 2 children to interpolate between")}).strict(),v=o({type:l("2D").describe("Inverse-distance-weights children by (parameter, parameterY) position"),parameter:n().min(1).describe("Primary axis context/selector value"),parameterY:n().min(1).describe("Secondary axis context/selector value"),children:c(d.extend({thresholdY:r()})).min(1,"2D blend tree needs at least 1 child")}).strict(),g=o({type:l("direct").describe("Each child has an explicit weight, normalized to sum to 1"),parameter:n().default(""),children:c(d.extend({weight:r().min(0)})).min(1,"direct blend tree needs at least 1 child")}).strict(),A=b("type",[y,v,g]);function Y(e){return e}const p=o({duration:r().min(0).default(0).describe("Seconds to blend from the previously active clip into this state on entry, applied via native `AnimationAction.crossFadeTo`/`fadeIn` (E2). 0 = instant activation, no fade."),warp:m().default(!1).describe("Passed through to AnimationAction.crossFadeTo's `warp` param — linearly warps timeScale across the two clips during the blend so differing clip lengths line up. Default false.")}).strict().describe("Blend-in/out/crossfade timing for entering this state"),x=o({include:c(n().min(1)).min(1).optional().describe("Bone/object names whose complete descendant subtrees are retained"),exclude:c(n().min(1)).min(1).optional().describe("Bone/object names whose complete descendant subtrees are removed")}).strict().refine(e=>!!(e.include?.length||e.exclude?.length),{message:"boneMask needs at least one include or exclude bone name"}).describe("Filters animation tracks by named Object3D/Bone subtrees"),h={layer:n().min(1).optional().describe("Composition layer name; omitted means the single base layer"),weight:r().min(0).max(1).optional().describe("Layer weight multiplier from 0 to 1; defaults to 1"),blendMode:f(["override","additive"]).optional().describe("Native Three normal/override or additive action blending; defaults to override"),boneMask:x.optional().describe("Optional include/exclude filter applied to every clip track in this state")},w=o({clip:n().min(1).describe("Single clip to play while this XState state is active"),loop:m().default(!0).describe("Loop the clip (THREE.LoopRepeat) vs play once (THREE.LoopOnce, clamped on last frame)"),speed:r().positive().default(1).describe("Playback speed multiplier (AnimationAction.timeScale)"),crossfade:p.optional(),...h}).strict(),S=o({blendTree:A.describe("Multiple clips blended by a live context/selector-driven parameter"),crossfade:p.optional(),...h}).strict(),D=u([w,S]);function M(e){return"clip"in e}function $(e){return"blendTree"in e}class T extends Error{constructor(a,i,t){super(a),this.stateId=i,this.issues=t,this.name="AnimationMetaValidationError"}}function B(e,a){const i=D.safeParse(a);if(!i.success){const t=i.error.issues.map(s=>`${s.path.length?s.path.join("."):"(root)"}: ${s.message}`).join("; ");throw new T(`[xstate-animation] invalid meta.animation for state "${e}": ${t}`,e,i.error.issues)}return i.data}function R(e){const a=[],i=t=>{t.meta&&"animation"in t.meta&&t.meta.animation!==void 0&&a.push({stateId:t.id,meta:B(t.id,t.meta.animation)});for(const s of Object.values(t.states??{}))i(s)};return i(e),a}function H(e){return M(e)?[e.clip]:e.blendTree.children.map(a=>a.clip)}export{A as AnimationBlendTreeSchema,T as AnimationMetaValidationError,D as StateAnimationMetaSchema,Y as asBlendTreeDef,H as clipNamesOf,R as collectMachineAnimationMeta,$ as isBlendTreeAnimationMeta,M as isClipAnimationMeta,B as parseStateAnimationMeta};
|
package/dist-node/cli.js
CHANGED
|
@@ -2027,8 +2027,11 @@ function projectRelative(project, absolute) {
|
|
|
2027
2027
|
}
|
|
2028
2028
|
async function serveBlenderMcp(project, ensureEditor, command) {
|
|
2029
2029
|
const runtimeIdentity = `Blender ${BUNDLE_default.blender} (source ${BUNDLE_default.source}), compiled to WebAssembly and running headless in the editor tab; three.js takes its photographs. Factory bpy.context.scene.render.engine: '${BUNDLE_default.factoryEngine}'. Documents are .blend. save_as_mainfile records the actual saved path in bpy.data.filepath; open_mainfile reopens it.`;
|
|
2030
|
+
const photographs = `A photograph is shown to the person in the editor, never in another app: get_viewport_screenshot returns one, and an image file written inside the project opens as an editor document with \`npx ${command} eval 'editor.openAsset("<project-relative path>")'\`. Do not run the OS \`open\` on it.`;
|
|
2031
|
+
const instructions = `${runtimeIdentity}
|
|
2032
|
+
${photographs}`;
|
|
2030
2033
|
const tools = blender_mcp_tools_default.map(
|
|
2031
|
-
(tool) => tool.name === "execute_blender_code" ? { ...tool, description: `${
|
|
2034
|
+
(tool) => tool.name === "execute_blender_code" ? { ...tool, description: `${instructions}
|
|
2032
2035
|
${tool.description}` } : tool
|
|
2033
2036
|
);
|
|
2034
2037
|
const defaults = blender_mcp_defaults_default;
|
|
@@ -2041,7 +2044,7 @@ ${tool.description}` } : tool
|
|
|
2041
2044
|
{ name: "BlenderMCP", version: BLENDER_MCP_VERSION },
|
|
2042
2045
|
{
|
|
2043
2046
|
capabilities: { tools: {}, prompts: {} },
|
|
2044
|
-
instructions
|
|
2047
|
+
instructions
|
|
2045
2048
|
}
|
|
2046
2049
|
);
|
|
2047
2050
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));
|
|
@@ -2310,7 +2313,7 @@ import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
|
2310
2313
|
var package_default = {
|
|
2311
2314
|
name: "@volter/game-editor",
|
|
2312
2315
|
author: "Volter AI, Inc.",
|
|
2313
|
-
version: "0.5.
|
|
2316
|
+
version: "0.5.84",
|
|
2314
2317
|
publishConfig: {
|
|
2315
2318
|
access: "public"
|
|
2316
2319
|
},
|
|
@@ -2359,22 +2362,22 @@ var package_default = {
|
|
|
2359
2362
|
}
|
|
2360
2363
|
},
|
|
2361
2364
|
dependencies: {
|
|
2362
|
-
"@volter/editor-core": "0.5.
|
|
2363
|
-
"@volter/editor-game": "0.5.
|
|
2364
|
-
"@volter/editor-react": "0.5.
|
|
2365
|
-
"@volter/editor-threejs": "0.5.
|
|
2366
|
-
"@volter/editor-xstate": "0.5.
|
|
2367
|
-
"@volter/editor-blender": "0.1.
|
|
2368
|
-
"@volter/dawproject": "0.5.
|
|
2369
|
-
"@volter/editor-dawproject": "0.5.
|
|
2370
|
-
"@volter/blender-engine": "0.1.
|
|
2371
|
-
"@volter/editor-project": "0.5.
|
|
2372
|
-
"@volter/editor-sdk": "0.5.
|
|
2373
|
-
"@volter/editor-live": "0.5.
|
|
2374
|
-
"@volter/game-live": "0.5.
|
|
2365
|
+
"@volter/editor-core": "0.5.84",
|
|
2366
|
+
"@volter/editor-game": "0.5.84",
|
|
2367
|
+
"@volter/editor-react": "0.5.84",
|
|
2368
|
+
"@volter/editor-threejs": "0.5.84",
|
|
2369
|
+
"@volter/editor-xstate": "0.5.84",
|
|
2370
|
+
"@volter/editor-blender": "0.1.24",
|
|
2371
|
+
"@volter/dawproject": "0.5.84",
|
|
2372
|
+
"@volter/editor-dawproject": "0.5.84",
|
|
2373
|
+
"@volter/blender-engine": "0.1.22",
|
|
2374
|
+
"@volter/editor-project": "0.5.84",
|
|
2375
|
+
"@volter/editor-sdk": "0.5.84",
|
|
2376
|
+
"@volter/editor-live": "0.5.84",
|
|
2377
|
+
"@volter/game-live": "0.5.84",
|
|
2375
2378
|
"@modelcontextprotocol/sdk": "1.30.0",
|
|
2376
|
-
"@volter/game-runtime": "0.5.
|
|
2377
|
-
"@volter/threejs-runtime": "0.5.
|
|
2379
|
+
"@volter/game-runtime": "0.5.84",
|
|
2380
|
+
"@volter/threejs-runtime": "0.5.84",
|
|
2378
2381
|
undici: "7.29.1",
|
|
2379
2382
|
typescript: "5.9.3",
|
|
2380
2383
|
"@colyseus/schema": "^4.0.14",
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volter/game-editor",
|
|
3
3
|
"author": "Volter AI, Inc.",
|
|
4
|
-
"version": "0.5.
|
|
4
|
+
"version": "0.5.84",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -50,22 +50,22 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@volter/editor-core": "0.5.
|
|
54
|
-
"@volter/editor-game": "0.5.
|
|
55
|
-
"@volter/editor-react": "0.5.
|
|
56
|
-
"@volter/editor-threejs": "0.5.
|
|
57
|
-
"@volter/editor-xstate": "0.5.
|
|
58
|
-
"@volter/editor-blender": "0.1.
|
|
59
|
-
"@volter/dawproject": "0.5.
|
|
60
|
-
"@volter/editor-dawproject": "0.5.
|
|
61
|
-
"@volter/blender-engine": "0.1.
|
|
62
|
-
"@volter/editor-project": "0.5.
|
|
63
|
-
"@volter/editor-sdk": "0.5.
|
|
64
|
-
"@volter/editor-live": "0.5.
|
|
65
|
-
"@volter/game-live": "0.5.
|
|
53
|
+
"@volter/editor-core": "0.5.84",
|
|
54
|
+
"@volter/editor-game": "0.5.84",
|
|
55
|
+
"@volter/editor-react": "0.5.84",
|
|
56
|
+
"@volter/editor-threejs": "0.5.84",
|
|
57
|
+
"@volter/editor-xstate": "0.5.84",
|
|
58
|
+
"@volter/editor-blender": "0.1.24",
|
|
59
|
+
"@volter/dawproject": "0.5.84",
|
|
60
|
+
"@volter/editor-dawproject": "0.5.84",
|
|
61
|
+
"@volter/blender-engine": "0.1.22",
|
|
62
|
+
"@volter/editor-project": "0.5.84",
|
|
63
|
+
"@volter/editor-sdk": "0.5.84",
|
|
64
|
+
"@volter/editor-live": "0.5.84",
|
|
65
|
+
"@volter/game-live": "0.5.84",
|
|
66
66
|
"@modelcontextprotocol/sdk": "1.30.0",
|
|
67
|
-
"@volter/game-runtime": "0.5.
|
|
68
|
-
"@volter/threejs-runtime": "0.5.
|
|
67
|
+
"@volter/game-runtime": "0.5.84",
|
|
68
|
+
"@volter/threejs-runtime": "0.5.84",
|
|
69
69
|
"undici": "7.29.1",
|
|
70
70
|
"typescript": "5.9.3",
|
|
71
71
|
"@colyseus/schema": "^4.0.14",
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { type ThreeElements, useFrame, useThree } from '@react-three/fiber';
|
|
2
|
-
import type { ReflectionProbeConfig } from '@volter/threejs-runtime/adapter/reflection-probe';
|
|
3
2
|
import { type ReactNode, useLayoutEffect, useRef, useState } from 'react';
|
|
4
3
|
import type * as THREE from 'three';
|
|
5
|
-
import { createReflectionProbeMark } from './probe-controller';
|
|
4
|
+
import { createReflectionProbeMark, type VolumeReflectionProbeConfig } from './probe-controller';
|
|
6
5
|
import {
|
|
7
6
|
acquireReflectionProbeRegistry,
|
|
8
7
|
type ReflectionProbeRegistryLease,
|
|
@@ -60,6 +59,15 @@ export type ReflectionProbeProps = Omit<ThreeElements['group'], 'children'> & {
|
|
|
60
59
|
readonly blendDistance?: number;
|
|
61
60
|
readonly priority?: number;
|
|
62
61
|
readonly intensity?: number;
|
|
62
|
+
/**
|
|
63
|
+
* The diffuse light the volume material takes from this probe: its capture
|
|
64
|
+
* (default), the constant `diffuseColor`, or none. See `ReflectionProbeDiffuse`.
|
|
65
|
+
*/
|
|
66
|
+
readonly diffuse?: 'capture' | 'color' | 'none';
|
|
67
|
+
/** Scales the probe's diffuse light in the volume material; defaults to `intensity`. */
|
|
68
|
+
readonly diffuseIntensity?: number;
|
|
69
|
+
/** Linear RGB of the `color` diffuse. */
|
|
70
|
+
readonly diffuseColor?: [number, number, number];
|
|
63
71
|
readonly parallaxProjection?: boolean;
|
|
64
72
|
/** Full local-space projection-box dimensions. */
|
|
65
73
|
readonly parallaxSize?: [number, number, number];
|
|
@@ -73,6 +81,19 @@ export type ReflectionProbeProps = Omit<ThreeElements['group'], 'children'> & {
|
|
|
73
81
|
readonly captureShadows?: boolean;
|
|
74
82
|
};
|
|
75
83
|
|
|
84
|
+
/** The diffuse fields a probe states, leaving out the ones it does not (they keep their defaults). */
|
|
85
|
+
function diffuseConfig(
|
|
86
|
+
diffuse: ReflectionProbeProps['diffuse'],
|
|
87
|
+
diffuseIntensity: number | undefined,
|
|
88
|
+
diffuseColor: [number, number, number] | undefined,
|
|
89
|
+
): Partial<VolumeReflectionProbeConfig> {
|
|
90
|
+
return {
|
|
91
|
+
...(diffuse === undefined ? {} : { diffuse }),
|
|
92
|
+
...(diffuseIntensity === undefined ? {} : { diffuseIntensity }),
|
|
93
|
+
...(diffuseColor === undefined ? {} : { diffuseColor }),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
76
97
|
export function ReflectionProbe({
|
|
77
98
|
name = 'Reflection Probe',
|
|
78
99
|
children,
|
|
@@ -82,6 +103,9 @@ export function ReflectionProbe({
|
|
|
82
103
|
blendDistance = 1,
|
|
83
104
|
priority = 0,
|
|
84
105
|
intensity = 1,
|
|
106
|
+
diffuse,
|
|
107
|
+
diffuseIntensity,
|
|
108
|
+
diffuseColor,
|
|
85
109
|
parallaxProjection = true,
|
|
86
110
|
parallaxSize = [10, 6, 10],
|
|
87
111
|
parallaxOffset = [0, 0, 0],
|
|
@@ -109,6 +133,7 @@ export function ReflectionProbe({
|
|
|
109
133
|
blendDistance,
|
|
110
134
|
priority,
|
|
111
135
|
intensity,
|
|
136
|
+
...diffuseConfig(diffuse, diffuseIntensity, diffuseColor),
|
|
112
137
|
parallaxProjection,
|
|
113
138
|
parallaxSize,
|
|
114
139
|
parallaxOffset,
|
|
@@ -121,13 +146,14 @@ export function ReflectionProbe({
|
|
|
121
146
|
captureShadows,
|
|
122
147
|
}),
|
|
123
148
|
);
|
|
124
|
-
const config:
|
|
149
|
+
const config: VolumeReflectionProbeConfig = {
|
|
125
150
|
shape,
|
|
126
151
|
size,
|
|
127
152
|
radius,
|
|
128
153
|
blendDistance,
|
|
129
154
|
priority,
|
|
130
155
|
intensity,
|
|
156
|
+
...diffuseConfig(diffuse, diffuseIntensity, diffuseColor),
|
|
131
157
|
parallaxProjection,
|
|
132
158
|
parallaxSize,
|
|
133
159
|
parallaxOffset,
|
|
@@ -149,6 +175,9 @@ export function ReflectionProbe({
|
|
|
149
175
|
blendDistance,
|
|
150
176
|
priority,
|
|
151
177
|
intensity,
|
|
178
|
+
diffuse,
|
|
179
|
+
diffuseIntensity,
|
|
180
|
+
diffuseColor,
|
|
152
181
|
parallaxProjection,
|
|
153
182
|
parallaxSize,
|
|
154
183
|
parallaxOffset,
|
|
@@ -170,8 +199,8 @@ export function ReflectionProbe({
|
|
|
170
199
|
unobserve.current = acquired.registry.observe((probes: readonly ReflectionProbeRuntime[]) => {
|
|
171
200
|
const self = probes.find((probe) => probe.node === object);
|
|
172
201
|
const published = self?.ready ? self.texture : null;
|
|
173
|
-
// Runs
|
|
174
|
-
// actually changes identity,
|
|
202
|
+
// Runs whenever the registry changes; React re-renders only when the
|
|
203
|
+
// published texture actually changes identity, once per capture at most.
|
|
175
204
|
setEnvMap((current) => (current === published ? current : published));
|
|
176
205
|
});
|
|
177
206
|
return () => {
|
|
@@ -3,6 +3,7 @@ export {
|
|
|
3
3
|
type ReflectionProbeProps,
|
|
4
4
|
type ReflectionProbePublication,
|
|
5
5
|
} from './ReflectionProbe';
|
|
6
|
+
export type { ReflectionProbeDiffuse, VolumeReflectionProbeConfig } from './probe-controller';
|
|
6
7
|
export {
|
|
7
8
|
acquireReflectionProbeRegistry,
|
|
8
9
|
createReflectionProbeRegistry,
|
|
@@ -4,17 +4,53 @@ import type {
|
|
|
4
4
|
ReflectionProbeSnapshot,
|
|
5
5
|
} from '@volter/threejs-runtime/adapter/reflection-probe';
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* How a probe lights the diffuse term of the volume material that blends it,
|
|
9
|
+
* carried in its mark's config beside the format-neutral fields. Every field
|
|
10
|
+
* is optional; left out, a probe lights the diffuse from its capture, scaled
|
|
11
|
+
* by its `intensity`, as the reflected term is.
|
|
12
|
+
*/
|
|
13
|
+
export interface ReflectionProbeDiffuse {
|
|
14
|
+
/**
|
|
15
|
+
* Where the probe's diffuse light comes from: its `capture` (the default), the
|
|
16
|
+
* constant `color` below, or `none` — the probe lights no diffuse, and a
|
|
17
|
+
* fragment that only it covers keeps the environment's.
|
|
18
|
+
*/
|
|
19
|
+
readonly diffuse?: 'capture' | 'color' | 'none';
|
|
20
|
+
/** Scales the probe's diffuse light. Defaults to the probe's `intensity`. */
|
|
21
|
+
readonly diffuseIntensity?: number;
|
|
22
|
+
/** Linear RGB radiance of the `color` diffuse. */
|
|
23
|
+
readonly diffuseColor?: readonly [number, number, number];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** A probe's config as the capability's own element states it. */
|
|
27
|
+
export type VolumeReflectionProbeConfig = ReflectionProbeConfig & ReflectionProbeDiffuse;
|
|
28
|
+
|
|
7
29
|
export interface MutableReflectionProbeMark extends ReflectionProbeMark {
|
|
8
30
|
updateConfig(config: ReflectionProbeConfig): void;
|
|
9
31
|
setCaptureStatus(snapshot: ReflectionProbeSnapshot): void;
|
|
10
32
|
}
|
|
11
33
|
|
|
12
|
-
/**
|
|
34
|
+
/**
|
|
35
|
+
* The config as a capture sees it: everything but the diffuse fields, which
|
|
36
|
+
* only the volume material reads (from the probe's uniforms, not its capture).
|
|
37
|
+
*/
|
|
38
|
+
function captureSignature(config: ReflectionProbeConfig): string {
|
|
39
|
+
const { diffuse, diffuseIntensity, diffuseColor, ...captured } = config as VolumeReflectionProbeConfig;
|
|
40
|
+
return JSON.stringify(captured);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* One live projection of a component's JSX props and capture state. A config
|
|
45
|
+
* change that a capture sees queues a recapture (outside Manual); one that
|
|
46
|
+
* only changes the diffuse fields takes effect without one.
|
|
47
|
+
*/
|
|
13
48
|
export function createReflectionProbeMark(
|
|
14
49
|
initial: ReflectionProbeConfig,
|
|
15
50
|
): MutableReflectionProbeMark {
|
|
16
51
|
let config = initial;
|
|
17
52
|
let configSignature = JSON.stringify(initial);
|
|
53
|
+
let capturedSignature = captureSignature(initial);
|
|
18
54
|
let revision = 0;
|
|
19
55
|
let snapshot: ReflectionProbeSnapshot = {
|
|
20
56
|
status: initial.captureMode === 'manual' ? 'idle' : 'queued',
|
|
@@ -47,12 +83,17 @@ export function createReflectionProbeMark(
|
|
|
47
83
|
const signature = JSON.stringify(next);
|
|
48
84
|
if (signature === configSignature) return;
|
|
49
85
|
const previousMode = config.captureMode;
|
|
86
|
+
const nextCaptured = captureSignature(next);
|
|
87
|
+
const recapture = nextCaptured !== capturedSignature;
|
|
50
88
|
config = next;
|
|
51
89
|
configSignature = signature;
|
|
52
|
-
|
|
90
|
+
capturedSignature = nextCaptured;
|
|
91
|
+
// A diffuse-only change needs no capture: the registry sees the new config
|
|
92
|
+
// and the volume material rewrites its uniforms.
|
|
93
|
+
if (recapture && next.captureMode !== 'manual') {
|
|
53
94
|
revision += 1;
|
|
54
95
|
snapshot = { status: 'queued', lastCapturedAt: snapshot.lastCapturedAt };
|
|
55
|
-
} else if (previousMode !== 'manual' && snapshot.status !== 'ready') {
|
|
96
|
+
} else if (next.captureMode === 'manual' && previousMode !== 'manual' && snapshot.status !== 'ready') {
|
|
56
97
|
// Entering Manual never performs an implicit capture. A valid existing
|
|
57
98
|
// result remains valid; otherwise the explicit Recapture button is the
|
|
58
99
|
// only operation that advances the capture revision.
|
|
@@ -71,9 +71,17 @@ interface ProbeState extends ReflectionProbeRuntime {
|
|
|
71
71
|
ready: boolean;
|
|
72
72
|
capturedRevision: number;
|
|
73
73
|
readonly capturedTransform: Matrix4;
|
|
74
|
+
/** The node's world matrix and the mark's config as observers were last told them. */
|
|
75
|
+
readonly publishedTransform: Matrix4;
|
|
76
|
+
publishedConfig: ReflectionProbeMark['config'] | null;
|
|
74
77
|
}
|
|
75
78
|
|
|
76
|
-
/**
|
|
79
|
+
/**
|
|
80
|
+
* Called when an observer starts observing, and again whenever what it reads
|
|
81
|
+
* changes: a probe added or removed, a capture window opening or closing (and
|
|
82
|
+
* the result it published), a probe's node moved or its config changed. A
|
|
83
|
+
* frame in which nothing changed calls no observer.
|
|
84
|
+
*/
|
|
77
85
|
export type ReflectionProbeObserver = (
|
|
78
86
|
probes: readonly ReflectionProbeRuntime[],
|
|
79
87
|
capturing: boolean,
|
|
@@ -129,6 +137,8 @@ function makeProbe(node: Object3D, mark: ReflectionProbeMark): ProbeState {
|
|
|
129
137
|
parallaxOffset: new Vector3(),
|
|
130
138
|
captureOffset: new Vector3(),
|
|
131
139
|
capturedTransform: new Matrix4().makeScale(0, 0, 0),
|
|
140
|
+
publishedTransform: new Matrix4().makeScale(0, 0, 0),
|
|
141
|
+
publishedConfig: null,
|
|
132
142
|
filtered: null,
|
|
133
143
|
atlases: new Map(),
|
|
134
144
|
texture: null,
|
|
@@ -174,6 +184,10 @@ function releaseProbeResources(probe: ProbeState): void {
|
|
|
174
184
|
probe.ready = false;
|
|
175
185
|
}
|
|
176
186
|
|
|
187
|
+
/**
|
|
188
|
+
* Bring the probe's volume up to date with its node and config; true when
|
|
189
|
+
* that changed what an observer reads since it was last told.
|
|
190
|
+
*/
|
|
177
191
|
function refreshProbe(probe: ProbeState): boolean {
|
|
178
192
|
const config = probe.mark.config;
|
|
179
193
|
const cubeSize = cubeSizeOf(probe.mark);
|
|
@@ -194,9 +208,15 @@ function refreshProbe(probe: ProbeState): boolean {
|
|
|
194
208
|
probe.parallaxExtents.fromArray(config.parallaxSize).multiplyScalar(0.5);
|
|
195
209
|
probe.parallaxOffset.fromArray(config.parallaxOffset);
|
|
196
210
|
probe.captureOffset.fromArray(config.captureOffset);
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
211
|
+
if (config.captureMode === 'on-change' && movedSinceCapture(probe)) probe.ready = false;
|
|
212
|
+
const changed = probe.publishedConfig !== config || !probe.publishedTransform.equals(probe.node.matrixWorld);
|
|
213
|
+
probe.publishedConfig = config;
|
|
214
|
+
probe.publishedTransform.copy(probe.node.matrixWorld);
|
|
215
|
+
return changed;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function movedSinceCapture(probe: ProbeState): boolean {
|
|
219
|
+
return !probe.capturedTransform.equals(probe.node.matrixWorld);
|
|
200
220
|
}
|
|
201
221
|
|
|
202
222
|
/** The cube target and camera, created here because only a capture needs them. */
|
|
@@ -300,7 +320,7 @@ export function createReflectionProbeRegistry(
|
|
|
300
320
|
for (let offset = 0; offset < probes.length; offset += 1) {
|
|
301
321
|
const index = (cursor + offset) % probes.length;
|
|
302
322
|
const probe = probes[index]!;
|
|
303
|
-
const moved =
|
|
323
|
+
const moved = movedSinceCapture(probe);
|
|
304
324
|
const mode = probe.mark.config.captureMode;
|
|
305
325
|
const due =
|
|
306
326
|
mode === 'realtime' ||
|
|
@@ -336,10 +356,15 @@ export function createReflectionProbeRegistry(
|
|
|
336
356
|
update(frameToken) {
|
|
337
357
|
if (disposed || frameToken === lastFrame || !canCaptureEnvironment(renderer)) return;
|
|
338
358
|
lastFrame = frameToken;
|
|
339
|
-
|
|
359
|
+
let changed = false;
|
|
360
|
+
for (const probe of probes) {
|
|
361
|
+
const ready = probe.ready;
|
|
362
|
+
if (refreshProbe(probe) || probe.ready !== ready) changed = true;
|
|
363
|
+
}
|
|
340
364
|
const due = nextCapture();
|
|
341
365
|
if (due) capture(due);
|
|
342
|
-
|
|
366
|
+
// A capture opened a window (and published a result): closing it tells every observer.
|
|
367
|
+
if (due || changed) notify(false);
|
|
343
368
|
},
|
|
344
369
|
dispose() {
|
|
345
370
|
if (disposed) return;
|