@volter/game-editor 0.5.68 → 0.5.70

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 (551) hide show
  1. package/BUNDLED_NOTICES +10941 -5080
  2. package/LICENSE +9 -10
  3. package/LICENSE-BLENDER +2 -2
  4. package/NOTICE +2 -2
  5. package/additions/canvas/package.json +8 -0
  6. package/additions/canvas/src/canvas-mount.ts +46 -0
  7. package/additions/canvas/src/scene2d.tsx +18 -0
  8. package/catalog/entries/bake.json +1 -1
  9. package/catalog/entries/blender.json +3 -3
  10. package/catalog/entries/music.json +5 -5
  11. package/catalog/project-source/LICENSE +6 -6
  12. package/catalog/project-source/src/contributions/bake.kind.ts +2 -2
  13. package/catalog/project-source/src/contributions/builder-document.tsx +1 -1
  14. package/catalog/project-source/src/contributions/builder-ui.tsx +3 -3
  15. package/catalog/project-source/src/contributions/module-source.ts +4 -4
  16. package/catalog/project-source/src/lib/reflections/volume-reflection-material.ts +59 -59
  17. package/catalog/project-source/src/lib/static-batch/Frozen.tsx +1 -1
  18. package/catalog/project-source/src/lib/static-batch/mutation-watch.ts +1 -1
  19. package/catalog/project-source/src/tools/bake-preview.tool.ts +9 -9
  20. package/dist/.vite/manifest.json +4026 -4026
  21. package/dist/assets/{AssetBudgetPanel-P2PeL_X5.js → AssetBudgetPanel-DpXsaQ6w.js} +4 -4
  22. package/dist/assets/AudioViewer-BdTHfNhD.js +1 -0
  23. package/dist/assets/{CanvasBoardDocument-BFJdTVGp.js → CanvasBoardDocument-DY-7zohc.js} +1 -1
  24. package/dist/assets/CanvasSceneViewport-57CEFqSM.js +1 -0
  25. package/dist/assets/ColorInput-Co6tCY9p.js +1 -0
  26. package/dist/assets/{EntityModelDocument-Du8wIbyK.js → EntityModelDocument-C-lhKrxv.js} +1 -1
  27. package/dist/assets/{EnvironmentAssetDocument-_SttfMY_.js → EnvironmentAssetDocument-BNe6ANTN.js} +1 -1
  28. package/dist/assets/{GameplaySessionTimeline-CWudWnfd.js → GameplaySessionTimeline-CryFYfYN.js} +1 -1
  29. package/dist/assets/ImageViewer-DiD2yIG4.js +1 -0
  30. package/dist/assets/{InspectorCanvasPreview-CEr_Kxna.js → InspectorCanvasPreview-BrFjhoiD.js} +1 -1
  31. package/dist/assets/InspectorObjectPreview-BBVO8bDT.js +1 -0
  32. package/dist/assets/JsonAssetDocument-xyXetSbl.js +2 -0
  33. package/dist/assets/{LiveModuleDocument-BWjOzO_6.js → LiveModuleDocument-BiAunjHS.js} +1 -1
  34. package/dist/assets/{LutAssetDocument-DIc6nsht.js → LutAssetDocument-5sW-5rb0.js} +1 -1
  35. package/dist/assets/{ModelAssetDocument-_CqTsX_A.js → ModelAssetDocument-Bdy7x47a.js} +1 -1
  36. package/dist/assets/{NonThreeAuthoringBootstrap-C-V23E1e.js → NonThreeAuthoringBootstrap-BP-1bVEr.js} +1 -1
  37. package/dist/assets/Object3DDocumentToolbar-CvnSLDPI.js +1 -0
  38. package/dist/assets/Object3DDocumentViewport-BE_OPc8T.js +2 -0
  39. package/dist/assets/{Object3DPreview-BPHEr3vI.js → Object3DPreview-D3w_dKrX.js} +1 -1
  40. package/dist/assets/OnlineAssetDetail-BnT8_p1W.js +1 -0
  41. package/dist/assets/PlayBar-C8Mn-EI0.js +1 -0
  42. package/dist/assets/{QuarksAssetDocument-4Dne3EHx.js → QuarksAssetDocument-DLMH5Csk.js} +1 -1
  43. package/dist/assets/ReactCanvasControls-rNz8syVB.js +1 -0
  44. package/dist/assets/RootSelectionOverlay-Cn2Rbr1N.js +1 -0
  45. package/dist/assets/{ShaderAssetDocument-W3ZjLCkt.js → ShaderAssetDocument-CsJCsNfA.js} +4 -4
  46. package/dist/assets/ShadowEditor-jB05hr1W.js +1 -0
  47. package/dist/assets/{SourceAssetViewer-BGUeDAEv.js → SourceAssetViewer-D0NgGrER.js} +1 -1
  48. package/dist/assets/StageHost-B3Yt4I7r.js +2 -0
  49. package/dist/assets/{StoryPreviewMount-Di8uMovM.js → StoryPreviewMount-CzzRn24c.js} +1 -1
  50. package/dist/assets/ThreeBoardDocument-BoHTN4Vl.js +2 -0
  51. package/dist/assets/{ThreeIsolationSceneContent-BAKurKW5.js → ThreeIsolationSceneContent-BM-0S6J5.js} +1 -1
  52. package/dist/assets/{ToolObject3DPreview-CffvGJ1h.js → ToolObject3DPreview-BeM_kx_u.js} +1 -1
  53. package/dist/assets/Toolbar-BZyog9MR.js +1 -0
  54. package/dist/assets/{TransientHint-CgmkrmKF.js → TransientHint-RJEkOJoy.js} +1 -1
  55. package/dist/assets/VideoViewer-CxajgKrf.js +1 -0
  56. package/dist/assets/ViewportShadingMenu-S2lADFJg.js +1 -0
  57. package/dist/assets/active-ingest-CjZtqL7Q.js +3 -0
  58. package/dist/assets/{animation-clock-fLmY_3--.js → animation-clock-CWVW-mqY.js} +1 -1
  59. package/dist/assets/animation-mixers.service-CpoYw8cs.js +1 -0
  60. package/dist/assets/animation-timeline.utility-CEerojaB.js +1 -0
  61. package/dist/assets/{asset-budget-asset.menu-BDRDWrvx.js → asset-budget-asset.menu-Bk6scVWQ.js} +1 -1
  62. package/dist/assets/{asset-budget.action-tQmNGQHC.js → asset-budget.action-DtBDSfDj.js} +1 -1
  63. package/dist/assets/{asset-budget.document-BthgX37Z.js → asset-budget.document-R2zyoJ8E.js} +1 -1
  64. package/dist/assets/{asset-budget.menu-DfyWVH6p.js → asset-budget.menu-D6jza5Bc.js} +1 -1
  65. package/dist/assets/asset-editor-persistence-DrgwOZIW.js +1 -0
  66. package/dist/assets/asset-loaders-CUeYIjeH.js +2 -0
  67. package/dist/assets/{asset-preview-Cv7tfD98.js → asset-preview-CQfnI2cX.js} +1 -1
  68. package/dist/assets/{audio-unlock.service-BvHvZjzx.js → audio-unlock.service-W3UBKsw9.js} +1 -1
  69. package/dist/assets/audio.utility-qrXBdGXg.js +1 -0
  70. package/dist/assets/autoplay.service-DQD3Swo9.js +1 -0
  71. package/dist/assets/{babylon-authoring-adapter-Cg5ALSpr.js → babylon-authoring-adapter-CS9LZNmz.js} +1 -1
  72. package/dist/assets/binding-resolver-B9VI52zt.js +2 -0
  73. package/dist/assets/blender-emscripten-engine-Cd6az4pU.js +2 -0
  74. package/dist/assets/{blender-node-editor.document-B92MO51u.js → blender-node-editor.document-BWLFvA2g.js} +1 -1
  75. package/dist/assets/{blender-properties-tab-CDVyDAbf.js → blender-properties-tab-BSmWG9d0.js} +1 -1
  76. package/dist/assets/{blender-runtime-host-CuniE0sy.js → blender-runtime-host-Cbkie7m4.js} +2 -2
  77. package/dist/assets/{blender-runtime-skin-B_tOz5j5.js → blender-runtime-skin-C_ATCb-z.js} +7 -7
  78. package/dist/assets/{blender-runtime.document-DxUwLiEW.js → blender-runtime.document-P9zdgwMt.js} +7 -7
  79. package/dist/assets/{blender-timeline.document-BdEEoQbK.js → blender-timeline.document-DRwySEJO.js} +1 -1
  80. package/dist/assets/{blender-uv-editor.document-EMSUlRh4.js → blender-uv-editor.document-CmLoL2Vo.js} +1 -1
  81. package/dist/assets/blender-version.status-CP4Jqkry.js +1 -0
  82. package/dist/assets/blender-wali-engine-CZcS3eAd.js +2 -0
  83. package/dist/assets/{blender.command-BkBML2SY.js → blender.command-BYGm0Q_s.js} +1 -1
  84. package/dist/assets/blender.status-BMETIbb2.js +1 -0
  85. package/dist/assets/board-guides-BG-MHK2G.js +1 -0
  86. package/dist/assets/body-marks-C1LxJtQb.js +1 -0
  87. package/dist/assets/{bridge.command-VnplZ81v.js → bridge.command-DpUNErKN.js} +3 -3
  88. package/dist/assets/{browserAll-BCmkqg8n.js → browserAll-DES3i79H.js} +1 -1
  89. package/dist/assets/{build-player.document-DV7YcJQt.js → build-player.document-B42HrdSU.js} +1 -1
  90. package/dist/assets/build-profiles.document-Di5CQoH9.js +2 -0
  91. package/dist/assets/build-progress.status-B4te7-3j.js +1 -0
  92. package/dist/assets/{build-session-BGe0eGrQ.js → build-session-Yw4JoE8T.js} +2 -2
  93. package/dist/assets/{build.action-Bdj4ZEL_.js → build.action-B-DBpUj6.js} +1 -1
  94. package/dist/assets/{build.command-DAWiYvPa.js → build.command-CfWoHNp0.js} +1 -1
  95. package/dist/assets/build.header-BaURztYD.js +1 -0
  96. package/dist/assets/{build.menu-BiRNC_xc.js → build.menu-BFBn-dPJ.js} +1 -1
  97. package/dist/assets/{build.service-Dw9K6VSF.js → build.service-D8gYWB3n.js} +1 -1
  98. package/dist/assets/{camera-C-qXzXFf.js → camera-C-uR_xQp.js} +1 -1
  99. package/dist/assets/{camera-runtime.inspector-BDrwWRlU.js → camera-runtime.inspector-BOGGEqVq.js} +1 -1
  100. package/dist/assets/{canvas-design-mount-DLn49Zle.js → canvas-design-mount-DamLAaWn.js} +4 -4
  101. package/dist/assets/canvas-entry-runtime-a6N7Rsrj.js +2 -0
  102. package/dist/assets/{canvas-preview-frames-B5xFRjhQ.js → canvas-preview-frames-XbrKuyJu.js} +1 -1
  103. package/dist/assets/{canvas-story-capture.service-DQ_leYyi.js → canvas-story-capture.service-DYRdEzkG.js} +2 -2
  104. package/dist/assets/capability-coverage-7wKVA3PF.js +7 -0
  105. package/dist/assets/{collaboration-presence-BOS1t8wI.js → collaboration-presence-DaVKEfxs.js} +1 -1
  106. package/dist/assets/{collider-Bf4Uk6LW.js → collider-BEwlgkG5.js} +1 -1
  107. package/dist/assets/component-board.service-BWSBM2Bb.js +2 -0
  108. package/dist/assets/{component-board.service-DFSSCaCf.js → component-board.service-C9ZouakC.js} +2 -2
  109. package/dist/assets/{component-board.service-CpVXGhz5.js → component-board.service-D2eGKqHf.js} +2 -2
  110. package/dist/assets/component-contracts.service-D0uElctD.js +1 -0
  111. package/dist/assets/component-instance-root-C1Xf4SwR.js +1 -0
  112. package/dist/assets/{component-verbs.command-DGzZAV_Z.js → component-verbs.command-N-Tj8KOS.js} +1 -1
  113. package/dist/assets/{component-verbs.service-D1rVRogp.js → component-verbs.service-CWh4mQ7X.js} +1 -1
  114. package/dist/assets/{config-D-EAAhqP.js → config-hmmj-QHZ.js} +4 -4
  115. package/dist/assets/{configurations-_HZOWZPy.js → configurations-B9Pi_eRN.js} +1 -1
  116. package/dist/assets/connection.status-C2HPxoww.js +1 -0
  117. package/dist/assets/{constraint-5KLYpGm7.js → constraint-Bp1l8hY-.js} +1 -1
  118. package/dist/assets/constraints.inspector-D-h1f3K2.js +1 -0
  119. package/dist/assets/{content-bounds-DKBD7nsv.js → content-bounds-7UyI42Vj.js} +1 -1
  120. package/dist/assets/{contract-system-adapters-h6OUBRYA.js → contract-system-adapters-Bq1LGdjs.js} +1 -1
  121. package/dist/assets/coverage.service-BiBikIsV.js +3 -0
  122. package/dist/assets/{create-runtime-Bg2uYMfh.js → create-runtime-Cx-q5z2y.js} +2 -2
  123. package/dist/assets/curve-Co_mro-I.js +1 -0
  124. package/dist/assets/{data-asset-7Nfmx-28.js → data-asset-Ckx4D_U_.js} +1 -1
  125. package/dist/assets/data-check-core-CHqar_E8.js +1 -0
  126. package/dist/assets/data-ref-70PUrMuT.js +1 -0
  127. package/dist/assets/debug-bridge-CarsgKpm.js +1 -0
  128. package/dist/assets/debug-registry-DgYNlhH_.js +1 -0
  129. package/dist/assets/{deferred-ingest-play-Bej67_y9.js → deferred-ingest-play-Bpdhu2i-.js} +2 -2
  130. package/dist/assets/{design-time-canvas-mount-CFW9ZWuk.js → design-time-canvas-mount-Ca9Q75Ui.js} +2 -2
  131. package/dist/assets/design-time-layers-BIb71snu.js +1 -0
  132. package/dist/assets/{design-time-mount.service-DJeAPUB_.js → design-time-mount.service-DL6ZK2TQ.js} +2 -2
  133. package/dist/assets/{design-time-mount.service-_R1UDCw3.js → design-time-mount.service-zKUVjKAu.js} +2 -2
  134. package/dist/assets/design-time-react-mount-NrWimSxY.js +1 -0
  135. package/dist/assets/{document-preview-three-5cbuuJMH.js → document-preview-three-DoDs6q1q.js} +1 -1
  136. package/dist/assets/{dom-authoring-adapter-CoESNvrM.js → dom-authoring-adapter-adLQog9l.js} +1 -1
  137. package/dist/assets/{draco3d-Sk9K4AUT.js → draco3d-aUvQF1Zx.js} +1 -1
  138. package/dist/assets/{edit-mode-audio.service-CH6J-8N7.js → edit-mode-audio.service-CHZ1ultu.js} +1 -1
  139. package/dist/assets/edit-mode-authoring-ZQuUwc6e.js +1 -0
  140. package/dist/assets/{edit-mode-networking.service-C4o2pGHX.js → edit-mode-networking.service-C7fk2fL1.js} +1 -1
  141. package/dist/assets/editor-api-C8MUOrwt.js +1 -0
  142. package/dist/assets/{editor-layers-B4oYfpj8.js → editor-layers-CGX7iCSP.js} +1 -1
  143. package/dist/assets/editor-presentation-activity-CqJH4G9t.js +1 -0
  144. package/dist/assets/{editor-shell-store-Bh1S7M54.js → editor-shell-store-BRqB1JZO.js} +1 -1
  145. package/dist/assets/{entity-object-B_5Gc0Ky.js → entity-object--ZpqIat7.js} +1 -1
  146. package/dist/assets/{extend-DcEyE5jI.js → extend-BZQIQ18F.js} +1 -1
  147. package/dist/assets/{fork-menu-CKjNh3MO.js → fork-menu-CziehkPx.js} +1 -1
  148. package/dist/assets/{frame-debugger-store-D5YViF_8.js → frame-debugger-store-BOQjrPsh.js} +1 -1
  149. package/dist/assets/game-audio-BeCyd0Ha.js +1 -0
  150. package/dist/assets/{game-contract-seams-C0AVYwvO.js → game-contract-seams-Dgqv6S8X.js} +1 -1
  151. package/dist/assets/{game-css-scope-transform-8GOvVu1s.js → game-css-scope-transform-anfk8vP_.js} +2 -2
  152. package/dist/assets/game-document.service-CqmgrRUA.js +1 -0
  153. package/dist/assets/game-eval.command-CoetFm6_.js +2 -0
  154. package/dist/assets/game-module-access-Cg1EB8Mx.js +1 -0
  155. package/dist/assets/game-network-BqI-Ehz0.js +22 -0
  156. package/dist/assets/{gameplay-export-K5AcStVC.js → gameplay-export-D0hZoeSg.js} +1 -1
  157. package/dist/assets/gameplay-replay-BHz6VAVa.js +1 -0
  158. package/dist/assets/{gameplay.command-DoWqBWhH.js → gameplay.command-CPc9GKuW.js} +1 -1
  159. package/dist/assets/generation-CdOATubd.css +1 -0
  160. package/dist/assets/{generation-jobs-CiabIfR0.js → generation-jobs-D-zXQNZI.js} +1 -1
  161. package/dist/assets/generation.service-Bwt9lQEG.js +1 -0
  162. package/dist/assets/{generations-DU9rCeQR.js → generations-d-U9lCVo.js} +1 -1
  163. package/dist/assets/generations.status-BQ8xhaLN.js +1 -0
  164. package/dist/assets/hierarchy-marks-CndAXtie.js +1 -0
  165. package/dist/assets/hierarchy-marks-CsTaTkc7.js +1 -0
  166. package/dist/assets/hosted-asset-materialization-r2vKfJGY.js +2 -0
  167. package/dist/assets/{ibl-override-material-CiKkaOTW.js → ibl-override-material-CMo_a49U.js} +1 -1
  168. package/dist/assets/index-BMxv2MNV.js +1 -0
  169. package/dist/assets/index-BPVnvJfX.js +1 -0
  170. package/dist/assets/{index-C4AUQbmq.js → index-BqzpzjSB.js} +1 -1
  171. package/dist/assets/{index-CC1puVjo.js → index-CMU7lnXk.js} +1 -1
  172. package/dist/assets/index-CPiRKiDC.css +1 -0
  173. package/dist/assets/{index-CaG87ZF-.js → index-Cr9NTnJp.js} +271 -270
  174. package/dist/assets/index-DSMLYme2.js +1 -0
  175. package/dist/assets/index-DoGlzvsX.js +1 -0
  176. package/dist/assets/{index-BsYc2Oyj.js → index-dlvCCB72.js} +1 -1
  177. package/dist/assets/{index-Kb9_s5aP.js → index-xjc_62Ha.js} +1 -1
  178. package/dist/assets/{index-C20Flc1s.js → index-z0_InXxO.js} +2 -2
  179. package/dist/assets/{inference-diagnostics-MGcIHEX6.js → inference-diagnostics-D5jfxI5p.js} +1 -1
  180. package/dist/assets/{ingest-boot-viewport-D2okO6JI.js → ingest-boot-viewport-Be0v44yf.js} +1 -1
  181. package/dist/assets/ingest-siblings-BowXSozE.js +1 -0
  182. package/dist/assets/ingest-source-persistence-BGIvThcv.js +1 -0
  183. package/dist/assets/ingest.service-wVm-ZcTI.js +1 -0
  184. package/dist/assets/{inspect-C8RP8G5F.js → inspect-CN92MgRT.js} +1 -1
  185. package/dist/assets/inspection-D8fZOHCM.js +1 -0
  186. package/dist/assets/instances.command-B6gJuL1Z.js +1 -0
  187. package/dist/assets/{json-history-resource-CTXRV4GD.js → json-history-resource-C9G_vCX9.js} +1 -1
  188. package/dist/assets/{layered-pick-B_-BRrRD.js → layered-pick-D9tIz_m7.js} +1 -1
  189. package/dist/assets/{light-CskDQ8gF.js → light-BGbl1a8K.js} +1 -1
  190. package/dist/assets/{live-project-verbs-BOAQN3ME.js → live-project-verbs-p1sdTwhF.js} +1 -1
  191. package/dist/assets/{machine.document-BxOoCOo9.js → machine.document-C1acXU7l.js} +1 -1
  192. package/dist/assets/{machines.finder-CqEceWzS.js → machines.finder-sOxNTYPx.js} +1 -1
  193. package/dist/assets/material-D7289cYI.js +1 -0
  194. package/dist/assets/{material-factory-qB9pzcQf.js → material-factory-D0T-DH8c.js} +1 -1
  195. package/dist/assets/{mesh-5--4qA-C.js → mesh-1A-HHxD6.js} +1 -1
  196. package/dist/assets/model-asset-sections-D1uxOu2v.css +1 -0
  197. package/dist/assets/model-asset-sections.service-DF-mllTL.js +1 -0
  198. package/dist/assets/{model-inspection-MrJY0U_-.js → model-inspection-CuVwNVvv.js} +1 -1
  199. package/dist/assets/{model-thumbnail-uk-2sblh.js → model-thumbnail-xm1Fabi2.js} +1 -1
  200. package/dist/assets/{models.finder-rk8dhgO8.js → models.finder-DrvU1qGk.js} +1 -1
  201. package/dist/assets/module-mode-BHOAAbgO.js +2 -0
  202. package/dist/assets/mount-canvas-ingest-root-aVZkVNh4.js +2 -0
  203. package/dist/assets/mount-dom-ingest-root-eOOGPaxi.js +2 -0
  204. package/dist/assets/{mount-ingest-root-BC3-1Cw1.js → mount-ingest-root-BsWbEvr_.js} +2 -2
  205. package/dist/assets/{mount-manifest-QJOB11Kv.js → mount-manifest-t6ipNsoF.js} +1 -1
  206. package/dist/assets/mount-readiness-DyAd17pe.js +4 -0
  207. package/dist/assets/mount-three-ingest-root-DIR0wKrN.js +1 -0
  208. package/dist/assets/{mounted-authoring-B7RL_V28.js → mounted-authoring-DX3DC9PJ.js} +1 -1
  209. package/dist/assets/{mounted-story-viewport-source-CnYhX3vW.js → mounted-story-viewport-source-D8FqGpci.js} +1 -1
  210. package/dist/assets/{native-debug-module-B-rWJfWE.js → native-debug-module-CB738yQu.js} +1 -1
  211. package/dist/assets/{navigation-BVu-aVmF.js → navigation-B9ihB0qU.js} +1 -1
  212. package/dist/assets/{navmesh.menu-C3M63eR4.js → navmesh.menu-CPxr9LPT.js} +1 -1
  213. package/dist/assets/{navmesh.service-B0H1fUfn.js → navmesh.service-BAtili_Y.js} +1 -1
  214. package/dist/assets/network-observer.service-CqTuZNtI.js +1 -0
  215. package/dist/assets/network.utility-CclYEmfV.js +1 -0
  216. package/dist/assets/object-marks-BnvSuCTt.js +1 -0
  217. package/dist/assets/{object3d-authoring-subject-BDrxd1GA.js → object3d-authoring-subject-XccsO0xG.js} +1 -1
  218. package/dist/assets/{object3d-document-session-registry-OjqzJ86S.js → object3d-document-session-registry-BWeuL0nf.js} +2 -2
  219. package/dist/assets/{oid-transform-Bzc2ZJSH.js → oid-transform-BYeAsBKI.js} +1 -1
  220. package/dist/assets/{particles-Be7AvO4c.js → particles-BXiQDiB-.js} +1 -1
  221. package/dist/assets/{performance-profiler-OwnXQX0M.js → performance-profiler-CMbwGBuk.js} +1 -1
  222. package/dist/assets/pixi-authoring-adapter-CPsN0Yk7.js +1 -0
  223. package/dist/assets/pixi-live-write-target-BUbt5ixX.js +1 -0
  224. package/dist/assets/{play.command-CIGRq8ow.js → play.command-Bz5Ra6Uj.js} +2 -2
  225. package/dist/assets/pose-guard-CLabLSzf.js +1 -0
  226. package/dist/assets/presentation-C7ZHYsKF.js +1 -0
  227. package/dist/assets/{product-BN31wSnB.js → product-MSpbAqgo.js} +1 -1
  228. package/dist/assets/{profiler.action-D57Kj9ym.js → profiler.action-1Jbc-7Q4.js} +1 -1
  229. package/dist/assets/{profiler.menu-Dh9Q5DDx.js → profiler.menu-C544DxWZ.js} +1 -1
  230. package/dist/assets/profiler.utility-QnzedS3X.js +1 -0
  231. package/dist/assets/{project-authoring-session-LCJAwGrD.js → project-authoring-session-BhNfg7TY.js} +2 -2
  232. package/dist/assets/project-provenance-BGnJXJwa.js +1 -0
  233. package/dist/assets/{properties-bone-constraints.inspector-CaIDq5nN.js → properties-bone-constraints.inspector-DRCPfugt.js} +1 -1
  234. package/dist/assets/{properties-bone.inspector-D2fcQGMF.js → properties-bone.inspector-CYHeZX0p.js} +1 -1
  235. package/dist/assets/{properties-collection.inspector-CF5AtTAd.js → properties-collection.inspector-DtGhPkiU.js} +1 -1
  236. package/dist/assets/{properties-constraints.inspector-Bj2itDrS.js → properties-constraints.inspector-TIyIV777.js} +1 -1
  237. package/dist/assets/{properties-data.inspector-BfRqk0Xo.js → properties-data.inspector-vA0MTaup.js} +1 -1
  238. package/dist/assets/{properties-material.inspector-Bf8H0mvu.js → properties-material.inspector-C73spBQh.js} +1 -1
  239. package/dist/assets/{properties-modifiers.inspector-BKShc1TH.js → properties-modifiers.inspector-9oyLBBE0.js} +1 -1
  240. package/dist/assets/{properties-object.inspector-YBh8ABnN.js → properties-object.inspector-7BuiUgbd.js} +1 -1
  241. package/dist/assets/{properties-output.inspector-CVkzfs-l.js → properties-output.inspector-CjYAggz2.js} +1 -1
  242. package/dist/assets/{properties-particles.inspector-ChDpAq-2.js → properties-particles.inspector-DpSfjykX.js} +1 -1
  243. package/dist/assets/{properties-physics.inspector-BLEM7aMj.js → properties-physics.inspector-BUTvmfU9.js} +1 -1
  244. package/dist/assets/{properties-render.inspector-vU4D9xLL.js → properties-render.inspector-CEdsDqbI.js} +1 -1
  245. package/dist/assets/{properties-scene.inspector-C-DoN-kL.js → properties-scene.inspector-4kp0sLNw.js} +1 -1
  246. package/dist/assets/{properties-texture.inspector-DySxy1oU.js → properties-texture.inspector-Ckpqy9eo.js} +1 -1
  247. package/dist/assets/{properties-view-layer.inspector-DEKxMahJ.js → properties-view-layer.inspector-CQIFbY8-.js} +1 -1
  248. package/dist/assets/{properties-world.inspector-m5qL_TQV.js → properties-world.inspector-xZgNV6rI.js} +1 -1
  249. package/dist/assets/r3f-design-session-D8VF-hty.js +2 -0
  250. package/dist/assets/{r3f-physics-binding-Bgzzd4ol.js → r3f-physics-binding-oippu1v_.js} +1 -1
  251. package/dist/assets/{r3f-source-authoring-adapter-C8oMjdTL.js → r3f-source-authoring-adapter-CZJX6VLM.js} +1 -1
  252. package/dist/assets/react-canvas-navigation-DuzvnFoN.js +1 -0
  253. package/dist/assets/react-inspector.service-CV4p6nrb.js +1 -0
  254. package/dist/assets/react-story-board-mhldts6w.js +1 -0
  255. package/dist/assets/{react-three-rapier.esm-BR2ttgLS.js → react-three-rapier.esm-Bo9LjrZe.js} +1 -1
  256. package/dist/assets/react-world-authoring-adapter-CuyruDfq.js +1 -0
  257. package/dist/assets/{realm-services-DefTrXnY.js → realm-services-BtiLE3a-.js} +1 -1
  258. package/dist/assets/reflection-probe-capture.inspector-mrrOHs-9.js +1 -0
  259. package/dist/assets/{reflection-probe-BHNGwVyz.js → reflection-probe-sIto9mh0.js} +1 -1
  260. package/dist/assets/registry-DpUr2YIM.js +1 -0
  261. package/dist/assets/{relative-import-specifier-DQzkawgj.js → relative-import-specifier-CyT6yU4l.js} +1 -1
  262. package/dist/assets/{render-env-BZ7LsGfk.js → render-env-C63BGT5v.js} +1 -1
  263. package/dist/assets/{render-features-C7QwmhCo.js → render-features-CBl6rom9.js} +1 -1
  264. package/dist/assets/{render-settings-BBvkacR3.js → render-settings-DjarlnjI.js} +1 -1
  265. package/dist/assets/resolve-three-OiswFiIS.js +702 -0
  266. package/dist/assets/root-seam-contract-BYLQx4CQ.js +1 -0
  267. package/dist/assets/{run-selection-BUeubtHj.js → run-selection-BMu0v3qC.js} +1 -1
  268. package/dist/assets/scene-capture-BLf3lJ44.js +1 -0
  269. package/dist/assets/scene-document.service-CjPDph5k.js +2 -0
  270. package/dist/assets/{scene-framing-PVMqGU8h.js → scene-framing-BhNk0WhI.js} +1 -1
  271. package/dist/assets/{scene-index--lRWLEmW.js → scene-index-DHeKmalD.js} +1 -1
  272. package/dist/assets/{scene-query-s1y04OVB.js → scene-query-ByZtXA2m.js} +1 -1
  273. package/dist/assets/seeded-random-DmdE0u-C.js +1 -0
  274. package/dist/assets/{session-CTXsU1lK.js → session-CeyQA0Dv.js} +35 -35
  275. package/dist/assets/{setup-renderer-OOw1SykJ.js → setup-renderer-Bf8g2S0f.js} +1 -1
  276. package/dist/assets/{source-object3d-authoring-adapter-RmutT5Dt.js → source-object3d-authoring-adapter-IDRws2Nk.js} +1 -1
  277. package/dist/assets/{source-persistence-backend-HviqjKZ2.js → source-persistence-backend-Dzc6MsmN.js} +1 -1
  278. package/dist/assets/{spark-renderer-lifecycle-DfYpvEJa.js → spark-renderer-lifecycle-B6Axb6jm.js} +1 -1
  279. package/dist/assets/{stage-keyboard-DDi7S27C.js → stage-keyboard-CpnIYiph.js} +1 -1
  280. package/dist/assets/stage-overlay-set-BrJzOTCe.js +1 -0
  281. package/dist/assets/stage-presence-markers-BFTl9Djp.js +1 -0
  282. package/dist/assets/stage-transform-tools-QaenmSrC.js +1 -0
  283. package/dist/assets/standard-viewport-dressing-DuKH01r4.js +24 -0
  284. package/dist/assets/{state-watch.action-DEdb1mNa.js → state-watch.action-BaRZ6YII.js} +1 -1
  285. package/dist/assets/{state-watch.menu-jWbUM3kw.js → state-watch.menu-DR2AtQ6r.js} +1 -1
  286. package/dist/assets/state-watch.utility-VW8H9Fgi.js +1 -0
  287. package/dist/assets/{story-capture-Dj1xkeKH.js → story-capture-BEVV48wm.js} +1 -1
  288. package/dist/assets/story-documents-DndjqJ7Y.js +3 -0
  289. package/dist/assets/{story-documents.service-BzQCuNBu.js → story-documents.service-CPrZ7gRM.js} +1 -1
  290. package/dist/assets/{story-documents.service-iNP-ORNr.js → story-documents.service-wCVmBPhh.js} +1 -1
  291. package/dist/assets/{story-media-presence-zTPlU9HR.js → story-media-presence-BSX78yVJ.js} +1 -1
  292. package/dist/assets/{story-pixi-preview-B7THvSl7.js → story-pixi-preview-D4FuH7lJ.js} +1 -1
  293. package/dist/assets/{story-presentation-BLXYPadR.js → story-presentation-2AxtnKGb.js} +1 -1
  294. package/dist/assets/story-three-preview-DjObHSAF.js +2 -0
  295. package/dist/assets/{structural-ids-Br2zjINh.js → structural-ids-BOo2BRoY.js} +1 -1
  296. package/dist/assets/studio-environment-B--4k2mN.js +2 -0
  297. package/dist/assets/{surface-state-D9j6qNu8.js → surface-state-CQHVfsma.js} +1 -1
  298. package/dist/assets/{syntactic-prop-specs-BTnsMOvH.js → syntactic-prop-specs-CewRyC4c.js} +1 -1
  299. package/dist/assets/team-playtest.service-B9m6CNk7.js +1 -0
  300. package/dist/assets/{three-oYrcK5SQ.js → three-B86IzdNg.js} +1 -1
  301. package/dist/assets/three-authoring-adapter-BD8_MtYK.js +1 -0
  302. package/dist/assets/three-authoring.service-BjJ9wetk.js +2 -0
  303. package/dist/assets/{three-ingest-runtime-CXKjNysA.js → three-ingest-runtime-CXySzulx.js} +1 -1
  304. package/dist/assets/{three-integration-CuAnYaTW.js → three-integration-nl5TC6EF.js} +2 -2
  305. package/dist/assets/three-integration.service-BEk5QkKM.js +1 -0
  306. package/dist/assets/three-projection-core-D4m8lsPU.js +1 -0
  307. package/dist/assets/{three-state-wXRU3rLr.js → three-state-C36FeFK4.js} +1 -1
  308. package/dist/assets/{three-story-capture.service-DMJRcqjr.js → three-story-capture.service-C0icETyL.js} +2 -2
  309. package/dist/assets/{three-story-model-DgiAP-oQ.js → three-story-model-CqWu9S2a.js} +1 -1
  310. package/dist/assets/three-viewport-presentation-CCMgGLI2.js +141 -0
  311. package/dist/assets/tools-BnE3UWVA.js +1 -0
  312. package/dist/assets/transform-mode-request-CIgYj1Qb.js +1 -0
  313. package/dist/assets/transport-strip-B1AJKpn-.js +1 -0
  314. package/dist/assets/transport.header-D-n6dQ5n.js +1 -0
  315. package/dist/assets/{trigger-volume-DP0G1VBe.js → trigger-volume-BLkHmfm9.js} +1 -1
  316. package/dist/assets/tuples-uyiMYXrv.js +1 -0
  317. package/dist/assets/ui-board-document-6e4w4a8B.js +2 -0
  318. package/dist/assets/{user-data-CqOoAowZ.js → user-data-BXFD1jg-.js} +1 -1
  319. package/dist/assets/user-data-CODoGZqA.js +1 -0
  320. package/dist/assets/{utility-view-state-Db97zwDz.js → utility-view-state-I_o0WThv.js} +1 -1
  321. package/dist/assets/viewport-door-AsLxGhLN.js +1 -0
  322. package/dist/assets/{viewport-root-presentation-B35t51xX.js → viewport-root-presentation-B1qtThOB.js} +1 -1
  323. package/dist/assets/{viewport-surface-status-D5kZtFW5.js → viewport-surface-status-CWmQeKTO.js} +1 -1
  324. package/dist/assets/{webworkerAll-CfKEb4Ao.js → webworkerAll-DC445ANd.js} +1 -1
  325. package/dist/assets/worker-jepHAPPr.js +2 -0
  326. package/dist/assets/workspace-arrangement-dkubzCff.js +1 -0
  327. package/dist/assets/world-documents-psBK5u_2.js +1 -0
  328. package/dist/assets/world-root-stage-binding-BrvO8VMz.js +1 -0
  329. package/dist/assets/{xstate-animation-binding-aQEmNSpm.js → xstate-animation-binding-ChVFHSlM.js} +1 -1
  330. package/dist/assets/{xstate-animation-meta-CnMX1Sc1.js → xstate-animation-meta-D7xnhyCE.js} +1 -1
  331. package/dist/volter-shared-react.json +10 -0
  332. package/dist/volter-shared-three.json +3 -0
  333. package/dist-node/cli.js +247 -209
  334. package/dist-node/create.js +90 -74
  335. package/package.json +20 -19
  336. package/src/contributions.d.ts +1 -1
  337. package/src/index.ts +10 -10
  338. package/starter/cube.py +1 -1
  339. package/template/.agents/references/project-manual.md +17 -18
  340. package/template/.agents/skills/editor/SKILL.md +6 -6
  341. package/template/.agents/skills/editor/agents/openai.yaml +3 -3
  342. package/template/.agents/skills/editor/references/editor-control.md +62 -62
  343. package/template/.agents/skills/{vgai-3d-models → volter-3d-models}/SKILL.md +3 -3
  344. package/template/.agents/skills/{vgai-ingest-existing-game → volter-ingest-existing-game}/SKILL.md +3 -3
  345. package/template/.agents/skills/{vgai-music → volter-music}/SKILL.md +7 -7
  346. package/template/{.github/skills/vgai-threejs-authoring → .agents/skills/volter-threejs-authoring}/SKILL.md +9 -9
  347. package/template/.agents/skills/volter-threejs-authoring/agents/openai.yaml +4 -0
  348. package/template/{.claude/skills/vgai-threejs-authoring → .agents/skills/volter-threejs-authoring}/references/helper-catalog.md +1 -1
  349. package/template/.claude/skills/editor/SKILL.md +6 -6
  350. package/template/.claude/skills/editor/agents/openai.yaml +3 -3
  351. package/template/.claude/skills/editor/references/editor-control.md +62 -62
  352. package/template/{.github/skills/vgai-3d-models → .claude/skills/volter-3d-models}/SKILL.md +3 -3
  353. package/template/{.github/skills/vgai-ingest-existing-game → .claude/skills/volter-ingest-existing-game}/SKILL.md +3 -3
  354. package/template/.claude/skills/{vgai-threejs-authoring → volter-threejs-authoring}/SKILL.md +9 -9
  355. package/template/.claude/skills/volter-threejs-authoring/agents/openai.yaml +4 -0
  356. package/template/{.agents/skills/vgai-threejs-authoring → .claude/skills/volter-threejs-authoring}/references/helper-catalog.md +1 -1
  357. package/template/.github/copilot-instructions.md +1 -1
  358. package/template/.github/skills/editor/SKILL.md +6 -6
  359. package/template/.github/skills/editor/agents/openai.yaml +3 -3
  360. package/template/.github/skills/editor/references/editor-control.md +62 -62
  361. package/template/{.claude/skills/vgai-3d-models → .github/skills/volter-3d-models}/SKILL.md +3 -3
  362. package/template/{.claude/skills/vgai-ingest-existing-game → .github/skills/volter-ingest-existing-game}/SKILL.md +3 -3
  363. package/template/{.agents/skills/vgai-threejs-authoring → .github/skills/volter-threejs-authoring}/SKILL.md +9 -9
  364. package/template/.github/skills/volter-threejs-authoring/agents/openai.yaml +4 -0
  365. package/template/.github/skills/{vgai-threejs-authoring → volter-threejs-authoring}/references/helper-catalog.md +1 -1
  366. package/template/.mcp.json +3 -3
  367. package/template/AGENTS.md +25 -25
  368. package/template/DEVLOG.md +1 -1
  369. package/template/IDIOMS.md +3 -3
  370. package/template/LICENSE +3 -3
  371. package/template/README.md +12 -13
  372. package/template/check-idioms.ts +71 -95
  373. package/template/manifest-entry-modules-plugin.ts +17 -4
  374. package/template/package.json +13 -15
  375. package/template/server/colyseus-setup.ts +1 -9
  376. package/template/server/main.ts +4 -9
  377. package/template/server/rooms/arena-room.ts +10 -10
  378. package/template/server/rooms/game-room.ts +10 -10
  379. package/template/server/rooms.ts +3 -5
  380. package/template/src/bot/QaTester.tsx +1 -1
  381. package/template/src/bot/bot-station.ts +2 -2
  382. package/template/src/bot/tester-station.ts +1 -1
  383. package/template/src/contributions/README.md +1 -1
  384. package/template/src/contributions/analytics.analytics.tsx +1 -1
  385. package/template/src/contributions/data.document.tsx +2 -2
  386. package/template/src/contributions/pages.finder.ts +1 -1
  387. package/template/src/contributions/tester.inspector.tsx +2 -2
  388. package/template/src/contributions/use-game-modules.ts +1 -1
  389. package/template/src/input.ts +1 -1
  390. package/template/src/lib/reflections/volume-reflection-material.ts +59 -59
  391. package/template/src/lib/static-batch/Frozen.tsx +1 -1
  392. package/template/src/lib/static-batch/mutation-watch.ts +1 -1
  393. package/template/src/main.ts +19 -38
  394. package/template/src/manifest-entry-modules.d.ts +12 -1
  395. package/template/src/net/NetworkedPlayers.tsx +3 -3
  396. package/template/src/prefabs/HeroBox.stories.tsx +1 -1
  397. package/template/src/world.tsx +1 -1
  398. package/template/tsconfig.json +1 -1
  399. package/template/validate-manifest.ts +3 -3
  400. package/template/vite.config.ts +12 -12
  401. package/template/{vgai.adapter.ts → volter.adapter.ts} +1 -1
  402. package/template/{vgai.project.json → volter.project.json} +2 -2
  403. package/template-dotfiles/gitignore +27 -27
  404. package/workbench/src/media/game-cover.css +11 -11
  405. package/workbench/src/product.contribution.ts +28 -28
  406. package/workbench/src/{vgaiGameSkew.ts → volterGameSkew.ts} +16 -16
  407. package/dist/assets/AudioViewer-xFb5Wv7A.js +0 -1
  408. package/dist/assets/CanvasSceneViewport-vqBlOz8P.js +0 -1
  409. package/dist/assets/ColorInput-CX1UZjYO.js +0 -1
  410. package/dist/assets/ImageViewer-shZzMd91.js +0 -1
  411. package/dist/assets/InspectorObjectPreview-BMOvJaOw.js +0 -1
  412. package/dist/assets/JsonAssetDocument-D_HXneWE.js +0 -2
  413. package/dist/assets/Object3DDocumentToolbar-BfPH9jz5.js +0 -1
  414. package/dist/assets/Object3DDocumentViewport-BaXWtATg.js +0 -2
  415. package/dist/assets/OnlineAssetDetail-BxibUH6K.js +0 -1
  416. package/dist/assets/PlayBar-DRANyO01.js +0 -1
  417. package/dist/assets/ReactCanvasControls-K98jOX9b.js +0 -1
  418. package/dist/assets/RootSelectionOverlay-BQC12Gdd.js +0 -1
  419. package/dist/assets/ShadowEditor-DP1LWynl.js +0 -1
  420. package/dist/assets/StageHost-V_0opXFt.js +0 -2
  421. package/dist/assets/ThreeBoardDocument-tgcaZDqQ.js +0 -2
  422. package/dist/assets/Toolbar-uLgsrB2z.js +0 -1
  423. package/dist/assets/VideoViewer-ClUJ6_uy.js +0 -1
  424. package/dist/assets/ViewportShadingMenu-Bdkc6jcd.js +0 -1
  425. package/dist/assets/active-ingest-CnAeQcuQ.js +0 -3
  426. package/dist/assets/animation-mixers.service-DiecMX_A.js +0 -1
  427. package/dist/assets/animation-timeline.utility-C71vPJgs.js +0 -1
  428. package/dist/assets/asset-editor-persistence-BQgjOCrm.js +0 -1
  429. package/dist/assets/asset-loaders-5PIUVvmH.js +0 -2
  430. package/dist/assets/audio.utility-D9Vk_WYS.js +0 -1
  431. package/dist/assets/autoplay.service-CFJoLPLw.js +0 -1
  432. package/dist/assets/binding-resolver-C_9MBSMa.js +0 -2
  433. package/dist/assets/blender-emscripten-engine-BeWFjMn-.js +0 -2
  434. package/dist/assets/blender-version.status-DtfwUahB.js +0 -1
  435. package/dist/assets/blender-wali-engine-da698rDf.js +0 -2
  436. package/dist/assets/blender.status-ujwGU6dU.js +0 -1
  437. package/dist/assets/board-guides-_3R1t_-2.js +0 -1
  438. package/dist/assets/body-marks-RKb_LTwL.js +0 -1
  439. package/dist/assets/build-profiles.document-CZxDuhzz.js +0 -2
  440. package/dist/assets/build-progress.status-Dk5u3C67.js +0 -1
  441. package/dist/assets/build.header--xqH6uTP.js +0 -1
  442. package/dist/assets/canvas-entry-runtime-DVeh71nC.js +0 -2
  443. package/dist/assets/capability-coverage-DQgg6UJe.js +0 -7
  444. package/dist/assets/component-board.service-DgujG90T.js +0 -2
  445. package/dist/assets/component-contracts.service-Bc_2Xxh_.js +0 -1
  446. package/dist/assets/component-instance-root-df4ofoOR.js +0 -1
  447. package/dist/assets/connection.status-CCX-mgmr.js +0 -1
  448. package/dist/assets/constraints.inspector-CwEEREsf.js +0 -1
  449. package/dist/assets/coverage.service-CV7b5Sqn.js +0 -3
  450. package/dist/assets/curve-BKuiAPpj.js +0 -1
  451. package/dist/assets/data-check-core-CQEjuFyt.js +0 -1
  452. package/dist/assets/data-ref-DyFQqqX6.js +0 -1
  453. package/dist/assets/debug-bridge-CESAxmlz.js +0 -1
  454. package/dist/assets/debug-registry-l7k5Hjc8.js +0 -1
  455. package/dist/assets/design-time-layers-CQgnmqc8.js +0 -1
  456. package/dist/assets/design-time-react-mount-CFvIk_rV.js +0 -1
  457. package/dist/assets/edit-mode-authoring-DBjaBTxM.js +0 -1
  458. package/dist/assets/editor-api-D2azVray.js +0 -1
  459. package/dist/assets/editor-presentation-activity-C7SNSmTd.js +0 -1
  460. package/dist/assets/game-audio-CaGKzia4.js +0 -1
  461. package/dist/assets/game-document.service-FdG_gFPU.js +0 -1
  462. package/dist/assets/game-eval.command-4wa9vqWE.js +0 -2
  463. package/dist/assets/game-module-access-DulnT3NH.js +0 -1
  464. package/dist/assets/game-network-Bo_nlDR5.js +0 -22
  465. package/dist/assets/gameplay-replay-CnWnlogY.js +0 -1
  466. package/dist/assets/generation-DhwCUHPf.css +0 -1
  467. package/dist/assets/generation.service-D2yeZaJu.js +0 -1
  468. package/dist/assets/generations.status-3CrPw_n5.js +0 -1
  469. package/dist/assets/hierarchy-marks-BLPfSIym.js +0 -1
  470. package/dist/assets/hierarchy-marks-C25dY2fR.js +0 -1
  471. package/dist/assets/hosted-asset-materialization-DYdcFlDf.js +0 -2
  472. package/dist/assets/index-B5WjeCHm.css +0 -1
  473. package/dist/assets/index-BcH5GC3b.js +0 -1
  474. package/dist/assets/index-CwCDkEl1.js +0 -1
  475. package/dist/assets/index-n3QdTv-T.js +0 -1
  476. package/dist/assets/index.module-Ycad3DJq.js +0 -1
  477. package/dist/assets/ingest-siblings-CkxW__go.js +0 -1
  478. package/dist/assets/ingest-source-persistence-6peGfPAS.js +0 -1
  479. package/dist/assets/ingest.service-Cc73WMIW.js +0 -1
  480. package/dist/assets/inspection-CObLhnrs.js +0 -1
  481. package/dist/assets/instances.command-CxKGnrNl.js +0 -1
  482. package/dist/assets/material-BwFzKPi0.js +0 -1
  483. package/dist/assets/model-asset-sections-CFvvihfx.css +0 -1
  484. package/dist/assets/model-asset-sections.service-TZ2SaBmH.js +0 -1
  485. package/dist/assets/module-mode-B79jV5tQ.js +0 -2
  486. package/dist/assets/mount-canvas-ingest-root-BhaYNuhY.js +0 -2
  487. package/dist/assets/mount-dom-ingest-root-BQb1u0LX.js +0 -2
  488. package/dist/assets/mount-readiness-Ds0HvvLH.js +0 -4
  489. package/dist/assets/mount-three-ingest-root-DIDBfvIH.js +0 -1
  490. package/dist/assets/network-observer.service-CiR4Q9Q0.js +0 -1
  491. package/dist/assets/network.utility-CNG3eJ0E.js +0 -1
  492. package/dist/assets/object-marks-DwvIEBOK.js +0 -1
  493. package/dist/assets/pixi-authoring-adapter-B42K4md-.js +0 -1
  494. package/dist/assets/pixi-live-write-target-D56tQEe_.js +0 -1
  495. package/dist/assets/pose-guard-DILO6gGq.js +0 -1
  496. package/dist/assets/presentation-DGBuGP6i.js +0 -1
  497. package/dist/assets/profiler.utility-DLNySW3w.js +0 -1
  498. package/dist/assets/project-provenance-4ldz-EOG.js +0 -1
  499. package/dist/assets/r3f-design-session-C0DPEChS.js +0 -2
  500. package/dist/assets/react-canvas-navigation-Jowa_lJq.js +0 -1
  501. package/dist/assets/react-inspector.service-TfTdj_Qk.js +0 -1
  502. package/dist/assets/react-story-board-Bx7qYytV.js +0 -1
  503. package/dist/assets/react-world-authoring-adapter-C1jPW_cN.js +0 -1
  504. package/dist/assets/reflection-probe-capture.inspector-C-6zrzZb.js +0 -1
  505. package/dist/assets/registry-Z28XSZHF.js +0 -1
  506. package/dist/assets/resolve-three-C7zDbK29.js +0 -702
  507. package/dist/assets/root-seam-contract-rGNbiX6q.js +0 -1
  508. package/dist/assets/scene-capture-BTWgUzhI.js +0 -1
  509. package/dist/assets/scene-document.service-DJJp-la1.js +0 -2
  510. package/dist/assets/seeded-random-38To73fI.js +0 -1
  511. package/dist/assets/stage-overlay-set-olkNSZmq.js +0 -1
  512. package/dist/assets/stage-presence-markers-cznMN_qq.js +0 -1
  513. package/dist/assets/stage-transform-tools-BDUZqRIR.js +0 -1
  514. package/dist/assets/standard-viewport-dressing-BZyuxyVl.js +0 -24
  515. package/dist/assets/state-watch.utility-DDmn3G25.js +0 -1
  516. package/dist/assets/story-documents-8ehMyYHo.js +0 -3
  517. package/dist/assets/story-three-preview-B1nNiPwP.js +0 -2
  518. package/dist/assets/studio-environment-yaKaHPxH.js +0 -2
  519. package/dist/assets/team-playtest.service-Ds9tkO4q.js +0 -1
  520. package/dist/assets/three-authoring-adapter-BrkGH4cd.js +0 -1
  521. package/dist/assets/three-authoring.service-DoamZDMx.js +0 -2
  522. package/dist/assets/three-integration.service-Db-VabIm.js +0 -1
  523. package/dist/assets/three-projection-core-jBJVt6O0.js +0 -1
  524. package/dist/assets/three-viewport-presentation-CgO3eWJ-.js +0 -141
  525. package/dist/assets/tools-B_NJsk05.js +0 -1
  526. package/dist/assets/transform-mode-request-BnKpgRUW.js +0 -1
  527. package/dist/assets/transport-strip-a9yLoPsI.js +0 -1
  528. package/dist/assets/transport.header-CpfoppXc.js +0 -1
  529. package/dist/assets/tuples-CKsHOV9T.js +0 -1
  530. package/dist/assets/ui-board-document-DtTR_mBr.js +0 -2
  531. package/dist/assets/user-data-dHvLdpwM.js +0 -1
  532. package/dist/assets/viewport-door-DVkMQazS.js +0 -1
  533. package/dist/assets/worker-CC9Ug5Ei.js +0 -2
  534. package/dist/assets/workspace-arrangement-DIMM7ska.js +0 -1
  535. package/dist/assets/world-documents-C4t3iOD-.js +0 -1
  536. package/dist/assets/world-root-stage-binding-ydl3JN1a.js +0 -1
  537. package/dist/vgai-shared-react.json +0 -10
  538. package/dist/vgai-shared-three.json +0 -3
  539. package/template/.agents/skills/vgai-threejs-authoring/agents/openai.yaml +0 -4
  540. package/template/.claude/skills/vgai-threejs-authoring/agents/openai.yaml +0 -4
  541. package/template/.github/skills/vgai-threejs-authoring/agents/openai.yaml +0 -4
  542. package/template/server/loopback.ts +0 -76
  543. /package/dist/assets/{vgai-shared-fontawesome-CU65D4Ij.js → volter-shared-fontawesome-CU65D4Ij.js} +0 -0
  544. /package/dist/assets/{vgai-shared-jsx-dev-runtime-DFDKL7fx.js → volter-shared-jsx-dev-runtime-DFDKL7fx.js} +0 -0
  545. /package/dist/assets/{vgai-shared-jsx-runtime-DIqBpTut.js → volter-shared-jsx-runtime-DIqBpTut.js} +0 -0
  546. /package/dist/assets/{vgai-shared-react-BT7rMc2H.js → volter-shared-react-BT7rMc2H.js} +0 -0
  547. /package/dist/assets/{vgai-shared-react-dom-DFajMqMT.js → volter-shared-react-dom-DFajMqMT.js} +0 -0
  548. /package/dist/assets/{vgai-shared-react-dom-client-S0ozfl6_.js → volter-shared-react-dom-client-S0ozfl6_.js} +0 -0
  549. /package/dist/assets/{vgai-shared-three-DH4yxKwt.js → volter-shared-three-DH4yxKwt.js} +0 -0
  550. /package/template/{.vgai → .volter}/assets.json +0 -0
  551. /package/template/{.vgai → .volter}/provenance.json +0 -0
@@ -1,5 +1,5 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/RectAreaLightUniformsLib-DpPyArRG.js","assets/three.module-BLhyNg0e.js","assets/three.core-3arARmh6.js"])))=>i.map(i=>d[i]);
2
- import{a as Uo,b as Wo,L as Ho}from"./LineSegments2-DN9pUfWA.js";import{bh as ot,cl as qo,fo as x,cm as X,N as fn,a$ as bt,em as Kn,b4 as Te,co as Tt,ey as Pe,cp as bn,_ as ht,ej as Mt,fd as $t,er as Ae,M as it,cj as ut,dp as gt,aV as Se,cW as Go,aE as Xo,c7 as ft,j as Ee,f6 as Me,fp as Jn,au as Tn,dw as Pn,bi as to,aT as Ne,c1 as Lt,dd as Ln,eC as Vn,e7 as gn,aw as nn,da as It,I as yn,as as Re,e8 as Ie,b0 as Yo,K as ze,B as Fe,b9 as De,Y as Zo,cw as ln,ed as Ce,cA as ke,fx as $e,db as Qo,el as Le,R as Ve,e6 as je,c0 as Ko,bX as Be,aI as uo,ao as Ue,eG as We,d3 as He,cs as qe,ex as Ge,b5 as Xe,cY as Ye,eU as Ze,cE as jn,c5 as Jo,cO as no,at as Qe,ff as Ke,eW as Je,f7 as ta,F as na,ev as oa,et as ea,dq as aa,fq as ra,n as la,l as ia,cf as sa}from"./three.core-3arARmh6.js";import{r as P,t as z,u as E,by as q,bx as W,bz as S,e0 as $,_ as fa,mt as te,dY as jt,v as j,ku as _t,d$ as ne,mu as B,dX as ca,mv as ua}from"./index-CaG87ZF-.js";import{S as zt}from"./three.module-BLhyNg0e.js";import{t as _a}from"./blender-runtime-host-CuniE0sy.js";const Bn=new Set;function vt(){for(const o of[...Bn])o()}function ma(o){return Bn.add(o),()=>{Bn.delete(o)}}function Un(o){const t=atob(o),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}const Zt=S().finite(),da=P({name:E(),parent:E().nullable(),connected:q(),hide:q(),length:Zt,matrix:z($([Zt,Zt,Zt,Zt])).length(4),select:q(),active:q(),lockedWeight:q()}).strict(),ha=P({object:E(),displayType:W(["OCTAHEDRAL","STICK","BBONE","ENVELOPE","WIRE"]),showInFront:q(),mode:E(),bones:z(da)}).strict(),xt={solid:11711154,pose:5294335,poseActive:9240575,poseActiveUnsel:794150,wire:0,vertex:0,lockedWeight:16711680,lockedWeightFactor:128/255};function pa(o){return new ht(o.r*o.r*.1,o.g*o.g*.1,o.b*o.b*.1)}const An=[[0,0,0],[.1,.1,.1],[.1,.1,-.1],[-.1,.1,-.1],[-.1,.1,.1],[0,1,0]],_o=[[2,1,0],[3,2,0],[4,3,0],[1,4,0],[5,1,2],[5,2,3],[5,3,4],[5,4,1]],Pt=Math.SQRT1_2,va=[[Pt,-Pt,0],[0,-Pt,-Pt],[-Pt,-Pt,0],[0,-Pt,Pt],[.99388373,.11043154,0],[0,.11043154,-.99388373],[-.99388373,.11043154,0],[0,.11043154,.99388373]],ga=[[0,1],[1,5],[5,3],[3,0],[0,4],[4,5],[5,2],[2,0],[1,2],[2,3],[3,4],[4,1]],xa=.05;function mo(o){return o.select||o.active?2:1}const ba=10,ya=4,wa=`
2
+ import{a as Uo,b as Wo,L as Ho}from"./LineSegments2-DN9pUfWA.js";import{bh as ot,cl as qo,fo as x,cm as X,N as fn,a$ as bt,em as Kn,b4 as Te,co as Tt,ey as Pe,cp as bn,_ as ht,ej as Mt,fd as $t,er as Ae,M as it,cj as ut,dp as gt,aV as Se,cW as Go,aE as Xo,c7 as ft,j as Ee,f6 as Me,fp as Jn,au as Tn,dw as Pn,bi as to,aT as Ne,c1 as Lt,dd as Ln,eC as Vn,e7 as gn,aw as nn,da as It,I as yn,as as Re,e8 as Ie,b0 as Yo,K as ze,B as Fe,b9 as De,Y as Zo,cw as ln,ed as Ce,cA as ke,fx as $e,db as Qo,el as Le,R as Ve,e6 as je,c0 as Ko,bX as Be,aI as uo,ao as Ue,eG as We,d3 as He,cs as qe,ex as Ge,b5 as Xe,cY as Ye,eU as Ze,cE as jn,c5 as Jo,cO as no,at as Qe,ff as Ke,eW as Je,f7 as ta,F as na,ev as oa,et as ea,dq as aa,fq as ra,n as la,l as ia,cf as sa}from"./three.core-3arARmh6.js";import{t as P,u as z,v as E,bz as q,by as W,bA as S,e1 as $,_ as fa,mu as te,dZ as jt,w as j,kv as _t,e0 as ne,mv as B,dY as ca,mw as ua}from"./index-Cr9NTnJp.js";import{S as zt}from"./three.module-BLhyNg0e.js";import{t as _a}from"./blender-runtime-host-Cbkie7m4.js";const Bn=new Set;function vt(){for(const o of[...Bn])o()}function ma(o){return Bn.add(o),()=>{Bn.delete(o)}}function Un(o){const t=atob(o),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}const Zt=S().finite(),da=P({name:E(),parent:E().nullable(),connected:q(),hide:q(),length:Zt,matrix:z($([Zt,Zt,Zt,Zt])).length(4),select:q(),active:q(),lockedWeight:q()}).strict(),ha=P({object:E(),displayType:W(["OCTAHEDRAL","STICK","BBONE","ENVELOPE","WIRE"]),showInFront:q(),mode:E(),bones:z(da)}).strict(),xt={solid:11711154,pose:5294335,poseActive:9240575,poseActiveUnsel:794150,wire:0,vertex:0,lockedWeight:16711680,lockedWeightFactor:128/255};function pa(o){return new ht(o.r*o.r*.1,o.g*o.g*.1,o.b*o.b*.1)}const An=[[0,0,0],[.1,.1,.1],[.1,.1,-.1],[-.1,.1,-.1],[-.1,.1,.1],[0,1,0]],_o=[[2,1,0],[3,2,0],[4,3,0],[1,4,0],[5,1,2],[5,2,3],[5,3,4],[5,4,1]],Pt=Math.SQRT1_2,va=[[Pt,-Pt,0],[0,-Pt,-Pt],[-Pt,-Pt,0],[0,-Pt,Pt],[.99388373,.11043154,0],[0,.11043154,-.99388373],[-.99388373,.11043154,0],[0,.11043154,.99388373]],ga=[[0,1],[1,5],[5,3],[3,0],[0,4],[4,5],[5,2],[2,0],[1,2],[2,3],[3,4],[4,1]],xa=.05;function mo(o){return o.select||o.active?2:1}const ba=10,ya=4,wa=`
3
3
  attribute vec3 aSolid;
4
4
  attribute vec3 aHint;
5
5
  varying vec3 vColor;
@@ -7135,10 +7135,10 @@ attribute vec2 uv${d};
7135
7135
  radiance+=incident(origin+ray*t,ray)*exp(-sigma*t)*(hi-lo);
7136
7136
  }
7137
7137
  gl_FragColor=vec4(radiance,base.a+(1.-base.a)*(1.-dot(tr,vec3(1./3.))));
7138
- }`}),this.scene.clear(),this.scene.add(new Tt(this.geometry,this.material)),this.target.setSize(n.width,n.height);const _=t.getRenderTarget();try{t.setRenderTarget(this.target),t.render(this.scene,this.camera)}finally{t.setRenderTarget(_)}return this.target}dispose(){this.material?.dispose(),this.geometry.dispose(),this.target.dispose(),this.scene.clear()}}const sl=P({object:E(),group:E(),groupIndex:S().int().nonnegative(),count:S().int().nonnegative(),digest:E(),alertMode:W(["NONE","ACTIVE","ALL"]),unchanged:j(!0).optional(),weightsBase64:E().optional(),alertBase64:E().optional()}).strict();function fl(o){const n=o<0?0:o>1?1:o,e=(.5+.5*n)**1.5,[r,a,i]=cl(2/3*(1-n)),c=new ht;return c.setRGB((r*e)**(1/1.5),(a*e)**(1/1.5),(i*e)**(1/1.5),Mt),c}function cl(o){const t=(o%1+1)%1,n=Math.floor(t*6),e=t*6-n;switch(n%6){case 0:return[1,e,0];case 1:return[1-e,1,0];case 2:return[0,1,e];case 3:return[0,1-e,1];case 4:return[e,0,1];default:return[1,0,1-e]}}const ul=0;function Co(o){const t=atob(o),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}class _l{constructor(){this.group=new ot,this.mesh=null,this.material=null,this.geometry=null,this.held=null,this.signature="",this.group.name="BlenderWeightOverlay"}apply(t,n,e){if(t===null||n===null||!n.isMesh||e===null)return this.clear(),this.signature="",null;const r=`${t.object}:${t.group}`;if(t.unchanged===!0){if(this.held?.key!==r)return this.clear(),`weights: the session sent a reference to ${r} that this overlay does not hold; the colours reappear on the next change to the mesh or the group`}else{if(t.weightsBase64===void 0||t.alertBase64===void 0)return this.clear(),`weights: ${r} carried neither an array nor a reference`;const d=Co(t.weightsBase64);this.held={key:r,weights:new Float32Array(d.buffer,d.byteOffset,t.count),alerts:Co(t.alertBase64)}}const a=this.held;if(a===null)return null;const i=`${r}:${t.digest}:${n.geometry.uuid}:${t.alertMode}:${e.elements.join(",")}`;if(i===this.signature&&this.mesh!==null)return null;this.signature=i,this.clear();const c=n.geometry.clone(),u=c.getAttribute("position"),f=c.getAttribute("blenderVertex");if(f===void 0)return c.dispose(),"weights: the presented geometry carries no per-vertex Blender index (`blenderVertex`), so the weights cannot be laid over it";const s=new Float32Array(u.count*3),l=new ht().setHex(ul,Mt);for(let d=0;d<u.count;d++){const m=f.getX(d),v=t.alertMode!=="NONE"&&a.alerts[m]===1?l:fl(a.weights[m]??0);s[d*3]=v.r,s[d*3+1]=v.g,s[d*3+2]=v.b}c.setAttribute("color",new it(s,3)),c.deleteAttribute("blenderVertex");const _=new bn({vertexColors:!0,polygonOffset:!0,polygonOffsetFactor:-1,polygonOffsetUnits:-1}),h=new Tt(c,_);return h.name=`${t.object}:weights`,h.frustumCulled=!1,h.matrixAutoUpdate=!1,h.matrix.copy(e),h.matrix.decompose(h.position,h.quaternion,h.scale),this.geometry=c,this.material=_,this.mesh=h,this.group.add(h),null}clear(){this.mesh&&this.group.remove(this.mesh),this.geometry?.dispose(),this.material?.dispose(),this.mesh=null,this.geometry=null,this.material=null}dispose(){this.clear(),this.held=null,this.signature=""}}const hn=S().finite(),ml=z($([hn,hn,hn,hn])).length(4),dl=20,ko=[16724818,9165824,2658559];function hl(o){const t=n=>Math.min(255,Math.max(0,Math.floor(.75*n+63.75)-60))/255;return new ht().setRGB(t(o>>16&255),t(o>>8&255),t(o&255),Mt)}function xe(){return new Be({vertexColors:!0,depthTest:!1,depthWrite:!1,transparent:!0,toneMapped:!1})}function pl(){const o=[],t=[],n=new ht(0,0,0),e=(a,i,c,u,f)=>{for(const s of[a,i]){const l=[0,0,0];l[c]=s*u,o.push(...l),t.push(f.r,f.g,f.b)}};for(let a=0;a<3;a++){const i=new ht().setHex(ko[a],Mt);e(1,.85,a,1,i),e(.85,.25,a,1,n),e(1,.85,a,-1,hl(ko[a])),e(.85,.25,a,-1,n)}const r=new fn;return r.setAttribute("position",new bt(o,3)),r.setAttribute("color",new bt(t,3)),new Ko(r,xe())}function vl(){const t=[],n=[],e=new ht(1,0,0),r=new ht(1,1,1);for(let i=0;i<12;i++){const c=(i+1)%2===0?r:e;for(const u of[i,i+1]){const f=2*Math.PI*u/12;t.push(.5*Math.cos(f),.5*Math.sin(f),0),n.push(c.r,c.g,c.b)}}const a=new fn;return a.setAttribute("position",new bt(t,3)),a.setAttribute("color",new bt(n,3)),new Ko(a,xe())}class gl{constructor(){this.group=new ot,this.anchor=new ot,this.lines=pl(),this.circle=vl(),this.seen=null,this.size=new $t,this.scratch=new x,this.parentQuat=new gt,this.group.name="BlenderCursor",this.present(!1),this.anchor.matrixAutoUpdate=!1,this.group.add(this.anchor,this.circle),this.anchor.add(this.lines);for(const t of[this.lines,this.circle])t.renderOrder=1001,t.frustumCulled=!1;this.lines.onBeforeRender=(t,n,e)=>this.fit(t,e),this.circle.onBeforeRender=(t,n,e)=>this.fit(t,e)}apply(t){if(t===void 0){this.present(!1);return}this.anchor.matrix.set(...t.flat()),this.anchor.updateMatrixWorld(!0),this.present(!0)}present(t){this.anchor.visible=t,this.circle.visible=t}show(t){const[n,e,r,a]=t.rotation;this.anchor.matrix.compose(new x(...t.location),new gt(e,r,a,n),new x(1,1,1)),this.anchor.updateMatrixWorld(!0),this.present(!0)}fit(t,n){this.seen={camera:n,canvas:t.domElement},t.getSize(this.size);const e=Math.max(this.size.y,1),r=this.scratch.setFromMatrixPosition(this.anchor.matrixWorld);let a;if(n.isOrthographicCamera){const c=n;a=(c.top-c.bottom)/c.zoom/e}else{const c=n;a=2*Math.max(-r.applyMatrix4(n.matrixWorldInverse).z,1e-6)*Math.tan(ut.degToRad(c.fov)/2)/c.zoom/e}const i=a*dl;this.lines.scale.setScalar(i),this.lines.updateMatrixWorld(!0),this.circle.position.setFromMatrixPosition(this.anchor.matrix),this.group.getWorldQuaternion(this.parentQuat).invert(),n.getWorldQuaternion(this.circle.quaternion).premultiply(this.parentQuat),this.circle.scale.setScalar(i),this.circle.updateMatrixWorld(!0)}placementAt(t,n,e,r,a){const i=this.seen;if(i===null||e!==i.canvas)return null;const c=i.canvas.getBoundingClientRect(),u=new $t((t-c.left)/Math.max(c.width,1)*2-1,-((n-c.top)/Math.max(c.height,1))*2+1),f=new je;f.setFromCamera(u,i.camera);const s=m=>{for(let p=m;p!==null;p=p.parent)if(!p.visible)return!1;return!0},l=f.intersectObject(r,!0).find(m=>m.object.isMesh&&a(m.object)&&s(m.object));let _=l?l.point.clone():null;if(_===null){const m=new x().setFromMatrixPosition(this.anchor.matrixWorld),p=i.camera.getWorldDirection(new x),v=i.camera.getWorldPosition(new x),g=m.clone().sub(v).dot(p);g<=0&&m.addScaledVector(p,-2*g+(g===0?1:0)),_=f.ray.intersectPlane(new It().setFromNormalAndCoplanarPoint(p,m),new x)}if(_===null)return null;r.updateWorldMatrix(!0,!1);const h=r.worldToLocal(_),d=r.getWorldQuaternion(new gt).invert().multiply(i.camera.getWorldQuaternion(new gt));return{location:[h.x,h.y,h.z],rotation:[d.w,d.x,d.y,d.z]}}dispose(){for(const t of[this.lines,this.circle])t.geometry.dispose(),t.material.dispose();this.seen=null}}const Rt=S().finite(),xl=P({display:W(["PLAIN_AXES","ARROWS","SINGLE_ARROW","CIRCLE","CUBE","SPHERE","CONE","IMAGE"]),size:Rt,image:P({name:E().nullable(),offset:$([Rt,Rt]),depth:W(["DEFAULT","FRONT","BACK"]),side:W(["DOUBLE_SIDED","FRONT","BACK"]),perspective:q(),orthographic:q(),axis_aligned:q(),opacity:Rt.nullable(),tint:$([Rt,Rt,Rt]).default([1,1,1]),premultiplied:q().default(!1)}).optional()}),wt={selected:15554304,active:16752680,camera:0,light:0,lightAlpha:80/255,empty:0},bl=1,K=(o,t,n)=>o.push(t[0],t[1],t[2],n[0],n[1],n[2]);function at(o,t){return Array.from({length:t},(n,e)=>{const r=2*Math.PI*e/t;return[o*Math.cos(r),o*Math.sin(r)]})}function ct(o,t,n=0,e=!1){const r=e?2:1;for(let a=0;a<Math.floor(t.length/r);a++){const i=t[a*r%t.length],c=t[(a*r+1)%t.length];K(o,[i[0],i[1],n],[c[0],c[1],n])}}function yl(o){if(!o.isMesh||o.userData.vgaiOverrideStandDown)return;o.userData.vgaiOverrideStandDown=!0;const t=o.onBeforeRender.bind(o),n=o.onAfterRender.bind(o),e=new X;let r=!1;o.onBeforeRender=(a,i,c,u,f,s)=>{t(a,i,c,u,f,s),i.overrideMaterial&&(e.copy(o.matrixWorld),o.matrixWorld.makeScale(0,0,0),r=!0)},o.onAfterRender=(a,i,c,u,f,s)=>{r&&(o.matrixWorld.copy(e),r=!1),n(a,i,c,u,f,s)}}class wl{constructor(){this.cameras=new ot,this.lights=new ot,this.empties=new ot,this.lineMaterials=new Map,this.drawn=new Map,this.fillMaterials=new Map,this.scratch=new x,this.size=new $t,this.parentQuat=new gt,this.cameras.name="BlenderCameras",this.lights.name="BlenderLights",this.empties.name="BlenderEmpties"}apply(t){const n=new Set;for(const e of t.objects){const r=e.selected?e.name===t.active?wt.active:wt.selected:e.type==="CAMERA"?wt.camera:e.type==="LIGHT"?wt.light:wt.empty,a=e.type==="CAMERA"&&e.name!==t.lookingThrough?t.cameras[e.name]:void 0,i=e.type==="LIGHT"&&e.light?t.lights[e.light]:void 0,c=e.type==="EMPTY"?t.empties[e.name]:void 0;if(!a&&!i&&!c)continue;n.add(e.name);const u=i&&e.light?t.lightDistances[e.light]??null:null,f=c?.image?.name?t.image(c.image.name):null,s=JSON.stringify([f?[f.texture.uuid,f.width,f.height]:null,e.matrix,r,a,i,u,c,a?[e.name===t.sceneCamera,t.renderAspect]:null]),l=this.drawn.get(e.name),_=t.presented(e.name);if(l?.key===s){for(const v of l.parts)v.userData.vgaiPicksAs=_;continue}l&&this.remove(l.parts);const h=new X().set(...e.matrix.flat()),d=a?this.cameras:i?this.lights:this.empties,m=new Set(d.children);a?this.camera(a,h,r,e.name===t.sceneCamera,t.renderAspect):i?this.light(i,h,r,u):c&&this.empty(c,h,r,f);const p=d.children.filter(v=>!m.has(v));for(const v of p)v.userData.vgaiPicksAs=_,v.traverse(yl);this.drawn.set(e.name,{key:s,parts:p})}for(const[e,r]of this.drawn)n.has(e)||(this.remove(r.parts),this.drawn.delete(e))}remove(t){for(const n of t)n.removeFromParent(),n.geometry?.dispose(),n.userData.vgaiOwnMaterial&&n.material.dispose()}camera(t,n,e,r,a){const i=t.display_size,u=(t.sensor_fit==="AUTO"?a>=1:t.sensor_fit==="HORIZONTAL")?[1,1/a]:[a,1];let f,s,l,_;if(t.type==="ORTHO")l=[.5*t.ortho_scale*u[0],.5*t.ortho_scale*u[1]],_=[t.shift_x*t.ortho_scale,t.shift_y*t.ortho_scale],s=-i,f=.5*t.ortho_scale;else{const A=.5*(t.sensor_fit==="VERTICAL"?t.sensor_height:t.sensor_width),O=new x().setFromMatrixScale(n);if(O.x===0||O.y===0||O.z===0)return;f=i/2/((1/O.x+1/O.y+1/O.z)/3),s=f*t.lens/-A,l=[f*u[0],f*u[1]],_=[t.shift_x*f*2,t.shift_y*f*2]}const h=[[_[0]+l[0],_[1]+l[1],s],[_[0]+l[0],_[1]-l[1],s],[_[0]-l[0],_[1]-l[1],s],[_[0]-l[0],_[1]+l[1],s]],d=[];for(let A=0;A<4;A++)K(d,h[A],h[(A+1)%4]),K(d,h[A],[0,0,0]);const m=.7*f,p=.1*f,v=_[1]+l[1]+p,g=[[_[0]-m,v,s],[_[0]+m,v,s],[_[0],v+m,s]],b=Cn(n);this.cameras.add(this.lines(d,e,1,b));let w;if(r){const A=new fn;A.setAttribute("position",new bt(g.flat(),3)),w=new Tt(A,this.fill(e)),w.matrixAutoUpdate=!1,w.matrix.copy(b)}else{const A=[];for(let O=0;O<3;O++)K(A,g[O],g[(O+1)%3]);w=this.lines(A,e,1,b)}const R=new x,T=w.onBeforeRender.bind(w);w.onBeforeRender=(A,O,M,C,V,H)=>{R.setFromMatrixPosition(b).applyMatrix4(this.cameras.matrixWorld);const Q=M.getWorldPosition(this.scratch).distanceToSquared(R)>1e-8;w.matrix.copy(b),Q||w.matrix.scale(new x(0,0,0)),w.updateMatrixWorld(!0),T(A,O,M,C,V,H)},this.cameras.add(w)}light(t,n,e,r){const a=new x().setFromMatrixPosition(n),i=[];K(i,[a.x,a.y,a.z],[a.x,a.y,0]),this.lights.add(this.lines(i,wt.light,wt.lightAlpha,new X));const c=[];ct(c,at(1.35,4)),this.lights.add(this.screen(c,wt.light,wt.lightAlpha,new x(a.x,a.y,0)));const u=[],f=9;if(ct(u,at(f*.3,4)),ct(u,at(f,16),0,!0),ct(u,at(f*1.33,20),0,!0),t.type==="SUN")for(const[_,h]of at(f,8))K(u,[_*1.6,h*1.6,0],[_*1.9,h*1.9,0]),K(u,[_*2.2,h*2.2,0],[_*2.5,h*2.5,0]);this.lights.add(this.screen(u,e,1,a));const s=Cn(n),l=[];if(t.type==="SUN")K(l,[0,0,0],[0,0,-20]);else if(t.type==="AREA"){const _=(t.size??1)/2,h=(t.shape==="RECTANGLE"||t.shape==="ELLIPSE"?t.size_y??t.size??1:t.size??1)/2;t.shape==="DISK"||t.shape==="ELLIPSE"?ct(l,at(1,32).map(([d,m])=>[d*_,m*h])):ct(l,[[_,h],[-_,h],[-_,-h],[_,-h]])}if(l.length>0&&this.lights.add(this.lines(l,e,1,n.clone())),r&&(t.type==="SPOT"||t.type==="AREA")){const _=new x(0,0,-1).transformDirection(n),h=v=>a.clone().addScaledVector(_,v),[d,m]=r,p=[];K(p,h(d).toArray(),h(m).toArray()),this.lights.add(this.lines(p,e,1,new X));for(const v of[d,m]){const g=[];ct(g,at(1.2,4)),this.lights.add(this.screen(g,e,1,h(v)))}}if(t.type==="SPOT"){const _=(t.spot_size??Math.PI/4)/2,h=Math.cos(_),d=t.spot_blend??.15,m=h*d-h-d,p=Math.sqrt((h*h-h*h*m*m)/(m*m-h*h*m*m)),v=Math.sqrt(1-h*h),g=Cn(n).multiply(new X().makeScale(10,10,10)),b=[];ct(b,at(v,32),-h),ct(b,at(v*p,32),-h),this.lights.add(this.lines(b,e,1,g.clone())),this.lights.add(this.silhouette(v,h,e,g))}if((t.type==="POINT"||t.type==="SPOT")&&(t.radius??0)>0){const _=[];ct(_,at(t.radius,32)),this.lights.add(this.facing(_,e,new x().setFromMatrixPosition(s)))}}empty(t,n,e,r){const a=t.size,i=[],c=(f,s)=>{const l=at(1,s);for(let _=0;_<s;_++){const[h,d]=l[_],[m,p]=l[(_+1)%s],v=(g,b)=>f==="xy"?[g,b,0]:f==="xz"?[g,0,b]:[0,g,b];K(i,v(h,d),v(m,p))}};switch(t.display){case"PLAIN_AXES":K(i,[0,-1,0],[0,1,0]),K(i,[-1,0,0],[1,0,0]),K(i,[0,0,-1],[0,0,1]);break;case"SINGLE_ARROW":{K(i,[0,0,0],[0,0,.75]);for(const[f,s]of[[.035,.035],[-.035,.035],[-.035,-.035],[.035,-.035]])K(i,[0,0,1],[f,s,.75]);ct(i,[[.035,.035],[-.035,.035],[-.035,-.035],[.035,-.035]],.75);break}case"CUBE":for(const[f,s]of Ol)K(i,$o[f],$o[s]);break;case"CIRCLE":c("xz",64);break;case"SPHERE":c("xy",32),c("xz",32),c("yz",32);break;case"CONE":{const f=at(1,8);for(let s=0;s<8;s++){const[l,_]=f[s],[h,d]=f[(s+1)%8];K(i,[l,0,_],[0,2,0]),K(i,[l,0,_],[h,0,d])}break}case"ARROWS":for(let f=0;f<3;f++){const s=[0,0,0];s[f]=1,K(i,[0,0,0],s)}break;case"IMAGE":this.imageEmpty(t,n,e,r);return}const u=n.clone().multiply(new X().makeScale(a,a,a));this.empties.add(this.lines(i,e,1,u)),t.display==="ARROWS"&&this.axisNames(n,a,e)}silhouette(t,n,e,r){const a=this.lines(new Array(192).fill(0),e,1,r);a.frustumCulled=!1;const i=a.geometry.getAttribute("instanceStart").data,c=at(1,32).map(([h,d])=>new x(h*t,d*t,-n)),u=new x,f=new X,s=new x,l=new x,_=new x;return this.onDraw(a,(h,d)=>{f.copy(a.matrixWorld).invert();const m=d.isOrthographicCamera;m?d.getWorldDirection(u).negate().transformDirection(f):u.setFromMatrixPosition(d.matrixWorld).applyMatrix4(f);const p=i.array;let v=!1;for(let g=0;g<32;g++){const b=c[g];s.crossVectors(b,c[(g+31)%32]),l.crossVectors(c[(g+1)%32],b),m?_.copy(u):_.copy(u).sub(b);const w=s.dot(_)>0!=l.dot(_)>0;(p[g*6+3]!==0||p[g*6+5]!==0)!==w&&(v=!0),p.set([0,0,0,w?b.x:0,w?b.y:0,w?b.z:0],g*6)}v&&(i.needsUpdate=!0,vt())}),a}imageEmpty(t,n,e,r){const a=t.image;if(!a)return;const i=r?.width??0,c=r?.height??0,u=i>0&&c>0?i>=c?[1,c/i]:[i/c,1]:[1,1],f=new x,s=new x,l=new x;n.extractBasis(f,s,l),f.multiplyScalar(u[0]*.5*t.size),s.multiplyScalar(u[1]*.5*t.size);const _=new x().setFromMatrixPosition(n).addScaledVector(f,a.offset[0]*2+1).addScaledVector(s,a.offset[1]*2+1),h=new X().makeBasis(f,s,l.clone()).setPosition(_),d=[];ct(d,[[-1,-1],[1,-1],[1,1],[-1,1]]);const m=this.lines(d,e,1,h),p=l.clone().normalize(),v=new x,g=new x,b=(M,C)=>{const V=M.isOrthographicCamera===!0;if(V?!a.orthographic:!a.perspective)return!1;if(!C)return!0;const H=p.clone().transformDirection(this.empties.matrixWorld);M.getWorldDirection(g);let Q,tt;if(V)Q=H.dot(g.clone().negate()),tt=1e-5;else{const pt=_.clone().applyMatrix4(this.empties.matrixWorld);Q=H.dot(v.setFromMatrixPosition(M.matrixWorld).sub(pt)),tt=0}return!(a.side==="FRONT"&&Q<tt||a.side==="BACK"&&Q>-tt||a.axis_aligned&&H.clone().projectOnPlane(g).lengthSq()>1e-5)},w=(M,C)=>{const V=M.onBeforeRender.bind(M);M.onBeforeRender=(H,Q,tt,pt,y,L)=>{M.matrix.copy(h),b(tt,C)||M.matrix.scale(new x(0,0,0)),M.updateMatrixWorld(!0),V(H,Q,tt,pt,y,L)}};if(w(m,!1),this.empties.add(m),!r||a.opacity!==null&&a.opacity<=0)return;const R=a.opacity!==null,T=a.depth==="BACK",A=new bn({map:r.texture,side:uo,transparent:R&&!T,opacity:a.opacity??1,alphaTest:R?0:.05,toneMapped:!1,depthTest:a.depth==="DEFAULT",depthWrite:a.depth==="DEFAULT"&&!R});A.color.setRGB(...a.tint,ft),R&&T&&(A.blending=Ue,A.blendSrc=We,A.blendDst=He),A.onBeforeCompile=M=>{const C=a.premultiplied?`if ( sampledDiffuseColor.a > 0.0 && sampledDiffuseColor.a < 1.0 ) sampledDiffuseColor.rgb /= sampledDiffuseColor.a;
7138
+ }`}),this.scene.clear(),this.scene.add(new Tt(this.geometry,this.material)),this.target.setSize(n.width,n.height);const _=t.getRenderTarget();try{t.setRenderTarget(this.target),t.render(this.scene,this.camera)}finally{t.setRenderTarget(_)}return this.target}dispose(){this.material?.dispose(),this.geometry.dispose(),this.target.dispose(),this.scene.clear()}}const sl=P({object:E(),group:E(),groupIndex:S().int().nonnegative(),count:S().int().nonnegative(),digest:E(),alertMode:W(["NONE","ACTIVE","ALL"]),unchanged:j(!0).optional(),weightsBase64:E().optional(),alertBase64:E().optional()}).strict();function fl(o){const n=o<0?0:o>1?1:o,e=(.5+.5*n)**1.5,[r,a,i]=cl(2/3*(1-n)),c=new ht;return c.setRGB((r*e)**(1/1.5),(a*e)**(1/1.5),(i*e)**(1/1.5),Mt),c}function cl(o){const t=(o%1+1)%1,n=Math.floor(t*6),e=t*6-n;switch(n%6){case 0:return[1,e,0];case 1:return[1-e,1,0];case 2:return[0,1,e];case 3:return[0,1-e,1];case 4:return[e,0,1];default:return[1,0,1-e]}}const ul=0;function Co(o){const t=atob(o),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}class _l{constructor(){this.group=new ot,this.mesh=null,this.material=null,this.geometry=null,this.held=null,this.signature="",this.group.name="BlenderWeightOverlay"}apply(t,n,e){if(t===null||n===null||!n.isMesh||e===null)return this.clear(),this.signature="",null;const r=`${t.object}:${t.group}`;if(t.unchanged===!0){if(this.held?.key!==r)return this.clear(),`weights: the session sent a reference to ${r} that this overlay does not hold; the colours reappear on the next change to the mesh or the group`}else{if(t.weightsBase64===void 0||t.alertBase64===void 0)return this.clear(),`weights: ${r} carried neither an array nor a reference`;const d=Co(t.weightsBase64);this.held={key:r,weights:new Float32Array(d.buffer,d.byteOffset,t.count),alerts:Co(t.alertBase64)}}const a=this.held;if(a===null)return null;const i=`${r}:${t.digest}:${n.geometry.uuid}:${t.alertMode}:${e.elements.join(",")}`;if(i===this.signature&&this.mesh!==null)return null;this.signature=i,this.clear();const c=n.geometry.clone(),u=c.getAttribute("position"),f=c.getAttribute("blenderVertex");if(f===void 0)return c.dispose(),"weights: the presented geometry carries no per-vertex Blender index (`blenderVertex`), so the weights cannot be laid over it";const s=new Float32Array(u.count*3),l=new ht().setHex(ul,Mt);for(let d=0;d<u.count;d++){const m=f.getX(d),v=t.alertMode!=="NONE"&&a.alerts[m]===1?l:fl(a.weights[m]??0);s[d*3]=v.r,s[d*3+1]=v.g,s[d*3+2]=v.b}c.setAttribute("color",new it(s,3)),c.deleteAttribute("blenderVertex");const _=new bn({vertexColors:!0,polygonOffset:!0,polygonOffsetFactor:-1,polygonOffsetUnits:-1}),h=new Tt(c,_);return h.name=`${t.object}:weights`,h.frustumCulled=!1,h.matrixAutoUpdate=!1,h.matrix.copy(e),h.matrix.decompose(h.position,h.quaternion,h.scale),this.geometry=c,this.material=_,this.mesh=h,this.group.add(h),null}clear(){this.mesh&&this.group.remove(this.mesh),this.geometry?.dispose(),this.material?.dispose(),this.mesh=null,this.geometry=null,this.material=null}dispose(){this.clear(),this.held=null,this.signature=""}}const hn=S().finite(),ml=z($([hn,hn,hn,hn])).length(4),dl=20,ko=[16724818,9165824,2658559];function hl(o){const t=n=>Math.min(255,Math.max(0,Math.floor(.75*n+63.75)-60))/255;return new ht().setRGB(t(o>>16&255),t(o>>8&255),t(o&255),Mt)}function xe(){return new Be({vertexColors:!0,depthTest:!1,depthWrite:!1,transparent:!0,toneMapped:!1})}function pl(){const o=[],t=[],n=new ht(0,0,0),e=(a,i,c,u,f)=>{for(const s of[a,i]){const l=[0,0,0];l[c]=s*u,o.push(...l),t.push(f.r,f.g,f.b)}};for(let a=0;a<3;a++){const i=new ht().setHex(ko[a],Mt);e(1,.85,a,1,i),e(.85,.25,a,1,n),e(1,.85,a,-1,hl(ko[a])),e(.85,.25,a,-1,n)}const r=new fn;return r.setAttribute("position",new bt(o,3)),r.setAttribute("color",new bt(t,3)),new Ko(r,xe())}function vl(){const t=[],n=[],e=new ht(1,0,0),r=new ht(1,1,1);for(let i=0;i<12;i++){const c=(i+1)%2===0?r:e;for(const u of[i,i+1]){const f=2*Math.PI*u/12;t.push(.5*Math.cos(f),.5*Math.sin(f),0),n.push(c.r,c.g,c.b)}}const a=new fn;return a.setAttribute("position",new bt(t,3)),a.setAttribute("color",new bt(n,3)),new Ko(a,xe())}class gl{constructor(){this.group=new ot,this.anchor=new ot,this.lines=pl(),this.circle=vl(),this.seen=null,this.size=new $t,this.scratch=new x,this.parentQuat=new gt,this.group.name="BlenderCursor",this.present(!1),this.anchor.matrixAutoUpdate=!1,this.group.add(this.anchor,this.circle),this.anchor.add(this.lines);for(const t of[this.lines,this.circle])t.renderOrder=1001,t.frustumCulled=!1;this.lines.onBeforeRender=(t,n,e)=>this.fit(t,e),this.circle.onBeforeRender=(t,n,e)=>this.fit(t,e)}apply(t){if(t===void 0){this.present(!1);return}this.anchor.matrix.set(...t.flat()),this.anchor.updateMatrixWorld(!0),this.present(!0)}present(t){this.anchor.visible=t,this.circle.visible=t}show(t){const[n,e,r,a]=t.rotation;this.anchor.matrix.compose(new x(...t.location),new gt(e,r,a,n),new x(1,1,1)),this.anchor.updateMatrixWorld(!0),this.present(!0)}fit(t,n){this.seen={camera:n,canvas:t.domElement},t.getSize(this.size);const e=Math.max(this.size.y,1),r=this.scratch.setFromMatrixPosition(this.anchor.matrixWorld);let a;if(n.isOrthographicCamera){const c=n;a=(c.top-c.bottom)/c.zoom/e}else{const c=n;a=2*Math.max(-r.applyMatrix4(n.matrixWorldInverse).z,1e-6)*Math.tan(ut.degToRad(c.fov)/2)/c.zoom/e}const i=a*dl;this.lines.scale.setScalar(i),this.lines.updateMatrixWorld(!0),this.circle.position.setFromMatrixPosition(this.anchor.matrix),this.group.getWorldQuaternion(this.parentQuat).invert(),n.getWorldQuaternion(this.circle.quaternion).premultiply(this.parentQuat),this.circle.scale.setScalar(i),this.circle.updateMatrixWorld(!0)}placementAt(t,n,e,r,a){const i=this.seen;if(i===null||e!==i.canvas)return null;const c=i.canvas.getBoundingClientRect(),u=new $t((t-c.left)/Math.max(c.width,1)*2-1,-((n-c.top)/Math.max(c.height,1))*2+1),f=new je;f.setFromCamera(u,i.camera);const s=m=>{for(let p=m;p!==null;p=p.parent)if(!p.visible)return!1;return!0},l=f.intersectObject(r,!0).find(m=>m.object.isMesh&&a(m.object)&&s(m.object));let _=l?l.point.clone():null;if(_===null){const m=new x().setFromMatrixPosition(this.anchor.matrixWorld),p=i.camera.getWorldDirection(new x),v=i.camera.getWorldPosition(new x),g=m.clone().sub(v).dot(p);g<=0&&m.addScaledVector(p,-2*g+(g===0?1:0)),_=f.ray.intersectPlane(new It().setFromNormalAndCoplanarPoint(p,m),new x)}if(_===null)return null;r.updateWorldMatrix(!0,!1);const h=r.worldToLocal(_),d=r.getWorldQuaternion(new gt).invert().multiply(i.camera.getWorldQuaternion(new gt));return{location:[h.x,h.y,h.z],rotation:[d.w,d.x,d.y,d.z]}}dispose(){for(const t of[this.lines,this.circle])t.geometry.dispose(),t.material.dispose();this.seen=null}}const Rt=S().finite(),xl=P({display:W(["PLAIN_AXES","ARROWS","SINGLE_ARROW","CIRCLE","CUBE","SPHERE","CONE","IMAGE"]),size:Rt,image:P({name:E().nullable(),offset:$([Rt,Rt]),depth:W(["DEFAULT","FRONT","BACK"]),side:W(["DOUBLE_SIDED","FRONT","BACK"]),perspective:q(),orthographic:q(),axis_aligned:q(),opacity:Rt.nullable(),tint:$([Rt,Rt,Rt]).default([1,1,1]),premultiplied:q().default(!1)}).optional()}),wt={selected:15554304,active:16752680,camera:0,light:0,lightAlpha:80/255,empty:0},bl=1,K=(o,t,n)=>o.push(t[0],t[1],t[2],n[0],n[1],n[2]);function at(o,t){return Array.from({length:t},(n,e)=>{const r=2*Math.PI*e/t;return[o*Math.cos(r),o*Math.sin(r)]})}function ct(o,t,n=0,e=!1){const r=e?2:1;for(let a=0;a<Math.floor(t.length/r);a++){const i=t[a*r%t.length],c=t[(a*r+1)%t.length];K(o,[i[0],i[1],n],[c[0],c[1],n])}}function yl(o){if(!o.isMesh||o.userData.volterOverrideStandDown)return;o.userData.volterOverrideStandDown=!0;const t=o.onBeforeRender.bind(o),n=o.onAfterRender.bind(o),e=new X;let r=!1;o.onBeforeRender=(a,i,c,u,f,s)=>{t(a,i,c,u,f,s),i.overrideMaterial&&(e.copy(o.matrixWorld),o.matrixWorld.makeScale(0,0,0),r=!0)},o.onAfterRender=(a,i,c,u,f,s)=>{r&&(o.matrixWorld.copy(e),r=!1),n(a,i,c,u,f,s)}}class wl{constructor(){this.cameras=new ot,this.lights=new ot,this.empties=new ot,this.lineMaterials=new Map,this.drawn=new Map,this.fillMaterials=new Map,this.scratch=new x,this.size=new $t,this.parentQuat=new gt,this.cameras.name="BlenderCameras",this.lights.name="BlenderLights",this.empties.name="BlenderEmpties"}apply(t){const n=new Set;for(const e of t.objects){const r=e.selected?e.name===t.active?wt.active:wt.selected:e.type==="CAMERA"?wt.camera:e.type==="LIGHT"?wt.light:wt.empty,a=e.type==="CAMERA"&&e.name!==t.lookingThrough?t.cameras[e.name]:void 0,i=e.type==="LIGHT"&&e.light?t.lights[e.light]:void 0,c=e.type==="EMPTY"?t.empties[e.name]:void 0;if(!a&&!i&&!c)continue;n.add(e.name);const u=i&&e.light?t.lightDistances[e.light]??null:null,f=c?.image?.name?t.image(c.image.name):null,s=JSON.stringify([f?[f.texture.uuid,f.width,f.height]:null,e.matrix,r,a,i,u,c,a?[e.name===t.sceneCamera,t.renderAspect]:null]),l=this.drawn.get(e.name),_=t.presented(e.name);if(l?.key===s){for(const v of l.parts)v.userData.volterPicksAs=_;continue}l&&this.remove(l.parts);const h=new X().set(...e.matrix.flat()),d=a?this.cameras:i?this.lights:this.empties,m=new Set(d.children);a?this.camera(a,h,r,e.name===t.sceneCamera,t.renderAspect):i?this.light(i,h,r,u):c&&this.empty(c,h,r,f);const p=d.children.filter(v=>!m.has(v));for(const v of p)v.userData.volterPicksAs=_,v.traverse(yl);this.drawn.set(e.name,{key:s,parts:p})}for(const[e,r]of this.drawn)n.has(e)||(this.remove(r.parts),this.drawn.delete(e))}remove(t){for(const n of t)n.removeFromParent(),n.geometry?.dispose(),n.userData.volterOwnMaterial&&n.material.dispose()}camera(t,n,e,r,a){const i=t.display_size,u=(t.sensor_fit==="AUTO"?a>=1:t.sensor_fit==="HORIZONTAL")?[1,1/a]:[a,1];let f,s,l,_;if(t.type==="ORTHO")l=[.5*t.ortho_scale*u[0],.5*t.ortho_scale*u[1]],_=[t.shift_x*t.ortho_scale,t.shift_y*t.ortho_scale],s=-i,f=.5*t.ortho_scale;else{const A=.5*(t.sensor_fit==="VERTICAL"?t.sensor_height:t.sensor_width),O=new x().setFromMatrixScale(n);if(O.x===0||O.y===0||O.z===0)return;f=i/2/((1/O.x+1/O.y+1/O.z)/3),s=f*t.lens/-A,l=[f*u[0],f*u[1]],_=[t.shift_x*f*2,t.shift_y*f*2]}const h=[[_[0]+l[0],_[1]+l[1],s],[_[0]+l[0],_[1]-l[1],s],[_[0]-l[0],_[1]-l[1],s],[_[0]-l[0],_[1]+l[1],s]],d=[];for(let A=0;A<4;A++)K(d,h[A],h[(A+1)%4]),K(d,h[A],[0,0,0]);const m=.7*f,p=.1*f,v=_[1]+l[1]+p,g=[[_[0]-m,v,s],[_[0]+m,v,s],[_[0],v+m,s]],b=Cn(n);this.cameras.add(this.lines(d,e,1,b));let w;if(r){const A=new fn;A.setAttribute("position",new bt(g.flat(),3)),w=new Tt(A,this.fill(e)),w.matrixAutoUpdate=!1,w.matrix.copy(b)}else{const A=[];for(let O=0;O<3;O++)K(A,g[O],g[(O+1)%3]);w=this.lines(A,e,1,b)}const R=new x,T=w.onBeforeRender.bind(w);w.onBeforeRender=(A,O,M,C,V,H)=>{R.setFromMatrixPosition(b).applyMatrix4(this.cameras.matrixWorld);const Q=M.getWorldPosition(this.scratch).distanceToSquared(R)>1e-8;w.matrix.copy(b),Q||w.matrix.scale(new x(0,0,0)),w.updateMatrixWorld(!0),T(A,O,M,C,V,H)},this.cameras.add(w)}light(t,n,e,r){const a=new x().setFromMatrixPosition(n),i=[];K(i,[a.x,a.y,a.z],[a.x,a.y,0]),this.lights.add(this.lines(i,wt.light,wt.lightAlpha,new X));const c=[];ct(c,at(1.35,4)),this.lights.add(this.screen(c,wt.light,wt.lightAlpha,new x(a.x,a.y,0)));const u=[],f=9;if(ct(u,at(f*.3,4)),ct(u,at(f,16),0,!0),ct(u,at(f*1.33,20),0,!0),t.type==="SUN")for(const[_,h]of at(f,8))K(u,[_*1.6,h*1.6,0],[_*1.9,h*1.9,0]),K(u,[_*2.2,h*2.2,0],[_*2.5,h*2.5,0]);this.lights.add(this.screen(u,e,1,a));const s=Cn(n),l=[];if(t.type==="SUN")K(l,[0,0,0],[0,0,-20]);else if(t.type==="AREA"){const _=(t.size??1)/2,h=(t.shape==="RECTANGLE"||t.shape==="ELLIPSE"?t.size_y??t.size??1:t.size??1)/2;t.shape==="DISK"||t.shape==="ELLIPSE"?ct(l,at(1,32).map(([d,m])=>[d*_,m*h])):ct(l,[[_,h],[-_,h],[-_,-h],[_,-h]])}if(l.length>0&&this.lights.add(this.lines(l,e,1,n.clone())),r&&(t.type==="SPOT"||t.type==="AREA")){const _=new x(0,0,-1).transformDirection(n),h=v=>a.clone().addScaledVector(_,v),[d,m]=r,p=[];K(p,h(d).toArray(),h(m).toArray()),this.lights.add(this.lines(p,e,1,new X));for(const v of[d,m]){const g=[];ct(g,at(1.2,4)),this.lights.add(this.screen(g,e,1,h(v)))}}if(t.type==="SPOT"){const _=(t.spot_size??Math.PI/4)/2,h=Math.cos(_),d=t.spot_blend??.15,m=h*d-h-d,p=Math.sqrt((h*h-h*h*m*m)/(m*m-h*h*m*m)),v=Math.sqrt(1-h*h),g=Cn(n).multiply(new X().makeScale(10,10,10)),b=[];ct(b,at(v,32),-h),ct(b,at(v*p,32),-h),this.lights.add(this.lines(b,e,1,g.clone())),this.lights.add(this.silhouette(v,h,e,g))}if((t.type==="POINT"||t.type==="SPOT")&&(t.radius??0)>0){const _=[];ct(_,at(t.radius,32)),this.lights.add(this.facing(_,e,new x().setFromMatrixPosition(s)))}}empty(t,n,e,r){const a=t.size,i=[],c=(f,s)=>{const l=at(1,s);for(let _=0;_<s;_++){const[h,d]=l[_],[m,p]=l[(_+1)%s],v=(g,b)=>f==="xy"?[g,b,0]:f==="xz"?[g,0,b]:[0,g,b];K(i,v(h,d),v(m,p))}};switch(t.display){case"PLAIN_AXES":K(i,[0,-1,0],[0,1,0]),K(i,[-1,0,0],[1,0,0]),K(i,[0,0,-1],[0,0,1]);break;case"SINGLE_ARROW":{K(i,[0,0,0],[0,0,.75]);for(const[f,s]of[[.035,.035],[-.035,.035],[-.035,-.035],[.035,-.035]])K(i,[0,0,1],[f,s,.75]);ct(i,[[.035,.035],[-.035,.035],[-.035,-.035],[.035,-.035]],.75);break}case"CUBE":for(const[f,s]of Ol)K(i,$o[f],$o[s]);break;case"CIRCLE":c("xz",64);break;case"SPHERE":c("xy",32),c("xz",32),c("yz",32);break;case"CONE":{const f=at(1,8);for(let s=0;s<8;s++){const[l,_]=f[s],[h,d]=f[(s+1)%8];K(i,[l,0,_],[0,2,0]),K(i,[l,0,_],[h,0,d])}break}case"ARROWS":for(let f=0;f<3;f++){const s=[0,0,0];s[f]=1,K(i,[0,0,0],s)}break;case"IMAGE":this.imageEmpty(t,n,e,r);return}const u=n.clone().multiply(new X().makeScale(a,a,a));this.empties.add(this.lines(i,e,1,u)),t.display==="ARROWS"&&this.axisNames(n,a,e)}silhouette(t,n,e,r){const a=this.lines(new Array(192).fill(0),e,1,r);a.frustumCulled=!1;const i=a.geometry.getAttribute("instanceStart").data,c=at(1,32).map(([h,d])=>new x(h*t,d*t,-n)),u=new x,f=new X,s=new x,l=new x,_=new x;return this.onDraw(a,(h,d)=>{f.copy(a.matrixWorld).invert();const m=d.isOrthographicCamera;m?d.getWorldDirection(u).negate().transformDirection(f):u.setFromMatrixPosition(d.matrixWorld).applyMatrix4(f);const p=i.array;let v=!1;for(let g=0;g<32;g++){const b=c[g];s.crossVectors(b,c[(g+31)%32]),l.crossVectors(c[(g+1)%32],b),m?_.copy(u):_.copy(u).sub(b);const w=s.dot(_)>0!=l.dot(_)>0;(p[g*6+3]!==0||p[g*6+5]!==0)!==w&&(v=!0),p.set([0,0,0,w?b.x:0,w?b.y:0,w?b.z:0],g*6)}v&&(i.needsUpdate=!0,vt())}),a}imageEmpty(t,n,e,r){const a=t.image;if(!a)return;const i=r?.width??0,c=r?.height??0,u=i>0&&c>0?i>=c?[1,c/i]:[i/c,1]:[1,1],f=new x,s=new x,l=new x;n.extractBasis(f,s,l),f.multiplyScalar(u[0]*.5*t.size),s.multiplyScalar(u[1]*.5*t.size);const _=new x().setFromMatrixPosition(n).addScaledVector(f,a.offset[0]*2+1).addScaledVector(s,a.offset[1]*2+1),h=new X().makeBasis(f,s,l.clone()).setPosition(_),d=[];ct(d,[[-1,-1],[1,-1],[1,1],[-1,1]]);const m=this.lines(d,e,1,h),p=l.clone().normalize(),v=new x,g=new x,b=(M,C)=>{const V=M.isOrthographicCamera===!0;if(V?!a.orthographic:!a.perspective)return!1;if(!C)return!0;const H=p.clone().transformDirection(this.empties.matrixWorld);M.getWorldDirection(g);let Q,tt;if(V)Q=H.dot(g.clone().negate()),tt=1e-5;else{const pt=_.clone().applyMatrix4(this.empties.matrixWorld);Q=H.dot(v.setFromMatrixPosition(M.matrixWorld).sub(pt)),tt=0}return!(a.side==="FRONT"&&Q<tt||a.side==="BACK"&&Q>-tt||a.axis_aligned&&H.clone().projectOnPlane(g).lengthSq()>1e-5)},w=(M,C)=>{const V=M.onBeforeRender.bind(M);M.onBeforeRender=(H,Q,tt,pt,y,L)=>{M.matrix.copy(h),b(tt,C)||M.matrix.scale(new x(0,0,0)),M.updateMatrixWorld(!0),V(H,Q,tt,pt,y,L)}};if(w(m,!1),this.empties.add(m),!r||a.opacity!==null&&a.opacity<=0)return;const R=a.opacity!==null,T=a.depth==="BACK",A=new bn({map:r.texture,side:uo,transparent:R&&!T,opacity:a.opacity??1,alphaTest:R?0:.05,toneMapped:!1,depthTest:a.depth==="DEFAULT",depthWrite:a.depth==="DEFAULT"&&!R});A.color.setRGB(...a.tint,ft),R&&T&&(A.blending=Ue,A.blendSrc=We,A.blendDst=He),A.onBeforeCompile=M=>{const C=a.premultiplied?`if ( sampledDiffuseColor.a > 0.0 && sampledDiffuseColor.a < 1.0 ) sampledDiffuseColor.rgb /= sampledDiffuseColor.a;
7139
7139
  `:"";M.fragmentShader=M.fragmentShader.replace("#include <map_fragment>",`vec4 sampledDiffuseColor = texture2D( map, vMapUv );
7140
7140
  ${C}diffuseColor *= sampledDiffuseColor;`).replace("#include <alphatest_fragment>",R?"#include <alphatest_fragment>":`#include <alphatest_fragment>
7141
- diffuseColor.a = 1.0;`)},A.customProgramCacheKey=()=>`vgai-blender-image:${a.premultiplied}:${R}`;const O=new Tt(new Qo(2,2),A);O.matrixAutoUpdate=!1,O.matrix.copy(h),O.renderOrder=a.depth==="FRONT"?1e3:a.depth==="BACK"?-1e3:0,O.userData.vgaiOwnMaterial=!0,w(O,!0),this.empties.add(O)}axisNames(t,n,e){const r=[new x,new x,new x];t.extractBasis(r[0],r[1],r[2]);for(let a=0;a<3;a++){const i=r[a].length()*n,c=new x(0,0,0);c.setComponent(a,1.25*n),c.applyMatrix4(t);const u=new x(0,0,0);u.setComponent(a,n),u.applyMatrix4(t);const f=[];for(let _=1;_<=6;_++)ct(f,at(.007*(4*_/6)*i,4));this.empties.add(this.facing(f,e,u));const s=Tl[a],l=[];for(let _=0;_+1<s.length;_+=2){const[h,d]=s[_],[m,p]=s[_+1];K(l,[h*4*i,d*4*i,0],[m*4*i,p*4*i,0])}this.empties.add(this.facing(l,e,c))}}material(t,n){const e=`${t}:${n}`;let r=this.lineMaterials.get(e);return r||(r=new Wo({color:t,linewidth:bl,transparent:n<1,opacity:n,depthTest:!0,depthWrite:n>=1,toneMapped:!1}),this.lineMaterials.set(e,r)),r}fill(t){let n=this.fillMaterials.get(t);return n||(n=new bn({color:t,side:uo,toneMapped:!1}),this.fillMaterials.set(t,n)),n}lines(t,n,e,r){const a=new Uo().setPositions(t),i=new Ho(a,this.material(n,e));return i.matrixAutoUpdate=!1,i.matrix.copy(r),i.computeLineDistances(),i}screen(t,n,e,r){const a=this.lines(t,n,e,new X);return a.matrixAutoUpdate=!0,a.position.copy(r),a.scale.setScalar(0),a.frustumCulled=!1,this.onDraw(a,(i,c)=>this.face(a,i,c,!0)),a}facing(t,n,e){const r=this.lines(t,n,1,new X);return r.matrixAutoUpdate=!0,r.position.copy(e),this.onDraw(r,(a,i)=>this.face(r,a,i,!1)),r}onDraw(t,n){const e=t,r=e.onBeforeRender.bind(e);e.onBeforeRender=(a,i,c,u,f,s)=>{n(a,c),r(a,i,c,u,f,s)}}face(t,n,e,r){t.parent?.getWorldQuaternion(this.parentQuat).invert(),e.getWorldQuaternion(t.quaternion).premultiply(this.parentQuat);let a=1;if(r){n.getSize(this.size);const i=Math.max(this.size.y,1),c=this.scratch.setFromMatrixPosition(t.matrixWorld);if(e.isOrthographicCamera){const u=e;a=(u.top-u.bottom)/u.zoom/i}else{const u=e;a=2*Math.max(-c.applyMatrix4(e.matrixWorldInverse).z,1e-6)*Math.tan(ut.degToRad(u.fov)/2)/u.zoom/i}}t.scale.setScalar(a),t.updateMatrixWorld(!0)}dispose(){for(const t of this.drawn.values())this.remove(t.parts);this.drawn.clear();for(const t of this.lineMaterials.values())t.dispose();for(const t of this.fillMaterials.values())t.dispose();this.lineMaterials.clear(),this.fillMaterials.clear()}}function Cn(o){const t=new x,n=new gt;return o.decompose(t,n,new x),new X().compose(t,n,new x(1,1,1))}const $o=[[-1,-1,-1],[1,-1,-1],[1,1,-1],[-1,1,-1],[-1,-1,1],[1,-1,1],[1,1,1],[-1,1,1]],Ol=[[0,1],[1,2],[2,3],[3,0],[4,5],[5,6],[6,7],[7,4],[0,4],[1,5],[2,6],[3,7]],Tl=[[[.9,1],[-1,-1],[-.9,1],[1,-1]].map(([o,t])=>[o*.0215,t*.025]),[[-1,1],[0,-.1],[1,1],[0,-.1],[0,-.1],[0,-1]].map(([o,t])=>[o*.0175,t*.025]),[[-.95,1],[.95,1],[.95,1],[.95,.9],[.95,.9],[-1,-.9],[-1,-.9],[-1,-1],[-1,-1],[1,-1]].map(([o,t])=>[o*.02,t*.025])],rt=S().finite(),Lo=P({name:E(),type:E(),lens:rt,sensor_width:rt,sensor_height:rt,sensor_fit:W(["AUTO","HORIZONTAL","VERTICAL"]),ortho_scale:rt,clip_start:rt,clip_end:rt,shift_x:rt,shift_y:rt,matrix:z($([rt,rt,rt,rt])).length(4),passepartout:rt.default(0),display_size:rt.default(1)}),Pl={opening:.5,min:.1657359312880715,max:44.98528137423857},pn={passepartout:"#000000",back:"#3d3d3d",overlay:"#000000",redalert:"#991616"};function Al(o,t,n,e){const r=a=>Math.min(1,Math.max(-1,a));return[r(o[0]-n/(2*t)),r(o[1]+e/(2*t))]}function Vo(o,t,n,e){const r=o.type==="ORTHO",a=o.sensor_fit==="VERTICAL"?o.sensor_height:o.sensor_width,i=o.sensor_fit==="AUTO"?t>=n:o.sensor_fit==="HORIZONTAL",c=(r?o.ortho_scale:a/o.lens)/2*e;return i?[c,c*n/t]:[c*t/n,c]}function Sl(o,t,n,e,r,a){const i=Math.max(n.width,1),c=Math.max(n.height,1),[u,f]=Vo(o,i,c,1/e),[s,l]=Vo(o,a,1,1),h=2*((o.sensor_fit==="AUTO"?a>=1:o.sensor_fit==="HORIZONTAL")?s:l),d=s/u,m=l/f,p=-2*r[0]*e,v=2*r[1]*e,g=o.shift_x*h-p*2*u,b=o.shift_y*h+v*2*f,w=new X().set(...o.matrix.flat()).premultiply(t),R=new x,T=new gt;return w.decompose(R,T,new x),{name:o.name,position:R.toArray(),quaternion:[T.x,T.y,T.z,T.w],projection:o.type==="ORTHO"?"orthographic":"perspective",window:{left:g-u,right:g+u,top:b+f,bottom:b-f},near:o.clip_start,far:o.clip_end,frame:{left:.5-d/2+p,top:.5-m/2+v,width:d,height:m},passepartout:{color:pn.passepartout,opacity:o.passepartout},border:{solid:pn.back,dashed:pn.overlay,locked:pn.redalert}}}const El={color:[.8,.8,.8,1],roughness:.5,metallic:0},Ml=`
7141
+ diffuseColor.a = 1.0;`)},A.customProgramCacheKey=()=>`volter-blender-image:${a.premultiplied}:${R}`;const O=new Tt(new Qo(2,2),A);O.matrixAutoUpdate=!1,O.matrix.copy(h),O.renderOrder=a.depth==="FRONT"?1e3:a.depth==="BACK"?-1e3:0,O.userData.volterOwnMaterial=!0,w(O,!0),this.empties.add(O)}axisNames(t,n,e){const r=[new x,new x,new x];t.extractBasis(r[0],r[1],r[2]);for(let a=0;a<3;a++){const i=r[a].length()*n,c=new x(0,0,0);c.setComponent(a,1.25*n),c.applyMatrix4(t);const u=new x(0,0,0);u.setComponent(a,n),u.applyMatrix4(t);const f=[];for(let _=1;_<=6;_++)ct(f,at(.007*(4*_/6)*i,4));this.empties.add(this.facing(f,e,u));const s=Tl[a],l=[];for(let _=0;_+1<s.length;_+=2){const[h,d]=s[_],[m,p]=s[_+1];K(l,[h*4*i,d*4*i,0],[m*4*i,p*4*i,0])}this.empties.add(this.facing(l,e,c))}}material(t,n){const e=`${t}:${n}`;let r=this.lineMaterials.get(e);return r||(r=new Wo({color:t,linewidth:bl,transparent:n<1,opacity:n,depthTest:!0,depthWrite:n>=1,toneMapped:!1}),this.lineMaterials.set(e,r)),r}fill(t){let n=this.fillMaterials.get(t);return n||(n=new bn({color:t,side:uo,toneMapped:!1}),this.fillMaterials.set(t,n)),n}lines(t,n,e,r){const a=new Uo().setPositions(t),i=new Ho(a,this.material(n,e));return i.matrixAutoUpdate=!1,i.matrix.copy(r),i.computeLineDistances(),i}screen(t,n,e,r){const a=this.lines(t,n,e,new X);return a.matrixAutoUpdate=!0,a.position.copy(r),a.scale.setScalar(0),a.frustumCulled=!1,this.onDraw(a,(i,c)=>this.face(a,i,c,!0)),a}facing(t,n,e){const r=this.lines(t,n,1,new X);return r.matrixAutoUpdate=!0,r.position.copy(e),this.onDraw(r,(a,i)=>this.face(r,a,i,!1)),r}onDraw(t,n){const e=t,r=e.onBeforeRender.bind(e);e.onBeforeRender=(a,i,c,u,f,s)=>{n(a,c),r(a,i,c,u,f,s)}}face(t,n,e,r){t.parent?.getWorldQuaternion(this.parentQuat).invert(),e.getWorldQuaternion(t.quaternion).premultiply(this.parentQuat);let a=1;if(r){n.getSize(this.size);const i=Math.max(this.size.y,1),c=this.scratch.setFromMatrixPosition(t.matrixWorld);if(e.isOrthographicCamera){const u=e;a=(u.top-u.bottom)/u.zoom/i}else{const u=e;a=2*Math.max(-c.applyMatrix4(e.matrixWorldInverse).z,1e-6)*Math.tan(ut.degToRad(u.fov)/2)/u.zoom/i}}t.scale.setScalar(a),t.updateMatrixWorld(!0)}dispose(){for(const t of this.drawn.values())this.remove(t.parts);this.drawn.clear();for(const t of this.lineMaterials.values())t.dispose();for(const t of this.fillMaterials.values())t.dispose();this.lineMaterials.clear(),this.fillMaterials.clear()}}function Cn(o){const t=new x,n=new gt;return o.decompose(t,n,new x),new X().compose(t,n,new x(1,1,1))}const $o=[[-1,-1,-1],[1,-1,-1],[1,1,-1],[-1,1,-1],[-1,-1,1],[1,-1,1],[1,1,1],[-1,1,1]],Ol=[[0,1],[1,2],[2,3],[3,0],[4,5],[5,6],[6,7],[7,4],[0,4],[1,5],[2,6],[3,7]],Tl=[[[.9,1],[-1,-1],[-.9,1],[1,-1]].map(([o,t])=>[o*.0215,t*.025]),[[-1,1],[0,-.1],[1,1],[0,-.1],[0,-.1],[0,-1]].map(([o,t])=>[o*.0175,t*.025]),[[-.95,1],[.95,1],[.95,1],[.95,.9],[.95,.9],[-1,-.9],[-1,-.9],[-1,-1],[-1,-1],[1,-1]].map(([o,t])=>[o*.02,t*.025])],rt=S().finite(),Lo=P({name:E(),type:E(),lens:rt,sensor_width:rt,sensor_height:rt,sensor_fit:W(["AUTO","HORIZONTAL","VERTICAL"]),ortho_scale:rt,clip_start:rt,clip_end:rt,shift_x:rt,shift_y:rt,matrix:z($([rt,rt,rt,rt])).length(4),passepartout:rt.default(0),display_size:rt.default(1)}),Pl={opening:.5,min:.1657359312880715,max:44.98528137423857},pn={passepartout:"#000000",back:"#3d3d3d",overlay:"#000000",redalert:"#991616"};function Al(o,t,n,e){const r=a=>Math.min(1,Math.max(-1,a));return[r(o[0]-n/(2*t)),r(o[1]+e/(2*t))]}function Vo(o,t,n,e){const r=o.type==="ORTHO",a=o.sensor_fit==="VERTICAL"?o.sensor_height:o.sensor_width,i=o.sensor_fit==="AUTO"?t>=n:o.sensor_fit==="HORIZONTAL",c=(r?o.ortho_scale:a/o.lens)/2*e;return i?[c,c*n/t]:[c*t/n,c]}function Sl(o,t,n,e,r,a){const i=Math.max(n.width,1),c=Math.max(n.height,1),[u,f]=Vo(o,i,c,1/e),[s,l]=Vo(o,a,1,1),h=2*((o.sensor_fit==="AUTO"?a>=1:o.sensor_fit==="HORIZONTAL")?s:l),d=s/u,m=l/f,p=-2*r[0]*e,v=2*r[1]*e,g=o.shift_x*h-p*2*u,b=o.shift_y*h+v*2*f,w=new X().set(...o.matrix.flat()).premultiply(t),R=new x,T=new gt;return w.decompose(R,T,new x),{name:o.name,position:R.toArray(),quaternion:[T.x,T.y,T.z,T.w],projection:o.type==="ORTHO"?"orthographic":"perspective",window:{left:g-u,right:g+u,top:b+f,bottom:b-f},near:o.clip_start,far:o.clip_end,frame:{left:.5-d/2+p,top:.5-m/2+v,width:d,height:m},passepartout:{color:pn.passepartout,opacity:o.passepartout},border:{solid:pn.back,dashed:pn.overlay,locked:pn.redalert}}}const El={color:[.8,.8,.8,1],roughness:.5,metallic:0},Ml=`
7142
7142
  uniform vec3 wbDir[4];
7143
7143
  uniform vec3 wbDiffuse[4];
7144
7144
  uniform vec3 wbSpecular[4];
@@ -7151,7 +7151,7 @@ vec4 wbWrapped(vec4 NL, vec4 w) {
7151
7151
  return clamp((NL + w) / (w1 * w1), 0.0, 1.0);
7152
7152
  }
7153
7153
 
7154
- vec3 vgaiWorkbenchLighting(vec3 baseColor, vec3 N, vec3 I) {
7154
+ vec3 volterWorkbenchLighting(vec3 baseColor, vec3 N, vec3 I) {
7155
7155
  vec3 diffuseColor = mix(baseColor, vec3(0.0), wbMetallic);
7156
7156
  vec3 specularColor = mix(vec3(0.05), baseColor, wbMetallic);
7157
7157
  vec3 R = -reflect(I, N);
@@ -7180,6 +7180,6 @@ vec3 vgaiWorkbenchLighting(vec3 baseColor, vec3 N, vec3 I) {
7180
7180
  diffuseLight *= diffuseColor * (1.0 - specEnergy);
7181
7181
  return diffuseLight + specularLight;
7182
7182
  }
7183
- `,fo=o=>ao.map(t=>{const[n=0,e=0,r=0]=o(t);return new x(n,e,r)}),Nl=fo(o=>o.direction).map(o=>o.normalize()),Rl=fo(o=>o.diffuse),Il=fo(o=>o.specular),zl=new Jn(...ao.map(o=>o.smooth));function Fl(o,t){const[n,e,r]=o.color,a=new qe({side:t});return a.color.setRGB(n,e,r,ft),a.name="vgai:blender-solid",a.onBeforeCompile=i=>{i.uniforms.wbDir={value:Nl},i.uniforms.wbDiffuse={value:Rl},i.uniforms.wbSpecular={value:Il},i.uniforms.wbWrap={value:zl},i.uniforms.wbRoughness={value:o.roughness},i.uniforms.wbMetallic={value:o.metallic},i.fragmentShader=i.fragmentShader.replace("void main() {",`${Ml}
7184
- void main() {`).replace("#include <opaque_fragment>",`outgoingLight = vgaiWorkbenchLighting(diffuseColor.rgb, normal, isOrthographic ? vec3(0.0, 0.0, 1.0) : normalize(vViewPosition));
7185
- #include <opaque_fragment>`)},a.customProgramCacheKey=()=>"vgai-blender-workbench",a}const I=S().finite(),be=$([I,I,I]),vn=$([S().int().nonnegative(),S().int().nonnegative()]),lt={name:E(),domain:W(["POINT","EDGE","FACE","CORNER"])},Dl=ca("type",[P({...lt,type:j("FLOAT2"),data:z($([I,I]))}).strict(),P({...lt,type:j("FLOAT_VECTOR"),data:z(be)}).strict(),P({...lt,type:j("FLOAT_COLOR"),data:z($([I,I,I,I]))}).strict(),P({...lt,type:j("BYTE_COLOR"),data:z($([I,I,I,I]))}).strict(),P({...lt,type:j("QUATERNION"),data:z($([I,I,I,I]))}).strict(),P({...lt,type:j("FLOAT4"),data:z($([I,I,I,I]))}).strict(),P({...lt,type:j("FLOAT4X4"),data:z(z(I).length(16))}).strict(),P({...lt,type:j("INT16_2D"),data:z($([S().int(),S().int()]))}).strict(),P({...lt,type:j("INT32_2D"),data:z($([S().int(),S().int()]))}).strict(),P({...lt,type:j("FLOAT"),data:z(I)}).strict(),P({...lt,type:j("INT"),data:z(S().int())}).strict(),P({...lt,type:j("INT8"),data:z(S().int())}).strict(),P({...lt,type:j("BOOLEAN"),data:z(q())}).strict(),P({...lt,type:j("STRING"),data:z(E())}).strict()]),Cl=P({positions:B(Float32Array),normals:B(Float32Array).nullable(),uv:B(Float32Array).nullable(),uvLayers:z(P({name:E(),data:B(Float32Array)}).strict()).optional(),attributeLayers:z(P({name:E(),data:B(Float32Array)}).strict()).optional(),orco:B(Float32Array).nullable().optional(),indices:B(Uint32Array),groups:z(P({start:S().int().nonnegative(),count:S().int().nonnegative(),materialIndex:S().int().nonnegative()}).strict()),hash:E()}).strict(),kl=P({v:z(be),f:z(z(S().int().nonnegative())),e:z(vn).optional(),edge_order:z(vn).optional(),m:z(S().int().nonnegative()).optional(),s:z(q()).optional(),sharp:z(vn).optional(),seams:z(vn).optional(),creases:z($([I,I,I])).optional(),attributes:z(Dl).optional(),active_uv:E().nullable().optional(),render_uv:E().nullable().optional()}).strict(),$l=P({store:S().int().optional(),revision:S().int(),unchanged:j(!0)}).strict(),Ll=P({co:B(Float64Array),cornerNormal:B(Float32Array).optional(),orco:B(Float32Array).optional(),faceStart:B(Uint32Array),corner:B(Uint32Array),cornerEdge:B(Int32Array),edge:B(Uint32Array),edgeSharp:B(Uint8Array),edgeSeam:B(Uint8Array),edgeCrease:B(Float32Array),material:B(Uint32Array),smooth:B(Uint8Array),vertSelect:B(Uint8Array),vertHide:B(Uint8Array),edgeSelect:B(Uint8Array),edgeHide:B(Uint8Array),faceSelect:B(Uint8Array),faceHide:B(Uint8Array)}).strict(),Vl=P({name:E(),domain:W(["POINT","EDGE","FACE","CORNER"]),type:E(),data:ua(o=>ArrayBuffer.isView(o))}).strict(),jl=P({columns:Ll,attributes:z(Vl),activeUv:E().nullable(),renderUv:E().nullable(),counts:P({verts:S().int().nonnegative(),edges:S().int().nonnegative(),faces:S().int().nonnegative(),corners:S().int().nonnegative()}).strict(),revision:S().int().nonnegative()}).strict(),Bl=jt([Cl,jl,kl,$l]),jo=new Set;function Ul(o){const t=new Blob([o],{type:"image/png"}),n=new Je;let e=!1;n.addEventListener("dispose",()=>{e=!0,n.image?.close?.()});const r=createImageBitmap(t,{imageOrientation:"flipY",premultiplyAlpha:"none"}).then(a=>{if(e){a.close();return}n.image=a,n.needsUpdate=!0,vt()}).finally(()=>{jo.delete(r)});return jo.add(r),r.catch(()=>{}),{texture:n,ready:r}}function Wl(o,t,n,e){const r=new Tn(o,t,n,Pn,Ke);return r.flipY=!1,r.colorSpace=e==="data"?no:Mt,r.needsUpdate=!0,r}function Hl(o,t,n){if(t.length===0)throw new Error(`Runtime image ${o} is tiled with no tiles`);const e=Math.max(...t.map(s=>s.width)),r=Math.max(...t.map(s=>s.height)),a=new Uint8Array(e*r*4*t.length),i=Math.max(...t.map(s=>s.number-1001))+1,c=new Float32Array(i*2*4);for(let s=0;s<i;s++)c[s*4]=-1;t.forEach((s,l)=>{const _=s.rgba??(s.rgbaBase64?Un(s.rgbaBase64):void 0);if(!_)throw new Error(`Runtime image ${o} tile ${s.number} carries no raster`);for(let d=0;d<s.height;d++)a.set(_.subarray(d*s.width*4,(d+1)*s.width*4),(l*r+d)*e*4);const h=s.number-1001;c[h*4]=l,c.set([0,0,s.width/e,s.height/r],(i+h)*4)});const u=new Qe(a,e,r,t.length);u.colorSpace=n==="data"?no:Mt,u.magFilter=Lt,u.minFilter=Jo,u.generateMipmaps=!0,u.needsUpdate=!0;const f=new Tn(c,i,2,Pn,Yo);return f.magFilter=f.minFilter=jn,f.needsUpdate=!0,{tiles:u,map:f,frame:t}}const ql=P({width:S().int().positive(),height:S().int().positive(),revision:S().int().nonnegative(),rgba:B(Uint8Array).optional(),rgbaBase64:E().optional(),colorspace:W(["sRGB","data"]).optional(),tiles:z(P({number:S().int().min(1001),width:S().int().positive(),height:S().int().positive(),rgba:B(Uint8Array).optional(),rgbaBase64:E().optional()}).strict()).optional()}).strict(),Gl=P({revision:S().int().nonnegative(),png:B(Uint8Array).optional(),pngBase64:E().optional()}).strict(),Xl=jt([ql,Gl]),kn=P({image:P({name:E(),revision:S().int().nonnegative()}).strict(),extension:W(["REPEAT","EXTEND","MIRROR","CLIP"]).default("REPEAT"),uv:E(),tint:$([I,I,I]).optional()}).strict(),Yl=P({name:E(),color:$([I,I,I,I]),roughness:I,metallic:I,transmission:I,ior:I,physical:ol.optional(),normal_texture:kn.optional(),normal_strength:I.default(1),normal_space:W(["TANGENT","OBJECT"]).default("TANGENT"),normal_directx:q().default(!1),texture:kn.optional(),roughness_texture:kn.optional(),emission:P({color:$([I,I,I]),strength:I}).strict().optional(),graph:Nr.optional(),viewport:P({color:$([I,I,I,I]),roughness:I,metallic:I}).strict().optional()}).strict(),Zl=P({session:E(),revision:S().int().nonnegative(),volumes:_t(E(),me).default({}),lights:_t(E(),mr).default({}),world:yr.nullable().default(null),meshes:_t(E(),Bl),materials:_t(E(),Yl),images:_t(E(),Xl).default({}),objects:z(P({id:E(),name:E(),type:W(["MESH","CURVE","SURFACE","FONT","META","ARMATURE","LATTICE","VOLUME","EMPTY","CAMERA","LIGHT","SPEAKER","GREASEPENCIL","POINTCLOUD","LIGHT_PROBE"]),mesh:E().nullable(),volume:E().nullable().optional(),light:E().nullable().optional(),materials:z(E().nullable()),matrix:z($([I,I,I,I])).length(4),visible:q(),render_visible:q().default(!0),selected:q(),parent:E().nullable(),texspace:$([$([I,I,I]),$([I,I,I])]).optional(),default_color:E().optional()}).strict()),active:E().nullable(),mode:E(),cameras:_t(E(),_t(E(),ne())).default({}),warnings:z(E()).default([]),updated:z(E()).default([]),frame:S().int().default(0),armatures:_t(E(),ha).default({}),weights:sl.nullable().default(null),cursor:ml.optional(),camera_view:P({scene_camera:E().nullable(),view_layer_cameras:z(E()),aspect:S().finite().positive()}).optional(),light_distances:_t(E(),$([S().finite(),S().finite()])).default({}),empties:_t(E(),xl).default({}),view:P({location:$([S(),S(),S()]),rotation:$([S(),S(),S(),S()]),distance:S().finite(),perspective:W(["PERSP","ORTHO","CAMERA"]),lens:S().finite().positive().default(50)}).nullable().optional(),subject:P({frame:S().int(),body:E(),markers:z($([S().int(),E()]))}).optional(),units:P({system:W(["NONE","METRIC","IMPERIAL"]),scale_length:S().finite()}).optional()}).strict();function Ql(o,t){for(let n=0,e=o.length-1;n<o.length&&e>=0;n++,e--){if(o[n][0]===t)return o[n][1];if(n===e)break;if(o[e][0]===t)return o[e][1]}return null}const Kl={METRIC:[[1e-6,"Micrometers"],[.001,"Millimeters"],[.01,"Centimeters"],[.1,"10 Centimeters"],[1,"Meters"],[10,"10 Meters"],[100,"100 Meters"],[1e3,"Kilometers"]],IMPERIAL:[[254e-7,"Thou"],[.0254,"Inches"],[.3048,"Feet"],[.9144,"Yards"],[20.1168,"Chains"],[201.168,"Furlongs"],[1609.344,"Miles"]]};class co{constructor(){this.root=new ot,this.objects=new Map,this.meshes=new Map,this.volumes=new Map,this.materials=new Map,this.lights=new Map,this.lighting=new br,this.world=new ro,this.armatureOverlay=new Aa,this.weightOverlay=new _l,this.cursorOverlay=new gl,this.extrasOverlay=new wl,this.armatureRoot=new ot,this.weightRoot=new ot,this.cursorRoot=new ot,this.cameraExtrasRoot=new ot,this.lightExtrasRoot=new ot,this.emptyExtrasRoot=new ot,this.rendered=!1,this.heldRendered=null,this.worldApplied=null,this.worldKey="null",this.capturing=!1,this.workbench=!1,this.workbenchMaterials=new Map,this.fallback=new ln({color:12172998,roughness:.72}),this.textures=new Map,this.textureNames=new Map,this.roughnessTextureNames=new Map,this.textureSamplers=new nl,this.graphSamplers=new Map,this.photograph=!1,this.graphs=new Map,this.frame=null,this.retiredSessions=new Set,this.geometryBuilds=0,this.submittedMeshes=new Map,this.submitted=null,this.submittedSession=null,this.photographs=[],this.frameListeners=new Set,this.cameraViewZoom=Pl,this.cameraViewPan=Al,this.mode=null,this.awaitedImages=new Set,this.lookingThrough=null,this.root.name="Model",this.root.matrixAutoUpdate=!1,this.root.matrix.set(1,0,0,0,0,0,1,0,0,-1,0,0,0,0,0,1),this.root.updateMatrixWorld(!0);for(const[t,n]of[[this.armatureRoot,this.armatureOverlay.group],[this.weightRoot,this.weightOverlay.group],[this.cursorRoot,this.cursorOverlay.group],[this.cameraExtrasRoot,this.extrasOverlay.cameras],[this.lightExtrasRoot,this.extrasOverlay.lights],[this.emptyExtrasRoot,this.extrasOverlay.empties]])t.matrixAutoUpdate=!1,t.matrix.copy(this.root.matrix),t.add(n),t.updateMatrixWorld(!0);this.armatureRoot.name="BlenderBones",this.weightRoot.name="BlenderWeights",this.cursorRoot.name="Blender3DCursor",this.cameraExtrasRoot.name="BlenderCameraExtras";for(const t of[this.cameraExtrasRoot,this.lightExtrasRoot,this.emptyExtrasRoot])t.userData.vgaiPickable=!0;this.lightExtrasRoot.name="BlenderLightExtras",this.emptyExtrasRoot.name="BlenderEmptyExtras"}compiledGraph(t){const n=JSON.stringify(t);let e=this.graphs.get(n);return e||(e=Wr(t),this.graphs.size>256&&this.graphs.clear(),this.graphs.set(n,e)),e}subscribeFrames(t){return this.frameListeners.add(t),()=>{this.frameListeners.delete(t)}}onChange(t){const n=this.subscribeFrames(t),e=ma(t);return()=>{n(),e()}}blenderObjectName(t){for(const[n,e]of this.objects)if(e===t)return this.frame?.objects.find(r=>r.id===n)?.name??null;return null}savedView(){const t=this.frame?.view;if(!t)return null;const[n,e,r,a]=t.rotation,i=new gt(e,r,a,n),c=new x(...t.location).applyMatrix4(this.root.matrix),u=f=>f.applyQuaternion(i).applyMatrix4(this.root.matrix).normalize();return{target:c.toArray(),direction:u(new x(0,0,1)).toArray(),up:u(new x(0,1,0)).toArray(),distance:t.distance,projection:t.perspective==="ORTHO"?"orthographic":"perspective",lens:t.lens}}cameraViewCamera(){const t=this.frame,n=t?.camera_view;return!t||!n?null:n.scene_camera!==null&&t.cameras[n.scene_camera]?n.scene_camera:t.active!==null&&t.cameras[t.active]?t.active:n.view_layer_cameras.find(e=>t.cameras[e])??null}blenderPose(t,n){const e=new X().copy(this.root.matrix).invert(),r=new X().compose(new x(...t),new gt(...n),new x(1,1,1)).premultiply(e),a=new x,i=new gt;return r.decompose(a,i,new x),{location:a.toArray(),rotation:[i.w,i.x,i.y,i.z]}}cameraView(t,n,e,r){const a=this.frame,i=Lo.safeParse(a?.cameras[t]);return!a?.camera_view||!i.success?null:Sl(i.data,this.root.matrix,n,e,r,a.camera_view.aspect)}subjectLine(t){const n=this.frame?.subject;if(n===void 0)return null;const e=t??n.frame,r=Ql(n.markers,e);return`(${e})${n.body}${r===null?"":` <${r}>`}`}gridUnitName(t){const n=this.frame?.units;if(n===void 0||n.system==="NONE")return null;const e=Kl[n.system],r=6*t,a=1/(n.scale_length||1);return(e.find(([c])=>c*a>r)??e[e.length-1])[1]}blenderSelection(){const t=this.frame;return t===null?{selected:[],active:null}:{selected:t.objects.filter(n=>n.selected).map(n=>n.name),active:t.active}}setStageMode(t){this.mode=t}stageMode(){return this.mode}objectForBlenderName(t){const n=this.frame?.objects.find(e=>e.name===t);return n===void 0?null:this.objects.get(n.id)??null}replacePresentedObject(t,n){for(const[e,r]of this.objects)if(r===t){const a=t.parent,i=[...t.children];t.removeFromParent();for(const c of i)n.add(c);a?.add(n),this.objects.set(e,n);return}}studioLights(){return this.lighting.group}overlayGroups(){return[{kind:"skeletons",object:this.armatureRoot},{kind:"weights",object:this.weightRoot},{kind:"cursor",object:this.cursorRoot},{kind:"cameras",object:this.cameraExtrasRoot},{kind:"lights",object:this.lightExtrasRoot},{kind:"empties",object:this.emptyExtrasRoot}]}placeCursor(t,n,e){const r=new Set(this.objects.values()),a=this.cursorOverlay.placementAt(t,n,e,this.root,i=>r.has(i));return a!==null&&(this.cursorOverlay.show(a),vt()),a}holdRendered(t){t!==this.heldRendered&&(this.heldRendered=t,!this.capturing&&this.report(t===null?this.applyRendered(!1):this.applyRendered(!0,t())))}refreshRendered(){if(this.heldRendered===null||this.capturing)return;const t=this.heldRendered();this.worldKeyFor(t)!==this.worldApplied&&this.report(this.applyRendered(!0,t))}worldKeyFor(t){const e=t.isOrthographicCamera?t.getWorldDirection(new x).toArray().map(r=>r.toFixed(1)).join(","):"";return`${t.uuid}:${e}:${this.worldKey}`}report(t){t.then(vt,n=>console.error(`Rendered shading could not be applied: ${n instanceof Error?n.message:String(n)}`))}setWorkbench(t){t!==this.workbench&&(this.workbench=t,this.applyWorkbench(),vt())}applyWorkbench(){const t=this.workbench&&!this.rendered,n=new Set;for(const e of this.frame?.objects??[]){if(e.mesh===null||e.volume)continue;const r=this.objects.get(e.id);if(!r?.isMesh)continue;const i=(e.materials.length?e.materials:[null]).map(c=>{const u=c===null?this.fallback:this.materials.get(c)??this.fallback;return t?this.workbenchFor(c,u.side,n):u});r.material=e.materials.length?i:i[0]}for(const[e,r]of this.workbenchMaterials)n.has(e)||(r.dispose(),this.workbenchMaterials.delete(e))}workbenchFor(t,n,e){const r=(t!==null?this.frame?.materials[t]?.viewport:void 0)??El,a=`${r.color.join(",")}|${r.roughness}|${r.metallic}|${n}`;e.add(a);let i=this.workbenchMaterials.get(a);return i||(i=Fl(r,n),this.workbenchMaterials.set(a,i)),i}renderedHeld(){return this.heldRendered!==null}async setRendered(t,n){return this.capturing=t,!t&&this.heldRendered!==null?this.applyRendered(!0,this.heldRendered()):this.applyRendered(t,n)}async applyRendered(t,n){const e=(t?Do(this.frame?.world)?.extinction:null)??new x;for(const a of[...this.materials.values(),this.fallback])al(a,e);this.rendered=t,this.lighting.setRendered(t);const r=t&&n?this.worldKeyFor(n):null;t?(this.capturing||r!==this.worldApplied)&&this.world.apply(this.root,this.frame?.world??null,n):this.world.clear(),this.worldApplied=this.capturing?null:r,this.applyVisibility(),this.applyWorkbench(),this.applyShadows(t,n),t&&(await hr(),await Promise.all([...this.textures.values()].map(a=>a.ready)),await this.world.ready())}applyShadows(t,n){this.root.updateMatrixWorld(!0);const e=[];for(const u of this.objects.values()){const f=u;if(f.isMesh&&(f.castShadow=t,f.receiveShadow=t,t&&f.visible)){const s=new yn().setFromObject(f);s.isEmpty()||e.push(s)}}if(!t||!e.length)return;const a=e.reduce((u,f)=>u.union(f),new yn).getBoundingSphere(new Ge),i=n?new Xe().setFromProjectionMatrix(new X().multiplyMatrices(n.projectionMatrix,n.matrixWorldInverse)):null,c=i?e.flatMap(u=>Tr(u,i)):[];for(const u of this.lights.values())u.isDirectionalLight&&n?Pr(u,c,e):gr(u,a.center,a.radius)}applyOverlays(t){const n=i=>{const c=t.objects.find(u=>u.name===i);return c===void 0?null:new X().set(...c.matrix.flat())},e=[...this.armatureOverlay.apply(t.armatures,n)],r=t.weights?this.objects.get(t.objects.find(i=>i.name===t.weights?.object)?.id??""):void 0,a=this.weightOverlay.apply(t.weights,r??null,t.weights?n(t.weights.object):null);return a!==null&&e.push(a),this.cursorOverlay.apply(t.cursor),this.applyExtras(t),e}setCameraViewShowing(t){this.lookingThrough!==t&&(this.lookingThrough=t,this.frame&&this.applyExtras(this.frame),vt())}applyExtras(t){const n={};for(const[e,r]of Object.entries(t.cameras)){const a=Lo.safeParse(r);a.success&&(n[e]=a.data)}this.extrasOverlay.apply({lookingThrough:this.lookingThrough,lightDistances:t.light_distances,objects:t.objects.filter(e=>e.visible),active:t.active,cameras:n,lights:t.lights,empties:t.empties,sceneCamera:t.camera_view?.scene_camera??null,renderAspect:t.camera_view?.aspect??1,presented:e=>{const r=t.objects.find(a=>a.name===e);return r?this.objects.get(r.id)??null:null},image:e=>{const r=this.textures.get(e);if(!r)return null;const a=r.texture.image,i=r.width||a?.width||0,c=r.height||a?.height||0;return(i===0||c===0)&&r.ready&&!this.awaitedImages.has(e)&&(this.awaitedImages.add(e),r.ready.then(()=>{this.awaitedImages.delete(e),this.frame&&this.applyExtras(this.frame),vt()},()=>this.awaitedImages.delete(e))),{texture:r.texture,width:i,height:c}}})}applyVisibility(){for(const t of this.frame?.objects??[]){const n=this.objects.get(t.id);if(n&&(n.visible=this.rendered?t.render_visible:t.visible),!t.light)continue;const e=this.lights.get(t.light);e&&(e.visible=this.rendered&&t.render_visible)}this.armatureOverlay.group.visible=!this.capturing,this.weightOverlay.group.visible=!this.capturing,this.cursorOverlay.group.visible=!this.capturing;for(const t of[this.extrasOverlay.cameras,this.extrasOverlay.lights,this.extrasOverlay.empties])t.visible=!this.capturing}applyFrame(t){const n=this.frame===null?null:{session:this.frame.session,revision:this.frame.revision},e=Zl.parse(t);if(this.retiredSessions.has(e.session))throw new Error("The runtime session was replaced; its delayed frame cannot overwrite the active model");if(this.frame?.session===e.session&&e.revision<this.frame.revision)throw new Error("The runtime frame is older than the displayed model");const r=new Set(e.objects.map(f=>f.id));if(r.size!==e.objects.length)throw new Error("Runtime object IDs must be unique");const a=new Map(e.objects.map(f=>[f.id,f]));for(const f of e.objects){if(f.mesh!==null&&!e.meshes[f.mesh])throw new Error(`Missing runtime mesh ${f.mesh}`);if(f.volume&&(!e.volumes[f.volume]||f.mesh!==null))throw new Error(`Invalid runtime volume ${f.volume}`);if(f.light&&(!e.lights[f.light]||f.mesh!==null))throw new Error(`Invalid runtime light ${f.light}`);for(const _ of f.materials)if(_!==null&&!e.materials[_])throw new Error(`Missing runtime material ${_}`);const s=new Set([f.id]);let l=f.parent;for(;l!==null;){if(s.has(l))throw new Error("Runtime parent cycle");s.add(l);const _=a.get(l);if(!_)throw new Error(`Missing runtime parent ${l}`);l=_.parent}}const i=new Map,c=new Map;try{for(const[f,s]of Object.entries(e.volumes)){const l=JSON.stringify(s);this.frame?.session===e.session&&this.volumes.get(f)?.signature===l||c.set(f,{signature:l,mesh:Ar(s)})}for(const[f,s]of Object.entries(e.meshes)){if("unchanged"in s){if(this.frame?.session===e.session&&this.meshes.has(f))continue;throw new Error(`${Sa}: the presenter does not hold runtime mesh ${f} (store ${s.store}, revision ${s.revision})`)}const l="hash"in s,_="columns"in s,h=_?`revision:${s.revision}`:l?s.hash:JSON.stringify(s);this.frame?.session===e.session&&this.meshes.get(f)?.signature===h||i.set(f,{signature:h,geometry:_?Wn(La({...s.columns,attributes:s.attributes,activeUv:s.activeUv,renderUv:s.renderUv},h)):l?Wn(s):Va(s)})}}catch(f){for(const s of i.values())s.geometry.dispose();for(const{mesh:s}of c.values())s.geometry.dispose(),s.material.dispose();throw f}this.frame?.session!==e.session&&(this.frame&&this.retiredSessions.add(this.frame.session),this.clear());for(const[f,s]of c){const l=this.volumes.get(f)?.mesh;l&&(l.removeFromParent(),l.geometry.dispose(),l.material.dispose()),this.volumes.set(f,s)}for(const[f,s]of i)this.meshes.get(f)?.geometry.dispose(),this.meshes.set(f,s),this.geometryBuilds++;for(const[f,s]of Object.entries(e.images)){const l=this.textures.get(f);if("width"in s){const m=s.rgba??(s.rgbaBase64?Un(s.rgbaBase64):void 0);if(!m)throw new Error(`Runtime image ${f} carries no raster`);const p=s.tiles?Hl(f,s.tiles,s.colorspace??"sRGB"):void 0;if(l?.udim&&(l.udim.tiles.dispose(),l.udim.map.dispose(),delete l.udim),l&&l.width===s.width&&l.height===s.height){const v=l.texture.image;if(v.data){v.data.set(m),l.texture.needsUpdate=!0,l.revision=s.revision,p&&(l.udim=p);continue}}l?.texture.dispose(),this.textures.set(f,{texture:Wl(m,s.width,s.height,s.colorspace??"sRGB"),width:s.width,height:s.height,revision:s.revision,...p?{udim:p}:{}});continue}const _=s.png??(s.pngBase64?Un(s.pngBase64):void 0);if(!_)throw new Error(`Runtime image ${f} carries no bytes`);l?.texture.dispose(),l?.udim?.tiles.dispose(),l?.udim?.map.dispose();const{texture:h,ready:d}=Ul(_);h.colorSpace=Mt,this.textures.set(f,{texture:h,ready:d,width:0,height:0,revision:s.revision,png:_.slice()})}for(const[f,s]of Object.entries(e.materials)){const l=this.materials.get(f)??new ln;l.name=s.name;const _=s.texture?.tint;s.texture!==void 0?l.color.setRGB(_?.[0]??1,_?.[1]??1,_?.[2]??1,ft):l.color.setRGB(s.color[0],s.color[1],s.color[2],ft),l.opacity=s.color[3];const h=l.opacity<1||s.graph!==void 0&&Rr(s.graph);l.transparent!==h&&(l.transparent=h,l.needsUpdate=!0),l.roughness=s.roughness,l.metalness=s.metallic,l.transmission=s.transmission,l.ior=s.ior,io(l,s.physical,{map:s.texture?.extension==="CLIP",roughness:s.roughness_texture?.extension==="CLIP",normal:s.normal_texture?.extension==="CLIP"});const d=s.normal_texture?.image.name;if(d===void 0)l.normalMap&&(this.textureSamplers.delete(`${f}:normal`),l.normalMap=null,l.needsUpdate=!0);else{const b=this.textures.get(d);if(!b)throw new Error(`${Qt}: missing normal image ${d}`);const w=this.textureSamplers.get(`${f}:normal`,b.texture,s.normal_texture.extension,b.ready,s.normal_texture.uv);l.normalMap!==w&&(l.normalMap=w,l.needsUpdate=!0);const R=s.normal_space==="OBJECT"?Ye:Ze;l.normalMapType!==R&&(l.normalMapType=R,l.needsUpdate=!0),l.normalScale.set(s.normal_strength,s.normal_strength*(s.normal_directx?-1:1))}s.emission?(l.emissive.setRGB(s.emission.color[0],s.emission.color[1],s.emission.color[2],ft),l.emissiveIntensity=s.emission.strength):(l.emissive.setRGB(0,0,0),l.emissiveIntensity=1);const m=s.roughness_texture?.image.name??null;if(m===null)this.roughnessTextureNames.has(f)&&(this.textureSamplers.delete(`${f}:roughness`),l.roughnessMap=null,this.roughnessTextureNames.delete(f),l.needsUpdate=!0);else{const b=this.textures.get(m);if(!b)throw new Error(`${Qt}: the presenter does not hold runtime image ${m} (revision ${s.roughness_texture.image.revision})`);const w=this.textureSamplers.get(`${f}:roughness`,b.texture,s.roughness_texture.extension,b.ready,s.roughness_texture.uv);l.roughnessMap!==w&&(l.roughnessMap=w,this.roughnessTextureNames.set(f,m),l.needsUpdate=!0)}const p=s.texture?.image.name??null;if(p===null)this.textureNames.has(f)&&(this.textureSamplers.delete(`${f}:color`),l.map=null,this.textureNames.delete(f),l.needsUpdate=!0);else{const b=this.textures.get(p);if(!b)throw new Error(`${Qt}: the presenter does not hold runtime image ${p} (revision ${s.texture.image.revision})`);const w=this.textureSamplers.get(`${f}:color`,b.texture,s.texture.extension,b.ready,s.texture.uv);l.map!==w&&(l.map=w,this.textureNames.set(f,p),l.needsUpdate=!0)}const v=s.graph?this.compiledGraph(s.graph):null,g=new Set;qr(l,v,b=>{const w=this.textures.get(b.name);if(!w)throw new Error(`${Qt}: the presenter does not hold runtime image ${b.name} (revision ${b.revision})`);if(b.tiled){if(!w.udim)throw new Error(`${Qt}: runtime image ${b.name} arrived without its UDIM tiles`);return w.udim}const R=`${f}:graph:${b.node}`;g.add(R);const T=this.textureSamplers.get(R,w.texture,b.extension,w.ready),A=b.closest?jn:Lt,O=b.closest?jn:b.mipmap?Jo:Lt;return(T.magFilter!==A||T.minFilter!==O)&&(T.magFilter=A,T.minFilter=O,T.needsUpdate=!0),T},this.photograph);for(const b of this.graphSamplers.get(f)??[])g.has(b)||this.textureSamplers.delete(b);this.graphSamplers.set(f,g),this.materials.set(f,l)}for(const f of e.objects){let s=this.objects.get(f.id);const l=f.volume?this.volumes.get(f.volume).mesh:null;if((!s||(l?s!==l:!!s.isMesh!=(f.mesh!==null)))&&(s?.removeFromParent(),s=l??(f.mesh!==null?new Tt(this.meshes.get(f.mesh).geometry,this.fallback):new Go),this.objects.set(f.id,s)),s.name=f.name,f.type==="CAMERA"||f.type==="LIGHT"||f.type==="EMPTY"?s.userData.vgaiOwnOverlay=!0:delete s.userData.vgaiOwnOverlay,s.matrixAutoUpdate=!1,s.matrix.set(...f.matrix.flat()),f.parent){const _=new X().set(...a.get(f.parent).matrix.flat());s.matrix.premultiply(_.invert())}if(s.matrix.decompose(s.position,s.quaternion,s.scale),f.texspace?s.userData.blenderTexspace=f.texspace:delete s.userData.blenderTexspace,f.default_color!==void 0?s.userData.blenderDefaultColor=f.default_color:delete s.userData.blenderDefaultColor,f.mesh!==null){const _=s;_.geometry=this.meshes.get(f.mesh).geometry,_.material=f.materials.length?f.materials.map(h=>h===null?this.fallback:this.materials.get(h)):this.fallback,Zr(_)}if(f.light){const _=this.lights.get(f.light)??null,h=vr(e.lights[f.light],_);_&&_!==h&&(_.removeFromParent(),_.dispose()),h.parent!==s&&s.add(h),h.userData.vgaiOwnOverlay=!0,xr(h,s),this.lights.set(f.light,h)}}for(const f of e.objects){const s=this.objects.get(f.id),l=f.parent===null?this.root:this.objects.get(f.parent);s.parent!==l&&l.add(s)}for(const[f,s]of this.objects)r.has(f)||(s.removeFromParent(),this.objects.delete(f));for(const[f,s]of this.volumes)e.volumes[f]||(s.mesh.geometry.dispose(),s.mesh.material.dispose(),this.volumes.delete(f));for(const[f,s]of this.meshes)e.meshes[f]||(s.geometry.dispose(),this.meshes.delete(f));for(const[f,s]of this.materials)if(!e.materials[f]){for(const l of["normal","roughness","color"])this.textureSamplers.delete(`${f}:${l}`);for(const l of this.graphSamplers.get(f)??[])this.textureSamplers.delete(l);this.graphSamplers.delete(f),s.dispose(),this.materials.delete(f)}for(const[f,s]of this.lights)e.lights[f]||(s.removeFromParent(),s.dispose(),this.lights.delete(f));this.root.updateMatrixWorld(!0),this.frame={...e,meshes:{},volumes:{}},this.worldKey=JSON.stringify(e.world??null);const u=this.applyOverlays(e);u.length&&(this.frame={...this.frame,warnings:[...this.frame.warnings,...u]}),this.applyVisibility(),this.applyWorkbench(),this.heldRendered!==null&&!this.capturing&&this.report(this.applyRendered(!0,this.heldRendered()));for(const f of[...this.frameListeners])f();return{...this.inspect(),held:n}}inspect(){return{session:this.frame?.session,revision:this.frame?.revision,active:this.frame?.active,mode:this.frame?.mode,geometryBuilds:this.geometryBuilds,objects:[...this.objects].map(([t,n])=>({id:t,name:n.name,uuid:n.uuid,geometry:n.geometry?.uuid,visible:n.visible}))}}snapshot(){return this.frame}captureSnapshot(){const t=this.frame;if(!t)throw new Error("Blender capture requires a presented frame");const n=structuredClone({...t,images:{},armatures:{},weights:null});for(const[u,{signature:f,geometry:s}]of this.meshes){const l=d=>{const m=s.getAttribute(d);if(!m)return null;if(!(m instanceof it))throw new Error(`Blender capture cannot copy interleaved ${d}`);return new Float32Array(m.array)},_=l("position");if(!_)throw new Error(`Blender capture mesh ${u} has no positions`);const h=s.getIndex();n.meshes[u]={hash:f,positions:_,normals:l("normal"),uv:l("uv"),uvLayers:Object.entries(s.userData.blenderUvChannels??{}).map(([d,m])=>{const p=l(`uv${m}`);if(!p)throw new Error(`Blender capture mesh ${u} is missing UV layer ${d}`);return{name:d,data:p}}),orco:s.userData.blenderOrcoFromDoor?l("blenderOrco"):null,attributeLayers:(s.userData.blenderAttributes??[]).map(d=>{const m=l(Vt(d));if(!m)throw new Error(`Blender capture mesh ${u} is missing attribute ${d}`);return{name:d,data:m}}),indices:h?new Uint32Array(h.array):Uint32Array.from({length:_.length/3},(d,m)=>m),groups:s.groups.map(d=>({start:d.start,count:d.count,materialIndex:d.materialIndex??0}))}}for(const[u,{signature:f}]of this.volumes)n.volumes[u]=me.parse(JSON.parse(f));const e=new Set(Object.values(n.materials).flatMap(u=>[u.texture?.image.name,u.roughness_texture?.image.name,u.normal_texture?.image.name,...Object.values(u.graph?.nodes??{}).map(f=>f.props.image?.name)].filter(f=>f!==void 0)));for(const u of e){const f=this.textures.get(u);if(!f)throw new Error(`Blender capture image ${u} is not resident`);if(f.png)n.images[u]={revision:f.revision,png:f.png.slice()};else{const s=f.texture.image?.data;if(!(s instanceof Uint8Array))throw new Error(`Blender capture image ${u} has no resident raster`);n.images[u]={revision:f.revision,width:f.width,height:f.height,rgba:s.slice(),colorspace:f.texture.colorSpace===no?"data":"sRGB",...f.udim?{tiles:f.udim.frame}:{}}}}const r=this.createWorldVolumePass(),a=new co;a.photograph=!0;let i=!1;const c=()=>{i||(i=!0,r?.dispose(),a.dispose(),a.root.removeFromParent())};try{a.applyFrame(n),this.root.updateWorldMatrix(!0,!1),a.root.matrix.copy(this.root.matrixWorld),a.root.updateMatrixWorld(!0)}catch(u){throw c(),u}return{effect:r,root:a.root,session:t.session,revision:t.revision,prepare:u=>{if(i)throw new Error("Blender capture snapshot is disposed");return a.setRendered(!0,u)},dispose:c}}createWorldVolumePass(){const t=Do(this.frame?.world);return t?new il(t):void 0}recordPresentation(t){if(typeof t!="object"||t===null)return;const n=t,e=n.meshes;if(typeof e!="object"||e===null)return;const r=typeof n.session=="string"?n.session:null;r!==this.submittedSession&&(this.submittedMeshes.clear(),this.photographs.length=0,this.submittedSession=r);const a=e;for(const[i,c]of Object.entries(a))typeof c=="object"&&c!==null&&!("unchanged"in c)&&this.submittedMeshes.set(i,c);for(const i of[...this.submittedMeshes.keys()])i in a||this.submittedMeshes.delete(i);this.submitted={...n,meshes:Object.fromEntries(this.submittedMeshes)}}recordPhotograph(t){this.photographs.push(t)}observations(){return{presentation:this.submitted,photographs:this.photographs}}clear(){for(const t of this.lights.values())t.removeFromParent(),t.dispose();this.lights.clear();for(const t of this.objects.values())t.removeFromParent();for(const t of this.meshes.values())t.geometry.dispose();for(const t of this.materials.values())t.dispose();for(const{mesh:t}of this.volumes.values())t.geometry.dispose(),t.material.dispose();for(const{texture:t,udim:n}of this.textures.values())t.dispose(),n?.tiles.dispose(),n?.map.dispose();this.textures.clear(),this.textureNames.clear(),this.roughnessTextureNames.clear(),this.textureSamplers.clear(),this.volumes.clear(),this.objects.clear(),this.meshes.clear(),this.materials.clear()}dispose(){this.clear(),this.fallback.dispose(),this.lighting.dispose(),this.world.dispose(),this.armatureOverlay.dispose(),this.weightOverlay.dispose(),this.cursorOverlay.dispose(),this.extrasOverlay.dispose();for(const t of this.workbenchMaterials.values())t.dispose();this.workbenchMaterials.clear(),this.frame=null,this.retiredSessions.clear(),this.submittedMeshes.clear(),this.submitted=null,this.submittedSession=null,this.photographs.length=0}}const ii=new co;function ye(o){const t=atob(o),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}function $n(o){const t=ye(o);return new Float32Array(t.buffer,t.byteOffset,t.byteLength>>2)}function Jl(o){const t=ye(o);return new Uint16Array(t.buffer,t.byteOffset,t.byteLength>>1)}function ti(o){return new X().set(...o.flat())}function Bo(o,t){return[o.object,o.mesh,o.armature,o.vertexCount,o.bones.length,t].join("|")}class ni{#n=new Map;#o=null;#a=null;#t=null;#i=null;#e=null;#l=null;#s=new Set;#u=0;#_=[];#r=0;get version(){return this.#u}get engineCalls(){return this.#r}subscribe(t){return this.#s.add(t),()=>this.#s.delete(t)}#f(){this.#u++;for(const t of[...this.#s])t()}state(){const t=this.#t,n=t?.frameStart??1,e=t?.frameEnd??250,r=t?.fps??24;return{frame:this.frame(),start:n,end:e,fps:r,action:t?.action??null,object:t?.object??null,armature:t?.armature??null,bones:[...this.#n.values()].reduce((a,i)=>a+i.bones.length,0),keyframes:t?.keyframes??[],summary:t?.summary??[],clipStart:t?.clipStart??null,clipEnd:t?.clipEnd??null,tracks:t?.tracks.length??0,bound:[...this.#n.keys()],warnings:this.#_,engineCalls:this.#r,blenderFrame:t?.frameCurrent??null}}playhead(){return this.#t?this.frame():null}frame(){const t=this.#t;return!t||!this.#a||t.clipStart===void 0?t?.frameCurrent??1:this.#i!==null?this.#i:t.clipStart+this.#a.time*t.fps}get playable(){return this.#a!==null}async bind(t,n){this.#r++;const e=await n.rig();if(!e)return;const r=[],a=new Set;let i=!1;for(const l of e.rigs){if(!l.object||!l.armature||!l.skinIndexBase64||!l.skinWeightBase64){l.reason&&r.push(l.reason);continue}a.add(l.object);const _=Bo(l,e.frame);if(this.#n.get(l.object)?.signature===_)continue;const h=this.#d(t,l,e.frame,r);h&&(this.#n.get(l.object)?.skeleton.dispose(),this.#n.set(l.object,h),i=!0)}for(const[l,_]of[...this.#n])a.has(l)||(_.skeleton.dispose(),_.boneRoot.removeFromParent(),this.#n.delete(l),i=!0);this.#r++;const c=await n.clip(),u=this.#t,f=c?.action!==u?.action||c?.tracks.length!==u?.tracks.length||c?.clipStart!==u?.clipStart||c?.clipEnd!==u?.clipEnd;this.#t=c??null,c?.reason&&r.push(c.reason),c&&(f||i)&&this.#h(t,c,r);const s=this.#e?.snapshot().playbackState==="playing";c&&!s&&u?.frameCurrent!==c.frameCurrent&&(this.#c(c.frameCurrent),this.#e&&c.fps>0&&this.#e.seek(c.frameCurrent/c.fps)),this.#_=r,this.#f()}#d(t,n,e,r){const a=t.objectForBlenderName(n.object??""),i=t.objectForBlenderName(n.armature??"");if(!a||!i)return null;const c=a,u=c.geometry;if(!u)return null;const f=u.getAttribute("blenderVertex");if(!f)return r.push(`"${n.object}" cannot be skinned: its presented geometry carries no \`blenderVertex\` attribute, so a per-Blender-vertex weight cannot be expanded onto its drawn vertices.`),null;if(n.vertexCount===0)return null;let s=0;for(let T=0;T<f.count;T++)s=Math.max(s,f.getX(T));if(s>=n.vertexCount)return r.push(`"${n.object}" is not skinned here: its presented geometry references Blender vertex ${s} while the mesh declares ${n.vertexCount}, which is a generative modifier (Subdivision, Mirror, Array…) between the two. Blender's own viewport shows the evaluated result; this presenter shows the exported columns unskinned.`),null;const l=Jl(n.skinIndexBase64??""),_=$n(n.skinWeightBase64??""),h=f.count,d=new Uint16Array(h*4),m=new Float32Array(h*4);for(let T=0;T<h;T++){const A=f.getX(T);for(let O=0;O<4;O++)d[T*4+O]=l[A*4+O]??0,m[T*4+O]=_[A*4+O]??0}u.setAttribute("skinIndex",new ta(d,4)),u.setAttribute("skinWeight",new bt(m,4));const p=new ot;p.name=`${n.armature}:bones`;const v=[],g=n.bones.map(T=>ti(T.pose)),b=new Map(n.bones.map((T,A)=>[T.name,A]));n.bones.forEach((T,A)=>{const O=new na;O.name=T.name,v.push(O);const M=T.parent===null?void 0:b.get(T.parent);(M===void 0?g[A].clone():g[M].clone().invert().multiply(g[A])).decompose(O.position,O.quaternion,O.scale),(M===void 0?p:v[M]).add(O)}),i.add(p);const w=new oa(u,c.material);w.name=c.name,w.matrixAutoUpdate=!1,w.matrix.copy(c.matrix),w.matrix.decompose(w.position,w.quaternion,w.scale),w.userData=c.userData,w.frustumCulled=!1,t.replacePresentedObject(c,w),t.root.updateMatrixWorld(!0);const R=new ea(v);return w.bind(R,w.matrixWorld.clone()),n.constrainedBones?.length&&r.push(`Bone constraints on ${n.constrainedBones.join(", ")}: the clip is derived from the F-Curves alone, so those bones play their channels rather than Blender's solved pose.`),n.unmappedGroups?.length&&r.push(`${n.object} carries vertex groups no bone is named for (${n.unmappedGroups.join(", ")}); they weight nothing here, exactly as they deform nothing in Blender.`),{object:n.object??"",armature:n.armature??"",mesh:w,boneRoot:p,bones:v,skeleton:R,frame:e,signature:Bo(n,e)}}#h(t,n,e){if(this.#o?.stopAllAction(),this.#o=null,this.#a=null,!n.tracks.length||n.clipStart===void 0||n.clipEnd===void 0)return;const r=n.armature?t.objectForBlenderName(n.armature):null;if(!r)return;const a=new Map;for(const l of this.#n.values())if(l.armature===n.armature)for(const _ of l.bones)a.set(_.name,_);const i=[],c=new Set;for(const l of n.tracks){const _=a.get(l.bone);if(!_){c.add(l.bone);continue}const h=$n(l.timeBase64),d=$n(l.valueBase64),m=`${_.uuid}.${l.property}`;i.push(l.property==="quaternion"?new aa(m,Array.from(h),Array.from(d)):new ra(m,Array.from(h),Array.from(d)))}if(c.size&&e.push(`${n.action} animates ${[...c].join(", ")}, which this binding has no bone for.`),!i.length)return;const u=n.duration??(n.clipEnd-n.clipStart)/n.fps,f=new la(r),s=f.clipAction(new ia(n.action??"action",u,i));s.setLoop(sa,Number.POSITIVE_INFINITY),s.play(),this.#o=f,this.#a=s,this.#c(n.frameCurrent),this.#m()}#c(t){const n=this.#t;if(!n||!this.#o||n.clipStart===void 0||n.clipEnd===void 0)return;const e=Math.min(n.clipEnd,Math.max(n.clipStart,t));this.#i=e;const r=(n.clipEnd-n.clipStart)/n.fps;this.#o.setTime(Math.min(r-1e-4,(e-n.clipStart)/n.fps)),this.#m()}#m(){for(const t of this.#n.values())t.boneRoot.updateMatrixWorld(!0),t.skeleton.update()}get scene(){return this.#t?.scene??null}async writeBookmark(){const t=Math.round(this.frame()),n=this.#t;if(!n)return t;const e=n.scene;return!e||n.frameCurrent===t||(this.#r++,await _a(`bpy.data.scenes[${JSON.stringify(e)}]`,"frame_current",t,void 0,!1),this.#t={...n,frameCurrent:t},this.#f()),t}get transport(){return this.#e}attachTo(t){this.#l?.(),this.#e=t;const n=t.attach({id:this.#t?.action??"blender-action",label:this.#t?.action??"Action",range:()=>{const i=this.#t,c=i?.fps||24;return{start:(i?.frameStart??1)/c,end:(i?.frameEnd??250)/c,fps:c}},seek:i=>this.seekSeconds(i)}),e=t.onSettled(()=>{this.writeBookmark()}),r=()=>{e(),n(),this.#e===t&&(this.#e=null),this.#l=null};this.#l=r;const a=this.#t;return a&&a.fps>0&&t.seek(a.frameCurrent/a.fps),r}seekSeconds(t){const n=this.#t?.fps||24;this.#c(Math.round(t*n)),this.#f()}keyframes(){return(this.#t?.keyframes??[]).map(t=>t.frame)}dispose(){this.#l?.(),this.#o?.stopAllAction(),this.#o=null,this.#a=null;for(const t of this.#n.values())t.skeleton.dispose(),t.boneRoot.removeFromParent();this.#n.clear()}}const we=new ni;function si(o){return we.subscribe(o)}function fi(){return we.version}export{we as a,fi as b,ii as c,si as s};
7183
+ `,fo=o=>ao.map(t=>{const[n=0,e=0,r=0]=o(t);return new x(n,e,r)}),Nl=fo(o=>o.direction).map(o=>o.normalize()),Rl=fo(o=>o.diffuse),Il=fo(o=>o.specular),zl=new Jn(...ao.map(o=>o.smooth));function Fl(o,t){const[n,e,r]=o.color,a=new qe({side:t});return a.color.setRGB(n,e,r,ft),a.name="volter:blender-solid",a.onBeforeCompile=i=>{i.uniforms.wbDir={value:Nl},i.uniforms.wbDiffuse={value:Rl},i.uniforms.wbSpecular={value:Il},i.uniforms.wbWrap={value:zl},i.uniforms.wbRoughness={value:o.roughness},i.uniforms.wbMetallic={value:o.metallic},i.fragmentShader=i.fragmentShader.replace("void main() {",`${Ml}
7184
+ void main() {`).replace("#include <opaque_fragment>",`outgoingLight = volterWorkbenchLighting(diffuseColor.rgb, normal, isOrthographic ? vec3(0.0, 0.0, 1.0) : normalize(vViewPosition));
7185
+ #include <opaque_fragment>`)},a.customProgramCacheKey=()=>"volter-blender-workbench",a}const I=S().finite(),be=$([I,I,I]),vn=$([S().int().nonnegative(),S().int().nonnegative()]),lt={name:E(),domain:W(["POINT","EDGE","FACE","CORNER"])},Dl=ca("type",[P({...lt,type:j("FLOAT2"),data:z($([I,I]))}).strict(),P({...lt,type:j("FLOAT_VECTOR"),data:z(be)}).strict(),P({...lt,type:j("FLOAT_COLOR"),data:z($([I,I,I,I]))}).strict(),P({...lt,type:j("BYTE_COLOR"),data:z($([I,I,I,I]))}).strict(),P({...lt,type:j("QUATERNION"),data:z($([I,I,I,I]))}).strict(),P({...lt,type:j("FLOAT4"),data:z($([I,I,I,I]))}).strict(),P({...lt,type:j("FLOAT4X4"),data:z(z(I).length(16))}).strict(),P({...lt,type:j("INT16_2D"),data:z($([S().int(),S().int()]))}).strict(),P({...lt,type:j("INT32_2D"),data:z($([S().int(),S().int()]))}).strict(),P({...lt,type:j("FLOAT"),data:z(I)}).strict(),P({...lt,type:j("INT"),data:z(S().int())}).strict(),P({...lt,type:j("INT8"),data:z(S().int())}).strict(),P({...lt,type:j("BOOLEAN"),data:z(q())}).strict(),P({...lt,type:j("STRING"),data:z(E())}).strict()]),Cl=P({positions:B(Float32Array),normals:B(Float32Array).nullable(),uv:B(Float32Array).nullable(),uvLayers:z(P({name:E(),data:B(Float32Array)}).strict()).optional(),attributeLayers:z(P({name:E(),data:B(Float32Array)}).strict()).optional(),orco:B(Float32Array).nullable().optional(),indices:B(Uint32Array),groups:z(P({start:S().int().nonnegative(),count:S().int().nonnegative(),materialIndex:S().int().nonnegative()}).strict()),hash:E()}).strict(),kl=P({v:z(be),f:z(z(S().int().nonnegative())),e:z(vn).optional(),edge_order:z(vn).optional(),m:z(S().int().nonnegative()).optional(),s:z(q()).optional(),sharp:z(vn).optional(),seams:z(vn).optional(),creases:z($([I,I,I])).optional(),attributes:z(Dl).optional(),active_uv:E().nullable().optional(),render_uv:E().nullable().optional()}).strict(),$l=P({store:S().int().optional(),revision:S().int(),unchanged:j(!0)}).strict(),Ll=P({co:B(Float64Array),cornerNormal:B(Float32Array).optional(),orco:B(Float32Array).optional(),faceStart:B(Uint32Array),corner:B(Uint32Array),cornerEdge:B(Int32Array),edge:B(Uint32Array),edgeSharp:B(Uint8Array),edgeSeam:B(Uint8Array),edgeCrease:B(Float32Array),material:B(Uint32Array),smooth:B(Uint8Array),vertSelect:B(Uint8Array),vertHide:B(Uint8Array),edgeSelect:B(Uint8Array),edgeHide:B(Uint8Array),faceSelect:B(Uint8Array),faceHide:B(Uint8Array)}).strict(),Vl=P({name:E(),domain:W(["POINT","EDGE","FACE","CORNER"]),type:E(),data:ua(o=>ArrayBuffer.isView(o))}).strict(),jl=P({columns:Ll,attributes:z(Vl),activeUv:E().nullable(),renderUv:E().nullable(),counts:P({verts:S().int().nonnegative(),edges:S().int().nonnegative(),faces:S().int().nonnegative(),corners:S().int().nonnegative()}).strict(),revision:S().int().nonnegative()}).strict(),Bl=jt([Cl,jl,kl,$l]),jo=new Set;function Ul(o){const t=new Blob([o],{type:"image/png"}),n=new Je;let e=!1;n.addEventListener("dispose",()=>{e=!0,n.image?.close?.()});const r=createImageBitmap(t,{imageOrientation:"flipY",premultiplyAlpha:"none"}).then(a=>{if(e){a.close();return}n.image=a,n.needsUpdate=!0,vt()}).finally(()=>{jo.delete(r)});return jo.add(r),r.catch(()=>{}),{texture:n,ready:r}}function Wl(o,t,n,e){const r=new Tn(o,t,n,Pn,Ke);return r.flipY=!1,r.colorSpace=e==="data"?no:Mt,r.needsUpdate=!0,r}function Hl(o,t,n){if(t.length===0)throw new Error(`Runtime image ${o} is tiled with no tiles`);const e=Math.max(...t.map(s=>s.width)),r=Math.max(...t.map(s=>s.height)),a=new Uint8Array(e*r*4*t.length),i=Math.max(...t.map(s=>s.number-1001))+1,c=new Float32Array(i*2*4);for(let s=0;s<i;s++)c[s*4]=-1;t.forEach((s,l)=>{const _=s.rgba??(s.rgbaBase64?Un(s.rgbaBase64):void 0);if(!_)throw new Error(`Runtime image ${o} tile ${s.number} carries no raster`);for(let d=0;d<s.height;d++)a.set(_.subarray(d*s.width*4,(d+1)*s.width*4),(l*r+d)*e*4);const h=s.number-1001;c[h*4]=l,c.set([0,0,s.width/e,s.height/r],(i+h)*4)});const u=new Qe(a,e,r,t.length);u.colorSpace=n==="data"?no:Mt,u.magFilter=Lt,u.minFilter=Jo,u.generateMipmaps=!0,u.needsUpdate=!0;const f=new Tn(c,i,2,Pn,Yo);return f.magFilter=f.minFilter=jn,f.needsUpdate=!0,{tiles:u,map:f,frame:t}}const ql=P({width:S().int().positive(),height:S().int().positive(),revision:S().int().nonnegative(),rgba:B(Uint8Array).optional(),rgbaBase64:E().optional(),colorspace:W(["sRGB","data"]).optional(),tiles:z(P({number:S().int().min(1001),width:S().int().positive(),height:S().int().positive(),rgba:B(Uint8Array).optional(),rgbaBase64:E().optional()}).strict()).optional()}).strict(),Gl=P({revision:S().int().nonnegative(),png:B(Uint8Array).optional(),pngBase64:E().optional()}).strict(),Xl=jt([ql,Gl]),kn=P({image:P({name:E(),revision:S().int().nonnegative()}).strict(),extension:W(["REPEAT","EXTEND","MIRROR","CLIP"]).default("REPEAT"),uv:E(),tint:$([I,I,I]).optional()}).strict(),Yl=P({name:E(),color:$([I,I,I,I]),roughness:I,metallic:I,transmission:I,ior:I,physical:ol.optional(),normal_texture:kn.optional(),normal_strength:I.default(1),normal_space:W(["TANGENT","OBJECT"]).default("TANGENT"),normal_directx:q().default(!1),texture:kn.optional(),roughness_texture:kn.optional(),emission:P({color:$([I,I,I]),strength:I}).strict().optional(),graph:Nr.optional(),viewport:P({color:$([I,I,I,I]),roughness:I,metallic:I}).strict().optional()}).strict(),Zl=P({session:E(),revision:S().int().nonnegative(),volumes:_t(E(),me).default({}),lights:_t(E(),mr).default({}),world:yr.nullable().default(null),meshes:_t(E(),Bl),materials:_t(E(),Yl),images:_t(E(),Xl).default({}),objects:z(P({id:E(),name:E(),type:W(["MESH","CURVE","SURFACE","FONT","META","ARMATURE","LATTICE","VOLUME","EMPTY","CAMERA","LIGHT","SPEAKER","GREASEPENCIL","POINTCLOUD","LIGHT_PROBE"]),mesh:E().nullable(),volume:E().nullable().optional(),light:E().nullable().optional(),materials:z(E().nullable()),matrix:z($([I,I,I,I])).length(4),visible:q(),render_visible:q().default(!0),selected:q(),parent:E().nullable(),texspace:$([$([I,I,I]),$([I,I,I])]).optional(),default_color:E().optional()}).strict()),active:E().nullable(),mode:E(),cameras:_t(E(),_t(E(),ne())).default({}),warnings:z(E()).default([]),updated:z(E()).default([]),frame:S().int().default(0),armatures:_t(E(),ha).default({}),weights:sl.nullable().default(null),cursor:ml.optional(),camera_view:P({scene_camera:E().nullable(),view_layer_cameras:z(E()),aspect:S().finite().positive()}).optional(),light_distances:_t(E(),$([S().finite(),S().finite()])).default({}),empties:_t(E(),xl).default({}),view:P({location:$([S(),S(),S()]),rotation:$([S(),S(),S(),S()]),distance:S().finite(),perspective:W(["PERSP","ORTHO","CAMERA"]),lens:S().finite().positive().default(50)}).nullable().optional(),subject:P({frame:S().int(),body:E(),markers:z($([S().int(),E()]))}).optional(),units:P({system:W(["NONE","METRIC","IMPERIAL"]),scale_length:S().finite()}).optional()}).strict();function Ql(o,t){for(let n=0,e=o.length-1;n<o.length&&e>=0;n++,e--){if(o[n][0]===t)return o[n][1];if(n===e)break;if(o[e][0]===t)return o[e][1]}return null}const Kl={METRIC:[[1e-6,"Micrometers"],[.001,"Millimeters"],[.01,"Centimeters"],[.1,"10 Centimeters"],[1,"Meters"],[10,"10 Meters"],[100,"100 Meters"],[1e3,"Kilometers"]],IMPERIAL:[[254e-7,"Thou"],[.0254,"Inches"],[.3048,"Feet"],[.9144,"Yards"],[20.1168,"Chains"],[201.168,"Furlongs"],[1609.344,"Miles"]]};class co{constructor(){this.root=new ot,this.objects=new Map,this.meshes=new Map,this.volumes=new Map,this.materials=new Map,this.lights=new Map,this.lighting=new br,this.world=new ro,this.armatureOverlay=new Aa,this.weightOverlay=new _l,this.cursorOverlay=new gl,this.extrasOverlay=new wl,this.armatureRoot=new ot,this.weightRoot=new ot,this.cursorRoot=new ot,this.cameraExtrasRoot=new ot,this.lightExtrasRoot=new ot,this.emptyExtrasRoot=new ot,this.rendered=!1,this.heldRendered=null,this.worldApplied=null,this.worldKey="null",this.capturing=!1,this.workbench=!1,this.workbenchMaterials=new Map,this.fallback=new ln({color:12172998,roughness:.72}),this.textures=new Map,this.textureNames=new Map,this.roughnessTextureNames=new Map,this.textureSamplers=new nl,this.graphSamplers=new Map,this.photograph=!1,this.graphs=new Map,this.frame=null,this.retiredSessions=new Set,this.geometryBuilds=0,this.submittedMeshes=new Map,this.submitted=null,this.submittedSession=null,this.photographs=[],this.frameListeners=new Set,this.cameraViewZoom=Pl,this.cameraViewPan=Al,this.mode=null,this.awaitedImages=new Set,this.lookingThrough=null,this.root.name="Model",this.root.matrixAutoUpdate=!1,this.root.matrix.set(1,0,0,0,0,0,1,0,0,-1,0,0,0,0,0,1),this.root.updateMatrixWorld(!0);for(const[t,n]of[[this.armatureRoot,this.armatureOverlay.group],[this.weightRoot,this.weightOverlay.group],[this.cursorRoot,this.cursorOverlay.group],[this.cameraExtrasRoot,this.extrasOverlay.cameras],[this.lightExtrasRoot,this.extrasOverlay.lights],[this.emptyExtrasRoot,this.extrasOverlay.empties]])t.matrixAutoUpdate=!1,t.matrix.copy(this.root.matrix),t.add(n),t.updateMatrixWorld(!0);this.armatureRoot.name="BlenderBones",this.weightRoot.name="BlenderWeights",this.cursorRoot.name="Blender3DCursor",this.cameraExtrasRoot.name="BlenderCameraExtras";for(const t of[this.cameraExtrasRoot,this.lightExtrasRoot,this.emptyExtrasRoot])t.userData.volterPickable=!0;this.lightExtrasRoot.name="BlenderLightExtras",this.emptyExtrasRoot.name="BlenderEmptyExtras"}compiledGraph(t){const n=JSON.stringify(t);let e=this.graphs.get(n);return e||(e=Wr(t),this.graphs.size>256&&this.graphs.clear(),this.graphs.set(n,e)),e}subscribeFrames(t){return this.frameListeners.add(t),()=>{this.frameListeners.delete(t)}}onChange(t){const n=this.subscribeFrames(t),e=ma(t);return()=>{n(),e()}}blenderObjectName(t){for(const[n,e]of this.objects)if(e===t)return this.frame?.objects.find(r=>r.id===n)?.name??null;return null}savedView(){const t=this.frame?.view;if(!t)return null;const[n,e,r,a]=t.rotation,i=new gt(e,r,a,n),c=new x(...t.location).applyMatrix4(this.root.matrix),u=f=>f.applyQuaternion(i).applyMatrix4(this.root.matrix).normalize();return{target:c.toArray(),direction:u(new x(0,0,1)).toArray(),up:u(new x(0,1,0)).toArray(),distance:t.distance,projection:t.perspective==="ORTHO"?"orthographic":"perspective",lens:t.lens}}cameraViewCamera(){const t=this.frame,n=t?.camera_view;return!t||!n?null:n.scene_camera!==null&&t.cameras[n.scene_camera]?n.scene_camera:t.active!==null&&t.cameras[t.active]?t.active:n.view_layer_cameras.find(e=>t.cameras[e])??null}blenderPose(t,n){const e=new X().copy(this.root.matrix).invert(),r=new X().compose(new x(...t),new gt(...n),new x(1,1,1)).premultiply(e),a=new x,i=new gt;return r.decompose(a,i,new x),{location:a.toArray(),rotation:[i.w,i.x,i.y,i.z]}}cameraView(t,n,e,r){const a=this.frame,i=Lo.safeParse(a?.cameras[t]);return!a?.camera_view||!i.success?null:Sl(i.data,this.root.matrix,n,e,r,a.camera_view.aspect)}subjectLine(t){const n=this.frame?.subject;if(n===void 0)return null;const e=t??n.frame,r=Ql(n.markers,e);return`(${e})${n.body}${r===null?"":` <${r}>`}`}gridUnitName(t){const n=this.frame?.units;if(n===void 0||n.system==="NONE")return null;const e=Kl[n.system],r=6*t,a=1/(n.scale_length||1);return(e.find(([c])=>c*a>r)??e[e.length-1])[1]}blenderSelection(){const t=this.frame;return t===null?{selected:[],active:null}:{selected:t.objects.filter(n=>n.selected).map(n=>n.name),active:t.active}}setStageMode(t){this.mode=t}stageMode(){return this.mode}objectForBlenderName(t){const n=this.frame?.objects.find(e=>e.name===t);return n===void 0?null:this.objects.get(n.id)??null}replacePresentedObject(t,n){for(const[e,r]of this.objects)if(r===t){const a=t.parent,i=[...t.children];t.removeFromParent();for(const c of i)n.add(c);a?.add(n),this.objects.set(e,n);return}}studioLights(){return this.lighting.group}overlayGroups(){return[{kind:"skeletons",object:this.armatureRoot},{kind:"weights",object:this.weightRoot},{kind:"cursor",object:this.cursorRoot},{kind:"cameras",object:this.cameraExtrasRoot},{kind:"lights",object:this.lightExtrasRoot},{kind:"empties",object:this.emptyExtrasRoot}]}placeCursor(t,n,e){const r=new Set(this.objects.values()),a=this.cursorOverlay.placementAt(t,n,e,this.root,i=>r.has(i));return a!==null&&(this.cursorOverlay.show(a),vt()),a}holdRendered(t){t!==this.heldRendered&&(this.heldRendered=t,!this.capturing&&this.report(t===null?this.applyRendered(!1):this.applyRendered(!0,t())))}refreshRendered(){if(this.heldRendered===null||this.capturing)return;const t=this.heldRendered();this.worldKeyFor(t)!==this.worldApplied&&this.report(this.applyRendered(!0,t))}worldKeyFor(t){const e=t.isOrthographicCamera?t.getWorldDirection(new x).toArray().map(r=>r.toFixed(1)).join(","):"";return`${t.uuid}:${e}:${this.worldKey}`}report(t){t.then(vt,n=>console.error(`Rendered shading could not be applied: ${n instanceof Error?n.message:String(n)}`))}setWorkbench(t){t!==this.workbench&&(this.workbench=t,this.applyWorkbench(),vt())}applyWorkbench(){const t=this.workbench&&!this.rendered,n=new Set;for(const e of this.frame?.objects??[]){if(e.mesh===null||e.volume)continue;const r=this.objects.get(e.id);if(!r?.isMesh)continue;const i=(e.materials.length?e.materials:[null]).map(c=>{const u=c===null?this.fallback:this.materials.get(c)??this.fallback;return t?this.workbenchFor(c,u.side,n):u});r.material=e.materials.length?i:i[0]}for(const[e,r]of this.workbenchMaterials)n.has(e)||(r.dispose(),this.workbenchMaterials.delete(e))}workbenchFor(t,n,e){const r=(t!==null?this.frame?.materials[t]?.viewport:void 0)??El,a=`${r.color.join(",")}|${r.roughness}|${r.metallic}|${n}`;e.add(a);let i=this.workbenchMaterials.get(a);return i||(i=Fl(r,n),this.workbenchMaterials.set(a,i)),i}renderedHeld(){return this.heldRendered!==null}async setRendered(t,n){return this.capturing=t,!t&&this.heldRendered!==null?this.applyRendered(!0,this.heldRendered()):this.applyRendered(t,n)}async applyRendered(t,n){const e=(t?Do(this.frame?.world)?.extinction:null)??new x;for(const a of[...this.materials.values(),this.fallback])al(a,e);this.rendered=t,this.lighting.setRendered(t);const r=t&&n?this.worldKeyFor(n):null;t?(this.capturing||r!==this.worldApplied)&&this.world.apply(this.root,this.frame?.world??null,n):this.world.clear(),this.worldApplied=this.capturing?null:r,this.applyVisibility(),this.applyWorkbench(),this.applyShadows(t,n),t&&(await hr(),await Promise.all([...this.textures.values()].map(a=>a.ready)),await this.world.ready())}applyShadows(t,n){this.root.updateMatrixWorld(!0);const e=[];for(const u of this.objects.values()){const f=u;if(f.isMesh&&(f.castShadow=t,f.receiveShadow=t,t&&f.visible)){const s=new yn().setFromObject(f);s.isEmpty()||e.push(s)}}if(!t||!e.length)return;const a=e.reduce((u,f)=>u.union(f),new yn).getBoundingSphere(new Ge),i=n?new Xe().setFromProjectionMatrix(new X().multiplyMatrices(n.projectionMatrix,n.matrixWorldInverse)):null,c=i?e.flatMap(u=>Tr(u,i)):[];for(const u of this.lights.values())u.isDirectionalLight&&n?Pr(u,c,e):gr(u,a.center,a.radius)}applyOverlays(t){const n=i=>{const c=t.objects.find(u=>u.name===i);return c===void 0?null:new X().set(...c.matrix.flat())},e=[...this.armatureOverlay.apply(t.armatures,n)],r=t.weights?this.objects.get(t.objects.find(i=>i.name===t.weights?.object)?.id??""):void 0,a=this.weightOverlay.apply(t.weights,r??null,t.weights?n(t.weights.object):null);return a!==null&&e.push(a),this.cursorOverlay.apply(t.cursor),this.applyExtras(t),e}setCameraViewShowing(t){this.lookingThrough!==t&&(this.lookingThrough=t,this.frame&&this.applyExtras(this.frame),vt())}applyExtras(t){const n={};for(const[e,r]of Object.entries(t.cameras)){const a=Lo.safeParse(r);a.success&&(n[e]=a.data)}this.extrasOverlay.apply({lookingThrough:this.lookingThrough,lightDistances:t.light_distances,objects:t.objects.filter(e=>e.visible),active:t.active,cameras:n,lights:t.lights,empties:t.empties,sceneCamera:t.camera_view?.scene_camera??null,renderAspect:t.camera_view?.aspect??1,presented:e=>{const r=t.objects.find(a=>a.name===e);return r?this.objects.get(r.id)??null:null},image:e=>{const r=this.textures.get(e);if(!r)return null;const a=r.texture.image,i=r.width||a?.width||0,c=r.height||a?.height||0;return(i===0||c===0)&&r.ready&&!this.awaitedImages.has(e)&&(this.awaitedImages.add(e),r.ready.then(()=>{this.awaitedImages.delete(e),this.frame&&this.applyExtras(this.frame),vt()},()=>this.awaitedImages.delete(e))),{texture:r.texture,width:i,height:c}}})}applyVisibility(){for(const t of this.frame?.objects??[]){const n=this.objects.get(t.id);if(n&&(n.visible=this.rendered?t.render_visible:t.visible),!t.light)continue;const e=this.lights.get(t.light);e&&(e.visible=this.rendered&&t.render_visible)}this.armatureOverlay.group.visible=!this.capturing,this.weightOverlay.group.visible=!this.capturing,this.cursorOverlay.group.visible=!this.capturing;for(const t of[this.extrasOverlay.cameras,this.extrasOverlay.lights,this.extrasOverlay.empties])t.visible=!this.capturing}applyFrame(t){const n=this.frame===null?null:{session:this.frame.session,revision:this.frame.revision},e=Zl.parse(t);if(this.retiredSessions.has(e.session))throw new Error("The runtime session was replaced; its delayed frame cannot overwrite the active model");if(this.frame?.session===e.session&&e.revision<this.frame.revision)throw new Error("The runtime frame is older than the displayed model");const r=new Set(e.objects.map(f=>f.id));if(r.size!==e.objects.length)throw new Error("Runtime object IDs must be unique");const a=new Map(e.objects.map(f=>[f.id,f]));for(const f of e.objects){if(f.mesh!==null&&!e.meshes[f.mesh])throw new Error(`Missing runtime mesh ${f.mesh}`);if(f.volume&&(!e.volumes[f.volume]||f.mesh!==null))throw new Error(`Invalid runtime volume ${f.volume}`);if(f.light&&(!e.lights[f.light]||f.mesh!==null))throw new Error(`Invalid runtime light ${f.light}`);for(const _ of f.materials)if(_!==null&&!e.materials[_])throw new Error(`Missing runtime material ${_}`);const s=new Set([f.id]);let l=f.parent;for(;l!==null;){if(s.has(l))throw new Error("Runtime parent cycle");s.add(l);const _=a.get(l);if(!_)throw new Error(`Missing runtime parent ${l}`);l=_.parent}}const i=new Map,c=new Map;try{for(const[f,s]of Object.entries(e.volumes)){const l=JSON.stringify(s);this.frame?.session===e.session&&this.volumes.get(f)?.signature===l||c.set(f,{signature:l,mesh:Ar(s)})}for(const[f,s]of Object.entries(e.meshes)){if("unchanged"in s){if(this.frame?.session===e.session&&this.meshes.has(f))continue;throw new Error(`${Sa}: the presenter does not hold runtime mesh ${f} (store ${s.store}, revision ${s.revision})`)}const l="hash"in s,_="columns"in s,h=_?`revision:${s.revision}`:l?s.hash:JSON.stringify(s);this.frame?.session===e.session&&this.meshes.get(f)?.signature===h||i.set(f,{signature:h,geometry:_?Wn(La({...s.columns,attributes:s.attributes,activeUv:s.activeUv,renderUv:s.renderUv},h)):l?Wn(s):Va(s)})}}catch(f){for(const s of i.values())s.geometry.dispose();for(const{mesh:s}of c.values())s.geometry.dispose(),s.material.dispose();throw f}this.frame?.session!==e.session&&(this.frame&&this.retiredSessions.add(this.frame.session),this.clear());for(const[f,s]of c){const l=this.volumes.get(f)?.mesh;l&&(l.removeFromParent(),l.geometry.dispose(),l.material.dispose()),this.volumes.set(f,s)}for(const[f,s]of i)this.meshes.get(f)?.geometry.dispose(),this.meshes.set(f,s),this.geometryBuilds++;for(const[f,s]of Object.entries(e.images)){const l=this.textures.get(f);if("width"in s){const m=s.rgba??(s.rgbaBase64?Un(s.rgbaBase64):void 0);if(!m)throw new Error(`Runtime image ${f} carries no raster`);const p=s.tiles?Hl(f,s.tiles,s.colorspace??"sRGB"):void 0;if(l?.udim&&(l.udim.tiles.dispose(),l.udim.map.dispose(),delete l.udim),l&&l.width===s.width&&l.height===s.height){const v=l.texture.image;if(v.data){v.data.set(m),l.texture.needsUpdate=!0,l.revision=s.revision,p&&(l.udim=p);continue}}l?.texture.dispose(),this.textures.set(f,{texture:Wl(m,s.width,s.height,s.colorspace??"sRGB"),width:s.width,height:s.height,revision:s.revision,...p?{udim:p}:{}});continue}const _=s.png??(s.pngBase64?Un(s.pngBase64):void 0);if(!_)throw new Error(`Runtime image ${f} carries no bytes`);l?.texture.dispose(),l?.udim?.tiles.dispose(),l?.udim?.map.dispose();const{texture:h,ready:d}=Ul(_);h.colorSpace=Mt,this.textures.set(f,{texture:h,ready:d,width:0,height:0,revision:s.revision,png:_.slice()})}for(const[f,s]of Object.entries(e.materials)){const l=this.materials.get(f)??new ln;l.name=s.name;const _=s.texture?.tint;s.texture!==void 0?l.color.setRGB(_?.[0]??1,_?.[1]??1,_?.[2]??1,ft):l.color.setRGB(s.color[0],s.color[1],s.color[2],ft),l.opacity=s.color[3];const h=l.opacity<1||s.graph!==void 0&&Rr(s.graph);l.transparent!==h&&(l.transparent=h,l.needsUpdate=!0),l.roughness=s.roughness,l.metalness=s.metallic,l.transmission=s.transmission,l.ior=s.ior,io(l,s.physical,{map:s.texture?.extension==="CLIP",roughness:s.roughness_texture?.extension==="CLIP",normal:s.normal_texture?.extension==="CLIP"});const d=s.normal_texture?.image.name;if(d===void 0)l.normalMap&&(this.textureSamplers.delete(`${f}:normal`),l.normalMap=null,l.needsUpdate=!0);else{const b=this.textures.get(d);if(!b)throw new Error(`${Qt}: missing normal image ${d}`);const w=this.textureSamplers.get(`${f}:normal`,b.texture,s.normal_texture.extension,b.ready,s.normal_texture.uv);l.normalMap!==w&&(l.normalMap=w,l.needsUpdate=!0);const R=s.normal_space==="OBJECT"?Ye:Ze;l.normalMapType!==R&&(l.normalMapType=R,l.needsUpdate=!0),l.normalScale.set(s.normal_strength,s.normal_strength*(s.normal_directx?-1:1))}s.emission?(l.emissive.setRGB(s.emission.color[0],s.emission.color[1],s.emission.color[2],ft),l.emissiveIntensity=s.emission.strength):(l.emissive.setRGB(0,0,0),l.emissiveIntensity=1);const m=s.roughness_texture?.image.name??null;if(m===null)this.roughnessTextureNames.has(f)&&(this.textureSamplers.delete(`${f}:roughness`),l.roughnessMap=null,this.roughnessTextureNames.delete(f),l.needsUpdate=!0);else{const b=this.textures.get(m);if(!b)throw new Error(`${Qt}: the presenter does not hold runtime image ${m} (revision ${s.roughness_texture.image.revision})`);const w=this.textureSamplers.get(`${f}:roughness`,b.texture,s.roughness_texture.extension,b.ready,s.roughness_texture.uv);l.roughnessMap!==w&&(l.roughnessMap=w,this.roughnessTextureNames.set(f,m),l.needsUpdate=!0)}const p=s.texture?.image.name??null;if(p===null)this.textureNames.has(f)&&(this.textureSamplers.delete(`${f}:color`),l.map=null,this.textureNames.delete(f),l.needsUpdate=!0);else{const b=this.textures.get(p);if(!b)throw new Error(`${Qt}: the presenter does not hold runtime image ${p} (revision ${s.texture.image.revision})`);const w=this.textureSamplers.get(`${f}:color`,b.texture,s.texture.extension,b.ready,s.texture.uv);l.map!==w&&(l.map=w,this.textureNames.set(f,p),l.needsUpdate=!0)}const v=s.graph?this.compiledGraph(s.graph):null,g=new Set;qr(l,v,b=>{const w=this.textures.get(b.name);if(!w)throw new Error(`${Qt}: the presenter does not hold runtime image ${b.name} (revision ${b.revision})`);if(b.tiled){if(!w.udim)throw new Error(`${Qt}: runtime image ${b.name} arrived without its UDIM tiles`);return w.udim}const R=`${f}:graph:${b.node}`;g.add(R);const T=this.textureSamplers.get(R,w.texture,b.extension,w.ready),A=b.closest?jn:Lt,O=b.closest?jn:b.mipmap?Jo:Lt;return(T.magFilter!==A||T.minFilter!==O)&&(T.magFilter=A,T.minFilter=O,T.needsUpdate=!0),T},this.photograph);for(const b of this.graphSamplers.get(f)??[])g.has(b)||this.textureSamplers.delete(b);this.graphSamplers.set(f,g),this.materials.set(f,l)}for(const f of e.objects){let s=this.objects.get(f.id);const l=f.volume?this.volumes.get(f.volume).mesh:null;if((!s||(l?s!==l:!!s.isMesh!=(f.mesh!==null)))&&(s?.removeFromParent(),s=l??(f.mesh!==null?new Tt(this.meshes.get(f.mesh).geometry,this.fallback):new Go),this.objects.set(f.id,s)),s.name=f.name,f.type==="CAMERA"||f.type==="LIGHT"||f.type==="EMPTY"?s.userData.volterOwnOverlay=!0:delete s.userData.volterOwnOverlay,s.matrixAutoUpdate=!1,s.matrix.set(...f.matrix.flat()),f.parent){const _=new X().set(...a.get(f.parent).matrix.flat());s.matrix.premultiply(_.invert())}if(s.matrix.decompose(s.position,s.quaternion,s.scale),f.texspace?s.userData.blenderTexspace=f.texspace:delete s.userData.blenderTexspace,f.default_color!==void 0?s.userData.blenderDefaultColor=f.default_color:delete s.userData.blenderDefaultColor,f.mesh!==null){const _=s;_.geometry=this.meshes.get(f.mesh).geometry,_.material=f.materials.length?f.materials.map(h=>h===null?this.fallback:this.materials.get(h)):this.fallback,Zr(_)}if(f.light){const _=this.lights.get(f.light)??null,h=vr(e.lights[f.light],_);_&&_!==h&&(_.removeFromParent(),_.dispose()),h.parent!==s&&s.add(h),h.userData.volterOwnOverlay=!0,xr(h,s),this.lights.set(f.light,h)}}for(const f of e.objects){const s=this.objects.get(f.id),l=f.parent===null?this.root:this.objects.get(f.parent);s.parent!==l&&l.add(s)}for(const[f,s]of this.objects)r.has(f)||(s.removeFromParent(),this.objects.delete(f));for(const[f,s]of this.volumes)e.volumes[f]||(s.mesh.geometry.dispose(),s.mesh.material.dispose(),this.volumes.delete(f));for(const[f,s]of this.meshes)e.meshes[f]||(s.geometry.dispose(),this.meshes.delete(f));for(const[f,s]of this.materials)if(!e.materials[f]){for(const l of["normal","roughness","color"])this.textureSamplers.delete(`${f}:${l}`);for(const l of this.graphSamplers.get(f)??[])this.textureSamplers.delete(l);this.graphSamplers.delete(f),s.dispose(),this.materials.delete(f)}for(const[f,s]of this.lights)e.lights[f]||(s.removeFromParent(),s.dispose(),this.lights.delete(f));this.root.updateMatrixWorld(!0),this.frame={...e,meshes:{},volumes:{}},this.worldKey=JSON.stringify(e.world??null);const u=this.applyOverlays(e);u.length&&(this.frame={...this.frame,warnings:[...this.frame.warnings,...u]}),this.applyVisibility(),this.applyWorkbench(),this.heldRendered!==null&&!this.capturing&&this.report(this.applyRendered(!0,this.heldRendered()));for(const f of[...this.frameListeners])f();return{...this.inspect(),held:n}}inspect(){return{session:this.frame?.session,revision:this.frame?.revision,active:this.frame?.active,mode:this.frame?.mode,geometryBuilds:this.geometryBuilds,objects:[...this.objects].map(([t,n])=>({id:t,name:n.name,uuid:n.uuid,geometry:n.geometry?.uuid,visible:n.visible}))}}snapshot(){return this.frame}captureSnapshot(){const t=this.frame;if(!t)throw new Error("Blender capture requires a presented frame");const n=structuredClone({...t,images:{},armatures:{},weights:null});for(const[u,{signature:f,geometry:s}]of this.meshes){const l=d=>{const m=s.getAttribute(d);if(!m)return null;if(!(m instanceof it))throw new Error(`Blender capture cannot copy interleaved ${d}`);return new Float32Array(m.array)},_=l("position");if(!_)throw new Error(`Blender capture mesh ${u} has no positions`);const h=s.getIndex();n.meshes[u]={hash:f,positions:_,normals:l("normal"),uv:l("uv"),uvLayers:Object.entries(s.userData.blenderUvChannels??{}).map(([d,m])=>{const p=l(`uv${m}`);if(!p)throw new Error(`Blender capture mesh ${u} is missing UV layer ${d}`);return{name:d,data:p}}),orco:s.userData.blenderOrcoFromDoor?l("blenderOrco"):null,attributeLayers:(s.userData.blenderAttributes??[]).map(d=>{const m=l(Vt(d));if(!m)throw new Error(`Blender capture mesh ${u} is missing attribute ${d}`);return{name:d,data:m}}),indices:h?new Uint32Array(h.array):Uint32Array.from({length:_.length/3},(d,m)=>m),groups:s.groups.map(d=>({start:d.start,count:d.count,materialIndex:d.materialIndex??0}))}}for(const[u,{signature:f}]of this.volumes)n.volumes[u]=me.parse(JSON.parse(f));const e=new Set(Object.values(n.materials).flatMap(u=>[u.texture?.image.name,u.roughness_texture?.image.name,u.normal_texture?.image.name,...Object.values(u.graph?.nodes??{}).map(f=>f.props.image?.name)].filter(f=>f!==void 0)));for(const u of e){const f=this.textures.get(u);if(!f)throw new Error(`Blender capture image ${u} is not resident`);if(f.png)n.images[u]={revision:f.revision,png:f.png.slice()};else{const s=f.texture.image?.data;if(!(s instanceof Uint8Array))throw new Error(`Blender capture image ${u} has no resident raster`);n.images[u]={revision:f.revision,width:f.width,height:f.height,rgba:s.slice(),colorspace:f.texture.colorSpace===no?"data":"sRGB",...f.udim?{tiles:f.udim.frame}:{}}}}const r=this.createWorldVolumePass(),a=new co;a.photograph=!0;let i=!1;const c=()=>{i||(i=!0,r?.dispose(),a.dispose(),a.root.removeFromParent())};try{a.applyFrame(n),this.root.updateWorldMatrix(!0,!1),a.root.matrix.copy(this.root.matrixWorld),a.root.updateMatrixWorld(!0)}catch(u){throw c(),u}return{effect:r,root:a.root,session:t.session,revision:t.revision,prepare:u=>{if(i)throw new Error("Blender capture snapshot is disposed");return a.setRendered(!0,u)},dispose:c}}createWorldVolumePass(){const t=Do(this.frame?.world);return t?new il(t):void 0}recordPresentation(t){if(typeof t!="object"||t===null)return;const n=t,e=n.meshes;if(typeof e!="object"||e===null)return;const r=typeof n.session=="string"?n.session:null;r!==this.submittedSession&&(this.submittedMeshes.clear(),this.photographs.length=0,this.submittedSession=r);const a=e;for(const[i,c]of Object.entries(a))typeof c=="object"&&c!==null&&!("unchanged"in c)&&this.submittedMeshes.set(i,c);for(const i of[...this.submittedMeshes.keys()])i in a||this.submittedMeshes.delete(i);this.submitted={...n,meshes:Object.fromEntries(this.submittedMeshes)}}recordPhotograph(t){this.photographs.push(t)}observations(){return{presentation:this.submitted,photographs:this.photographs}}clear(){for(const t of this.lights.values())t.removeFromParent(),t.dispose();this.lights.clear();for(const t of this.objects.values())t.removeFromParent();for(const t of this.meshes.values())t.geometry.dispose();for(const t of this.materials.values())t.dispose();for(const{mesh:t}of this.volumes.values())t.geometry.dispose(),t.material.dispose();for(const{texture:t,udim:n}of this.textures.values())t.dispose(),n?.tiles.dispose(),n?.map.dispose();this.textures.clear(),this.textureNames.clear(),this.roughnessTextureNames.clear(),this.textureSamplers.clear(),this.volumes.clear(),this.objects.clear(),this.meshes.clear(),this.materials.clear()}dispose(){this.clear(),this.fallback.dispose(),this.lighting.dispose(),this.world.dispose(),this.armatureOverlay.dispose(),this.weightOverlay.dispose(),this.cursorOverlay.dispose(),this.extrasOverlay.dispose();for(const t of this.workbenchMaterials.values())t.dispose();this.workbenchMaterials.clear(),this.frame=null,this.retiredSessions.clear(),this.submittedMeshes.clear(),this.submitted=null,this.submittedSession=null,this.photographs.length=0}}const ii=new co;function ye(o){const t=atob(o),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}function $n(o){const t=ye(o);return new Float32Array(t.buffer,t.byteOffset,t.byteLength>>2)}function Jl(o){const t=ye(o);return new Uint16Array(t.buffer,t.byteOffset,t.byteLength>>1)}function ti(o){return new X().set(...o.flat())}function Bo(o,t){return[o.object,o.mesh,o.armature,o.vertexCount,o.bones.length,t].join("|")}class ni{#n=new Map;#o=null;#a=null;#t=null;#i=null;#e=null;#l=null;#s=new Set;#u=0;#_=[];#r=0;get version(){return this.#u}get engineCalls(){return this.#r}subscribe(t){return this.#s.add(t),()=>this.#s.delete(t)}#f(){this.#u++;for(const t of[...this.#s])t()}state(){const t=this.#t,n=t?.frameStart??1,e=t?.frameEnd??250,r=t?.fps??24;return{frame:this.frame(),start:n,end:e,fps:r,action:t?.action??null,object:t?.object??null,armature:t?.armature??null,bones:[...this.#n.values()].reduce((a,i)=>a+i.bones.length,0),keyframes:t?.keyframes??[],summary:t?.summary??[],clipStart:t?.clipStart??null,clipEnd:t?.clipEnd??null,tracks:t?.tracks.length??0,bound:[...this.#n.keys()],warnings:this.#_,engineCalls:this.#r,blenderFrame:t?.frameCurrent??null}}playhead(){return this.#t?this.frame():null}frame(){const t=this.#t;return!t||!this.#a||t.clipStart===void 0?t?.frameCurrent??1:this.#i!==null?this.#i:t.clipStart+this.#a.time*t.fps}get playable(){return this.#a!==null}async bind(t,n){this.#r++;const e=await n.rig();if(!e)return;const r=[],a=new Set;let i=!1;for(const l of e.rigs){if(!l.object||!l.armature||!l.skinIndexBase64||!l.skinWeightBase64){l.reason&&r.push(l.reason);continue}a.add(l.object);const _=Bo(l,e.frame);if(this.#n.get(l.object)?.signature===_)continue;const h=this.#d(t,l,e.frame,r);h&&(this.#n.get(l.object)?.skeleton.dispose(),this.#n.set(l.object,h),i=!0)}for(const[l,_]of[...this.#n])a.has(l)||(_.skeleton.dispose(),_.boneRoot.removeFromParent(),this.#n.delete(l),i=!0);this.#r++;const c=await n.clip(),u=this.#t,f=c?.action!==u?.action||c?.tracks.length!==u?.tracks.length||c?.clipStart!==u?.clipStart||c?.clipEnd!==u?.clipEnd;this.#t=c??null,c?.reason&&r.push(c.reason),c&&(f||i)&&this.#h(t,c,r);const s=this.#e?.snapshot().playbackState==="playing";c&&!s&&u?.frameCurrent!==c.frameCurrent&&(this.#c(c.frameCurrent),this.#e&&c.fps>0&&this.#e.seek(c.frameCurrent/c.fps)),this.#_=r,this.#f()}#d(t,n,e,r){const a=t.objectForBlenderName(n.object??""),i=t.objectForBlenderName(n.armature??"");if(!a||!i)return null;const c=a,u=c.geometry;if(!u)return null;const f=u.getAttribute("blenderVertex");if(!f)return r.push(`"${n.object}" cannot be skinned: its presented geometry carries no \`blenderVertex\` attribute, so a per-Blender-vertex weight cannot be expanded onto its drawn vertices.`),null;if(n.vertexCount===0)return null;let s=0;for(let T=0;T<f.count;T++)s=Math.max(s,f.getX(T));if(s>=n.vertexCount)return r.push(`"${n.object}" is not skinned here: its presented geometry references Blender vertex ${s} while the mesh declares ${n.vertexCount}, which is a generative modifier (Subdivision, Mirror, Array…) between the two. Blender's own viewport shows the evaluated result; this presenter shows the exported columns unskinned.`),null;const l=Jl(n.skinIndexBase64??""),_=$n(n.skinWeightBase64??""),h=f.count,d=new Uint16Array(h*4),m=new Float32Array(h*4);for(let T=0;T<h;T++){const A=f.getX(T);for(let O=0;O<4;O++)d[T*4+O]=l[A*4+O]??0,m[T*4+O]=_[A*4+O]??0}u.setAttribute("skinIndex",new ta(d,4)),u.setAttribute("skinWeight",new bt(m,4));const p=new ot;p.name=`${n.armature}:bones`;const v=[],g=n.bones.map(T=>ti(T.pose)),b=new Map(n.bones.map((T,A)=>[T.name,A]));n.bones.forEach((T,A)=>{const O=new na;O.name=T.name,v.push(O);const M=T.parent===null?void 0:b.get(T.parent);(M===void 0?g[A].clone():g[M].clone().invert().multiply(g[A])).decompose(O.position,O.quaternion,O.scale),(M===void 0?p:v[M]).add(O)}),i.add(p);const w=new oa(u,c.material);w.name=c.name,w.matrixAutoUpdate=!1,w.matrix.copy(c.matrix),w.matrix.decompose(w.position,w.quaternion,w.scale),w.userData=c.userData,w.frustumCulled=!1,t.replacePresentedObject(c,w),t.root.updateMatrixWorld(!0);const R=new ea(v);return w.bind(R,w.matrixWorld.clone()),n.constrainedBones?.length&&r.push(`Bone constraints on ${n.constrainedBones.join(", ")}: the clip is derived from the F-Curves alone, so those bones play their channels rather than Blender's solved pose.`),n.unmappedGroups?.length&&r.push(`${n.object} carries vertex groups no bone is named for (${n.unmappedGroups.join(", ")}); they weight nothing here, exactly as they deform nothing in Blender.`),{object:n.object??"",armature:n.armature??"",mesh:w,boneRoot:p,bones:v,skeleton:R,frame:e,signature:Bo(n,e)}}#h(t,n,e){if(this.#o?.stopAllAction(),this.#o=null,this.#a=null,!n.tracks.length||n.clipStart===void 0||n.clipEnd===void 0)return;const r=n.armature?t.objectForBlenderName(n.armature):null;if(!r)return;const a=new Map;for(const l of this.#n.values())if(l.armature===n.armature)for(const _ of l.bones)a.set(_.name,_);const i=[],c=new Set;for(const l of n.tracks){const _=a.get(l.bone);if(!_){c.add(l.bone);continue}const h=$n(l.timeBase64),d=$n(l.valueBase64),m=`${_.uuid}.${l.property}`;i.push(l.property==="quaternion"?new aa(m,Array.from(h),Array.from(d)):new ra(m,Array.from(h),Array.from(d)))}if(c.size&&e.push(`${n.action} animates ${[...c].join(", ")}, which this binding has no bone for.`),!i.length)return;const u=n.duration??(n.clipEnd-n.clipStart)/n.fps,f=new la(r),s=f.clipAction(new ia(n.action??"action",u,i));s.setLoop(sa,Number.POSITIVE_INFINITY),s.play(),this.#o=f,this.#a=s,this.#c(n.frameCurrent),this.#m()}#c(t){const n=this.#t;if(!n||!this.#o||n.clipStart===void 0||n.clipEnd===void 0)return;const e=Math.min(n.clipEnd,Math.max(n.clipStart,t));this.#i=e;const r=(n.clipEnd-n.clipStart)/n.fps;this.#o.setTime(Math.min(r-1e-4,(e-n.clipStart)/n.fps)),this.#m()}#m(){for(const t of this.#n.values())t.boneRoot.updateMatrixWorld(!0),t.skeleton.update()}get scene(){return this.#t?.scene??null}async writeBookmark(){const t=Math.round(this.frame()),n=this.#t;if(!n)return t;const e=n.scene;return!e||n.frameCurrent===t||(this.#r++,await _a(`bpy.data.scenes[${JSON.stringify(e)}]`,"frame_current",t,void 0,!1),this.#t={...n,frameCurrent:t},this.#f()),t}get transport(){return this.#e}attachTo(t){this.#l?.(),this.#e=t;const n=t.attach({id:this.#t?.action??"blender-action",label:this.#t?.action??"Action",range:()=>{const i=this.#t,c=i?.fps||24;return{start:(i?.frameStart??1)/c,end:(i?.frameEnd??250)/c,fps:c}},seek:i=>this.seekSeconds(i)}),e=t.onSettled(()=>{this.writeBookmark()}),r=()=>{e(),n(),this.#e===t&&(this.#e=null),this.#l=null};this.#l=r;const a=this.#t;return a&&a.fps>0&&t.seek(a.frameCurrent/a.fps),r}seekSeconds(t){const n=this.#t?.fps||24;this.#c(Math.round(t*n)),this.#f()}keyframes(){return(this.#t?.keyframes??[]).map(t=>t.frame)}dispose(){this.#l?.(),this.#o?.stopAllAction(),this.#o=null,this.#a=null;for(const t of this.#n.values())t.skeleton.dispose(),t.boneRoot.removeFromParent();this.#n.clear()}}const we=new ni;function si(o){return we.subscribe(o)}function fi(){return we.version}export{we as a,fi as b,ii as c,si as s};
@@ -1,12 +1,12 @@
1
- import{a as p}from"./jsx-runtime-DPjLkJKQ.js";import{hc as fe,dI as de,q as $,cN as me,cR as L,fG as G,di as X,hd as ge,cQ as he,dF as ye,dH as je}from"./index-CaG87ZF-.js";import{c as _e,a as H}from"./blender-runtime-skin-B_tOz5j5.js";import{r as C}from"./index-nmcBqr7Y.js";import{u as ve,v as z,w as K,x as we,y as re,z as Q,t as ae,A as ke,B as Oe,C as ie,D as Ee,k as Y,E as J,F as Se,G as Ce}from"./blender-runtime-host-CuniE0sy.js";import"./index-CtzuWnCS.js";import{a as xe}from"./three-contract-Dkt6PmWY.js";import{o as Z,b as W}from"./viewport-door-DVkMQazS.js";import{d9 as Ne}from"./three.core-3arARmh6.js";import"./_commonjsHelpers-D6-XlEtG.js";import"./index-FUuS4qwW.js";import"./client-DNXj_opT.js";import"./index-D_NuPfjr.js";import"./index-CinJrH5C.js";import"./LineSegments2-DN9pUfWA.js";import"./three.module-BLhyNg0e.js";import"./preview-renderer-BrYNFV1p.js";import"./environment-Dg-YaLsA.js";import"./RoomEnvironment-BkknvS_I.js";import"./EXRLoader-CITMBvGd.js";import"./HDRLoader-BTGuGhVo.js";import"./renderer-ownership-BovSEcLv.js";import"./output-pass-HurwNl0G.js";import"./Pass-D1MRT672.js";import"./clip-planes-CnAI6DZn.js";import"./content-bounds-DKBD7nsv.js";import"./hierarchy-marks-C25dY2fR.js";import"./workspace-arrangement-DIMM7ska.js";function ue(r){const a=Number.isFinite(r)&&r>0?r:50;return{degrees:2*Math.atan(72/(2*a))*180/Math.PI,axis:"larger"}}fe("model",{camera:{fov:ue(50),opening:[.8187,.4458,.3617]},interaction:{bootTool:"select",boxSelect:"touch"},all:{lighting:{source:"studio",studioPreset:de.id,auto:null,tone:{mapper:"none",exposure:1}},xray:{enabled:!1,alpha:.5}},modes:{wireframe:{xray:{enabled:!0,alpha:0}},preview:{lighting:{source:"preview",auto:null,preview:{sceneLights:!1,sun:{enabled:!1},environment:{enabled:!0,image:"blender:forest",energy:1,rotation:0}},tone:{mapper:"agx",exposure:1}},backdrop:{source:"fill"}},rendered:{lighting:{source:"scene",auto:null,tone:{mapper:"agx",exposure:1}},backdrop:{source:"scene"}}},overlays:{selection:{origins:!0}},world:{upAxis:"z"}});function Fe(r){return`blender-${r.toLowerCase().replace(/_/g,"-")}`}function A(r){return r?.type==="TSE_SOME_ID"&&r.struct==="Object"&&r.object!==void 0}function se(r){if(r.struct)return r.struct}function ce(r,a){return{id:r.id,label:r.name,role:"entity",kind:Fe(r.icon),...se(r)?{typeLabel:se(r)}:{},parentId:a,childIds:r.children.map(o=>o.id),defaultExpanded:r.expanded}}const Ie={transform:!0,inspectorFields:!1,persist:!0},V=new Set;function Le(r){for(const a of V)if(a.documentId===r)return a;return V.size===1?[...V][0]:null}const Re=()=>({position:[0,0,0],rotation:[0,0,0,1],scale:[1,1,1]});function Me(r,a){r.updateWorldMatrix(!0,!1);const o=a.matrixWorld.clone().invert().multiply(r.matrixWorld).elements;return[[o[0],o[1],o[2],o[3]],[o[4],o[5],o[6],o[7]],[o[8],o[9],o[10],o[11]],[o[12],o[13],o[14],o[15]]]}function U(r,a){return`${r} needs a file, and this editor has no door to ask for one: the host's file door (\`EditorHost.files\`, \`@volter/editor-sdk/host\`) reads and writes project-relative paths and has no file-picker member, so there is nothing to open the workbench's own dialog through. Blender's row opens a file browser; run without one, the engine answers "${a}".`}const Ae=[{kind:"mesh.plane",label:"Plane",group:"Mesh",call:"mesh.primitive_plane_add"},{kind:"mesh.cube",label:"Cube",group:"Mesh",call:"mesh.primitive_cube_add"},{kind:"mesh.circle",label:"Circle",group:"Mesh",call:"mesh.primitive_circle_add"},{kind:"mesh.uv-sphere",label:"UV Sphere",group:"Mesh",call:"mesh.primitive_uv_sphere_add"},{kind:"mesh.ico-sphere",label:"Ico Sphere",group:"Mesh",call:"mesh.primitive_ico_sphere_add"},{kind:"mesh.cylinder",label:"Cylinder",group:"Mesh",call:"mesh.primitive_cylinder_add"},{kind:"mesh.cone",label:"Cone",group:"Mesh",call:"mesh.primitive_cone_add"},{kind:"mesh.torus",label:"Torus",group:"Mesh",call:"mesh.primitive_torus_add"},{kind:"mesh.grid",label:"Grid",group:"Mesh",call:"mesh.primitive_grid_add",separatorBefore:!0},{kind:"mesh.monkey",label:"Monkey",group:"Mesh",call:"mesh.primitive_monkey_add"},{kind:"curve.bezier",label:"Bézier",group:"Curve",call:"curve.primitive_bezier_curve_add"},{kind:"curve.bezier-circle",label:"Circle",group:"Curve",call:"curve.primitive_bezier_circle_add"},{kind:"curve.nurbs-curve",label:"Nurbs Curve",group:"Curve",call:"curve.primitive_nurbs_curve_add",separatorBefore:!0},{kind:"curve.nurbs-circle",label:"Nurbs Circle",group:"Curve",call:"curve.primitive_nurbs_circle_add"},{kind:"curve.path",label:"Path",group:"Curve",call:"curve.primitive_nurbs_path_add"},{kind:"curve.empty-hair",label:"Empty Hair",group:"Curve",call:"object.curves_empty_hair_add",separatorBefore:!0},{kind:"curve.fur",label:"Fur",group:"Curve",call:"object.quick_fur"},{kind:"surface.nurbs-curve",label:"Nurbs Curve",group:"Surface",call:"surface.primitive_nurbs_surface_curve_add"},{kind:"surface.nurbs-circle",label:"Nurbs Circle",group:"Surface",call:"surface.primitive_nurbs_surface_circle_add"},{kind:"surface.nurbs-surface",label:"Nurbs Surface",group:"Surface",call:"surface.primitive_nurbs_surface_surface_add"},{kind:"surface.nurbs-cylinder",label:"Nurbs Cylinder",group:"Surface",call:"surface.primitive_nurbs_surface_cylinder_add"},{kind:"surface.nurbs-sphere",label:"Nurbs Sphere",group:"Surface",call:"surface.primitive_nurbs_surface_sphere_add"},{kind:"surface.nurbs-torus",label:"Nurbs Torus",group:"Surface",call:"surface.primitive_nurbs_surface_torus_add"},{kind:"metaball.ball",label:"Ball",group:"Metaball",call:"object.metaball_add, type='BALL'"},{kind:"metaball.capsule",label:"Capsule",group:"Metaball",call:"object.metaball_add, type='CAPSULE'"},{kind:"metaball.plane",label:"Plane",group:"Metaball",call:"object.metaball_add, type='PLANE'"},{kind:"metaball.ellipsoid",label:"Ellipsoid",group:"Metaball",call:"object.metaball_add, type='ELLIPSOID'"},{kind:"metaball.cube",label:"Cube",group:"Metaball",call:"object.metaball_add, type='CUBE'"},{kind:"text",label:"Text",group:null,call:"object.text_add"},{kind:"point-cloud",label:"Point Cloud",group:null,call:"object.pointcloud_random_add"},{kind:"volume.import",label:"Import OpenVDB...",group:"Volume",call:"object.volume_import",refusal:`${U("Importing an OpenVDB volume","CANCELLED, with nothing created")} This build also has no OpenVDB at all (\`bpy.app.build_options.openvdb\` is False), so a file would not be read even with a picker.`},{kind:"volume.empty",label:"Empty",group:"Volume",call:"object.volume_add"},{kind:"grease-pencil.blank",label:"Blank",group:"Grease Pencil",call:"object.grease_pencil_add, type='EMPTY'"},{kind:"grease-pencil.stroke",label:"Stroke",group:"Grease Pencil",call:"object.grease_pencil_add, type='STROKE'"},{kind:"grease-pencil.monkey",label:"Monkey",group:"Grease Pencil",call:"object.grease_pencil_add, type='MONKEY'"},{kind:"grease-pencil.lineart-scene",label:"Scene Line Art",group:"Grease Pencil",call:"object.grease_pencil_add, type='LINEART_SCENE'",separatorBefore:!0},{kind:"grease-pencil.lineart-collection",label:"Collection Line Art",group:"Grease Pencil",call:"object.grease_pencil_add, type='LINEART_COLLECTION'"},{kind:"grease-pencil.lineart-object",label:"Object Line Art",group:"Grease Pencil",call:"object.grease_pencil_add, type='LINEART_OBJECT'"},{kind:"armature",label:"Armature",group:null,call:"object.armature_add"},{kind:"lattice.lattice",label:"Lattice",group:"Lattice",call:"object.add, type='LATTICE'"},{kind:"lattice.deform-selected",label:"Lattice Deform Selected",group:"Lattice",call:"object.lattice_add_to_selected"},{kind:"empty.plain-axes",label:"Plain Axes",group:"Empty",call:"object.empty_add, type='PLAIN_AXES'"},{kind:"empty.arrows",label:"Arrows",group:"Empty",call:"object.empty_add, type='ARROWS'"},{kind:"empty.single-arrow",label:"Single Arrow",group:"Empty",call:"object.empty_add, type='SINGLE_ARROW'"},{kind:"empty.circle",label:"Circle",group:"Empty",call:"object.empty_add, type='CIRCLE'"},{kind:"empty.cube",label:"Cube",group:"Empty",call:"object.empty_add, type='CUBE'"},{kind:"empty.sphere",label:"Sphere",group:"Empty",call:"object.empty_add, type='SPHERE'"},{kind:"empty.cone",label:"Cone",group:"Empty",call:"object.empty_add, type='CONE'"},{kind:"image.reference",label:"Reference...",group:"Image",call:"object.empty_image_add, background=False",refusal:U("A reference image","poll() failed, context is incorrect / Please select at least one image")},{kind:"image.background",label:"Background...",group:"Image",call:"object.empty_image_add, background=True",refusal:U("A background image","poll() failed, context is incorrect / Please select at least one image")},{kind:"image.mesh-plane",label:"Mesh Plane...",group:"Image",call:"image.import_as_mesh_planes",refusal:U("An image as a mesh plane","CANCELLED, with nothing created")},{kind:"image.empty-image",label:"Empty Image",group:"Image",call:"object.empty_add, type='IMAGE'"},{kind:"light.point",label:"Point",group:"Light",call:"object.light_add, type='POINT'"},{kind:"light.sun",label:"Sun",group:"Light",call:"object.light_add, type='SUN'"},{kind:"light.spot",label:"Spot",group:"Light",call:"object.light_add, type='SPOT'"},{kind:"light.area",label:"Area",group:"Light",call:"object.light_add, type='AREA'"},{kind:"light-probe.sphere",label:"Sphere",group:"Light Probe",call:"object.lightprobe_add, type='SPHERE'"},{kind:"light-probe.plane",label:"Plane",group:"Light Probe",call:"object.lightprobe_add, type='PLANE'"},{kind:"light-probe.volume",label:"Volume",group:"Light Probe",call:"object.lightprobe_add, type='VOLUME'"},{kind:"camera",label:"Camera",group:null,call:"object.camera_add"},{kind:"speaker",label:"Speaker",group:null,call:"object.speaker_add"},{kind:"force-field.force",label:"Force",group:"Force Field",call:"object.effector_add, type='FORCE'"},{kind:"force-field.wind",label:"Wind",group:"Force Field",call:"object.effector_add, type='WIND'"},{kind:"force-field.vortex",label:"Vortex",group:"Force Field",call:"object.effector_add, type='VORTEX'"},{kind:"force-field.magnetic",label:"Magnetic",group:"Force Field",call:"object.effector_add, type='MAGNET'"},{kind:"force-field.harmonic",label:"Harmonic",group:"Force Field",call:"object.effector_add, type='HARMONIC'"},{kind:"force-field.charge",label:"Charge",group:"Force Field",call:"object.effector_add, type='CHARGE'"},{kind:"force-field.lennard-jones",label:"Lennard-Jones",group:"Force Field",call:"object.effector_add, type='LENNARDJ'"},{kind:"force-field.texture",label:"Texture",group:"Force Field",call:"object.effector_add, type='TEXTURE'"},{kind:"force-field.curve-guide",label:"Curve Guide",group:"Force Field",call:"object.effector_add, type='GUIDE'"},{kind:"force-field.boid",label:"Boid",group:"Force Field",call:"object.effector_add, type='BOID'"},{kind:"force-field.turbulence",label:"Turbulence",group:"Force Field",call:"object.effector_add, type='TURBULENCE'"},{kind:"force-field.drag",label:"Drag",group:"Force Field",call:"object.effector_add, type='DRAG'"},{kind:"force-field.fluid-flow",label:"Fluid Flow",group:"Force Field",call:"object.effector_add, type='FLUID'"}],Be="collection-instance:";function Te(){const r=new Map;for(const a of Y().byId.values()){if(a.type!=="TSE_LAYER_COLLECTION")continue;const o=a.data;o===void 0||!o.startsWith("bpy.data.collections[")||r.has(a.name)||r.set(a.name,{kind:`${Be}${a.name}`,label:a.name,group:"Collection Instance",call:`object.collection_instance_add, collection=${P(a.name)}`})}return[...r.values()]}function q(){return[...Ae,...Te()]}function $e(r){const[a,...o]=r.call.split(", ");return`bpy.ops.${a}(${o.join(", ")})`}function P(r){return JSON.stringify(r)}async function D(r,a="Blender Python"){const o=["before = {o.name for o in bpy.data.objects}",r,"made = [o.name for o in bpy.data.objects if o.name not in before]",'print("\\n".join(made))'].join(`
2
- `),d=await J(o,!0,a);return d.error!==null?{made:[],error:d.error}:{made:d.result.split(`
1
+ import{a as p}from"./jsx-runtime-DPjLkJKQ.js";import{hd as fe,dJ as de,r as $,cO as me,cS as L,fH as G,dj as q,he as ge,cR as he,dG as ye,dI as je}from"./index-Cr9NTnJp.js";import{c as _e,a as H}from"./blender-runtime-skin-C_ATCb-z.js";import{r as C}from"./index-nmcBqr7Y.js";import{u as ve,v as z,w as K,x as we,y as re,z as Q,t as ae,A as ke,B as Oe,C as ie,D as Ee,k as Y,E as X,F as Se,G as Ce}from"./blender-runtime-host-Cbkie7m4.js";import"./index-CtzuWnCS.js";import{a as xe}from"./three-contract-Dkt6PmWY.js";import{o as Z,b as W}from"./viewport-door-AsLxGhLN.js";import{d9 as Ne}from"./three.core-3arARmh6.js";import"./_commonjsHelpers-D6-XlEtG.js";import"./index-FUuS4qwW.js";import"./client-DNXj_opT.js";import"./index-D_NuPfjr.js";import"./index-CinJrH5C.js";import"./LineSegments2-DN9pUfWA.js";import"./three.module-BLhyNg0e.js";import"./preview-renderer-BrYNFV1p.js";import"./environment-Dg-YaLsA.js";import"./RoomEnvironment-BkknvS_I.js";import"./EXRLoader-CITMBvGd.js";import"./HDRLoader-BTGuGhVo.js";import"./renderer-ownership-BovSEcLv.js";import"./output-pass-HurwNl0G.js";import"./Pass-D1MRT672.js";import"./clip-planes-CnAI6DZn.js";import"./content-bounds-7UyI42Vj.js";import"./hierarchy-marks-CndAXtie.js";import"./workspace-arrangement-dkubzCff.js";function ue(r){const a=Number.isFinite(r)&&r>0?r:50;return{degrees:2*Math.atan(72/(2*a))*180/Math.PI,axis:"larger"}}fe("model",{camera:{fov:ue(50),opening:[.8187,.4458,.3617]},interaction:{bootTool:"select",boxSelect:"touch"},all:{lighting:{source:"studio",studioPreset:de.id,auto:null,tone:{mapper:"none",exposure:1}},xray:{enabled:!1,alpha:.5}},modes:{wireframe:{xray:{enabled:!0,alpha:0}},preview:{lighting:{source:"preview",auto:null,preview:{sceneLights:!1,sun:{enabled:!1},environment:{enabled:!0,image:"blender:forest",energy:1,rotation:0}},tone:{mapper:"agx",exposure:1}},backdrop:{source:"fill"}},rendered:{lighting:{source:"scene",auto:null,tone:{mapper:"agx",exposure:1}},backdrop:{source:"scene"}}},overlays:{selection:{origins:!0}},world:{upAxis:"z"}});function Fe(r){return`blender-${r.toLowerCase().replace(/_/g,"-")}`}function A(r){return r?.type==="TSE_SOME_ID"&&r.struct==="Object"&&r.object!==void 0}function se(r){if(r.struct)return r.struct}function ce(r,a){return{id:r.id,label:r.name,role:"entity",kind:Fe(r.icon),...se(r)?{typeLabel:se(r)}:{},parentId:a,childIds:r.children.map(o=>o.id),defaultExpanded:r.expanded}}const Ie={transform:!0,inspectorFields:!1,persist:!0},V=new Set;function Le(r){for(const a of V)if(a.documentId===r)return a;return V.size===1?[...V][0]:null}const Re=()=>({position:[0,0,0],rotation:[0,0,0,1],scale:[1,1,1]});function Me(r,a){r.updateWorldMatrix(!0,!1);const o=a.matrixWorld.clone().invert().multiply(r.matrixWorld).elements;return[[o[0],o[1],o[2],o[3]],[o[4],o[5],o[6],o[7]],[o[8],o[9],o[10],o[11]],[o[12],o[13],o[14],o[15]]]}function U(r,a){return`${r} needs a file, and this editor has no door to ask for one: the host's file door (\`EditorHost.files\`, \`@volter/editor-sdk/host\`) reads and writes project-relative paths and has no file-picker member, so there is nothing to open the workbench's own dialog through. Blender's row opens a file browser; run without one, the engine answers "${a}".`}const Ae=[{kind:"mesh.plane",label:"Plane",group:"Mesh",call:"mesh.primitive_plane_add"},{kind:"mesh.cube",label:"Cube",group:"Mesh",call:"mesh.primitive_cube_add"},{kind:"mesh.circle",label:"Circle",group:"Mesh",call:"mesh.primitive_circle_add"},{kind:"mesh.uv-sphere",label:"UV Sphere",group:"Mesh",call:"mesh.primitive_uv_sphere_add"},{kind:"mesh.ico-sphere",label:"Ico Sphere",group:"Mesh",call:"mesh.primitive_ico_sphere_add"},{kind:"mesh.cylinder",label:"Cylinder",group:"Mesh",call:"mesh.primitive_cylinder_add"},{kind:"mesh.cone",label:"Cone",group:"Mesh",call:"mesh.primitive_cone_add"},{kind:"mesh.torus",label:"Torus",group:"Mesh",call:"mesh.primitive_torus_add"},{kind:"mesh.grid",label:"Grid",group:"Mesh",call:"mesh.primitive_grid_add",separatorBefore:!0},{kind:"mesh.monkey",label:"Monkey",group:"Mesh",call:"mesh.primitive_monkey_add"},{kind:"curve.bezier",label:"Bézier",group:"Curve",call:"curve.primitive_bezier_curve_add"},{kind:"curve.bezier-circle",label:"Circle",group:"Curve",call:"curve.primitive_bezier_circle_add"},{kind:"curve.nurbs-curve",label:"Nurbs Curve",group:"Curve",call:"curve.primitive_nurbs_curve_add",separatorBefore:!0},{kind:"curve.nurbs-circle",label:"Nurbs Circle",group:"Curve",call:"curve.primitive_nurbs_circle_add"},{kind:"curve.path",label:"Path",group:"Curve",call:"curve.primitive_nurbs_path_add"},{kind:"curve.empty-hair",label:"Empty Hair",group:"Curve",call:"object.curves_empty_hair_add",separatorBefore:!0},{kind:"curve.fur",label:"Fur",group:"Curve",call:"object.quick_fur"},{kind:"surface.nurbs-curve",label:"Nurbs Curve",group:"Surface",call:"surface.primitive_nurbs_surface_curve_add"},{kind:"surface.nurbs-circle",label:"Nurbs Circle",group:"Surface",call:"surface.primitive_nurbs_surface_circle_add"},{kind:"surface.nurbs-surface",label:"Nurbs Surface",group:"Surface",call:"surface.primitive_nurbs_surface_surface_add"},{kind:"surface.nurbs-cylinder",label:"Nurbs Cylinder",group:"Surface",call:"surface.primitive_nurbs_surface_cylinder_add"},{kind:"surface.nurbs-sphere",label:"Nurbs Sphere",group:"Surface",call:"surface.primitive_nurbs_surface_sphere_add"},{kind:"surface.nurbs-torus",label:"Nurbs Torus",group:"Surface",call:"surface.primitive_nurbs_surface_torus_add"},{kind:"metaball.ball",label:"Ball",group:"Metaball",call:"object.metaball_add, type='BALL'"},{kind:"metaball.capsule",label:"Capsule",group:"Metaball",call:"object.metaball_add, type='CAPSULE'"},{kind:"metaball.plane",label:"Plane",group:"Metaball",call:"object.metaball_add, type='PLANE'"},{kind:"metaball.ellipsoid",label:"Ellipsoid",group:"Metaball",call:"object.metaball_add, type='ELLIPSOID'"},{kind:"metaball.cube",label:"Cube",group:"Metaball",call:"object.metaball_add, type='CUBE'"},{kind:"text",label:"Text",group:null,call:"object.text_add"},{kind:"point-cloud",label:"Point Cloud",group:null,call:"object.pointcloud_random_add"},{kind:"volume.import",label:"Import OpenVDB...",group:"Volume",call:"object.volume_import",refusal:`${U("Importing an OpenVDB volume","CANCELLED, with nothing created")} This build also has no OpenVDB at all (\`bpy.app.build_options.openvdb\` is False), so a file would not be read even with a picker.`},{kind:"volume.empty",label:"Empty",group:"Volume",call:"object.volume_add"},{kind:"grease-pencil.blank",label:"Blank",group:"Grease Pencil",call:"object.grease_pencil_add, type='EMPTY'"},{kind:"grease-pencil.stroke",label:"Stroke",group:"Grease Pencil",call:"object.grease_pencil_add, type='STROKE'"},{kind:"grease-pencil.monkey",label:"Monkey",group:"Grease Pencil",call:"object.grease_pencil_add, type='MONKEY'"},{kind:"grease-pencil.lineart-scene",label:"Scene Line Art",group:"Grease Pencil",call:"object.grease_pencil_add, type='LINEART_SCENE'",separatorBefore:!0},{kind:"grease-pencil.lineart-collection",label:"Collection Line Art",group:"Grease Pencil",call:"object.grease_pencil_add, type='LINEART_COLLECTION'"},{kind:"grease-pencil.lineart-object",label:"Object Line Art",group:"Grease Pencil",call:"object.grease_pencil_add, type='LINEART_OBJECT'"},{kind:"armature",label:"Armature",group:null,call:"object.armature_add"},{kind:"lattice.lattice",label:"Lattice",group:"Lattice",call:"object.add, type='LATTICE'"},{kind:"lattice.deform-selected",label:"Lattice Deform Selected",group:"Lattice",call:"object.lattice_add_to_selected"},{kind:"empty.plain-axes",label:"Plain Axes",group:"Empty",call:"object.empty_add, type='PLAIN_AXES'"},{kind:"empty.arrows",label:"Arrows",group:"Empty",call:"object.empty_add, type='ARROWS'"},{kind:"empty.single-arrow",label:"Single Arrow",group:"Empty",call:"object.empty_add, type='SINGLE_ARROW'"},{kind:"empty.circle",label:"Circle",group:"Empty",call:"object.empty_add, type='CIRCLE'"},{kind:"empty.cube",label:"Cube",group:"Empty",call:"object.empty_add, type='CUBE'"},{kind:"empty.sphere",label:"Sphere",group:"Empty",call:"object.empty_add, type='SPHERE'"},{kind:"empty.cone",label:"Cone",group:"Empty",call:"object.empty_add, type='CONE'"},{kind:"image.reference",label:"Reference...",group:"Image",call:"object.empty_image_add, background=False",refusal:U("A reference image","poll() failed, context is incorrect / Please select at least one image")},{kind:"image.background",label:"Background...",group:"Image",call:"object.empty_image_add, background=True",refusal:U("A background image","poll() failed, context is incorrect / Please select at least one image")},{kind:"image.mesh-plane",label:"Mesh Plane...",group:"Image",call:"image.import_as_mesh_planes",refusal:U("An image as a mesh plane","CANCELLED, with nothing created")},{kind:"image.empty-image",label:"Empty Image",group:"Image",call:"object.empty_add, type='IMAGE'"},{kind:"light.point",label:"Point",group:"Light",call:"object.light_add, type='POINT'"},{kind:"light.sun",label:"Sun",group:"Light",call:"object.light_add, type='SUN'"},{kind:"light.spot",label:"Spot",group:"Light",call:"object.light_add, type='SPOT'"},{kind:"light.area",label:"Area",group:"Light",call:"object.light_add, type='AREA'"},{kind:"light-probe.sphere",label:"Sphere",group:"Light Probe",call:"object.lightprobe_add, type='SPHERE'"},{kind:"light-probe.plane",label:"Plane",group:"Light Probe",call:"object.lightprobe_add, type='PLANE'"},{kind:"light-probe.volume",label:"Volume",group:"Light Probe",call:"object.lightprobe_add, type='VOLUME'"},{kind:"camera",label:"Camera",group:null,call:"object.camera_add"},{kind:"speaker",label:"Speaker",group:null,call:"object.speaker_add"},{kind:"force-field.force",label:"Force",group:"Force Field",call:"object.effector_add, type='FORCE'"},{kind:"force-field.wind",label:"Wind",group:"Force Field",call:"object.effector_add, type='WIND'"},{kind:"force-field.vortex",label:"Vortex",group:"Force Field",call:"object.effector_add, type='VORTEX'"},{kind:"force-field.magnetic",label:"Magnetic",group:"Force Field",call:"object.effector_add, type='MAGNET'"},{kind:"force-field.harmonic",label:"Harmonic",group:"Force Field",call:"object.effector_add, type='HARMONIC'"},{kind:"force-field.charge",label:"Charge",group:"Force Field",call:"object.effector_add, type='CHARGE'"},{kind:"force-field.lennard-jones",label:"Lennard-Jones",group:"Force Field",call:"object.effector_add, type='LENNARDJ'"},{kind:"force-field.texture",label:"Texture",group:"Force Field",call:"object.effector_add, type='TEXTURE'"},{kind:"force-field.curve-guide",label:"Curve Guide",group:"Force Field",call:"object.effector_add, type='GUIDE'"},{kind:"force-field.boid",label:"Boid",group:"Force Field",call:"object.effector_add, type='BOID'"},{kind:"force-field.turbulence",label:"Turbulence",group:"Force Field",call:"object.effector_add, type='TURBULENCE'"},{kind:"force-field.drag",label:"Drag",group:"Force Field",call:"object.effector_add, type='DRAG'"},{kind:"force-field.fluid-flow",label:"Fluid Flow",group:"Force Field",call:"object.effector_add, type='FLUID'"}],Be="collection-instance:";function Te(){const r=new Map;for(const a of Y().byId.values()){if(a.type!=="TSE_LAYER_COLLECTION")continue;const o=a.data;o===void 0||!o.startsWith("bpy.data.collections[")||r.has(a.name)||r.set(a.name,{kind:`${Be}${a.name}`,label:a.name,group:"Collection Instance",call:`object.collection_instance_add, collection=${P(a.name)}`})}return[...r.values()]}function J(){return[...Ae,...Te()]}function $e(r){const[a,...o]=r.call.split(", ");return`bpy.ops.${a}(${o.join(", ")})`}function P(r){return JSON.stringify(r)}async function D(r,a="Blender Python"){const o=["before = {o.name for o in bpy.data.objects}",r,"made = [o.name for o in bpy.data.objects if o.name not in before]",'print("\\n".join(made))'].join(`
2
+ `),d=await X(o,!0,a);return d.error!==null?{made:[],error:d.error}:{made:d.result.split(`
3
3
  `).map(E=>E.trim()).filter(E=>E.length>0),error:null}}async function Pe(r,a){const o=[`_sel = {${r.map(P).join(", ")}}`,"_vl = bpy.context.view_layer","for _o in _vl.objects:"," _o.select_set(_o.name in _sel)",a===null?"_vl.objects.active = None":`_vl.objects.active = bpy.data.objects.get(${P(a)})`].join(`
4
- `),d=await J(o,!1);d.error!==null&&$().console.error(`Blender refused the selection write: ${d.error}`,"blender-outliner")}async function ee(r,a){if(r.length===0)return{destination:"Nothing is selected, so there was nothing to run it on.",persisted:!1};const o=[`targets = [bpy.data.objects[n] for n in [${r.map(P).join(", ")}]]`,"with bpy.context.temp_override(selected_objects=targets, selected_editable_objects=targets, active_object=targets[0], object=targets[0]):",` ${a}`].join(`
5
- `),{error:d}=await D(o);return d!==null?{destination:d,persisted:!1}:(await K(r),{destination:`Blender — ${a}; the session saves the .blend`,persisted:!0})}const De={source:"document",label:"blender",detail:"These rows are Blender's own View Layer tree, read from the engine through RNA. Editing the model is a bpy call; the eye and render columns write the engine directly."},Ve="This collection is excluded from the view layer (LayerCollection.exclude), so its viewport visibility is not what is hiding it. Clear the Exclude checkbox on this row first.",Ge=({defaultAdapter:r})=>{const a=new Set;let o=[],d=null;const O=new Map,E=new Map,S=()=>{for(const t of[...a])t()},m=()=>Y().byId,v=t=>{const e=m().get(t),l=Q();return e===void 0||l===null?null:e.type==="TSE_VIEW_COLLECTION_BASE"?l.root:e.object===void 0?null:l.objectForBlenderName(e.object)},y=t=>{const e=Q();if(e===null)return null;for(const l of m().values())if(A(l)&&e.objectForBlenderName(l.object)===t)return l.id;return null},j=t=>{for(const e of m().values())if(A(e)&&e.object===t)return e.id;return null},k=t=>{if(m().has(t))return t;const e=xe(r.hierarchy,t);return e===null?null:y(e)},w=t=>{const e=k(t);return e===null?null:v(e)},F=t=>{const e=w(t);return e===null?null:r.hierarchy.idForObject3D?.(e)??null},I={roots:()=>(Ee(i()),(Y().tree?.rows??[]).map(e=>ce(e,null))),node:t=>{const e=Y(),l=e.byId.has(t)?t:k(t),c=l===null?void 0:e.byId.get(l);return c===void 0?null:ce(c,e.parentOf.get(c.id)??null)},object3D:t=>w(t),idForObject3D:t=>y(t)};function i(){const t=m(),e=new Set;for(const l of o){const c=t.get(l)?.object;c!==void 0&&e.add(c)}return[...e]}const f=()=>{const t=[];for(const e of o){const l=w(e),c=l===null?null:r.hierarchy.idForObject3D?.(l);c&&t.push(c)}r.selection?.set(t,{intent:"exact"}),S()},n=()=>{const t=we(),e=`${re()}\0${t.active??""}\0${[...t.selected].sort().join("")}`;if(e===d)return;d=e;const l=t.selected.filter(b=>b!==t.active);t.active!==null&&l.push(t.active);const c=l.map(j).filter(b=>b!==null);c.length===o.length&&c.every((b,_)=>b===o[_])||(o=c,f())},s={get:()=>[...o],set:t=>{o=t.map(k).filter(b=>b!==null),f();const e=m(),l=[],c=[];for(const b of o){const _=e.get(b),N=_?.object;N===void 0?c.push(_?.name??b):l.includes(N)||l.push(N)}c.length>0&&$().console.warn(`${c.join(", ")} ${c.length===1?"is":"are"} not an object, so Blender's object selection does not carry ${c.length===1?"it":"them"}. Selecting a collection sets the ACTIVE COLLECTION in Blender, which is its own gesture and not in this editor yet.`,"blender-outliner"),Pe(l,l.length===0?null:l[l.length-1])}},u=t=>m().get(t)?.restrict,x={properties:t=>{const e=u(t);if(e===void 0)return[];const l=m().get(t),c=[{path:"name",label:"Name",type:"string",readonly:!A(l)}];return e.hide!==void 0&&c.push({path:"visible",label:"Show in Viewport",type:"boolean"}),e.render!==void 0&&c.push({path:"renderVisible",label:"Show in Renders",type:"boolean"}),e.exclude!==void 0&&c.push({path:"exclude",label:"Exclude from View Layer",type:"boolean"}),c},get:(t,e)=>{const l=m().get(t);if(l!==void 0){if(e==="name")return l.name;if(e==="visible")return l.restrict?.hide===void 0?void 0:!l.restrict.hide;if(e==="renderVisible")return l.restrict?.render===void 0?void 0:!l.restrict.render;if(e==="exclude")return l.restrict?.exclude}},editability:(t,e)=>{const l=m().get(t);return l===void 0?{writable:!1}:e==="name"?A(l)?{writable:!0}:{writable:!1,reason:`Renaming a ${l.struct??l.type} is not in this Outliner yet — only an object row renames here. Rename it with bpy.`}:l.notInCollection?{writable:!1,reason:"This row is a child drawn under its parent although it is not in that collection, and Blender's Outliner draws it no restriction columns."}:e==="visible"&&l.restrict?.exclude===!0?{writable:!1,reason:Ve}:{writable:!0}},set:async(t,e,l)=>{const c=m().get(t);if(c===void 0)return;if(e==="name"){if(!A(c))return;const _=String(l);if(_===c.name||_.length===0)return;await ae(`bpy.data.objects[${P(c.object)}]`,"name",_),await K([_]);const N=j(_);N!==null&&s.set([N]);return}if(e==="exclude"){await ie(c.path,"exclude",l===!0);return}const b=e==="visible"?"hide":e==="renderVisible"?"render":null;b!==null&&await ie(c.path,b,l===!1)}},B={get:t=>{const e=F(t);return(e===null?void 0:r.transforms?.get(e))??Re()},editability:t=>{const e=k(t),l=e===null?void 0:m().get(e);return A(l)&&v(l.id)!==null?{writable:!0}:{writable:!1,reason:`Only an object has a transform; this row is a ${l?.struct??l?.type??"row"}.`}},beginEdit:t=>{const e=w(t);e!==null&&!O.has(e)&&(O.set(e,e.matrixWorld.clone()),E.set(t,e),Oe())},apply:(t,e)=>{const l=w(t);l!==null&&(l.position.fromArray(e.position),l.quaternion.fromArray(e.rotation),l.scale.fromArray(e.scale),l.updateMatrix(),l.updateMatrixWorld(!0))},endEdit:async t=>{const e=E.get(t)??w(t);E.delete(t);const l=Q();if(e===null)return;const c=O.get(e);O.delete(e);try{if(l===null||(e.updateWorldMatrix(!0,!1),c?.equals(e.matrixWorld)===!0))return;const b=l.blenderObjectName(e);if(b===null)return;const _=`bpy.data.objects[${JSON.stringify(b)}]`;try{return await ae(_,"matrix_world",Me(e,l.root)),{destination:`Blender — ${_}.matrix_world; the session saves the .blend`,persisted:!0}}catch(N){return{destination:N instanceof Error?N.message:String(N),persisted:!1}}}finally{c&&await ke()}}},T=t=>{const e=k(t),l=e===null?void 0:m().get(e);return A(l)?l.object:null},g=t=>({destination:t,persisted:!1}),R=async t=>{await K(t);const e=t.map(j).filter(l=>l!==null);return e.length>0&&s.set(e),e[0]??""},M={creatableKinds:()=>q().map(({kind:t,label:e})=>({kind:t,label:e})),create:t=>{const e=q().find(c=>c.kind===t);if(e===void 0)return{id:"",ack:g(`${t} is not a row of Blender's Add menu that this editor adds. Its rows are: ${q().map(c=>c.label).join(", ")}.`)};if(e.refusal!==void 0)return{id:"",ack:g(e.refusal)};const l=$e(e);return{id:"",ack:(async()=>{const{made:c,error:b}=await D(l);return b!==null?g(b):c.length===0?g(`Blender ran ${l} and created nothing. The operator reported no error, so it cancelled — most often because it wanted a file browser or a context this headless engine has no window for.`):(await R(c),{destination:`Blender — ${l}; the session saves the .blend`,persisted:!0})})()}},remove:t=>M.removeMany?.([t])??void 0,removeMany:async t=>{const e=[];for(const _ of t){const N=T(_);if(N===null){const oe=k(_)===null?void 0:m().get(k(_));return g(`Only an object can be deleted here; this row is a ${oe?.struct??oe?.type??"row"}. Deleting a collection, a modifier or a vertex group is that datablock’s own bpy call.`)}e.push(N)}if(e.length===0)return g("Nothing selected to delete.");const c=[`targets = ${`[bpy.data.objects[n] for n in [${e.map(P).join(", ")}]]`}`,"with bpy.context.temp_override(selected_objects=targets, active_object=targets[0]):"," result = bpy.ops.object.delete(use_global=False)",'if "FINISHED" not in result: raise RuntimeError("Blender cancelled deleting the selected objects")'].join(`
4
+ `),d=await X(o,!1);d.error!==null&&$().console.error(`Blender refused the selection write: ${d.error}`,"blender-outliner")}async function ee(r,a){if(r.length===0)return{destination:"Nothing is selected, so there was nothing to run it on.",persisted:!1};const o=[`targets = [bpy.data.objects[n] for n in [${r.map(P).join(", ")}]]`,"with bpy.context.temp_override(selected_objects=targets, selected_editable_objects=targets, active_object=targets[0], object=targets[0]):",` ${a}`].join(`
5
+ `),{error:d}=await D(o);return d!==null?{destination:d,persisted:!1}:(await K(r),{destination:`Blender — ${a}; the session saves the .blend`,persisted:!0})}const De={source:"document",label:"blender",detail:"These rows are Blender's own View Layer tree, read from the engine through RNA. Editing the model is a bpy call; the eye and render columns write the engine directly."},Ve="This collection is excluded from the view layer (LayerCollection.exclude), so its viewport visibility is not what is hiding it. Clear the Exclude checkbox on this row first.",Ge=({defaultAdapter:r})=>{const a=new Set;let o=[],d=null;const O=new Map,E=new Map,S=()=>{for(const t of[...a])t()},m=()=>Y().byId,v=t=>{const e=m().get(t),l=Q();return e===void 0||l===null?null:e.type==="TSE_VIEW_COLLECTION_BASE"?l.root:e.object===void 0?null:l.objectForBlenderName(e.object)},y=t=>{const e=Q();if(e===null)return null;for(const l of m().values())if(A(l)&&e.objectForBlenderName(l.object)===t)return l.id;return null},j=t=>{for(const e of m().values())if(A(e)&&e.object===t)return e.id;return null},k=t=>{if(m().has(t))return t;const e=xe(r.hierarchy,t);return e===null?null:y(e)},w=t=>{const e=k(t);return e===null?null:v(e)},F=t=>{const e=w(t);return e===null?null:r.hierarchy.idForObject3D?.(e)??null},I={roots:()=>(Ee(i()),(Y().tree?.rows??[]).map(e=>ce(e,null))),node:t=>{const e=Y(),l=e.byId.has(t)?t:k(t),c=l===null?void 0:e.byId.get(l);return c===void 0?null:ce(c,e.parentOf.get(c.id)??null)},object3D:t=>w(t),idForObject3D:t=>y(t)};function i(){const t=m(),e=new Set;for(const l of o){const c=t.get(l)?.object;c!==void 0&&e.add(c)}return[...e]}const f=()=>{const t=[];for(const e of o){const l=w(e),c=l===null?null:r.hierarchy.idForObject3D?.(l);c&&t.push(c)}r.selection?.set(t,{intent:"exact"}),S()},n=()=>{const t=we(),e=`${re()}\0${t.active??""}\0${[...t.selected].sort().join("")}`;if(e===d)return;d=e;const l=t.selected.filter(b=>b!==t.active);t.active!==null&&l.push(t.active);const c=l.map(j).filter(b=>b!==null);c.length===o.length&&c.every((b,_)=>b===o[_])||(o=c,f())},s={get:()=>[...o],set:t=>{o=t.map(k).filter(b=>b!==null),f();const e=m(),l=[],c=[];for(const b of o){const _=e.get(b),N=_?.object;N===void 0?c.push(_?.name??b):l.includes(N)||l.push(N)}c.length>0&&$().console.warn(`${c.join(", ")} ${c.length===1?"is":"are"} not an object, so Blender's object selection does not carry ${c.length===1?"it":"them"}. Selecting a collection sets the ACTIVE COLLECTION in Blender, which is its own gesture and not in this editor yet.`,"blender-outliner"),Pe(l,l.length===0?null:l[l.length-1])}},u=t=>m().get(t)?.restrict,x={properties:t=>{const e=u(t);if(e===void 0)return[];const l=m().get(t),c=[{path:"name",label:"Name",type:"string",readonly:!A(l)}];return e.hide!==void 0&&c.push({path:"visible",label:"Show in Viewport",type:"boolean"}),e.render!==void 0&&c.push({path:"renderVisible",label:"Show in Renders",type:"boolean"}),e.exclude!==void 0&&c.push({path:"exclude",label:"Exclude from View Layer",type:"boolean"}),c},get:(t,e)=>{const l=m().get(t);if(l!==void 0){if(e==="name")return l.name;if(e==="visible")return l.restrict?.hide===void 0?void 0:!l.restrict.hide;if(e==="renderVisible")return l.restrict?.render===void 0?void 0:!l.restrict.render;if(e==="exclude")return l.restrict?.exclude}},editability:(t,e)=>{const l=m().get(t);return l===void 0?{writable:!1}:e==="name"?A(l)?{writable:!0}:{writable:!1,reason:`Renaming a ${l.struct??l.type} is not in this Outliner yet — only an object row renames here. Rename it with bpy.`}:l.notInCollection?{writable:!1,reason:"This row is a child drawn under its parent although it is not in that collection, and Blender's Outliner draws it no restriction columns."}:e==="visible"&&l.restrict?.exclude===!0?{writable:!1,reason:Ve}:{writable:!0}},set:async(t,e,l)=>{const c=m().get(t);if(c===void 0)return;if(e==="name"){if(!A(c))return;const _=String(l);if(_===c.name||_.length===0)return;await ae(`bpy.data.objects[${P(c.object)}]`,"name",_),await K([_]);const N=j(_);N!==null&&s.set([N]);return}if(e==="exclude"){await ie(c.path,"exclude",l===!0);return}const b=e==="visible"?"hide":e==="renderVisible"?"render":null;b!==null&&await ie(c.path,b,l===!1)}},B={get:t=>{const e=F(t);return(e===null?void 0:r.transforms?.get(e))??Re()},editability:t=>{const e=k(t),l=e===null?void 0:m().get(e);return A(l)&&v(l.id)!==null?{writable:!0}:{writable:!1,reason:`Only an object has a transform; this row is a ${l?.struct??l?.type??"row"}.`}},beginEdit:t=>{const e=w(t);e!==null&&!O.has(e)&&(O.set(e,e.matrixWorld.clone()),E.set(t,e),Oe())},apply:(t,e)=>{const l=w(t);l!==null&&(l.position.fromArray(e.position),l.quaternion.fromArray(e.rotation),l.scale.fromArray(e.scale),l.updateMatrix(),l.updateMatrixWorld(!0))},endEdit:async t=>{const e=E.get(t)??w(t);E.delete(t);const l=Q();if(e===null)return;const c=O.get(e);O.delete(e);try{if(l===null||(e.updateWorldMatrix(!0,!1),c?.equals(e.matrixWorld)===!0))return;const b=l.blenderObjectName(e);if(b===null)return;const _=`bpy.data.objects[${JSON.stringify(b)}]`;try{return await ae(_,"matrix_world",Me(e,l.root)),{destination:`Blender — ${_}.matrix_world; the session saves the .blend`,persisted:!0}}catch(N){return{destination:N instanceof Error?N.message:String(N),persisted:!1}}}finally{c&&await ke()}}},T=t=>{const e=k(t),l=e===null?void 0:m().get(e);return A(l)?l.object:null},g=t=>({destination:t,persisted:!1}),R=async t=>{await K(t);const e=t.map(j).filter(l=>l!==null);return e.length>0&&s.set(e),e[0]??""},M={creatableKinds:()=>J().map(({kind:t,label:e})=>({kind:t,label:e})),create:t=>{const e=J().find(c=>c.kind===t);if(e===void 0)return{id:"",ack:g(`${t} is not a row of Blender's Add menu that this editor adds. Its rows are: ${J().map(c=>c.label).join(", ")}.`)};if(e.refusal!==void 0)return{id:"",ack:g(e.refusal)};const l=$e(e);return{id:"",ack:(async()=>{const{made:c,error:b}=await D(l);return b!==null?g(b):c.length===0?g(`Blender ran ${l} and created nothing. The operator reported no error, so it cancelled — most often because it wanted a file browser or a context this headless engine has no window for.`):(await R(c),{destination:`Blender — ${l}; the session saves the .blend`,persisted:!0})})()}},remove:t=>M.removeMany?.([t])??void 0,removeMany:async t=>{const e=[];for(const _ of t){const N=T(_);if(N===null){const oe=k(_)===null?void 0:m().get(k(_));return g(`Only an object can be deleted here; this row is a ${oe?.struct??oe?.type??"row"}. Deleting a collection, a modifier or a vertex group is that datablock’s own bpy call.`)}e.push(N)}if(e.length===0)return g("Nothing selected to delete.");const c=[`targets = ${`[bpy.data.objects[n] for n in [${e.map(P).join(", ")}]]`}`,"with bpy.context.temp_override(selected_objects=targets, active_object=targets[0]):"," result = bpy.ops.object.delete(use_global=False)",'if "FINISHED" not in result: raise RuntimeError("Blender cancelled deleting the selected objects")'].join(`
6
6
  `),{error:b}=await D(c,"Delete Objects");return b!==null?g(b):(s.set([]),await K([]),{destination:"Blender — bpy.ops.object.delete(use_global=False); the session saves the .blend",persisted:!0})},duplicate:t=>{const e=T(t);if(e===null)return{id:t,ack:g("Only an object can be duplicated here. Duplicating a collection is `bpy.ops.object.collection_instance_add`, its own gesture.")};const l=[`source = bpy.data.objects[${P(e)}]`,"with bpy.context.temp_override(selected_objects=[source], active_object=source):"," result = bpy.ops.object.duplicate(linked=False)",'if "FINISHED" not in result: raise RuntimeError("Blender cancelled duplicating the selected object")'].join(`
7
7
  `);return{id:t,ack:(async()=>{const{made:c,error:b}=await D(l,"Duplicate Object");return b!==null?g(b):(await R(c),{destination:`Blender — bpy.ops.object.duplicate(linked=False) on ${e}; the session saves the .blend`,persisted:!0})})()}},duplicateMany:async t=>{const e=[...new Set(t.map(T))];if(e.length===0||e.some(_=>_===null))return g("Select objects to duplicate; collections and data rows cannot be duplicated here.");const l=[`sources = [bpy.data.objects[name] for name in ${JSON.stringify(e)}]`,"with bpy.context.temp_override(selected_objects=sources, active_object=sources[0]):"," result = bpy.ops.object.duplicate(linked=False)",'if "FINISHED" not in result: raise RuntimeError("Blender cancelled duplicating the selected objects")'].join(`
8
- `),{made:c,error:b}=await D(l,"Duplicate Objects");return b!==null?g(b):(await R(c),{destination:"Blender — duplicate selected objects as one native operation; the session saves the .blend",persisted:!0})},reparent:()=>g("Reparenting is Blender's `bpy.ops.object.parent_set`, which needs a parent TYPE (Object, Object Keep Transform, Armature Deform, …) that a drag does not say. Set the parent on the object’s Relations panel, or with bpy.")},ne={get documentId(){return r.documentId},get documentRootObject(){return r.documentRootObject},capabilities:Ie,provenance:De,hierarchy:I,selection:s,inspector:x,transforms:B,structure:M,subscribe:t=>{a.add(t);const e=z(t),l=r.subscribe?.(t)??(()=>{});return()=>{a.delete(t),e(),l()}}},le={get documentId(){return ne.documentId},selectedObjectNames:()=>i(),allObjectNames:()=>{const t=[];for(const e of m().values())A(e)&&t.push(e.object);return t},selectObjects:t=>{const e=t.map(j).filter(l=>l!==null);s.set(e)},rowIdForObject:t=>j(t),structure:M,subscribe:t=>{a.add(t);const e=z(t);return()=>{a.delete(t),e()}}};V.add(le);const pe=ve(n),be=z(n);return n(),{adapter:ne,dispose:()=>{pe(),be(),V.delete(le),a.clear()}}},We=[{label:"Location",call:"location=True, rotation=False, scale=False"},{label:"Rotation",call:"location=False, rotation=True, scale=False"},{label:"Scale",call:"location=False, rotation=False, scale=True"},{label:"All Transforms",call:"location=True, rotation=True, scale=True"}],Ue=[{label:"Location",call:"bpy.ops.object.location_clear(clear_delta=False)"},{label:"Rotation",call:"bpy.ops.object.rotation_clear(clear_delta=False)"},{label:"Scale",call:"bpy.ops.object.scale_clear(clear_delta=False)"}],He=[{label:"Geometry to Origin",type:"GEOMETRY_ORIGIN"},{label:"Origin to Geometry",type:"ORIGIN_GEOMETRY"},{label:"Origin to 3D Cursor",type:"ORIGIN_CURSOR"}],ze=[{submenu:"Mesh",at:"2699"},{submenu:"Curve",at:"2702"},{submenu:"Surface",at:"2704"},{submenu:"Metaball",at:"2705"},{kind:"text",at:"2706"},{kind:"point-cloud",at:"2707"},{submenu:"Volume",at:"2708"},{submenu:"Grease Pencil",at:"2709"},{separatorAt:"2711"},{kind:"armature",at:"2716"},{submenu:"Lattice",at:"2718"},{separatorAt:"2720"},{submenu:"Empty",at:"2722"},{submenu:"Image",at:"2723"},{separatorAt:"2725"},{submenu:"Light",at:"2727"},{submenu:"Light Probe",at:"2728"},{separatorAt:"2730"},{kind:"camera",at:"2735"},{separatorAt:"2737"},{kind:"speaker",at:"2739"},{separatorAt:"2741"},{submenu:"Force Field",at:"2743"},{separatorAt:"2745"},{submenu:"Collection Instance",at:"2759"}],Ke="No Collections to Instance";function te({id:r,open:a,setOpen:o,anchorRef:d,children:O}){return p.jsxs("div",{ref:d,style:{position:"relative"},children:[p.jsx(ge,{"data-testid":`blender-menu-${r}`,"aria-expanded":a===r,onClick:()=>o(a===r?null:r),onPointerEnter:()=>{a&&o(r)},style:{textTransform:"capitalize"},children:r}),a===r&&p.jsx(he,{anchorRef:d,dismissBoundaryRef:d,align:"start",gap:0,clamp:!0,"aria-label":r,onDismiss:()=>o(null),children:O})]})}function Ye(r,a,o){(async()=>{const d=await o;d===void 0||typeof d.destination!="string"||d.persisted!==!0&&r?.({tone:"error",title:`${a} was refused`,detail:d.destination})})()}function qe({documentId:r,notify:a}){C.useSyncExternalStore(z,re,re);const[o,d]=C.useState(null),O=C.useRef(null),E=C.useRef(null),S=C.useRef(null),m=C.useRef(null),v=Le(r);if(v===null)return null;const y=(n,s)=>()=>{d(null),Ye(a,n,s(v))},j=v.selectedObjectNames(),k=v.allObjectNames(),w=j.length===0?"Nothing is selected.":void 0,F=q(),I=n=>p.jsx(L,{"data-testid":`blender-add-${n.kind}`,disabled:n.refusal!==void 0,title:n.refusal,onSelect:y(`Add ${n.label}`,s=>s.structure.create(n.kind).ack),children:n.label},n.kind),i=n=>F.filter(s=>s.group===n).flatMap(s=>s.separatorBefore===!0?[p.jsx(X,{},`${s.kind}-separator`),I(s)]:[I(s)]),f=n=>{if("separatorAt"in n)return p.jsx(X,{},`separator-${n.separatorAt}`);if("kind"in n){const u=F.find(x=>x.kind===n.kind);return u===void 0?null:I(u)}const s=i(n.submenu);return s.length===0?p.jsx(L,{"data-testid":"blender-add-collection-instance",disabled:!0,children:Ke},n.submenu):p.jsx(G,{label:n.submenu,"data-testid":`blender-add-${n.submenu.toLowerCase().replaceAll(" ","-")}`,children:s},n.submenu)};return p.jsxs(me,{compact:!0,label:"Blender Object Mode menus","data-testid":"blender-object-mode-menus",ref:O,children:[p.jsxs(te,{id:"select",open:o,setOpen:d,anchorRef:E,children:[p.jsx(L,{"data-testid":"blender-select-all",onSelect:y("Select All",n=>n.selectObjects(k)),children:"All"}),p.jsx(L,{"data-testid":"blender-select-none",onSelect:y("Select None",n=>n.selectObjects([])),children:"None"}),p.jsx(L,{"data-testid":"blender-select-invert",onSelect:y("Select Invert",n=>n.selectObjects(k.filter(s=>!j.includes(s)))),children:"Invert"})]}),p.jsx(te,{id:"add",open:o,setOpen:d,anchorRef:S,children:ze.map(n=>f(n))}),p.jsxs(te,{id:"object",open:o,setOpen:d,anchorRef:m,children:[p.jsx(G,{label:"Set Origin","data-testid":"blender-object-origin",children:He.map(n=>p.jsx(L,{"data-testid":`blender-origin-${n.type}`,disabled:n.refusal!==void 0||j.length===0,title:n.refusal??w,onSelect:y(`Set Origin ▸ ${n.label}`,s=>ee(s.selectedObjectNames(),`bpy.ops.object.origin_set(type='${n.type}')`)),children:n.label},n.type))}),p.jsx(G,{label:"Clear","data-testid":"blender-object-clear",children:Ue.map(n=>p.jsx(L,{"data-testid":`blender-clear-${n.label.toLowerCase()}`,disabled:j.length===0,title:w,onSelect:y(`Clear ▸ ${n.label}`,s=>ee(s.selectedObjectNames(),n.call)),children:n.label},n.label))}),p.jsx(G,{label:"Apply","data-testid":"blender-object-apply",children:We.map(n=>p.jsx(L,{"data-testid":`blender-apply-${n.label.toLowerCase().replace(/ /g,"-")}`,disabled:j.length===0,title:w,onSelect:y(`Apply ▸ ${n.label}`,s=>ee(s.selectedObjectNames(),`bpy.ops.object.transform_apply(${n.call})`)),children:n.label},n.label))}),p.jsx(X,{}),p.jsx(L,{"data-testid":"blender-object-duplicate",disabled:j.length===0,title:w,onSelect:y("Duplicate Objects",async n=>{const s=n.selectedObjectNames().map(u=>n.rowIdForObject(u)).filter(u=>u!==null);return n.structure.duplicateMany?.(s)}),children:"Duplicate Objects"}),p.jsx(L,{"data-testid":"blender-object-delete",disabled:j.length===0,title:w,onSelect:y("Delete",n=>{const s=n.selectedObjectNames().map(u=>n.rowIdForObject(u)).filter(u=>u!==null);return n.structure.removeMany?.(s)}),children:"Delete"})]})]})}const Nt="workspace.document",Ft="Blender Model",It=({documentId:r,notify:a})=>p.jsx(qe,{documentId:r,notify:a}),Je="model",Lt="owned",Rt=[],h=_e,Xe=()=>{const r=H.playhead();return h.subjectLine(r===null?null:Math.floor(r))},Qe=r=>h.gridUnitName(r),Ze={camera:()=>h.cameraViewCamera(),zoom:h.cameraViewZoom,pan:h.cameraViewPan,showing:r=>h.setCameraViewShowing(r),setPose:(r,a,o,d)=>{const{location:O,rotation:E}=h.blenderPose(a,o);return J(`from mathutils import Matrix, Quaternion, Vector
8
+ `),{made:c,error:b}=await D(l,"Duplicate Objects");return b!==null?g(b):(await R(c),{destination:"Blender — duplicate selected objects as one native operation; the session saves the .blend",persisted:!0})},reparent:()=>g("Reparenting is Blender's `bpy.ops.object.parent_set`, which needs a parent TYPE (Object, Object Keep Transform, Armature Deform, …) that a drag does not say. Set the parent on the object’s Relations panel, or with bpy.")},ne={get documentId(){return r.documentId},get documentRootObject(){return r.documentRootObject},capabilities:Ie,provenance:De,hierarchy:I,selection:s,inspector:x,transforms:B,structure:M,subscribe:t=>{a.add(t);const e=z(t),l=r.subscribe?.(t)??(()=>{});return()=>{a.delete(t),e(),l()}}},le={get documentId(){return ne.documentId},selectedObjectNames:()=>i(),allObjectNames:()=>{const t=[];for(const e of m().values())A(e)&&t.push(e.object);return t},selectObjects:t=>{const e=t.map(j).filter(l=>l!==null);s.set(e)},rowIdForObject:t=>j(t),structure:M,subscribe:t=>{a.add(t);const e=z(t);return()=>{a.delete(t),e()}}};V.add(le);const pe=ve(n),be=z(n);return n(),{adapter:ne,dispose:()=>{pe(),be(),V.delete(le),a.clear()}}},We=[{label:"Location",call:"location=True, rotation=False, scale=False"},{label:"Rotation",call:"location=False, rotation=True, scale=False"},{label:"Scale",call:"location=False, rotation=False, scale=True"},{label:"All Transforms",call:"location=True, rotation=True, scale=True"}],Ue=[{label:"Location",call:"bpy.ops.object.location_clear(clear_delta=False)"},{label:"Rotation",call:"bpy.ops.object.rotation_clear(clear_delta=False)"},{label:"Scale",call:"bpy.ops.object.scale_clear(clear_delta=False)"}],He=[{label:"Geometry to Origin",type:"GEOMETRY_ORIGIN"},{label:"Origin to Geometry",type:"ORIGIN_GEOMETRY"},{label:"Origin to 3D Cursor",type:"ORIGIN_CURSOR"}],ze=[{submenu:"Mesh",at:"2699"},{submenu:"Curve",at:"2702"},{submenu:"Surface",at:"2704"},{submenu:"Metaball",at:"2705"},{kind:"text",at:"2706"},{kind:"point-cloud",at:"2707"},{submenu:"Volume",at:"2708"},{submenu:"Grease Pencil",at:"2709"},{separatorAt:"2711"},{kind:"armature",at:"2716"},{submenu:"Lattice",at:"2718"},{separatorAt:"2720"},{submenu:"Empty",at:"2722"},{submenu:"Image",at:"2723"},{separatorAt:"2725"},{submenu:"Light",at:"2727"},{submenu:"Light Probe",at:"2728"},{separatorAt:"2730"},{kind:"camera",at:"2735"},{separatorAt:"2737"},{kind:"speaker",at:"2739"},{separatorAt:"2741"},{submenu:"Force Field",at:"2743"},{separatorAt:"2745"},{submenu:"Collection Instance",at:"2759"}],Ke="No Collections to Instance";function te({id:r,open:a,setOpen:o,anchorRef:d,children:O}){return p.jsxs("div",{ref:d,style:{position:"relative"},children:[p.jsx(ge,{"data-testid":`blender-menu-${r}`,"aria-expanded":a===r,onClick:()=>o(a===r?null:r),onPointerEnter:()=>{a&&o(r)},style:{textTransform:"capitalize"},children:r}),a===r&&p.jsx(he,{anchorRef:d,dismissBoundaryRef:d,align:"start",gap:0,clamp:!0,"aria-label":r,onDismiss:()=>o(null),children:O})]})}function Ye(r,a,o){(async()=>{const d=await o;d===void 0||typeof d.destination!="string"||d.persisted!==!0&&r?.({tone:"error",title:`${a} was refused`,detail:d.destination})})()}function Je({documentId:r,notify:a}){C.useSyncExternalStore(z,re,re);const[o,d]=C.useState(null),O=C.useRef(null),E=C.useRef(null),S=C.useRef(null),m=C.useRef(null),v=Le(r);if(v===null)return null;const y=(n,s)=>()=>{d(null),Ye(a,n,s(v))},j=v.selectedObjectNames(),k=v.allObjectNames(),w=j.length===0?"Nothing is selected.":void 0,F=J(),I=n=>p.jsx(L,{"data-testid":`blender-add-${n.kind}`,disabled:n.refusal!==void 0,title:n.refusal,onSelect:y(`Add ${n.label}`,s=>s.structure.create(n.kind).ack),children:n.label},n.kind),i=n=>F.filter(s=>s.group===n).flatMap(s=>s.separatorBefore===!0?[p.jsx(q,{},`${s.kind}-separator`),I(s)]:[I(s)]),f=n=>{if("separatorAt"in n)return p.jsx(q,{},`separator-${n.separatorAt}`);if("kind"in n){const u=F.find(x=>x.kind===n.kind);return u===void 0?null:I(u)}const s=i(n.submenu);return s.length===0?p.jsx(L,{"data-testid":"blender-add-collection-instance",disabled:!0,children:Ke},n.submenu):p.jsx(G,{label:n.submenu,"data-testid":`blender-add-${n.submenu.toLowerCase().replaceAll(" ","-")}`,children:s},n.submenu)};return p.jsxs(me,{compact:!0,label:"Blender Object Mode menus","data-testid":"blender-object-mode-menus",ref:O,children:[p.jsxs(te,{id:"select",open:o,setOpen:d,anchorRef:E,children:[p.jsx(L,{"data-testid":"blender-select-all",onSelect:y("Select All",n=>n.selectObjects(k)),children:"All"}),p.jsx(L,{"data-testid":"blender-select-none",onSelect:y("Select None",n=>n.selectObjects([])),children:"None"}),p.jsx(L,{"data-testid":"blender-select-invert",onSelect:y("Select Invert",n=>n.selectObjects(k.filter(s=>!j.includes(s)))),children:"Invert"})]}),p.jsx(te,{id:"add",open:o,setOpen:d,anchorRef:S,children:ze.map(n=>f(n))}),p.jsxs(te,{id:"object",open:o,setOpen:d,anchorRef:m,children:[p.jsx(G,{label:"Set Origin","data-testid":"blender-object-origin",children:He.map(n=>p.jsx(L,{"data-testid":`blender-origin-${n.type}`,disabled:n.refusal!==void 0||j.length===0,title:n.refusal??w,onSelect:y(`Set Origin ▸ ${n.label}`,s=>ee(s.selectedObjectNames(),`bpy.ops.object.origin_set(type='${n.type}')`)),children:n.label},n.type))}),p.jsx(G,{label:"Clear","data-testid":"blender-object-clear",children:Ue.map(n=>p.jsx(L,{"data-testid":`blender-clear-${n.label.toLowerCase()}`,disabled:j.length===0,title:w,onSelect:y(`Clear ▸ ${n.label}`,s=>ee(s.selectedObjectNames(),n.call)),children:n.label},n.label))}),p.jsx(G,{label:"Apply","data-testid":"blender-object-apply",children:We.map(n=>p.jsx(L,{"data-testid":`blender-apply-${n.label.toLowerCase().replace(/ /g,"-")}`,disabled:j.length===0,title:w,onSelect:y(`Apply ▸ ${n.label}`,s=>ee(s.selectedObjectNames(),`bpy.ops.object.transform_apply(${n.call})`)),children:n.label},n.label))}),p.jsx(q,{}),p.jsx(L,{"data-testid":"blender-object-duplicate",disabled:j.length===0,title:w,onSelect:y("Duplicate Objects",async n=>{const s=n.selectedObjectNames().map(u=>n.rowIdForObject(u)).filter(u=>u!==null);return n.structure.duplicateMany?.(s)}),children:"Duplicate Objects"}),p.jsx(L,{"data-testid":"blender-object-delete",disabled:j.length===0,title:w,onSelect:y("Delete",n=>{const s=n.selectedObjectNames().map(u=>n.rowIdForObject(u)).filter(u=>u!==null);return n.structure.removeMany?.(s)}),children:"Delete"})]})]})}const Nt="workspace.document",Ft="Blender Model",It=({documentId:r,notify:a})=>p.jsx(Je,{documentId:r,notify:a}),Xe="model",Lt="owned",Rt=[],h=_e,qe=()=>{const r=H.playhead();return h.subjectLine(r===null?null:Math.floor(r))},Qe=r=>h.gridUnitName(r),Ze={camera:()=>h.cameraViewCamera(),zoom:h.cameraViewZoom,pan:h.cameraViewPan,showing:r=>h.setCameraViewShowing(r),setPose:(r,a,o,d)=>{const{location:O,rotation:E}=h.blenderPose(a,o);return X(`from mathutils import Matrix, Quaternion, Vector
9
9
  import bpy
10
10
  object = bpy.data.objects[${JSON.stringify(r)}]
11
- object.matrix_world = Matrix.LocRotScale(Vector((${O.join(", ")})), Quaternion((${E.join(", ")})), object.matrix_world.to_scale())`,d,"Lock Camera to View").then(S=>{S.error!==null&&$().console.error(`Blender refused the camera's pose: ${S.error}`,"blender-camera")},S=>$().console.error(`The camera's pose was not written to Blender: ${String(S)}`,"blender-camera"))},view:(r,a,o,d)=>h.cameraView(r,a,o,d)};function Mt(r){const{active:a,document:o,documentId:d,notify:O,publishContext:E}=r,S=o?.source?.path,m=o?.id,v=JSON.stringify([d,m,S]),[y,j]=C.useState(null),k=C.useRef({notify:O,publishContext:E});return k.current={notify:O,publishContext:E},C.useEffect(()=>{if(a===!1||!d)return;let w=!1,F;const I=S===void 0?null:{documentId:d,entryId:m,blend:S},i=Se(I),f=()=>{F=k.current.publishContext?.(h)};return j(null),(async()=>{try{if(I){if(!await Ce(I,f))return}else f();w||j({key:v,error:null})}catch(n){if(w)return;F?.(),F=void 0;const s=n instanceof Error?n.message:String(n);j({key:v,error:s}),k.current.notify?.({tone:"error",title:`Blender could not open ${S??"the model"}`,detail:s})}})(),()=>{w=!0,F?.(),i()}},[a,S,d,m,v]),a===!1||!d?null:y?.key!==v?p.jsx("div",{role:"status",children:"Opening model…"}):y.error?p.jsx("div",{role:"alert",children:y.error}):p.jsx(et,{...r})}function et({active:r,document:a,documentId:o,surfaces:d}){const O=C.useCallback(()=>({root:h.root,onChange(i){const f=h.onChange(i),n=H.subscribe(i);return()=>{f(),n()}},dispose(){}}),[]),E=a?.source?.path,S=C.useCallback(i=>{const f=h.onChange(i),n=H.subscribe(i);let s=null;const u=()=>{s?.(),s=W().find(B=>B.documentId===o)?.onFrame(i)??null};u();const x=Z(u);return()=>{f(),n(),x(),s?.()}},[o]),m=C.useSyncExternalStore(S,Xe);C.useEffect(()=>{if(!o)return;const i=h.overlayGroups(),f=()=>{const s=W().find(u=>u.documentId===o);if(s)for(const{kind:u,object:x}of i)s.setHelper(u,x)};f();const n=Z(f);return()=>{n();const s=W().find(u=>u.documentId===o);for(const{kind:u}of i)s?.setHelper(u,null)}},[o]),C.useEffect(()=>{if(!o)return;const{transport:i}=$();let f=null;const n=()=>{if(f)return;const u=i.for(o);u&&(f=H.attachTo(u))};n();const s=i.subscribe(n);return()=>{s(),f?.()}},[o]),C.useEffect(()=>{if(!o)return;const i=()=>W().find(g=>g.documentId===o);let f,n=null;const s=new Ne,u=()=>i()?.rig().drawCamera()??s,x=()=>{const g=i();g!==f&&(n?.(),n=g?g.onFrame(()=>h.refreshRendered()):null,f=g);const{lighting:R}=je(o);h.holdRendered(R.source==="scene"&&g?u:null),h.setWorkbench(R.source==="studio"&&R.studioPreset===de.id)};x();const B=ye(x),T=Z(x);return()=>{B(),T(),n?.(),h.holdRendered(null),h.setWorkbench(!1)}},[o]);const v=C.useRef(null),y=i=>i.button===2&&i.shiftKey&&i.target instanceof HTMLCanvasElement,j=i=>{if(!y(i)){v.current=null;return}i.preventDefault(),i.stopPropagation(),v.current={id:i.pointerId,x:i.clientX,y:i.clientY},i.isTrusted&&i.target.setPointerCapture(i.pointerId)},k=()=>{v.current=null},w=i=>{const f=v.current;if(f===null||i.pointerId!==f.id||i.button!==2||(v.current=null,i.preventDefault(),i.stopPropagation(),Math.hypot(i.clientX-f.x,i.clientY-f.y)>3))return;const n=h.placeCursor(i.clientX,i.clientY,i.target);if(n===null)return;const[s,u,x]=n.location,[B,T,g,R]=n.rotation;J(`from mathutils import Matrix, Quaternion, Vector
12
- bpy.context.scene.cursor.matrix = Matrix.LocRotScale(Vector((${s}, ${u}, ${x})), Quaternion((${B}, ${T}, ${g}, ${R})), None)`,!1,"Set 3D Cursor").then(M=>{M.error!==null&&$().console.error(`Blender refused the 3D cursor: ${M.error}`,"blender-cursor")},M=>$().console.error(`The 3D cursor was not written to Blender: ${String(M)}`,"blender-cursor"))},F=i=>{y(i)&&i.preventDefault()};if(!o)return null;const I=d.Object3DAuthoring;return p.jsx("div",{style:{display:"contents"},onPointerDownCapture:j,onPointerUpCapture:w,onPointerCancelCapture:k,onLostPointerCaptureCapture:k,onContextMenuCapture:F,children:p.jsx(I,{active:r??!0,documentId:o,sourcePath:E??"blender:runtime",displayName:a?.label??"Model",...m===null?{}:{subject:m},gridScale:Qe,cameraView:Ze,build:O,audit:!1,authoring:Ge,cameraDirection:[.8187,.4458,.3617],openingFit:3,openingView:h.savedView(),presentation:(()=>{const i=h.savedView();return i?{camera:{fov:ue(i.lens)}}:null})(),stageKind:Je,dressing:{environment:!1,keyLight:!1,viewLocked:h.studioLights()}})})}export{It as Toolbar,Mt as default,Je as documentKind,Rt as inspectorBuiltins,Lt as inspectorRail,Nt as point,Ft as title};
11
+ object.matrix_world = Matrix.LocRotScale(Vector((${O.join(", ")})), Quaternion((${E.join(", ")})), object.matrix_world.to_scale())`,d,"Lock Camera to View").then(S=>{S.error!==null&&$().console.error(`Blender refused the camera's pose: ${S.error}`,"blender-camera")},S=>$().console.error(`The camera's pose was not written to Blender: ${String(S)}`,"blender-camera"))},view:(r,a,o,d)=>h.cameraView(r,a,o,d)};function Mt(r){const{active:a,document:o,documentId:d,notify:O,publishContext:E}=r,S=o?.source?.path,m=o?.id,v=JSON.stringify([d,m,S]),[y,j]=C.useState(null),k=C.useRef({notify:O,publishContext:E});return k.current={notify:O,publishContext:E},C.useEffect(()=>{if(a===!1||!d)return;let w=!1,F;const I=S===void 0?null:{documentId:d,entryId:m,blend:S},i=Se(I),f=()=>{F=k.current.publishContext?.(h)};return j(null),(async()=>{try{if(I){if(!await Ce(I,f))return}else f();w||j({key:v,error:null})}catch(n){if(w)return;F?.(),F=void 0;const s=n instanceof Error?n.message:String(n);j({key:v,error:s}),k.current.notify?.({tone:"error",title:`Blender could not open ${S??"the model"}`,detail:s})}})(),()=>{w=!0,F?.(),i()}},[a,S,d,m,v]),a===!1||!d?null:y?.key!==v?p.jsx("div",{role:"status",children:"Opening model…"}):y.error?p.jsx("div",{role:"alert",children:y.error}):p.jsx(et,{...r})}function et({active:r,document:a,documentId:o,surfaces:d}){const O=C.useCallback(()=>({root:h.root,onChange(i){const f=h.onChange(i),n=H.subscribe(i);return()=>{f(),n()}},dispose(){}}),[]),E=a?.source?.path,S=C.useCallback(i=>{const f=h.onChange(i),n=H.subscribe(i);let s=null;const u=()=>{s?.(),s=W().find(B=>B.documentId===o)?.onFrame(i)??null};u();const x=Z(u);return()=>{f(),n(),x(),s?.()}},[o]),m=C.useSyncExternalStore(S,qe);C.useEffect(()=>{if(!o)return;const i=h.overlayGroups(),f=()=>{const s=W().find(u=>u.documentId===o);if(s)for(const{kind:u,object:x}of i)s.setHelper(u,x)};f();const n=Z(f);return()=>{n();const s=W().find(u=>u.documentId===o);for(const{kind:u}of i)s?.setHelper(u,null)}},[o]),C.useEffect(()=>{if(!o)return;const{transport:i}=$();let f=null;const n=()=>{if(f)return;const u=i.for(o);u&&(f=H.attachTo(u))};n();const s=i.subscribe(n);return()=>{s(),f?.()}},[o]),C.useEffect(()=>{if(!o)return;const i=()=>W().find(g=>g.documentId===o);let f,n=null;const s=new Ne,u=()=>i()?.rig().drawCamera()??s,x=()=>{const g=i();g!==f&&(n?.(),n=g?g.onFrame(()=>h.refreshRendered()):null,f=g);const{lighting:R}=je(o);h.holdRendered(R.source==="scene"&&g?u:null),h.setWorkbench(R.source==="studio"&&R.studioPreset===de.id)};x();const B=ye(x),T=Z(x);return()=>{B(),T(),n?.(),h.holdRendered(null),h.setWorkbench(!1)}},[o]);const v=C.useRef(null),y=i=>i.button===2&&i.shiftKey&&i.target instanceof HTMLCanvasElement,j=i=>{if(!y(i)){v.current=null;return}i.preventDefault(),i.stopPropagation(),v.current={id:i.pointerId,x:i.clientX,y:i.clientY},i.isTrusted&&i.target.setPointerCapture(i.pointerId)},k=()=>{v.current=null},w=i=>{const f=v.current;if(f===null||i.pointerId!==f.id||i.button!==2||(v.current=null,i.preventDefault(),i.stopPropagation(),Math.hypot(i.clientX-f.x,i.clientY-f.y)>3))return;const n=h.placeCursor(i.clientX,i.clientY,i.target);if(n===null)return;const[s,u,x]=n.location,[B,T,g,R]=n.rotation;X(`from mathutils import Matrix, Quaternion, Vector
12
+ bpy.context.scene.cursor.matrix = Matrix.LocRotScale(Vector((${s}, ${u}, ${x})), Quaternion((${B}, ${T}, ${g}, ${R})), None)`,!1,"Set 3D Cursor").then(M=>{M.error!==null&&$().console.error(`Blender refused the 3D cursor: ${M.error}`,"blender-cursor")},M=>$().console.error(`The 3D cursor was not written to Blender: ${String(M)}`,"blender-cursor"))},F=i=>{y(i)&&i.preventDefault()};if(!o)return null;const I=d.Object3DAuthoring;return p.jsx("div",{style:{display:"contents"},onPointerDownCapture:j,onPointerUpCapture:w,onPointerCancelCapture:k,onLostPointerCaptureCapture:k,onContextMenuCapture:F,children:p.jsx(I,{active:r??!0,documentId:o,sourcePath:E??"blender:runtime",displayName:a?.label??"Model",...m===null?{}:{subject:m},gridScale:Qe,cameraView:Ze,build:O,audit:!1,authoring:Ge,cameraDirection:[.8187,.4458,.3617],openingFit:3,openingView:h.savedView(),presentation:(()=>{const i=h.savedView();return i?{camera:{fov:ue(i.lens)}}:null})(),stageKind:Xe,dressing:{environment:!1,keyLight:!1,viewLocked:h.studioLights()}})})}export{It as Toolbar,Mt as default,Xe as documentKind,Rt as inspectorBuiltins,Lt as inspectorRail,Nt as point,Ft as title};