@volter/game-editor 0.5.81 → 0.5.83

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.
Files changed (347) hide show
  1. package/BUNDLED_NOTICES +22 -22
  2. package/catalog/entries/blender.json +2 -2
  3. package/catalog/entries/music.json +2 -2
  4. package/catalog/entries/reflections.json +1 -1
  5. package/catalog/project-source/src/lib/reflections/ReflectionProbe.tsx +34 -5
  6. package/catalog/project-source/src/lib/reflections/index.ts +1 -0
  7. package/catalog/project-source/src/lib/reflections/probe-controller.ts +44 -3
  8. package/catalog/project-source/src/lib/reflections/reflection-probe-registry.ts +32 -7
  9. package/catalog/project-source/src/lib/reflections/volume-reflection-material.ts +638 -160
  10. package/dist/.vite/manifest.json +2184 -2165
  11. package/dist/assets/{AssetBudgetPanel-CfVYW4ED.js → AssetBudgetPanel-SrgQ5Lx5.js} +3 -3
  12. package/dist/assets/{AudioViewer-J10BXrtm.js → AudioViewer-BqEwLSZN.js} +1 -1
  13. package/dist/assets/{CanvasBoardDocument-BgIbuOQF.js → CanvasBoardDocument-BfzWZdLX.js} +1 -1
  14. package/dist/assets/CanvasSceneViewport-CQ7ewAlO.js +1 -0
  15. package/dist/assets/{ColorInput-fX1V5l8_.js → ColorInput-DQ6YyPD_.js} +1 -1
  16. package/dist/assets/EntityModelDocument-By-BM9dS.js +1 -0
  17. package/dist/assets/{EnvironmentAssetDocument-QuLkCom9.js → EnvironmentAssetDocument-CrD37BI0.js} +1 -1
  18. package/dist/assets/{GameplaySessionTimeline-D0z5Mc0R.js → GameplaySessionTimeline-DYtnW0Si.js} +1 -1
  19. package/dist/assets/{ImageViewer-DWUPPWRf.js → ImageViewer-CZNpdUEA.js} +1 -1
  20. package/dist/assets/InspectorObjectPreview-gWOVV6Ll.js +1 -0
  21. package/dist/assets/{JsonAssetDocument-C0Lr6RwY.js → JsonAssetDocument-Bg74MDXy.js} +1 -1
  22. package/dist/assets/{LiveModuleDocument-CaGmr0EA.js → LiveModuleDocument-CSqzNMjn.js} +1 -1
  23. package/dist/assets/{LutAssetDocument-B6GmsOYd.js → LutAssetDocument-CsboXa8x.js} +1 -1
  24. package/dist/assets/ModelAssetDocument-DDVoKZpQ.js +1 -0
  25. package/dist/assets/{NonThreeAuthoringBootstrap-byKqf1kp.js → NonThreeAuthoringBootstrap-DcqD6_34.js} +1 -1
  26. package/dist/assets/Object3DDocumentToolbar-p2pd2TuS.js +1 -0
  27. package/dist/assets/Object3DDocumentViewport-BvNfSHi_.js +2 -0
  28. package/dist/assets/{Object3DPreview-pn9i3vwZ.js → Object3DPreview-Bv0fZcdS.js} +1 -1
  29. package/dist/assets/{OnlineAssetDetail-PDCDAcqz.js → OnlineAssetDetail-CPDafN4x.js} +1 -1
  30. package/dist/assets/{PlayBar-DEnkv3v6.js → PlayBar-CBD4rcED.js} +1 -1
  31. package/dist/assets/{QuarksAssetDocument-2x66XymD.js → QuarksAssetDocument-DUUhKUxZ.js} +1 -1
  32. package/dist/assets/{ReactCanvasControls-rFwp2CeP.js → ReactCanvasControls-3ual87uP.js} +1 -1
  33. package/dist/assets/{RootSelectionOverlay-B9rf-SSV.js → RootSelectionOverlay-DtX8yWUQ.js} +1 -1
  34. package/dist/assets/{ShaderAssetDocument-ImI6jbzB.js → ShaderAssetDocument-rkhRdPRk.js} +5 -5
  35. package/dist/assets/{ShadowEditor-DXxVxTzk.js → ShadowEditor-B-3FlftY.js} +1 -1
  36. package/dist/assets/{SourceAssetViewer-CMbp_o7v.js → SourceAssetViewer-CsMPohqK.js} +1 -1
  37. package/dist/assets/StageHost-BOaImrmu.js +2 -0
  38. package/dist/assets/{StoryPreviewMount-D2zLWzWy.js → StoryPreviewMount-BI-ANJix.js} +1 -1
  39. package/dist/assets/{ThreeBoardDocument-nX3UiY3u.js → ThreeBoardDocument-CoBjs8BP.js} +2 -2
  40. package/dist/assets/{ThreeIsolationSceneContent-CGHM0vsg.js → ThreeIsolationSceneContent-uShwSK1O.js} +1 -1
  41. package/dist/assets/{ToolObject3DPreview-BfNcqtFv.js → ToolObject3DPreview-CBZdWA_7.js} +1 -1
  42. package/dist/assets/{Toolbar-BJRJsbHG.js → Toolbar-DJK7o_be.js} +1 -1
  43. package/dist/assets/{TransientHint-CDvYgnzu.js → TransientHint-Dgu6u7U5.js} +1 -1
  44. package/dist/assets/{VideoViewer-B6Dv2zeQ.js → VideoViewer-BwTcASO2.js} +1 -1
  45. package/dist/assets/{ViewportShadingMenu-CrTY7tnk.js → ViewportShadingMenu-DUROUZdC.js} +1 -1
  46. package/dist/assets/{active-ingest-lrfMBhf9.js → active-ingest-Ra07ruDo.js} +3 -3
  47. package/dist/assets/{animation-clock-DktVGV5-.js → animation-clock-CKeqYCt9.js} +1 -1
  48. package/dist/assets/{animation-mixers.service-fkojNtor.js → animation-mixers.service-BNiEU2dA.js} +1 -1
  49. package/dist/assets/{animation-timeline.utility-DDrUZKe8.js → animation-timeline.utility-DQqMh1lF.js} +1 -1
  50. package/dist/assets/{asset-budget-asset.menu-CDlgKSO9.js → asset-budget-asset.menu-DFFih9b4.js} +1 -1
  51. package/dist/assets/{asset-budget.action-D6n-wIR3.js → asset-budget.action-C3SMMeSX.js} +1 -1
  52. package/dist/assets/{asset-budget.document-DFByoagB.js → asset-budget.document-B5NTy5dU.js} +1 -1
  53. package/dist/assets/{asset-budget.menu-B2u_1dWR.js → asset-budget.menu-Cclz2utV.js} +1 -1
  54. package/dist/assets/{asset-editor-persistence-e6bYhVnm.js → asset-editor-persistence-DsIjTddX.js} +1 -1
  55. package/dist/assets/{asset-loaders-Bsq-3hNt.js → asset-loaders-CQiLyapK.js} +1 -1
  56. package/dist/assets/{asset-preview-B7j9QV6N.js → asset-preview-BkFAKkZH.js} +1 -1
  57. package/dist/assets/{audio-unlock.service-7oO4YVIj.js → audio-unlock.service-CupzdUuC.js} +1 -1
  58. package/dist/assets/{audio.utility-9fcsT3YY.js → audio.utility-0il96T5s.js} +1 -1
  59. package/dist/assets/autoplay.service-SQBFaKvM.js +1 -0
  60. package/dist/assets/{babylon-authoring-adapter-BJfYxqDM.js → babylon-authoring-adapter-HZ_SbAet.js} +1 -1
  61. package/dist/assets/{binding-resolver-CBXePHiR.js → binding-resolver-BoecCqTq.js} +2 -2
  62. package/dist/assets/blender-emscripten-engine-Dk-rq4bm.js +2 -0
  63. package/dist/assets/{blender-node-editor.document-xA7eGv3-.js → blender-node-editor.document-B_MGPd1D.js} +1 -1
  64. package/dist/assets/{blender-properties-tab-nY8UOQUL.js → blender-properties-tab-ITmWT_gZ.js} +1 -1
  65. package/dist/assets/blender-runtime-host-CACzxt1b.js +4 -0
  66. package/dist/assets/{blender-runtime-skin-D3Arti9-.js → blender-runtime-skin-CwFW2Hj7.js} +36 -36
  67. package/dist/assets/blender-runtime.document-CozOB5TX.js +13 -0
  68. package/dist/assets/blender-screenshot.menu-BFR44H0L.js +1 -0
  69. package/dist/assets/{blender-timeline.document-DXoQ7y8E.js → blender-timeline.document-C0Zzi8Vo.js} +1 -1
  70. package/dist/assets/{blender-uv-editor.document-CMOyob1N.js → blender-uv-editor.document-BktbYoor.js} +1 -1
  71. package/dist/assets/{blender-version.status-16xnuezC.js → blender-version.status-CLPjDPFV.js} +1 -1
  72. package/dist/assets/blender-wali-engine-CUWSQ_vI.js +2 -0
  73. package/dist/assets/{blender.command-Br2EUk6Q.js → blender.command-DdHEHM62.js} +1 -1
  74. package/dist/assets/{board-guides-whelE-Dr.js → board-guides-DhwRYHGT.js} +1 -1
  75. package/dist/assets/bridge.command-D4O9w4ft.js +3 -0
  76. package/dist/assets/{browserAll-BfZu7-UJ.js → browserAll-BhQBgoJL.js} +1 -1
  77. package/dist/assets/build-player.document-DFr-d97N.js +1 -0
  78. package/dist/assets/{build-profiles.document-DNncGOL3.js → build-profiles.document-C-64YHSV.js} +2 -2
  79. package/dist/assets/{build-progress.status-DnJetNft.js → build-progress.status-DVm95Lmt.js} +1 -1
  80. package/dist/assets/{build-session-BaEmzCkm.js → build-session-C_SD2MNJ.js} +1 -1
  81. package/dist/assets/{build.action-exbllMgM.js → build.action-CPee4b_9.js} +1 -1
  82. package/dist/assets/{build.command-Imykh8LN.js → build.command-CrZ5sHYt.js} +1 -1
  83. package/dist/assets/{build.header-9RzLy3UQ.js → build.header-DDbhXD6t.js} +1 -1
  84. package/dist/assets/{build.menu-CRhA3yID.js → build.menu-Ci-W_A1E.js} +1 -1
  85. package/dist/assets/{build.service-CxIdSEPw.js → build.service-CpUtTLP4.js} +1 -1
  86. package/dist/assets/{camera-BiBGeQQ4.js → camera-BZM67LhS.js} +1 -1
  87. package/dist/assets/{camera-runtime.inspector-DmRFynxC.js → camera-runtime.inspector-BLgPGd97.js} +1 -1
  88. package/dist/assets/{canvas-design-mount-DJ6zQJKG.js → canvas-design-mount-DPAhHuIQ.js} +6 -6
  89. package/dist/assets/{canvas-entry-runtime-Cjga4XYp.js → canvas-entry-runtime-DeyvFKWS.js} +2 -2
  90. package/dist/assets/{canvas-preview-frames-EoYgD6W4.js → canvas-preview-frames-Cm0GJ-40.js} +1 -1
  91. package/dist/assets/{canvas-story-capture.service-D5UntNCd.js → canvas-story-capture.service-Ziv9XNot.js} +2 -2
  92. package/dist/assets/{capability-coverage-9qm5WVwt.js → capability-coverage-39yK3DGt.js} +4 -4
  93. package/dist/assets/collaboration-presence-MR8LW4mZ.js +1 -0
  94. package/dist/assets/{collider-CTHtUvnl.js → collider-4Sgmy-qt.js} +1 -1
  95. package/dist/assets/{component-board.service-yIS2UB-T.js → component-board.service-BdcOkwgn.js} +2 -2
  96. package/dist/assets/{component-board.service-Bf-ETQF0.js → component-board.service-DO_oHdnS.js} +2 -2
  97. package/dist/assets/{component-board.service-foqmr9Ii.js → component-board.service-DRJcETCR.js} +2 -2
  98. package/dist/assets/{component-contracts.service-Do9hADdW.js → component-contracts.service-BYQTO1HK.js} +1 -1
  99. package/dist/assets/{component-instance-root-MBgAuUpp.js → component-instance-root-CzRnRMe6.js} +1 -1
  100. package/dist/assets/{component-verbs.command-DtMdPuyO.js → component-verbs.command-CFv5y_pR.js} +1 -1
  101. package/dist/assets/component-verbs.service-BMBAwqjA.js +1 -0
  102. package/dist/assets/{config-B6tt9xy3.js → config-C6iAsozB.js} +2 -2
  103. package/dist/assets/configurations-Dua_x6Wx.js +1 -0
  104. package/dist/assets/{connection.status-BNPvWdJD.js → connection.status-DQJvEgdT.js} +1 -1
  105. package/dist/assets/{constraints.inspector-DoOn25Lk.js → constraints.inspector-AHeP-LBc.js} +1 -1
  106. package/dist/assets/{content-bounds-BFpR_e--.js → content-bounds-tMCAobKq.js} +1 -1
  107. package/dist/assets/{contract-system-adapters-BRHtWOi_.js → contract-system-adapters-D6ion7SF.js} +1 -1
  108. package/dist/assets/{coverage.service-BB1XhwsL.js → coverage.service-Dm_H5o74.js} +2 -2
  109. package/dist/assets/{create-runtime-B6u6x5eK.js → create-runtime-C82CmCbc.js} +2 -2
  110. package/dist/assets/{curve-D11mIGoN.js → curve-C7Gg05DV.js} +1 -1
  111. package/dist/assets/{data-asset-DejEwzXj.js → data-asset-BquhdFX2.js} +1 -1
  112. package/dist/assets/{data-ref-DJNVzksb.js → data-ref-Dcq9KJIG.js} +1 -1
  113. package/dist/assets/{debug-bridge-DlGIEyTc.js → debug-bridge-DODnLefz.js} +1 -1
  114. package/dist/assets/{debug-registry-Dagj3b6J.js → debug-registry-CwYeaZ9J.js} +1 -1
  115. package/dist/assets/deferred-ingest-play-7EJo_GNB.js +2 -0
  116. package/dist/assets/{design-time-canvas-mount-Cpb_jITI.js → design-time-canvas-mount-DCINR1Hg.js} +2 -2
  117. package/dist/assets/{design-time-layers-DT4X-pJp.js → design-time-layers-i1N-JjPz.js} +1 -1
  118. package/dist/assets/{design-time-mount.service-DEa-41ij.js → design-time-mount.service-CtnijZJJ.js} +2 -2
  119. package/dist/assets/{design-time-mount.service-Ck5Hjxtn.js → design-time-mount.service-DrUVDx2-.js} +2 -2
  120. package/dist/assets/{design-time-react-mount-DCTpYS51.js → design-time-react-mount-CpgoPMGr.js} +1 -1
  121. package/dist/assets/{document-preview-three-TjlxMDBR.js → document-preview-three-CuBUMP4o.js} +1 -1
  122. package/dist/assets/{dom-authoring-adapter-C3ZsI41l.js → dom-authoring-adapter-DSM-2JgU.js} +1 -1
  123. package/dist/assets/{draco3d-Ddr7J1sS.js → draco3d--d91Ay95.js} +1 -1
  124. package/dist/assets/{edit-mode-audio.service-D047aZ6I.js → edit-mode-audio.service-C9_299G0.js} +1 -1
  125. package/dist/assets/{edit-mode-authoring-DubxVdEM.js → edit-mode-authoring-DgvzXpiM.js} +1 -1
  126. package/dist/assets/{edit-mode-networking.service-DitjC2ZL.js → edit-mode-networking.service-B6l9ESo-.js} +1 -1
  127. package/dist/assets/editor-api-D9NJWRVZ.js +1 -0
  128. package/dist/assets/{editor-layers-BK3fNRb7.js → editor-layers-D7HXdvWY.js} +1 -1
  129. package/dist/assets/{editor-shell-store-Bro0arjr.js → editor-shell-store-CGWO4Ldz.js} +1 -1
  130. package/dist/assets/{entity-object-BFppZ54X.js → entity-object-Dl04-FE8.js} +1 -1
  131. package/dist/assets/{extend-MkXq6t1H.js → extend-GXzJ7XU_.js} +1 -1
  132. package/dist/assets/fork-menu-DO1KASKk.js +1 -0
  133. package/dist/assets/{frame-debugger-store-xbOH83D0.js → frame-debugger-store-DOewah-x.js} +1 -1
  134. package/dist/assets/{game-contract-seams-5IUqvr7b.js → game-contract-seams-B5a-Ev-f.js} +1 -1
  135. package/dist/assets/{game-css-scope-transform-DDAoTvZQ.js → game-css-scope-transform-CQhuDfMR.js} +1 -1
  136. package/dist/assets/game-document.service-CMc6SfH9.js +1 -0
  137. package/dist/assets/{game-eval.command-DcFoKUe7.js → game-eval.command-MY5YxNL-.js} +1 -1
  138. package/dist/assets/{game-module-access-ABBzTWg7.js → game-module-access-BafPamOR.js} +1 -1
  139. package/dist/assets/game-network-COQRxS_4.js +22 -0
  140. package/dist/assets/gameplay-export-i_fnSpRp.js +1 -0
  141. package/dist/assets/gameplay-replay-BM_frdpr.js +1 -0
  142. package/dist/assets/{gameplay.command-qdQLKC3A.js → gameplay.command-Dkp2IG9Q.js} +1 -1
  143. package/dist/assets/generation-jobs-B6T_j2D_.js +1 -0
  144. package/dist/assets/{generation.service-CdwRWoIV.js → generation.service-BXJTa6dr.js} +1 -1
  145. package/dist/assets/{generations-nW4LG5qG.js → generations-DqNhoKz8.js} +1 -1
  146. package/dist/assets/{generations.status-DgjVrgGL.js → generations.status-Dt8TW7Lk.js} +1 -1
  147. package/dist/assets/{hierarchy-marks-Pb6wnNcu.js → hierarchy-marks-fSNwXIFe.js} +1 -1
  148. package/dist/assets/{hosted-asset-materialization-BCnTLunr.js → hosted-asset-materialization-76jdNP28.js} +2 -2
  149. package/dist/assets/ibl-override-material-C09OAhCc.js +6 -0
  150. package/dist/assets/{index-CvGsVzTo.js → index-C5tasxXb.js} +294 -294
  151. package/dist/assets/{index-D7q1gYjq.js → index-CKznhnFr.js} +1 -1
  152. package/dist/assets/{index-BPuw4yre.js → index-CO6HFW9e.js} +1 -1
  153. package/dist/assets/{index-CaZZDx3x.js → index-Cf-uQvPt.js} +1 -1
  154. package/dist/assets/{index-BlWeDGvp.js → index-Cub6ESrb.js} +2 -2
  155. package/dist/assets/{index-Ds9fZyOU.js → index-D5pDWxZH.js} +1 -1
  156. package/dist/assets/{index-BYoN6-Qw.js → index-c6fd_bqy.js} +1 -1
  157. package/dist/assets/{index-Bz4YDJ7o.js → index-cGaEzVz5.js} +1 -1
  158. package/dist/assets/{index-Db2ixdvK.js → index-cNdu8TlA.js} +1 -1
  159. package/dist/assets/{inference-diagnostics-BCwXk-CS.js → inference-diagnostics-D7uYs70A.js} +1 -1
  160. package/dist/assets/{ingest-boot-viewport-BPER30gQ.js → ingest-boot-viewport-CjtFKkMD.js} +1 -1
  161. package/dist/assets/ingest-siblings-Dlx0quan.js +1 -0
  162. package/dist/assets/{ingest-source-persistence-CPlDA2D8.js → ingest-source-persistence-SAe0xIy-.js} +1 -1
  163. package/dist/assets/{ingest.service-BhwFGlqY.js → ingest.service-BXkZ1vXa.js} +1 -1
  164. package/dist/assets/{inspect-DxfAFkho.js → inspect-BqIL-41D.js} +1 -1
  165. package/dist/assets/instances.command-wpQVWPb9.js +1 -0
  166. package/dist/assets/{json-history-resource-CckDydoO.js → json-history-resource-BUJgH5iK.js} +1 -1
  167. package/dist/assets/layered-pick-RElCrqXb.js +1 -0
  168. package/dist/assets/{light-DF4nTzTq.js → light-DLADuHH2.js} +1 -1
  169. package/dist/assets/live-project-verbs-Cc1GXtG5.js +1 -0
  170. package/dist/assets/{machine.document-DaPLAXaa.js → machine.document-ER7OD-37.js} +1 -1
  171. package/dist/assets/{machines.finder-C9s8SFtp.js → machines.finder-CZ2ZxPFR.js} +1 -1
  172. package/dist/assets/material-CspuVO3Q.js +1 -0
  173. package/dist/assets/{material-factory-CCcnlv8E.js → material-factory-KV4mqSzl.js} +1 -1
  174. package/dist/assets/{mesh-CVBvSsCX.js → mesh-CrIkl8_H.js} +1 -1
  175. package/dist/assets/{model-asset-sections.service-vVRv6iOD.js → model-asset-sections.service-Cyom1FRs.js} +1 -1
  176. package/dist/assets/{model-inspection-Dd-hn5v2.js → model-inspection-BLOiPoW4.js} +1 -1
  177. package/dist/assets/{model-thumbnail-BDU_QU37.js → model-thumbnail-B7DVMYtQ.js} +1 -1
  178. package/dist/assets/{models.finder-CQMZz5xX.js → models.finder-At2wuWE3.js} +1 -1
  179. package/dist/assets/{module-mode-DcBz3aI7.js → module-mode-CHqvCb69.js} +2 -2
  180. package/dist/assets/{mount-canvas-ingest-root-DMWeT_c3.js → mount-canvas-ingest-root-uISMj3zn.js} +2 -2
  181. package/dist/assets/{mount-dom-ingest-root-Bx1TmleJ.js → mount-dom-ingest-root-C8PsgrCd.js} +2 -2
  182. package/dist/assets/{mount-ingest-root-BDP8atUq.js → mount-ingest-root-Dmb_D_oY.js} +2 -2
  183. package/dist/assets/{mount-manifest-C5QVCZlS.js → mount-manifest-CGwCOZO6.js} +1 -1
  184. package/dist/assets/{mount-three-ingest-root-DSmhgOJn.js → mount-three-ingest-root-BGdd6UoG.js} +1 -1
  185. package/dist/assets/{mounted-authoring-D-tXkNKH.js → mounted-authoring-BS53gpIm.js} +1 -1
  186. package/dist/assets/{mounted-story-viewport-source-Snu9yn1n.js → mounted-story-viewport-source-CL9Ra-_N.js} +1 -1
  187. package/dist/assets/{native-debug-module-XfhvyMrK.js → native-debug-module-DRmkIrIW.js} +1 -1
  188. package/dist/assets/{navigation-CTTcWe0R.js → navigation-DOuNvaV6.js} +1 -1
  189. package/dist/assets/{navmesh.menu-mFjQ30B0.js → navmesh.menu-9g4nO2dp.js} +1 -1
  190. package/dist/assets/{navmesh.service-BJPp7ZXu.js → navmesh.service-B7MllQj9.js} +1 -1
  191. package/dist/assets/network-observer.service-DY_39EdG.js +1 -0
  192. package/dist/assets/{network.utility-C-_7MTIV.js → network.utility-BgzPLUS5.js} +1 -1
  193. package/dist/assets/object3d-document-session-registry-Bk-I9jZH.js +2 -0
  194. package/dist/assets/{oid-transform-Bgdv7kST.js → oid-transform-CHeHFNUu.js} +1 -1
  195. package/dist/assets/{particles-CHXYb9Jd.js → particles-RD4cI69F.js} +1 -1
  196. package/dist/assets/{pixi-authoring-adapter-lj5CidSR.js → pixi-authoring-adapter-BuP3Qc7X.js} +1 -1
  197. package/dist/assets/{pixi-live-write-target-BEL9GCCr.js → pixi-live-write-target-DzyXhmiw.js} +1 -1
  198. package/dist/assets/play.command-C7iZbm26.js +2 -0
  199. package/dist/assets/{presentation-CmK-bEDi.js → presentation-43UAzXCV.js} +1 -1
  200. package/dist/assets/{product-gjrRHe-K.js → product-BfaoEtK8.js} +1 -1
  201. package/dist/assets/{profiler.action-CZ6UQi9A.js → profiler.action-DIp4OPNA.js} +1 -1
  202. package/dist/assets/{profiler.menu-DxbnC3d6.js → profiler.menu-tHZqii7c.js} +1 -1
  203. package/dist/assets/{profiler.utility-BvARl7sM.js → profiler.utility-CSg5WNN8.js} +1 -1
  204. package/dist/assets/{project-authoring-session-CBKXzBlD.js → project-authoring-session-BbwFHEzZ.js} +2 -2
  205. package/dist/assets/{properties-bone-constraints.inspector-Co8UpbhC.js → properties-bone-constraints.inspector-ooGWoGiI.js} +1 -1
  206. package/dist/assets/{properties-bone.inspector-CFXh2lQH.js → properties-bone.inspector-C_UdJjDe.js} +1 -1
  207. package/dist/assets/{properties-collection.inspector-Jq9X8fEq.js → properties-collection.inspector-Dm4MNZQK.js} +1 -1
  208. package/dist/assets/{properties-constraints.inspector-CMcKD_Jc.js → properties-constraints.inspector-DlCHF3Nd.js} +1 -1
  209. package/dist/assets/{properties-data.inspector-cP3izSat.js → properties-data.inspector-DTfv2ILq.js} +1 -1
  210. package/dist/assets/{properties-material.inspector-CrZIovv9.js → properties-material.inspector-C_-GsOvF.js} +1 -1
  211. package/dist/assets/{properties-modifiers.inspector-DqQMxoiL.js → properties-modifiers.inspector-BELGiG49.js} +1 -1
  212. package/dist/assets/{properties-object.inspector-DM63eANJ.js → properties-object.inspector-COLlzAo4.js} +1 -1
  213. package/dist/assets/{properties-output.inspector-B475IBEd.js → properties-output.inspector-DLpqLRCp.js} +1 -1
  214. package/dist/assets/{properties-particles.inspector-vGXQ4kWx.js → properties-particles.inspector-C8ZhuG-X.js} +1 -1
  215. package/dist/assets/{properties-physics.inspector-CfwqpVGS.js → properties-physics.inspector-DQ3fUdPx.js} +1 -1
  216. package/dist/assets/{properties-render.inspector-BYLknsM7.js → properties-render.inspector-DlPuoXQ-.js} +1 -1
  217. package/dist/assets/{properties-scene.inspector-BcIZBfGk.js → properties-scene.inspector-itnV8qGu.js} +1 -1
  218. package/dist/assets/{properties-texture.inspector-p3Owurhl.js → properties-texture.inspector-BZbBAQ_O.js} +1 -1
  219. package/dist/assets/{properties-view-layer.inspector-CN-5jzB9.js → properties-view-layer.inspector-CNOevOy3.js} +1 -1
  220. package/dist/assets/{properties-world.inspector-DVp8fYWx.js → properties-world.inspector-C7u-dAkO.js} +1 -1
  221. package/dist/assets/r3f-design-session-DbXiRez3.js +2 -0
  222. package/dist/assets/{r3f-physics-binding-BcTFD1ZS.js → r3f-physics-binding-B8Je7bNy.js} +1 -1
  223. package/dist/assets/{r3f-source-authoring-adapter-DVnhzoxp.js → r3f-source-authoring-adapter-CarxaAwC.js} +1 -1
  224. package/dist/assets/{react-canvas-navigation-CBorZtWB.js → react-canvas-navigation-BTVCmK_d.js} +1 -1
  225. package/dist/assets/{react-inspector.service-Dc99kogU.js → react-inspector.service-BV9ZVls7.js} +1 -1
  226. package/dist/assets/{react-story-board-6-BjI32N.js → react-story-board-CETbMKNG.js} +1 -1
  227. package/dist/assets/{react-three-rapier.esm-BO2XPUEM.js → react-three-rapier.esm-BQ3IBcaP.js} +1 -1
  228. package/dist/assets/{react-world-authoring-adapter-B6BiehHR.js → react-world-authoring-adapter-DsywMgco.js} +1 -1
  229. package/dist/assets/{realm-services-DCnaxwIb.js → realm-services-DoN23Ol2.js} +1 -1
  230. package/dist/assets/{reflection-probe-capture.inspector-CWneVfEe.js → reflection-probe-capture.inspector-D0grUDdX.js} +1 -1
  231. package/dist/assets/{registry-BQ9YcFZF.js → registry-CZxNkOhN.js} +1 -1
  232. package/dist/assets/{relative-import-specifier-BvzqkvYS.js → relative-import-specifier-DMppRnNH.js} +1 -1
  233. package/dist/assets/{render-env-F320_iHT.js → render-env-BAO3Rc6G.js} +1 -1
  234. package/dist/assets/{render-features-DFwHsGxu.js → render-features-CBm-s0QE.js} +1 -1
  235. package/dist/assets/{render-settings-BPcHd4LA.js → render-settings-DCZaLK-j.js} +1 -1
  236. package/dist/assets/{resolve-three-CnxafYrg.js → resolve-three-Bwj7rkZB.js} +13 -13
  237. package/dist/assets/{root-seam-contract-CueaHgB9.js → root-seam-contract-DMUsCBFW.js} +1 -1
  238. package/dist/assets/{run-selection-BMQWV9Fn.js → run-selection-DRkjJF-w.js} +1 -1
  239. package/dist/assets/{scene-capture-DcMYbX9_.js → scene-capture-DVXdql_1.js} +1 -1
  240. package/dist/assets/{scene-document.service-CZpLI3b6.js → scene-document.service-CxGQ1BN-.js} +2 -2
  241. package/dist/assets/{scene-framing-nVyYC4Y-.js → scene-framing-DUd4lKtW.js} +1 -1
  242. package/dist/assets/{seeded-random-D0QPgfm6.js → seeded-random-DzZFJTfh.js} +1 -1
  243. package/dist/assets/{setup-renderer-ji8Qt-PP.js → setup-renderer-DF2zFw-E.js} +1 -1
  244. package/dist/assets/{source-object3d-authoring-adapter-owosRx07.js → source-object3d-authoring-adapter-RimvAMDG.js} +1 -1
  245. package/dist/assets/{source-persistence-backend-Djuk0m-7.js → source-persistence-backend-BRcy23H9.js} +1 -1
  246. package/dist/assets/stage-keyboard-JRZ1CNbL.js +1 -0
  247. package/dist/assets/stage-overlay-set-DHN11xPU.js +1 -0
  248. package/dist/assets/{stage-presence-markers-CQlXR9fX.js → stage-presence-markers-AQuGIbnu.js} +1 -1
  249. package/dist/assets/stage-transform-tools-B8u8n8gJ.js +1 -0
  250. package/dist/assets/{standard-viewport-dressing-e4mnLmI6.js → standard-viewport-dressing-NHKaiGVg.js} +3 -3
  251. package/dist/assets/{state-watch.action-Cv3W67Kr.js → state-watch.action-B_conRk5.js} +1 -1
  252. package/dist/assets/{state-watch.menu-Cuziz9RM.js → state-watch.menu-B6GNrnYH.js} +1 -1
  253. package/dist/assets/{state-watch.utility-B1zkFd_6.js → state-watch.utility-CxuUOPhl.js} +1 -1
  254. package/dist/assets/story-capture-DYXQlnlZ.js +1 -0
  255. package/dist/assets/{story-documents-Cjoy-ydN.js → story-documents-D_Tg0idt.js} +1 -1
  256. package/dist/assets/{story-documents.service-Csto-LsX.js → story-documents.service-DQh0SkkQ.js} +1 -1
  257. package/dist/assets/{story-documents.service-gVxcUtso.js → story-documents.service-ES8nxeNu.js} +1 -1
  258. package/dist/assets/story-media-presence-D4w-waFJ.js +1 -0
  259. package/dist/assets/{story-pixi-preview-uA6AevDw.js → story-pixi-preview-B6GFGUQG.js} +1 -1
  260. package/dist/assets/{story-presentation-DgAoj9Qt.js → story-presentation-6qhUDkv4.js} +1 -1
  261. package/dist/assets/{story-three-preview-CQYi1rZ_.js → story-three-preview-BgLSJIlN.js} +2 -2
  262. package/dist/assets/{studio-environment-DK0ke0m0.js → studio-environment-BGU84AOG.js} +1 -1
  263. package/dist/assets/{surface-state-DlUcJe84.js → surface-state-BtNEZzCd.js} +1 -1
  264. package/dist/assets/{syntactic-prop-specs-92aOVqyZ.js → syntactic-prop-specs-B309atpv.js} +1 -1
  265. package/dist/assets/{team-playtest.service-CGBismiY.js → team-playtest.service-B8leDEE-.js} +1 -1
  266. package/dist/assets/{three-bdxPiUPb.js → three-BRZq2Px5.js} +1 -1
  267. package/dist/assets/{three-authoring-adapter-BuqO9MDt.js → three-authoring-adapter-DkfGlaNQ.js} +1 -1
  268. package/dist/assets/three-authoring.service-sOchR4o8.js +2 -0
  269. package/dist/assets/{three-ingest-runtime-CwRnwvb0.js → three-ingest-runtime-D9JoNRjk.js} +1 -1
  270. package/dist/assets/three-integration-D3zBmOoj.js +2 -0
  271. package/dist/assets/three-integration.service-CE8aNHob.js +1 -0
  272. package/dist/assets/{three-projection-core-BO23VKAP.js → three-projection-core-Dt5ARGlM.js} +1 -1
  273. package/dist/assets/{three-state-BhQOBgKC.js → three-state-3qPk0Sq8.js} +1 -1
  274. package/dist/assets/{three-story-capture.service-BAtrzxHq.js → three-story-capture.service-B3U2L4qG.js} +2 -2
  275. package/dist/assets/{three-story-model-D_bo7Gl-.js → three-story-model-C96x-E0V.js} +1 -1
  276. package/dist/assets/{three-viewport-presentation-CWanX03c.js → three-viewport-presentation-DGctcUkE.js} +5 -5
  277. package/dist/assets/transform-mode-request-C0cdwtJf.js +1 -0
  278. package/dist/assets/{transport-strip-CFLRAIQd.js → transport-strip-8OsPiJIm.js} +1 -1
  279. package/dist/assets/transport.header-D1Otpit3.js +1 -0
  280. package/dist/assets/{tuples-BKzzn3tK.js → tuples-CaBWqclR.js} +1 -1
  281. package/dist/assets/ui-board-document-BMTAhmJP.js +2 -0
  282. package/dist/assets/{user-data-DfBtZvxw.js → user-data-4Ls0MsfF.js} +1 -1
  283. package/dist/assets/{utility-view-state-CL4NJh3n.js → utility-view-state-gIzv2Oo_.js} +1 -1
  284. package/dist/assets/{viewport-door-CuJjGYTz.js → viewport-door-C4Fu0zS3.js} +1 -1
  285. package/dist/assets/{viewport-root-presentation-CkSAEMH-.js → viewport-root-presentation-DMMIH4rt.js} +1 -1
  286. package/dist/assets/{viewport-surface-status-D3t-0oLs.js → viewport-surface-status-CdI6sQko.js} +1 -1
  287. package/dist/assets/{webworkerAll-DCmB9rsA.js → webworkerAll-BINEvomm.js} +1 -1
  288. package/dist/assets/worker-Cu9kIzIf.js +2 -0
  289. package/dist/assets/{workspace-arrangement-C9uemwSK.js → workspace-arrangement-w-T2xUGF.js} +1 -1
  290. package/dist/assets/{world-documents-Dvn8e5I0.js → world-documents-feEUCgVE.js} +1 -1
  291. package/dist/assets/{world-root-stage-binding-BB7acZV_.js → world-root-stage-binding-BDb6wt_C.js} +1 -1
  292. package/dist/assets/{xstate-animation-binding-DctwT981.js → xstate-animation-binding-Bhz1Uhhw.js} +1 -1
  293. package/dist/assets/{xstate-animation-meta-s4Vc8Wu3.js → xstate-animation-meta-CvDlYgrt.js} +1 -1
  294. package/dist-node/cli.js +21 -18
  295. package/package.json +16 -16
  296. package/template/src/lib/reflections/ReflectionProbe.tsx +34 -5
  297. package/template/src/lib/reflections/index.ts +1 -0
  298. package/template/src/lib/reflections/probe-controller.ts +44 -3
  299. package/template/src/lib/reflections/reflection-probe-registry.ts +32 -7
  300. package/template/src/lib/reflections/volume-reflection-material.ts +638 -160
  301. package/dist/assets/CanvasSceneViewport-Z8OReqpB.js +0 -1
  302. package/dist/assets/EntityModelDocument-BltE1A7W.js +0 -1
  303. package/dist/assets/InspectorObjectPreview-BpttBw3o.js +0 -1
  304. package/dist/assets/ModelAssetDocument-BBDnXTQm.js +0 -1
  305. package/dist/assets/Object3DDocumentToolbar-BHuuMZnS.js +0 -1
  306. package/dist/assets/Object3DDocumentViewport-ByDDwGJD.js +0 -2
  307. package/dist/assets/StageHost-D1Sz5aud.js +0 -2
  308. package/dist/assets/autoplay.service-DncOrn-K.js +0 -1
  309. package/dist/assets/blender-emscripten-engine-DQljvfR7.js +0 -2
  310. package/dist/assets/blender-runtime-host-CcqXT39s.js +0 -4
  311. package/dist/assets/blender-runtime.document-DDW5jIJe.js +0 -12
  312. package/dist/assets/blender-wali-engine-CO-jG_ik.js +0 -2
  313. package/dist/assets/bridge.command-T93eURWq.js +0 -3
  314. package/dist/assets/build-player.document-DJQLP4xM.js +0 -1
  315. package/dist/assets/collaboration-presence-Q6zcL5v0.js +0 -1
  316. package/dist/assets/component-verbs.service-CJYq28Zw.js +0 -1
  317. package/dist/assets/configurations-BcYOQ7i-.js +0 -1
  318. package/dist/assets/deferred-ingest-play-DZiOEH9a.js +0 -2
  319. package/dist/assets/editor-api-CPh65aBN.js +0 -1
  320. package/dist/assets/fork-menu-DzoCyQvA.js +0 -1
  321. package/dist/assets/game-document.service-CxfiFnxt.js +0 -1
  322. package/dist/assets/game-network-BPTyOFqA.js +0 -22
  323. package/dist/assets/gameplay-export-CRnHCUBb.js +0 -1
  324. package/dist/assets/gameplay-replay-yPaMxi2o.js +0 -1
  325. package/dist/assets/generation-jobs-Cy1oE-Ff.js +0 -1
  326. package/dist/assets/ibl-override-material-CMo_a49U.js +0 -6
  327. package/dist/assets/ingest-siblings-2QHhcCgA.js +0 -1
  328. package/dist/assets/instances.command-BJ-I9vtW.js +0 -1
  329. package/dist/assets/layered-pick-BaxBYi7u.js +0 -1
  330. package/dist/assets/live-project-verbs-B7S-wGjC.js +0 -1
  331. package/dist/assets/material-rGFsBrD0.js +0 -1
  332. package/dist/assets/network-observer.service-CjeDB1Id.js +0 -1
  333. package/dist/assets/object3d-document-session-registry-CWaOPDYg.js +0 -2
  334. package/dist/assets/play.command-C9QyYFgv.js +0 -2
  335. package/dist/assets/r3f-design-session-Cyy1sDGH.js +0 -2
  336. package/dist/assets/stage-keyboard-G6HMStmP.js +0 -1
  337. package/dist/assets/stage-overlay-set-ChHqsFiR.js +0 -1
  338. package/dist/assets/stage-transform-tools-BM9u9Awe.js +0 -1
  339. package/dist/assets/story-capture-Drqhmo7i.js +0 -1
  340. package/dist/assets/story-media-presence-CYc2fP4y.js +0 -1
  341. package/dist/assets/three-authoring.service-CMym8IbB.js +0 -2
  342. package/dist/assets/three-integration-BHoulbny.js +0 -2
  343. package/dist/assets/three-integration.service-BlgF9hV3.js +0 -1
  344. package/dist/assets/transform-mode-request-Bg6T_rOC.js +0 -1
  345. package/dist/assets/transport.header-B3dK1KaC.js +0 -1
  346. package/dist/assets/ui-board-document-DMxgQ-9n.js +0 -2
  347. package/dist/assets/worker-CJIsrsP6.js +0 -2
@@ -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: ReflectionProbeConfig = {
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 every update; React re-renders only when the published texture
174
- // actually changes identity, which is once per capture at most.
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
- /** One live projection of a component's JSX props and capture state. */
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
- if (next.captureMode !== 'manual') {
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
- /** Called every update, and again the moment a capture window opens/closes. */
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
- const moved = !probe.capturedTransform.equals(probe.node.matrixWorld);
198
- if (moved && config.captureMode === 'on-change') probe.ready = false;
199
- return moved;
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 = refreshProbe(probe);
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
- for (const probe of probes) refreshProbe(probe);
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
- notify(false);
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;