@volter/cyclotron 0.5.212 → 0.5.213

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 (598) hide show
  1. package/BUNDLED_NOTICES +375 -2995
  2. package/README.md +9 -5
  3. package/dist/.vite/manifest.json +529 -1764
  4. package/dist/assets/AudioViewer-B5pkIGXS.js +1 -0
  5. package/dist/assets/ImageViewer-BPVLEEQ2.js +1 -0
  6. package/dist/assets/JsonAssetDocument-DuVW9del.js +2 -0
  7. package/dist/assets/ProjectAuthoringBootstrap-CZJz4Svb.js +2 -0
  8. package/dist/assets/SourceAssetViewer-LwHBW53R.js +1 -0
  9. package/dist/assets/VideoViewer-Bfjjp4zH.js +1 -0
  10. package/dist/assets/{client-Dj2xr2fw.js → client-BLXKEWrR.js} +1 -1
  11. package/dist/assets/{index-Bc73pJIv.js → index-BKjLHm6K.js} +131 -131
  12. package/dist/assets/index-CJcVFJ-l.css +1 -0
  13. package/dist/assets/product-CaIfLQVS.js +1 -0
  14. package/dist/assets/story-capture-C3xmgE62.js +1 -0
  15. package/dist/assets/volter-sdk-DT0xmh2J.js +1407 -0
  16. package/dist/assets/volter-sdk-activation-events-B-WERmWU.js +1 -0
  17. package/dist/assets/volter-sdk-active-project-DvEsy8Q6.js +1 -0
  18. package/dist/assets/volter-sdk-adapter-editor-config-CQ5V6W-o.js +1 -0
  19. package/dist/assets/volter-sdk-animation-animation-clock-Cy7j_2qF.js +1 -0
  20. package/dist/assets/volter-sdk-animation-stage-transport-DoUDq6Gb.js +1 -0
  21. package/dist/assets/volter-sdk-api-base-Dr1bx5e0.js +1 -0
  22. package/dist/assets/volter-sdk-api-project-open-D4nPvIPU.js +1 -0
  23. package/dist/assets/volter-sdk-api-project-source-DoO7WBwQ.js +1 -0
  24. package/dist/assets/volter-sdk-api-settings-BEHgO5wf.js +1 -0
  25. package/dist/assets/volter-sdk-asset-capabilities-CGkNwaAe.js +1 -0
  26. package/dist/assets/volter-sdk-asset-document-write-policy-CzWM1HhK.js +1 -0
  27. package/dist/assets/volter-sdk-asset-editor-context-BkSK1vL1.js +1 -0
  28. package/dist/assets/volter-sdk-asset-thumbnails-zSmJgI_x.js +1 -0
  29. package/dist/assets/volter-sdk-asset-viewers-B-ICvlkR.js +1 -0
  30. package/dist/assets/volter-sdk-asset-workflow-project-content-C6Ow0R-F.js +1 -0
  31. package/dist/assets/volter-sdk-authoring-active-adapter-CKuWwxgH.js +1 -0
  32. package/dist/assets/volter-sdk-authoring-boundary-authoring-adapter-DTwFKBkS.js +1 -0
  33. package/dist/assets/volter-sdk-authoring-composite-authoring-adapter-iRSbSHpV.js +1 -0
  34. package/dist/assets/volter-sdk-authoring-consumer-actions-DK9-B-wg.js +1 -0
  35. package/dist/assets/volter-sdk-authoring-design-time-mount-registry-BQnWcBVe.js +1 -0
  36. package/dist/assets/volter-sdk-authoring-design-time-roots-BKSmkD7_.js +1 -0
  37. package/dist/assets/volter-sdk-authoring-layered-pick-C-YvuxEG.js +1 -0
  38. package/dist/assets/volter-sdk-authoring-no-authoring-adapter-Cv9DD6G0.js +1 -0
  39. package/dist/assets/volter-sdk-authoring-panel-authoring-BLOrFs8L.js +1 -0
  40. package/dist/assets/volter-sdk-authoring-react-design-canvas-style-Dr9i31o5.js +1 -0
  41. package/dist/assets/{volter-sdk-authoring-react-story-board-aeiEUlbU.js → volter-sdk-authoring-react-story-board-BlCQQM-8.js} +1 -1
  42. package/dist/assets/volter-sdk-authoring-seam-evidence-CjetY_ZG.js +1 -0
  43. package/dist/assets/volter-sdk-authoring-selection-scope-BxmbC71H.js +1 -0
  44. package/dist/assets/volter-sdk-authoring-shell-document-ops-DDb8oGx9.js +1 -0
  45. package/dist/assets/volter-sdk-authoring-stage-root-B50LLhnJ.js +1 -0
  46. package/dist/assets/volter-sdk-authoring-story-board-chrome-fit-BVV9fbcw.js +1 -0
  47. package/dist/assets/{volter-sdk-authoring-viewport-tool-context-DzsD6JQH.js → volter-sdk-authoring-viewport-tool-context-cQafPSkT.js} +1 -1
  48. package/dist/assets/volter-sdk-authoring-viewport-tool-owner-BppqL4f_.js +1 -0
  49. package/dist/assets/volter-sdk-authoring-world-session-state-BlpdiKod.js +1 -0
  50. package/dist/assets/volter-sdk-bitmap-label-BbtGPWgP.js +1 -0
  51. package/dist/assets/{volter-sdk-breakpoint-state-BPnDN_XU.js → volter-sdk-breakpoint-state-DCFuSvgm.js} +1 -1
  52. package/dist/assets/volter-sdk-bytes-codec-CrNeVT4e.js +1 -0
  53. package/dist/assets/volter-sdk-cancellation-reason-ByOH3mlF.js +1 -0
  54. package/dist/assets/volter-sdk-canvas-frames-BU8Rqr4J.js +1 -0
  55. package/dist/assets/volter-sdk-capture-size-D4cNT2XC.js +1 -0
  56. package/dist/assets/volter-sdk-chrome-registry-qHUiDauw.js +1 -0
  57. package/dist/assets/volter-sdk-command-result-text-2wzEhQ5t.js +1 -0
  58. package/dist/assets/volter-sdk-commands-C4RgHEOa.js +1 -0
  59. package/dist/assets/volter-sdk-component-board-registry-6gFZBkTP.js +1 -0
  60. package/dist/assets/volter-sdk-components-AssetEditorShell-CQVLedvW.js +1 -0
  61. package/dist/assets/volter-sdk-components-InspectorCanvasPreview-CN5ROhNT.js +1 -0
  62. package/dist/assets/volter-sdk-components-SurfaceStateOverlay-Cc9Ov1Ol.js +1 -0
  63. package/dist/assets/{volter-sdk-components-AssetEditorShell-BJL1am3b.js → volter-sdk-components-Toolbar-ZoV9Yq_A.js} +1 -1
  64. package/dist/assets/volter-sdk-components-TransientHint-BML2V3uu.js +1 -0
  65. package/dist/assets/volter-sdk-components-inspector-preview-section-BhDjhUyz.js +1 -0
  66. package/dist/assets/volter-sdk-components-use-after-paint-BVSO4qjV.js +1 -0
  67. package/dist/assets/volter-sdk-components-workspace-history-CThvGfsY.js +1 -0
  68. package/dist/assets/volter-sdk-content-entry-source-registry-CJLVq3tC.js +1 -0
  69. package/dist/assets/volter-sdk-contribution-surfaces-CeEDmriM.js +1 -0
  70. package/dist/assets/volter-sdk-contributions-x6j41XZp.js +1 -0
  71. package/dist/assets/volter-sdk-coverage-design-time-surfaces-D-tNGazo.js +1 -0
  72. package/dist/assets/volter-sdk-creation-site-registry-64gyrZPD.js +1 -0
  73. package/dist/assets/volter-sdk-css-numeric-style-CXeWqAoG.js +1 -0
  74. package/dist/assets/volter-sdk-declared-tools-BAzHxyUW.js +1 -0
  75. package/dist/assets/{volter-sdk-document-areas-x47hqeuC.js → volter-sdk-document-areas-4DXjy0el.js} +1 -1
  76. package/dist/assets/volter-sdk-document-layer-B4VYMPZ9.js +1 -0
  77. package/dist/assets/volter-sdk-document-open-registry-BLDMaEoN.js +1 -0
  78. package/dist/assets/volter-sdk-document-play-extension-Dv3fyS6K.js +1 -0
  79. package/dist/assets/volter-sdk-document-probe-drBhAyza.js +1 -0
  80. package/dist/assets/volter-sdk-document-stage-sessions-CtI9anAf.js +1 -0
  81. package/dist/assets/volter-sdk-document-viewports-BO0N7VyN.js +1 -0
  82. package/dist/assets/volter-sdk-editor-commands-BJ9Otxzu.js +1 -0
  83. package/dist/assets/volter-sdk-editor-console-BaGgfWmH.js +1 -0
  84. package/dist/assets/volter-sdk-editor-document-probe-D0ZhaXHx.js +1 -0
  85. package/dist/assets/volter-sdk-editor-mode-B07FDozS.js +1 -0
  86. package/dist/assets/volter-sdk-editor-runtime-D00Du7hG.js +1 -0
  87. package/dist/assets/volter-sdk-editor-server-response-C6kOPAsW.js +1 -0
  88. package/dist/assets/volter-sdk-editor-session-attribution-CggpIFb4.js +1 -0
  89. package/dist/assets/volter-sdk-editor-view-DEMsxlaT.js +1 -0
  90. package/dist/assets/volter-sdk-environment-images-OQtFG1kA.js +1 -0
  91. package/dist/assets/volter-sdk-extension-script-DanTHcyo.js +1 -0
  92. package/dist/assets/volter-sdk-eyedropper-session-BfVXtjzc.js +1 -0
  93. package/dist/assets/volter-sdk-files-file-provider-CXL6oCMd.js +1 -0
  94. package/dist/assets/volter-sdk-files-project-files-SBAE37py.js +1 -0
  95. package/dist/assets/volter-sdk-framed-document-capture-7TnE8pn1.js +1 -0
  96. package/dist/assets/volter-sdk-framed-document-driver-C0K3-SRt.js +1 -0
  97. package/dist/assets/volter-sdk-hierarchy-component-marks-BmJEMvvO.js +1 -0
  98. package/dist/assets/volter-sdk-hierarchy-kind-icon-CrwdpecY.js +1 -0
  99. package/dist/assets/{volter-sdk-hierarchy-node-rows-CNCdvWZM.js → volter-sdk-hierarchy-node-rows-FcK7_ULi.js} +1 -1
  100. package/dist/assets/{volter-sdk-hierarchy-projection-BXet4MmW.js → volter-sdk-hierarchy-projection-CKzUOZUa.js} +1 -1
  101. package/dist/assets/volter-sdk-hierarchy-row-media-Czg40Ddi.js +1 -0
  102. package/dist/assets/volter-sdk-hierarchy-row-model-BGzmcywF.js +1 -0
  103. package/dist/assets/volter-sdk-hierarchy-rows-VAI0psTR.js +1 -0
  104. package/dist/assets/volter-sdk-hierarchy-walk-CaVqG7v2.js +1 -0
  105. package/dist/assets/volter-sdk-history-history-delegate-DH_xBvdh.js +1 -0
  106. package/dist/assets/volter-sdk-history-history-service-D0n0Gl5Z.js +1 -0
  107. package/dist/assets/volter-sdk-history-persistence-coordinator-CcywAFdm.js +1 -0
  108. package/dist/assets/volter-sdk-history-resource-registry-DMTlnwGv.js +1 -0
  109. package/dist/assets/volter-sdk-history-snapshot-store-BVh1DtBp.js +1 -0
  110. package/dist/assets/volter-sdk-history-source-history-backend-ulJ-65tX.js +1 -0
  111. package/dist/assets/volter-sdk-hmr-registration-group-DvMQVKyO.js +1 -0
  112. package/dist/assets/volter-sdk-hmr-stable-react-context-BMVr5YVk.js +1 -0
  113. package/dist/assets/volter-sdk-host-D765Py2w.js +1 -0
  114. package/dist/assets/{volter-sdk-hotkeys-D8xO5kx0.js → volter-sdk-hotkeys-TesTKdAZ.js} +1 -1
  115. package/dist/assets/{volter-sdk-index-CTFkHN4C.js → volter-sdk-index-BABXozHr.js} +1 -1
  116. package/dist/assets/volter-sdk-inference-diagnostics-CsDbQ0M5.js +1 -0
  117. package/dist/assets/volter-sdk-inspection-document-subject-BMRD77Va.js +1 -0
  118. package/dist/assets/volter-sdk-inspection-group-icons-Wpz-YhkE.js +1 -0
  119. package/dist/assets/volter-sdk-inspection-model-BVOyStdc.js +1 -0
  120. package/dist/assets/volter-sdk-inspection-node-media-B8AL8_3F.js +1 -0
  121. package/dist/assets/volter-sdk-inspection-null-subject-d5bQZCbS.js +1 -0
  122. package/dist/assets/volter-sdk-inspector-property-grouping-BqrZkwo4.js +1 -0
  123. package/dist/assets/volter-sdk-inspector-section-registry-C6U15zvC.js +1 -0
  124. package/dist/assets/volter-sdk-js-heap-CcOnY0kf.js +1 -0
  125. package/dist/assets/{volter-sdk-keymap-presets-Vq8J3DoG.js → volter-sdk-keymap-presets-CSM-jVcZ.js} +1 -1
  126. package/dist/assets/volter-sdk-layout-arrangements-DHA3uifx.js +1 -0
  127. package/dist/assets/volter-sdk-layouts-4v9ECCn9.js +1 -0
  128. package/dist/assets/volter-sdk-light-explorer-model-CPuZjpiR.js +1 -0
  129. package/dist/assets/volter-sdk-live-seam-evidence-B_RyDaOp.js +1 -0
  130. package/dist/assets/volter-sdk-live-session-registry-C6gHroaH.js +1 -0
  131. package/dist/assets/{volter-sdk-manifest-project-DIThdJ0z.js → volter-sdk-manifest-project-CVVUDDuL.js} +1 -1
  132. package/dist/assets/volter-sdk-mount-css-scope-DaJoEo3v.js +1 -0
  133. package/dist/assets/volter-sdk-mount-failure-report-Cm92oiGJ.js +1 -0
  134. package/dist/assets/volter-sdk-native-selection-style-Bp4IBnA4.js +1 -0
  135. package/dist/assets/volter-sdk-photograph-notice-C6_gZGpW.js +1 -0
  136. package/dist/assets/volter-sdk-play-camera-flight-SwlYhOxW.js +1 -0
  137. package/dist/assets/volter-sdk-product-command-G8kKVJ-i.js +1 -0
  138. package/dist/assets/volter-sdk-progress-4GGmPvZn.js +1 -0
  139. package/dist/assets/volter-sdk-project-module-changes-DIrDIHeD.js +1 -0
  140. package/dist/assets/volter-sdk-project-module-url-BuAUWpus.js +1 -0
  141. package/dist/assets/volter-sdk-project-output-roots-BON7FOwQ.js +1 -0
  142. package/dist/assets/{volter-sdk-project-tab-census-Cos8L4lu.js → volter-sdk-project-tab-census-CO06UOh-.js} +1 -1
  143. package/dist/assets/volter-sdk-renderer-resource-counts-2kLiD8_S.js +1 -0
  144. package/dist/assets/volter-sdk-scoped-project-css-DA63CYkM.js +1 -0
  145. package/dist/assets/volter-sdk-selection-CSUq7EiY.js +1 -0
  146. package/dist/assets/volter-sdk-served-url-B_MypeId.js +1 -0
  147. package/dist/assets/volter-sdk-settings-settings-provider-CJuWxTB5.js +1 -0
  148. package/dist/assets/volter-sdk-settings-store-CEFKDj0h.js +1 -0
  149. package/dist/assets/volter-sdk-shell-store-Cl4sX9p4.js +1 -0
  150. package/dist/assets/volter-sdk-shell-store-door-DGjybg0J.js +1 -0
  151. package/dist/assets/volter-sdk-source-conflict-CV8Gk053.js +1 -0
  152. package/dist/assets/volter-sdk-stage-context-Cb0SaYhi.js +1 -0
  153. package/dist/assets/volter-sdk-stage-invalidation-VlBciYA0.js +1 -0
  154. package/dist/assets/volter-sdk-stage-store-registry-BpIy_QKq.js +1 -0
  155. package/dist/assets/{volter-sdk-startup-failure-CtJyTS-2.js → volter-sdk-startup-failure-C_8H4xuP.js} +1 -1
  156. package/dist/assets/{volter-sdk-stories-StoryPreviewMount-DjhZUmf-.js → volter-sdk-stories-StoryPreviewMount-BUX42gIR.js} +1 -1
  157. package/dist/assets/volter-sdk-stories-compose-project-stories-CkSd4Si5.js +1 -0
  158. package/dist/assets/volter-sdk-stories-scope-Dndn7MD8.js +1 -0
  159. package/dist/assets/volter-sdk-stories-story-declared-medium-Byi4XWeJ.js +1 -0
  160. package/dist/assets/volter-sdk-stories-story-dom-runtime-BS1VPvJ6.js +1 -0
  161. package/dist/assets/volter-sdk-stories-story-grouping-CpNh4cUf.js +1 -0
  162. package/dist/assets/{volter-sdk-story-document-openers-Df7Tcu2n.js → volter-sdk-story-document-openers-Ba5jQqay.js} +1 -1
  163. package/dist/assets/volter-sdk-surface-state-BhQ45ars.js +1 -0
  164. package/dist/assets/volter-sdk-tab-census-D0r0s37y.js +1 -0
  165. package/dist/assets/volter-sdk-tool-contribution-convention-JCXL6f2w.js +1 -0
  166. package/dist/assets/volter-sdk-transform-mode-request-Cwk_Kyty.js +1 -0
  167. package/dist/assets/volter-sdk-transient-hint-BOfFzAV8.js +1 -0
  168. package/dist/assets/{volter-sdk-types-BOfYN_tN.js → volter-sdk-types-CkT8l5N_.js} +1 -1
  169. package/dist/assets/volter-sdk-ui-source-file-region-resolver-Cfza3eEl.js +1 -0
  170. package/dist/assets/{volter-sdk-ui-source-inspect-gofMOHNR.js → volter-sdk-ui-source-inspect-CEjmAN75.js} +1 -1
  171. package/dist/assets/{volter-sdk-ui-source-source-write-backend-BgVis1yZ.js → volter-sdk-ui-source-source-write-backend-0njgRdI6.js} +1 -1
  172. package/dist/assets/volter-sdk-ui-source-tier-source-write-backend-CpsxorYU.js +1 -0
  173. package/dist/assets/volter-sdk-viewport-activation-timings-B3hRTu3A.js +1 -0
  174. package/dist/assets/volter-sdk-viewport-editor-controls-DDBd-VqO.js +1 -0
  175. package/dist/assets/volter-sdk-viewport-presentation-DRhiAH1h.js +1 -0
  176. package/dist/assets/volter-sdk-volter-contributions-nlGXjgJZ.js +1 -0
  177. package/dist/assets/volter-sdk-wait-until-CMvYQmO8.js +1 -0
  178. package/dist/assets/volter-sdk-widgets-design-system-BJOyO8sO.js +1 -0
  179. package/dist/assets/volter-sdk-widgets-editor-appearance-eVtkxsIm.js +1 -0
  180. package/dist/assets/volter-sdk-widgets-editor-material-BoQP_5SK.js +1 -0
  181. package/dist/assets/volter-sdk-widgets-icon-set-registry-CP0D74kc.js +1 -0
  182. package/dist/assets/volter-sdk-widgets-index-De34FpYu.js +1 -0
  183. package/dist/assets/volter-sdk-widgets-inspector-widgets-AlignmentGrid-_GjMjIGb.js +1 -0
  184. package/dist/assets/volter-sdk-widgets-inspector-widgets-AssetSlotPicker-B7vN7BEd.js +1 -0
  185. package/dist/assets/volter-sdk-widgets-inspector-widgets-BorderEditor-E2J8cpyT.js +1 -0
  186. package/dist/assets/volter-sdk-widgets-inspector-widgets-ColorPicker-D6TERGKs.js +1 -0
  187. package/dist/assets/volter-sdk-widgets-inspector-widgets-CurveEditor-CXR8n-CA.js +1 -0
  188. package/dist/assets/{volter-sdk-widgets-inspector-widgets-FilterEditor-DKkdim3n.js → volter-sdk-widgets-inspector-widgets-FilterEditor-CDvfWY4Q.js} +1 -1
  189. package/dist/assets/volter-sdk-widgets-inspector-widgets-FontPicker-BgpW8FW8.js +1 -0
  190. package/dist/assets/volter-sdk-widgets-inspector-widgets-GradientEditor-DOOBkXjY.js +1 -0
  191. package/dist/assets/volter-sdk-widgets-inspector-widgets-ScrubbableInput-1NXWR_gB.js +1 -0
  192. package/dist/assets/volter-sdk-widgets-inspector-widgets-ShadowEditor-Cd2-HwFn.js +1 -0
  193. package/dist/assets/volter-sdk-widgets-inspector-widgets-color-utils-C4HuSjFu.js +1 -0
  194. package/dist/assets/volter-sdk-widgets-inspector-widgets-curve-utils-DUU2CCtc.js +1 -0
  195. package/dist/assets/volter-sdk-widgets-inspector-widgets-index-D5kwrOUQ.js +1 -0
  196. package/dist/assets/volter-sdk-widgets-inspector-widgets-shared-CkFN2SUn.js +1 -0
  197. package/dist/assets/volter-sdk-widgets-interactive-edit-scope-DynpKMMZ.js +1 -0
  198. package/dist/assets/{volter-sdk-widgets-palette-colors-Byzw9YHf.js → volter-sdk-widgets-palette-colors-DhL1I42R.js} +1 -1
  199. package/dist/assets/volter-sdk-widgets-patterns-Dialog-EUtcZi0Y.js +1 -0
  200. package/dist/assets/volter-sdk-widgets-patterns-Fields-Bl_eaBej.js +1 -0
  201. package/dist/assets/volter-sdk-widgets-patterns-List--NE_1N5-.js +1 -0
  202. package/dist/assets/volter-sdk-widgets-patterns-StateSurface-BHXpv7qi.js +1 -0
  203. package/dist/assets/volter-sdk-widgets-patterns-Surfaces-BdKa5HGV.js +1 -0
  204. package/dist/assets/volter-sdk-widgets-patterns-Tabs-sFV7f1UP.js +1 -0
  205. package/dist/assets/volter-sdk-widgets-patterns-Toolbar-CIr5Cs49.js +1 -0
  206. package/dist/assets/volter-sdk-widgets-patterns-Tree-C2YHfddf.js +1 -0
  207. package/dist/assets/volter-sdk-widgets-primitives-AnchoredMenu-DCclspnW.js +1 -0
  208. package/dist/assets/volter-sdk-widgets-primitives-Button-B0YxR4ea.js +1 -0
  209. package/dist/assets/volter-sdk-widgets-primitives-ColorInput-B1_SLTuc.js +1 -0
  210. package/dist/assets/volter-sdk-widgets-primitives-DraftTextInput-CpHzPdt8.js +1 -0
  211. package/dist/assets/volter-sdk-widgets-primitives-EditorIcon-Dw4knhya.js +1 -0
  212. package/dist/assets/volter-sdk-widgets-primitives-FormControls-BAbRanmE.js +1 -0
  213. package/dist/assets/volter-sdk-widgets-primitives-HoverPreview-Cj7jKNd4.js +1 -0
  214. package/dist/assets/volter-sdk-widgets-primitives-JsonInput-C0DCI5bE.js +1 -0
  215. package/dist/assets/volter-sdk-widgets-primitives-Layout-gT4Z6mtt.js +1 -0
  216. package/dist/assets/volter-sdk-widgets-primitives-Menu-9EESAp9m.js +1 -0
  217. package/dist/assets/volter-sdk-widgets-primitives-NumberInput-Dk-5zqJ8.js +1 -0
  218. package/dist/assets/volter-sdk-widgets-primitives-Panel-BQWJF-Pb.js +1 -0
  219. package/dist/assets/volter-sdk-widgets-primitives-SectionHeader-DXvmafCK.js +1 -0
  220. package/dist/assets/volter-sdk-widgets-primitives-Text-yBrdWK2w.js +1 -0
  221. package/dist/assets/volter-sdk-widgets-primitives-ThemeRootPortal-CRhefpUL.js +1 -0
  222. package/dist/assets/volter-sdk-widgets-primitives-Tooltip-D5Kcb-ZC.js +1 -0
  223. package/dist/assets/volter-sdk-widgets-primitives-Vec3Input-DiG6PEIe.js +1 -0
  224. package/dist/assets/volter-sdk-widgets-primitives-clamp-to-viewport-DhnSxXVK.js +1 -0
  225. package/dist/assets/volter-sdk-widgets-primitives-editor-icons-e65mgyAk.js +1 -0
  226. package/dist/assets/volter-sdk-widgets-primitives-panel-header-styles-BVL0mN8g.js +1 -0
  227. package/dist/assets/volter-sdk-widgets-theme-C-_RU9Ov.js +1 -0
  228. package/dist/assets/volter-sdk-widgets-z-index-CrJJXeKL.js +1 -0
  229. package/dist/assets/volter-sdk-worker-call-metrics-BTfmngck.js +1 -0
  230. package/dist/assets/{volter-sdk-workspace-core-utilities-BaAh2Ei8.js → volter-sdk-workspace-core-utilities-DtHGK9PF.js} +1 -1
  231. package/dist/assets/volter-sdk-workspace-document-ids-COULA7c6.js +1 -0
  232. package/dist/assets/volter-sdk-workspace-document-registry-6m5csVP7.js +1 -0
  233. package/dist/assets/volter-sdk-workspace-document-restore-M8ifJMou.js +1 -0
  234. package/dist/assets/{volter-sdk-workspace-host-commands-72RdJeW4.js → volter-sdk-workspace-host-commands-8Qzej--P.js} +1 -1
  235. package/dist/assets/volter-sdk-workspace-static-panels-Ckk7qUuS.js +1 -0
  236. package/dist/assets/volter-sdk-workspace-status-registry-BdU0dZAt.js +1 -0
  237. package/dist/assets/volter-sdk-workspace-utility-registry-BHxymD2l.js +1 -0
  238. package/dist/assets/volter-sdk-world-canvas-viewport-state-CHO8s9gE.js +1 -0
  239. package/dist/assets/volter-sdk-world-pan-state-C-9xgzAh.js +1 -0
  240. package/dist/assets/volter-sdk-write-pipe-CJHg7J4i.js +1 -0
  241. package/dist/assets/{volter-shared-fontawesome-B-OhfZs4.js → volter-shared-fontawesome-BEv9WEZj.js} +1 -1
  242. package/dist/assets/{volter-shared-jsx-dev-runtime-akPt_-OI.js → volter-shared-jsx-dev-runtime-domcKDU3.js} +1 -1
  243. package/dist/assets/{volter-shared-jsx-runtime-CKQtDN6l.js → volter-shared-jsx-runtime-Cu7pVW-1.js} +1 -1
  244. package/dist/assets/{volter-shared-react-STQK0zHl.js → volter-shared-react-BLHga76C.js} +1 -1
  245. package/dist/assets/volter-shared-react-dom-client-vi6WsWu2.js +1 -0
  246. package/dist/assets/{volter-shared-react-dom-2aA0eyQg.js → volter-shared-react-dom-kzJVGsQd.js} +1 -1
  247. package/dist/assets/volter-shared-three-BWbOWtM5.js +4220 -0
  248. package/dist/volter-shared-modules.json +225 -225
  249. package/dist/volter-shared-react.json +6 -6
  250. package/dist/volter-shared-three.json +1 -1
  251. package/dist-node/cli.js +182 -127
  252. package/dist-node/create.js +18 -21
  253. package/package.json +16 -16
  254. package/src/index.ts +1 -2
  255. package/src/product-id.d.ts +4 -0
  256. package/starter/AGENTS.md +132 -157
  257. package/starter/game/levels/MainLevel.tsx +24 -0
  258. package/starter/game/prefabs/ground/Ground.tsx +24 -0
  259. package/starter/game/{levels → prefabs/ground}/ground.blend +0 -0
  260. package/starter/game/prefabs/ground/ground.glb +0 -0
  261. package/starter/game/prefabs/ground/ground.py +106 -0
  262. package/dist/assets/AudioViewer-EMpvKC-X.js +0 -1
  263. package/dist/assets/BVHLoader-CpdLvOHd.js +0 -1
  264. package/dist/assets/ColladaLoader-D1GMlAA9.js +0 -3
  265. package/dist/assets/EntityModelDocument-rYF-p8Fo.js +0 -1
  266. package/dist/assets/EnvironmentAssetDocument-DfykWLLS.js +0 -1
  267. package/dist/assets/FBXLoader-DKZ0UD3F.js +0 -1
  268. package/dist/assets/ImageViewer-B0OqXrVU.js +0 -1
  269. package/dist/assets/InspectorObjectPreview-CwCqdv76.js +0 -1
  270. package/dist/assets/JsonAssetDocument-PzzxK-v9.js +0 -2
  271. package/dist/assets/LiveModuleDocument-Bq9J5nMx.js +0 -1
  272. package/dist/assets/LutAssetDocument-CyzgDCYJ.js +0 -1
  273. package/dist/assets/MTLLoader-BOaPmAvY.js +0 -2
  274. package/dist/assets/ModelAssetDocument-8he5iZqV.js +0 -1
  275. package/dist/assets/OBJLoader-BLg7dmPe.js +0 -5
  276. package/dist/assets/Object3DDocumentToolbar-CLfEn5i-.js +0 -1
  277. package/dist/assets/Object3DDocumentToolbar-WK1RY6Gg.css +0 -1
  278. package/dist/assets/OrbitControls-DxYDYiEc.js +0 -1
  279. package/dist/assets/PLYLoader-bAg6lYzP.js +0 -2
  280. package/dist/assets/ProjectAuthoringBootstrap-FVTj-Ag9.js +0 -2
  281. package/dist/assets/QuarksAssetDocument-DBJQXZ9u.js +0 -2
  282. package/dist/assets/RectAreaLightUniformsLib-CQLblkbI.js +0 -1
  283. package/dist/assets/STLLoader-C8jImL_t.js +0 -1
  284. package/dist/assets/ShaderAssetDocument-C3QolcYl.js +0 -12
  285. package/dist/assets/SourceAssetViewer-xB9kAyPa.js +0 -1
  286. package/dist/assets/StageHost-BZBLHaPe.css +0 -1
  287. package/dist/assets/StageHost-xYvmzMBo.js +0 -1231
  288. package/dist/assets/TDSLoader-DLNvOc6c.js +0 -1
  289. package/dist/assets/ToolObject3DPreview-4XgGyXTu.js +0 -2
  290. package/dist/assets/VideoViewer-BruuQyu3.js +0 -1
  291. package/dist/assets/ViewportShadingMenu-amXbnRtl.js +0 -1
  292. package/dist/assets/animation-mixers.service-Ce1JMqA2.js +0 -1
  293. package/dist/assets/animation-timeline.utility-CzsUvu3v.js +0 -1
  294. package/dist/assets/asset-preview-CtqauM13.js +0 -4
  295. package/dist/assets/basis_transcoder-VXdx5NbI.wasm +0 -0
  296. package/dist/assets/basis_transcoder-o4Hde_L7.js +0 -19
  297. package/dist/assets/blender-base64-Cxqc4R5f.js +0 -1
  298. package/dist/assets/blender-display-shaders-BPmHILFy.lut +0 -0
  299. package/dist/assets/blender-emscripten-engine-Bl_j9xEY.js +0 -26
  300. package/dist/assets/blender-motion-worker-CtT2cV3V.js +0 -1
  301. package/dist/assets/blender-node-editor.document-lj1qK5Vu.js +0 -1
  302. package/dist/assets/blender-outliner-model-BqLWEXta.js +0 -7359
  303. package/dist/assets/blender-properties-model-DD-2sMKx.js +0 -1
  304. package/dist/assets/blender-properties-tab-BmudfsC3.js +0 -3
  305. package/dist/assets/blender-runtime.document-IVSATTnk.js +0 -13
  306. package/dist/assets/blender-screenshot.service-BRgdtDQC.js +0 -1
  307. package/dist/assets/blender-timeline.document-8jLaNF31.js +0 -1
  308. package/dist/assets/blender-uv-editor.document-BVcA7mi2.js +0 -1
  309. package/dist/assets/blender-version.status-B43F7DzT.js +0 -2
  310. package/dist/assets/blender-wali-engine-xLHhm0KZ.js +0 -2
  311. package/dist/assets/blender.environment-CG-pC7sk.js +0 -1
  312. package/dist/assets/blender.keymap-pRN8nlCs.js +0 -1
  313. package/dist/assets/blender.page-BYbkmFDE.js +0 -3
  314. package/dist/assets/blender.status-CcKJxsZ1.js +0 -1
  315. package/dist/assets/blender.style-DuFonR-j.js +0 -1
  316. package/dist/assets/chat.page-DzuAKPGP.js +0 -1
  317. package/dist/assets/city-EkhAOo5s.exr +0 -0
  318. package/dist/assets/courtyard-DqlebbpC.exr +0 -0
  319. package/dist/assets/draco_decoder-C32yEggz.wasm +0 -0
  320. package/dist/assets/draco_decoder-Z1_iN-Ht.wasm +0 -0
  321. package/dist/assets/draco_decoder-fzg4nYZr.js +0 -34
  322. package/dist/assets/draco_wasm_wrapper-DxJM36Ib.js +0 -117
  323. package/dist/assets/draco_wasm_wrapper-fZCQGLGb.js +0 -116
  324. package/dist/assets/editor-presentation-activity-CqJH4G9t.js +0 -1
  325. package/dist/assets/forest-P_CQY3b_.exr +0 -0
  326. package/dist/assets/index-C4uuH2ZE.css +0 -1
  327. package/dist/assets/index-DlAJXb_f.js +0 -952
  328. package/dist/assets/interior-Bo_lba15.exr +0 -0
  329. package/dist/assets/linear-resolve-B-MA5O31.js +0 -400
  330. package/dist/assets/live-mixers-B-bwLZ7c.js +0 -1
  331. package/dist/assets/maya.style-C3zx8RC5.js +0 -1
  332. package/dist/assets/model-inspection-_SFE7cp7.js +0 -1
  333. package/dist/assets/model.layout-CX-vaeBh.js +0 -1
  334. package/dist/assets/models.finder-DcOx-jsM.js +0 -1
  335. package/dist/assets/mtoon0-BNRZGBf8.blend +0 -0
  336. package/dist/assets/mtoon1-EgrxQlCc.blend +0 -0
  337. package/dist/assets/mtoon1_outline-xuubMJ8J.blend +0 -0
  338. package/dist/assets/mtoon_auto_setup-BF1c8USg.blend +0 -0
  339. package/dist/assets/night-CvV4Gybt.exr +0 -0
  340. package/dist/assets/object3d-document-session-registry-DvgzaByQ.js +0 -2
  341. package/dist/assets/output-pass-Bw2FZb8e.js +0 -85
  342. package/dist/assets/play-mode-BGq1Hn-c.js +0 -1
  343. package/dist/assets/play.page-DB2UjY0o.js +0 -1
  344. package/dist/assets/product-OBHh_Udv.js +0 -1
  345. package/dist/assets/properties-bone-constraints.inspector-NWLfoFX1.js +0 -1
  346. package/dist/assets/properties-bone.inspector-DybmNdBB.js +0 -1
  347. package/dist/assets/properties-collection.inspector-Cg7Jq6yG.js +0 -1
  348. package/dist/assets/properties-constraints.inspector-DY--pvLo.js +0 -1
  349. package/dist/assets/properties-data.inspector-CP1lurLb.js +0 -1
  350. package/dist/assets/properties-material.inspector-K8Qx5wr9.js +0 -1
  351. package/dist/assets/properties-modifiers.inspector-DOfP-8mX.js +0 -1
  352. package/dist/assets/properties-object.inspector-sqx6qMyu.js +0 -1
  353. package/dist/assets/properties-output.inspector-CUYUEC6S.js +0 -1
  354. package/dist/assets/properties-particles.inspector-oAWorORY.js +0 -1
  355. package/dist/assets/properties-physics.inspector-CQIHdcOy.js +0 -1
  356. package/dist/assets/properties-render.inspector-XTzdYo4u.js +0 -1
  357. package/dist/assets/properties-scene.inspector-BytOBuw9.js +0 -1
  358. package/dist/assets/properties-texture.inspector-2WNelhHG.js +0 -1
  359. package/dist/assets/properties-view-layer.inspector-DVSdqosc.js +0 -1
  360. package/dist/assets/properties-world.inspector-CHHm7g3j.js +0 -1
  361. package/dist/assets/regions-BlV6hTFd.js +0 -1
  362. package/dist/assets/sculpt.layout-BkvEflSA.js +0 -1
  363. package/dist/assets/session-addons-KcG0o7Xc.js +0 -76898
  364. package/dist/assets/shading.layout-V9LTFaVk.js +0 -1
  365. package/dist/assets/sky-precompute-worker-CPGW9t_C.js +0 -1
  366. package/dist/assets/spark.module-Cc-ZVx5e.js +0 -12120
  367. package/dist/assets/stage-keyboard-Rgvt63qI.js +0 -1
  368. package/dist/assets/stage-overlay-set-juTRuk99.js +0 -1
  369. package/dist/assets/stage-presence-markers-XsGUs3S-.js +0 -1
  370. package/dist/assets/stage-transform-tools-BE7m4omf.js +0 -1
  371. package/dist/assets/standard-viewport-dressing-asIXnD-w.js +0 -24
  372. package/dist/assets/std-scene-level-DeiReu6Z.js +0 -13
  373. package/dist/assets/std-scene.document-DyWMJhxA.js +0 -1
  374. package/dist/assets/story-capture-Y8_YS5DC.js +0 -1
  375. package/dist/assets/studio-CysTBGIb.exr +0 -0
  376. package/dist/assets/substance.style-CoQdG-kF.js +0 -1
  377. package/dist/assets/sunrise-Dj0psFrf.exr +0 -0
  378. package/dist/assets/sunset-Bw3x2Bot.exr +0 -0
  379. package/dist/assets/texture.layout-DASpHVht.js +0 -1
  380. package/dist/assets/three.module-JoAAxMWl.js +0 -4220
  381. package/dist/assets/three.page-Dy2q5JEV.js +0 -2
  382. package/dist/assets/transparent_z_write-xIRcVb2w.blend +0 -0
  383. package/dist/assets/transport-strip-cKO8FHd1.js +0 -1
  384. package/dist/assets/uv-editing.layout-CF_54oSA.js +0 -1
  385. package/dist/assets/volter-sdk-D8o6TU4A.js +0 -1407
  386. package/dist/assets/volter-sdk-activation-events-DVerKSly.js +0 -1
  387. package/dist/assets/volter-sdk-active-project-f6toeBI4.js +0 -1
  388. package/dist/assets/volter-sdk-adapter-editor-config-DpARQ4TT.js +0 -1
  389. package/dist/assets/volter-sdk-animation-animation-clock-BGyYYQu-.js +0 -1
  390. package/dist/assets/volter-sdk-animation-stage-transport-DWmyow46.js +0 -1
  391. package/dist/assets/volter-sdk-api-base-jDs2XVgE.js +0 -1
  392. package/dist/assets/volter-sdk-api-project-open-BAXokZLA.js +0 -1
  393. package/dist/assets/volter-sdk-api-project-source-D6FB4SmO.js +0 -1
  394. package/dist/assets/volter-sdk-api-settings-DqgndoPA.js +0 -1
  395. package/dist/assets/volter-sdk-asset-capabilities-B5mXIYBM.js +0 -1
  396. package/dist/assets/volter-sdk-asset-document-write-policy-B5aaFAwu.js +0 -1
  397. package/dist/assets/volter-sdk-asset-editor-context-BjtZQVgF.js +0 -1
  398. package/dist/assets/volter-sdk-asset-thumbnails-CROlpqPM.js +0 -1
  399. package/dist/assets/volter-sdk-asset-viewers-BejvElAX.js +0 -1
  400. package/dist/assets/volter-sdk-asset-workflow-project-content-D8h-TsJc.js +0 -1
  401. package/dist/assets/volter-sdk-authoring-active-adapter-DhKlZbyW.js +0 -1
  402. package/dist/assets/volter-sdk-authoring-boundary-authoring-adapter-xlppcGid.js +0 -1
  403. package/dist/assets/volter-sdk-authoring-composite-authoring-adapter-BfalSuB8.js +0 -1
  404. package/dist/assets/volter-sdk-authoring-consumer-actions-Hl6xkGAq.js +0 -1
  405. package/dist/assets/volter-sdk-authoring-design-time-mount-registry-2ZssbtYd.js +0 -1
  406. package/dist/assets/volter-sdk-authoring-design-time-roots-BNNZdEog.js +0 -1
  407. package/dist/assets/volter-sdk-authoring-layered-pick-AsUoH85M.js +0 -1
  408. package/dist/assets/volter-sdk-authoring-no-authoring-adapter-BX6sVPQX.js +0 -1
  409. package/dist/assets/volter-sdk-authoring-panel-authoring-BRs7fYSJ.js +0 -1
  410. package/dist/assets/volter-sdk-authoring-react-design-canvas-style-CdjO9_22.js +0 -1
  411. package/dist/assets/volter-sdk-authoring-seam-evidence-D58d2whR.js +0 -1
  412. package/dist/assets/volter-sdk-authoring-selection-scope-tqpilIPR.js +0 -1
  413. package/dist/assets/volter-sdk-authoring-shell-document-ops-ryosWWqt.js +0 -1
  414. package/dist/assets/volter-sdk-authoring-stage-root-yn7zP1QC.js +0 -1
  415. package/dist/assets/volter-sdk-authoring-story-board-chrome-fit-DgAAtVo8.js +0 -1
  416. package/dist/assets/volter-sdk-authoring-viewport-tool-owner-zIgbNhiQ.js +0 -1
  417. package/dist/assets/volter-sdk-authoring-world-session-state-DriMgIzp.js +0 -1
  418. package/dist/assets/volter-sdk-bitmap-label-Cwzw278F.js +0 -1
  419. package/dist/assets/volter-sdk-bytes-codec-CF2kvi68.js +0 -1
  420. package/dist/assets/volter-sdk-cancellation-reason-BQvS02ja.js +0 -1
  421. package/dist/assets/volter-sdk-canvas-frames-BkjDC0or.js +0 -1
  422. package/dist/assets/volter-sdk-capture-size-B3uOMPdw.js +0 -1
  423. package/dist/assets/volter-sdk-chrome-registry-Be1q89aJ.js +0 -1
  424. package/dist/assets/volter-sdk-command-result-text-DdPWoVLu.js +0 -1
  425. package/dist/assets/volter-sdk-commands-DI54EGoY.js +0 -1
  426. package/dist/assets/volter-sdk-component-board-registry-DtTf1V5m.js +0 -1
  427. package/dist/assets/volter-sdk-components-InspectorCanvasPreview-DpOxql_B.js +0 -1
  428. package/dist/assets/volter-sdk-components-SurfaceStateOverlay-BQ9KTVV1.js +0 -1
  429. package/dist/assets/volter-sdk-components-Toolbar-C6bwDRIc.js +0 -1
  430. package/dist/assets/volter-sdk-components-TransientHint-D3wtJ4fg.js +0 -1
  431. package/dist/assets/volter-sdk-components-inspector-preview-section-D1DnmKLE.js +0 -1
  432. package/dist/assets/volter-sdk-components-use-after-paint-ZgZgfmSR.js +0 -1
  433. package/dist/assets/volter-sdk-components-workspace-history-IZTWOoYh.js +0 -1
  434. package/dist/assets/volter-sdk-content-entry-source-registry-DV4a0g9R.js +0 -1
  435. package/dist/assets/volter-sdk-contribution-surfaces-BAzaKN1S.js +0 -1
  436. package/dist/assets/volter-sdk-contributions-D2D_badr.js +0 -1
  437. package/dist/assets/volter-sdk-coverage-design-time-surfaces-WtyoVY81.js +0 -1
  438. package/dist/assets/volter-sdk-creation-site-registry-DEJua1VB.js +0 -1
  439. package/dist/assets/volter-sdk-css-numeric-style-D1aEQUuP.js +0 -1
  440. package/dist/assets/volter-sdk-declared-tools-bEg2ZQju.js +0 -1
  441. package/dist/assets/volter-sdk-document-open-registry-BUdLp-BZ.js +0 -1
  442. package/dist/assets/volter-sdk-document-play-extension-BdtD2FcX.js +0 -1
  443. package/dist/assets/volter-sdk-document-probe-CvSMoXNj.js +0 -1
  444. package/dist/assets/volter-sdk-document-stage-sessions-BHE1T4gT.js +0 -1
  445. package/dist/assets/volter-sdk-document-viewports-BJqFXfe4.js +0 -1
  446. package/dist/assets/volter-sdk-editor-commands-CsYQVabs.js +0 -1
  447. package/dist/assets/volter-sdk-editor-console-lUTMRzeI.js +0 -1
  448. package/dist/assets/volter-sdk-editor-document-probe-BHRNXR9L.js +0 -1
  449. package/dist/assets/volter-sdk-editor-mode-BgYsrjin.js +0 -1
  450. package/dist/assets/volter-sdk-editor-runtime-CTy0Dw7-.js +0 -1
  451. package/dist/assets/volter-sdk-editor-server-response-oN9Horql.js +0 -1
  452. package/dist/assets/volter-sdk-editor-session-attribution-Ddoo0-e6.js +0 -1
  453. package/dist/assets/volter-sdk-editor-view-DEdcNl3N.js +0 -1
  454. package/dist/assets/volter-sdk-environment-images-Cbyno2vh.js +0 -1
  455. package/dist/assets/volter-sdk-extension-script-eemVEaFY.js +0 -1
  456. package/dist/assets/volter-sdk-eyedropper-session-BL5ceME-.js +0 -1
  457. package/dist/assets/volter-sdk-files-file-provider-D1vbGyMw.js +0 -1
  458. package/dist/assets/volter-sdk-files-project-files-CP9k503M.js +0 -1
  459. package/dist/assets/volter-sdk-framed-document-capture-DmqG4gUx.js +0 -1
  460. package/dist/assets/volter-sdk-framed-document-driver-B1ZAcb9l.js +0 -1
  461. package/dist/assets/volter-sdk-hierarchy-component-marks-DjtdLv04.js +0 -1
  462. package/dist/assets/volter-sdk-hierarchy-kind-icon-Dwlq9_xw.js +0 -1
  463. package/dist/assets/volter-sdk-hierarchy-row-media-CnFXPw4O.js +0 -1
  464. package/dist/assets/volter-sdk-hierarchy-row-model-TWxtUUdN.js +0 -1
  465. package/dist/assets/volter-sdk-hierarchy-rows-3Hl6K3Br.js +0 -1
  466. package/dist/assets/volter-sdk-hierarchy-walk-DvIomDWH.js +0 -1
  467. package/dist/assets/volter-sdk-history-history-delegate-RfZBUw9Y.js +0 -1
  468. package/dist/assets/volter-sdk-history-history-service-BWYajIYW.js +0 -1
  469. package/dist/assets/volter-sdk-history-persistence-coordinator-CmebAufQ.js +0 -1
  470. package/dist/assets/volter-sdk-history-resource-registry-CgjY-ErS.js +0 -1
  471. package/dist/assets/volter-sdk-history-snapshot-store-6Cq4Qau6.js +0 -1
  472. package/dist/assets/volter-sdk-history-source-history-backend-CilZiNDq.js +0 -1
  473. package/dist/assets/volter-sdk-hmr-registration-group-idNaexWq.js +0 -1
  474. package/dist/assets/volter-sdk-hmr-stable-react-context-DhY9rjD6.js +0 -1
  475. package/dist/assets/volter-sdk-host-BcQCyyIe.js +0 -1
  476. package/dist/assets/volter-sdk-inference-diagnostics-c4Aju1Jg.js +0 -1
  477. package/dist/assets/volter-sdk-inspection-document-subject-i64BmR5X.js +0 -1
  478. package/dist/assets/volter-sdk-inspection-group-icons-CWwhjZWt.js +0 -1
  479. package/dist/assets/volter-sdk-inspection-model-BgZVa_7l.js +0 -1
  480. package/dist/assets/volter-sdk-inspection-node-media-DNYb7ZDG.js +0 -1
  481. package/dist/assets/volter-sdk-inspection-null-subject-hK6kZbB7.js +0 -1
  482. package/dist/assets/volter-sdk-inspector-property-grouping-B-4_nVMm.js +0 -1
  483. package/dist/assets/volter-sdk-inspector-section-registry-DIYAa_rQ.js +0 -1
  484. package/dist/assets/volter-sdk-js-heap-DDws540T.js +0 -1
  485. package/dist/assets/volter-sdk-layout-arrangements-DdjnA7ET.js +0 -1
  486. package/dist/assets/volter-sdk-layouts-DcV6NQNu.js +0 -1
  487. package/dist/assets/volter-sdk-light-explorer-model-BoB1GjBo.js +0 -1
  488. package/dist/assets/volter-sdk-live-seam-evidence-BOvNn-o8.js +0 -1
  489. package/dist/assets/volter-sdk-live-session-registry--ftGWuRg.js +0 -1
  490. package/dist/assets/volter-sdk-mount-css-scope-BTi-3JA9.js +0 -1
  491. package/dist/assets/volter-sdk-mount-failure-report-BeR90-6n.js +0 -1
  492. package/dist/assets/volter-sdk-native-selection-style-70aZpb0m.js +0 -1
  493. package/dist/assets/volter-sdk-photograph-notice-BwuWgyiq.js +0 -1
  494. package/dist/assets/volter-sdk-play-camera-flight-CaSiTxDt.js +0 -1
  495. package/dist/assets/volter-sdk-product-command-Cf1utO0M.js +0 -1
  496. package/dist/assets/volter-sdk-project-module-changes-CIKyvjy2.js +0 -1
  497. package/dist/assets/volter-sdk-project-module-url-XzZmS9zs.js +0 -1
  498. package/dist/assets/volter-sdk-project-output-roots-B4bC82T9.js +0 -1
  499. package/dist/assets/volter-sdk-renderer-resource-counts-S3R39qoy.js +0 -1
  500. package/dist/assets/volter-sdk-scoped-project-css-Ch7LkU2q.js +0 -1
  501. package/dist/assets/volter-sdk-selection-C2gFhPip.js +0 -1
  502. package/dist/assets/volter-sdk-served-url-DxzhEpXR.js +0 -1
  503. package/dist/assets/volter-sdk-serving-engine-BclAA7ZZ.js +0 -1
  504. package/dist/assets/volter-sdk-settings-settings-provider-DGc5Xf46.js +0 -1
  505. package/dist/assets/volter-sdk-settings-store-Bmx-a8f0.js +0 -1
  506. package/dist/assets/volter-sdk-shell-store-door-CQlHDF_i.js +0 -1
  507. package/dist/assets/volter-sdk-shell-store-e-X3-CSz.js +0 -1
  508. package/dist/assets/volter-sdk-source-conflict-DEn0Z5Vq.js +0 -1
  509. package/dist/assets/volter-sdk-stage-context-CwBngGWz.js +0 -1
  510. package/dist/assets/volter-sdk-stage-invalidation-Bt1Gs-b2.js +0 -1
  511. package/dist/assets/volter-sdk-stage-store-registry-DtSMhopZ.js +0 -1
  512. package/dist/assets/volter-sdk-stories-compose-project-stories-DfgTy2Bp.js +0 -1
  513. package/dist/assets/volter-sdk-stories-scope-4lTT6I0H.js +0 -1
  514. package/dist/assets/volter-sdk-stories-story-declared-medium-BFcKINTP.js +0 -1
  515. package/dist/assets/volter-sdk-stories-story-dom-runtime-wAz1MhyJ.js +0 -1
  516. package/dist/assets/volter-sdk-stories-story-grouping-bVoaiX0-.js +0 -1
  517. package/dist/assets/volter-sdk-surface-keyboard-5u3olsPL.js +0 -1
  518. package/dist/assets/volter-sdk-surface-state-F5vfsPyq.js +0 -1
  519. package/dist/assets/volter-sdk-tab-census-B95O0nem.js +0 -1
  520. package/dist/assets/volter-sdk-tool-contribution-convention-k_AVbxWl.js +0 -1
  521. package/dist/assets/volter-sdk-transform-mode-request-CKhq0gIu.js +0 -1
  522. package/dist/assets/volter-sdk-transient-hint-DQMQ2_Y5.js +0 -1
  523. package/dist/assets/volter-sdk-ui-source-file-region-resolver-2Gw755Lw.js +0 -1
  524. package/dist/assets/volter-sdk-ui-source-tier-source-write-backend-BsEnWjJv.js +0 -1
  525. package/dist/assets/volter-sdk-viewport-activation-timings--7x_AkVR.js +0 -1
  526. package/dist/assets/volter-sdk-viewport-editor-controls-CFuNGxo6.js +0 -1
  527. package/dist/assets/volter-sdk-viewport-presentation-CoiYwzFE.js +0 -1
  528. package/dist/assets/volter-sdk-volter-contributions-DjgbZdIJ.js +0 -1
  529. package/dist/assets/volter-sdk-wait-until-DRdtM37d.js +0 -1
  530. package/dist/assets/volter-sdk-widgets-design-system-CPmOMXke.js +0 -1
  531. package/dist/assets/volter-sdk-widgets-editor-appearance-B4Q93899.js +0 -1
  532. package/dist/assets/volter-sdk-widgets-editor-material-C6dqUruc.js +0 -1
  533. package/dist/assets/volter-sdk-widgets-icon-set-registry-BOtjeU-M.js +0 -1
  534. package/dist/assets/volter-sdk-widgets-index-C2FSk2KK.js +0 -1
  535. package/dist/assets/volter-sdk-widgets-inspector-widgets-AlignmentGrid-ClaWmFsj.js +0 -1
  536. package/dist/assets/volter-sdk-widgets-inspector-widgets-AssetSlotPicker-DIoRDT6D.js +0 -1
  537. package/dist/assets/volter-sdk-widgets-inspector-widgets-BorderEditor-BcsoJNaT.js +0 -1
  538. package/dist/assets/volter-sdk-widgets-inspector-widgets-ColorPicker-p_xfUT04.js +0 -1
  539. package/dist/assets/volter-sdk-widgets-inspector-widgets-CurveEditor-RbGdt95N.js +0 -1
  540. package/dist/assets/volter-sdk-widgets-inspector-widgets-FontPicker-DxdmydaC.js +0 -1
  541. package/dist/assets/volter-sdk-widgets-inspector-widgets-GradientEditor-DZ0Z3l2P.js +0 -1
  542. package/dist/assets/volter-sdk-widgets-inspector-widgets-ScrubbableInput-Byy_M7hB.js +0 -1
  543. package/dist/assets/volter-sdk-widgets-inspector-widgets-ShadowEditor-C9aPdbrZ.js +0 -1
  544. package/dist/assets/volter-sdk-widgets-inspector-widgets-color-utils-BJStispK.js +0 -1
  545. package/dist/assets/volter-sdk-widgets-inspector-widgets-curve-utils-C_5eRE_F.js +0 -1
  546. package/dist/assets/volter-sdk-widgets-inspector-widgets-index-BA3S0eIV.js +0 -1
  547. package/dist/assets/volter-sdk-widgets-inspector-widgets-shared-DHHUQexs.js +0 -1
  548. package/dist/assets/volter-sdk-widgets-interactive-edit-scope-CjuUPrEv.js +0 -1
  549. package/dist/assets/volter-sdk-widgets-patterns-Dialog-CQggdCbk.js +0 -1
  550. package/dist/assets/volter-sdk-widgets-patterns-Fields-D38At0E9.js +0 -1
  551. package/dist/assets/volter-sdk-widgets-patterns-List-ewRDByTO.js +0 -1
  552. package/dist/assets/volter-sdk-widgets-patterns-StateSurface-C8YqnN-5.js +0 -1
  553. package/dist/assets/volter-sdk-widgets-patterns-Surfaces-BjFrm6Mc.js +0 -1
  554. package/dist/assets/volter-sdk-widgets-patterns-Tabs-JZq1ce4h.js +0 -1
  555. package/dist/assets/volter-sdk-widgets-patterns-Toolbar-Bf61fc1T.js +0 -1
  556. package/dist/assets/volter-sdk-widgets-patterns-Tree-CwuVbaxj.js +0 -1
  557. package/dist/assets/volter-sdk-widgets-primitives-AnchoredMenu-Ch2ujeLH.js +0 -1
  558. package/dist/assets/volter-sdk-widgets-primitives-Button-d2WNMADR.js +0 -1
  559. package/dist/assets/volter-sdk-widgets-primitives-ColorInput-DP0WkwNs.js +0 -1
  560. package/dist/assets/volter-sdk-widgets-primitives-DraftTextInput-D1g1A89b.js +0 -1
  561. package/dist/assets/volter-sdk-widgets-primitives-EditorIcon-DAjALCvl.js +0 -1
  562. package/dist/assets/volter-sdk-widgets-primitives-FormControls-KBDCYHsT.js +0 -1
  563. package/dist/assets/volter-sdk-widgets-primitives-HoverPreview-D2qUt6_z.js +0 -1
  564. package/dist/assets/volter-sdk-widgets-primitives-JsonInput-DLs3kN1L.js +0 -1
  565. package/dist/assets/volter-sdk-widgets-primitives-Layout-DshSsm_4.js +0 -1
  566. package/dist/assets/volter-sdk-widgets-primitives-Menu-Ch-3iDys.js +0 -1
  567. package/dist/assets/volter-sdk-widgets-primitives-NumberInput-pdAN4aF3.js +0 -1
  568. package/dist/assets/volter-sdk-widgets-primitives-Panel-BNFSUDwP.js +0 -1
  569. package/dist/assets/volter-sdk-widgets-primitives-SectionHeader-5Hv-rso1.js +0 -1
  570. package/dist/assets/volter-sdk-widgets-primitives-Text-CtWC8t_L.js +0 -1
  571. package/dist/assets/volter-sdk-widgets-primitives-ThemeRootPortal-h0iinIvj.js +0 -1
  572. package/dist/assets/volter-sdk-widgets-primitives-Tooltip-Cllx19nM.js +0 -1
  573. package/dist/assets/volter-sdk-widgets-primitives-Vec3Input-CurGarFa.js +0 -1
  574. package/dist/assets/volter-sdk-widgets-primitives-clamp-to-viewport-0YxAdd5O.js +0 -1
  575. package/dist/assets/volter-sdk-widgets-primitives-editor-icons-ExQE8_SP.js +0 -1
  576. package/dist/assets/volter-sdk-widgets-primitives-panel-header-styles-DGmxyx4E.js +0 -1
  577. package/dist/assets/volter-sdk-widgets-theme-DOfZnIVM.js +0 -1
  578. package/dist/assets/volter-sdk-widgets-z-index-BpB2pf-w.js +0 -1
  579. package/dist/assets/volter-sdk-worker-call-metrics-Cdo-WjAp.js +0 -1
  580. package/dist/assets/volter-sdk-workspace-document-ids-CWVlaP7n.js +0 -1
  581. package/dist/assets/volter-sdk-workspace-document-registry-DoKaj8Fe.js +0 -1
  582. package/dist/assets/volter-sdk-workspace-document-restore-BOPAH61D.js +0 -1
  583. package/dist/assets/volter-sdk-workspace-static-panels-DZr1Q4n1.js +0 -1
  584. package/dist/assets/volter-sdk-workspace-status-registry-pIvpW3QR.js +0 -1
  585. package/dist/assets/volter-sdk-workspace-utility-registry-BRzyLcLs.js +0 -1
  586. package/dist/assets/volter-sdk-world-canvas-viewport-state-DeMws4Bu.js +0 -1
  587. package/dist/assets/volter-sdk-world-pan-state-Dpul1S4k.js +0 -1
  588. package/dist/assets/volter-sdk-write-pipe-vbjHAGKf.js +0 -1
  589. package/dist/assets/volter-shared-react-dom-client-B6uCXsbq.js +0 -1
  590. package/dist/assets/volter-shared-three-DSLGcAKx.js +0 -1
  591. package/dist/assets/worker-DeeaIXW_.js +0 -10
  592. package/src/contributions.d.ts +0 -9
  593. package/starter/game/client/index.tsx +0 -52
  594. package/starter/game/levels/GroundEnvironment.tsx +0 -15
  595. package/starter/game/levels/GroundLevel.tsx +0 -35
  596. package/starter/game/levels/ground.canvas.ts +0 -11
  597. package/starter/game/levels/ground.glb +0 -0
  598. package/starter/game/levels/ground.py +0 -142
@@ -1 +0,0 @@
1
- import{gU as j}from"./volter-sdk-D8o6TU4A.js";import{b as C,H as p,C as B,I as v,J as F,K as I,L as P,d as E}from"./blender-outliner-model-BqLWEXta.js";const N=e=>typeof e=="object"&&e!==null&&typeof e.subscribeFrames=="function"&&typeof e.blenderObjectName=="function"&&typeof e.blenderSelection=="function",L=e=>typeof e=="object"&&e!==null&&typeof e.documentId=="string"&&typeof e.hierarchy?.nativeObject=="function";function x(){const e=j().documents.context(p());return N(e)?e:null}function A(e,n){if(!L(n))return null;const t=x();if(t===null)return null;if(e===null){if(n.documentRootObject!==t.root)return null;const d=t.blenderSelection().active;return d===null?{kind:"scene"}:{kind:"object",name:d}}if(e.id===n.documentId)return n.documentRootObject===t.root?{kind:"scene"}:null;const r=C().byId.get(e.id);if(r?.type==="TSE_LAYER_COLLECTION")return{kind:"collection",path:r.path};const o=n.hierarchy.nativeObject(e.id);if(o===null)return null;if(o===t.root)return{kind:"scene"};const u=t.blenderObjectName(o);return u===null?null:{kind:"object",name:u}}let s={object:null,collection:null,context:null,views:new Map,error:null,loading:!1},y=0;const g=new Set;let S=null;const c=new Set;let a=null,i=0,w=0;const f=new Set;function l(e,n=!1){s={...s,...e},y+=1;for(const t of[...g])t();n&&j().documents.contextChanged(p())}function D(e){return g.add(e),()=>{g.delete(e)}}function H(){return y}function _(){return s}function M(){const e=a;i+=1,c.clear(),f.clear(),e!==null?O(e,!0):l({})}B(()=>{M()});let m=null;function O(e,n=!1){m!==e&&(m=e,setTimeout(()=>{m===e&&(m=null,K(e,n))},0))}function V(e){return e.kind==="scene"?"":e.kind==="collection"?`collection:${e.path}`:e.name}function J(){if(S!==null)return;const e=x();e!==null&&(S=e.subscribeFrames(F))}async function K(e,n=!1){const t=e.startsWith("collection:")?e.slice(11):null,r=t===null&&e!==""?e:null,o=n&&a===e;a!==e&&(i+=1,c.clear(),f.clear());const u=i,d=++w;a=e;const R=o?s.context:null;o||l({loading:!0,object:r,collection:t,context:null,error:null,views:new Map});try{const b=await I(r??void 0,t??void 0);if(u!==i||d!==w)return;if(o&&JSON.stringify(b)===JSON.stringify(R)){l({loading:!1,error:null});return}l({context:b,loading:!1,error:null},!0)}catch(b){if(u!==i||d!==w)return;l({context:null,loading:!1,error:h(b)},!0)}}function G(e){if(!v())return;J();const n=V(e);a!==n&&O(n)}function U(e){const n=s.views.get(e);if(n!==void 0&&f.has(e)||c.has(e)||!v())return n;c.add(e);const t=i;return P(e).then(r=>{if(t!==i||(c.delete(e),f.add(e),r===null))return;const o=new Map(s.views);o.set(e,r),l({views:o,error:null})}).catch(r=>{t===i&&(c.delete(e),l({error:h(r)}))}),n}async function W(e,n,t,r){try{return await E(e,n,t,r),f.delete(e),l({error:null}),!0}catch(o){return l({error:h(o)}),!1}}function h(e){return e instanceof Error?e.message:String(e)}export{U as a,_ as b,D as c,H as d,A as r,G as s,W as w};
@@ -1,3 +0,0 @@
1
- import{r as b,j as i,j9 as ee,ja as te,jb as ne,jc as ie,cf as re,fF as oe,fG as se}from"./volter-sdk-D8o6TU4A.js";import{s as V,c as le,d as z,b as T,a as S,w as M,r as X}from"./blender-properties-model-DD-2sMKx.js";const v=20,G=2,ae="40%",W=25,I=20,A=8,ce=4,B=8,h=11,g=.5,x="#e6e6e6",de="#3d3d3d",ue="#ffffff11",fe="rgba(0,0,0,0.12)",pe="#545454",he="#3d3d3d",xe="#4772b3",Y="#991616",ye=8,w=6,ge=e=>Math.round(e*.2),H=e=>e.filter(t=>t.hidden!==!0&&t.undrawn!==!0);function L(){return b.useSyncExternalStore(le,z,z)}function y({title:e,sub:t=!1,closed:n=!1,note:r,count:o,headerControl:l,children:d}){const[c,s]=b.useState(!n);return i.jsxs("div",{style:{marginBottom:A,borderRadius:ce,boxShadow:t?"none":`inset 0 0 0 1px ${ue}`,background:t?fe:"transparent",overflow:"hidden"},children:[i.jsxs("div",{style:{position:"relative"},children:[i.jsxs("button",{type:"button",onClick:()=>s(!c),style:{display:"flex",alignItems:"center",width:"100%",height:W,background:t?"transparent":de,border:"none",padding:`0 ${B}px 0 ${t?I+14-20:0}px`,color:x,font:`${h}px inherit`,textAlign:"left",cursor:"pointer",gap:w},children:[i.jsx("span",{"aria-hidden":"true",style:{width:I-8,textAlign:"center",fontSize:ye,opacity:.85},children:c?"▼":"▶"}),i.jsx("span",{style:{fontWeight:400,marginLeft:l?C+w:0},title:r,children:e}),o===void 0?null:i.jsx("span",{style:{opacity:g,marginLeft:"auto"},children:o})]}),l?i.jsx("div",{style:{position:"absolute",left:I,top:0,height:W,display:"flex",alignItems:"center"},children:l}):null]}),c?i.jsx("div",{style:{padding:A},children:d}):null]})}function O({label:e,title:t,readonly:n,identifier:r,children:o}){return i.jsxs("div",{"data-rna-field":r??"","data-field-label":e,"data-field-readonly":n?"true":void 0,style:{display:"flex",alignItems:"center",minHeight:v,marginBottom:G,gap:B,opacity:n?g:1},title:t,children:[i.jsx("span",{style:{flex:`0 0 ${ae}`,textAlign:"right",color:x,fontSize:h,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e}),i.jsx("span",{style:{flex:"1 1 0",minWidth:0,display:"flex",gap:G},children:o})]})}const m={height:v,width:"100%",minWidth:0,boxSizing:"border-box",background:pe,border:`1px solid ${he}`,borderRadius:ge(v),color:x,fontSize:h,padding:`0 ${B}px`,textAlign:"center"};function E({children:e}){return i.jsx("span",{style:{...m,display:"flex",alignItems:"center",justifyContent:"center",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e})}const C=v-2*Math.floor((v-2)/6);function _({value:e,readonly:t,label:n,onChange:r}){return i.jsx("input",{type:"checkbox",checked:e,readOnly:t,...n===void 0?{}:{"aria-label":n},onChange:o=>!t&&r(o.target.checked),style:{width:C,height:C,margin:`${(v-C)/2}px 0`,accentColor:xe,cursor:t?"default":"pointer"}})}function K({row:e,value:t,index:n,onWrite:r}){const[o,l]=b.useState(null),d=b.useRef(null),c=()=>{const f=d.current;if(d.current=null,l(null),f===null||f.trim()==="")return;const u=Number(f);Number.isFinite(u)&&u!==t&&r(u,n)},s=e.type==="FLOAT"?e.precision??3:0,a=o??(e.type==="FLOAT"?t.toFixed(s):String(t));return e.readonly?i.jsx(E,{children:a}):i.jsx("input",{type:"number","aria-label":N(e,n),value:a,...e.softMin===void 0?{}:{min:e.softMin},...e.softMax===void 0?{}:{max:e.softMax},...e.step===void 0?{}:{step:e.type==="FLOAT"?e.step/100:1},onChange:f=>{d.current=f.target.value,l(f.target.value)},onBlur:c,onKeyDown:f=>{f.key==="Enter"&&(c(),f.currentTarget.blur()),f.key==="Escape"&&(d.current=null,l(null))},style:m})}const be=new Set(["TRANSLATION","DIRECTION","XYZ","XYZ_LENGTH","EULER","VELOCITY","ACCELERATION","COORDS"]);function Z(e,t){if(e==="QUATERNION"||e==="AXISANGLE")return"WXYZ"[t];if(!(t>=4)){if(be.has(e))return"XYZW"[t];if(e==="COLOR"||e==="COLOR_GAMMA")return"RGBA"[t]}}function N(e,t){const n=e.name||e.identifier;return t===void 0?n:`${n} ${Z(e.subtype,t)??t}`}function Q(e,t){const n=r=>Math.max(0,Math.min(255,Math.round(Math.max(0,e[r]??0)**(t?1:.45454545454545453)*255)));return[n(0),n(1),n(2)]}function U(e,t){const[n,r,o]=Q(e,t);return`rgb(${n}, ${r}, ${o})`}function je(e,t,n){const r=a=>n?a/255:(a/255)**2.2,[o,l,d]=te(ne(e)).map(r),c=[o,l,d],s=/^(rgba|hsla)\(/i.test(e)||/^#[0-9a-f]{8}$/i.test(e);return t.length>3&&c.push(s?ie(e):t[3]??1),c}function ve({row:e,onOpen:t}){const n=e.value;if(n===null||n.path===null)return i.jsx(E,{children:n===null?"None":n.name??n.type});const r=n.path;return i.jsx("button",{type:"button","aria-label":N(e),onClick:()=>t(r),style:{...m,cursor:"pointer",textAlign:"left"},title:r,children:n.name??n.type})}function me({row:e,write:t}){const n=e.items??[];if(e.isFlag){const o=e.value??[];return i.jsx(E,{children:o.length===0?"None":o.join(", ")})}const r=String(e.value??"");return e.readonly?i.jsx(E,{children:n.find(o=>o.identifier===r)?.name??r}):i.jsx("select",{"aria-label":N(e),value:r,onChange:o=>t(o.target.value),style:{...m,textAlign:"left"},children:n.map(o=>i.jsx("option",{value:o.identifier,children:o.name},o.identifier))})}function Ae({row:e,write:t}){const n=String(e.value??"");return e.readonly?i.jsx(E,{children:n}):i.jsx(Re,{value:n,label:N(e),onWrite:r=>t(r)})}function Ee({row:e,write:t}){const n=e.value??[],r=e.subtype==="COLOR_GAMMA",[o,l]=b.useState(!1),[d,c,s]=Q(n,r),a=n.length>3?n[3]??1:1,f=a<1?`rgba(${d}, ${c}, ${s}, ${a.toFixed(2)})`:U(n,r);return i.jsxs("span",{style:{position:"relative",display:"block"},children:[i.jsx("button",{type:"button","aria-label":e.name,"aria-expanded":o,disabled:e.readonly,onClick:()=>l(!o),style:{...m,background:U(n,r),display:"block",width:"100%",cursor:e.readonly?"default":"pointer"},title:n.map(u=>u.toFixed(3)).join(", ")}),o?i.jsx("div",{style:{position:"absolute",zIndex:"var(--volter-z-dropdown)",top:"100%",right:0,marginTop:4},children:i.jsx(ee,{value:f,onChange:()=>{},onChangeEnd:u=>t(je(u,n,r)),onClose:()=>l(!1)})}):null]})}function Ne({row:e,path:t,label:n,title:r,write:o,locks:l}){const d=e.value??[];return i.jsx(i.Fragment,{children:d.map((c,s)=>i.jsxs(O,{label:Le(n,s,e.subtype),title:r,readonly:e.readonly,identifier:`${e.identifier}[${s}]`,children:[e.type==="BOOLEAN"?i.jsx(_,{value:c===!0,readonly:e.readonly,label:N(e,s),onChange:a=>o(a,s)}):i.jsx(K,{row:e,value:Number(c),index:s,onWrite:(a,f)=>o(a,f)}),i.jsx(Se,{path:t,lock:l?.[s]})]},`${e.identifier}-${s}`))})}function Oe(e){return e.index===void 0?e.row.value===!0:Array.isArray(e.row.value)&&e.row.value[e.index]===!0}function Se({path:e,lock:t}){if(t===void 0)return null;const n=Oe(t);return i.jsx("button",{type:"button","aria-label":N(t.row,t.index),"aria-pressed":n,disabled:t.row.readonly,onClick:()=>void M(e,t.row.identifier,!n,t.index),style:{height:v,width:v,flexShrink:0,padding:0,background:"transparent",border:"none",color:x,cursor:"pointer"},children:i.jsx(re,{icon:n?oe:se,size:"sm"})})}function Le(e,t,n){const r=Z(n,t);return r===void 0?t===0?e:`${e} ${t}`:`${t===0?`${e} `:""}${r}`}function $e(e){const{row:t,write:n}=e;switch(t.type){case"POINTER":return i.jsx(ve,{...e});case"ENUM":return i.jsx(me,{...e});case"STRING":return i.jsx(Ae,{...e});case"BOOLEAN":return i.jsx(_,{value:t.value===!0,readonly:t.readonly,label:N(t),onChange:n});default:return i.jsx(K,{row:t,value:Number(t.value??0),onWrite:r=>n(r)})}}function F({row:e,path:t,onOpen:n,label:r,locks:o}){const l=(u,j)=>void M(t,e.identifier,u,j),d=r??(e.name||e.identifier),c=`${e.identifier} — ${e.type}${e.subtype==="NONE"?"":`/${e.subtype}`}${e.readonly?" (read-only)":""}${e.description?`
2
- ${e.description}`:""}`,s={row:e,path:t,write:l,onOpen:n},a=e.valueOmitted??e.valueError;if(a!==void 0)return i.jsx(O,{label:d,title:c,readonly:!0,identifier:e.identifier,children:i.jsx(E,{children:a})});if(e.type==="COLLECTION")return i.jsx(Ce,{label:d,title:c,value:e.value??{count:0},identifier:e.identifier,onOpen:()=>n(`${t}.${e.identifier}`)});const f=e.type==="INT"||e.type==="FLOAT";return e.arrayLength>0&&(f||e.type==="BOOLEAN")?f&&(e.subtype==="COLOR"||e.subtype==="COLOR_GAMMA")?i.jsx(O,{label:d,title:c,readonly:e.readonly,identifier:e.identifier,children:i.jsx(Ee,{...s})}):i.jsx(Ne,{...s,label:d,title:c,locks:o}):i.jsx(O,{label:d,title:c,readonly:e.readonly,identifier:e.identifier,children:$e(s)})}function Re({value:e,label:t,onWrite:n}){const[r,o]=b.useState(null);return i.jsx("input",{type:"text",...t===void 0?{}:{"aria-label":t},value:r??e,onChange:l=>o(l.target.value),onBlur:()=>{r!==null&&r!==e&&n(r),o(null)},onKeyDown:l=>{l.key==="Enter"&&l.target.blur(),l.key==="Escape"&&o(null)},style:{...m,textAlign:"left"}})}function Ce({label:e,title:t,value:n,identifier:r,onOpen:o}){const[l,d]=b.useState(!1),c=n.names??[];return i.jsxs(i.Fragment,{children:[i.jsx(O,{label:e,title:t,readonly:!1,identifier:r,children:i.jsxs("button",{type:"button","aria-label":e,onClick:()=>c.length?d(!l):o(),style:{...m,cursor:"pointer",textAlign:"left"},children:[c.length?`${l?"▼":"▶"} `:"",n.count," ",n.count===1?"item":"items"]})}),l?c.map(s=>i.jsx(O,{label:"",readonly:!0,children:i.jsx(E,{children:s})},s)):null]})}const P=e=>typeof e=="string"?e:e.property;function ke(e){if(e.active===void 0)return{path:null,index:null};const t=T().context?.[e.active];if(typeof t!="object"||t===null)return{path:null,index:null};const n=t;return{path:n.path??null,index:typeof n.index=="number"?n.index:null}}function Te({panel:e,path:t,onOpen:n}){L();const r=S(t),o=ke(e);return r===void 0?i.jsx(y,{title:e.title,closed:e.closed===!0,children:i.jsxs("div",{style:{color:x,opacity:g,fontSize:h},children:["Reading ",t,"…"]})}):r.kind!=="collection"?i.jsx(y,{title:e.title,closed:e.closed===!0,note:t,children:i.jsxs("div",{style:{color:Y,fontSize:h},children:[t," is not a collection — this panel is declared `collection: true`."]})}):i.jsxs(y,{title:e.title,closed:e.closed===!0,note:t,count:r.count,children:[r.items.length===0?i.jsx("div",{style:{color:x,opacity:g,fontSize:h},children:"None"}):null,r.items.map((l,d)=>i.jsx(y,{title:`${l.path!==null&&l.path===o.path||d===o.index?"● ":""}${l.name??l.type}`,sub:!0,children:l.path===null?i.jsxs("div",{style:{color:x,opacity:g,fontSize:h},children:[l.type," — RNA gives this member no address."]}):i.jsx(Ie,{path:l.path,properties:e.properties,andDeclared:e.andDeclared===!0,onOpen:n})},l.path??l.name??l.type))]})}function Ie({path:e,properties:t,andDeclared:n,onOpen:r}){L();const o=S(e);if(o===void 0)return i.jsxs("div",{style:{color:x,opacity:g,fontSize:h},children:["Reading ",e,"…"]});const l=o.kind==="struct"?o.groups.flatMap(a=>a.rows):[],d=new Map(l.map(a=>[a.identifier,a])),c=t.map(a=>d.get(P(a))).filter(a=>a!==void 0),s=n&&o.kind==="struct"?H(l).filter(a=>a.group===o.type&&!t.some(f=>P(f)===a.identifier)):[];return i.jsx(i.Fragment,{children:[...c,...s].map(a=>i.jsx(F,{row:a,path:e,onOpen:r},a.identifier))})}function Pe(e,t){if(e.engine!==void 0){const n=T().context?.engine;if(n===void 0)return null;if(!e.engine.includes(n))return!1}for(const n of e.when??[]){const r=n.from??e.from,o=r?t.find(s=>s.label===r):t[0];if(o===void 0)return!1;const l=S(o.path);if(l===void 0)return null;if(l.kind!=="struct")return!1;const d=l.groups.flatMap(s=>s.rows).find(s=>s.identifier===n.property);if(d===void 0)return!1;const c=d.value;if(typeof c!="string"&&typeof c!="number"&&typeof c!="boolean"||n.is!==void 0&&!n.is.includes(c)||n.isNot!==void 0&&n.isNot.includes(c))return!1}return!0}function q({panel:e,paths:t,onOpen:n}){if(L(),Pe(e,t)!==!0)return null;const r=e.from?t.find(s=>s.label===e.from):t[0];if(r!==void 0&&e.collection===!0)return i.jsx(Te,{panel:e,path:r.path,onOpen:n});if(r===void 0)return null;const o=S(r.path),l=e.sub??[],d=[],c=[];for(const s of e.properties){const a=P(s),f=typeof s=="string"||s.from===void 0?r:t.find(p=>p.label===s.from),u=f===void 0?void 0:S(f.path),j=u?.kind==="struct"?u.groups.flatMap(p=>p.rows):[];if(typeof s!="string"&&s.when){const p=j.find($=>$.identifier===s.when?.property)?.value;if(typeof p!="string"&&typeof p!="number"&&typeof p!="boolean"||s.when.is&&!s.when.is.includes(p)||s.when.isNot?.includes(p))continue}const D=u?.kind==="struct"?u.groups.flatMap(p=>p.rows).find(p=>p.identifier===a):void 0;if(D===void 0||f===void 0)c.push(a);else{const p=typeof s=="string"?void 0:j.find(R=>R.identifier===s.lock),$=typeof s=="string"?void 0:j.find(R=>R.identifier===s.firstLock);d.push({identifier:a,row:D,path:f.path,...typeof s=="string"||s.label===void 0?{}:{label:s.label},...p===void 0?{}:{locks:[...$===void 0?[]:[{row:$}],...Array.from({length:p.arrayLength},(R,J)=>({row:p,index:J}))]}})}}return o===void 0?i.jsx(y,{title:e.title,closed:e.closed===!0,children:i.jsxs("div",{style:{color:x,opacity:g,fontSize:h},children:["Reading ",r.path,"…"]})}):d.length===0&&l.length===0?null:i.jsxs(y,{title:e.title,closed:e.closed===!0,headerControl:(()=>{const s=o.kind==="struct"?o.groups.flatMap(a=>a.rows).find(a=>a.identifier===e.headerProperty):void 0;return s?i.jsx("span",{onClick:a=>a.stopPropagation(),children:i.jsx(_,{value:s.value===!0,readonly:s.readonly,label:s.name,onChange:a=>void M(r.path,s.identifier,a)})}):null})(),note:c.length===0?`${r.path}`:`${r.path}
3
- Not on this datablock: ${c.join(", ")}`,children:[d.map(s=>i.jsx(F,{row:s.row,path:s.path,onOpen:n,label:s.label,locks:s.locks},s.identifier)),l.map((s,a)=>i.jsx(q,{panel:s,paths:t,onOpen:n},`${a}:${s.title}`))]})}function k({path:e,onOpen:t}){L();const n=S(e);return n===void 0?i.jsxs("div",{style:{color:x,opacity:g,fontSize:h,padding:A},children:["Reading ",e,"…"]}):n.kind==="collection"?i.jsxs(i.Fragment,{children:[n.items.length===0?i.jsx("div",{style:{color:x,opacity:g,fontSize:h},children:n.count===0?"None":`${n.count} items`}):null,n.items.map(r=>i.jsx(y,{title:r.name??r.type,sub:!0,children:r.path===null?i.jsxs("div",{style:{color:x,opacity:g,fontSize:h},children:[r.type," — RNA gives this member no address."]}):i.jsx(k,{path:r.path,onOpen:t})},r.path??r.name??r.type))]}):i.jsx(i.Fragment,{children:n.groups.map(r=>{const o=H(r.rows);return o.length===0?null:i.jsx(y,{title:r.label,sub:!0,children:o.map(l=>i.jsx(F,{row:l,path:n.path,onOpen:t},l.identifier))},r.id)})})}function Me({tabId:e,subject:t,curated:n}){L(),b.useEffect(()=>V(t),[t]);const[r,o]=b.useState([]),l=T(),d=l.context?.tabs.find(u=>u.id===e)??null,c=d?.paths??[],s=c.map(u=>u.path).join("|");if(b.useEffect(()=>o([]),[s]),l.error!==null)return i.jsx("div",{style:{color:Y,fontSize:h,padding:A},children:l.error});if(d===null)return i.jsx("div",{style:{color:x,opacity:g,fontSize:h,padding:A},children:l.loading?"Reading the engine…":"Blender shows no properties here."});const a=u=>o(j=>[...j,u]),f=r[r.length-1];return i.jsxs("div",{style:{padding:`${A}px 0`},children:[r.length>0?i.jsxs("button",{type:"button",onClick:()=>o(u=>u.slice(0,-1)),style:{...m,width:"auto",marginBottom:A,cursor:"pointer",textAlign:"left"},title:f,children:["← ",d.label]}):null,f!==void 0?i.jsx(y,{title:f.slice(f.lastIndexOf(".")+1),children:i.jsx(k,{path:f,onOpen:a})}):i.jsxs(i.Fragment,{children:[n.map((u,j)=>i.jsx(q,{panel:u,paths:c,onOpen:a},`${j}:${u.title}`)),n.length>0?i.jsx(y,{title:"All properties",closed:!0,children:c.map(u=>i.jsx(y,{title:u.label,sub:!0,children:i.jsx(k,{path:u.path,onOpen:a})},u.path))}):c.map(u=>i.jsx(y,{title:u.label,children:i.jsx(k,{path:u.path,onOpen:a})},u.path))]})]})}function Fe(e){return(t,n)=>{const r=X(t,n);if(r===null)return!1;if(V(r),e.standing==="any")return!0;if(e.standing==="object")return r.kind==="object";const o=T(),l=r.kind==="object"?r.name:null,d=r.kind==="collection"?r.path:null;return o.object!==l||o.collection!==d?!1:o.context?.tabs.some(c=>c.id===e.id)??!1}}function De(e){return function({node:n,adapter:r}){const o=X(n,r);return o===null?null:i.jsx(Me,{tabId:e.id,subject:o,curated:e.curated??[]})}}export{Fe as a,De as b};
@@ -1,13 +0,0 @@
1
- import{gU as z,aw as jt,iS as vt,iT as ct,r as c,j as i,eo as _t,hs as ae,gf as Q,gm as be,gl as wt,hr as St,t as N,A as xt,fp as W,iU as Et,an as Me,iV as ve,iW as kt,eC as dt,eD as _e,aJ as Ct,h as oe,il as Ot,dH as ke,iX as Ie,bv as At,bC as Rt,h3 as Ve,iY as Mt,eE as Pt,iZ as Tt,i_ as Ge,eK as $t,i$ as Ft,dM as We,j0 as Lt}from"./volter-sdk-D8o6TU4A.js";import{o as Nt,s as Pe,b as de,r as ye,a as Dt,c as Te,d as ze,e as Bt,f as It,w as He,g as Vt,h as xe,i as Gt,j as Wt,m as Ue,k as zt,l as Ht,n as Ut,p as qe,q as qt,t as Kt,u as Jt,v as Yt,x as Xt,y as Qt,z as Zt,A as er,B as tr,C as rr,D as Ke,E as nr,F as Je,G as or}from"./blender-outliner-model-BqLWEXta.js";import{t as Ye,v as ne,o as ue,s as ut,r as lr,a as fe}from"./object3d-document-session-registry-DvgzaByQ.js";import{r as Xe,b as sr,a as ar,w as ir}from"./blender-properties-model-DD-2sMKx.js";import{n as cr,a as dr,s as Ce,m as te,b as ie}from"./play-mode-BGq1Hn-c.js";import{PerspectiveCamera as ur}from"./volter-shared-three-core-DEsIwtOu.js";import"./blender-base64-Cxqc4R5f.js";import"./output-pass-Bw2FZb8e.js";import"./three.module-JoAAxMWl.js";import"./linear-resolve-B-MA5O31.js";function pt(e){return`blender-${e.toLowerCase().replace(/_/g,"-")}`}function ee(e){return e?.type==="TSE_SOME_ID"&&e.struct==="Object"&&e.object!==void 0}function Qe(e,t){return{id:e.id,label:e.name,role:"entity",kind:pt(e.icon),...e.struct?{typeLabel:e.struct}:{},parentId:t,childIds:e.children.map(o=>o.id),defaultExpanded:e.expanded}}const pr={transform:!0,inspectorFields:!1,persist:!0},we=new Set;let bt=0;const $e=new Set;function Ze(){queueMicrotask(()=>{bt++;for(const e of $e)e()})}function br(e){return $e.add(e),()=>{$e.delete(e)}}function et(){return bt}function fr(e){for(const t of we)if(t.documentId===e||t.documentId===`object3d-document:${e}`)return t;return we.values().next().value??null}const mr=()=>({position:[0,0,0],rotation:[0,0,0,1],scale:[1,1,1]});function tt(e,t){e.updateWorldMatrix(!0,!1);const o=t.matrixWorld.clone().invert().multiply(e.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 me(e,t){return`${e} needs a file, and this editor has no door to ask for one: the host's file door (\`EditorHost.files\`, \`@volter/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 "${t}".`}const hr=[{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:`${me("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:me("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:me("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:me("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'"}],gr="collection-instance:";function yr(){const e=new Map;for(const t of de().byId.values()){if(t.type!=="TSE_LAYER_COLLECTION")continue;const o=t.data;o===void 0||!o.startsWith("bpy.data.collections[")||e.has(t.name)||e.set(t.name,{kind:`${gr}${t.name}`,label:t.name,group:"Collection Instance",call:`object.collection_instance_add, collection=${le(t.name)}`})}return[...e.values()]}function je(){return[...hr,...yr()]}function jr(e){const[t,...o]=e.call.split(", ");return`bpy.ops.${t}(${o.join(", ")})`}function le(e){return JSON.stringify(e)}const vr={"curve.primitive_bezier_circle_add":"Add Bézier Circle","curve.primitive_bezier_curve_add":"Add Bézier","curve.primitive_nurbs_circle_add":"Add Nurbs Circle","curve.primitive_nurbs_curve_add":"Add Nurbs Curve","curve.primitive_nurbs_path_add":"Add Path","mesh.primitive_circle_add":"Add Circle","mesh.primitive_cone_add":"Add Cone","mesh.primitive_cube_add":"Add Cube","mesh.primitive_cylinder_add":"Add Cylinder","mesh.primitive_grid_add":"Add Grid","mesh.primitive_ico_sphere_add":"Add Ico Sphere","mesh.primitive_monkey_add":"Add Monkey","mesh.primitive_plane_add":"Add Plane","mesh.primitive_torus_add":"Add Torus","mesh.primitive_uv_sphere_add":"Add UV Sphere","object.armature_add":"Add Armature","object.camera_add":"Add Camera","object.collection_instance_add":"Add Collection Instance","object.curves_empty_hair_add":"Add Empty Curves","object.effector_add":"Add Effector","object.empty_add":"Add Empty","object.grease_pencil_add":"Add Grease Pencil","object.lattice_add_to_selected":"Add Lattice Deformer","object.light_add":"Add Light","object.lightprobe_add":"Add Light Probe","object.location_clear":"Clear Location","object.metaball_add":"Add Metaball","object.origin_set":"Set Origin","object.pointcloud_random_add":"Add Point Cloud","object.quick_fur":"Quick Fur","object.rotation_clear":"Clear Rotation","object.scale_clear":"Clear Scale","object.speaker_add":"Add Speaker","object.text_add":"Add Text","object.transform_apply":"Apply Object Transform","object.volume_add":"Add Volume","surface.primitive_nurbs_surface_circle_add":"Add Surface Circle","surface.primitive_nurbs_surface_curve_add":"Add Surface Curve","surface.primitive_nurbs_surface_cylinder_add":"Add Surface Cylinder","surface.primitive_nurbs_surface_sphere_add":"Add Surface Sphere","surface.primitive_nurbs_surface_surface_add":"Add Surface Patch","surface.primitive_nurbs_surface_torus_add":"Add Surface Torus"};function _r(e){const t=/bpy\.ops\.([a-z_]+\.[a-z0-9_]+)\(/.exec(e)?.[1];return t===void 0?void 0:vr[t]}async function ce(e,t){const o=["before = {o.name for o in bpy.data.objects}",e,"made = [o.name for o in bpy.data.objects if o.name not in before]",'print("\\n".join(made))'].join(`
2
- `),s=await xe(o,!0,t??_r(e));return s.error!==null?{made:[],error:s.error}:{made:s.result.split(`
3
- `).map(b=>b.trim()).filter(b=>b.length>0),error:null}}async function wr(e,t){const o=[`_sel = {${e.map(le).join(", ")}}`,"_vl = bpy.context.view_layer","for _o in _vl.objects:"," _o.select_set(_o.name in _sel)",...t===null?[]:[`_vl.objects.active = bpy.data.objects.get(${le(t)})`]].join(`
4
- `),s=await xe(o,!1);s.error!==null&&z().console.error(`Blender refused the selection write: ${s.error}`,"blender-outliner")}async function Oe(e,t){if(e.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 [${e.map(le).join(", ")}]]`,"with bpy.context.temp_override(selected_objects=targets, selected_editable_objects=targets, active_object=targets[0], object=targets[0]):",` ${t}`].join(`
5
- `),{error:s}=await ce(o);return s!==null?{destination:s,persisted:!1}:(await ye(e),{destination:`Blender — ${t}; the session saves the .blend`,persisted:!0})}const Sr={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."},xr="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.";function ft(e){return({defaultAdapter:t})=>{const o=new Set;let s=[],C=null,b=null;const m=new Map,g=new Map,w=()=>{for(const n of[...o])n()},y=()=>de().byId,R=n=>{const r=y().get(n),l=e();return r===void 0||l===null?null:r.type==="TSE_VIEW_COLLECTION_BASE"?l.root:r.object===void 0?null:l.objectForBlenderName(r.object)},L=n=>{const r=e();if(r===null)return null;for(const l of y().values())if(ee(l)&&r.objectForBlenderName(l.object)===n)return l.id;return null},I=n=>{for(const r of y().values())if(ee(r)&&r.object===n)return r.id;return null},x=n=>{if(y().has(n))return n;const r=Ye(t.hierarchy,n);return r===null?null:L(r)},V=n=>{const r=x(n);return r===null?null:R(r)},T=n=>{const r=V(n);return r===null?null:t.hierarchy.idForNativeObject(r)},G={roots:()=>(Vt(q()),(de().tree?.rows??[]).map(r=>Qe(r,null))),node:n=>{const r=de(),l=r.byId.has(n)?n:x(n),d=l===null?void 0:r.byId.get(l);return d===void 0?null:Qe(d,r.parentOf.get(d.id)??null)},nativeObject:n=>V(n),idForNativeObject:n=>L(n)};function q(){const n=y(),r=new Set;for(const l of s){const d=n.get(l)?.object;d!==void 0&&r.add(d)}return[...r]}const u=()=>{const n=[];for(const r of s){const l=V(r),d=l===null?null:t.hierarchy.idForNativeObject(l);d&&n.push(d)}t.selection.set(n,{intent:"exact"}),w()},v=()=>{if(a||b!==null)return;const n=Dt(),r=`${Te()}\0${n.active??""}\0${[...n.selected].sort().join("")}`;if(r===C)return;C=r;const l=n.selected.filter(j=>j!==n.active);n.active!==null&&n.selected.includes(n.active)&&l.push(n.active);const d=l.map(I).filter(j=>j!==null);d.length===s.length&&d.every((j,_)=>j===s[_])||(s=d,u())},E={get:()=>[...s],set:n=>{if(a)return;const r=Symbol("Blender selection");b=r;const l=n.map(x);s=l.filter(H=>H!==null),u();const d=y(),j=e(),_=[],A=[],Y=[];n.forEach((H,P)=>{const F=l[P];if(F!==null){const pe=d.get(F),Ee=pe?.object;Ee===void 0?A.push(pe?.name??F):_.includes(Ee)||_.push(Ee);return}const Z=Ye(t.hierarchy,H),se=Z===null?null:j?.blenderObjectName(Z)??null;se===null?Y.push(H):_.includes(se)||_.push(se)}),Y.length>0&&z().console.warn(`No Blender object answers to ${Y.join(", ")}, so Blender's selection leaves ${Y.length===1?"it":"them"} out.`,"blender-outliner"),A.length>0&&z().console.warn(`${A.join(", ")} ${A.length===1?"is":"are"} not an object, so Blender's object selection does not carry ${A.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"),wr(_,_.length===0?null:_[_.length-1]).catch(H=>z().console.error(`Blender refused the selection write: ${String(H)}`,"blender-outliner")).finally(()=>{a||b!==r||(b=null,C=null,v())})}},K=n=>y().get(n)?.restrict,S={properties:n=>{const r=K(n);if(r===void 0)return[];const l=y().get(n),d=[{path:"name",label:"Name",type:"string",readonly:!ee(l)}];return r.hide!==void 0&&d.push({path:"visible",label:"Show in Viewport",type:"boolean"}),r.render!==void 0&&d.push({path:"renderVisible",label:"Show in Renders",type:"boolean"}),r.exclude!==void 0&&d.push({path:"exclude",label:"Exclude from View Layer",type:"boolean"}),d},get:(n,r)=>{const l=y().get(n);if(l!==void 0){if(r==="name")return l.name;if(r==="visible")return l.restrict?.hide===void 0?void 0:!l.restrict.hide;if(r==="renderVisible")return l.restrict?.render===void 0?void 0:!l.restrict.render;if(r==="exclude")return l.restrict?.exclude}},editability:(n,r)=>{const l=y().get(n);return l===void 0?{writable:!1}:r==="name"?ee(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."}:r==="visible"&&l.restrict?.exclude===!0?{writable:!1,reason:xr}:{writable:!0}},set:async(n,r,l)=>{const d=y().get(n);if(d===void 0)return;if(r==="name"){if(!ee(d))return;const _=String(l);if(_===d.name||_.length===0)return;await ze(`bpy.data.objects[${le(d.object)}]`,"name",_),await ye([_]);const A=I(_);A!==null&&E.set([A]);return}if(r==="exclude"){await He(d.path,"exclude",l===!0);return}const j=r==="visible"?"hide":r==="renderVisible"?"render":null;j!==null&&await He(d.path,j,l===!1)}},J={get:n=>{const r=T(n);return r===null?mr():t.transforms.get(r)},editability:n=>{const r=x(n),l=r===null?void 0:y().get(r);return ee(l)&&R(l.id)!==null?{writable:!0}:{writable:!1,reason:`Only an object has a transform; this row is a ${l?.struct??l?.type??"row"}.`}},beginEdit:n=>{const r=V(n);r!==null&&!m.has(r)&&(m.set(r,r.matrixWorld.clone()),g.set(n,r),It())},apply:(n,r)=>{const l=V(n);l!==null&&(l.position.fromArray(r.position),l.quaternion.fromArray(r.rotation),l.scale.fromArray(r.scale),l.updateMatrix(),l.updateMatrixWorld(!0),e()?.mirrorPose(l))},endEdit:async n=>{const r=g.get(n)??V(n);g.delete(n);const l=e();if(r===null)return;const d=m.get(r);m.delete(r);try{if(l===null||(r.updateWorldMatrix(!0,!1),d?.equals(r.matrixWorld)===!0))return;const j=l.blenderObjectName(r);if(j===null)return;const _=`bpy.data.objects[${JSON.stringify(j)}]`;try{return await ze(_,"matrix_world",tt(r,l.root)),{destination:`Blender — ${_}.matrix_world; the session saves the .blend`,persisted:!0}}catch(A){return{destination:A instanceof Error?A.message:String(A),persisted:!1}}}finally{d&&await Bt()}}},M=n=>{const r=x(n),l=r===null?void 0:y().get(r);return ee(l)?l.object:null},O=n=>({destination:n,persisted:!1}),k=async n=>{await ye(n);const r=n.map(I).filter(l=>l!==null);r.length>0&&E.set(r)},X=()=>{const n=t.documentId.replace(/^object3d-document:/,""),r=ne().find(j=>j.documentId===n)?.rig().drawCamera()??null,l=e(),d=["bpy.ops.object.camera_add()","added = bpy.context.view_layer.objects.active"];return r!==null&&l!==null&&d.push("kept = added.location.copy()",`added.matrix_world = ${JSON.stringify(tt(r,l.root))}`,"added.location = kept"),d.push("if bpy.context.scene.camera is None:"," bpy.context.scene.camera = added"),d.join(`
6
- `)},$={creatableKinds:()=>je().map(({kind:n,label:r})=>({kind:n,label:r})),create:n=>{const r=je().find(d=>d.kind===n);if(r===void 0)return{id:"",ack:O(`${n} is not a row of Blender's Add menu that this editor adds. Its rows are: ${je().map(d=>d.label).join(", ")}.`)};if(r.refusal!==void 0)return{id:"",ack:O(r.refusal)};const l=r.call==="object.camera_add"?X():jr(r);return{id:"",ack:(async()=>{const{made:d,error:j}=await ce(l);return j!==null?O(j):d.length===0?O(`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 k(d),{destination:`Blender — ${l}; the session saves the .blend`,persisted:!0})})()}},remove:n=>$.removeMany([n]),removeMany:async n=>{const r=[];for(const _ of n){const A=M(_);if(A===null){const Y=x(_),H=Y===null?void 0:y().get(Y);return O(`Only an object can be deleted here; this row is a ${H?.struct??H?.type??"row"}. Deleting a collection, a modifier or a vertex group is that datablock’s own bpy call.`)}r.push(A)}if(r.length===0)return O("Nothing selected to delete.");const d=[`targets = ${`[bpy.data.objects[n] for n in [${r.map(le).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(`
7
- `),{error:j}=await ce(d,"Delete Objects");return j!==null?O(j):(E.set([]),await ye([]),{destination:"Blender — bpy.ops.object.delete(use_global=False); the session saves the .blend",persisted:!0})},duplicate:n=>{const r=M(n);if(r===null)return{id:n,ack:O("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[${le(r)}]`,"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(`
8
- `);return{id:n,ack:(async()=>{const{made:d,error:j}=await ce(l,"Duplicate Object");return j!==null?O(j):(await k(d),{destination:`Blender — bpy.ops.object.duplicate(linked=False) on ${r}; the session saves the .blend`,persisted:!0})})()}},duplicateMany:async n=>{const r=[...new Set(n.map(M))];if(r.length===0||r.some(_=>_===null))return O("Select objects to duplicate; collections and data rows cannot be duplicated here.");const l=[`sources = [bpy.data.objects[name] for name in ${JSON.stringify(r)}]`,"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(`
9
- `),{made:d,error:j}=await ce(l,"Duplicate Objects");return j!==null?O(j):(await k(d),{destination:"Blender — duplicate selected objects as one native operation; the session saves the .blend",persisted:!0})},reparent:()=>O("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.")},D={get documentId(){return t.documentId},get documentRootObject(){return t.documentRootObject},capabilities:pr,provenance:Sr,hierarchy:G,selection:E,inspector:S,transforms:J,structure:$,subscribe:n=>{o.add(n);const r=Pe(n),l=t.subscribe(n);return()=>{o.delete(n),r(),l()}}},B={get documentId(){return D.documentId},selectedObjectNames:()=>q(),allObjectNames:()=>{const n=[];for(const r of y().values())ee(r)&&n.push(r.object);return n},selectObjects:n=>{const r=n.map(I).filter(l=>l!==null);E.set(r)},rowIdForObject:n=>I(n),structure:$};we.add(B);let a=!1;const f=setTimeout(()=>{a||(Ze(),v())},0),p=Nt(v),h=Pe(v);return{adapter:D,dispose:()=>{a=!0,clearTimeout(f),p(),h(),we.delete(B),Ze(),o.clear()}}}}const Er=ft(Gt);jt({match:({adapter:e})=>Xe(null,e)!==null,describe:({adapter:e})=>{const t=Xe(null,e);if(t===null)return null;const o=t.kind==="object"?[...de().byId.values()].find(m=>m.struct==="Object"&&m.object===t.name):void 0,s=sr().context?.scene,C=s?ar(s):void 0,b=t.kind==="object"?t.name:(C?.kind==="struct"?C.name:null)??"Scene";return{id:`blender-properties:${JSON.stringify(t)}`,title:b,identity:{kindLabel:t.kind==="object"?"Object":"Scene",kind:pt(o?.icon??"SCENE_DATA"),rename:{readOnly:t.kind!=="object",set:async m=>{t.kind==="object"&&m.length>0&&await ir(`bpy.data.objects[${JSON.stringify(t.name)}]`,"name",m)}}},sections:[]}}});function mt(e){const t=Number.isFinite(e)&&e>0?e:50;return{degrees:2*Math.atan(72/(2*t))*180/Math.PI,axis:"larger"}}vt("model",{camera:{fov:mt(50),opening:[.8187,.4458,.3617]},interaction:{bootTool:"select",boxSelect:"touch"},all:{lighting:{source:"studio",studioPreset:ct.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"}});const Fe="volter.blender.area-split:",Le=new Set,Ne=new Map;function kr(e){try{return globalThis.localStorage?.getItem(Fe+e)==="1"}catch{return!1}}function Be(e){let t=Ne.get(e);return t===void 0&&(t=kr(e),Ne.set(e,t)),t}function rt(e,t){if(Be(e)!==t){Ne.set(e,t);try{t?globalThis.localStorage?.setItem(Fe+e,"1"):globalThis.localStorage?.removeItem(Fe+e)}catch{}for(const o of[...Le])o()}}function ht(e){return Le.add(e),()=>{Le.delete(e)}}const Cr=[{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"}],Or=[{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)"}],Ar=[{label:"Geometry to Origin",type:"GEOMETRY_ORIGIN"},{label:"Origin to Geometry",type:"ORIGIN_GEOMETRY"},{label:"Origin to 3D Cursor",type:"ORIGIN_CURSOR"}],Rr=[{submenu:"Mesh"},{submenu:"Curve"},{submenu:"Surface"},{submenu:"Metaball"},{kind:"text"},{kind:"point-cloud"},{submenu:"Volume"},{submenu:"Grease Pencil"},{separatorAt:"2711"},{kind:"armature"},{submenu:"Lattice"},{separatorAt:"2720"},{submenu:"Empty"},{submenu:"Image"},{separatorAt:"2725"},{submenu:"Light"},{submenu:"Light Probe"},{separatorAt:"2730"},{kind:"camera"},{separatorAt:"2737"},{kind:"speaker"},{separatorAt:"2741"},{submenu:"Force Field"},{separatorAt:"2745"},{submenu:"Collection Instance"}],Mr="No Collections to Instance";function he({id:e,open:t,setOpen:o,anchorRef:s,children:C}){return i.jsxs("div",{ref:s,style:{position:"relative"},children:[i.jsx(wt,{"data-testid":`blender-menu-${e}`,"aria-expanded":t===e,onClick:()=>o(t===e?null:e),onPointerEnter:()=>{t&&o(e)},style:{textTransform:"capitalize"},children:e}),t===e&&i.jsx(St,{anchorRef:s,dismissBoundaryRef:s,align:"start",gap:0,clamp:!0,"aria-label":e,onDismiss:()=>o(null),children:C})]})}function Pr(e,t,o){(async()=>{const s=await o;s===void 0||typeof s.destination!="string"||s.persisted!==!0&&e?.({tone:"error",title:`${t} was refused`,detail:s.destination})})()}function gt({documentId:e,notify:t}){c.useSyncExternalStore(Pe,Te,Te),c.useSyncExternalStore(br,et,et);const[o,s]=c.useState(null),C=c.useRef(null),b=c.useRef(null),m=c.useRef(null),g=c.useRef(null),w=c.useSyncExternalStore(ht,()=>e===void 0?!1:Be(e),()=>!1),y=fr(e);if(y===null)return null;const R=(u,v)=>()=>{s(null),Pr(t,u,v(y))},L=y.selectedObjectNames(),I=y.allObjectNames(),x=L.length===0?"Nothing is selected.":void 0,V=je(),T=u=>i.jsx(Q,{"data-testid":`blender-add-${u.kind}`,disabled:u.refusal!==void 0,title:u.refusal,onSelect:R(`Add ${u.label}`,v=>v.structure.create(u.kind).ack),children:u.label},u.kind),G=u=>V.filter(v=>v.group===u).flatMap(v=>v.separatorBefore===!0?[i.jsx(be,{},`${v.kind}-separator`),T(v)]:[T(v)]),q=u=>{if("separatorAt"in u)return i.jsx(be,{},`separator-${u.separatorAt}`);if("kind"in u){const E=V.find(K=>K.kind===u.kind);return E===void 0?null:T(E)}const v=G(u.submenu);return v.length===0?i.jsx(Q,{"data-testid":"blender-add-collection-instance",disabled:!0,children:Mr},u.submenu):i.jsx(ae,{label:u.submenu,"data-testid":`blender-add-${u.submenu.toLowerCase().replaceAll(" ","-")}`,children:v},u.submenu)};return i.jsxs(_t,{compact:!0,label:"Blender Object Mode menus","data-testid":"blender-object-mode-menus",children:[i.jsx(he,{id:"view",open:o,setOpen:s,anchorRef:C,children:i.jsxs(ae,{label:"Area","data-testid":"blender-view-area",children:[i.jsx(Q,{"data-testid":"blender-area-vertical-split",disabled:w||e===void 0,title:w?"This area is already split.":void 0,onSelect:()=>{s(null),e!==void 0&&rt(e,!0)},children:"Vertical Split"}),i.jsx(be,{}),i.jsx(Q,{"data-testid":"blender-area-close",disabled:!w,title:w?void 0:"There is no second area to close.",onSelect:()=>{s(null),e!==void 0&&rt(e,!1)},children:"Close Area"})]})}),i.jsxs(he,{id:"select",open:o,setOpen:s,anchorRef:b,children:[i.jsx(Q,{"data-testid":"blender-select-all",onSelect:R("Select All",u=>u.selectObjects(I)),children:"All"}),i.jsx(Q,{"data-testid":"blender-select-none",onSelect:R("Select None",u=>u.selectObjects([])),children:"None"}),i.jsx(Q,{"data-testid":"blender-select-invert",onSelect:R("Select Invert",u=>u.selectObjects(I.filter(v=>!L.includes(v)))),children:"Invert"})]}),i.jsx(he,{id:"add",open:o,setOpen:s,anchorRef:m,children:Rr.map(u=>q(u))}),i.jsxs(he,{id:"object",open:o,setOpen:s,anchorRef:g,children:[i.jsx(ae,{label:"Set Origin","data-testid":"blender-object-origin",children:Ar.map(u=>i.jsx(Q,{"data-testid":`blender-origin-${u.type}`,disabled:L.length===0,title:x,onSelect:R(`Set Origin ▸ ${u.label}`,v=>Oe(v.selectedObjectNames(),`bpy.ops.object.origin_set(type='${u.type}')`)),children:u.label},u.type))}),i.jsx(ae,{label:"Clear","data-testid":"blender-object-clear",children:Or.map(u=>i.jsx(Q,{"data-testid":`blender-clear-${u.label.toLowerCase()}`,disabled:L.length===0,title:x,onSelect:R(`Clear ▸ ${u.label}`,v=>Oe(v.selectedObjectNames(),u.call)),children:u.label},u.label))}),i.jsx(ae,{label:"Apply","data-testid":"blender-object-apply",children:Cr.map(u=>i.jsx(Q,{"data-testid":`blender-apply-${u.label.toLowerCase().replace(/ /g,"-")}`,disabled:L.length===0,title:x,onSelect:R(`Apply ▸ ${u.label}`,v=>Oe(v.selectedObjectNames(),`bpy.ops.object.transform_apply(${u.call})`)),children:u.label},u.label))}),i.jsx(be,{}),i.jsx(Q,{"data-testid":"blender-object-duplicate",disabled:L.length===0,title:x,onSelect:R("Duplicate Objects",async u=>{const v=u.selectedObjectNames().map(E=>u.rowIdForObject(E)).filter(E=>E!==null);return u.structure.duplicateMany(v)}),children:"Duplicate Objects"}),i.jsx(Q,{"data-testid":"blender-object-delete",disabled:L.length===0,title:x,onSelect:R("Delete",u=>{const v=u.selectedObjectNames().map(E=>u.rowIdForObject(E)).filter(E=>E!==null);return u.structure.removeMany(v)}),children:"Delete"})]})]})}function Se(e){return/file format is not supported|not a blend file/i.test(e)?"This file is not a supported Blender model. Choose a valid .blend file or return to the previous model.":/EACCES|permission denied|read-only file system/i.test(e)?"Blender could not access the model file. Check its file permissions, then try again.":/ENOENT|no such file|file not found/i.test(e)?"The model file could not be found. Check that it still exists, or return to the previous model.":/failed to fetch|networkerror|network error/i.test(e)?"Blender could not finish loading. Check your connection, then try again.":"Blender could not open this model. Try again, or return to the previous model. Details are available in the console."}const Tr=18e4;function nt({documentId:e,path:t,error:o,preview:s,retry:C,returnToPreview:b,preparingView:m=!1,note:g=null}){const w=o?"Could not open model":m?"Preparing model view":"Opening model",[y]=c.useState(()=>Date.now()),[R,L]=c.useState(()=>Date.now());c.useEffect(()=>{if(o)return;const T=setInterval(()=>L(Date.now()),5e3);return()=>clearInterval(T)},[o]);const I=R-y,x=!o&&I>=Tr,V=c.useMemo(()=>{const T={id:`opening:${e}`,label:w,secondaryLabel:t,role:"boundary",kind:"object",parentId:null,childIds:[]};return{capabilities:{transform:!1,inspectorFields:!1,persist:!1},hierarchy:{roots:()=>[T],node:G=>G===T.id?T:null},subscribe:()=>()=>{}}},[e,t,w]);return i.jsxs("div",{"data-testid":"blender-model-opening","aria-busy":!o,style:{position:"absolute",inset:0,overflow:"auto",background:N.surface.panel,color:N.content.primary},children:[!m&&i.jsx(xt,{documentId:e,type:"Model",title:t,status:o?Se(o):w,selection:()=>({adapter:V,nodeId:null})},w),s&&i.jsx("img",{src:s.image,alt:`Last view of ${s.path}`,draggable:!1,style:{position:"absolute",inset:0,width:"100%",height:"100%",objectFit:"contain",pointerEvents:"none"}}),i.jsxs("div",{style:{position:"relative",minHeight:"100%",display:"flex",flexDirection:"column",justifyContent:s?"flex-end":"center",alignItems:s?"flex-start":"center",boxSizing:"border-box",padding:W[8],gap:W[4]},children:[s&&i.jsxs("div",{style:{padding:`${W[2]} ${W[4]}`,background:N.surface.chrome,border:`1px solid ${N.boundary.default}`,borderRadius:N.shape.small,maxWidth:"100%",overflowWrap:"anywhere"},children:["Previous model: ",s.path," · Preview only"]}),i.jsx(Et,{tone:o?"error":"loading",style:{width:"min(100%, 32rem)",background:N.surface.chrome,border:`1px solid ${N.boundary.default}`,borderRadius:N.shape.small,overflowWrap:"anywhere"},title:i.jsx("span",{style:{fontSize:ve.lg},children:w}),description:i.jsxs(i.Fragment,{children:[i.jsx("div",{style:{color:N.content.primary,marginBottom:W[3]},children:t}),o?Se(o):m?"The file is open. Preparing its viewport.":s?"The previous model stays visible while this file opens.":"Preparing Blender and opening this file. The model will appear here when it is ready.",x&&i.jsxs("div",{"data-testid":"blender-model-opening-stalled",style:{marginTop:W[3],color:N.content.primary},children:["Still opening after ",Math.floor(I/6e4)," minutes. It may have stalled: retry opening, or reload the page."]}),!o&&g&&i.jsx("div",{"data-testid":"blender-model-opening-note",style:{marginTop:W[3],color:N.content.muted,userSelect:"text"},children:g}),o&&i.jsx("div",{"data-testid":"blender-model-opening-detail",style:{marginTop:W[3],fontFamily:kt,fontSize:ve.sm,color:N.content.muted,whiteSpace:"pre-wrap",userSelect:"text",textAlign:"left"},children:o})]}),action:o||x?i.jsxs("div",{style:{display:"flex",flexWrap:"wrap",justifyContent:"center",gap:W[3]},children:[s&&i.jsx(Me,{onClick:b,children:"Return to previous model"}),i.jsx(Me,{variant:"secondary",onClick:C,children:"Retry opening"})]}):i.jsx("progress",{"aria-label":`Opening ${t}`,style:{width:"min(100%, 18rem)",accentColor:N.accent.default}})})]})]})}let re=null;const De=new Set;let Ae=!1;function yt(){Ae||(Ae=!0,queueMicrotask(()=>{Ae=!1;for(const e of[...De])e()}))}function ot(e){re?.project===e.project&&re.capturedAt>e.capturedAt||re!==e&&(re=e,yt())}function $r(){re&&(re=null,yt())}function Fr(e){return re?.project===e?re:null}function Lr(e){return De.add(e),()=>{De.delete(e)}}const lt="blender-model-open",Nr=3e4,st=new WeakMap;let Dr=0;function Br(e){let t=st.get(e);return t===void 0&&(t=++Dr,st.set(e,t)),t}const at=new WeakSet,rn="workspace.document",nn="Blender Model",on=({documentId:e,notify:t})=>i.jsx(gt,{documentId:e,notify:t}),Ir="model",ln={dirty:e=>e.source!==void 0&&Qt(e.source.path),subscribe:Ht,save:e=>Xt(ge(e)),revert:e=>Yt(ge(e)),backup:e=>Jt(ge(e)),restore:(e,t)=>Kt(ge(e),t)};function ge(e){if(!e.source)throw new Error("A model document without a .blend has no working copy.");return e.source.path}const sn="owned",an=[],U=Ut,Vr={wireframe:"WIREFRAME",solid:"SOLID",preview:"MATERIAL",rendered:"RENDERED"},it=new WeakMap;function Gr(e){let t=it.get(e);return t||(t={subject:()=>{const o=ie.playhead();return e.subjectLine(o===null?null:Math.floor(o))},gridScale:o=>e.gridUnitName(o),cameraView:{camera:()=>e.cameraViewCamera(),zoom:e.cameraViewZoom,pan:e.cameraViewPan,showing:o=>e.setCameraViewShowing(o),setPose:(o,s,C,b)=>{const{location:m,rotation:g}=e.blenderPose(s,C);return xe(`from mathutils import Matrix, Quaternion, Vector
10
- import bpy
11
- object = bpy.data.objects[${JSON.stringify(o)}]
12
- object.matrix_world = Matrix.LocRotScale(Vector((${m.join(", ")})), Quaternion((${g.join(", ")})), object.matrix_world.to_scale())`,b,"Lock Camera to View").then(w=>{w.error!==null&&z().console.error(`Blender refused the camera's pose: ${w.error}`,"blender-camera")},w=>z().console.error(`The camera's pose was not written to Blender: ${String(w)}`,"blender-camera"))},view:(o,s,C,b)=>e.cameraView(o,s,C,b)}},it.set(e,t),t)}function Wr(e){return new Promise(t=>{e.toBlob(o=>{if(!o){t(null);return}const s=new FileReader;s.onload=()=>t(String(s.result)),s.onerror=()=>t(null),s.readAsDataURL(o)},"image/png")})}function cn(e){const{active:t,document:o,documentId:s,notify:C,publishContext:b}=e,m=o?.source?.path,g=o?.id,w=JSON.stringify([s,g,m]),[y,R]=c.useState(null),[L,I]=c.useState(null),[x,V]=c.useState(0),T=c.useSyncExternalStore(Wt,()=>Ue(m),()=>null),G=z().projectLocalState.projectRootPath(),q=c.useSyncExternalStore(Lr,()=>Fr(G),()=>null),u=c.useSyncExternalStore(dt,_e,_e),v=c.useRef(null),E=c.useRef({notify:C,publishContext:b});E.current={notify:C,publishContext:b},c.useEffect(()=>z().session.onEnded($r),[]);const K=y?.key===w;return c.useEffect(()=>t===!1||!s||K?void 0:cr(s),[t,s,K]),c.useEffect(()=>{if(t===!1||!s||!g||!G||y?.key!==w||y.error)return;const S=ue(s);if(!S)return;let J=!1,M;const O=async()=>{try{const k=U.snapshot(),X=oe(s);if(!X||S.root!==U.root||!qe(s,g,m,k))return;const $=await S.requestPresentedFrame();if(J||U.snapshot()!==k||ue(s)!==S||S.root!==U.root||oe(s)!==X||!qe(s,g,m,k))return;if($&&$.width>0&&$.height>0){const D=window.document.createElement("canvas");D.width=Math.min($.width,1024),D.height=Math.max(1,Math.round(D.width*$.height/$.width));const B=D.getContext("2d");if(B){B.drawImage($,0,0,D.width,D.height);const a=await Wr(D);if(J||!a)return;v.current={project:G,entryId:g,path:m??"Model",image:a,capturedAt:performance.now()},ot(v.current)}}}catch{}finally{J||(M=setTimeout(()=>{O()},1e3))}};return O(),()=>{J=!0,clearTimeout(M)}},[t,m,s,g,G,w,y,u]),c.useLayoutEffect(()=>{if(!(t===!1||!s||!g||!G||y?.key!==w||y.error))return()=>{if(!z().session.open())return;const S=v.current;S?.project===G&&S.entryId===g&&ot(S)}},[t,m,s,g,G,w,y]),c.useEffect(()=>{if(t===!1||!s)return;let S=!1,J;const M=m===void 0?null:{documentId:s,entryId:g,blend:m},O=zt(M),k=()=>{J=E.current.publishContext?.(U)};R(null),I(null);const X=z().documents;let $=!1,D=!1,B=!1;const a=m??"the model",f=async()=>{if(!(S||$||D)){if(M&&!Zt(M)){B=!0;return}$=!0,B=!1;try{if(M){const l=x>0&&Ue(M.blend)!==null;if(!await er(M,k,l)){B=!0;return}}else k();S||(D=!0,At(lt),R({key:w,error:null}))}catch(l){if(S)return;D=!0,J?.(),J=void 0;const d=l instanceof Error?l.message:String(l);R({key:w,error:d}),z().console.error(d,"blender-open"),E.current.notify?.({tone:"error",title:`Blender could not open ${a}`,detail:Se(d)}),Rt(lt,{message:`Blender could not open ${a}: ${d}`,guidance:`${Se(d)} Dismiss this to reach the model's Retry.`,command:null})}finally{$=!1}}},p=setInterval(()=>{S||D||I(B?`Still waiting: Blender is holding another model, and opens ${a} when it is free.`:`Still opening ${a}: Blender is working (a large file, or a cold start). ${Ct("status")} shows what it is busy with.`)},Nr);let h=!1;const n=()=>{S||h||(h=!0,setTimeout(()=>{h=!1,f()},0))},r=X.subscribe(n);return n(),()=>{S=!0,clearInterval(p),r(),J?.(),O()}},[t,m,s,g,w,x]),t===!1||!s?null:y?.key!==w||y.error?i.jsx(nt,{documentId:s,path:m??"Model",error:y?.key===w?y.error:null,preview:q,note:L,retry:()=>{R(null),V(S=>S+1)},returnToPreview:()=>{q&&z().workspace.open({kind:"document",id:q.entryId}).then(S=>{if(!S)throw new Error("The previous model is no longer available in this project.")}).catch(S=>E.current.notify?.({tone:"error",title:"Could not return to the previous model",detail:String(S)}))}}):i.jsxs(i.Fragment,{children:[i.jsx(zr,{...e}),T&&i.jsxs("div",{role:"alert","data-testid":"blender-model-not-saving",style:{position:"absolute",top:W[3],left:W[3],right:W[3],zIndex:2,background:N.surface.chrome,color:N.content.primary,border:`1px solid ${N.semantic.warning}`,padding:W[3],fontSize:ve.sm},children:[i.jsx("strong",{children:"Model is not being saved"}),i.jsx("div",{style:{marginTop:W[2],marginBottom:W[3],userSelect:"text"},children:T}),i.jsx("div",{style:{marginBottom:W[3]},children:"Reopening replaces this scene with the last saved file."}),i.jsx(Me,{variant:"secondary",onClick:()=>{R(null),V(S=>S+1)},children:"Reopen saved document"})]}),!oe(s)&&i.jsx(nt,{documentId:s,path:m??"Model",error:null,preparingView:!0,preview:q,retry:()=>{},returnToPreview:()=>{}})]})}function zr(e){const{documentId:t}=e,o=e.document?.source?.path;c.useEffect(()=>t?dr(t,o):void 0,[t,o]),c.useEffect(()=>{if(!t)return;let p=!1,h=null,n=null,r=Promise.resolve();const l=[t,`${t}#area-2`,`${t}#play`],d=()=>{for(const P of l)ue(P)?.setDisplayTransform(h)},j=()=>{const P=U.displaySettings();if(!P)return r;const F=JSON.stringify(P);return F===n||(n=F,r=(async()=>{if(P.device!=="sRGB")throw new Error(`Blender display device ${P.device} has no browser display processor yet`);const Z=await tr(P);if(p||n!==F){Z.dispose();return}const se=h;h=Z,d(),se?.dispose();for(const pe of l)ke(pe,{modes:{rendered:{lighting:{tone:{mapper:"none",exposure:1}}},preview:{lighting:{tone:{mapper:"none",exposure:1}}}}})})().catch(Z=>z().console.error(String(Z),"blender-colour"))),r},_=()=>{const P=U.photographSampling();for(const F of l)ue(F)?.setPhotographSampling(P)},A=U.subscribeFrames(()=>{_(),j()}),Y=ut(()=>{d(),_()});_();const H=lr(t,async()=>{await j(),await U.drawReady()});return j(),()=>{p=!0,A(),Y(),H();const P=h;h=null,d(),P?.dispose()}},[t]);const s=c.useSyncExternalStore(ht,()=>t?Be(t):!1,()=>!1),[C,b]=c.useState(null);c.useEffect(()=>{if(!s||!t)return;const p=`${t}#area-2`;Ot(p).drawMode===void 0&&ke(p,{drawMode:"rendered"});const h=U.follow();return b(h),()=>{b(null),h.dispose()}},[s,t]);const m=c.useSyncExternalStore(Ce,()=>t?te()?.playing(t)??!1:!1,()=>!1),[g,w]=c.useState(null),y=c.useSyncExternalStore(Ce,()=>t?te()?.aspectRatio?.(t)??null:null,()=>null),[R,L]=c.useState(!1),I=c.useRef(null),[x,V]=c.useState(null),T=c.useSyncExternalStore(Ce,()=>t?te()?.transport?.generation(t)??0:0,()=>0),[G,q]=c.useState(T),[u,v]=c.useState(null),E=c.useRef(!1),K=c.useRef(!1);c.useLayoutEffect(()=>{if(T!==G){if(m&&t){if(E.current=!0,!K.current){let p=null;try{p=oe(`${t}#play`)?.capture?.()??null}catch{}v(p)}K.current=!0}q(T)}},[T,G,m,t]);const S=te()?.transport,J=c.useCallback(p=>S?.subscribeClock(p)??(()=>{}),[S]),M=c.useSyncExternalStore(J,()=>t&&S?S.clock(t).failure??null:null,()=>null);c.useEffect(()=>{M!==null&&(K.current=!1,v(null))},[M]);const O=c.useRef([]);c.useEffect(()=>{if(!m||!t){E.current=!1;return}const p=`${t}#play`;ke(p,{drawMode:"rendered"});const h=U.detach(),n=E.current;return E.current=!1,n||L(!1),w(h),n||(U.setPlaying(!0),Ie(t)),()=>{if(E.current&&te()?.playing(t)){O.current.push(h);return}h.dispose();for(const r of O.current.splice(0))r.dispose();K.current=!1,V(null),w(null),v(null),U.setPlaying(!1),Ie(t),qt().catch(()=>{})}},[m,t,G]),c.useEffect(()=>{for(const p of O.current.filter(h=>h!==g))p.dispose();O.current=O.current.filter(p=>p===g)},[g]),c.useEffect(()=>()=>{for(const p of O.current.splice(0))p.dispose()},[]),c.useEffect(()=>{if(t)return()=>te()?.setPlaying(t,!1)},[t]);const k=m?g:null,X=y===null?{position:"absolute",inset:0}:{position:"absolute",left:"50%",top:"50%",transform:"translate(-50%, -50%)",width:`min(100cqw, calc(100cqh * ${y}))`,height:`min(100cqh, calc(100cqw / ${y}))`};if(c.useEffect(()=>{if(!k||!t)return;const p=oe(t);if(!p)return;const h=p.capture,n=r=>oe(`${t}#play`)?.capture?.(r)??null;return p.capture=n,()=>{p.capture===n&&(h?p.capture=h:delete p.capture)}},[k,t]),c.useEffect(()=>{k&&U.setPlaying(x!=="live")},[k,x,U]),!t)return null;const $=s?C:null,D={position:"relative",flex:"1 1 0",minWidth:0,margin:12},B=k!==null&&typeof x=="object"?x:null,a=k!==null&&R&&(x===null||x==="hidden"),f=B===null?{inset:12}:{left:`calc(12px + (100% - 24px) * ${B.left})`,top:`calc(12px + (100% - 24px) * ${B.top})`,width:`calc((100% - 24px) * ${B.width})`,height:`calc((100% - 24px) * ${B.height})`};return i.jsxs("div",{style:k||$?{position:"absolute",inset:-12,display:"flex",gap:2}:{display:"contents"},children:[i.jsx("div",{inert:a||B!==null||void 0,style:k?{position:"absolute",...f,zIndex:2,opacity:a?0:1,pointerEvents:a||B!==null?"none":"auto",transition:x===null?"opacity 160ms ease-out":"none"}:$?D:{display:"contents"},children:i.jsx(Re,{...e,view:U,main:!0})},"model"),k&&i.jsx("div",{style:{position:"absolute",inset:12,containerType:"size"},"data-testid":"blender-play-area",children:i.jsx("div",{"data-volter-play-frame":!0,style:X,children:i.jsx(Re,{...e,documentId:`${t}#play`,view:k.view,main:!1,playing:!0,onPlayReady:()=>{K.current=!1,L(!0),v(null)},onPlayEdit:V,playOverlay:I})})},`play-${Br(k)}`),k&&i.jsx("div",{ref:I,"data-testid":"blender-play-overlay",style:{position:"absolute",inset:12,zIndex:5,pointerEvents:"none"}},"play-overlay"),k&&M!==null&&i.jsxs("div",{role:"alert","data-testid":"blender-play-failure",style:{position:"absolute",left:24,right:24,top:24,zIndex:4,padding:`${W[2]} ${W[3]}`,background:N.surface.chrome,border:`1px solid ${N.semantic.danger}`,borderRadius:N.shape.small,color:N.content.primary,fontSize:ve.sm,whiteSpace:"pre-wrap",overflowWrap:"anywhere",userSelect:"text"},children:[i.jsx("strong",{style:{color:N.semantic.danger},children:"Play is not running."})," ",M," Restart (or save the script) to try again, or Stop."]},"play-failure"),k&&u!==null&&i.jsx("div",{style:{position:"absolute",inset:12,containerType:"size",zIndex:3,pointerEvents:"none"},"data-testid":"blender-play-restart-still",children:i.jsx("img",{alt:"",src:u,style:{...X,display:"block",objectFit:"fill"}})},"restart-still"),$&&i.jsxs("div",{style:{...D,visibility:k?"hidden":void 0},"aria-hidden":k?!0:void 0,"data-testid":"blender-second-area",children:[i.jsx(Re,{...e,documentId:`${t}#area-2`,view:$.view,main:!1}),!k&&i.jsx(Hr,{documentId:t,areaId:`${t}#area-2`,notify:e.notify})]},"second")]})}function Hr({documentId:e,areaId:t,notify:o}){c.useSyncExternalStore(dt,_e,_e);const s=c.useSyncExternalStore(Pt,()=>Tt(e)),C=oe(t)?.HeaderControls,b=c.useRef(null);return c.useEffect(()=>{const m=b.current,g=m?.parentElement;if(!g)return;const w=()=>Ge(e,{headerWidth:g.getBoundingClientRect().width+12,shelf:m});w();const y=new ResizeObserver(w);return y.observe(g),()=>{y.disconnect(),Ge(e,null)}},[e]),i.jsxs(i.Fragment,{children:[i.jsx("div",{ref:b,className:"volter-dock-document-shelf",role:"toolbar","aria-orientation":"vertical","aria-label":"Document tools"}),s&&$t.createPortal(i.jsxs("div",{className:"volter-dock-document-toolbar-own","data-testid":`document-header:${t}`,style:{display:"flex",alignItems:"center"},children:[i.jsx(gt,{documentId:e,notify:o}),C&&i.jsx(c.Suspense,{fallback:null,children:i.jsx(C,{documentId:t})})]}),s)]})}function Re({active:e,document:t,documentId:o,notify:s,surfaces:C,view:b,main:m,playing:g=!1,onPlayReady:w,onPlayEdit:y,playOverlay:R}){const L=Gr(b),I=c.useCallback(()=>({root:b.root,prepareDraw:(a,f)=>b.prepareDraw(a,f),...g?{}:{onChange(a){const f=b.onChange(a),p=ie.subscribe(a);return()=>{f(),p()}}},dispose(){}}),[b,g]),x=t?.source?.path,V=c.useCallback(a=>{const f=b.onChange(a),p=ie.subscribe(a);let h=null;const n=()=>{h?.(),h=ne().find(l=>l.documentId===o)?.onFrame(a)??null};n();const r=fe(n);return()=>{f(),p(),r(),h?.()}},[o,b]),T=c.useSyncExternalStore(V,L.subject),G=c.useMemo(()=>m?Er:ft(()=>b),[m,b]);c.useEffect(()=>{if(m||g||!o)return;let a=!1;const f=()=>{if(a)return;const n=ue(o);n===null||b.cameraViewCamera()===null||(a=n.toggleCameraView())};f();const p=ut(f),h=b.subscribeFrames(f);return()=>{p(),h()}},[m,g,o,b]);const q=c.useRef(s),u=c.useRef(null),[v,E]=c.useState(!1);q.current=s;const K=c.useRef(w);K.current=w;const S=c.useRef(y);S.current=y,c.useEffect(()=>{if(!g||!o)return;if(x===void 0){q.current?.({tone:"error",title:"This model has no game",detail:"A level's game is its project's, and this model has no file of its own in the project."});return}const a=o.replace(/#play$/,""),f=window.document.createElement("div");Object.assign(f.style,{position:"absolute",inset:"0",pointerEvents:"none"}),f.dataset.testid="model-play-roots",u.current?.appendChild(f),E(!1);let p=!1,h=null,n=null;const r=()=>{h||p||!ne().find(F=>F.documentId===o)||!b.root.parent||(n=b.root.visible,b.root.visible=!1,h=te()?.run({documentId:a,container:f,ready:()=>{p||(E(!0),K.current?.())},edit:F=>{p||S.current?.(F)},...R?.current?{overlay:R.current}:{},sourcePath:x,report:(F,Z)=>{z().console.error(`${F}: ${Z}`,"blender-play"),q.current?.({tone:"error",title:F,detail:Z})}})??null)};r();let l,d;const j=()=>{const P=ne().find(F=>F.documentId===o);P!==l&&(d?.(),l=P,d=P?.onFrame(r),r())};j();const _=fe(j),A=P=>{P.key!=="Escape"||!Ft(P)||globalThis.document.pointerLockElement||performance.now()-Y<500||setTimeout(()=>{if(P.defaultPrevented)return;const F=te();F?.escape?F.escape(a):F?.setPlaying(a,!1)},0)};let Y=-1/0;const H=()=>{globalThis.document.pointerLockElement||(Y=performance.now())};return globalThis.document.addEventListener("pointerlockchange",H),window.addEventListener("keydown",A,!0),()=>{globalThis.document.removeEventListener("pointerlockchange",H),p=!0,_(),d?.(),window.removeEventListener("keydown",A,!0),h?.(),n!==null&&(b.root.visible=n,n=null),f.remove()}},[g,o,x,b]),c.useEffect(()=>!m||!o?void 0:Ve(()=>{const f=b.savedView(),p=We(o).drawMode,h=Vr[p];!f||h===void 0||f.drawMode===p||(b.noteSavedShading(h),or(h))}),[m,o,b]),c.useEffect(()=>{if(m||!o)return;const a=()=>{const f=Lt(o);f===null||at.has(f)||(at.add(f),f.showHelpers&&f.toggleHelpers(),f.showGizmos&&f.toggleGizmos())};return a(),Mt(a)},[m,o]),c.useEffect(()=>{if(!o)return;const a=b.overlayGroups(),f=()=>{const h=ne().find(n=>n.documentId===o);if(h)for(const{kind:n,object:r}of a)h.setHelper(n,r)};f();const p=fe(f);return()=>{p();const h=ne().find(n=>n.documentId===o);for(const{kind:n}of a)h?.setHelper(n,null)}},[o,b]);const J=c.useSyncExternalStore(rr,Ke,Ke);c.useEffect(()=>{if(!o||!m)return;let a=!0;return ie.sync(b,{clip:f=>Je(f===null?{}:{object:f}),bake:(f,p)=>Je({object:f,action:p,summary:!1}),movie:()=>nr()}).catch(f=>{a&&z().console.warn(`This file's action could not be read: ${f instanceof Error?f.message:String(f)}`,"blender-skin")}),()=>{a=!1}},[o,m,b,J]),c.useEffect(()=>{if(!o||!m)return;const{transport:a}=z();let f=null,p=!1,h=!1;const n=()=>{if(p||f)return;const d=a.for(o);d&&(f=ie.attachTo(d))},r=()=>{p||h||(h=!0,queueMicrotask(()=>{h=!1,n()}))};r();const l=a.subscribe(r);return()=>{p=!0,l();const d=f;f=null,d&&queueMicrotask(d)}},[o,m]),c.useEffect(()=>{if(!o)return;const a=()=>ne().find(j=>j.documentId===o);let f,p=null;const h=new ur,n=()=>a()?.rig().drawCamera()??h,r=()=>{const j=a();j!==f&&(p?.(),p=j?j.onFrame(()=>b.refreshRendered()):null,f=j);const{lighting:_,drawMode:A}=We(o),Y=A==="preview",H=Y?{world:_.source==="scene",lights:_.preview.sceneLights}:void 0,P=_.source==="scene"||Y&&_.preview.sceneLights;b.holdRendered(P&&j?n:null,H,g?"render":"viewport"),b.setWorkbench(_.source==="studio"&&_.studioPreset===ct.id)};r();const l=Ve(r),d=fe(r);return()=>{l(),d(),p?.(),b.holdRendered(null),b.setWorkbench(!1)}},[o,b,g]);const M=c.useRef(null),O=a=>!g&&a.button===2&&a.shiftKey&&a.target instanceof HTMLCanvasElement,k=a=>{if(!O(a)){M.current=null;return}a.preventDefault(),a.stopPropagation(),M.current={id:a.pointerId,x:a.clientX,y:a.clientY},a.isTrusted&&a.target.setPointerCapture(a.pointerId)},X=()=>{M.current=null},$=a=>{const f=M.current;if(f===null||a.pointerId!==f.id||a.button!==2||(M.current=null,a.preventDefault(),a.stopPropagation(),Math.hypot(a.clientX-f.x,a.clientY-f.y)>3))return;const p=b.placeCursor(a.clientX,a.clientY,a.target);if(p===null)return;const[h,n,r]=p.location,[l,d,j,_]=p.rotation;xe(`from mathutils import Matrix, Quaternion, Vector
13
- bpy.context.scene.cursor.matrix = Matrix.LocRotScale(Vector((${h}, ${n}, ${r})), Quaternion((${l}, ${d}, ${j}, ${_})), None)`,!1,"Set 3D Cursor").then(A=>{A.error!==null&&z().console.error(`Blender refused the 3D cursor: ${A.error}`,"blender-cursor")},A=>z().console.error(`The 3D cursor was not written to Blender: ${String(A)}`,"blender-cursor"))},D=a=>{O(a)&&a.preventDefault()};if(!o)return null;const B=C.Object3DAuthoring;return i.jsx("div",{ref:u,"data-play-ready":g?v:void 0,style:g?{position:"absolute",inset:0}:{display:"contents"},onPointerDownCapture:k,onPointerUpCapture:$,onPointerCancelCapture:X,onLostPointerCaptureCapture:X,onContextMenuCapture:D,children:i.jsx(B,{active:e??!0,fillContainer:g,documentId:o,sourcePath:x??"blender:runtime",displayName:t?.label??"Model",...T===null?{}:{subject:T},gridScale:L.gridScale,cameraView:L.cameraView,build:I,audit:!1,...g?{}:{authoring:G},cameraDirection:[.8187,.4458,.3617],openingFit:3,openingView:b.savedView(),presentation:(()=>{const a=b.savedView();if(!a)return null;const f={fov:mt(a.lens)},p={backdrop:{source:"color",color:a.background}};return m&&a.drawMode?{camera:f,drawMode:a.drawMode,modes:{solid:p,wireframe:p,preview:{lighting:{source:a.sceneWorld?"scene":"preview",preview:{sceneLights:a.sceneLights}},backdrop:{source:a.sceneWorld?"scene":"fill"}}}}:{camera:f,modes:{solid:p,wireframe:p}}})(),stageKind:Ir,dressing:{environment:!1,keyLight:!1,viewLocked:b.studioLights()}})})}export{on as Toolbar,cn as default,Ir as documentKind,an as inspectorBuiltins,sn as inspectorRail,rn as point,nn as title,ln as workingCopy};
@@ -1 +0,0 @@
1
- import{b as n}from"./blender-base64-Cxqc4R5f.js";import{gU as s,dm as r}from"./volter-sdk-D8o6TU4A.js";const d="workspace.service";async function a(){const e=s(),t=await e.documents.captureActive();r(t.base64);const o=`screenshots/screenshot-${new Date().toISOString().replace(/[:.]/g,"-")}.png`;await e.files.write(o,n(t.base64)),e.notify({id:"blender-screenshot",tone:"info",title:"Saved the screenshot",detail:o})}function h(){return s().keyboard.bindActions([{id:"blender.saveScreenshotEditor",run:()=>void a()}])}export{d as point,h as start};
@@ -1 +0,0 @@
1
- import{r as u,j as t,gU as oe}from"./volter-sdk-D8o6TU4A.js";import{C as re,D as z,d as Ie}from"./blender-outliner-model-BqLWEXta.js";import{b as g,c as He,d as he,p as V,s as fe,m as pe,e as xe,f as ye,g as Z,h as I}from"./play-mode-BGq1Hn-c.js";const _e={transform:{startFrame:-5,pixelsPerFrame:8},refusal:null,size:{w:0,h:0},framedAt:0,drawn:null,onlySelected:!0,editor:"timeline"};let Y=_e,ie=0;const J=new Set;let ge=0;function A(){return Y}function N(){return ie}function K(e){return J.add(e),()=>{J.delete(e)}}function R(e){Y={...Y,...e},ie+=1;for(const i of[...J])i()}function ze(e){Y.onlySelected!==e&&R({onlySelected:e})}function be(){ge+=1,ie+=1;for(const e of[...J])e()}function Le(){return ge}function we(e){R({refusal:e})}const Ce=20,w=23,X=26,E=16,De=2,Be=w+De,le=35,We=6;function je(e){const i=[2,3,5],r=[];for(let n=0;n<i.length;n++){const s=i[n],a=Math.trunc(e/s),o=a*s===e;if(o&&a===2)return s;r[n]=o}for(let n=0;n<i.length;n++)if(r[n])return i[n];return e}function Ke(e,i,r,n){if(r===0)return 1;const s=i/r;let a=Math.max(e,1);if(s*a>n)for(;a>1;){const o=je(a),x=Math.trunc(a/o);if(s*x<n)break;a=x}else for(;s*a<n&&a<1<<30;)a*=2;return a}function Ge(e){return e<=1?null:e/je(Math.round(e))}const p={back:"#303030",header:"#303030",grid:"#161616",gridMinor:"#262626",scrubBack:"#1d1d1d",scrubText:"#808080",playhead:"#4772b3",playheadText:"#ffffff",previewRange:"#a14d00",longKey:"#ffffff",longKeyAlpha:31/255,longKeySelected:"#ff8c00",longKeySelectedAlpha:153/255,keyBorder:"#000000"},Q={KEYFRAME:{fill:"#bfbfbf",selected:"#ffbe33"},EXTREME:{fill:"#e8b3cc",selected:"#f28080"},BREAKDOWN:{fill:"#b3dbe8",selected:"#54bfed"},JITTER:{fill:"#94e575",selected:"#61c042"},MOVING_HOLD:{fill:"#808080",selected:"#ffaf23"},GENERATED:{fill:"#585858",selected:"#a28962"}},Ve={KEYFRAME:1,EXTREME:1.2,MOVING_HOLD:.925,BREAKDOWN:.85,JITTER:.8,GENERATED:.75},ee=5.06,ve=2.12,Ye=15,b={minPillWidth:24,textPadding:4,margin:2,radius:4,tipHalfWidth:6,tipHeight:6,stalkWidth:3},ce="#212121",c={text:"#a6a6a6",textHi:"#ffffff",rule:"#161616",widget:"#545454",widgetText:"#e6e6e6",widgetOutline:"#3d3d3d",widgetRadius:4,unit:Ce,refusal:"#ffaf23",headerPadding:"0 8px",headerGap:8,statusPadding:"2px 8px"},Je=.2,Xe=()=>pe();function Ue(e,i){i==="game"&&g.transport?.snapshot().playbackState==="playing"&&g.transport.pause(),He(e,i)}const qe=e=>e.preventDefault();function Ze({label:e,testId:i,disabled:r,pressed:n,wide:s,onClick:a,children:o}){const x=c.unit;return t.jsx("button",{type:"button","data-testid":i,title:e,"aria-label":e,"aria-pressed":n,disabled:r,onMouseDown:qe,onClick:a,style:{minWidth:x,height:x,padding:s?"0 6px":0,border:`1px solid ${c.widgetOutline}`,background:n?p.playhead:c.widget,color:c.widgetText,font:"inherit",display:"inline-flex",alignItems:"center",justifyContent:"center",gap:4,cursor:r?"not-allowed":"pointer",opacity:r?.4:1},children:o})}function ke({title:e}){u.useSyncExternalStore(he,V,V);const i=u.useSyncExternalStore(fe,Xe,()=>null),r=xe();if(i===null||r===null)return t.jsx("span",{style:{color:c.text},children:e});const n=ye(r),s=(a,o,x)=>t.jsx(Ze,{testId:`model-play-mode-${a}`,label:x,pressed:n===a,wide:!0,onClick:()=>Ue(r,a),children:o});return t.jsxs("div",{role:"group","aria-label":"Game or Animation","data-testid":"model-play-mode",style:{display:"flex"},children:[s("game","Game","Game: this area is the Game panel, with Play, pause, step, speed, restart and autoplay"),s("animation","Animation","Animation: this area is Blender’s animation editors (Timeline, Action Editor, NLA); a running game keeps running and they show what it animates")]})}const Qe=[{id:"timeline",label:"Timeline"},{id:"action",label:"Action Editor"},{id:"nla",label:"Nonlinear Animation"}],_=200;function Ee(){u.useSyncExternalStore(K,N,N);const{editor:e}=A();return t.jsx("select",{"aria-label":"Animation editor","data-testid":"animation-editor-type",value:e,onChange:i=>R({editor:i.target.value}),style:{height:c.unit,border:`1px solid ${c.widgetOutline}`,borderRadius:c.widgetRadius,background:c.widget,color:c.widgetText,font:"inherit"},children:Qe.map(i=>t.jsx("option",{value:i.id,children:i.label},i.id))})}function Me(){const e=u.useRef(null),[i,r]=u.useState({w:0,h:0});return u.useEffect(()=>{const n=e.current;if(!n)return;const s=new ResizeObserver(()=>r({w:n.clientWidth,h:n.clientHeight}));return s.observe(n),r({w:n.clientWidth,h:n.clientHeight}),()=>s.disconnect()},[]),{ref:e,size:i}}function Se({children:e}){return t.jsxs("div",{style:{height:X,flex:`0 0 ${X}px`,display:"flex",alignItems:"center",gap:c.headerGap,padding:c.headerPadding,background:p.header,borderBottom:`1px solid ${c.rule}`},children:[t.jsx(ke,{title:"Animation"}),t.jsx(Ee,{}),e]})}function Te({children:e,header:i}){return t.jsxs("div",{style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",overflow:"hidden",background:p.back,color:c.text,font:"11px Inter, system-ui, sans-serif"},children:[i,e]})}function Ae(e,i,r){const n=Math.max(1,i-e),s=Math.max(1e-6,r/(n*1.1)),a=e-n*.05,o=m=>(m-a)*s,h=[1,2,5,10,20,25,50,100,250,500,1e3].find(m=>m*s>=40)??1e3,$=[];if(r>0)for(let m=Math.ceil(a/h)*h;o(m)<=r&&$.length<500;m+=h)$.push(m);return{toX:o,majors:$,toFrame:m=>a+m/s}}function $e({x:e,frame:i,height:r}){const n=`${Math.round(i)}`,s=Math.max(b.minPillWidth,n.length*6+2*b.textPadding);return t.jsxs("g",{children:[t.jsx("rect",{x:e-b.stalkWidth/2,y:w,width:b.stalkWidth,height:Math.max(0,r-w),fill:p.playhead}),t.jsx("rect",{x:e-s/2,y:b.margin,width:s,height:w-2*b.margin,rx:b.radius,fill:p.playhead}),t.jsx("text",{x:e,y:15.5,textAnchor:"middle",fill:p.playheadText,fontSize:11,children:n})]})}function Re({majors:e,toX:i,width:r,height:n}){return t.jsxs("g",{children:[e.map(s=>t.jsx("line",{x1:i(s),y1:w,x2:i(s),y2:n,stroke:p.grid},`g${s}`)),t.jsx("rect",{x:0,y:0,width:r,height:w,fill:p.scrubBack}),e.map(s=>t.jsx("text",{x:i(s),y:15.5,textAnchor:"middle",fill:p.scrubText,fontSize:11,children:s},`t${s}`))]})}function de(e,i,r){const n=ee;return t.jsx("polygon",{points:`${e},${i-n} ${e+n},${i} ${e},${i+n} ${e-n},${i}`,fill:Q.KEYFRAME.fill,stroke:p.keyBorder,strokeWidth:ve},r)}const et=e=>`bpy.data.objects[${JSON.stringify(e)}].animation_data`;function tt(){u.useSyncExternalStore(re,z,z),u.useSyncExternalStore(Z,I,I);const{ref:e,size:i}=Me(),[r,n]=u.useState(null),s=g.state(),a=g.subject??s.armature,o=s.action,x=u.useMemo(()=>g.channels(),[s.action,s.engineCalls]),h=x.flatMap(d=>d.keys),$=h.length?Math.min(...h):s.start,m=h.length?Math.max(...h):s.end,y=Math.max(0,i.w-_),{toX:j,majors:M,toFrame:F}=Ae($,m,y),H=s.frame,L=d=>w+E*(d+1),P=w+E*(x.length+2),G=[...new Set(h)].sort((d,f)=>d-f),O=async d=>{if(a){n(null);try{await Ie(et(a),"action",`bpy.data.actions[${JSON.stringify(d)}]`)}catch(f){n(`${d} could not be assigned to ${a}: ${f instanceof Error?f.message:String(f)}`)}}},l=t.jsxs(Se,{children:[t.jsx("span",{style:{color:c.textHi},children:a??"No armature"}),t.jsxs("select",{"aria-label":"Action","data-testid":"action-editor-action",value:o??"",disabled:!a,title:"The action this armature plays (animation_data.action)",onChange:d=>void O(d.target.value),style:{height:c.unit,minWidth:180,border:`1px solid ${c.widgetOutline}`,borderRadius:c.widgetRadius,background:c.widget,color:c.widgetText,font:"inherit"},children:[o===null?t.jsx("option",{value:"",children:"No action"}):null,g.actionNames().map(d=>t.jsx("option",{value:d,children:d},d))]}),t.jsx("div",{style:{flex:1}}),r?t.jsx("span",{style:{color:c.refusal},children:r}):null]});return t.jsx(Te,{header:l,children:t.jsx("div",{ref:e,style:{flex:1,minHeight:0,overflowY:"auto",overflowX:"hidden"},children:t.jsxs("div",{style:{display:"flex",minHeight:P},children:[t.jsxs("div",{style:{width:_,flex:`0 0 ${_}px`,borderRight:`1px solid ${c.rule}`},children:[t.jsx("div",{style:{height:w,background:p.scrubBack}}),t.jsx("div",{style:{height:E,paddingLeft:6,color:c.textHi},children:"Summary"}),x.map(d=>t.jsx("div",{style:{height:E,paddingLeft:18,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:d.bone},d.bone))]}),t.jsxs("svg",{width:y,height:P,style:{display:"block",cursor:"ew-resize"},"aria-label":"Action Editor",onPointerDown:d=>{const f=d.currentTarget.getBoundingClientRect();g.transport?.seekFrame(Math.round(F(d.clientX-f.left)))},children:[t.jsx("rect",{x:0,y:0,width:y,height:P,fill:p.back}),t.jsx(Re,{majors:M,toX:j,width:y,height:P}),G.map(d=>de(j(d),L(0)-E/2,`s${d}`)),x.map((d,f)=>d.keys.map(v=>de(j(v),L(f+1)-E/2,`${d.bone}${v}`))),t.jsx($e,{x:j(H),frame:H,height:P})]})]})})})}function nt(){u.useSyncExternalStore(re,z,z),u.useSyncExternalStore(Z,I,I);const{ref:e,size:i}=Me(),r=g.state(),n=g.stacks(),s=Math.max(0,i.w-_),{toX:a,majors:o}=Ae(r.start,r.end,s),x=[];for(const m of n){x.push({label:m.armature,kind:"armature",strips:[]}),x.push({label:m.action?`[Action] ${m.action}`:"[Action] (none)",kind:"action",strips:[]});for(const y of[...m.animation?.tracks??[]].reverse())x.push({label:y.name,kind:"track",mute:y.mute,strips:y.strips.map(j=>({name:j.name,start:j.start,end:j.end,mute:j.mute}))})}const h=w+E*(x.length+1),$=t.jsx(Se,{});return t.jsx(Te,{header:$,children:t.jsx("div",{ref:e,style:{flex:1,minHeight:0,overflowY:"auto",overflowX:"hidden"},children:t.jsxs("div",{style:{display:"flex",minHeight:h},children:[t.jsxs("div",{style:{width:_,flex:`0 0 ${_}px`,borderRight:`1px solid ${c.rule}`},children:[t.jsx("div",{style:{height:w,background:p.scrubBack}}),x.map((m,y)=>t.jsx("div",{"data-testid":`nla-row-${m.kind}`,style:{height:E,paddingLeft:m.kind==="armature"?6:18,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",color:m.kind==="armature"?c.textHi:m.mute?"#6a6a6a":c.text},children:m.label},`${m.label}${y}`))]}),t.jsxs("svg",{width:s,height:h,style:{display:"block"},"aria-label":"NLA",children:[t.jsx("rect",{x:0,y:0,width:s,height:h,fill:p.back}),t.jsx(Re,{majors:o,toX:a,width:s,height:h}),x.map((m,y)=>{const j=w+E*y+2;return m.strips.map(M=>t.jsxs("g",{children:[t.jsx("rect",{x:a(M.start),y:j,width:Math.max(2,a(M.end)-a(M.start)),height:E-4,rx:2,fill:M.mute||m.mute?"#4a4a4a":"#7b7b7b",stroke:"#1a1a1a"}),t.jsx("text",{x:a(M.start)+4,y:j+E-7,fill:"#ffffff",fontSize:10,children:M.name})]},`${y}${M.name}${M.start}`))}),t.jsx($e,{x:a(r.frame),frame:r.frame,height:h})]})]})})})}const rt="workspace.document",it="Timeline",Ne=.25,Fe=200,te={"set-range":"Setting the frame range writes `scene.frame_start`/`frame_end`, which the document would save. This is Blender's Timeline as an INSPECTION surface: the range is drawn, never set. Change it in bpy and the Timeline re-reads it.","insert-key":"Inserting a keyframe writes the action. Editing parity is not the program — key it in bpy (`pose_bone.keyframe_insert`) and the Timeline re-reads the action on the next present.","move-key":"Moving a keyframe writes the F-Curve's control points. The summary row draws the keys the action HAS; the Dope Sheet that would move them is the Animation workspace's, and it is not built.","delete-key":"Deleting a keyframe writes the action. Editing parity is not the program.","set-interpolation":"Setting a key's interpolation writes the F-Curve. Note also that this view PLAYS a per-frame bake (`rna_action_clip`), so interpolation is not a thing it reads back.","select-key":"Selecting a keyframe writes `Keyframe.select_control_point`. The view draws the flags the data carries — a selected key takes `.common.anim.keyframe_selected` — and changes none of them."},U="No scene transport is attached yet; open the model document first.";function k(){return g.transport}function ne(){return k()?.snapshot().playbackState==="playing"}function W(e){return we(e),T()}const ue={JITTER:1,GENERATED:2,MOVING_HOLD:3,BREAKDOWN:4,KEYFRAME:5,EXTREME:6};function Pe(e,i){const r=[],n=new Map;for(const s of e)if(!(i&&!s.selected)){r.push(s.object);for(const a of s.keyframes){const o=n.get(a.frame);if(!o){n.set(a.frame,{...a});continue}o.select=o.select||a.select,(ue[a.type]??0)>(ue[o.type]??0)&&(o.type=a.type)}}return{columns:[...n.values()].sort((s,a)=>s.frame-a.frame),objects:r}}function q(){return Pe(g.state().summary,A().onlySelected).columns.map(e=>e.frame)}function T(){const e=A();return{...g.state(),transform:e.transform,size:e.size,refusal:e.refusal,drawn:e.drawn,editor:e.editor}}function B(e){if(!g.playable)return W(U);const i=k();return i?(i.seekFrame(e),T()):W("No stage transport is attached yet; open the model document first.")}const st=[{id:"state",run:()=>T()},{id:"editor",run:e=>{const i=e?.editor??e?.to;return i!=="timeline"&&i!=="action"&&i!=="nla"?W("editor is `timeline`, `action` (the Action Editor) or `nla`."):(R({editor:i}),T())}},{id:"frame",run:e=>{const i=Number(e?.frame??e?.to);if(!Number.isFinite(i))throw new Error("frame needs a numeric `frame` — a Blender frame number.");return B(i)}},{id:"play",run:()=>{if(!g.playable)throw new Error(U);const e=k();if(!e)throw new Error("No stage transport is attached yet; open the model document first.");return e.play(),T()}},{id:"pause",run:()=>{const e=k();return e?(e.pause(),T()):W("No stage transport is attached yet.")}},{id:"jump-start",run:()=>B(g.state().start)},{id:"jump-end",run:()=>B(g.state().end)},{id:"next-keyframe",run:()=>{const e=g.frame(),i=q().find(r=>r>e+1e-4);return i===void 0?T():B(i)}},{id:"prev-keyframe",run:()=>{const e=g.frame(),i=q().reverse().find(r=>r<e-1e-4);return i===void 0?T():B(i)}},{id:"view-all",run:()=>(be(),T())},{id:"zoom",run:e=>{const i=Number(e?.to??e?.zoom);if(!Number.isFinite(i))throw new Error("zoom needs a numeric `to` — CSS pixels per frame, 0.25 … 200.");const{transform:r,size:n}=A(),s=r.startFrame+n.w/2/r.pixelsPerFrame,a=Math.min(Fe,Math.max(Ne,i));return R({transform:{pixelsPerFrame:a,startFrame:s-n.w/2/a}}),T()}},{id:"pan",run:e=>{const i=Number(e?.frames??0);if(!Number.isFinite(i))throw new Error("pan needs a numeric `frames`.");const{transform:r}=A();return R({transform:{...r,startFrame:r.startFrame+i}}),T()}},...Object.keys(te).map(e=>({id:e,run:()=>W(te[e])}))],me="timeline";function at(){u.useSyncExternalStore(he,V,V),u.useSyncExternalStore(K,N,N);const e=xe(),i=e!==null&&ye(e)==="game",{editor:r}=A(),n=i||r!=="timeline",s=u.useSyncExternalStore(fe,()=>pe()?.Panel??null,()=>null);return u.useEffect(()=>oe().workspace.setAreaRatio(me,n?Je:null),[n]),u.useEffect(()=>()=>oe().workspace.setAreaRatio(me,null),[]),i?s?t.jsx(s,{}):null:r==="action"?t.jsx(tt,{}):r==="nla"?t.jsx(nt,{}):t.jsx(ot,{})}function ot(){u.useSyncExternalStore(re,z,z),u.useSyncExternalStore(Z,I,I),u.useSyncExternalStore(K,N,N);const e=u.useRef(null),i=u.useRef(-1),{transform:r,size:n,refusal:s,onlySelected:a}=A(),o=g.state();u.useEffect(()=>{const l=e.current;if(!l)return;const d=new ResizeObserver(()=>{const f={w:l.clientWidth,h:l.clientHeight},v=A().size;(v.w!==f.w||v.h!==f.h)&&R({size:f})});return d.observe(l),R({size:{w:l.clientWidth,h:l.clientHeight}}),()=>d.disconnect()},[]);const x=Le();u.useEffect(()=>{if(x===i.current)return;i.current=x;const{w:l}=A().size;if(l===0)return;const d=Math.max(1,o.end-o.start),f=Math.min(Fe,Math.max(Ne,l*.9/d));R({transform:{pixelsPerFrame:f,startFrame:o.start-l*.05/f},framedAt:Date.now()})},[x,o.start,o.end]);const h=u.useCallback(l=>(l-r.startFrame)*r.pixelsPerFrame,[r]),$=u.useCallback(l=>r.startFrame+l/r.pixelsPerFrame,[r]),m=u.useMemo(()=>Pe(o.summary,a),[o.summary,a]),y=u.useMemo(()=>{if(n.w===0)return null;const l=n.w/r.pixelsPerFrame,d=Math.max(`${Math.round(r.startFrame)}`.length,`${Math.round(r.startFrame+l)}`.length),f=Math.max(le,d*6+We),v=Ke(Math.round(o.fps),n.w+1,l,f),S=Ge(v),Oe=Math.ceil(r.startFrame/v)*v,se=[];for(let C=Oe;C<=r.startFrame+l;C+=v)se.push(C);const ae=[];if(S!==null&&S*r.pixelsPerFrame>=le/5){const C=Math.ceil(r.startFrame/S)*S;for(let D=C;D<=r.startFrame+l;D+=S)Math.abs(D/v-Math.round(D/v))>1e-6&&ae.push(D)}return{major:v,minor:S,majors:se,minors:ae}},[n.w,r,o.fps]),j=w,F=Be+E/2;u.useEffect(()=>{if(!y)return;const l=[...o.warnings];o.action||l.push("Nothing in this file carries an action, so the summary row is empty — which is Blender's own empty state for a Timeline over a still file."),l.push("Playback samples exported object, camera, material and shape-key tracks. Modifiers and geometry drivers that require per-frame Blender evaluation are not re-evaluated by the preview."),l.push("The View menu owns Only Show Selected; its filter applies to the summary row, while sampled playback tracks remain unchanged."),a&&m.objects.length===0&&o.summary.length>0&&l.push(`The summary row is empty because nothing animated is SELECTED, which is Blender's own answer with this filter on. ${o.summary.map(f=>f.object).join(", ")} carr${o.summary.length===1?"ies":"y"} an action; select it, or turn the filter off.`),l.push("Movie markers are carried in the scene data; this view does not draw markers, the cache bar or preview range.");const d={drawn:{action:o.action,object:o.object,armature:o.armature,frame:o.frame,start:o.start,end:o.end,fps:o.fps,playing:ne(),keyframes:m.columns.map(f=>f.frame),onlySelected:a,summaryObjects:m.objects,majorStep:y.major,minorStep:y.minor,majorLines:y.majors.length,minorLines:y.minors.length,labels:y.majors.length,diamonds:m.columns.length,diamondRadius:ee,diamondSprite:Ye,bones:o.bones,tracks:o.tracks,engineCalls:o.engineCalls,warnings:l}};JSON.stringify(d.drawn)!==JSON.stringify(A().drawn)&&R(d)},[y,o,m,a]);const H=u.useRef(!1),L=u.useCallback(l=>{const d=e.current;if(!d)return;const f=d.getBoundingClientRect();k()?.seekFrame(Math.round($(l-f.left)))},[$]),P=`${Math.round(o.frame)}`,G=Math.max(b.minPillWidth,P.length*6+2*b.textPadding),O=h(o.frame);return t.jsxs("div",{"data-testid":"blender-timeline",style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",overflow:"hidden",background:p.back,color:c.text,font:"11px Inter, system-ui, sans-serif"},children:[t.jsx(ct,{}),t.jsx("div",{ref:e,style:{flex:1,minHeight:0,position:"relative"},children:t.jsxs("svg",{width:n.w,height:n.h,style:{display:"block",cursor:"ew-resize"},"aria-label":"Timeline",onPointerDown:l=>{H.current=!0,l.currentTarget.setPointerCapture(l.pointerId),L(l.clientX)},onPointerMove:l=>{H.current&&L(l.clientX)},onPointerUp:l=>{H.current=!1,l.currentTarget.releasePointerCapture(l.pointerId)},children:[t.jsx("title",{children:"Timeline"}),t.jsx("rect",{x:0,y:0,width:n.w,height:n.h,fill:p.back}),t.jsx("rect",{x:0,y:j,width:Math.max(0,h(o.start)),height:Math.max(0,n.h-j),fill:ce}),t.jsx("rect",{x:h(o.end),y:j,width:Math.max(0,n.w-h(o.end)),height:Math.max(0,n.h-j),fill:ce}),y?.minors.map(l=>t.jsx("line",{x1:h(l),y1:j,x2:h(l),y2:n.h,stroke:p.gridMinor,strokeWidth:1},`n${l}`)),y?.majors.map(l=>t.jsx("line",{x1:h(l),y1:j,x2:h(l),y2:n.h,stroke:p.grid,strokeWidth:1},`m${l}`)),t.jsx("rect",{x:0,y:0,width:n.w,height:w,fill:p.scrubBack}),y?.majors.map(l=>t.jsx("text",{x:h(l),y:15.5,textAnchor:"middle",fill:p.scrubText,fontSize:11,children:Math.round(l)},`t${l}`)),t.jsx("path",{d:`M3,${F-3.5} L6.5,${F} L3,${F+3.5} Z`,fill:p.scrubText}),m.columns.map(l=>{const d=Ve[l.type]??1,f=ee*d,v=Q[l.type]??Q.KEYFRAME,S=h(l.frame);return t.jsx("polygon",{points:`${S},${F-f} ${S+f},${F} ${S},${F+f} ${S-f},${F}`,fill:l.select?v.selected:v.fill,stroke:p.keyBorder,strokeWidth:ve*d},`k${l.frame}`)}),t.jsx("rect",{x:O-b.stalkWidth/2,y:w,width:b.stalkWidth,height:Math.max(0,n.h-w),fill:p.playhead}),t.jsx("rect",{x:O-G/2,y:b.margin,width:G,height:w-2*b.margin,rx:b.radius,fill:p.playhead}),t.jsx("polygon",{points:`${O-b.tipHalfWidth},${w-b.margin} ${O+b.tipHalfWidth},${w-b.margin} ${O},${w-b.margin+b.tipHeight}`,fill:p.playhead}),t.jsx("text",{x:O,y:15.5,textAnchor:"middle",fill:p.playheadText,fontSize:11,children:P})]})}),s?t.jsx("div",{style:{borderTop:`1px solid ${c.rule}`,padding:c.statusPadding,color:c.refusal},children:s}):null]})}function lt(){u.useSyncExternalStore(K,N,N);const{onlySelected:e}=A(),[i,r]=u.useState(!1),n=(s,a,o)=>t.jsxs("button",{type:"button",onClick:()=>{o(),r(!1)},style:{display:"flex",alignItems:"center",gap:"var(--volter-space-2)",width:"100%",padding:"var(--volter-space-1) var(--volter-space-3)",border:"none",background:"transparent",color:c.widgetText,font:"inherit",textAlign:"left",cursor:"pointer"},children:[t.jsx("span",{style:{width:12,display:"inline-block"},children:a===null?"":a?"✓":""}),s]});return t.jsxs("span",{style:{position:"relative"},children:[t.jsx("button",{type:"button","aria-haspopup":"menu","aria-expanded":i,onClick:()=>r(s=>!s),style:{border:"none",background:"transparent",color:c.text,font:"inherit",padding:"0 var(--volter-space-2)",cursor:"pointer"},children:"View"}),i?t.jsxs("span",{role:"menu",style:{position:"absolute",top:"100%",left:0,zIndex:20,minWidth:210,display:"flex",flexDirection:"column",background:c.widget,border:`1px solid ${c.widgetOutline}`,boxShadow:"0 6px 18px rgba(0,0,0,0.45)"},children:[n("Only Show Selected",e,()=>ze(!e)),n("Frame All",null,()=>be())]}):null]})}function ct(){u.useSyncExternalStore(Z,I,I),u.useSyncExternalStore(K,N,N);const e=g.state(),i=c.unit,r=g.playable,n=(a,o,x,h)=>t.jsx("button",{type:"button",title:r?h:`${h} — ${U}`,"aria-label":h,disabled:!r,onClick:x,style:{width:i,height:i,padding:0,border:`1px solid ${c.widgetOutline}`,background:c.widget,color:c.widgetText,display:"grid",placeItems:"center",cursor:r?"pointer":"not-allowed",opacity:r?1:.4},children:o},a),s=a=>t.jsx("svg",{width:12,height:12,viewBox:"0 0 12 12","aria-hidden":"true",children:t.jsx("path",{d:a,fill:c.widgetText})});return t.jsxs("div",{style:{height:X,flex:`0 0 ${X}px`,display:"flex",alignItems:"center",gap:c.headerGap,padding:c.headerPadding,background:p.header,borderBottom:`1px solid ${c.rule}`},children:[t.jsx(ke,{title:"Timeline"}),t.jsx(Ee,{}),t.jsx(lt,{}),t.jsx("div",{style:{flex:1}}),t.jsxs("div",{style:{display:"flex"},children:[n("jump-start",s("M2 2h1.5v8H2zM10 2v8L4.5 6z"),()=>k()?.seekFrame(e.start),"Jump to Start"),n("prev-key",s("M5 2.5v7L1.5 6zM8.5 3.2L11 6L8.5 8.8L6 6z"),()=>{const a=q().reverse().find(o=>o<g.frame()-1e-4);a!==void 0&&k()?.seekFrame(a)},"Jump to Previous Keyframe"),r&&ne()?n("pause-rev",s("M3 2h2v8H3zM7 2h2v8H7z"),()=>k()?.pause(),"Pause"):n("play-reverse",s("M9 2L2 6l7 4z"),()=>k()?.play("reverse"),"Play Reverse"),r&&ne()?n("pause",s("M3 2h2v8H3zM7 2h2v8H7z"),()=>k()?.pause(),"Pause"):n("play",s("M3 2l7 4-7 4z"),()=>k()?.play(),"Play"),n("next-key",s("M7 2.5v7L10.5 6zM3.5 3.2L6 6L3.5 8.8L1 6z"),()=>{const a=q().find(o=>o>g.frame()+1e-4);a!==void 0&&k()?.seekFrame(a)},"Jump to Next Keyframe"),n("jump-end",s("M10 2H8.5v8H10zM2 2v8L7.5 6z"),()=>k()?.seekFrame(e.end),"Jump to End")]}),t.jsxs("div",{style:{display:"flex"},children:[n("step-back",s("M2 2h1.5v8H2zM9.5 2v8L4.5 6z"),()=>k()?.seekFrame(Math.round(e.frame)-1),"Step Back One Frame"),n("step-forward",s("M10 2H8.5v8H10zM2.5 2v8L7.5 6z"),()=>k()?.seekFrame(Math.round(e.frame)+1),"Step Forward One Frame")]}),t.jsx("div",{style:{flex:1}}),t.jsx("input",{type:"number",value:Math.round(e.frame),onChange:a=>{const o=Number(a.target.value);Number.isFinite(o)&&k()?.seekFrame(o)},"aria-label":"Current frame",disabled:!r,title:r?void 0:U,style:{width:75,height:i,textAlign:"center",border:`1px solid ${c.widgetOutline}`,borderRadius:c.widgetRadius,background:c.widget,color:c.widgetText,font:"inherit",cursor:r?"text":"not-allowed",opacity:r?1:.4}}),t.jsxs("span",{onClick:()=>we(te["set-range"]),onKeyDown:()=>{},style:{color:c.text,cursor:"not-allowed"},children:["Start ",e.start," · End ",e.end]})]})}const ht=Object.freeze(Object.defineProperty({__proto__:null,TIMELINE_VIEW_VERBS:st,default:at,point:rt,title:it},Symbol.toStringTag,{value:"Module"}));export{X as H,ke as P,st as T,p as a,c as b,Ze as c,ht as d,Ue as s};
@@ -1 +0,0 @@
1
- import{r as a,j as l}from"./volter-sdk-D8o6TU4A.js";import{b as N}from"./blender-base64-Cxqc4R5f.js";import{C as le,D as X,T as ue}from"./blender-outliner-model-BqLWEXta.js";import"./output-pass-Bw2FZb8e.js";import"./three.module-JoAAxMWl.js";import"./volter-shared-three-core-DEsIwtOu.js";import"./linear-resolve-B-MA5O31.js";const de={transform:{cx:.5,cy:.5,zoom:512},refusal:null,size:{w:0,h:0},framedAt:0,drawn:null};let L=de,k=0;const j=new Set;let te=0;function p(){return L}function Q(){return k}function fe(t){return j.add(t),()=>{j.delete(t)}}function g(t){L={...L,...t},k+=1;for(const r of[...j])r()}function he(){te+=1,k+=1;for(const t of[...j])t()}function pe(){return te}function ne(t){g({refusal:t})}const y={back:"#303030",grid:"#303030",face:"#ffffff",faceAlpha:10/255,uvShadow:"#707070",vertex:"#000000",faceDot:"#000000"},W={vertexSize:3,edgeWidth:1,facedotSize:3},se=1,me=(W.vertexSize*se+1.5)*Math.SQRT2,ge=.75,ve=W.facedotSize*se,we=1,J=[1,1],K=[10,10],ye="Blender's space_image grid and this view's surface are both #303030, so the tile grid is invisible against it.",xe={shadow:{inner:y.uvShadow}},be=Math.max(W.edgeWidth,1),ee="#ff0000";function Ue(t){const r=N(t);return new Float32Array(r.buffer,r.byteOffset,r.byteLength>>2)}function B(t){const r=N(t);return new Uint32Array(r.buffer,r.byteOffset,r.byteLength>>2)}function Ve(t,r){const u=Number.parseInt(t.slice(1),16);return`rgba(${u>>16&255}, ${u>>8&255}, ${u&255}, ${Math.round(r*1e3)/1e3})`}const E={text:"#e6e6e6",refusal:"#ed5700",rule:"#232323",statusPadding:"3px 8px",statusGap:12},je="workspace.document",Me="UV Editor",R=8e3,re=16,oe=8192,_={move:t=>`Dragging a UV in "${t}" writes the mesh's UV attribute, which the document would save. This is Blender's UV editor as an INSPECTION surface: editing parity is not the program.`,select:"Selecting a UV writes the mesh's selection state. This view draws what the DATA carries — and at this pin a mesh outside edit mode carries no UV selection at all (MeshUVLoopLayer declares uv, pin, name, active, active_render, active_clone and nothing else), so everything draws unselected. Editing parity is not the program.",pin:"Pinning a UV writes `MeshUVLoopLayer.pin`, which the document would save. Existing pins ARE drawn, in Blender's own hard red. Editing parity is not the program.",unwrap:"Unwrapping runs `bpy.ops.uv.unwrap`, which rewrites every UV on the mesh. Editing parity is not the program."},Ae=[{id:"state",run:()=>p()},{id:"view-all",run:()=>(he(),p())},{id:"zoom",run:t=>{const r=Number(t?.to??t?.zoom);if(!Number.isFinite(r))throw new Error("zoom needs a numeric `to` — CSS pixels per UV unit, 16 … 8192.");const{transform:u}=p();return g({transform:{...u,zoom:Math.min(oe,Math.max(re,r))}}),p()}},{id:"pan",run:t=>{const r=Number(t?.u??0),u=Number(t?.v??0);if(!Number.isFinite(r)||!Number.isFinite(u))throw new Error("pan needs numeric `u` and `v`, in UV units.");const{transform:x}=p();return g({transform:{...x,cx:x.cx+r,cy:x.cy+u}}),p()}},{id:"move-uv",run:()=>T(_.move("the active UV map"))},{id:"select",run:()=>T(_.select)},{id:"pin",run:()=>T(_.pin)},{id:"unwrap",run:()=>T(_.unwrap)}];function T(t){return ne(t),p()}function Ee(t){return!t?.uvBase64||!t.triangleBase64?null:{uv:Ue(t.uvBase64),tris:B(t.triangleBase64),starts:B(t.loopStartBase64??""),totals:B(t.loopTotalBase64??""),pins:t.pinBase64?N(t.pinBase64):null}}function Oe(){const t=a.useSyncExternalStore(le,X,X);a.useSyncExternalStore(fe,Q,Q);const r=a.useRef(0),u=a.useRef(null),x=a.useRef(null),M=a.useRef(null),{transform:b,refusal:C,size:U}=p(),[,F]=[0,a.useCallback(()=>g({}),[])];a.useEffect(()=>{let e=!0;return(async()=>{try{const s=await ue();if(!e)return;x.current=s,M.current=null}catch(s){if(!e)return;M.current=s instanceof Error?s.message:String(s)}F()})(),()=>{e=!1}},[t,F]),a.useEffect(()=>{const e=u.current;if(!e)return;const s=new ResizeObserver(()=>{const c={w:e.clientWidth,h:e.clientHeight},d=p().size;(d.w!==c.w||d.h!==c.h)&&g({size:c})});return s.observe(e),g({size:{w:e.clientWidth,h:e.clientHeight}}),()=>s.disconnect()},[]);const n=x.current,A=a.useMemo(()=>Ee(n),[n]),O=pe();a.useEffect(()=>{if(O===r.current)return;r.current=O;const e=n?.bounds??[0,0,1,1],{w:s,h:c}=p().size;if(s===0||c===0)return;const[d,m,o,f]=e,V=Math.max(o-d,.001),S=Math.max(f-m,.001),z=Math.min(oe,Math.max(re,Math.min(s/V,c/S)*.9));g({transform:{cx:(d+o)/2,cy:(m+f)/2,zoom:z},framedAt:Date.now()})},[O,n]);const v=e=>(e-b.cx)*b.zoom+U.w/2,w=e=>U.h/2-(e-b.cy)*b.zoom,i=a.useMemo(()=>{if(!n||!A)return null;const{uv:e,tris:s,starts:c,totals:d,pins:m}=A,o=[],f=[],V=[],S=[],z=c.length;for(let h=0;h<z;h++){const ce=c[h],I=d[h];if(I<3)continue;let $="",H=0,G=0;for(let D=0;D<I;D++){const Z=ce+D,q=e[Z*2],Y=e[Z*2+1];H+=q,G+=Y,$+=`${D===0?"M":"L"}${v(q).toFixed(2)} ${w(Y).toFixed(2)}`}$+="Z",o.push($),f.push($),S.push({x:v(H/I),y:w(G/I)})}const P=e.length>>1;for(let h=0;h<P&&V.length<R;h++)V.push({x:v(e[h*2]),y:w(e[h*2+1]),pinned:m?m[h]!==0:!1});return{faces:o,outlines:f,dots:V,faceDots:S,corners:P,triangles:s.length/3}},[n,A,b,U]);a.useEffect(()=>{if(!n)return;const e=[];n.layers.length===0&&n.object&&e.push(`"${n.object}" has no UV map — Blender's UV editor draws an empty tile.`),i&&i.corners>R&&e.push(`${i.corners} UV corners exceed this view's ${R}-dot budget; ${i.corners-R} corner marks are not drawn. The islands, their edges and the face dots are all drawn.`),n.image||e.push("No image behind the tile: the active material's node tree has no image texture with an image, so there is nothing for Blender's backdrop to show."),e.push(ye),e.push("The line style is SHADOW (#707070), not Blender's stock OUTLINE: `edit_uv_line_style_from_space_image` returns OUTLINE only when `SpaceImage.mode == SI_MODE_UV`, and there is no SpaceImage here."),g({drawn:{object:n.object,mesh:n.mesh,layer:n.active,layers:n.layers,mode:n.mode,loops:n.loops,polygons:n.polygons,triangles:i?.triangles??0,faces:i?.faces.length??0,edges:i?.outlines.length??0,verts:i?.dots.length??0,faceDots:i?.faceDots.length??0,pinned:i?.dots.filter(s=>s.pinned).length??0,bounds:n.bounds??null,tiles:J,subdiv:K,image:n.image?.name??null,warnings:e}})},[n,i]);const ie=a.useMemo(()=>{const e=[],[s,c]=J,[d,m]=K;for(let o=0;o<=s*d;o++){const f=o/d;e.push({key:`u${o}`,x1:v(f),y1:w(0),x2:v(f),y2:w(c),major:o%d===0})}for(let o=0;o<=c*m;o++){const f=o/m;e.push({key:`v${o}`,x1:v(0),y1:w(f),x2:v(s),y2:w(f),major:o%m===0})}return e},[b,U]),ae=n?n.active?`UV Editor · ${n.object} · ${n.active} · ${n.polygons} faces, ${n.loops} corners · ${n.mode}`:`UV Editor · ${n.object??"no mesh selected"} · no UV map · ${n.mode}`:M.current??"UV Editor · reading…";return l.jsxs("div",{"data-testid":"blender-uv-editor",style:{display:"flex",flexDirection:"column",position:"absolute",inset:0,overflow:"hidden",background:y.back,color:E.text,font:"11px Inter, system-ui, sans-serif"},children:[l.jsx("div",{ref:u,style:{flex:1,minHeight:0,position:"relative"},children:l.jsxs("svg",{width:U.w,height:U.h,style:{display:"block"},onPointerDown:()=>ne(_.select),"aria-label":"UV layout",children:[l.jsx("title",{children:"UV layout"}),ie.map(e=>l.jsx("line",{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,stroke:y.grid,strokeWidth:e.major?2:1},e.key)),i?.faces.map((e,s)=>l.jsx("path",{d:e,fill:Ve(y.face,y.faceAlpha*we)},`f${s}`)),i?.outlines.map((e,s)=>l.jsx("path",{d:e,fill:"none",stroke:xe.shadow.inner,strokeWidth:be},`e${s}`)),i?.faceDots.map((e,s)=>l.jsx("circle",{cx:e.x,cy:e.y,r:ve/2,fill:y.faceDot},`fd${s}`)),i?.dots.map((e,s)=>l.jsx("circle",{cx:e.x,cy:e.y,r:me/2,fill:e.pinned?ee:y.vertex,stroke:e.pinned?ee:"none",strokeWidth:e.pinned?ge:0},`v${s}`))]})}),l.jsxs("div",{style:{borderTop:`1px solid ${E.rule}`,padding:E.statusPadding,display:"flex",gap:E.statusGap,alignItems:"center"},children:[l.jsx("span",{children:ae}),C?l.jsx("span",{style:{color:E.refusal},children:C}):null]})]})}export{Ae as UV_VIEW_VERBS,Oe as default,je as point,Me as title};
@@ -1,2 +0,0 @@
1
- import{gU as u,r as s,jd as g,j as n}from"./volter-sdk-D8o6TU4A.js";const m="workspace.status",v="Version",p="right",f=998;function b(){const{project:i}=u(),r=s.useSyncExternalStore(i.subscribe,i.engineVersion,i.engineVersion),[e,l]=s.useState(null);if(s.useEffect(()=>{let a=!0;return g().then(d=>{a&&l(d)}),()=>{a=!1}},[]),r===null)return null;const t=e?.commit??null,o=t===null?null:`build ${t}${e?.dirty===!0?"*":""}`,c=t===null?"":`
2
- This editor runs from a checkout, as it was when the editor started: ${e?.branch??"a detached HEAD"} at ${t}${e?.dirty===!0?", with uncommitted changes":""}${typeof e?.behindOriginMain=="number"?`, ${String(e.behindOriginMain)} commit(s) behind the last-fetched origin/main`:""}`;return n.jsxs("span",{className:"volter-status-copy","data-testid":"status-blender-version","data-engine-version":r,style:{display:"inline-flex",alignItems:"center",gap:"var(--volter-space-2)",fontSize:"var(--volter-font-md)"},"data-engine-commit":t??void 0,title:`This project is built against engine ${r}${c}`,children:[n.jsx("span",{"aria-hidden":"true",style:{width:"var(--volter-stroke-resting)",height:"var(--volter-icon-md)",background:"currentColor"}}),r,o!==null&&n.jsxs(n.Fragment,{children:[n.jsx("span",{"aria-hidden":"true",style:{width:"var(--volter-stroke-resting)",height:"var(--volter-icon-md)",background:"currentColor"}}),o]})]})}export{p as align,b as default,f as order,m as point,v as title};
@@ -1,2 +0,0 @@
1
- import{a as h,S as A,P as D,b as _,s as N,A as T,c as W,o as z}from"./worker-DeeaIXW_.js";import{s as C,a as H,g as U}from"./session-addons-KcG0o7Xc.js";const f="/bw",M=`${A}/frame.bin`,L=new Set(["scripts/startup/vgai_three.py","scripts/startup/volter_three.py"]);function R(e,t,l){e.existsSync(t)&&e.unlinkSync(t),e.writeFileSync(t,l)}async function x(e){const t=h(`wali/${e}`);try{return await import(t)}catch(l){throw new Error(`The substrate skew needs ${e}, which this editor serves from the WALI pack directory beside blender.wasm (${t}): ${l instanceof Error?l.message:String(l)}`)}}async function j(e,t){const l=performance.now(),r=await fetch(h("runtime.idx"));if(!r.ok)throw new Error(`${T}/runtime.idx answered ${r.status}`);const n=await r.json(),a=await fetch(h("runtime.bin"));if(!a.ok)throw new Error(`${T}/runtime.bin answered ${a.status}`);const d=new Uint8Array(await a.arrayBuffer());let c=0;for(const s of n.files){if(c+s.size>d.byteLength)throw new Error(`Blender runtime ${s.path}: bytes ${c}..${c+s.size} lie outside the ${d.byteLength}-byte runtime blob`);if(L.has(s.path)){c+=s.size;continue}const o=`${f}/${s.path}`;e.mkdirSync(o.slice(0,o.lastIndexOf("/")),{recursive:!0}),R(e,o,d.subarray(c,c+s.size)),c+=s.size}if(c!==d.byteLength)throw new Error(`Blender runtime index accounts for ${c} of the ${d.byteLength} bytes served`);const y=Math.round(performance.now()-l);return t("log",`blender: staged Blender's ${n.files.length}-file runtime tree in ${y} ms`),{files:n.files.length,bytes:d.byteLength,ms:y}}async function Y(e,t){const l=performance.now(),r=await fetch(h("runtime.idx"));if(!r.ok)throw new Error(`${T}/runtime.idx answered ${r.status}`);const n=await r.json(),a=n.files.reduce((u,i)=>u+i.size,0),d=await fetch(h("runtime.bin"));if(!d.ok||!d.body)throw new Error(`${T}/runtime.bin answered ${d.status}`);const c=new SharedArrayBuffer(a),y=new Uint8Array(c);let s=0;const o=d.body.getReader();for(;;){const{done:u,value:i}=await o.read();if(u)break;if(s+i.byteLength>a)throw new Error(`Blender runtime blob is longer than the ${a} bytes its index accounts for`);y.set(i,s),s+=i.byteLength}if(s!==a)throw new Error(`Blender runtime index accounts for ${a} bytes; the blob served ${s}`);const b=e(f,n.files,c,{mtimeMs:Date.now(),include:u=>!L.has(u)});return t("log",`blender: shared Blender's ${n.files.length}-file runtime tree in ${Math.round(performance.now()-l)} ms`),b}async function V(e,t,l){const r=performance.now(),n=await fetch(h("runtime.idx"));if(!n.ok)throw new Error(`${T}/runtime.idx answered ${n.status}`);const a=await n.text(),d=JSON.parse(a),y=[...new Uint8Array(await crypto.subtle.digest("SHA-256",new TextEncoder().encode(a))).slice(0,12)].map(i=>i.toString(16).padStart(2,"0")).join(""),s=`${I}${y}`;if(t)try{await t(s)}catch(i){l("log",`blender: the runtime tree stays in memory: it cannot be held in use (${i instanceof Error?i.message:String(i)})`);return}let o;try{o=new Worker(h("wali/browser-wali/tree-store-worker.js"),{type:"module"})}catch(i){l("log",`blender: the runtime tree stays in memory: no installer worker (${i instanceof Error?i.message:String(i)})`);return}const b=await new Promise(i=>{let S=!1;const g=m=>{S||(S=!0,i(m))};let $=setTimeout(()=>g({ok:!1,error:`no progress in ${k/1e3} s`}),k);o.onmessage=m=>{if(clearTimeout($),typeof m.data?.progress=="number"){S||($=setTimeout(()=>g({ok:!1,error:`no progress in ${k/1e3} s`}),k));return}o.terminate(),g(m.data)},o.onerror=m=>{clearTimeout($),o.terminate(),g({ok:!1,error:m.message||"the installer worker failed to start"})},o.postMessage({projectId:s,family:I,root:f,files:d.files,blobUrl:new URL(h("runtime.bin"),location.href).href,mtimeMs:Date.now()})});if(!b.ok){l("log",`blender: the runtime tree stays in memory: it could not be installed (${b.error})`);return}const u=e(f,d.files,s,{mtimeMs:Date.now(),include:i=>!L.has(i)});return l("log",`blender: Blender's ${d.files.length}-file runtime tree is on disk (${b.installed?`installed, ${Math.round((b.bytes??0)/1e6)} MB`:"installed before"}) in ${Math.round(performance.now()-r)} ms`),u}const I="host-tree.blender-runtime-",k=2e4;function G(e){const t=new Set,l=()=>{for(const r of[...t])r()};return e.on?.("change",l),e.on?.("delete",l),{...e.on?{changed:r=>new Promise(n=>{const a=()=>{clearTimeout(d),t.delete(a),n()},d=setTimeout(a,r);t.add(a)})}:{},readFile:r=>e.readFile(r),writeFile:(r,n)=>(R(e,r,n),Promise.resolve()),mkdirTree:async r=>e.mkdirSync(r,{recursive:!0}),readdir:async r=>e.readdirSync(r),stat:async r=>{if(!e.existsSync(r))return null;const n=e.statSync(r);return{size:n.size,mode:n.mode&4095|(n.isDirectory()?16384:32768),mtimeMs:n.mtimeMs}},unlink:async r=>e.unlinkSync(r)}}async function K(e,t){const l=performance.now(),[r,n,a,d]=await Promise.all([x("browser-wali/worker-program.js"),x("browser-runtime/browser-memory-filesystem.js"),x("browser-wali/shared-file-layer.js").catch(()=>({})),C()]),c=r.BrowserWaliWorkerProgram,y=n.BrowserMemoryFileSystem;if(!c||!y)throw new Error("The substrate modules this editor served do not export BrowserWaliWorkerProgram and BrowserMemoryFileSystem; the WALI pack directory holds a browser-substrate this engine does not know.");const s=r.preloadWaliModule;s&&t.integrity&&s(h("blender.wasm"),t.integrity).catch(()=>{});const o=new y;for(const w of["/tmp","/root","/work",A,...D,e.project])o.mkdirSync(w,{recursive:!0});const b=a.sharedFileLayerFromIndex,u=a.storeFileLayerFromIndex,i=a.holdTreeStore,S=(u?await V(u,i,e.log):void 0)??(b?await Y(b,e.log):void 0);S||await j(o,e.log),R(o,_,H),R(o,`${A}/gltf_export.py`,U);for(const{path:w,bytes:p}of d)o.mkdirSync(w.slice(0,w.lastIndexOf("/")),{recursive:!0}),R(o,w,p);const g=t.workers??{pool:16,blender:4},$=new c(o,{url:h("blender.wasm"),...t.integrity?{integrity:t.integrity}:{},cwd:"/work",env:{HOME:"/root",TMPDIR:"/tmp",PATH:"/usr/bin:/bin",BLENDER_SYSTEM_RESOURCES:f,BLENDER_SYSTEM_SCRIPTS:`${f}/scripts`,BLENDER_SYSTEM_DATAFILES:`${f}/datafiles`,BLENDER_SYSTEM_PYTHON:`${f}/python`,PYTHONPATH:`${f}/python/lib/numpy313.zip:${f}/python/lib/wheels313.zip`,VOLTER_SESSION_ROOT:A,VOLTER_EXPORT_BUFFER_PATH:M,OPENIMAGEIO_THREADS:"1"},...S?{layers:[S]}:{},privateRoots:["/tmp"],threadPoolSize:g.pool,network:{allowedHosts:[],maxConnections:0,maxBytes:0}});let m=null,E=null;const O=w=>{for(const p of w.split(`
2
- `))p!==""&&(p.startsWith("@@VOLTER-READY ")&&(m=p.slice(15)),e.log(W(p),p))};for($.run(["/blender","-b","--factory-startup","-noaudio","--python-use-system-env","-t",String(g.blender),"--python",_],{onStdout:O,onStderr:O,onDiagnostic:w=>e.log("error",`@@VOLTER-ERROR ${w}`)}).then(w=>{E=`Blender exited ${w.exitCode}`},w=>{E=w instanceof Error?w.message:String(w)}).finally(()=>{E!==null&&e.log("error",`@@VOLTER-ERROR the Blender program ended: ${E}`)});m===null;){if(E!==null)throw new Error(`Blender never reached its session: ${E}`);await N(5)}const P=performance.now()-l,v=JSON.parse(m);e.log("log",`blender: the substrate skew is up (${g.blender} Blender threads in a pool of ${g.pool}; Blender is SERIAL without -t N and says so)`);const B=G(o),{request:F}=z(B,e,()=>E);return{skew:"wali",banner:v,files:B,request:F,readArena:()=>o.readFile(M),bootMs:P,memoryBytes:()=>null,releasedPayloadBytes:null}}export{K as startWaliBlenderEngine};
@@ -1 +0,0 @@
1
- const t="/assets/city-EkhAOo5s.exr",e="/assets/courtyard-DqlebbpC.exr",r="/assets/forest-P_CQY3b_.exr",s="/assets/interior-Bo_lba15.exr",i="/assets/night-CvV4Gybt.exr",o="/assets/studio-CysTBGIb.exr",n="/assets/sunrise-Dj0psFrf.exr",l="/assets/sunset-Bw3x2Bot.exr",d="workspace.environment",u={id:"blender-studiolights-world",source:"Blender's world studio lights, CC0 (Poly Haven); studiolights/world/license.txt",images:[{id:"blender:forest",title:"Forest",url:r,format:"exr"},{id:"blender:city",title:"City",url:t,format:"exr"},{id:"blender:courtyard",title:"Courtyard",url:e,format:"exr"},{id:"blender:interior",title:"Interior",url:s,format:"exr"},{id:"blender:night",title:"Night",url:i,format:"exr"},{id:"blender:studio",title:"Studio",url:o,format:"exr"},{id:"blender:sunrise",title:"Sunrise",url:n,format:"exr"},{id:"blender:sunset",title:"Sunset",url:l,format:"exr"}]};export{u as environment,d as point};
@@ -1 +0,0 @@
1
- const e="workspace.keymap",t={id:"blender",title:"Blender",description:"Blender bindings: W select, G/R/S gizmo modes, X delete, Shift+D duplicate, A select all, Alt+A deselect, . frames.",navigation:{orbit:"middle",turntable:{degreesPerPixel:.4},autoPerspective:!0,zoom:{step:1.2,drag:"dolly"}}};export{t as keymap,e as point};
@@ -1,3 +0,0 @@
1
- import{gU as U,je as Ae,jf as be,jg as W}from"./volter-sdk-D8o6TU4A.js";import{U as Ee,n as Z,E as Ie,F as Re,V as Se,W as he,X as Ne,Y as _e,Z as ve,_ as Le,$ as Ce,a0 as Ue}from"./blender-outliner-model-BqLWEXta.js";import{i as Fe,j as Oe,k as Q,e as pe,d as ke,p as ze,l as De,f as Pe,o as Be,r as Ge}from"./play-mode-BGq1Hn-c.js";import{T as He,a as Ve,b as $e,H as Ke,s as We,P as Ye,c as qe}from"./blender-timeline.document-8jLaNF31.js";import{UV_VIEW_VERBS as Xe}from"./blender-uv-editor.document-BVcA7mi2.js";import"./three.module-JoAAxMWl.js";import{Color as je,Matrix4 as de,Vector3 as V,Quaternion as Je,BufferAttribute as O,REVISION as Ze,CompressedTexture as H,TextureSource as ne,NoColorSpace as Qe,MathUtils as ee,RGBAFormat as et,ImageUtils as tt,DoubleSide as st,PropertyBinding as $,InterpolateDiscrete as nt,Scene as ie,SRGBColorSpace as it,NearestFilter as rt,NearestMipmapNearestFilter as ot,NearestMipmapLinearFilter as at,LinearFilter as ct,LinearMipmapNearestFilter as lt,LinearMipmapLinearFilter as ut,ClampToEdgeWrapping as ft,RepeatWrapping as ht,MirroredRepeatWrapping as pt,InterpolateLinear as dt,VectorKeyframeTrack as re,QuaternionKeyframeTrack as mt,AnimationClip as oe,AnimationMixer as gt}from"./volter-shared-three-core-DEsIwtOu.js";import"./blender-base64-Cxqc4R5f.js";import"./output-pass-Bw2FZb8e.js";import"./linear-resolve-B-MA5O31.js";const I=o=>Ee(o),yt={"blender-draw-batching":I,"blender-start":I,"blender-stop":I,"blender-execute":I,"blender-native-preview":I,"blender-scene-info":I,"blender-object-info":I,"blender-screenshot-view":I,"blender-read-file":I,"blender-write-file":I,"blender-list-files":I,"blender-rna":I,"blender-rna-context":I,"blender-rna-set":I,"blender-outliner":I,"blender-node-tree":I,"blender-uv-layout":I,"blender-action-clip":I,"blender-node-view":I,"blender-outliner-set":I,"blender-render-movie":I,"blender-render-status":I,"blender-status":I},ae={POSITION:["byte","byte normalized","unsigned byte","unsigned byte normalized","short","short normalized","unsigned short","unsigned short normalized"],NORMAL:["byte normalized","short normalized"],TANGENT:["byte normalized","short normalized"],TEXCOORD:["byte","byte normalized","unsigned byte","short","short normalized","unsigned short"]};class G{constructor(){this.textureUtils=null,this.pluginCallbacks=[],this.register(function(e){return new Nt(e)}),this.register(function(e){return new _t(e)}),this.register(function(e){return new Ut(e)}),this.register(function(e){return new Ft(e)}),this.register(function(e){return new Ot(e)}),this.register(function(e){return new kt(e)}),this.register(function(e){return new vt(e)}),this.register(function(e){return new Lt(e)}),this.register(function(e){return new Ct(e)}),this.register(function(e){return new zt(e)}),this.register(function(e){return new Dt(e)}),this.register(function(e){return new Pt(e)}),this.register(function(e){return new Bt(e)}),this.register(function(e){return new Gt(e)})}register(e){return this.pluginCallbacks.indexOf(e)===-1&&this.pluginCallbacks.push(e),this}unregister(e){return this.pluginCallbacks.indexOf(e)!==-1&&this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e),1),this}setTextureUtils(e){return this.textureUtils=e,this}parse(e,t,s,i){const n=new St,r=[];for(let a=0,c=this.pluginCallbacks.length;a<c;a++)r.push(this.pluginCallbacks[a](n));n.setPlugins(r),n.setTextureUtils(this.textureUtils),n.writeAsync(e,t,i).catch(s)}parseAsync(e,t){const s=this;return new Promise(function(i,n){s.parse(e,i,n,t)})}}const A={POINTS:0,LINES:1,LINE_LOOP:2,LINE_STRIP:3,TRIANGLES:4,BYTE:5120,UNSIGNED_BYTE:5121,SHORT:5122,UNSIGNED_SHORT:5123,INT:5124,UNSIGNED_INT:5125,FLOAT:5126,ARRAY_BUFFER:34962,ELEMENT_ARRAY_BUFFER:34963,NEAREST:9728,LINEAR:9729,NEAREST_MIPMAP_NEAREST:9984,LINEAR_MIPMAP_NEAREST:9985,NEAREST_MIPMAP_LINEAR:9986,LINEAR_MIPMAP_LINEAR:9987,CLAMP_TO_EDGE:33071,MIRRORED_REPEAT:33648,REPEAT:10497},Y="KHR_mesh_quantization",v={};v[rt]=A.NEAREST;v[ot]=A.NEAREST_MIPMAP_NEAREST;v[at]=A.NEAREST_MIPMAP_LINEAR;v[ct]=A.LINEAR;v[lt]=A.LINEAR_MIPMAP_NEAREST;v[ut]=A.LINEAR_MIPMAP_LINEAR;v[ft]=A.CLAMP_TO_EDGE;v[ht]=A.REPEAT;v[pt]=A.MIRRORED_REPEAT;const ce={scale:"scale",position:"translation",quaternion:"rotation",morphTargetInfluences:"weights"},xt=new je,le=12,wt=1179937895,Tt=2,ue=8,Mt=1313821514,At=5130562;function C(o,e){return o.length===e.length&&o.every(function(t,s){return t===e[s]})}function bt(o){return new TextEncoder().encode(o).buffer}function Et(o){return C(o.elements,[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])}function It(o,e,t){const s={min:new Array(o.itemSize).fill(Number.POSITIVE_INFINITY),max:new Array(o.itemSize).fill(Number.NEGATIVE_INFINITY)};for(let i=e;i<e+t;i++)for(let n=0;n<o.itemSize;n++){let r;o.itemSize>4?r=o.array[i*o.itemSize+n]:(n===0?r=o.getX(i):n===1?r=o.getY(i):n===2?r=o.getZ(i):n===3&&(r=o.getW(i)),o.normalized===!0&&(r=ee.normalize(r,o.array))),s.min[n]=Math.min(s.min[n],r),s.max[n]=Math.max(s.max[n],r)}return s}function me(o){return Math.ceil(o/4)*4}function q(o,e=0){const t=me(o.byteLength);if(t!==o.byteLength){const s=new Uint8Array(t);if(s.set(new Uint8Array(o)),e!==0)for(let i=o.byteLength;i<t;i++)s[i]=e;return s.buffer}return o}function X(){return typeof document>"u"&&typeof OffscreenCanvas<"u"?new OffscreenCanvas(1,1):document.createElement("canvas")}function Rt(o,e){if(typeof OffscreenCanvas<"u"&&o instanceof OffscreenCanvas){let t;return e==="image/jpeg"?t=.92:e==="image/webp"&&(t=.8),o.convertToBlob({type:e,quality:t})}else return new Promise(t=>o.toBlob(t,e))}class St{constructor(){this.plugins=[],this.options={},this.pending=[],this.buffers=[],this.byteOffset=0,this.buffers=[],this.nodeMap=new Map,this.skins=[],this.extensionsUsed={},this.extensionsRequired={},this.uids=new Map,this.uid=0,this.json={asset:{version:"2.0",generator:"THREE.GLTFExporter r"+Ze}},this.cache={meshes:new Map,attributes:new Map,attributesNormalized:new Map,materials:new Map,textures:new Map,images:new Map,normalMaps:new Map},this.textureUtils=null}setPlugins(e){this.plugins=e}setTextureUtils(e){this.textureUtils=e}async writeAsync(e,t,s={}){this.options=Object.assign({binary:!1,trs:!1,onlyVisible:!0,maxTextureSize:1/0,animations:[],includeCustomExtensions:!1,copyright:null},s),this.options.animations.length>0&&(this.options.trs=!0),await this.processInputAsync(e),await Promise.all(this.pending);const i=this,n=i.buffers,r=i.json;s=i.options;const a=i.extensionsUsed,c=i.extensionsRequired,f=new Blob(n,{type:"application/octet-stream"}),l=Object.keys(a),u=Object.keys(c);if(l.length>0&&(r.extensionsUsed=l),u.length>0&&(r.extensionsRequired=u),r.buffers&&r.buffers.length>0&&(r.buffers[0].byteLength=f.size),s.copyright&&(r.asset.copyright=s.copyright),s.binary===!0){const m=new FileReader;m.readAsArrayBuffer(f),m.onloadend=function(){const h=q(m.result),d=new DataView(new ArrayBuffer(ue));d.setUint32(0,h.byteLength,!0),d.setUint32(4,At,!0);const p=q(bt(JSON.stringify(r)),32),g=new DataView(new ArrayBuffer(ue));g.setUint32(0,p.byteLength,!0),g.setUint32(4,Mt,!0);const x=new ArrayBuffer(le),w=new DataView(x);w.setUint32(0,wt,!0),w.setUint32(4,Tt,!0);const b=le+g.byteLength+p.byteLength+d.byteLength+h.byteLength;w.setUint32(8,b,!0);const y=new Blob([x,g,p,d,h],{type:"application/octet-stream"}),T=new FileReader;T.readAsArrayBuffer(y),T.onloadend=function(){t(T.result)}}}else if(r.buffers&&r.buffers.length>0){const m=new FileReader;m.readAsDataURL(f),m.onloadend=function(){const h=m.result;r.buffers[0].uri=h,t(r)}}else t(r)}serializeUserData(e,t){if(Object.keys(e.userData).length===0)return;const s=this.options,i=this.extensionsUsed;try{const n=JSON.parse(JSON.stringify(e.userData));if(s.includeCustomExtensions&&n.gltfExtensions){t.extensions===void 0&&(t.extensions={});for(const r in n.gltfExtensions)t.extensions[r]=n.gltfExtensions[r],i[r]=!0;delete n.gltfExtensions}Object.keys(n).length>0&&(t.extras=n)}catch(n){console.warn("THREE.GLTFExporter: userData of '"+e.name+"' won't be serialized because of JSON.stringify error - "+n.message)}}getUID(e,t=!1){if(this.uids.has(e)===!1){const i=new Map;i.set(!0,this.uid++),i.set(!1,this.uid++),this.uids.set(e,i)}return this.uids.get(e).get(t)}isNormalizedNormalAttribute(e){if(this.cache.attributesNormalized.has(e))return!1;const s=new V;for(let i=0,n=e.count;i<n;i++)if(Math.abs(s.fromBufferAttribute(e,i).length()-1)>5e-4)return!1;return!0}createNormalizedNormalAttribute(e){const t=this.cache;if(t.attributesNormalized.has(e))return t.attributesNormalized.get(e);const s=e.clone(),i=new V;for(let n=0,r=s.count;n<r;n++)i.fromBufferAttribute(s,n),i.x===0&&i.y===0&&i.z===0?i.setX(1):i.normalize(),s.setXYZ(n,i.x,i.y,i.z);return t.attributesNormalized.set(e,s),s}applyTextureTransform(e,t){let s=!1;const i={};(t.offset.x!==0||t.offset.y!==0)&&(i.offset=t.offset.toArray(),s=!0),t.rotation!==0&&(i.rotation=t.rotation,s=!0),(t.repeat.x!==1||t.repeat.y!==1)&&(i.scale=t.repeat.toArray(),s=!0),s&&(e.extensions=e.extensions||{},e.extensions.KHR_texture_transform=i,this.extensionsUsed.KHR_texture_transform=!0)}async buildMetalRoughTextureAsync(e,t){if(e===t)return e;function s(h){return h.colorSpace===it?function(p){return p<.04045?p*.0773993808:Math.pow(p*.9478672986+.0521327014,2.4)}:function(p){return p}}e instanceof H&&(e=await this.decompressTextureAsync(e)),t instanceof H&&(t=await this.decompressTextureAsync(t));const i=e?e.image:null,n=t?t.image:null,r=Math.max(i?i.width:0,n?n.width:0),a=Math.max(i?i.height:0,n?n.height:0),c=X();c.width=r,c.height=a;const f=c.getContext("2d",{willReadFrequently:!0});f.fillStyle="#00ffff",f.fillRect(0,0,r,a);const l=f.getImageData(0,0,r,a);if(i){f.drawImage(i,0,0,r,a);const h=s(e),d=f.getImageData(0,0,r,a).data;for(let p=2;p<d.length;p+=4)l.data[p]=h(d[p]/256)*256}if(n){f.drawImage(n,0,0,r,a);const h=s(t),d=f.getImageData(0,0,r,a).data;for(let p=1;p<d.length;p+=4)l.data[p]=h(d[p]/256)*256}f.putImageData(l,0,0);const m=(e||t).clone();return m.source=new ne(c),m.colorSpace=Qe,m.channel=(e||t).channel,e&&t&&e.channel!==t.channel&&console.warn("THREE.GLTFExporter: UV channels for metalnessMap and roughnessMap textures must match."),console.warn("THREE.GLTFExporter: Merged metalnessMap and roughnessMap textures."),m}async buildNormalMapTextureAsync(e,t,s){e instanceof H&&(e=await this.decompressTextureAsync(e));const i=e.image,n=X();n.width=i.width,n.height=i.height;const r=n.getContext("2d",{willReadFrequently:!0});r.drawImage(i,0,0,n.width,n.height);const a=r.getImageData(0,0,n.width,n.height),c=a.data;for(let l=0;l<c.length;l+=4)t&&(c[l+0]=255-c[l+0]),s&&(c[l+1]=255-c[l+1]);r.putImageData(a,0,0);const f=e.clone();return f.source=new ne(n),f}async decompressTextureAsync(e,t=1/0){if(this.textureUtils===null)throw new Error("THREE.GLTFExporter: setTextureUtils() must be called to process compressed textures.");return await this.textureUtils.decompress(e,t)}processBuffer(e){const t=this.json,s=this.buffers;return t.buffers||(t.buffers=[{byteLength:0}]),s.push(e),0}processBufferView(e,t,s,i,n){const r=this.json;r.bufferViews||(r.bufferViews=[]);let a;switch(t){case A.BYTE:case A.UNSIGNED_BYTE:a=1;break;case A.SHORT:case A.UNSIGNED_SHORT:a=2;break;default:a=4}let c=e.itemSize*a;n===A.ARRAY_BUFFER&&(c=Math.ceil(c/4)*4);const f=me(i*c),l=new DataView(new ArrayBuffer(f));let u=0;for(let d=s;d<s+i;d++){for(let p=0;p<e.itemSize;p++){let g;e.itemSize>4?g=e.array[d*e.itemSize+p]:(p===0?g=e.getX(d):p===1?g=e.getY(d):p===2?g=e.getZ(d):p===3&&(g=e.getW(d)),e.normalized===!0&&(g=ee.normalize(g,e.array))),t===A.FLOAT?l.setFloat32(u,g,!0):t===A.INT?l.setInt32(u,g,!0):t===A.UNSIGNED_INT?l.setUint32(u,g,!0):t===A.SHORT?l.setInt16(u,g,!0):t===A.UNSIGNED_SHORT?l.setUint16(u,g,!0):t===A.BYTE?l.setInt8(u,g):t===A.UNSIGNED_BYTE&&l.setUint8(u,g),u+=a}u%c!==0&&(u+=c-u%c)}const m={buffer:this.processBuffer(l.buffer),byteOffset:this.byteOffset,byteLength:f};return n!==void 0&&(m.target=n),n===A.ARRAY_BUFFER&&(m.byteStride=c),this.byteOffset+=f,r.bufferViews.push(m),{id:r.bufferViews.length-1,byteLength:0}}processBufferViewImage(e){const t=this,s=t.json;return s.bufferViews||(s.bufferViews=[]),new Promise(function(i){const n=new FileReader;n.readAsArrayBuffer(e),n.onloadend=function(){const r=q(n.result),a={buffer:t.processBuffer(r),byteOffset:t.byteOffset,byteLength:r.byteLength};t.byteOffset+=r.byteLength,i(s.bufferViews.push(a)-1)}})}processAccessor(e,t,s,i){const n=this.json,r={1:"SCALAR",2:"VEC2",3:"VEC3",4:"VEC4",9:"MAT3",16:"MAT4"};let a;if(e.array.constructor===Float32Array)a=A.FLOAT;else if(e.array.constructor===Int32Array)a=A.INT;else if(e.array.constructor===Uint32Array)a=A.UNSIGNED_INT;else if(e.array.constructor===Int16Array)a=A.SHORT;else if(e.array.constructor===Uint16Array)a=A.UNSIGNED_SHORT;else if(e.array.constructor===Int8Array)a=A.BYTE;else if(e.array.constructor===Uint8Array)a=A.UNSIGNED_BYTE;else throw new Error("THREE.GLTFExporter: Unsupported bufferAttribute component type: "+e.array.constructor.name);if(s===void 0&&(s=0),(i===void 0||i===1/0)&&(i=e.count),i===0)return null;const c=It(e,s,i);let f;t!==void 0&&(f=e===t.index?A.ELEMENT_ARRAY_BUFFER:A.ARRAY_BUFFER);const l=this.processBufferView(e,a,s,i,f),u={bufferView:l.id,byteOffset:l.byteOffset,componentType:a,count:i,max:c.max,min:c.min,type:r[e.itemSize]};return e.normalized===!0&&(u.normalized=!0),n.accessors||(n.accessors=[]),n.accessors.push(u)-1}processImage(e,t,s,i="image/png"){if(e!==null){const n=this,r=n.cache,a=n.json,c=n.options,f=n.pending;r.images.has(e)||r.images.set(e,{});const l=r.images.get(e),u=i+":flipY/"+s.toString();if(l[u]!==void 0)return l[u];a.images||(a.images=[]);const m={mimeType:i},h=X();h.width=Math.min(e.width,c.maxTextureSize),h.height=Math.min(e.height,c.maxTextureSize);const d=h.getContext("2d",{willReadFrequently:!0});if(s===!0&&(d.translate(0,h.height),d.scale(1,-1)),e.data!==void 0){t!==et&&console.error("GLTFExporter: Only RGBAFormat is supported.",t),(e.width>c.maxTextureSize||e.height>c.maxTextureSize)&&console.warn("GLTFExporter: Image size is bigger than maxTextureSize",e);const g=new Uint8ClampedArray(e.height*e.width*4);for(let x=0;x<g.length;x+=4)g[x+0]=e.data[x+0],g[x+1]=e.data[x+1],g[x+2]=e.data[x+2],g[x+3]=e.data[x+3];d.putImageData(new ImageData(g,e.width,e.height),0,0)}else if(typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&e instanceof ImageBitmap||typeof OffscreenCanvas<"u"&&e instanceof OffscreenCanvas)d.drawImage(e,0,0,h.width,h.height);else throw new Error("THREE.GLTFExporter: Invalid image type. Use HTMLImageElement, HTMLCanvasElement, ImageBitmap or OffscreenCanvas.");c.binary===!0?f.push(Rt(h,i).then(g=>n.processBufferViewImage(g)).then(g=>{m.bufferView=g})):m.uri=tt.getDataURL(h,i);const p=a.images.push(m)-1;return l[u]=p,p}else throw new Error("THREE.GLTFExporter: No valid image data found. Unable to process texture.")}processSampler(e){const t=this.json;t.samplers||(t.samplers=[]);const s={magFilter:v[e.magFilter],minFilter:v[e.minFilter],wrapS:v[e.wrapS],wrapT:v[e.wrapT]};return t.samplers.push(s)-1}async processTextureAsync(e){const s=this.options,i=this.cache,n=this.json;if(i.textures.has(e))return i.textures.get(e);n.textures||(n.textures=[]),e instanceof H&&(e=await this.decompressTextureAsync(e,s.maxTextureSize));const r=e.userData.mimeType,a=this.processImage(e.image,e.format,e.flipY,r),c={sampler:this.processSampler(e)};r==="image/webp"?(c.extensions=c.extensions||{},c.extensions.EXT_texture_webp={source:a},this.extensionsUsed.EXT_texture_webp=!0,this.extensionsRequired.EXT_texture_webp=!0):c.source=a,e.name&&(c.name=e.name),await this._invokeAllAsync(async function(l){l.writeTexture&&await l.writeTexture(e,c)});const f=n.textures.push(c)-1;return i.textures.set(e,f),f}async processMaterialAsync(e,t){const s=this.cache,i=this.json,n=t!==void 0&&t.hasAttribute("tangent"),r=e.normalMap?e.uuid+":"+n:e.uuid;if(s.materials.has(r))return s.materials.get(r);if(e.isShaderMaterial)return console.warn("GLTFExporter: THREE.ShaderMaterial not supported."),null;i.materials||(i.materials=[]);const a={pbrMetallicRoughness:{}};e.isMeshStandardMaterial!==!0&&e.isMeshBasicMaterial!==!0&&console.warn("GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.");const c=e.color.toArray().concat([e.opacity]);if(C(c,[1,1,1,1])||(a.pbrMetallicRoughness.baseColorFactor=c),e.isMeshStandardMaterial?(a.pbrMetallicRoughness.metallicFactor=e.metalness,a.pbrMetallicRoughness.roughnessFactor=e.roughness):(a.pbrMetallicRoughness.metallicFactor=0,a.pbrMetallicRoughness.roughnessFactor=1),e.metalnessMap||e.roughnessMap){const l=await this.buildMetalRoughTextureAsync(e.metalnessMap,e.roughnessMap),u={index:await this.processTextureAsync(l),texCoord:l.channel};this.applyTextureTransform(u,l),a.pbrMetallicRoughness.metallicRoughnessTexture=u}if(e.map){const l={index:await this.processTextureAsync(e.map),texCoord:e.map.channel};this.applyTextureTransform(l,e.map),a.pbrMetallicRoughness.baseColorTexture=l}if(e.emissive){const l=e.emissive;if(Math.max(l.r,l.g,l.b)>0&&(a.emissiveFactor=e.emissive.toArray()),e.emissiveMap){const m={index:await this.processTextureAsync(e.emissiveMap),texCoord:e.emissiveMap.channel};this.applyTextureTransform(m,e.emissiveMap),a.emissiveTexture=m}}if(e.normalMap){const l=e.normalScale,u=l.x<0,m=n?l.y<0:l.y>0;let h=e.normalMap;if(u||m){s.normalMaps.has(e.normalMap)===!1&&s.normalMaps.set(e.normalMap,{});const p=s.normalMaps.get(e.normalMap),g=`${u}:${m}`;p[g]===void 0&&(p[g]=await this.buildNormalMapTextureAsync(e.normalMap,u,m)),h=p[g]}const d={index:await this.processTextureAsync(h),texCoord:e.normalMap.channel};Math.abs(l.x)!==1&&(d.scale=Math.abs(l.x)),this.applyTextureTransform(d,e.normalMap),a.normalTexture=d}if(e.aoMap){const l={index:await this.processTextureAsync(e.aoMap),texCoord:e.aoMap.channel};e.aoMapIntensity!==1&&(l.strength=e.aoMapIntensity),this.applyTextureTransform(l,e.aoMap),a.occlusionTexture=l}e.transparent?a.alphaMode="BLEND":e.alphaTest>0&&(a.alphaMode="MASK",a.alphaCutoff=e.alphaTest),e.side===st&&(a.doubleSided=!0),e.name!==""&&(a.name=e.name),this.serializeUserData(e,a),await this._invokeAllAsync(async function(l){l.writeMaterialAsync&&await l.writeMaterialAsync(e,a)});const f=i.materials.push(a)-1;return s.materials.set(r,f),f}async processMeshAsync(e){const t=this.cache,s=this.json,i=[e.geometry.uuid];if(Array.isArray(e.material))for(let y=0,T=e.material.length;y<T;y++)i.push(e.material[y].uuid);else i.push(e.material.uuid);const n=i.join(":");if(t.meshes.has(n))return t.meshes.get(n);const r=e.geometry;let a;e.isLineSegments?a=A.LINES:e.isLineLoop?a=A.LINE_LOOP:e.isLine?a=A.LINE_STRIP:e.isPoints?a=A.POINTS:a=e.material.wireframe?A.LINES:A.TRIANGLES;const c={},f={},l=[],u=[],m={uv:"TEXCOORD_0",uv1:"TEXCOORD_1",uv2:"TEXCOORD_2",uv3:"TEXCOORD_3",color:"COLOR_0",skinWeight:"WEIGHTS_0",skinIndex:"JOINTS_0"},h=r.getAttribute("normal");h!==void 0&&!this.isNormalizedNormalAttribute(h)&&(console.warn("THREE.GLTFExporter: Creating normalized normal attribute from the non-normalized one."),r.setAttribute("normal",this.createNormalizedNormalAttribute(h)));let d=null;for(let y in r.attributes){if(y.slice(0,5)==="morph")continue;const T=r.attributes[y];if(y=m[y]||y.toUpperCase(),!/^(POSITION|NORMAL|TANGENT|TEXCOORD_\d+|COLOR_\d+|JOINTS_\d+|WEIGHTS_\d+)$/.test(y)&&!y.startsWith("_")&&(y="_"+y),t.attributes.has(this.getUID(T))){f[y]=t.attributes.get(this.getUID(T));continue}d=null;const E=T.array;y==="JOINTS_0"&&!(E instanceof Uint16Array)&&!(E instanceof Uint8Array)?(console.warn('GLTFExporter: Attribute "skinIndex" converted to type UNSIGNED_SHORT.'),d=G.Utils.toTypedBufferAttribute(T,Uint16Array)):(E instanceof Uint32Array||E instanceof Int32Array)&&!y.startsWith("_")&&(console.warn(`GLTFExporter: Attribute "${y}" converted to type FLOAT.`),d=G.Utils.toTypedBufferAttribute(T,Float32Array));const R=this.processAccessor(d||T,r);R!==null&&(y.startsWith("_")||this.detectMeshQuantization(y,T),f[y]=R,t.attributes.set(this.getUID(T),R))}if(h!==void 0&&r.setAttribute("normal",h),Object.keys(f).length===0)return null;if(e.morphTargetInfluences!==void 0&&e.morphTargetInfluences.length>0){const y=[],T=[],M={};if(e.morphTargetDictionary!==void 0)for(const E in e.morphTargetDictionary)M[e.morphTargetDictionary[E]]=E;for(let E=0;E<e.morphTargetInfluences.length;++E){const R={};let S=!1;for(const N in r.morphAttributes){if(N!=="position"&&N!=="normal"){S||(console.warn("GLTFExporter: Only POSITION and NORMAL morph are supported."),S=!0);continue}const L=r.morphAttributes[N][E],F=N.toUpperCase(),P=r.attributes[N];if(t.attributes.has(this.getUID(L,!0))){R[F]=t.attributes.get(this.getUID(L,!0));continue}const B=L.clone();if(!r.morphTargetsRelative)for(let _=0,Me=L.count;_<Me;_++)for(let z=0;z<L.itemSize;z++)z===0&&B.setX(_,L.getX(_)-P.getX(_)),z===1&&B.setY(_,L.getY(_)-P.getY(_)),z===2&&B.setZ(_,L.getZ(_)-P.getZ(_)),z===3&&B.setW(_,L.getW(_)-P.getW(_));R[F]=this.processAccessor(B,r),t.attributes.set(this.getUID(P,!0),R[F])}u.push(R),y.push(e.morphTargetInfluences[E]),e.morphTargetDictionary!==void 0&&T.push(M[E])}c.weights=y,T.length>0&&(c.extras={},c.extras.targetNames=T)}const p=Array.isArray(e.material);if(p&&r.groups.length===0)return null;let g=!1;if(p&&r.index===null){const y=[];for(let T=0,M=r.attributes.position.count;T<M;T++)y[T]=T;r.setIndex(y),g=!0}const x=p?e.material:[e.material],w=p?r.groups:[{materialIndex:0,start:void 0,count:void 0}];for(let y=0,T=w.length;y<T;y++){const M={mode:a,attributes:f};if(this.serializeUserData(r,M),u.length>0&&(M.targets=u),r.index!==null){let R=this.getUID(r.index);(w[y].start!==void 0||w[y].count!==void 0)&&(R+=":"+w[y].start+":"+w[y].count),t.attributes.has(R)?M.indices=t.attributes.get(R):(M.indices=this.processAccessor(r.index,r,w[y].start,w[y].count),t.attributes.set(R,M.indices)),M.indices===null&&delete M.indices}const E=await this.processMaterialAsync(x[w[y].materialIndex],r);E!==null&&(M.material=E),l.push(M)}g===!0&&r.setIndex(null),c.primitives=l,s.meshes||(s.meshes=[]),await this._invokeAllAsync(function(y){y.writeMesh&&y.writeMesh(e,c)});const b=s.meshes.push(c)-1;return t.meshes.set(n,b),b}detectMeshQuantization(e,t){if(this.extensionsUsed[Y])return;let s;switch(t.array.constructor){case Int8Array:s="byte";break;case Uint8Array:s="unsigned byte";break;case Int16Array:s="short";break;case Uint16Array:s="unsigned short";break;default:return}t.normalized&&(s+=" normalized");const i=e.split("_",1)[0];ae[i]&&ae[i].includes(s)&&(this.extensionsUsed[Y]=!0,this.extensionsRequired[Y]=!0)}processCamera(e){const t=this.json;t.cameras||(t.cameras=[]);const s=e.isOrthographicCamera,i={type:s?"orthographic":"perspective"};return s?i.orthographic={xmag:e.right*2,ymag:e.top*2,zfar:e.far<=0?.001:e.far,znear:e.near<0?0:e.near}:i.perspective={aspectRatio:e.aspect,yfov:ee.degToRad(e.fov),zfar:e.far<=0?.001:e.far,znear:e.near<0?0:e.near},e.name!==""&&(i.name=e.type),t.cameras.push(i)-1}processAnimation(e,t){const s=this.json,i=this.nodeMap;s.animations||(s.animations=[]),e=G.Utils.mergeMorphTargetTracks(e.clone(),t);const n=e.tracks,r=[],a=[];for(let f=0;f<n.length;++f){const l=n[f],u=$.parseTrackName(l.name);let m=$.findNode(t,u.nodeName);const h=ce[u.propertyName];if(u.objectName==="bones"&&(m.isSkinnedMesh===!0?m=m.skeleton.getBoneByName(u.objectIndex):m=void 0),!m||!h){console.warn('THREE.GLTFExporter: Could not export animation track "%s".',l.name);continue}const d=1;let p=l.values.length/l.times.length;h===ce.morphTargetInfluences&&(p/=m.morphTargetInfluences.length);let g;l.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline===!0?(g="CUBICSPLINE",p/=3):l.getInterpolation()===nt?g="STEP":g="LINEAR",a.push({input:this.processAccessor(new O(l.times,d)),output:this.processAccessor(new O(l.values,p)),interpolation:g}),r.push({sampler:a.length-1,target:{node:i.get(m),path:h}})}const c={name:e.name||"clip_"+s.animations.length,samplers:a,channels:r};return this.serializeUserData(e,c),s.animations.push(c),s.animations.length-1}processSkin(e){const t=this.json,s=this.nodeMap,i=t.nodes[s.get(e)],n=e.skeleton;if(n===void 0)return null;const r=e.skeleton.bones[0];if(r===void 0)return null;const a=[],c=new Float32Array(n.bones.length*16),f=new de;for(let u=0;u<n.bones.length;++u)a.push(s.get(n.bones[u])),f.copy(n.boneInverses[u]),f.multiply(e.bindMatrix).toArray(c,u*16);return t.skins===void 0&&(t.skins=[]),t.skins.push({inverseBindMatrices:this.processAccessor(new O(c,16)),joints:a,skeleton:s.get(r)}),i.skin=t.skins.length-1}async processNodeAsync(e){const t=this.json,s=this.options,i=this.nodeMap;if(t.nodes||(t.nodes=[]),e.pivot!==null)return await this._processNodeWithPivotAsync(e);const n={};if(s.trs){const a=e.quaternion.toArray(),c=e.position.toArray(),f=e.scale.toArray();C(a,[0,0,0,1])||(n.rotation=a),C(c,[0,0,0])||(n.translation=c),C(f,[1,1,1])||(n.scale=f)}else e.matrixAutoUpdate&&e.updateMatrix(),Et(e.matrix)===!1&&(n.matrix=e.matrix.elements);if(e.name!==""&&(n.name=String(e.name)),this.serializeUserData(e,n),e.isMesh||e.isLine||e.isPoints){const a=await this.processMeshAsync(e);a!==null&&(n.mesh=a)}else e.isCamera&&(n.camera=this.processCamera(e));e.isSkinnedMesh&&this.skins.push(e);const r=t.nodes.push(n)-1;if(i.set(e,r),e.children.length>0){const a=[];for(let c=0,f=e.children.length;c<f;c++){const l=e.children[c];if(l.visible||s.onlyVisible===!1){const u=await this.processNodeAsync(l);u!==null&&a.push(u)}}a.length>0&&(n.children=a)}return await this._invokeAllAsync(function(a){a.writeNode&&a.writeNode(e,n)}),r}async _processNodeWithPivotAsync(e){const t=this.json,s=this.options,i=this.nodeMap,n=e.pivot,r={},a=e.quaternion.toArray(),c=[e.position.x+n.x,e.position.y+n.y,e.position.z+n.z],f=e.scale.toArray();C(a,[0,0,0,1])||(r.rotation=a),C(c,[0,0,0])||(r.translation=c),C(f,[1,1,1])||(r.scale=f),r.extras={pivot:n.toArray()},e.name!==""&&(r.name=String(e.name)),this.serializeUserData(e,r);const l=t.nodes.push(r)-1;i.set(e,l);const u={},m=[-n.x,-n.y,-n.z];if(C(m,[0,0,0])||(u.translation=m),e.isMesh||e.isLine||e.isPoints){const p=await this.processMeshAsync(e);p!==null&&(u.mesh=p)}else e.isCamera&&(u.camera=this.processCamera(e));e.isSkinnedMesh&&this.skins.push(e);const d=[t.nodes.push(u)-1];if(e.children.length>0){const p=[];for(let g=0,x=e.children.length;g<x;g++){const w=e.children[g];if(w.visible||s.onlyVisible===!1){const b=await this.processNodeAsync(w);b!==null&&p.push(b)}}p.length>0&&(u.children=p)}return r.children=d,await this._invokeAllAsync(function(p){p.writeNode&&p.writeNode(e,r)}),l}async processSceneAsync(e){const t=this.json,s=this.options;t.scenes||(t.scenes=[],t.scene=0);const i={};e.name!==""&&(i.name=e.name),t.scenes.push(i);const n=[];for(let r=0,a=e.children.length;r<a;r++){const c=e.children[r];if(c.visible||s.onlyVisible===!1){const f=await this.processNodeAsync(c);f!==null&&n.push(f)}}n.length>0&&(i.nodes=n),this.serializeUserData(e,i)}async processObjectsAsync(e){const t=new ie;t.name="AuxScene";for(let s=0;s<e.length;s++)t.children.push(e[s]);await this.processSceneAsync(t)}async processInputAsync(e){const t=this.options;e=e instanceof Array?e:[e],await this._invokeAllAsync(function(i){i.beforeParse&&i.beforeParse(e)});const s=[];for(let i=0;i<e.length;i++)e[i]instanceof ie?await this.processSceneAsync(e[i]):s.push(e[i]);s.length>0&&await this.processObjectsAsync(s);for(let i=0;i<this.skins.length;++i)this.processSkin(this.skins[i]);if(e.length===1)for(let i=0;i<t.animations.length;++i)this.processAnimation(t.animations[i],e[0]);else for(let i=0;i<e.length;i++){const n=t.animations[i]||[];for(let r=0;r<n.length;++r)this.processAnimation(n[r],e[i])}await this._invokeAllAsync(function(i){i.afterParse&&i.afterParse(e)})}async _invokeAllAsync(e){for(let t=0,s=this.plugins.length;t<s;t++)await e(this.plugins[t])}}class Nt{constructor(e){this.writer=e,this.name="KHR_lights_punctual"}writeNode(e,t){if(!e.isLight)return;if(!e.isDirectionalLight&&!e.isPointLight&&!e.isSpotLight){console.warn("THREE.GLTFExporter: Only directional, point, and spot lights are supported.",e);return}const s=this.writer,i=s.json,n=s.extensionsUsed,r={};e.name&&(r.name=e.name),r.color=e.color.toArray(),r.intensity=e.intensity,e.isDirectionalLight?r.type="directional":e.isPointLight?(r.type="point",e.distance>0&&(r.range=e.distance)):e.isSpotLight&&(r.type="spot",e.distance>0&&(r.range=e.distance),r.spot={},r.spot.innerConeAngle=(1-e.penumbra)*e.angle,r.spot.outerConeAngle=e.angle),e.decay!==void 0&&e.decay!==2&&console.warn("THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, and expects light.decay=2."),e.target&&(e.target.parent!==e||e.target.position.x!==0||e.target.position.y!==0||e.target.position.z!==-1)&&console.warn("THREE.GLTFExporter: Light direction may be lost. For best results, make light.target a child of the light with position 0,0,-1."),n[this.name]||(i.extensions=i.extensions||{},i.extensions[this.name]={lights:[]},n[this.name]=!0);const a=i.extensions[this.name].lights;a.push(r),t.extensions=t.extensions||{},t.extensions[this.name]={light:a.length-1}}}class _t{constructor(e){this.writer=e,this.name="KHR_materials_unlit"}async writeMaterialAsync(e,t){if(!e.isMeshBasicMaterial)return;const i=this.writer.extensionsUsed;t.extensions=t.extensions||{},t.extensions[this.name]={},i[this.name]=!0,t.pbrMetallicRoughness.metallicFactor=0,t.pbrMetallicRoughness.roughnessFactor=.9}}class vt{constructor(e){this.writer=e,this.name="KHR_materials_clearcoat"}async writeMaterialAsync(e,t){if(!e.isMeshPhysicalMaterial||e.clearcoat===0)return;const s=this.writer,i=s.extensionsUsed,n={};if(n.clearcoatFactor=e.clearcoat,e.clearcoatMap){const r={index:await s.processTextureAsync(e.clearcoatMap),texCoord:e.clearcoatMap.channel};s.applyTextureTransform(r,e.clearcoatMap),n.clearcoatTexture=r}if(n.clearcoatRoughnessFactor=e.clearcoatRoughness,e.clearcoatRoughnessMap){const r={index:await s.processTextureAsync(e.clearcoatRoughnessMap),texCoord:e.clearcoatRoughnessMap.channel};s.applyTextureTransform(r,e.clearcoatRoughnessMap),n.clearcoatRoughnessTexture=r}if(e.clearcoatNormalMap){const r={index:await s.processTextureAsync(e.clearcoatNormalMap),texCoord:e.clearcoatNormalMap.channel};e.clearcoatNormalScale.x!==1&&(r.scale=e.clearcoatNormalScale.x),s.applyTextureTransform(r,e.clearcoatNormalMap),n.clearcoatNormalTexture=r}t.extensions=t.extensions||{},t.extensions[this.name]=n,i[this.name]=!0}}class Lt{constructor(e){this.writer=e,this.name="KHR_materials_dispersion"}async writeMaterialAsync(e,t){if(!e.isMeshPhysicalMaterial||e.dispersion===0)return;const i=this.writer.extensionsUsed,n={};n.dispersion=e.dispersion,t.extensions=t.extensions||{},t.extensions[this.name]=n,i[this.name]=!0}}class Ct{constructor(e){this.writer=e,this.name="KHR_materials_iridescence"}async writeMaterialAsync(e,t){if(!e.isMeshPhysicalMaterial||e.iridescence===0)return;const s=this.writer,i=s.extensionsUsed,n={};if(n.iridescenceFactor=e.iridescence,e.iridescenceMap){const r={index:await s.processTextureAsync(e.iridescenceMap),texCoord:e.iridescenceMap.channel};s.applyTextureTransform(r,e.iridescenceMap),n.iridescenceTexture=r}if(n.iridescenceIor=e.iridescenceIOR,n.iridescenceThicknessMinimum=e.iridescenceThicknessRange[0],n.iridescenceThicknessMaximum=e.iridescenceThicknessRange[1],e.iridescenceThicknessMap){const r={index:await s.processTextureAsync(e.iridescenceThicknessMap),texCoord:e.iridescenceThicknessMap.channel};s.applyTextureTransform(r,e.iridescenceThicknessMap),n.iridescenceThicknessTexture=r}t.extensions=t.extensions||{},t.extensions[this.name]=n,i[this.name]=!0}}class Ut{constructor(e){this.writer=e,this.name="KHR_materials_transmission"}async writeMaterialAsync(e,t){if(!e.isMeshPhysicalMaterial||e.transmission===0)return;const s=this.writer,i=s.extensionsUsed,n={};if(n.transmissionFactor=e.transmission,e.transmissionMap){const r={index:await s.processTextureAsync(e.transmissionMap),texCoord:e.transmissionMap.channel};s.applyTextureTransform(r,e.transmissionMap),n.transmissionTexture=r}t.extensions=t.extensions||{},t.extensions[this.name]=n,i[this.name]=!0}}class Ft{constructor(e){this.writer=e,this.name="KHR_materials_volume"}async writeMaterialAsync(e,t){if(!e.isMeshPhysicalMaterial||e.transmission===0)return;const s=this.writer,i=s.extensionsUsed,n={};if(n.thicknessFactor=e.thickness,e.thicknessMap){const r={index:await s.processTextureAsync(e.thicknessMap),texCoord:e.thicknessMap.channel};s.applyTextureTransform(r,e.thicknessMap),n.thicknessTexture=r}e.attenuationDistance!==1/0&&(n.attenuationDistance=e.attenuationDistance),n.attenuationColor=e.attenuationColor.toArray(),t.extensions=t.extensions||{},t.extensions[this.name]=n,i[this.name]=!0}}class Ot{constructor(e){this.writer=e,this.name="KHR_materials_ior"}async writeMaterialAsync(e,t){if(!e.isMeshPhysicalMaterial||e.ior===1.5)return;const i=this.writer.extensionsUsed,n={};n.ior=e.ior,t.extensions=t.extensions||{},t.extensions[this.name]=n,i[this.name]=!0}}class kt{constructor(e){this.writer=e,this.name="KHR_materials_specular"}async writeMaterialAsync(e,t){if(!e.isMeshPhysicalMaterial||e.specularIntensity===1&&e.specularColor.equals(xt)&&!e.specularIntensityMap&&!e.specularColorMap)return;const s=this.writer,i=s.extensionsUsed,n={};if(e.specularIntensityMap){const r={index:await s.processTextureAsync(e.specularIntensityMap),texCoord:e.specularIntensityMap.channel};s.applyTextureTransform(r,e.specularIntensityMap),n.specularTexture=r}if(e.specularColorMap){const r={index:await s.processTextureAsync(e.specularColorMap),texCoord:e.specularColorMap.channel};s.applyTextureTransform(r,e.specularColorMap),n.specularColorTexture=r}n.specularFactor=e.specularIntensity,n.specularColorFactor=e.specularColor.toArray(),t.extensions=t.extensions||{},t.extensions[this.name]=n,i[this.name]=!0}}class zt{constructor(e){this.writer=e,this.name="KHR_materials_sheen"}async writeMaterialAsync(e,t){if(!e.isMeshPhysicalMaterial||e.sheen==0)return;const s=this.writer,i=s.extensionsUsed,n={};if(e.sheenRoughnessMap){const r={index:await s.processTextureAsync(e.sheenRoughnessMap),texCoord:e.sheenRoughnessMap.channel};s.applyTextureTransform(r,e.sheenRoughnessMap),n.sheenRoughnessTexture=r}if(e.sheenColorMap){const r={index:await s.processTextureAsync(e.sheenColorMap),texCoord:e.sheenColorMap.channel};s.applyTextureTransform(r,e.sheenColorMap),n.sheenColorTexture=r}n.sheenRoughnessFactor=e.sheenRoughness,n.sheenColorFactor=e.sheenColor.toArray(),t.extensions=t.extensions||{},t.extensions[this.name]=n,i[this.name]=!0}}class Dt{constructor(e){this.writer=e,this.name="KHR_materials_anisotropy"}async writeMaterialAsync(e,t){if(!e.isMeshPhysicalMaterial||e.anisotropy==0)return;const s=this.writer,i=s.extensionsUsed,n={};if(e.anisotropyMap){const r={index:await s.processTextureAsync(e.anisotropyMap)};s.applyTextureTransform(r,e.anisotropyMap),n.anisotropyTexture=r}n.anisotropyStrength=e.anisotropy,n.anisotropyRotation=e.anisotropyRotation,t.extensions=t.extensions||{},t.extensions[this.name]=n,i[this.name]=!0}}class Pt{constructor(e){this.writer=e,this.name="KHR_materials_emissive_strength"}async writeMaterialAsync(e,t){if(!e.isMeshStandardMaterial||e.emissiveIntensity===1)return;const i=this.writer.extensionsUsed,n={};n.emissiveStrength=e.emissiveIntensity,t.extensions=t.extensions||{},t.extensions[this.name]=n,i[this.name]=!0}}class Bt{constructor(e){this.writer=e,this.name="EXT_materials_bump"}async writeMaterialAsync(e,t){if(!e.isMeshStandardMaterial||e.bumpScale===1&&!e.bumpMap)return;const s=this.writer,i=s.extensionsUsed,n={};if(e.bumpMap){const r={index:await s.processTextureAsync(e.bumpMap),texCoord:e.bumpMap.channel};s.applyTextureTransform(r,e.bumpMap),n.bumpTexture=r}n.bumpFactor=e.bumpScale,t.extensions=t.extensions||{},t.extensions[this.name]=n,i[this.name]=!0}}class Gt{constructor(e){this.writer=e,this.name="EXT_mesh_gpu_instancing"}writeNode(e,t){if(!e.isInstancedMesh)return;const s=this.writer,i=e,n=new Float32Array(i.count*3),r=new Float32Array(i.count*4),a=new Float32Array(i.count*3),c=new de,f=new V,l=new Je,u=new V;for(let h=0;h<i.count;h++)i.getMatrixAt(h,c),c.decompose(f,l,u),f.toArray(n,h*3),l.toArray(r,h*4),u.toArray(a,h*3);const m={TRANSLATION:s.processAccessor(new O(n,3)),ROTATION:s.processAccessor(new O(r,4)),SCALE:s.processAccessor(new O(a,3))};i.instanceColor&&(m._COLOR_0=s.processAccessor(i.instanceColor)),t.extensions=t.extensions||{},t.extensions[this.name]={attributes:m},s.extensionsUsed[this.name]=!0,s.extensionsRequired[this.name]=!0}}G.Utils={insertKeyframe:function(o,e){const s=o.getValueSize(),i=new o.TimeBufferType(o.times.length+1),n=new o.ValueBufferType(o.values.length+s),r=o.createInterpolant(new o.ValueBufferType(s));let a;if(o.times.length===0){i[0]=e;for(let c=0;c<s;c++)n[c]=0;a=0}else if(e<o.times[0]){if(Math.abs(o.times[0]-e)<.001)return 0;i[0]=e,i.set(o.times,1),n.set(r.evaluate(e),0),n.set(o.values,s),a=0}else if(e>o.times[o.times.length-1]){if(Math.abs(o.times[o.times.length-1]-e)<.001)return o.times.length-1;i[i.length-1]=e,i.set(o.times,0),n.set(o.values,0),n.set(r.evaluate(e),o.values.length),a=i.length-1}else for(let c=0;c<o.times.length;c++){if(Math.abs(o.times[c]-e)<.001)return c;if(o.times[c]<e&&o.times[c+1]>e){i.set(o.times.slice(0,c+1),0),i[c+1]=e,i.set(o.times.slice(c+1),c+2),n.set(o.values.slice(0,(c+1)*s),0),n.set(r.evaluate(e),(c+1)*s),n.set(o.values.slice((c+1)*s),(c+2)*s),a=c+1;break}}return o.times=i,o.values=n,a},mergeMorphTargetTracks:function(o,e){const t=[],s={},i=o.tracks;for(let n=0;n<i.length;++n){let r=i[n];const a=$.parseTrackName(r.name),c=$.findNode(e,a.nodeName);if(a.propertyName!=="morphTargetInfluences"||a.propertyIndex===void 0){t.push(r);continue}if(r.createInterpolant!==r.InterpolantFactoryMethodDiscrete&&r.createInterpolant!==r.InterpolantFactoryMethodLinear){if(r.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline)throw new Error("THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.");console.warn("THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead."),r=r.clone(),r.setInterpolation(dt)}const f=c.morphTargetInfluences.length,l=c.morphTargetDictionary[a.propertyIndex];if(l===void 0)throw new Error("THREE.GLTFExporter: Morph target name not found: "+a.propertyIndex);let u;if(s[c.uuid]===void 0){u=r.clone();const h=new u.ValueBufferType(f*u.times.length);for(let d=0;d<u.times.length;d++)h[d*f+l]=u.values[d];u.name=(a.nodeName||"")+".morphTargetInfluences",u.values=h,s[c.uuid]=u,t.push(u);continue}const m=r.createInterpolant(new r.ValueBufferType(1));u=s[c.uuid];for(let h=0;h<u.times.length;h++)u.values[h*f+l]=m.evaluate(u.times[h]);for(let h=0;h<r.times.length;h++){const d=this.insertKeyframe(u,r.times[h]);u.values[d*f+l]=r.values[h]}}return o.tracks=t,o},toTypedBufferAttribute:function(o,e){const t=new O(new e(o.count*o.itemSize),o.itemSize,!1);if(!o.normalized&&!o.isInterleavedBufferAttribute)return t.array.set(o.array),t;for(let s=0,i=o.count;s<i;s++)for(let n=0;n<o.itemSize;n++)t.setComponent(s,n,o.getComponent(s,n));return t}};const Ht=new Set(["position","normal","tangent","uv","uv1","uv2","uv3","color","skinIndex","skinWeight"]);async function Vt(o,e){const t=[],s=[],i=new Set,n=o.animationFacts();for(const a of o.skeletons.rigs()){const c=n.armatures[a.armature];if(!c)continue;const f=new Set;c.action&&f.add(c.action);for(const l of c.animation?.tracks??[])for(const u of l.strips)u.action&&f.add(u.action);for(const l of[...f].sort())try{const u=await e.clip(a.armature,l),m=u?Fe(u):null;if(!m)continue;const h=Math.max(1,Math.round(m.end-m.start)+1),d=Float32Array.from({length:h},(x,w)=>w/m.fps),p=(x,w)=>x.length===w?[new Float32Array([0]),x]:[d.slice(0,x.length/w),x],g=[];for(const[x,w]of m.bones){const b=a.bones.get(x);b&&(g.push(new re(`${b.uuid}.position`,...p(w.position,3))),g.push(new mt(`${b.uuid}.quaternion`,...p(w.quaternion,4))),g.push(new re(`${b.uuid}.scale`,...p(w.scale,3))))}g.length&&t.push(new oe(`${a.armature}|${l}`,(h-1)/m.fps,g))}catch(u){s.push(`${a.armature} / ${l}: ${u instanceof Error?u.message:String(u)}`)}}const r=await e.movie();return o.withAuthoredMaterials(async()=>{const a=r?Oe(o,r,new gt(o.root)):null;for(const m of a?.warnings??[])i.add(m);const c=[],f=[];for(const m of a?.clips()??[])for(const h of m.tracks){const d=/^([^.]+)\.material(?:\[(\d+)\])?\.(color|emissive|opacity)$/.exec(h.name);if(d){const p=o.root.getObjectByProperty("uuid",d[1]),g=p?Array.isArray(p.material)?p.material[Number(d[2]??0)]:p.material:void 0;g&&c.push({material:g,prop:d[3],track:h});continue}if(h.name.endsWith(".visible")){i.add("keyed visibility is not written to the glTF export");continue}f.push(h)}f.length&&t.push(new oe("Scene",-1,f)),o.root.updateMatrixWorld(!0);const l=[];let u;try{o.root.traverse(h=>{const d=h.geometry;if(d?.attributes)for(const p of Object.keys(d.attributes))Ht.has(p)||(l.push([d,p,d.getAttribute(p)]),d.deleteAttribute(p))}),u=await new G().parseAsync(o.root,{binary:!1,animations:t,onlyVisible:!1}),$t(u,c)}finally{for(const[m,h,d]of l)m.setAttribute(h,d);a?.dispose()}return{json:u,animations:(u.animations??[]).map(m=>m.name??""),pointers:c.length,skipped:[...i],failed:s}})}function $t(o,e){for(const x of o.materials??[]){const w=x.emissiveFactor,b=w?Math.max(...w):0;if(!w||b<=1)continue;x.emissiveFactor=w.map(T=>T/b);const y=x.extensions?.KHR_materials_emissive_strength?.emissiveStrength??1;x.extensions={...x.extensions,KHR_materials_emissive_strength:{emissiveStrength:y*b}},o.extensionsUsed=[...new Set([...o.extensionsUsed??[],"KHR_materials_emissive_strength"])]}if(!e.length)return;const t=o.accessors??=[],s=o.bufferViews??=[],i=o.buffers??=[],n=[];let r=0;const a=i.length,c=(x,w,b=!1)=>{s.push({buffer:a,byteOffset:r,byteLength:x.byteLength});const y=w==="SCALAR"?1:w==="VEC3"?3:4;return t.push({bufferView:s.length-1,componentType:5126,count:x.length/y,type:w,...b?{min:[Math.min(...x)],max:[Math.max(...x)]}:{}}),n.push(x),r+=x.byteLength,t.length-1},f=[],l=[],u=new Set(["KHR_animation_pointer"]),m=(x,w,b,y)=>{f.push({input:c(x,"SCALAR",!0),output:c(w,b),interpolation:"LINEAR"}),l.push({sampler:f.length-1,target:{path:"pointer",extensions:{KHR_animation_pointer:{pointer:y}}}})},h=new Map;for(const x of e)h.set(x.material,{...h.get(x.material),[x.prop]:x.track});for(const[x,w]of h){const b=(o.materials??[]).findIndex(T=>T.name===x.name);if(b<0)continue;const y=x;if(w.color||w.opacity){w.opacity?.values.some(S=>Number(S)<1)&&(o.materials[b].alphaMode="BLEND");const T=(w.color??w.opacity).times,M=w.color?.values,E=w.opacity?.values,R=new Float32Array(T.length*4);for(let S=0;S<T.length;S++)R[S*4]=M?M[Math.min(S,M.length/3-1)*3]:y.color?.r??1,R[S*4+1]=M?M[Math.min(S,M.length/3-1)*3+1]:y.color?.g??1,R[S*4+2]=M?M[Math.min(S,M.length/3-1)*3+2]:y.color?.b??1,R[S*4+3]=E?E[Math.min(S,E.length-1)]:y.opacity??1;m(T,R,"VEC4",`/materials/${b}/pbrMetallicRoughness/baseColorFactor`)}if(w.emissive){const T=w.emissive.times,M=w.emissive.values,E=Math.min(T.length,M.length/3),R=new Float32Array(E*3),S=new Float32Array(E);for(let N=0;N<E;N++){const L=Math.max(1,M[N*3],M[N*3+1],M[N*3+2]);S[N]=L;for(let F=0;F<3;F++)R[N*3+F]=M[N*3+F]/L}if(m(T.slice(0,E),R,"VEC3",`/materials/${b}/emissiveFactor`),S.some(N=>N>1)){const N=o.materials[b];N.extensions={...N.extensions,KHR_materials_emissive_strength:{emissiveStrength:Math.max(...S)}},u.add("KHR_materials_emissive_strength"),m(T.slice(0,E),S,"SCALAR",`/materials/${b}/extensions/KHR_materials_emissive_strength/emissiveStrength`)}}}if(!l.length)return;const d=new Uint8Array(r);let p=0;for(const x of n)d.set(new Uint8Array(x.buffer,x.byteOffset,x.byteLength),p),p+=x.byteLength;let g="";for(const x of d)g+=String.fromCharCode(x);i.push({byteLength:d.byteLength,uri:`data:application/octet-stream;base64,${btoa(g)}`}),(o.animations??=[]).push({name:"Materials",samplers:f,channels:l}),o.extensionsUsed=[...new Set([...o.extensionsUsed??[],...u])]}async function Kt(o){const e=pe(),t=e?Q(e)??Q(e.replace(/#.*$/,"")):null;if(!t)return{ok:!1,error:"No model document is open: open the .blend to export, then export again."};if(Z.snapshot()===null)return{ok:!1,error:`${t} has not been presented yet: wait for the model to show, then export again.`};const s=o.out;if(s!==void 0&&(typeof s!="string"||!/\.gltf$/i.test(s)))return{ok:!1,error:`blender-export-gltf's out is a project-relative .gltf path; it was given ${JSON.stringify(s)}.`};const i=s??`exports/${t.replace(/^.*\//,"").replace(/\.blend$/i,"")}.gltf`,n=performance.now(),r=await Vt(Z,{clip:(c,f)=>Re({object:c,action:f,summary:!1}),movie:()=>Ie()}),a=JSON.stringify(r.json);return await U().files.write(i,a),{ok:!0,data:{out:i,blend:t,bytes:a.length,animations:r.animations,pointers:r.pointers,skipped:r.skipped,failed:r.failed,ms:Math.round(performance.now()-n)}}}const Wt={"blender-export-gltf":o=>Kt(o)},Yt=6e4,qt=5*6e4,Xt={component:".volter/export/components",level:".volter/export/levels"},te=".volter/export/display",ge=`${te}/luts.json`;async function ye(){try{const o=JSON.parse(await U().files.read(ge));return o&&typeof o=="object"?o:{}}catch{return{}}}async function jt(){const o={};return await Promise.all(Object.entries(await ye()).map(async([e,t])=>{typeof t=="string"&&await se(`${te}/${e}.cube`).catch(()=>null)===t&&(o[e]=t)})),o}const D=new Map,Jt=o=>o instanceof Error?o.message:String(o);async function xe(o){const e=await crypto.subtle.digest("SHA-256",o);return[...new Uint8Array(e)].map(t=>t.toString(16).padStart(2,"0")).join("")}const k=new Map,we=".volter/cache/file-hashes.json";let Zt=null,j=null;function Qt(){return Zt??=(async()=>{try{const o=JSON.parse(await U().files.read(we));for(const[e,t]of Object.entries(o))typeof t?.size=="number"&&typeof t.mtime=="number"&&typeof t.sha256=="string"&&!k.has(e)&&k.set(e,{size:t.size,mtime:t.mtime,sha256:t.sha256})}catch{}})()}function Te(){j===null&&(j=setTimeout(()=>{j=null,U().files.write(we,`${JSON.stringify(Object.fromEntries(k))}
2
- `).catch(()=>{})},1e3))}async function se(o){const e=U().files;await Qt();const t=await e.stat(o).catch(()=>null),s=k.get(o);if(t&&s&&s.size===t.size&&s.mtime===t.mtime)return s.sha256;const i=await xe(await e.readBytes(o)),n=t?await e.stat(o).catch(()=>null):null;return t&&n&&n.size===t.size&&n.mtime===t.mtime?k.set(o,{size:t.size,mtime:t.mtime,sha256:i}):k.delete(o),Te(),i}const K=new Map;async function es(o){const e=U().files,t=await e.stat(o).catch(()=>null);if(!t)return;const s=K.get(o);if(s&&s.size===t.size&&s.mtime===t.mtime)return s.manifest;try{const i=JSON.parse(await e.read(o));return K.set(o,{size:t.size,mtime:t.mtime,manifest:i}),i}catch{return}}async function ts(o,e,t){const s=await U().files.stat(o).catch(()=>null);if(!(!s||s.size!==e.length)){if(t)typeof t.sha256=="string"&&t.bytes===e.length&&(k.set(o,{size:s.size,mtime:s.mtime,sha256:t.sha256}),Te());else if(o.endsWith(".json"))try{K.set(o,{size:s.size,mtime:s.mtime,manifest:JSON.parse(new TextDecoder().decode(e))})}catch{K.delete(o)}}}function ss(o){const e=o,t={};for(const s of["format","blendSha256","exporter","settings","sha256","display"])s in e&&(t[s]=e[s]);return t}async function ns(o,e){const t=U().files,[s,i]=await Promise.all([es(`${o}/${e}.json`),se(`${o}/${e}.glb`).catch(()=>null)]);if(!s)return;const n=Object.values(s.placementActions??{});return(await Promise.all(n.map(async a=>typeof a.file!="string"||await t.stat(`${o}/${a.file}`).catch(()=>null)!==null))).every(Boolean)?{manifest:s,sha256:i}:void 0}function is(o,e,t){const s=t.manifest;return{kind:t.kind,blend:o,out:`${e}/${t.name}.glb`,manifest:`${e}/${t.name}.json`,current:t.current,ms:t.ms,bytes:s.bytes,sha256:s.sha256,exporter:s.exporter,nodes:s.nodes,animations:s.animations.length,hiddenNodes:s.hiddenNodes,warnings:s.warnings,...s.markers?{markers:s.markers.length}:{},...s.components?{components:s.components}:{},...s.unsupported?{unsupported:s.unsupported}:{},...s.collections?{collections:s.collections}:{},componentSettings:t.settings.component}}async function rs(o,e,t){const s=Xt[o],i=(e.split("/").pop()??e).replace(/\.blend$/i,""),n={},r=performance.now(),a=async(w,b)=>{try{return await b}finally{n[w]=Math.round(performance.now()-r)}};await he(e);const[c,f,l]=await Promise.all([a("previous",t?Promise.resolve(void 0):ns(s,i)),a("blendHash",se(e)),a("luts",jt())]);let u=performance.now();const m=w=>{const b=performance.now();n[w]=Math.round(b-u),u=b},h=await Ne({kind:o,blendSha256:f,luts:l,...t?{force:!0}:{},...c?{previous:{manifest:ss(c.manifest),sha256:c.sha256}}:{}});m("blenderAnswer");const d=h!==null&&h.current&&c?{...h,manifest:c.manifest}:h;if(d===null)return{ok:!1,error:"Blender's session is not started: open the model, then export again."};if(d.document!==e)return{ok:!1,error:`Blender exported ${d.document}, not ${e}: the view moved to another file during the export.`};const p=U().files;let g=0,x=0;for(const w of[...d.files].sort((b,y)=>Number(b.endsWith(".json"))-Number(y.endsWith(".json")))){const b=performance.now(),y=await _e(w);g+=performance.now()-b;const T=performance.now(),M=w.split("/").pop();if(M.endsWith(".cube")){await p.write(`${te}/${M}`,y);const E=await ye();E[M.slice(0,-5)]=await xe(y),await p.write(ge,`${JSON.stringify(E,null,2)}
3
- `)}else{await p.write(`${s}/${M}`,y);const E=M===`${d.name}.glb`;await ts(`${s}/${M}`,y,E?d.manifest:void 0)}x+=performance.now()-T}return m("carry"),d.files.length>0&&(n.carryRead=Math.round(g),n.carryWrite=Math.round(x)),{ok:!0,data:{...is(e,s,d),steps:n}}}async function J(o,e){let t;const s=new Promise(n=>{t=setTimeout(()=>n(null),Yt)}),i=await Promise.race([e.done,s]).finally(()=>clearTimeout(t));return i===null?{ok:!0,data:{pending:!0,token:o,kind:e.kind,blend:e.blend,elapsedMs:Math.round(performance.now()-e.started)}}:(e.expiry!==void 0&&clearTimeout(e.expiry),D.delete(o),i)}async function fe(o,e){const t=`blender-export-${o}`,s=e.token;if(s!==void 0){if(typeof s!="string")return{ok:!1,error:`${t}'s token is the one its pending answer gave, a string.`};const l=D.get(s);return!l||l.kind!==o?{ok:!1,error:`${t} has no export with token ${s}: start the export again.`}:J(s,l)}const i=e.blend;if(i!==void 0&&(typeof i!="string"||!/\.blend$/i.test(i)))return{ok:!1,error:`${t}'s blend is a project-relative .blend path; it was given ${JSON.stringify(i)}.`};const n=e.force;if(n!==void 0&&typeof n!="boolean")return{ok:!1,error:`${t}'s force is true or false.`};const r=Se(Z);if(r===null||i!==void 0&&r!==i)return{ok:!1,error:`${i??"The model"} has not been presented yet${r?` (the view still shows ${r})`:""}: wait for it to show, then export it.`};const a=[...D.entries()].find(([,l])=>!l.settled);if(a&&a[1].kind===o&&a[1].blend===r&&n!==!0)return J(a[0],a[1]);if(a)return{ok:!1,error:`An export of ${a[1].blend} is still running; ask ${`blender-export-${a[1].kind}`} with its token, then export again.`};const c=crypto.randomUUID(),f={kind:o,blend:r,started:performance.now(),settled:!1,done:rs(o,r,n===!0).catch(l=>({ok:!1,error:`${t} ${r}: ${Jt(l)}`}))};return f.done.then(()=>{f.settled=!0,f.expiry=setTimeout(()=>{D.get(c)===f&&D.delete(c)},qt)}),D.set(c,f),J(c,f)}const os={"blender-export-component":o=>fe("component",o),"blender-export-level":o=>fe("level",o)};function ys(o){return Ae({namespace:"blender-",datablocks:["blender-material-data","blender-shapekey-data","blender-texture-data","blender-image-data"],datablockPrefixes:["blender-outliner-data-","blender-light-","blender-lightprobe-"]}),be(o,{...yt,...Wt,...os}),W(o,"blender-node-view",ve),W(o,"timeline",He),W(o,"blender-uv-view",Xe),{registerModelPlay:Ge,playMode:{documentOnScreen:Be,modelDocumentSource:Q,modelPlayMode:Pe,playModeOf:De,playModeVersion:ze,servedModelDocument:pe,subscribePlayMode:ke},PlayAreaButton:qe,PlayModeSwitch:Ye,switchPlayMode:We,timelineGeometry:{HEADER_HEIGHT:Ke,TIMELINE_CHROME:$e,TIMELINE_THEME:Ve},modelDocument:{setSaveScript:Ue,subscribeSaved:Ce,flush:he},setAssetLibrary:Le}}export{ys as activate};
@@ -1 +0,0 @@
1
- import{j as e}from"./volter-sdk-D8o6TU4A.js";const w="workspace.status",m="Mouse hints",j="left",b=0,u=[{button:"left",label:"Select"},{button:"middle",label:"Pan View"},{button:"right",label:"Orbit View"}],l=1,h=8,a=5,x=1,r=6.25,g=3.6,i={width:12,height:16};function p({button:t}){const s=`volter-mouse-${t}`,c=i.width-a,d=t==="right"?c:0,o=l/2,n=g;return e.jsxs("svg",{viewBox:`0 0 ${i.width} ${i.height}`,role:"presentation","aria-hidden":"true",focusable:"false",style:{height:"var(--volter-icon-lg)",width:"auto",display:"block",flex:"0 0 auto"},children:[e.jsxs("title",{children:[t," mouse button"]}),e.jsx("clipPath",{id:`${s}-outer`,children:e.jsx("rect",{x:"0",y:"0",width:i.width,height:i.height,rx:n})}),e.jsxs("mask",{id:`${s}-shell`,children:[e.jsx("rect",{x:"0",y:"0",width:i.width,height:i.height,fill:"white"}),t!=="middle"&&e.jsx("rect",{x:t==="right"?r:-1,y:-1,width:t==="right"?i.width-r+1:r+1,height:h+x+1,fill:"black"})]}),e.jsx("rect",{x:o,y:o,width:i.width-l,height:i.height-l,rx:n-o,fill:"none",stroke:"currentColor",strokeWidth:l,mask:`url(#${s}-shell)`}),t!=="middle"&&e.jsx("rect",{x:d,y:"0",width:a,height:h,fill:"currentColor",clipPath:`url(#${s}-outer)`}),t==="middle"&&e.jsx("rect",{x:"4",y:"2",width:"4",height:"7",rx:"1.25",fill:"currentColor"})]})}function y(){return e.jsx("span",{className:"volter-status-copy","data-testid":"status-blender-mouse-hints",style:{display:"inline-flex",alignItems:"center",gap:"var(--volter-space-5)"},children:u.map(t=>e.jsxs("span",{"data-mouse-button":t.button,style:{display:"inline-flex",alignItems:"center",gap:"var(--volter-space-1)",fontSize:"var(--volter-font-md)"},title:`${t.label} — the ${t.button} mouse button in the viewport`,children:[e.jsx(p,{button:t.button}),t.label]},t.button))})}export{j as align,y as default,b as order,w as point,m as title};