@volter/game-editor 0.5.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (653) hide show
  1. package/BUNDLED_NOTICES +11228 -0
  2. package/LICENSE +686 -0
  3. package/LICENSE-BLENDER +1409 -0
  4. package/LICENSE-MCP +21 -0
  5. package/NOTICE +21 -0
  6. package/catalog/entries/audio.json +14 -0
  7. package/catalog/entries/bake.json +36 -0
  8. package/catalog/entries/blender.json +17 -0
  9. package/catalog/entries/react-root.json +24 -0
  10. package/catalog/entries/reflections.json +29 -0
  11. package/catalog/entries/static-batch.json +25 -0
  12. package/catalog/project-source/LICENSE +37 -0
  13. package/catalog/project-source/src/contributions/bake.kind.ts +40 -0
  14. package/catalog/project-source/src/contributions/builder-document.tsx +65 -0
  15. package/catalog/project-source/src/contributions/builder-state.ts +27 -0
  16. package/catalog/project-source/src/contributions/builder-ui.tsx +61 -0
  17. package/catalog/project-source/src/contributions/module-source.ts +502 -0
  18. package/catalog/project-source/src/contributions/pages.finder.ts +61 -0
  19. package/catalog/project-source/src/lib/audio/sfx.ts +255 -0
  20. package/catalog/project-source/src/lib/bake/asset-seed.ts +128 -0
  21. package/catalog/project-source/src/lib/bake/bake-schema.ts +65 -0
  22. package/catalog/project-source/src/lib/bake/clip-layering.ts +203 -0
  23. package/catalog/project-source/src/lib/bake/gltf-bake.ts +657 -0
  24. package/catalog/project-source/src/lib/bake/mesh-slice.ts +157 -0
  25. package/catalog/project-source/src/lib/bake/node-image.ts +463 -0
  26. package/catalog/project-source/src/lib/bake/object3d-bake.ts +121 -0
  27. package/catalog/project-source/src/lib/bake/object3d-lifecycle.ts +15 -0
  28. package/catalog/project-source/src/lib/bake/object3d-source.ts +8 -0
  29. package/catalog/project-source/src/lib/bake/params.ts +75 -0
  30. package/catalog/project-source/src/lib/bake/rest-relative-animation.ts +217 -0
  31. package/catalog/project-source/src/lib/bake/use-model.ts +95 -0
  32. package/catalog/project-source/src/lib/react-root/index.ts +20 -0
  33. package/catalog/project-source/src/lib/react-root/react-root-adapter.tsx +57 -0
  34. package/catalog/project-source/src/lib/reflections/ReflectionProbe.tsx +201 -0
  35. package/catalog/project-source/src/lib/reflections/index.ts +19 -0
  36. package/catalog/project-source/src/lib/reflections/probe-controller.ts +75 -0
  37. package/catalog/project-source/src/lib/reflections/reflection-probe-registry.ts +402 -0
  38. package/catalog/project-source/src/lib/reflections/volume-reflection-material.ts +416 -0
  39. package/catalog/project-source/src/lib/static-batch/Frozen.tsx +91 -0
  40. package/catalog/project-source/src/lib/static-batch/freeze.ts +579 -0
  41. package/catalog/project-source/src/lib/static-batch/index.ts +44 -0
  42. package/catalog/project-source/src/lib/static-batch/mutation-watch.ts +149 -0
  43. package/catalog/project-source/src/lib/static-batch/shadow-cache.ts +171 -0
  44. package/catalog/project-source/src/tools/bake-module.tool.ts +139 -0
  45. package/catalog/project-source/src/tools/bake-preview.tool.ts +475 -0
  46. package/dist/.vite/manifest.json +8304 -0
  47. package/dist/assets/AssetBudgetPanel-J9--TZPU.js +23 -0
  48. package/dist/assets/AudioViewer-CR7333fe.js +1 -0
  49. package/dist/assets/BVHLoader-6bQIXhMX.js +1 -0
  50. package/dist/assets/BufferGeometryUtils-Nz37EVXf.js +1 -0
  51. package/dist/assets/CCDIKSolver-CD7vLpsK.js +1 -0
  52. package/dist/assets/CSS3DRenderer-CL7ABLVK.js +1 -0
  53. package/dist/assets/CanvasSceneViewport-Bpi6gVTC.js +1 -0
  54. package/dist/assets/ColladaLoader-aVOPIsCh.js +3 -0
  55. package/dist/assets/ColorInput-DQBNrW-K.js +1 -0
  56. package/dist/assets/ConvexGeometry-CAzXlPVG.js +1 -0
  57. package/dist/assets/ConvexHull-BINCESFp.js +1 -0
  58. package/dist/assets/CopyShader-BzTUYzf6.js +24 -0
  59. package/dist/assets/DecalGeometry-160KRdfg.js +1 -0
  60. package/dist/assets/EXRLoader-Cdans_oJ.js +1 -0
  61. package/dist/assets/EffectComposer-DQxfsXBZ.js +1 -0
  62. package/dist/assets/EntityModelDocument-Ccvw66N9.js +1 -0
  63. package/dist/assets/EnvironmentAssetDocument-Dg-Qq6O6.js +1 -0
  64. package/dist/assets/FBXLoader-B4MoUtAn.js +1 -0
  65. package/dist/assets/Fbo-Dz-Soul3.js +1 -0
  66. package/dist/assets/FontLoader-CvGoVI5a.js +2 -0
  67. package/dist/assets/GLTFExporter-HgrCle4L.js +1 -0
  68. package/dist/assets/GameplaySessionTimeline-B52W3FVZ.js +1 -0
  69. package/dist/assets/Gltf-UHVWKz65.js +2 -0
  70. package/dist/assets/HDRLoader-THU88oVD.js +5 -0
  71. package/dist/assets/ImageViewer-Tn7s_MnW.js +1 -0
  72. package/dist/assets/InspectorCanvasPreview-CEr_Kxna.js +1 -0
  73. package/dist/assets/InspectorObjectPreview-CVejvLRg.js +1 -0
  74. package/dist/assets/JsonAssetDocument-C7VGcLhu.js +3 -0
  75. package/dist/assets/LineSegments2-CsOpKSiM.js +370 -0
  76. package/dist/assets/MTLLoader-_Xzd4_0p.js +2 -0
  77. package/dist/assets/MarchingCubes-Bsp4wrzd.js +1 -0
  78. package/dist/assets/MeshBVH-BiDHDcu-.js +1 -0
  79. package/dist/assets/ModelAssetDocument-F5GACirk.js +1 -0
  80. package/dist/assets/NonThreeAuthoringBootstrap-C3woOMxX.js +1 -0
  81. package/dist/assets/OBJLoader-BhIC6Hwo.js +5 -0
  82. package/dist/assets/Object3DDocumentViewport-DB7T0NTl.js +2 -0
  83. package/dist/assets/Object3DPreview-DL8oi7Xs.js +2 -0
  84. package/dist/assets/OnlineAssetDetail-C6z9RvYK.js +2 -0
  85. package/dist/assets/OrbitControls-CM3bPray.js +1 -0
  86. package/dist/assets/OrbitControls-DLpayAaK.js +1 -0
  87. package/dist/assets/OrthographicCamera-bQozawrh.js +1 -0
  88. package/dist/assets/PLYLoader-DYQqs5Ik.js +2 -0
  89. package/dist/assets/PerspectiveCamera-CQ2lh01o.js +1 -0
  90. package/dist/assets/PlayBar-BR-Vg3Jb.js +2 -0
  91. package/dist/assets/RGBELoader-BgBcQv8j.js +1 -0
  92. package/dist/assets/RectAreaLightUniformsLib-CMMoWfll.js +1 -0
  93. package/dist/assets/RenderPass-DPrn-Uky.js +1 -0
  94. package/dist/assets/ResolutionPicker-C67vs1F3.js +1 -0
  95. package/dist/assets/RootSelectionOverlay-BZPlxmXU.js +1 -0
  96. package/dist/assets/RoundedBox-BDGBg6QZ.js +1 -0
  97. package/dist/assets/RoundedBoxGeometry-CyUuYPfW.js +1 -0
  98. package/dist/assets/STLLoader-Dyv3lsxY.js +1 -0
  99. package/dist/assets/SelectionBox-D_75KrNW.js +1 -0
  100. package/dist/assets/ShaderPass-QYRpPuFJ.js +1 -0
  101. package/dist/assets/ShadowEditor-DkImwu1Y.js +1 -0
  102. package/dist/assets/SimplifyModifier-C8ayvRzd.js +1 -0
  103. package/dist/assets/SkeletonUtils-Cps8GOC6.js +1 -0
  104. package/dist/assets/Sky-CQKCgYDs.js +154 -0
  105. package/dist/assets/SourceAssetViewer-2SWQoUut.js +12 -0
  106. package/dist/assets/StageHost-BN-IoTef.js +2 -0
  107. package/dist/assets/StoryPreviewMount-DjyxRCXu.js +1 -0
  108. package/dist/assets/TDSLoader-D_T8XJ81.js +1 -0
  109. package/dist/assets/TextGeometry-DOWAEUV0.js +1 -0
  110. package/dist/assets/ThreeBoardDocument-CVncZyIq.js +2 -0
  111. package/dist/assets/ThreeIsolationSceneContent-C8C8whSF.js +1 -0
  112. package/dist/assets/ToolObject3DPreview-BRoDWe4Q.js +1 -0
  113. package/dist/assets/TrackballControls-DfznuQTh.js +1 -0
  114. package/dist/assets/TransientHint-BB1fwrvK.js +1 -0
  115. package/dist/assets/UnrealBloomPass-CR-cS_K5.js +83 -0
  116. package/dist/assets/VideoViewer-C6kocgIU.js +1 -0
  117. package/dist/assets/_commonjsHelpers-D6-XlEtG.js +1 -0
  118. package/dist/assets/active-ingest-CT6jSGhr.js +3 -0
  119. package/dist/assets/adapter-surface-Y37Nzcyw.js +1 -0
  120. package/dist/assets/after-paint-CB4bz1-e.js +1 -0
  121. package/dist/assets/agx-base-srgb-BjWZJgrZ.lut +0 -0
  122. package/dist/assets/agx-look-medium-high-contrast-D5F_ob1L.lut +0 -0
  123. package/dist/assets/agx-look-punchy-dxsnycNs.lut +0 -0
  124. package/dist/assets/animation-clock-CnjZqfJp.js +1 -0
  125. package/dist/assets/asset-budget-asset.menu-Di3KiQCd.js +1 -0
  126. package/dist/assets/asset-budget.action-DCzzcuTh.js +1 -0
  127. package/dist/assets/asset-budget.document-BWU8wnVW.js +1 -0
  128. package/dist/assets/asset-budget.menu-BGZpT_31.js +1 -0
  129. package/dist/assets/asset-editor-persistence-BBaONOJt.js +1 -0
  130. package/dist/assets/asset-loaders-BOy5Ss8k.js +2 -0
  131. package/dist/assets/asset-parse-error-BHMwBRU3.js +3 -0
  132. package/dist/assets/assets-BuSoGjBX.js +1 -0
  133. package/dist/assets/audio-meter-CyiToeUW.js +1 -0
  134. package/dist/assets/audio-unlock.service-CfUgUQVy.js +1 -0
  135. package/dist/assets/audio.utility-C6K6jem8.js +1 -0
  136. package/dist/assets/authoring-CgcOFhGS.js +1 -0
  137. package/dist/assets/autoplay.service-BZBGNSvt.js +1 -0
  138. package/dist/assets/axe-LkjAB6Lv.js +30 -0
  139. package/dist/assets/babylon-authoring-adapter-CL02gWDn.js +1 -0
  140. package/dist/assets/binding-Bmxqznjk.js +1 -0
  141. package/dist/assets/binding-identity-DcTpbvyg.js +1 -0
  142. package/dist/assets/binding-resolver-Dsh-6Vor.js +2 -0
  143. package/dist/assets/blender-emscripten-engine-9ZIRYNhe.js +2 -0
  144. package/dist/assets/blender-node-editor.document-iIDkB9sI.js +1 -0
  145. package/dist/assets/blender-properties-tab-C5CyPydi.js +3 -0
  146. package/dist/assets/blender-runtime-host-BpBwGv7r.js +4 -0
  147. package/dist/assets/blender-runtime-skin-DyQ9B6CR.js +7140 -0
  148. package/dist/assets/blender-runtime.document-lIYhhPtv.js +8 -0
  149. package/dist/assets/blender-timeline.document-77fx96N7.js +1 -0
  150. package/dist/assets/blender-uv-editor.document-fsT7B4gV.js +1 -0
  151. package/dist/assets/blender-version.status-o6dBm3n6.js +1 -0
  152. package/dist/assets/blender-wali-engine-wTOcrOMC.js +2 -0
  153. package/dist/assets/blender.command-BtJeWk-A.js +1 -0
  154. package/dist/assets/blender.keymap-GAQgeklK.js +1 -0
  155. package/dist/assets/blender.status-ujwGU6dU.js +1 -0
  156. package/dist/assets/blender.style-Dcem5f_T.js +1 -0
  157. package/dist/assets/board-guides-DziKSTss.js +1 -0
  158. package/dist/assets/body-marks-h_xDxiDE.js +1 -0
  159. package/dist/assets/bridge.command-o5gDNEwa.js +3 -0
  160. package/dist/assets/browserAll-DeWblVez.js +1 -0
  161. package/dist/assets/build-profiles.document-kW8iw8Xj.js +2 -0
  162. package/dist/assets/build-progress.status-BNRLytg2.js +1 -0
  163. package/dist/assets/build-session-C_sg3CEn.js +9 -0
  164. package/dist/assets/build.action-lYjTLb7K.js +1 -0
  165. package/dist/assets/build.command-DIGgUPU_.js +1 -0
  166. package/dist/assets/build.header-CKajx5U3.js +1 -0
  167. package/dist/assets/build.menu-BdU0QXny.js +1 -0
  168. package/dist/assets/build.service-CbBAyeu3.js +1 -0
  169. package/dist/assets/bus-mixer-CGfWDP3C.js +1 -0
  170. package/dist/assets/camera-KEsKvOL7.js +1 -0
  171. package/dist/assets/camera-runtime.inspector-B7unX4g1.js +1 -0
  172. package/dist/assets/canvas-entry-runtime-SfBxaR9M.js +2 -0
  173. package/dist/assets/capability-coverage-Czas4C18.js +7 -0
  174. package/dist/assets/chrome-trace-YZHMz60-.js +1 -0
  175. package/dist/assets/client-DNXj_opT.js +25 -0
  176. package/dist/assets/clip-planes-CnAI6DZn.js +1 -0
  177. package/dist/assets/collaboration-presence-DLoZ7EA3.js +1 -0
  178. package/dist/assets/collider-Bw0mXlsW.js +1 -0
  179. package/dist/assets/collider-dimensions-9xoFADXN.js +1 -0
  180. package/dist/assets/collision-system-DpNUJRJ3.js +1 -0
  181. package/dist/assets/command-results-CUQD49AB.js +1 -0
  182. package/dist/assets/component-board-registry-DrIa2csL.js +1 -0
  183. package/dist/assets/component-board.service-DCwcUssB.js +2 -0
  184. package/dist/assets/component-board.service-DidCyM4O.js +2 -0
  185. package/dist/assets/component-verbs.command-7xzfjGMZ.js +1 -0
  186. package/dist/assets/component-verbs.service-Bv9jId3q.js +1 -0
  187. package/dist/assets/config-CEZk921y.js +6 -0
  188. package/dist/assets/configurations-DTBMdaTL.js +1 -0
  189. package/dist/assets/connection.status-BifnQdOs.js +1 -0
  190. package/dist/assets/console-bridge-CHcb-xk5.js +1 -0
  191. package/dist/assets/constraint-De8f1Uiq.js +1 -0
  192. package/dist/assets/constraints.inspector-B9U9Yj-u.js +1 -0
  193. package/dist/assets/countdown-timer-CUm74dom.js +1 -0
  194. package/dist/assets/coverage.service-VTX5Mcsx.js +3 -0
  195. package/dist/assets/crash-null-boundary-v3a0uEgw.js +1 -0
  196. package/dist/assets/create-runtime-CVCc1BDx.js +1 -0
  197. package/dist/assets/curve-7Q79VgU4.js +1 -0
  198. package/dist/assets/data-asset-4hjS642k.js +5 -0
  199. package/dist/assets/data-check-core-CQEjuFyt.js +1 -0
  200. package/dist/assets/data-ref-CQI28C0D.js +1 -0
  201. package/dist/assets/debug-bridge-CCohG-d-.js +1 -0
  202. package/dist/assets/debug-registry-Dgvitx8M.js +1 -0
  203. package/dist/assets/defaults-DKiBJCPN.js +1 -0
  204. package/dist/assets/deferred-commands-CEMmvL47.js +1 -0
  205. package/dist/assets/deferred-ingest-play-DCJi_Pgu.js +2 -0
  206. package/dist/assets/design-time-layers-wYgOTgni.js +1 -0
  207. package/dist/assets/design-time-mount-registry-DUpXCg1U.js +1 -0
  208. package/dist/assets/design-time-mount.service-BzY21e1F.js +2 -0
  209. package/dist/assets/design-time-react-mount-DM9WLrF2.js +1 -0
  210. package/dist/assets/dev-build-gDYrq68M.js +1 -0
  211. package/dist/assets/directional-shadow-fit-BVkOKAv2.js +1 -0
  212. package/dist/assets/document-preview-three-Kbg2GCLm.js +1 -0
  213. package/dist/assets/dom-authoring-adapter-CY8C7f4T.js +1 -0
  214. package/dist/assets/draco3d-BBUTcNkz.js +1 -0
  215. package/dist/assets/draco_decoder-DsQ12WqX.wasm +0 -0
  216. package/dist/assets/draco_encoder-2Tcju8Ns.wasm +0 -0
  217. package/dist/assets/edit-mode-audio.service-Bzetwd5B.js +1 -0
  218. package/dist/assets/edit-mode-authoring-B47TfLqu.js +1 -0
  219. package/dist/assets/edit-mode-networking.service-YCX6RRb_.js +1 -0
  220. package/dist/assets/editor-api-BoJIcyZG.js +1 -0
  221. package/dist/assets/editor-port-C_FeBdeV.js +1 -0
  222. package/dist/assets/editor-presentation-activity-C7SNSmTd.js +1 -0
  223. package/dist/assets/entry-adjudication-Cq8Yeb74.js +1 -0
  224. package/dist/assets/environment-capture-7himRh2L.js +1 -0
  225. package/dist/assets/esbuild-BHljloGq.wasm +0 -0
  226. package/dist/assets/events-156d8d12.esm-ErOhDXXB.js +36 -0
  227. package/dist/assets/extend-B-eOccUm.js +36 -0
  228. package/dist/assets/extends-CF3RwP-h.js +1 -0
  229. package/dist/assets/eyedropper-session-bjPXnfeX.js +1 -0
  230. package/dist/assets/fflate.module-DPuTF8aG.js +6 -0
  231. package/dist/assets/filmic-srgb-Ct35FIH6.lut +0 -0
  232. package/dist/assets/first-party-audio-system-DxnGJOER.js +1 -0
  233. package/dist/assets/first-party-navigation-system-CL5Bquub.js +1 -0
  234. package/dist/assets/fork-menu-BoVyw2Wu.js +1 -0
  235. package/dist/assets/frame-debugger-store-D1Mf_5up.js +1 -0
  236. package/dist/assets/frame-delta-D2nsw_Ht.js +1 -0
  237. package/dist/assets/frame-pacing-D5acoOzO.js +1 -0
  238. package/dist/assets/frame-selector-cache-cCeUbcjG.js +1 -0
  239. package/dist/assets/game-DHOZVb-7.js +1 -0
  240. package/dist/assets/game-contract-seams-a5YXejOu.js +1 -0
  241. package/dist/assets/game-css-scope-transform-Eng4wS8E.js +33 -0
  242. package/dist/assets/game-document.service-DbRfx2V0.js +1 -0
  243. package/dist/assets/game-eval.command-D-7Dxbj_.js +2 -0
  244. package/dist/assets/game-input-seams-CIQdetRw.js +1 -0
  245. package/dist/assets/game-loop-CZvXlY00.js +1 -0
  246. package/dist/assets/game-module-access-B2mFxv-i.js +1 -0
  247. package/dist/assets/game.layout-CBASrvQu.js +1 -0
  248. package/dist/assets/gameplay-export-BoKXm51x.js +1 -0
  249. package/dist/assets/gameplay-replay-e5umMlXv.js +1 -0
  250. package/dist/assets/gameplay-rng-trap-CTNhm-UW.js +3 -0
  251. package/dist/assets/gameplay.command-DxcVYX6F.js +1 -0
  252. package/dist/assets/generation-DhwCUHPf.css +1 -0
  253. package/dist/assets/generation-jobs-BQrXbGp_.js +1 -0
  254. package/dist/assets/generation.service-CDIgObuw.js +1 -0
  255. package/dist/assets/generations-DzUogZsM.js +1 -0
  256. package/dist/assets/generations.status-CgOUBCum.js +1 -0
  257. package/dist/assets/hierarchy-marks-BLPfSIym.js +1 -0
  258. package/dist/assets/host-pointer-DbGSCjE9.js +1 -0
  259. package/dist/assets/hosted-asset-materialization-CiIvWkGU.js +2 -0
  260. package/dist/assets/ibl-override-material-BlmCxFKq.js +6 -0
  261. package/dist/assets/index-96FBF1Oj.js +1 -0
  262. package/dist/assets/index-BAWkB0dv.js +1 -0
  263. package/dist/assets/index-BDnS2b6S.js +1 -0
  264. package/dist/assets/index-BHp07vN0.js +2 -0
  265. package/dist/assets/index-BMxv2MNV.js +1 -0
  266. package/dist/assets/index-BP6wv2A0.js +5 -0
  267. package/dist/assets/index-BcCBqgM_.js +952 -0
  268. package/dist/assets/index-Bge9JUr6.js +1 -0
  269. package/dist/assets/index-BjTCPEQ7.js +134 -0
  270. package/dist/assets/index-BncK9THk.js +1 -0
  271. package/dist/assets/index-CJbYy-CF.js +3 -0
  272. package/dist/assets/index-CVCb_ImQ.js +1 -0
  273. package/dist/assets/index-CZd9o7Lu.js +1 -0
  274. package/dist/assets/index-CanA16PU.js +2 -0
  275. package/dist/assets/index-CinJrH5C.js +9 -0
  276. package/dist/assets/index-CtzuWnCS.js +1 -0
  277. package/dist/assets/index-D2fNXpHa.css +1 -0
  278. package/dist/assets/index-DUpHH6JR.js +3120 -0
  279. package/dist/assets/index-DUqP1RMl.js +1 -0
  280. package/dist/assets/index-D_NuPfjr.js +9 -0
  281. package/dist/assets/index-Da9JhEvW.js +25 -0
  282. package/dist/assets/index-DgapqSPi.js +7 -0
  283. package/dist/assets/index-FUuS4qwW.js +562 -0
  284. package/dist/assets/index-GIL7oGEO.js +4894 -0
  285. package/dist/assets/index-IEjydI9d.js +1 -0
  286. package/dist/assets/index-OrYXPk3Z.js +487 -0
  287. package/dist/assets/index-V1R-e5Bd.js +1 -0
  288. package/dist/assets/index-bQE2NA0D.js +1 -0
  289. package/dist/assets/index-gHZae-lw.js +13 -0
  290. package/dist/assets/index-mjWQmGhM.js +1 -0
  291. package/dist/assets/index-nmcBqr7Y.js +1 -0
  292. package/dist/assets/inference-diagnostics-Dhmtfbq_.js +1 -0
  293. package/dist/assets/ingest-BbYMC2vQ.js +1 -0
  294. package/dist/assets/ingest-boot-viewport-D5rI_Kk_.js +1 -0
  295. package/dist/assets/ingest-siblings-Bop2kqVl.js +1 -0
  296. package/dist/assets/ingest-source-persistence-C_6Hiyra.js +1 -0
  297. package/dist/assets/ingest.service-BTDnQfM1.js +1 -0
  298. package/dist/assets/input-manager-DH_hGW6d.js +1 -0
  299. package/dist/assets/input-router-BNQvtIqw.js +1 -0
  300. package/dist/assets/inspect-BZfi3mmo.js +1 -0
  301. package/dist/assets/inspection-CObLhnrs.js +1 -0
  302. package/dist/assets/instance-fork-actions-D3sRzS3K.js +1 -0
  303. package/dist/assets/instances.command-D6UkZNO8.js +1 -0
  304. package/dist/assets/instruments-CKR02Y8I.js +1 -0
  305. package/dist/assets/json-history-resource-BbxllWfV.js +1 -0
  306. package/dist/assets/jsx-runtime-DPjLkJKQ.js +9 -0
  307. package/dist/assets/light-D-_wsKTq.js +1 -0
  308. package/dist/assets/light-camera-factory-CWbbe9gI.js +1 -0
  309. package/dist/assets/lil-gui.module.min-BF55BEwA.js +10 -0
  310. package/dist/assets/live-behaviors-Bxq49Maz.js +1 -0
  311. package/dist/assets/live-gesture-lock-DJbrjOqf.js +1 -0
  312. package/dist/assets/loader-CaF_I7Yt.js +1 -0
  313. package/dist/assets/logger-Dqis-7W1.js +1 -0
  314. package/dist/assets/loop-gate-report-N52EWFGD.js +1 -0
  315. package/dist/assets/matcap-texture-CVfalpWT.js +1 -0
  316. package/dist/assets/material-CpAdjDxn.js +1 -0
  317. package/dist/assets/material-factory-Bz6h__6g.js +1 -0
  318. package/dist/assets/mesh-B3WPtNKO.js +1 -0
  319. package/dist/assets/mesh-shadow-CZnXrw_l.js +1 -0
  320. package/dist/assets/mikktspace.module-DO88SLib.js +1 -0
  321. package/dist/assets/model-asset-sections-CFvvihfx.css +1 -0
  322. package/dist/assets/model-asset-sections.service-CHhFS3ZX.js +1 -0
  323. package/dist/assets/model.layout-BJUEQYUI.js +1 -0
  324. package/dist/assets/models.finder-G2jQgIRu.js +1 -0
  325. package/dist/assets/module-mode-DVBLT9d-.js +2 -0
  326. package/dist/assets/mount-canvas-ingest-root-DDuAWf_C.js +2 -0
  327. package/dist/assets/mount-dom-ingest-root-D_EiBgpn.js +2 -0
  328. package/dist/assets/mount-game-6t9cKNo4.js +1 -0
  329. package/dist/assets/mount-ingest-root-glv2SSWf.js +2 -0
  330. package/dist/assets/mount-manifest-CGVxhmAw.js +1 -0
  331. package/dist/assets/mount-readiness-Ds0HvvLH.js +4 -0
  332. package/dist/assets/mount-three-ingest-root-hrUt9VVU.js +1 -0
  333. package/dist/assets/mounted-authoring-Dmg5xmhP.js +1 -0
  334. package/dist/assets/mounted-story-viewport-source-DjP6RA9U.js +1 -0
  335. package/dist/assets/native-debug-module-CWicoSGD.js +1 -0
  336. package/dist/assets/native-entry-surface-BE8LJNdu.js +1 -0
  337. package/dist/assets/navigation-CIiCx-SM.js +1 -0
  338. package/dist/assets/navmesh-workflow-store-Cmnm57TB.js +1 -0
  339. package/dist/assets/navmesh.menu-CAKiH8PW.js +1 -0
  340. package/dist/assets/navmesh.service-jgDWlgj1.js +1 -0
  341. package/dist/assets/network.utility-CEu5nHf7.js +1 -0
  342. package/dist/assets/object-marks-DwvIEBOK.js +1 -0
  343. package/dist/assets/object3d-authoring-subject-CH5sI2oP.js +1 -0
  344. package/dist/assets/output-DK8waum9.js +195 -0
  345. package/dist/assets/particles-Y626p22p.js +1 -0
  346. package/dist/assets/particles-factory-DnLOHXT8.js +1 -0
  347. package/dist/assets/pasteboard-materialize-BqSS4QzV.js +20 -0
  348. package/dist/assets/pasteboard.action-DU3UHtJG.js +2 -0
  349. package/dist/assets/performance-profiler-D_Jey87L.js +1 -0
  350. package/dist/assets/physics-registry-B2Jkp8e6.js +1 -0
  351. package/dist/assets/physics-registry-CUB9cT9p.js +1 -0
  352. package/dist/assets/pixi-authoring-adapter-CjibysC3.js +1 -0
  353. package/dist/assets/pixi-live-write-target-DuWydlWb.js +1 -0
  354. package/dist/assets/pixi-primitive-DlWbUPN9.js +1 -0
  355. package/dist/assets/pixi-react-root-factory-DYsznYRQ.js +1 -0
  356. package/dist/assets/pixi-story-model-DNkfnWUV.js +1 -0
  357. package/dist/assets/pixi-transform-channels-VjdohT11.js +1 -0
  358. package/dist/assets/play-mode-BFU2PCkG.js +22 -0
  359. package/dist/assets/play.command-BpqqLqkq.js +2 -0
  360. package/dist/assets/playtest-BXIL1JEF.js +1 -0
  361. package/dist/assets/pose-guard-6Osb2cFu.js +1 -0
  362. package/dist/assets/presentation-BPP5pXeQ.js +1 -0
  363. package/dist/assets/product-DFhyARJj.js +1 -0
  364. package/dist/assets/profiler.action-CaXJDp3t.js +1 -0
  365. package/dist/assets/profiler.menu-BIMF6Bi4.js +1 -0
  366. package/dist/assets/profiler.utility-BExw9wBO.js +1 -0
  367. package/dist/assets/project-authoring-session-Bnt6icLr.js +2 -0
  368. package/dist/assets/project-provenance-BoP3nrle.js +1 -0
  369. package/dist/assets/prompt-labels-DSMdM2_B.js +1 -0
  370. package/dist/assets/properties-bone-constraints.inspector-ByT6p7S-.js +1 -0
  371. package/dist/assets/properties-bone.inspector-z4qJwKO5.js +1 -0
  372. package/dist/assets/properties-collection.inspector-D0_3ijWU.js +1 -0
  373. package/dist/assets/properties-constraints.inspector-CESzjuls.js +1 -0
  374. package/dist/assets/properties-data.inspector-hG8Wgyzb.js +1 -0
  375. package/dist/assets/properties-material.inspector-CzY0JCQ6.js +1 -0
  376. package/dist/assets/properties-modifiers.inspector-3dDhwf7g.js +1 -0
  377. package/dist/assets/properties-object.inspector-CiarfxkT.js +1 -0
  378. package/dist/assets/properties-output.inspector-DKJxmKSD.js +1 -0
  379. package/dist/assets/properties-particles.inspector-CCEdYWGm.js +1 -0
  380. package/dist/assets/properties-physics.inspector-B2c0KUyA.js +1 -0
  381. package/dist/assets/properties-render.inspector-Bcm0HLRW.js +1 -0
  382. package/dist/assets/properties-scene.inspector-PIM_eTb_.js +1 -0
  383. package/dist/assets/properties-texture.inspector-CgFlnyr8.js +1 -0
  384. package/dist/assets/properties-view-layer.inspector-DGjF_Aqo.js +1 -0
  385. package/dist/assets/properties-world.inspector-CrMvaRvB.js +1 -0
  386. package/dist/assets/r3f-design-session-D-4yyDO9.js +2 -0
  387. package/dist/assets/r3f-physics-binding-BBo8oma9.js +1 -0
  388. package/dist/assets/r3f-root-factory-z9llD1OU.js +1 -0
  389. package/dist/assets/r3f-source-authoring-adapter-w6Bc60K-.js +13 -0
  390. package/dist/assets/rapier-physics-adapter-CaZqWLu0.js +1 -0
  391. package/dist/assets/rapier-physics-bridge-CMoeVo3Y.js +1 -0
  392. package/dist/assets/react-18-By2b4xR9.js +1 -0
  393. package/dist/assets/react-inspector.service-B_neRnSK.js +1 -0
  394. package/dist/assets/react-root-CEz5NTck.js +1 -0
  395. package/dist/assets/react-story-board-BDDwiE2H.js +1 -0
  396. package/dist/assets/react-three-fiber.esm-CycrbDlA.js +1 -0
  397. package/dist/assets/react-three-rapier.esm-CEfKpvxT.js +1 -0
  398. package/dist/assets/react-world-authoring-adapter-DmrwM3py.js +1 -0
  399. package/dist/assets/realm-services-CobQsq_X.js +1 -0
  400. package/dist/assets/rebind-controller-Dtq19Vb3.js +1 -0
  401. package/dist/assets/recast-navigation.wasm-compat-Dsoa_MD-.js +1 -0
  402. package/dist/assets/reflection-probe-Don-M3Fj.js +1 -0
  403. package/dist/assets/reflection-probe-capture.inspector-CmFUoJCx.js +1 -0
  404. package/dist/assets/register-render-vitals-BiZk29b2.js +1 -0
  405. package/dist/assets/registry-02YZjMNp.js +1 -0
  406. package/dist/assets/relative-path-guard-GiM7Lsz8.js +1 -0
  407. package/dist/assets/render-audio-control-vMRlePWb.js +1 -0
  408. package/dist/assets/render-batch-system-0vq7p0VC.js +1 -0
  409. package/dist/assets/render-census-BrQX_CXv.js +1 -0
  410. package/dist/assets/render-control-Df3yTiyr.js +1 -0
  411. package/dist/assets/render-env-D2IV2x5k.js +1 -0
  412. package/dist/assets/render-features-CPQ_e568.js +1 -0
  413. package/dist/assets/render-seed-DF4JHy7P.js +1 -0
  414. package/dist/assets/render-settings-Bw4W9SYF.js +1 -0
  415. package/dist/assets/render-vitals-BZ5HtvMi.js +1 -0
  416. package/dist/assets/renderer-config-BqG4O8i9.js +1 -0
  417. package/dist/assets/resolve-three-SZE_WWUM.js +702 -0
  418. package/dist/assets/root-seam-contract-Z0VWX3Bk.js +1 -0
  419. package/dist/assets/rrweb-Cd2ifIRP.js +142 -0
  420. package/dist/assets/run-ticks-settled-C4ksViyA.js +1 -0
  421. package/dist/assets/runtime-inspection-l2iFQSsg.js +1 -0
  422. package/dist/assets/scene-capture-BQKzU0NT.js +1 -0
  423. package/dist/assets/scene-capture-CGYF-Viw.js +1 -0
  424. package/dist/assets/scene-document.service-qkDjUrlP.js +2 -0
  425. package/dist/assets/scene-framing-Cat0GtyJ.js +1 -0
  426. package/dist/assets/scene-index-B6BZOHMk.js +1 -0
  427. package/dist/assets/scene-query-C7_N-TpI.js +1 -0
  428. package/dist/assets/schema-kl9-2B_J.js +1 -0
  429. package/dist/assets/sculpt.layout-zJF55yCR.js +1 -0
  430. package/dist/assets/seeded-random-i3mtgBKZ.js +1 -0
  431. package/dist/assets/session-CZ5JPg-z.js +4877 -0
  432. package/dist/assets/setup-audio-S8GQF91f.js +1 -0
  433. package/dist/assets/setup-particles-GCXlnkj_.js +1 -0
  434. package/dist/assets/setup-physics-BeZ7-LKD.js +1 -0
  435. package/dist/assets/setup-renderer-DVXaSGin.js +1587 -0
  436. package/dist/assets/shading.layout-DULYZV6M.js +1 -0
  437. package/dist/assets/sim-clock-CLflx7kg.js +1 -0
  438. package/dist/assets/sky-precompute-worker-ChN7J87v.js +1 -0
  439. package/dist/assets/soft-particle-depth-DGvfQDi1.js +1 -0
  440. package/dist/assets/source-object3d-authoring-adapter-B-L6Ha6f.js +1 -0
  441. package/dist/assets/source-persistence-backend-C-aR-B_Y.js +1 -0
  442. package/dist/assets/spark-renderer-lifecycle-ynWESJcv.js +1 -0
  443. package/dist/assets/spark.module-4pXQoz5d.js +12120 -0
  444. package/dist/assets/stage-invalidation-DBg3C3Ta.js +1 -0
  445. package/dist/assets/stage-keyboard-n-5kKH-m.js +1 -0
  446. package/dist/assets/stage-overlay-set-B9zp2sLB.js +1 -0
  447. package/dist/assets/stage-presence-markers-DiGI6A45.js +1 -0
  448. package/dist/assets/standard-viewport-dressing-CzjAe_0A.js +7 -0
  449. package/dist/assets/state-bridge-DLP1jLRW.js +1 -0
  450. package/dist/assets/state-watch.action-BOvQR2qt.js +1 -0
  451. package/dist/assets/state-watch.menu-CNLvDeeY.js +1 -0
  452. package/dist/assets/state-watch.utility-Bg1tTTQU.js +1 -0
  453. package/dist/assets/static-batch-advisor-B13QEH7d.js +1 -0
  454. package/dist/assets/stats.module-BL02l9NC.js +1 -0
  455. package/dist/assets/story-arg-descriptors-Ek86ExX7.js +1 -0
  456. package/dist/assets/story-capture-_gC8dXV-.js +1 -0
  457. package/dist/assets/story-documents--TDLaPeL.js +3 -0
  458. package/dist/assets/story-documents.service-BiS_YbNQ.js +1 -0
  459. package/dist/assets/story-documents.service-CxOPYJ2j.js +1 -0
  460. package/dist/assets/story-media-presence-BHzk2IV5.js +1 -0
  461. package/dist/assets/story-mount-turn-DFRTj5hi.js +1 -0
  462. package/dist/assets/story-pixi-preview-BUrOJZXS.js +1 -0
  463. package/dist/assets/story-presentation-j2AVN-mK.js +1 -0
  464. package/dist/assets/story-three-preview-BHEDZzcl.js +2 -0
  465. package/dist/assets/structural-ids-Dc-7rEwi.js +1 -0
  466. package/dist/assets/structural-signature-0w-i_ats.js +1 -0
  467. package/dist/assets/surface-content-Dg9Kkazf.js +1 -0
  468. package/dist/assets/surface-state-DaxyruCj.js +3 -0
  469. package/dist/assets/system-adapters-rIC8FSGP.js +1 -0
  470. package/dist/assets/system-runner-DkOjxEBt.js +1 -0
  471. package/dist/assets/system-slot-E2mEdiih.js +1 -0
  472. package/dist/assets/team-playtest.service-DqOinFVA.js +1 -0
  473. package/dist/assets/texture.layout-DASpHVht.js +1 -0
  474. package/dist/assets/three-CDSueJyJ.js +1 -0
  475. package/dist/assets/three-authoring-adapter-CmSQ3Vui.js +1 -0
  476. package/dist/assets/three-authoring.service-iuHLwtf1.js +2 -0
  477. package/dist/assets/three-ingest-runtime-QzDYk6tU.js +1 -0
  478. package/dist/assets/three-projection-core-BmKMZ-nf.js +1 -0
  479. package/dist/assets/three-viewport-presentation-QBQpSdMh.js +1 -0
  480. package/dist/assets/three.module-D396a9Mn.js +3840 -0
  481. package/dist/assets/three.quarks.esm-B1C61jGo.js +1039 -0
  482. package/dist/assets/tools-B_NJsk05.js +1 -0
  483. package/dist/assets/transform-writer-BhBBTx33.js +1 -0
  484. package/dist/assets/transport.header-B-6HQlU2.js +1 -0
  485. package/dist/assets/trigger-volume-BNK2XzPL.js +1 -0
  486. package/dist/assets/tuples-CIQ4Bn1U.js +1 -0
  487. package/dist/assets/tween.module-DciWpAG6.js +1 -0
  488. package/dist/assets/ui-board-document-Bwtt--xp.js +2 -0
  489. package/dist/assets/unexported-game-trap-Dm1JYKHy.js +2 -0
  490. package/dist/assets/unmanaged-root-detector-B8CpbkSN.js +2 -0
  491. package/dist/assets/upstream-pin-BdgRH6ID.js +1 -0
  492. package/dist/assets/use-data-Dzq-MytE.js +1 -0
  493. package/dist/assets/use-live-actor-state-DErbWQWF.js +1 -0
  494. package/dist/assets/use-selection-DbR73-xd.js +1 -0
  495. package/dist/assets/user-data-BB2Of6Ht.js +1 -0
  496. package/dist/assets/utility-view-state-BHypxA33.js +1 -0
  497. package/dist/assets/uv-editing.layout-BEKHxmHw.js +1 -0
  498. package/dist/assets/vgai-shared-fontawesome-CU65D4Ij.js +1 -0
  499. package/dist/assets/vgai-shared-jsx-dev-runtime-DFDKL7fx.js +1 -0
  500. package/dist/assets/vgai-shared-jsx-runtime-DIqBpTut.js +1 -0
  501. package/dist/assets/vgai-shared-react-BT7rMc2H.js +1 -0
  502. package/dist/assets/vgai-shared-react-dom-DFajMqMT.js +1 -0
  503. package/dist/assets/vgai-shared-react-dom-client-S0ozfl6_.js +1 -0
  504. package/dist/assets/vgai-shared-three-Bc5PvpLM.js +1 -0
  505. package/dist/assets/viewport-pick-context-DkawXbEi.js +1 -0
  506. package/dist/assets/viewport-root-presentation-CWsE56K6.js +1 -0
  507. package/dist/assets/viewport-shading-BuA88e_A.js +1 -0
  508. package/dist/assets/viewport-shading-boundary-B_-_gABg.js +82 -0
  509. package/dist/assets/viewport-surface-status-B3om4Kcf.js +1 -0
  510. package/dist/assets/vision_bundle-DX0dWqEa.js +15 -0
  511. package/dist/assets/voxel-surface-DtcsSWRL.js +1 -0
  512. package/dist/assets/wav-encode-D31zWF6O.js +1 -0
  513. package/dist/assets/webgl-frame-capture-FlF9zQmW.js +1 -0
  514. package/dist/assets/webgl-gpu-timer-D3YX7RaD.js +1 -0
  515. package/dist/assets/webworkerAll-CM2o_dnz.js +1 -0
  516. package/dist/assets/worker-UrMcrc5_.js +2 -0
  517. package/dist/assets/world-documents-147tiFZe.js +1 -0
  518. package/dist/assets/world-root-stage-binding-vwTrtBz6.js +1 -0
  519. package/dist/assets/world-state-BWG-IcOd.js +1 -0
  520. package/dist/assets/writer-B-KovzkA.js +5 -0
  521. package/dist/assets/xstate-animation-binding-Brd0NST6.js +1 -0
  522. package/dist/assets/xstate-animation-meta-Q3u9zh_m.js +1 -0
  523. package/dist/assets/xstate-behavior.action-B8UluFBK.js +1 -0
  524. package/dist/assets/xstate-behavior.document-CKAsE45I.js +1 -0
  525. package/dist/assets/xstate-behavior.inspector-vJJyuifc.js +1 -0
  526. package/dist/assets/xstate-behavior.menu-BXbPICIh.js +1 -0
  527. package/dist/assets/xstate-inspection-BsZv8LS9.js +1 -0
  528. package/dist/vgai-shared-react.json +10 -0
  529. package/dist/vgai-shared-three.json +3 -0
  530. package/dist-node/cli.js +9320 -0
  531. package/dist-node/create.js +3239 -0
  532. package/package.json +91 -0
  533. package/presets.mjs +2 -0
  534. package/src/contributions.d.ts +4 -0
  535. package/src/index.ts +38 -0
  536. package/starter/cube.blend +0 -0
  537. package/starter/cube.py +81 -0
  538. package/template/.agents/references/project-manual.md +341 -0
  539. package/template/.agents/skills/editor/SKILL.md +53 -0
  540. package/template/.agents/skills/editor/agents/openai.yaml +4 -0
  541. package/template/.agents/skills/editor/references/editor-control.md +363 -0
  542. package/template/.agents/skills/vgai-3d-models/SKILL.md +64 -0
  543. package/template/.agents/skills/vgai-ingest-existing-game/SKILL.md +112 -0
  544. package/template/.agents/skills/vgai-threejs-authoring/SKILL.md +347 -0
  545. package/template/.agents/skills/vgai-threejs-authoring/agents/openai.yaml +4 -0
  546. package/template/.agents/skills/vgai-threejs-authoring/references/helper-catalog.md +65 -0
  547. package/template/.claude/skills/editor/SKILL.md +53 -0
  548. package/template/.claude/skills/editor/agents/openai.yaml +4 -0
  549. package/template/.claude/skills/editor/references/editor-control.md +363 -0
  550. package/template/.claude/skills/vgai-3d-models/SKILL.md +64 -0
  551. package/template/.claude/skills/vgai-ingest-existing-game/SKILL.md +112 -0
  552. package/template/.claude/skills/vgai-threejs-authoring/SKILL.md +347 -0
  553. package/template/.claude/skills/vgai-threejs-authoring/agents/openai.yaml +4 -0
  554. package/template/.claude/skills/vgai-threejs-authoring/references/helper-catalog.md +65 -0
  555. package/template/.github/copilot-instructions.md +6 -0
  556. package/template/.github/skills/editor/SKILL.md +53 -0
  557. package/template/.github/skills/editor/agents/openai.yaml +4 -0
  558. package/template/.github/skills/editor/references/editor-control.md +363 -0
  559. package/template/.github/skills/vgai-3d-models/SKILL.md +64 -0
  560. package/template/.github/skills/vgai-ingest-existing-game/SKILL.md +112 -0
  561. package/template/.github/skills/vgai-threejs-authoring/SKILL.md +347 -0
  562. package/template/.github/skills/vgai-threejs-authoring/agents/openai.yaml +4 -0
  563. package/template/.github/skills/vgai-threejs-authoring/references/helper-catalog.md +65 -0
  564. package/template/.mcp.json +12 -0
  565. package/template/.vgai/assets.json +1 -0
  566. package/template/.vgai/provenance.json +4 -0
  567. package/template/.volter/tracker/validation/.preset.base.mts +178 -0
  568. package/template/.volter/tracker/validation/preset.mts +186 -0
  569. package/template/.volter/tracker/visualizer/.extension.base.tsx +14 -0
  570. package/template/.volter/tracker/visualizer/extension.tsx +14 -0
  571. package/template/.volter/tracker-config.json +17 -0
  572. package/template/AGENTS.md +176 -0
  573. package/template/CLAUDE.md +1 -0
  574. package/template/DEVLOG.md +20 -0
  575. package/template/IDIOMS.md +118 -0
  576. package/template/LICENSE +30 -0
  577. package/template/README.md +83 -0
  578. package/template/ROADMAP.md +20 -0
  579. package/template/asset-manifest.json +3 -0
  580. package/template/check-idioms.ts +1533 -0
  581. package/template/index.html +18 -0
  582. package/template/manifest-entry-modules-plugin.ts +53 -0
  583. package/template/package.json +62 -0
  584. package/template/public/jsm/libs/basis/basis_transcoder.js +19 -0
  585. package/template/public/jsm/libs/basis/basis_transcoder.wasm +0 -0
  586. package/template/public/jsm/libs/draco/gltf/draco_decoder.js +33 -0
  587. package/template/public/jsm/libs/draco/gltf/draco_decoder.wasm +0 -0
  588. package/template/public/jsm/libs/draco/gltf/draco_encoder.js +33 -0
  589. package/template/public/jsm/libs/draco/gltf/draco_wasm_wrapper.js +116 -0
  590. package/template/public/shaders/daylight-sky.frag.glsl +15 -0
  591. package/template/public/shaders/daylight-sky.vert.glsl +7 -0
  592. package/template/scripts/patch-drei-stats-gl.mjs +35 -0
  593. package/template/server/colyseus-setup.ts +111 -0
  594. package/template/server/loopback.ts +76 -0
  595. package/template/server/main.ts +78 -0
  596. package/template/server/rooms/arena-room.ts +488 -0
  597. package/template/server/rooms/game-room.ts +274 -0
  598. package/template/server/rooms.ts +15 -0
  599. package/template/server/tsconfig.json +19 -0
  600. package/template/src/bot/QaTester.tsx +35 -0
  601. package/template/src/bot/behaviors.ts +203 -0
  602. package/template/src/bot/bot-station.ts +192 -0
  603. package/template/src/bot/tester-run.ts +238 -0
  604. package/template/src/bot/tester-station.ts +193 -0
  605. package/template/src/components/environment/DaylightSky.tsx +54 -0
  606. package/template/src/components/environment/Ground.tsx +129 -0
  607. package/template/src/components/environment/SceneAtmosphere.tsx +14 -0
  608. package/template/src/components/environment/SoftGroundShadow.tsx +62 -0
  609. package/template/src/components/environment/SunShadowFit.tsx +141 -0
  610. package/template/src/contributions/README.md +98 -0
  611. package/template/src/contributions/analytics.analytics.tsx +26 -0
  612. package/template/src/contributions/data.document.tsx +35 -0
  613. package/template/src/contributions/pages.finder.ts +61 -0
  614. package/template/src/contributions/tester.inspector.tsx +64 -0
  615. package/template/src/contributions/use-game-modules.ts +80 -0
  616. package/template/src/data/README.md +17 -0
  617. package/template/src/input.ts +97 -0
  618. package/template/src/lib/audio/capability.json +4 -0
  619. package/template/src/lib/audio/sfx.ts +255 -0
  620. package/template/src/lib/react-root/capability.json +4 -0
  621. package/template/src/lib/react-root/index.ts +20 -0
  622. package/template/src/lib/react-root/react-root-adapter.tsx +57 -0
  623. package/template/src/lib/reflections/ReflectionProbe.tsx +201 -0
  624. package/template/src/lib/reflections/capability.json +4 -0
  625. package/template/src/lib/reflections/index.ts +19 -0
  626. package/template/src/lib/reflections/probe-controller.ts +75 -0
  627. package/template/src/lib/reflections/reflection-probe-registry.ts +402 -0
  628. package/template/src/lib/reflections/volume-reflection-material.ts +416 -0
  629. package/template/src/lib/static-batch/Frozen.tsx +91 -0
  630. package/template/src/lib/static-batch/capability.json +4 -0
  631. package/template/src/lib/static-batch/freeze.ts +579 -0
  632. package/template/src/lib/static-batch/index.ts +44 -0
  633. package/template/src/lib/static-batch/mutation-watch.ts +149 -0
  634. package/template/src/lib/static-batch/shadow-cache.ts +171 -0
  635. package/template/src/main.ts +63 -0
  636. package/template/src/manifest-entry-modules.d.ts +3 -0
  637. package/template/src/prefabs/HeroBox.stories.tsx +23 -0
  638. package/template/src/prefabs/HeroBox.tsx +35 -0
  639. package/template/src/scenes/MainScene.tsx +77 -0
  640. package/template/src/world.tsx +87 -0
  641. package/template/tsconfig.json +35 -0
  642. package/template/tsconfig.node.json +32 -0
  643. package/template/tsconfig.tools.json +22 -0
  644. package/template/validate-asset-content.ts +27 -0
  645. package/template/validate-assets.ts +60 -0
  646. package/template/validate-manifest.ts +55 -0
  647. package/template/vgai.adapter.ts +76 -0
  648. package/template/vgai.project.json +24 -0
  649. package/template/vite.config.ts +247 -0
  650. package/template-dotfiles/gitignore +63 -0
  651. package/workbench/src/media/game-cover.css +83 -0
  652. package/workbench/src/product.contribution.ts +188 -0
  653. package/workbench/src/vgaiGameSkew.ts +276 -0
@@ -0,0 +1,201 @@
1
+ import { type ThreeElements, useFrame, useThree } from '@react-three/fiber';
2
+ import type { ReflectionProbeConfig } from '@volter/threejs-runtime/adapter/reflection-probe';
3
+ import { type ReactNode, useLayoutEffect, useRef, useState } from 'react';
4
+ import type * as THREE from 'three';
5
+ import { createReflectionProbeMark } from './probe-controller';
6
+ import {
7
+ acquireReflectionProbeRegistry,
8
+ type ReflectionProbeRegistryLease,
9
+ type ReflectionProbeRuntime,
10
+ } from './reflection-probe-registry';
11
+
12
+ export interface ReflectionProbePublication {
13
+ /** The prefiltered capture, assignable as an ordinary `envMap`; null until the first capture. */
14
+ readonly envMap: THREE.Texture | null;
15
+ /** The probe's `intensity`, to combine with the receiving material's own value. */
16
+ readonly envMapIntensity: number;
17
+ }
18
+
19
+ /**
20
+ * A captured local reflection, placed in the scene like a light or a camera.
21
+ *
22
+ * The capture is Three's own — a `CubeCamera` renders the scene from this node
23
+ * and `PMREMGenerator` prefilters the result — and the result is PUBLISHED,
24
+ * never applied. Children given as a function receive
25
+ * `{ envMap, envMapIntensity }` and the author spreads them onto whatever
26
+ * material should reflect, exactly as they would a texture from `useLoader`:
27
+ *
28
+ * ```tsx
29
+ * <ReflectionProbe size={[10, 6, 10]}>
30
+ * {({ envMap, envMapIntensity }) => (
31
+ * <mesh>
32
+ * <sphereGeometry />
33
+ * <meshStandardMaterial envMap={envMap} envMapIntensity={envMapIntensity} />
34
+ * </mesh>
35
+ * )}
36
+ * </ReflectionProbe>
37
+ * ```
38
+ *
39
+ * Nothing is bound automatically: no material is walked, cloned, intercepted
40
+ * or owned, so a material this probe was not handed to renders precisely as
41
+ * three renders it, and `envMapIntensity` stays the author's own property.
42
+ * Ordinary `ReactNode` children are allowed too — for a probe whose result is
43
+ * consumed by the volume material below — and mean only "these objects are
44
+ * inside the probe", never automatic binding.
45
+ *
46
+ * `blendDistance`, `priority`, `parallaxProjection` and `parallaxSize`
47
+ * describe a per-FRAGMENT model that a native `envMap` cannot express (one
48
+ * envMap is one environment for the whole draw). They are read only by the
49
+ * explicitly created volume material — see `volume-reflection-material.ts` —
50
+ * and are carried here because they are part of the probe's authored
51
+ * description and the editor draws them.
52
+ */
53
+ export type ReflectionProbeProps = Omit<ThreeElements['group'], 'children'> & {
54
+ readonly name?: string;
55
+ readonly children?: ReactNode | ((published: ReflectionProbePublication) => ReactNode);
56
+ readonly shape?: 'box' | 'sphere';
57
+ /** Full local-space influence-box dimensions. */
58
+ readonly size?: [number, number, number];
59
+ readonly radius?: number;
60
+ readonly blendDistance?: number;
61
+ readonly priority?: number;
62
+ readonly intensity?: number;
63
+ readonly parallaxProjection?: boolean;
64
+ /** Full local-space projection-box dimensions. */
65
+ readonly parallaxSize?: [number, number, number];
66
+ readonly parallaxOffset?: [number, number, number];
67
+ readonly captureOffset?: [number, number, number];
68
+ readonly captureMode?: 'on-change' | 'manual' | 'realtime';
69
+ readonly resolution?: 64 | 128 | 256 | 512 | 1024;
70
+ readonly near?: number;
71
+ readonly far?: number;
72
+ readonly cullMask?: number;
73
+ readonly captureShadows?: boolean;
74
+ };
75
+
76
+ export function ReflectionProbe({
77
+ name = 'Reflection Probe',
78
+ children,
79
+ shape = 'box',
80
+ size = [10, 6, 10],
81
+ radius = 5,
82
+ blendDistance = 1,
83
+ priority = 0,
84
+ intensity = 1,
85
+ parallaxProjection = true,
86
+ parallaxSize = [10, 6, 10],
87
+ parallaxOffset = [0, 0, 0],
88
+ captureOffset = [0, 0, 0],
89
+ captureMode = 'on-change',
90
+ resolution = 256,
91
+ near = 0.1,
92
+ far = 100,
93
+ cullMask = 0xffffffff,
94
+ captureShadows = true,
95
+ ...groupProps
96
+ }: ReflectionProbeProps) {
97
+ const group = useRef<THREE.Group>(null);
98
+ const lease = useRef<ReflectionProbeRegistryLease | null>(null);
99
+ const unregister = useRef<(() => void) | null>(null);
100
+ const unobserve = useRef<(() => void) | null>(null);
101
+ const renderer = useThree((state) => state.gl);
102
+ const scene = useThree((state) => state.scene);
103
+ const [envMap, setEnvMap] = useState<THREE.Texture | null>(null);
104
+ const mark = useRef(
105
+ createReflectionProbeMark({
106
+ shape,
107
+ size,
108
+ radius,
109
+ blendDistance,
110
+ priority,
111
+ intensity,
112
+ parallaxProjection,
113
+ parallaxSize,
114
+ parallaxOffset,
115
+ captureOffset,
116
+ captureMode,
117
+ resolution,
118
+ near,
119
+ far,
120
+ cullMask,
121
+ captureShadows,
122
+ }),
123
+ );
124
+ const config: ReflectionProbeConfig = {
125
+ shape,
126
+ size,
127
+ radius,
128
+ blendDistance,
129
+ priority,
130
+ intensity,
131
+ parallaxProjection,
132
+ parallaxSize,
133
+ parallaxOffset,
134
+ captureOffset,
135
+ captureMode,
136
+ resolution,
137
+ near,
138
+ far,
139
+ cullMask,
140
+ captureShadows,
141
+ };
142
+
143
+ useLayoutEffect(() => {
144
+ mark.current.updateConfig(config);
145
+ }, [
146
+ shape,
147
+ size,
148
+ radius,
149
+ blendDistance,
150
+ priority,
151
+ intensity,
152
+ parallaxProjection,
153
+ parallaxSize,
154
+ parallaxOffset,
155
+ captureOffset,
156
+ captureMode,
157
+ resolution,
158
+ near,
159
+ far,
160
+ cullMask,
161
+ captureShadows,
162
+ ]);
163
+
164
+ useLayoutEffect(() => {
165
+ const object = group.current;
166
+ if (!object) return;
167
+ const acquired = acquireReflectionProbeRegistry(renderer, scene);
168
+ lease.current = acquired;
169
+ unregister.current = acquired.registry.registerProbe(object, mark.current);
170
+ unobserve.current = acquired.registry.observe((probes: readonly ReflectionProbeRuntime[]) => {
171
+ const self = probes.find((probe) => probe.node === object);
172
+ 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.
175
+ setEnvMap((current) => (current === published ? current : published));
176
+ });
177
+ return () => {
178
+ unobserve.current?.();
179
+ unobserve.current = null;
180
+ unregister.current?.();
181
+ unregister.current = null;
182
+ lease.current?.release();
183
+ lease.current = null;
184
+ };
185
+ }, [renderer, scene]);
186
+
187
+ useFrame((state) => lease.current?.registry.update(state.clock.elapsedTime));
188
+
189
+ return (
190
+ <group
191
+ ref={group}
192
+ name={name}
193
+ {...groupProps}
194
+ // The live mark is ordinary R3F data on the node this component owns,
195
+ // merged over any userData the author passed in.
196
+ userData={{ ...groupProps.userData, reflectionProbe: mark.current }}
197
+ >
198
+ {typeof children === 'function' ? children({ envMap, envMapIntensity: intensity }) : children}
199
+ </group>
200
+ );
201
+ }
@@ -0,0 +1,19 @@
1
+ export {
2
+ ReflectionProbe,
3
+ type ReflectionProbeProps,
4
+ type ReflectionProbePublication,
5
+ } from './ReflectionProbe';
6
+ export {
7
+ acquireReflectionProbeRegistry,
8
+ createReflectionProbeRegistry,
9
+ type ReflectionProbeRegistry,
10
+ type ReflectionProbeRegistryLease,
11
+ type ReflectionProbeRuntime,
12
+ } from './reflection-probe-registry';
13
+ export {
14
+ createVolumeReflectionMaterial,
15
+ createVolumeReflectionPhysicalMaterial,
16
+ type VolumeReflectionMaterialHandle,
17
+ type VolumeReflectionMaterialOptions,
18
+ type VolumeReflectionPhysicalMaterialOptions,
19
+ } from './volume-reflection-material';
@@ -0,0 +1,75 @@
1
+ import type {
2
+ ReflectionProbeConfig,
3
+ ReflectionProbeMark,
4
+ ReflectionProbeSnapshot,
5
+ } from '@volter/threejs-runtime/adapter/reflection-probe';
6
+
7
+ export interface MutableReflectionProbeMark extends ReflectionProbeMark {
8
+ updateConfig(config: ReflectionProbeConfig): void;
9
+ setCaptureStatus(snapshot: ReflectionProbeSnapshot): void;
10
+ }
11
+
12
+ /** One live projection of a component's JSX props and capture state. */
13
+ export function createReflectionProbeMark(
14
+ initial: ReflectionProbeConfig,
15
+ ): MutableReflectionProbeMark {
16
+ let config = initial;
17
+ let configSignature = JSON.stringify(initial);
18
+ let revision = 0;
19
+ let snapshot: ReflectionProbeSnapshot = {
20
+ status: initial.captureMode === 'manual' ? 'idle' : 'queued',
21
+ lastCapturedAt: null,
22
+ };
23
+ const listeners = new Set<() => void>();
24
+ const notify = () => {
25
+ for (const listener of listeners) listener();
26
+ };
27
+ return {
28
+ get config() {
29
+ return config;
30
+ },
31
+ get revision() {
32
+ return revision;
33
+ },
34
+ recapture() {
35
+ revision += 1;
36
+ snapshot = { status: 'queued', lastCapturedAt: snapshot.lastCapturedAt };
37
+ notify();
38
+ },
39
+ getSnapshot() {
40
+ return snapshot;
41
+ },
42
+ subscribe(listener) {
43
+ listeners.add(listener);
44
+ return () => listeners.delete(listener);
45
+ },
46
+ updateConfig(next) {
47
+ const signature = JSON.stringify(next);
48
+ if (signature === configSignature) return;
49
+ const previousMode = config.captureMode;
50
+ config = next;
51
+ configSignature = signature;
52
+ if (next.captureMode !== 'manual') {
53
+ revision += 1;
54
+ snapshot = { status: 'queued', lastCapturedAt: snapshot.lastCapturedAt };
55
+ } else if (previousMode !== 'manual' && snapshot.status !== 'ready') {
56
+ // Entering Manual never performs an implicit capture. A valid existing
57
+ // result remains valid; otherwise the explicit Recapture button is the
58
+ // only operation that advances the capture revision.
59
+ snapshot = { status: 'idle', lastCapturedAt: snapshot.lastCapturedAt };
60
+ }
61
+ notify();
62
+ },
63
+ setCaptureStatus(next) {
64
+ if (
65
+ next.status === snapshot.status &&
66
+ next.lastCapturedAt === snapshot.lastCapturedAt &&
67
+ next.message === snapshot.message
68
+ ) {
69
+ return;
70
+ }
71
+ snapshot = next;
72
+ notify();
73
+ },
74
+ };
75
+ }
@@ -0,0 +1,402 @@
1
+ /**
2
+ * The live probes of one renderer + scene, and the one capture schedule they
3
+ * share.
4
+ *
5
+ * Capture is NATIVE end to end: a `CubeCamera` renders the live scene into a
6
+ * cube target and `PMREMGenerator` prefilters it, so what a probe PUBLISHES is
7
+ * an ordinary Three texture the author assigns as `envMap`. Nothing here
8
+ * touches a material, and nothing here walks the scene looking for one —
9
+ * probes register THEMSELVES (`<ReflectionProbe>` does it in a layout effect).
10
+ *
11
+ * At most one probe captures per frame: a cube capture is six scene renders,
12
+ * and letting several land in one frame is what turns a room full of probes
13
+ * into a stall. `canCaptureEnvironment` is asked before any GPU object is
14
+ * created, so the editor's inert design-time tree and headless runtimes mount
15
+ * the authored scene and allocate nothing.
16
+ *
17
+ * A probe's own subtree is hidden for the duration of its capture (drei's
18
+ * `CubeCamera` does the same), so a surface already showing this probe's last
19
+ * result cannot photograph itself. Observers exist so a probe can publish its
20
+ * texture and so the volume material — the only thing here that owns a shader —
21
+ * can zero its own probe uniforms inside that same window.
22
+ */
23
+ import type { ReflectionProbeMark } from '@volter/threejs-runtime/adapter/reflection-probe';
24
+ import {
25
+ canCaptureEnvironment,
26
+ withCaptureMask,
27
+ withCaptureShadows,
28
+ } from '@volter/threejs-runtime/render/environment-capture';
29
+ import {
30
+ CubeCamera,
31
+ HalfFloatType,
32
+ LinearMipmapLinearFilter,
33
+ Matrix4,
34
+ type Object3D,
35
+ PMREMGenerator,
36
+ Quaternion,
37
+ type Scene,
38
+ type Texture,
39
+ Vector3,
40
+ WebGLCubeRenderTarget,
41
+ type WebGLRenderer,
42
+ } from 'three';
43
+ import type { MutableReflectionProbeMark } from './probe-controller';
44
+
45
+ type FilteredTarget = ReturnType<PMREMGenerator['fromCubemap']>;
46
+
47
+ /** One probe as its readers see it: a result texture plus the volume it describes. */
48
+ export interface ReflectionProbeRuntime {
49
+ readonly node: Object3D;
50
+ readonly mark: ReflectionProbeMark;
51
+ /** The captured cube's edge, snapped to a power of two — the PMREM atlas is `4 * cubeSize` tall. */
52
+ readonly cubeSize: number;
53
+ readonly worldToLocal: Matrix4;
54
+ readonly extents: Vector3;
55
+ readonly parallaxExtents: Vector3;
56
+ readonly parallaxOffset: Vector3;
57
+ readonly captureOffset: Vector3;
58
+ /** The prefiltered result, assignable as a native `envMap`; null before the first capture. */
59
+ readonly texture: Texture | null;
60
+ readonly ready: boolean;
61
+ }
62
+
63
+ interface ProbeState extends ReflectionProbeRuntime {
64
+ cubeSize: number;
65
+ /** Allocated on the first capture, never at mount: a renderer may not be able to capture at all. */
66
+ target: WebGLCubeRenderTarget | null;
67
+ camera: CubeCamera | null;
68
+ filtered: FilteredTarget | null;
69
+ readonly atlases: Map<number, FilteredTarget>;
70
+ texture: Texture | null;
71
+ ready: boolean;
72
+ capturedRevision: number;
73
+ readonly capturedTransform: Matrix4;
74
+ }
75
+
76
+ /** Called every update, and again the moment a capture window opens/closes. */
77
+ export type ReflectionProbeObserver = (
78
+ probes: readonly ReflectionProbeRuntime[],
79
+ capturing: boolean,
80
+ ) => void;
81
+
82
+ export interface ReflectionProbeRegistry {
83
+ /** Publish a probe. The returned function unregisters it and frees its GPU targets. */
84
+ registerProbe(node: Object3D, mark: ReflectionProbeMark): () => void;
85
+ observe(observer: ReflectionProbeObserver): () => void;
86
+ update(frameToken: number): void;
87
+ }
88
+
89
+ function cubeSizeOf(mark: ReflectionProbeMark): number {
90
+ const requested = Math.round(mark.config.resolution);
91
+ return 2 ** Math.round(Math.log2(Math.max(16, Math.min(1024, requested))));
92
+ }
93
+
94
+ function mutable(mark: ReflectionProbeMark): MutableReflectionProbeMark {
95
+ return mark as MutableReflectionProbeMark;
96
+ }
97
+
98
+ function makeTarget(cubeSize: number, renderer: WebGLRenderer): WebGLCubeRenderTarget {
99
+ const target = new WebGLCubeRenderTarget(cubeSize, {
100
+ type: HalfFloatType,
101
+ generateMipmaps: true,
102
+ minFilter: LinearMipmapLinearFilter,
103
+ depthBuffer: true,
104
+ });
105
+ // HMR can unmount a probe between the capture that allocated this target and
106
+ // that capture finishing. Three only creates the six framebuffer slots
107
+ // lazily; disposing a cube target whose texture listener exists but whose
108
+ // slots do not is not a safe state in every supported Three revision.
109
+ // Initialize the native target here so teardown is deterministic whether or
110
+ // not the capture that wanted it completes.
111
+ renderer.initRenderTarget(target);
112
+ return target;
113
+ }
114
+
115
+ function makeCamera(mark: ReflectionProbeMark, target: WebGLCubeRenderTarget): CubeCamera {
116
+ return new CubeCamera(Math.max(0.001, mark.config.near), Math.max(0.01, mark.config.far), target);
117
+ }
118
+
119
+ function makeProbe(node: Object3D, mark: ReflectionProbeMark): ProbeState {
120
+ return {
121
+ node,
122
+ mark,
123
+ cubeSize: cubeSizeOf(mark),
124
+ target: null,
125
+ camera: null,
126
+ worldToLocal: new Matrix4(),
127
+ extents: new Vector3(),
128
+ parallaxExtents: new Vector3(),
129
+ parallaxOffset: new Vector3(),
130
+ captureOffset: new Vector3(),
131
+ capturedTransform: new Matrix4().makeScale(0, 0, 0),
132
+ filtered: null,
133
+ atlases: new Map(),
134
+ texture: null,
135
+ ready: false,
136
+ capturedRevision: mark.config.captureMode === 'manual' ? mark.revision : -1,
137
+ };
138
+ }
139
+
140
+ /**
141
+ * R3F can dispose its renderer before child layout-effect cleanup runs. Three
142
+ * leaves each resource's dispose listener installed while clearing the
143
+ * renderer's WebGLProperties map, so dispatching dispose afterward asks that
144
+ * stale listener to deallocate framebuffer slots that no longer exist. Three
145
+ * exposes no renderer-disposed signal (and compatible renderers need not
146
+ * expose WebGLProperties), so only that exact native deallocation failure is
147
+ * absorbed; every other cleanup failure remains loud.
148
+ */
149
+ function disposeRendererResource(resource: { dispose(): void }): void {
150
+ try {
151
+ resource.dispose();
152
+ } catch (error) {
153
+ const stack = error instanceof Error ? error.stack : undefined;
154
+ if (
155
+ error instanceof TypeError &&
156
+ error.message.includes('Cannot read properties of undefined') &&
157
+ stack?.includes('deallocateRenderTarget')
158
+ ) {
159
+ return;
160
+ }
161
+ throw error;
162
+ }
163
+ }
164
+
165
+ /** Free everything this probe holds on the GPU, and forget its result. */
166
+ function releaseProbeResources(probe: ProbeState): void {
167
+ for (const atlas of probe.atlases.values()) disposeRendererResource(atlas);
168
+ probe.atlases.clear();
169
+ if (probe.target) disposeRendererResource(probe.target);
170
+ probe.filtered = null;
171
+ probe.target = null;
172
+ probe.camera = null;
173
+ probe.texture = null;
174
+ probe.ready = false;
175
+ }
176
+
177
+ function refreshProbe(probe: ProbeState): boolean {
178
+ const config = probe.mark.config;
179
+ const cubeSize = cubeSizeOf(probe.mark);
180
+ if (cubeSize !== probe.cubeSize) {
181
+ // Published textures may still be bound by React or an imperative author.
182
+ // Keep each resolution's atlas alive until this probe unmounts, and reuse
183
+ // it on recapture. There are only seven supported power-of-two sizes.
184
+ if (probe.target) disposeRendererResource(probe.target);
185
+ probe.target = null;
186
+ probe.camera = null;
187
+ probe.filtered = probe.atlases.get(cubeSize) ?? null;
188
+ probe.cubeSize = cubeSize;
189
+ probe.capturedRevision = -1;
190
+ }
191
+ probe.node.updateWorldMatrix(true, false);
192
+ probe.worldToLocal.copy(probe.node.matrixWorld).invert();
193
+ probe.extents.fromArray(config.size).multiplyScalar(0.5);
194
+ probe.parallaxExtents.fromArray(config.parallaxSize).multiplyScalar(0.5);
195
+ probe.parallaxOffset.fromArray(config.parallaxOffset);
196
+ 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;
200
+ }
201
+
202
+ /** The cube target and camera, created here because only a capture needs them. */
203
+ function ensureCaptureResources(probe: ProbeState, renderer: WebGLRenderer): CubeCamera {
204
+ if (!probe.target) probe.target = makeTarget(probe.cubeSize, renderer);
205
+ if (!probe.camera) probe.camera = makeCamera(probe.mark, probe.target);
206
+ return probe.camera;
207
+ }
208
+
209
+ function configureCamera(probe: ProbeState, camera: CubeCamera, renderer: WebGLRenderer): void {
210
+ const position = new Vector3();
211
+ const rotation = new Quaternion();
212
+ const scale = new Vector3();
213
+ probe.node.matrixWorld.decompose(position, rotation, scale);
214
+ camera.position.copy(probe.captureOffset).applyMatrix4(probe.node.matrixWorld);
215
+ camera.quaternion.copy(rotation);
216
+ const near = Math.max(0.001, probe.mark.config.near);
217
+ const far = Math.max(near + 0.001, probe.mark.config.far);
218
+ for (const child of camera.children) {
219
+ const face = child as typeof child & {
220
+ near: number;
221
+ far: number;
222
+ updateProjectionMatrix(): void;
223
+ };
224
+ face.near = near;
225
+ face.far = far;
226
+ face.updateProjectionMatrix();
227
+ }
228
+ camera.updateMatrixWorld(true);
229
+ if (camera.coordinateSystem !== renderer.coordinateSystem) {
230
+ camera.coordinateSystem = renderer.coordinateSystem;
231
+ camera.updateCoordinateSystem();
232
+ }
233
+ }
234
+
235
+ export function createReflectionProbeRegistry(
236
+ renderer: WebGLRenderer,
237
+ scene: Scene,
238
+ ): ReflectionProbeRegistry & { dispose(): void } {
239
+ const probes: ProbeState[] = [];
240
+ const observers = new Set<ReflectionProbeObserver>();
241
+ // Three's supplied-target path reuses its internal blur resources without
242
+ // resizing them. Each resolution therefore owns its native generator.
243
+ const generators = new Map<number, PMREMGenerator>();
244
+ let cursor = 0;
245
+ let lastFrame = Number.NaN;
246
+ let disposed = false;
247
+
248
+ const notify = (capturing: boolean) => {
249
+ for (const observer of observers) observer(probes, capturing);
250
+ };
251
+
252
+ const capture = (probe: ProbeState) => {
253
+ mutable(probe.mark).setCaptureStatus({
254
+ status: 'capturing',
255
+ lastCapturedAt: probe.mark.getSnapshot().lastCapturedAt,
256
+ });
257
+ const visible = probe.node.visible;
258
+ const renderTarget = renderer.getRenderTarget();
259
+ const cubeFace = renderer.getActiveCubeFace();
260
+ const mipLevel = renderer.getActiveMipmapLevel();
261
+ const xrEnabled = renderer.xr.enabled;
262
+ try {
263
+ const camera = ensureCaptureResources(probe, renderer);
264
+ configureCamera(probe, camera, renderer);
265
+ notify(true);
266
+ // What this probe already lights must not be photographed by it.
267
+ probe.node.visible = false;
268
+ withCaptureShadows(scene, probe.mark.config.captureShadows, () => {
269
+ withCaptureMask(scene, probe.mark.config.cullMask, () => camera.update(renderer, scene));
270
+ });
271
+ let pmrem = generators.get(probe.cubeSize);
272
+ if (!pmrem) {
273
+ pmrem = new PMREMGenerator(renderer);
274
+ generators.set(probe.cubeSize, pmrem);
275
+ }
276
+ const filtered = pmrem.fromCubemap(camera.renderTarget.texture, probe.filtered);
277
+ probe.atlases.set(probe.cubeSize, filtered);
278
+ probe.filtered = filtered;
279
+ probe.texture = filtered.texture;
280
+ probe.ready = true;
281
+ probe.capturedRevision = probe.mark.revision;
282
+ probe.capturedTransform.copy(probe.node.matrixWorld);
283
+ mutable(probe.mark).setCaptureStatus({ status: 'ready', lastCapturedAt: performance.now() });
284
+ } catch (error) {
285
+ probe.ready = false;
286
+ mutable(probe.mark).setCaptureStatus({
287
+ status: 'error',
288
+ lastCapturedAt: probe.mark.getSnapshot().lastCapturedAt,
289
+ message: error instanceof Error ? error.message : String(error),
290
+ });
291
+ } finally {
292
+ probe.node.visible = visible;
293
+ if (probe.target) probe.target.texture.generateMipmaps = true;
294
+ renderer.setRenderTarget(renderTarget, cubeFace, mipLevel);
295
+ renderer.xr.enabled = xrEnabled;
296
+ }
297
+ };
298
+
299
+ const nextCapture = (): ProbeState | null => {
300
+ for (let offset = 0; offset < probes.length; offset += 1) {
301
+ const index = (cursor + offset) % probes.length;
302
+ const probe = probes[index]!;
303
+ const moved = refreshProbe(probe);
304
+ const mode = probe.mark.config.captureMode;
305
+ const due =
306
+ mode === 'realtime' ||
307
+ probe.capturedRevision !== probe.mark.revision ||
308
+ (mode === 'on-change' && moved);
309
+ if (!due) continue;
310
+ cursor = (index + 1) % probes.length;
311
+ return probe;
312
+ }
313
+ return null;
314
+ };
315
+
316
+ return {
317
+ registerProbe(node, mark) {
318
+ const probe = makeProbe(node, mark);
319
+ probes.push(probe);
320
+ let removed = false;
321
+ return () => {
322
+ if (removed) return;
323
+ removed = true;
324
+ const index = probes.indexOf(probe);
325
+ if (index >= 0) probes.splice(index, 1);
326
+ cursor = probes.length === 0 ? 0 : cursor % probes.length;
327
+ releaseProbeResources(probe);
328
+ notify(false);
329
+ };
330
+ },
331
+ observe(observer) {
332
+ observers.add(observer);
333
+ observer(probes, false);
334
+ return () => observers.delete(observer);
335
+ },
336
+ update(frameToken) {
337
+ if (disposed || frameToken === lastFrame || !canCaptureEnvironment(renderer)) return;
338
+ lastFrame = frameToken;
339
+ for (const probe of probes) refreshProbe(probe);
340
+ const due = nextCapture();
341
+ if (due) capture(due);
342
+ notify(false);
343
+ },
344
+ dispose() {
345
+ if (disposed) return;
346
+ disposed = true;
347
+ observers.clear();
348
+ for (const probe of probes) releaseProbeResources(probe);
349
+ probes.length = 0;
350
+ for (const pmrem of generators.values()) pmrem.dispose();
351
+ generators.clear();
352
+ },
353
+ };
354
+ }
355
+
356
+ interface SharedRegistry {
357
+ readonly registry: ReflectionProbeRegistry & { dispose(): void };
358
+ references: number;
359
+ }
360
+
361
+ const byRenderer = new WeakMap<WebGLRenderer, WeakMap<Scene, SharedRegistry>>();
362
+
363
+ export interface ReflectionProbeRegistryLease {
364
+ readonly registry: ReflectionProbeRegistry;
365
+ release(): void;
366
+ }
367
+
368
+ /** One registry per native renderer + scene pair, shared by every probe in it. */
369
+ export function acquireReflectionProbeRegistry(
370
+ renderer: WebGLRenderer,
371
+ scene: Scene,
372
+ ): ReflectionProbeRegistryLease {
373
+ let scenes = byRenderer.get(renderer);
374
+ if (!scenes) {
375
+ scenes = new WeakMap();
376
+ byRenderer.set(renderer, scenes);
377
+ }
378
+ const sceneRegistries = scenes;
379
+ const shared =
380
+ sceneRegistries.get(scene) ??
381
+ (() => {
382
+ const created: SharedRegistry = {
383
+ registry: createReflectionProbeRegistry(renderer, scene),
384
+ references: 0,
385
+ };
386
+ sceneRegistries.set(scene, created);
387
+ return created;
388
+ })();
389
+ shared.references += 1;
390
+ let released = false;
391
+ return {
392
+ registry: shared.registry,
393
+ release() {
394
+ if (released) return;
395
+ released = true;
396
+ shared.references -= 1;
397
+ if (shared.references > 0) return;
398
+ shared.registry.dispose();
399
+ sceneRegistries.delete(scene);
400
+ },
401
+ };
402
+ }