@volter/cyclotron 0.5.211 → 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.
- package/BUNDLED_NOTICES +232 -1964
- package/LICENSE +2 -3
- package/LICENSE-BLENDER +9 -8
- package/NOTICE +8 -3
- package/README.md +39 -30
- package/dist/.vite/manifest.json +1215 -4338
- package/dist/assets/AudioViewer-B5pkIGXS.js +1 -0
- package/dist/assets/ImageViewer-BPVLEEQ2.js +1 -0
- package/dist/assets/JsonAssetDocument-DuVW9del.js +2 -0
- package/dist/assets/ProjectAuthoringBootstrap-CZJz4Svb.js +2 -0
- package/dist/assets/SourceAssetViewer-LwHBW53R.js +1 -0
- package/dist/assets/VideoViewer-Bfjjp4zH.js +1 -0
- package/dist/assets/client-BLXKEWrR.js +25 -0
- package/dist/assets/index-BKjLHm6K.js +483 -0
- package/dist/assets/index-CJcVFJ-l.css +1 -0
- package/dist/assets/product-CaIfLQVS.js +1 -0
- package/dist/assets/story-capture-C3xmgE62.js +1 -0
- package/dist/assets/volter-sdk-DT0xmh2J.js +1407 -0
- package/dist/assets/volter-sdk-activation-events-B-WERmWU.js +1 -0
- package/dist/assets/volter-sdk-active-project-DvEsy8Q6.js +1 -0
- package/dist/assets/volter-sdk-adapter-editor-config-CQ5V6W-o.js +1 -0
- package/dist/assets/volter-sdk-animation-animation-clock-Cy7j_2qF.js +1 -0
- package/dist/assets/volter-sdk-animation-stage-transport-DoUDq6Gb.js +1 -0
- package/dist/assets/volter-sdk-api-base-Dr1bx5e0.js +1 -0
- package/dist/assets/volter-sdk-api-project-open-D4nPvIPU.js +1 -0
- package/dist/assets/volter-sdk-api-project-source-DoO7WBwQ.js +1 -0
- package/dist/assets/volter-sdk-api-settings-BEHgO5wf.js +1 -0
- package/dist/assets/volter-sdk-asset-capabilities-CGkNwaAe.js +1 -0
- package/dist/assets/volter-sdk-asset-document-write-policy-CzWM1HhK.js +1 -0
- package/dist/assets/volter-sdk-asset-editor-context-BkSK1vL1.js +1 -0
- package/dist/assets/volter-sdk-asset-thumbnails-zSmJgI_x.js +1 -0
- package/dist/assets/volter-sdk-asset-viewers-B-ICvlkR.js +1 -0
- package/dist/assets/volter-sdk-asset-workflow-project-content-C6Ow0R-F.js +1 -0
- package/dist/assets/volter-sdk-authoring-active-adapter-CKuWwxgH.js +1 -0
- package/dist/assets/volter-sdk-authoring-boundary-authoring-adapter-DTwFKBkS.js +1 -0
- package/dist/assets/volter-sdk-authoring-composite-authoring-adapter-iRSbSHpV.js +1 -0
- package/dist/assets/volter-sdk-authoring-consumer-actions-DK9-B-wg.js +1 -0
- package/dist/assets/volter-sdk-authoring-design-time-mount-registry-BQnWcBVe.js +1 -0
- package/dist/assets/volter-sdk-authoring-design-time-roots-BKSmkD7_.js +1 -0
- package/dist/assets/volter-sdk-authoring-layered-pick-C-YvuxEG.js +1 -0
- package/dist/assets/volter-sdk-authoring-no-authoring-adapter-Cv9DD6G0.js +1 -0
- package/dist/assets/volter-sdk-authoring-panel-authoring-BLOrFs8L.js +1 -0
- package/dist/assets/volter-sdk-authoring-react-design-canvas-style-Dr9i31o5.js +1 -0
- package/dist/assets/volter-sdk-authoring-react-story-board-BlCQQM-8.js +1 -0
- package/dist/assets/volter-sdk-authoring-seam-evidence-CjetY_ZG.js +1 -0
- package/dist/assets/volter-sdk-authoring-selection-scope-BxmbC71H.js +1 -0
- package/dist/assets/volter-sdk-authoring-shell-document-ops-DDb8oGx9.js +1 -0
- package/dist/assets/volter-sdk-authoring-stage-root-B50LLhnJ.js +1 -0
- package/dist/assets/volter-sdk-authoring-story-board-chrome-fit-BVV9fbcw.js +1 -0
- package/dist/assets/volter-sdk-authoring-viewport-tool-context-cQafPSkT.js +1 -0
- package/dist/assets/volter-sdk-authoring-viewport-tool-owner-BppqL4f_.js +1 -0
- package/dist/assets/volter-sdk-authoring-world-session-state-BlpdiKod.js +1 -0
- package/dist/assets/volter-sdk-bitmap-label-BbtGPWgP.js +1 -0
- package/dist/assets/volter-sdk-breakpoint-state-DCFuSvgm.js +1 -0
- package/dist/assets/volter-sdk-bytes-codec-CrNeVT4e.js +1 -0
- package/dist/assets/volter-sdk-cancellation-reason-ByOH3mlF.js +1 -0
- package/dist/assets/volter-sdk-canvas-frames-BU8Rqr4J.js +1 -0
- package/dist/assets/volter-sdk-capture-size-D4cNT2XC.js +1 -0
- package/dist/assets/volter-sdk-chrome-registry-qHUiDauw.js +1 -0
- package/dist/assets/volter-sdk-command-result-text-2wzEhQ5t.js +1 -0
- package/dist/assets/volter-sdk-commands-C4RgHEOa.js +1 -0
- package/dist/assets/volter-sdk-component-board-registry-6gFZBkTP.js +1 -0
- package/dist/assets/volter-sdk-components-AssetEditorShell-CQVLedvW.js +1 -0
- package/dist/assets/volter-sdk-components-InspectorCanvasPreview-CN5ROhNT.js +1 -0
- package/dist/assets/volter-sdk-components-SurfaceStateOverlay-Cc9Ov1Ol.js +1 -0
- package/dist/assets/volter-sdk-components-Toolbar-ZoV9Yq_A.js +1 -0
- package/dist/assets/volter-sdk-components-TransientHint-BML2V3uu.js +1 -0
- package/dist/assets/volter-sdk-components-inspector-preview-section-BhDjhUyz.js +1 -0
- package/dist/assets/volter-sdk-components-use-after-paint-BVSO4qjV.js +1 -0
- package/dist/assets/volter-sdk-components-workspace-history-CThvGfsY.js +1 -0
- package/dist/assets/volter-sdk-content-entry-source-registry-CJLVq3tC.js +1 -0
- package/dist/assets/volter-sdk-contribution-surfaces-CeEDmriM.js +1 -0
- package/dist/assets/volter-sdk-contributions-x6j41XZp.js +1 -0
- package/dist/assets/volter-sdk-coverage-design-time-surfaces-D-tNGazo.js +1 -0
- package/dist/assets/volter-sdk-creation-site-registry-64gyrZPD.js +1 -0
- package/dist/assets/volter-sdk-css-numeric-style-CXeWqAoG.js +1 -0
- package/dist/assets/volter-sdk-declared-tools-BAzHxyUW.js +1 -0
- package/dist/assets/volter-sdk-document-areas-4DXjy0el.js +1 -0
- package/dist/assets/volter-sdk-document-layer-B4VYMPZ9.js +1 -0
- package/dist/assets/volter-sdk-document-open-registry-BLDMaEoN.js +1 -0
- package/dist/assets/volter-sdk-document-play-extension-Dv3fyS6K.js +1 -0
- package/dist/assets/volter-sdk-document-probe-drBhAyza.js +1 -0
- package/dist/assets/volter-sdk-document-stage-sessions-CtI9anAf.js +1 -0
- package/dist/assets/volter-sdk-document-viewports-BO0N7VyN.js +1 -0
- package/dist/assets/volter-sdk-editor-commands-BJ9Otxzu.js +1 -0
- package/dist/assets/volter-sdk-editor-console-BaGgfWmH.js +1 -0
- package/dist/assets/volter-sdk-editor-document-probe-D0ZhaXHx.js +1 -0
- package/dist/assets/volter-sdk-editor-mode-B07FDozS.js +1 -0
- package/dist/assets/volter-sdk-editor-runtime-D00Du7hG.js +1 -0
- package/dist/assets/volter-sdk-editor-server-response-C6kOPAsW.js +1 -0
- package/dist/assets/volter-sdk-editor-session-attribution-CggpIFb4.js +1 -0
- package/dist/assets/volter-sdk-editor-view-DEMsxlaT.js +1 -0
- package/dist/assets/volter-sdk-environment-images-OQtFG1kA.js +1 -0
- package/dist/assets/volter-sdk-extension-script-DanTHcyo.js +1 -0
- package/dist/assets/volter-sdk-eyedropper-session-BfVXtjzc.js +1 -0
- package/dist/assets/volter-sdk-files-file-provider-CXL6oCMd.js +1 -0
- package/dist/assets/volter-sdk-files-project-files-SBAE37py.js +1 -0
- package/dist/assets/volter-sdk-framed-document-capture-7TnE8pn1.js +1 -0
- package/dist/assets/volter-sdk-framed-document-driver-C0K3-SRt.js +1 -0
- package/dist/assets/volter-sdk-hierarchy-component-marks-BmJEMvvO.js +1 -0
- package/dist/assets/volter-sdk-hierarchy-kind-icon-CrwdpecY.js +1 -0
- package/dist/assets/volter-sdk-hierarchy-node-rows-FcK7_ULi.js +1 -0
- package/dist/assets/volter-sdk-hierarchy-projection-CKzUOZUa.js +1 -0
- package/dist/assets/volter-sdk-hierarchy-row-media-Czg40Ddi.js +1 -0
- package/dist/assets/volter-sdk-hierarchy-row-model-BGzmcywF.js +1 -0
- package/dist/assets/volter-sdk-hierarchy-rows-VAI0psTR.js +1 -0
- package/dist/assets/volter-sdk-hierarchy-walk-CaVqG7v2.js +1 -0
- package/dist/assets/volter-sdk-history-history-delegate-DH_xBvdh.js +1 -0
- package/dist/assets/volter-sdk-history-history-service-D0n0Gl5Z.js +1 -0
- package/dist/assets/volter-sdk-history-persistence-coordinator-CcywAFdm.js +1 -0
- package/dist/assets/volter-sdk-history-resource-registry-DMTlnwGv.js +1 -0
- package/dist/assets/volter-sdk-history-snapshot-store-BVh1DtBp.js +1 -0
- package/dist/assets/volter-sdk-history-source-history-backend-ulJ-65tX.js +1 -0
- package/dist/assets/volter-sdk-hmr-registration-group-DvMQVKyO.js +1 -0
- package/dist/assets/volter-sdk-hmr-stable-react-context-BMVr5YVk.js +1 -0
- package/dist/assets/volter-sdk-host-D765Py2w.js +1 -0
- package/dist/assets/volter-sdk-hotkeys-TesTKdAZ.js +1 -0
- package/dist/assets/volter-sdk-index-BABXozHr.js +1 -0
- package/dist/assets/volter-sdk-inference-diagnostics-CsDbQ0M5.js +1 -0
- package/dist/assets/volter-sdk-inspection-document-subject-BMRD77Va.js +1 -0
- package/dist/assets/volter-sdk-inspection-group-icons-Wpz-YhkE.js +1 -0
- package/dist/assets/volter-sdk-inspection-model-BVOyStdc.js +1 -0
- package/dist/assets/volter-sdk-inspection-node-media-B8AL8_3F.js +1 -0
- package/dist/assets/volter-sdk-inspection-null-subject-d5bQZCbS.js +1 -0
- package/dist/assets/volter-sdk-inspector-property-grouping-BqrZkwo4.js +1 -0
- package/dist/assets/volter-sdk-inspector-section-registry-C6U15zvC.js +1 -0
- package/dist/assets/volter-sdk-js-heap-CcOnY0kf.js +1 -0
- package/dist/assets/volter-sdk-keymap-presets-CSM-jVcZ.js +1 -0
- package/dist/assets/volter-sdk-layout-arrangements-DHA3uifx.js +1 -0
- package/dist/assets/volter-sdk-layouts-4v9ECCn9.js +1 -0
- package/dist/assets/volter-sdk-light-explorer-model-CPuZjpiR.js +1 -0
- package/dist/assets/volter-sdk-live-seam-evidence-B_RyDaOp.js +1 -0
- package/dist/assets/volter-sdk-live-session-registry-C6gHroaH.js +1 -0
- package/dist/assets/volter-sdk-manifest-project-CVVUDDuL.js +1 -0
- package/dist/assets/volter-sdk-mount-css-scope-DaJoEo3v.js +1 -0
- package/dist/assets/volter-sdk-mount-failure-report-Cm92oiGJ.js +1 -0
- package/dist/assets/volter-sdk-native-selection-style-Bp4IBnA4.js +1 -0
- package/dist/assets/volter-sdk-photograph-notice-C6_gZGpW.js +1 -0
- package/dist/assets/volter-sdk-play-camera-flight-SwlYhOxW.js +1 -0
- package/dist/assets/volter-sdk-product-command-G8kKVJ-i.js +1 -0
- package/dist/assets/volter-sdk-progress-4GGmPvZn.js +1 -0
- package/dist/assets/volter-sdk-project-module-changes-DIrDIHeD.js +1 -0
- package/dist/assets/volter-sdk-project-module-url-BuAUWpus.js +1 -0
- package/dist/assets/volter-sdk-project-output-roots-BON7FOwQ.js +1 -0
- package/dist/assets/volter-sdk-project-tab-census-CO06UOh-.js +1 -0
- package/dist/assets/volter-sdk-renderer-resource-counts-2kLiD8_S.js +1 -0
- package/dist/assets/volter-sdk-scoped-project-css-DA63CYkM.js +1 -0
- package/dist/assets/volter-sdk-selection-CSUq7EiY.js +1 -0
- package/dist/assets/volter-sdk-served-url-B_MypeId.js +1 -0
- package/dist/assets/volter-sdk-settings-settings-provider-CJuWxTB5.js +1 -0
- package/dist/assets/volter-sdk-settings-store-CEFKDj0h.js +1 -0
- package/dist/assets/volter-sdk-shell-store-Cl4sX9p4.js +1 -0
- package/dist/assets/volter-sdk-shell-store-door-DGjybg0J.js +1 -0
- package/dist/assets/volter-sdk-source-conflict-CV8Gk053.js +1 -0
- package/dist/assets/volter-sdk-stage-context-Cb0SaYhi.js +1 -0
- package/dist/assets/volter-sdk-stage-invalidation-VlBciYA0.js +1 -0
- package/dist/assets/volter-sdk-stage-store-registry-BpIy_QKq.js +1 -0
- package/dist/assets/volter-sdk-startup-failure-C_8H4xuP.js +1 -0
- package/dist/assets/volter-sdk-stories-StoryPreviewMount-BUX42gIR.js +1 -0
- package/dist/assets/volter-sdk-stories-compose-project-stories-CkSd4Si5.js +1 -0
- package/dist/assets/volter-sdk-stories-scope-Dndn7MD8.js +1 -0
- package/dist/assets/volter-sdk-stories-story-declared-medium-Byi4XWeJ.js +1 -0
- package/dist/assets/volter-sdk-stories-story-dom-runtime-BS1VPvJ6.js +1 -0
- package/dist/assets/volter-sdk-stories-story-grouping-CpNh4cUf.js +1 -0
- package/dist/assets/volter-sdk-story-document-openers-Ba5jQqay.js +1 -0
- package/dist/assets/volter-sdk-surface-state-BhQ45ars.js +1 -0
- package/dist/assets/volter-sdk-tab-census-D0r0s37y.js +1 -0
- package/dist/assets/volter-sdk-tool-contribution-convention-JCXL6f2w.js +1 -0
- package/dist/assets/volter-sdk-transform-mode-request-Cwk_Kyty.js +1 -0
- package/dist/assets/volter-sdk-transient-hint-BOfFzAV8.js +1 -0
- package/dist/assets/volter-sdk-types-CkT8l5N_.js +1 -0
- package/dist/assets/volter-sdk-ui-source-file-region-resolver-Cfza3eEl.js +1 -0
- package/dist/assets/volter-sdk-ui-source-inspect-CEjmAN75.js +1 -0
- package/dist/assets/volter-sdk-ui-source-source-write-backend-0njgRdI6.js +1 -0
- package/dist/assets/volter-sdk-ui-source-tier-source-write-backend-CpsxorYU.js +1 -0
- package/dist/assets/volter-sdk-viewport-activation-timings-B3hRTu3A.js +1 -0
- package/dist/assets/volter-sdk-viewport-editor-controls-DDBd-VqO.js +1 -0
- package/dist/assets/volter-sdk-viewport-presentation-DRhiAH1h.js +1 -0
- package/dist/assets/volter-sdk-volter-contributions-nlGXjgJZ.js +1 -0
- package/dist/assets/volter-sdk-wait-until-CMvYQmO8.js +1 -0
- package/dist/assets/volter-sdk-widgets-design-system-BJOyO8sO.js +1 -0
- package/dist/assets/volter-sdk-widgets-editor-appearance-eVtkxsIm.js +1 -0
- package/dist/assets/volter-sdk-widgets-editor-material-BoQP_5SK.js +1 -0
- package/dist/assets/volter-sdk-widgets-icon-set-registry-CP0D74kc.js +1 -0
- package/dist/assets/volter-sdk-widgets-index-De34FpYu.js +1 -0
- package/dist/assets/volter-sdk-widgets-inspector-widgets-AlignmentGrid-_GjMjIGb.js +1 -0
- package/dist/assets/volter-sdk-widgets-inspector-widgets-AssetSlotPicker-B7vN7BEd.js +1 -0
- package/dist/assets/volter-sdk-widgets-inspector-widgets-BorderEditor-E2J8cpyT.js +1 -0
- package/dist/assets/volter-sdk-widgets-inspector-widgets-ColorPicker-D6TERGKs.js +1 -0
- package/dist/assets/volter-sdk-widgets-inspector-widgets-CurveEditor-CXR8n-CA.js +1 -0
- package/dist/assets/volter-sdk-widgets-inspector-widgets-FilterEditor-CDvfWY4Q.js +1 -0
- package/dist/assets/volter-sdk-widgets-inspector-widgets-FontPicker-BgpW8FW8.js +1 -0
- package/dist/assets/volter-sdk-widgets-inspector-widgets-GradientEditor-DOOBkXjY.js +1 -0
- package/dist/assets/volter-sdk-widgets-inspector-widgets-ScrubbableInput-1NXWR_gB.js +1 -0
- package/dist/assets/volter-sdk-widgets-inspector-widgets-ShadowEditor-Cd2-HwFn.js +1 -0
- package/dist/assets/volter-sdk-widgets-inspector-widgets-color-utils-C4HuSjFu.js +1 -0
- package/dist/assets/volter-sdk-widgets-inspector-widgets-curve-utils-DUU2CCtc.js +1 -0
- package/dist/assets/volter-sdk-widgets-inspector-widgets-index-D5kwrOUQ.js +1 -0
- package/dist/assets/volter-sdk-widgets-inspector-widgets-shared-CkFN2SUn.js +1 -0
- package/dist/assets/volter-sdk-widgets-interactive-edit-scope-DynpKMMZ.js +1 -0
- package/dist/assets/volter-sdk-widgets-palette-colors-DhL1I42R.js +1 -0
- package/dist/assets/volter-sdk-widgets-patterns-Dialog-EUtcZi0Y.js +1 -0
- package/dist/assets/volter-sdk-widgets-patterns-Fields-Bl_eaBej.js +1 -0
- package/dist/assets/volter-sdk-widgets-patterns-List--NE_1N5-.js +1 -0
- package/dist/assets/volter-sdk-widgets-patterns-StateSurface-BHXpv7qi.js +1 -0
- package/dist/assets/volter-sdk-widgets-patterns-Surfaces-BdKa5HGV.js +1 -0
- package/dist/assets/volter-sdk-widgets-patterns-Tabs-sFV7f1UP.js +1 -0
- package/dist/assets/volter-sdk-widgets-patterns-Toolbar-CIr5Cs49.js +1 -0
- package/dist/assets/volter-sdk-widgets-patterns-Tree-C2YHfddf.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-AnchoredMenu-DCclspnW.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-Button-B0YxR4ea.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-ColorInput-B1_SLTuc.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-DraftTextInput-CpHzPdt8.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-EditorIcon-Dw4knhya.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-FormControls-BAbRanmE.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-HoverPreview-Cj7jKNd4.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-JsonInput-C0DCI5bE.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-Layout-gT4Z6mtt.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-Menu-9EESAp9m.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-NumberInput-Dk-5zqJ8.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-Panel-BQWJF-Pb.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-SectionHeader-DXvmafCK.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-Text-yBrdWK2w.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-ThemeRootPortal-CRhefpUL.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-Tooltip-D5Kcb-ZC.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-Vec3Input-DiG6PEIe.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-clamp-to-viewport-DhnSxXVK.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-editor-icons-e65mgyAk.js +1 -0
- package/dist/assets/volter-sdk-widgets-primitives-panel-header-styles-BVL0mN8g.js +1 -0
- package/dist/assets/volter-sdk-widgets-theme-C-_RU9Ov.js +1 -0
- package/dist/assets/volter-sdk-widgets-z-index-CrJJXeKL.js +1 -0
- package/dist/assets/volter-sdk-worker-call-metrics-BTfmngck.js +1 -0
- package/dist/assets/volter-sdk-workspace-core-utilities-DtHGK9PF.js +1 -0
- package/dist/assets/volter-sdk-workspace-document-ids-COULA7c6.js +1 -0
- package/dist/assets/volter-sdk-workspace-document-registry-6m5csVP7.js +1 -0
- package/dist/assets/volter-sdk-workspace-document-restore-M8ifJMou.js +1 -0
- package/dist/assets/volter-sdk-workspace-host-commands-8Qzej--P.js +1 -0
- package/dist/assets/volter-sdk-workspace-static-panels-Ckk7qUuS.js +1 -0
- package/dist/assets/volter-sdk-workspace-status-registry-BdU0dZAt.js +1 -0
- package/dist/assets/volter-sdk-workspace-utility-registry-BHxymD2l.js +1 -0
- package/dist/assets/volter-sdk-world-canvas-viewport-state-CHO8s9gE.js +1 -0
- package/dist/assets/volter-sdk-world-pan-state-C-9xgzAh.js +1 -0
- package/dist/assets/volter-sdk-write-pipe-CJHg7J4i.js +1 -0
- package/dist/assets/volter-shared-fontawesome-BEv9WEZj.js +1 -0
- package/dist/assets/volter-shared-jsx-dev-runtime-domcKDU3.js +1 -0
- package/dist/assets/volter-shared-jsx-runtime-Cu7pVW-1.js +1 -0
- package/dist/assets/volter-shared-react-BLHga76C.js +1 -0
- package/dist/assets/volter-shared-react-dom-client-vi6WsWu2.js +1 -0
- package/dist/assets/volter-shared-react-dom-kzJVGsQd.js +1 -0
- package/dist/assets/volter-shared-three-BWbOWtM5.js +4220 -0
- package/dist/assets/volter-shared-three-core-DEsIwtOu.js +9 -0
- package/dist/volter-shared-modules.json +227 -0
- package/dist/volter-shared-react.json +6 -6
- package/dist/volter-shared-three.json +2 -1
- package/dist-node/cli.js +2962 -6245
- package/dist-node/create.js +350 -278
- package/package.json +51 -31
- package/src/index.ts +4 -6
- package/src/product-id.d.ts +4 -0
- package/src/styles/maya.style.ts +14 -0
- package/src/styles/substance.style.ts +15 -0
- package/starter/AGENTS.md +216 -156
- package/starter/cube.py +3 -9
- package/starter/film/boards/title.png +0 -0
- package/starter/film/cut.json +12 -0
- package/starter/film/film.json +7 -0
- package/starter/film/music/.gitkeep +0 -0
- package/starter/film/music.json +4 -0
- package/starter/film/script.fountain +16 -0
- package/starter/film/shots.json +26 -0
- package/starter/film/sounds/whoosh.wav +0 -0
- package/starter/film/src/graphics/title.css +33 -0
- package/starter/film/src/graphics/title.stories.tsx +6 -0
- package/starter/film/src/graphics/title.tsx +14 -0
- package/starter/film/src/models/opening.blend +0 -0
- package/starter/film/src/models/opening.py +87 -0
- package/starter/film/story.md +14 -0
- package/starter/film/takes/.gitkeep +0 -0
- package/starter/film/takes.json +4 -0
- package/starter/film-skills/film-cut/SKILL.md +31 -0
- package/starter/film-skills/film-shots/SKILL.md +32 -0
- package/starter/film-skills/film-story/SKILL.md +19 -0
- package/starter/game/levels/MainLevel.tsx +24 -0
- package/starter/game/prefabs/ground/Ground.tsx +24 -0
- package/starter/game/prefabs/ground/ground.blend +0 -0
- package/starter/game/prefabs/ground/ground.glb +0 -0
- package/starter/game/prefabs/ground/ground.py +106 -0
- package/starter/package.json +3 -2
- package/starter/sounds/mix.json +10 -0
- package/dist/assets/BVHLoader-V9f-EnYd.js +0 -1
- package/dist/assets/ColladaLoader-Cp-E7iiV.js +0 -3
- package/dist/assets/EntityModelDocument-DxdGehCz.js +0 -1
- package/dist/assets/EnvironmentAssetDocument-DSTdQdSt.js +0 -1
- package/dist/assets/FBXLoader-CpZqH4xx.js +0 -1
- package/dist/assets/InspectorObjectPreview-De6zT2B7.js +0 -1
- package/dist/assets/LiveModuleDocument-Do5YRpzB.js +0 -2
- package/dist/assets/LutAssetDocument-BjZgLVjR.js +0 -1
- package/dist/assets/MTLLoader-JK_iLZsm.js +0 -2
- package/dist/assets/ModelAssetDocument-Bb5UYcrj.js +0 -1
- package/dist/assets/NonThreeAuthoringBootstrap-CVri610U.js +0 -1
- package/dist/assets/OBJLoader-eGO6iVw8.js +0 -5
- package/dist/assets/Object3DDocumentToolbar-C7HT5nHi.js +0 -1
- package/dist/assets/Object3DPreview-CaOEIIdC.js +0 -2
- package/dist/assets/OrbitControls-DrHRrSFA.js +0 -1
- package/dist/assets/PLYLoader-BCSN1tYw.js +0 -2
- package/dist/assets/QuarksAssetDocument-DzS5h2Bc.js +0 -2
- package/dist/assets/RectAreaLightUniformsLib-HqHjURQQ.js +0 -1
- package/dist/assets/STLLoader-vhCvZeOF.js +0 -1
- package/dist/assets/ShaderAssetDocument-DYXX7aw5.js +0 -1
- package/dist/assets/StageHost-DVnv4TcF.js +0 -1179
- package/dist/assets/TDSLoader-DbUHSEO9.js +0 -1
- package/dist/assets/ToolObject3DPreview-Dad57oap.js +0 -1
- package/dist/assets/ViewportShadingMenu-Bl8IlWGh.js +0 -1
- package/dist/assets/animation-mixers.service-qJ4SNabd.js +0 -1
- package/dist/assets/animation-timeline.utility-wNtZO_cS.js +0 -1
- package/dist/assets/anthropic-DwpKRVGM.svg +0 -1
- package/dist/assets/asset-preview-OYr2sUbO.js +0 -4
- package/dist/assets/blender-display-shaders-BpnqnkG8.lut +0 -0
- package/dist/assets/blender-emscripten-engine-CTeOMKcG.js +0 -2
- package/dist/assets/blender-motion-worker-CtT2cV3V.js +0 -1
- package/dist/assets/blender-node-editor.document-pEhp9MZH.js +0 -1
- package/dist/assets/blender-properties-model-B7O1AR0g.js +0 -1
- package/dist/assets/blender-properties-tab-CBdCQseg.js +0 -3
- package/dist/assets/blender-runtime-host-swgDAdoy.js +0 -7221
- package/dist/assets/blender-runtime.document-BbtLLRrN.js +0 -13
- package/dist/assets/blender-screenshot.menu-CD1Bg0Z-.js +0 -1
- package/dist/assets/blender-timeline.document-DT_mWXnn.js +0 -1
- package/dist/assets/blender-uv-editor.document-9j_SUkf7.js +0 -1
- package/dist/assets/blender-version.status-Z13Xgrj-.js +0 -1
- package/dist/assets/blender-wali-engine-kfyCxO_U.js +0 -2
- package/dist/assets/blender.command-zp1Oe3pY.js +0 -1
- package/dist/assets/blender.environment-CG-pC7sk.js +0 -1
- package/dist/assets/blender.keymap-BmOBRY7p.js +0 -1
- package/dist/assets/blender.status-MRiv-9Ju.js +0 -1
- package/dist/assets/blender.style--aBP5V1k.js +0 -1
- package/dist/assets/city-EkhAOo5s.exr +0 -0
- package/dist/assets/courtyard-DqlebbpC.exr +0 -0
- package/dist/assets/forest-P_CQY3b_.exr +0 -0
- package/dist/assets/icon-BkiLD9ed.png +0 -0
- package/dist/assets/index-C8BwtQGN.js +0 -952
- package/dist/assets/interior-Bo_lba15.exr +0 -0
- package/dist/assets/linear-resolve-Cuka7Ypb.js +0 -377
- package/dist/assets/live-mixers-B-bwLZ7c.js +0 -1
- package/dist/assets/model-inspection-DVE8f3Dj.js +0 -1
- package/dist/assets/model.layout-BpZE1W9V.js +0 -1
- package/dist/assets/models.finder-5z7xbsOu.js +0 -1
- package/dist/assets/night-CvV4Gybt.exr +0 -0
- package/dist/assets/object3d-document-session-registry-DDpmVmir.js +0 -2
- package/dist/assets/openai-DHNKzFtc.svg +0 -1
- package/dist/assets/output-pass-j4dAGrPY.js +0 -85
- package/dist/assets/play-live-BBkOuWQn.js +0 -1
- package/dist/assets/product-CUU4-nDZ.js +0 -14
- package/dist/assets/product-DPOIZgKM.css +0 -1
- package/dist/assets/properties-bone-constraints.inspector-D8CtPu9c.js +0 -1
- package/dist/assets/properties-bone.inspector-j9aNQrP9.js +0 -1
- package/dist/assets/properties-collection.inspector-CaMveBur.js +0 -1
- package/dist/assets/properties-constraints.inspector-DB9bBgqn.js +0 -1
- package/dist/assets/properties-data.inspector-C7dh_XTe.js +0 -1
- package/dist/assets/properties-material.inspector-DWC5NJkW.js +0 -1
- package/dist/assets/properties-modifiers.inspector-CBUxUSB0.js +0 -1
- package/dist/assets/properties-object.inspector-wvO8nuGD.js +0 -1
- package/dist/assets/properties-output.inspector-CFyAZn9F.js +0 -1
- package/dist/assets/properties-particles.inspector-zEaTW3U7.js +0 -1
- package/dist/assets/properties-physics.inspector-CO-4UZbX.js +0 -1
- package/dist/assets/properties-render.inspector-DoJ1BMKP.js +0 -1
- package/dist/assets/properties-scene.inspector-BOhaiC0_.js +0 -1
- package/dist/assets/properties-texture.inspector-1JoYUWiR.js +0 -1
- package/dist/assets/properties-view-layer.inspector-DuRkFWtq.js +0 -1
- package/dist/assets/properties-world.inspector-Csfv-x0A.js +0 -1
- package/dist/assets/react-18-Dh4gvPqw.js +0 -1
- package/dist/assets/regions-DWeEBnE2.js +0 -1
- package/dist/assets/sculpt.layout-D-K5cLw6.js +0 -1
- package/dist/assets/session-CvHLFvpx.js +0 -6056
- package/dist/assets/shading.layout-CZZHKBer.js +0 -1
- package/dist/assets/sky-precompute-worker-CPGW9t_C.js +0 -1
- package/dist/assets/spark.module-CTTm62aa.js +0 -12120
- package/dist/assets/stage-keyboard-BvTth28t.js +0 -1
- package/dist/assets/stage-overlay-set-Dt6IH1xC.js +0 -1
- package/dist/assets/stage-presence-markers-DszBO9B1.js +0 -1
- package/dist/assets/stage-transform-tools-D6H_SBLV.js +0 -1
- package/dist/assets/standard-viewport-dressing-BSYojdsQ.js +0 -24
- package/dist/assets/studio-CysTBGIb.exr +0 -0
- package/dist/assets/sunrise-Dj0psFrf.exr +0 -0
- package/dist/assets/sunset-Bw3x2Bot.exr +0 -0
- package/dist/assets/texture.layout-DASpHVht.js +0 -1
- package/dist/assets/three-integration.service-DvOyomjh.js +0 -2
- package/dist/assets/three.module-CtVjCPcj.js +0 -3840
- package/dist/assets/uv-editing.layout-A8RA-cbM.js +0 -1
- package/dist/assets/volter-sdk-account-fYMnFHfe.js +0 -1
- package/dist/assets/volter-sdk-client-JmBOIwGe.js +0 -1
- package/dist/assets/volter-sdk-contributions-l9HrPjwW.js +0 -1
- package/dist/assets/volter-sdk-css-numeric-style-ud28AcW3.js +0 -1
- package/dist/assets/volter-sdk-document-probe-C4RhslOI.js +0 -1
- package/dist/assets/volter-sdk-editor-view-B_mScT1w.js +0 -1
- package/dist/assets/volter-sdk-host-B9QOINsX.js +0 -1
- package/dist/assets/volter-sdk-http-transport.browser-6a_cUtge.js +0 -1
- package/dist/assets/volter-sdk-index-DDdgpWqc.js +0 -1
- package/dist/assets/volter-sdk-kit-CapabilityCoverageSection-CRc93EXv.js +0 -1
- package/dist/assets/volter-sdk-kit-account-client-ByjTbat7.js +0 -1
- package/dist/assets/volter-sdk-kit-action-registry-J5l20B9X.js +0 -1
- package/dist/assets/volter-sdk-kit-active-product-BTHzjkrh.js +0 -1
- package/dist/assets/volter-sdk-kit-active-project-CgXmYhKx.js +0 -1
- package/dist/assets/volter-sdk-kit-adapter-editor-config-CcSGBUF1.js +0 -1
- package/dist/assets/volter-sdk-kit-adapter-module-CqkP49hA.js +0 -1
- package/dist/assets/volter-sdk-kit-adapter-observation-MWNd8Bmj.js +0 -1
- package/dist/assets/volter-sdk-kit-animation-animation-clock-C5QhnLuY.js +0 -1
- package/dist/assets/volter-sdk-kit-animation-stage-transport-DFbbJ80P.js +0 -1
- package/dist/assets/volter-sdk-kit-api-assets-Dtg4_1jX.js +0 -1
- package/dist/assets/volter-sdk-kit-api-base-De8oXkY8.js +0 -1
- package/dist/assets/volter-sdk-kit-api-build-Cgmw35Ng.js +0 -1
- package/dist/assets/volter-sdk-kit-api-logs-B1mQlcPQ.js +0 -1
- package/dist/assets/volter-sdk-kit-api-project-identity-DEZz1U5_.js +0 -1
- package/dist/assets/volter-sdk-kit-api-project-open-DuXZ6vyn.js +0 -1
- package/dist/assets/volter-sdk-kit-api-project-source-DMnPoTP2.js +0 -1
- package/dist/assets/volter-sdk-kit-api-project-state-6Lu0Vxdr.js +0 -1
- package/dist/assets/volter-sdk-kit-api-relay-BuCkenvE.js +0 -1
- package/dist/assets/volter-sdk-kit-api-settings-CkFO_pMP.js +0 -1
- package/dist/assets/volter-sdk-kit-api-themes-D5J6TiAR.js +0 -1
- package/dist/assets/volter-sdk-kit-api-worktrees-de1U7-9B.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-capabilities-IBJRDoU_.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-compare-core-qeWQI0-1.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-editor-context-JZ2T8xhF.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-events-wfq-jH9_.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-inspector-actions-NlF3CeMC.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-selection-BUXGqut1.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-selection-viewer-registry-DNj4RggW.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-thumbnails-CPp1sS_w.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-viewers-PKilU3Lm.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-workflow-asset-import-jobs-DHDfKVAJ.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-workflow-asset-ledger-Ch0TDXil.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-workflow-asset-ledger-backend-Cb0-daSo.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-workflow-asset-materialization-report-Bznr7T6d.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-workflow-asset-pack-manifest-BriZZqYC.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-workflow-audio-preview-player-5K3HN4kg.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-workflow-audio-waveform-F65PsmIZ.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-workflow-cloud-asset-client-DzxVbaeb.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-workflow-hosted-asset-materialization-B2Oxd31D.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-workflow-image-view-scale-BmPO24SY.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-workflow-ledger-write-lock-BPRq-xQf.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-workflow-pixi-spritesheet-CM64IwuA.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-workflow-preview-resource-lifetime-BIKxorKS.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-workflow-project-asset-commands-7CNTmzBZ.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-workflow-project-content-C3EJl866.js +0 -1
- package/dist/assets/volter-sdk-kit-asset-workflow-thumbnail-system-CQrbYiAp.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-active-adapter-BC9Cf4yx.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-active-systems-GZm33tOS.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-adapter-key-C4-d6xt1.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-authoring-asset-url-CEEw_XEg.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-bootstrap-state-BJsS0bnj.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-boundary-authoring-adapter-1NA63Idp.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-canvas-scene-guides-BlbGyg38.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-composite-authoring-adapter-D0FSf6DM.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-consumer-actions-J7MnHWK3.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-design-time-layers-CnLS2erF.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-design-time-mount-registry-BrmHkPuP.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-edit-mode-authoring-HQAxbCiB.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-empty-project-authoring-CdLSRvO0.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-instance-source-menu-EWM45v6y.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-layered-pick-BX3K3GR7.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-mounted-root-subjects-BGatqFLR.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-no-authoring-adapter-CerY6qmy.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-object3d-document-persistence-DxZ-V-ys.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-panel-authoring-Bbv7lJc5.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-project-authoring-session-C5rP-I6e.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-provenance-BNVk0DFH.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-react-canvas-navigation-BqUskgSb.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-react-design-canvas-style-DB8S6Vfi.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-react-story-board-M-VqCWKu.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-seam-evidence-Qbbz8M6t.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-selection-scope-CkblMrR8.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-shell-document-ops-B9Y9p91j.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-story-board-chrome-fit-7umaPaVS.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-three-root-M5Gj55-Z.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-viewport-tool-context-CH5NA-YI.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-viewport-tool-owner-CzTEMmzx.js +0 -1
- package/dist/assets/volter-sdk-kit-authoring-world-session-state-BjKbimsg.js +0 -1
- package/dist/assets/volter-sdk-kit-availability-tick-C7I6Zrut.js +0 -1
- package/dist/assets/volter-sdk-kit-bitmap-label-DPmffd8g.js +0 -1
- package/dist/assets/volter-sdk-kit-boot-routing-CaKypcBx.js +0 -1
- package/dist/assets/volter-sdk-kit-breakpoint-state-5m0qTYvY.js +0 -1
- package/dist/assets/volter-sdk-kit-build-identity-HQ0VWGG8.js +0 -1
- package/dist/assets/volter-sdk-kit-bytes-codec-BJDqylNg.js +0 -1
- package/dist/assets/volter-sdk-kit-cancellation-reason-B0z-IzQ9.js +0 -1
- package/dist/assets/volter-sdk-kit-canvas-frames-BtkS3lNe.js +0 -1
- package/dist/assets/volter-sdk-kit-capture-camera-pose-CUejcTcV.js +0 -1
- package/dist/assets/volter-sdk-kit-capture-size-Uyb3uqXA.js +0 -1
- package/dist/assets/volter-sdk-kit-chrome-registry-cc3AZlnV.js +0 -1
- package/dist/assets/volter-sdk-kit-chrome-slot-registry-C4g-na11.js +0 -1
- package/dist/assets/volter-sdk-kit-collaboration-client-Cd6918QC.js +0 -1
- package/dist/assets/volter-sdk-kit-collaboration-presence-qXC7JfS2.js +0 -1
- package/dist/assets/volter-sdk-kit-command-dispatch-D07Pn7pe.js +0 -1
- package/dist/assets/volter-sdk-kit-command-listener-Bm2sgP0i.js +0 -1
- package/dist/assets/volter-sdk-kit-command-registry-CJoVRu6V.js +0 -1
- package/dist/assets/volter-sdk-kit-component-board-registry-D7xm8cFr.js +0 -1
- package/dist/assets/volter-sdk-kit-component-states-registry-DtippeT3.js +0 -1
- package/dist/assets/volter-sdk-kit-components-AlignToolbar-BporX2iz.js +0 -1
- package/dist/assets/volter-sdk-kit-components-ApplicationMenus-DfmKRYtb.js +0 -1
- package/dist/assets/volter-sdk-kit-components-AssetEditorShell-B-_vx-Jb.js +0 -1
- package/dist/assets/volter-sdk-kit-components-AssetInspectorToolSection-CyEcoLKv.js +0 -1
- package/dist/assets/volter-sdk-kit-components-BoardRulers-CjoDr2Ak.js +0 -1
- package/dist/assets/volter-sdk-kit-components-CanvasAddNodeDialogs-Bz4W0Y2g.js +0 -1
- package/dist/assets/volter-sdk-kit-components-CanvasSceneViewport-Cyd5bYha.js +0 -1
- package/dist/assets/volter-sdk-kit-components-ChromeSlot-q_wsahlZ.js +0 -1
- package/dist/assets/volter-sdk-kit-components-CodeView-COOHbFef.js +0 -1
- package/dist/assets/volter-sdk-kit-components-CompactInspectorShell-F5yS9e4v.js +0 -1
- package/dist/assets/volter-sdk-kit-components-ConsolePanel-Dnnq15qj.js +0 -1
- package/dist/assets/volter-sdk-kit-components-GameplaySessionTimeline-CFCva8sQ.js +0 -1
- package/dist/assets/volter-sdk-kit-components-InspectionProjection-Cj0eqFPF.js +0 -1
- package/dist/assets/volter-sdk-kit-components-Inspector-DhnEEQ_5.js +0 -1
- package/dist/assets/volter-sdk-kit-components-InspectorCanvasPreview-ljsWq41X.js +0 -1
- package/dist/assets/volter-sdk-kit-components-InspectorFieldsSection-pUp0DKhG.js +0 -1
- package/dist/assets/volter-sdk-kit-components-InspectorStoriesSection-BJKmp0B3.js +0 -1
- package/dist/assets/volter-sdk-kit-components-InspectorToolSection-DBDxp3Ir.js +0 -1
- package/dist/assets/volter-sdk-kit-components-InspectorTransformSection-eGVZo2ph.js +0 -1
- package/dist/assets/volter-sdk-kit-components-LightExplorerPanel-jKqvAsdL.js +0 -1
- package/dist/assets/volter-sdk-kit-components-MediaProperties-DEn9gV9T.js +0 -1
- package/dist/assets/volter-sdk-kit-components-ProjectHeader-CtsMXibh.js +0 -1
- package/dist/assets/volter-sdk-kit-components-ReactCanvasControls-Bdu_gdRF.js +0 -1
- package/dist/assets/volter-sdk-kit-components-RootSelectionOverlay-8PYXBIYy.js +0 -1
- package/dist/assets/volter-sdk-kit-components-RootTextEditor-DFkpwNlX.js +0 -1
- package/dist/assets/volter-sdk-kit-components-SaveStatus-BP1Q1tfu.js +0 -1
- package/dist/assets/volter-sdk-kit-components-SurfaceCrashBoundary-C_FxlEvS.js +0 -1
- package/dist/assets/volter-sdk-kit-components-SurfaceStateOverlay-C_O4-zsY.js +0 -1
- package/dist/assets/volter-sdk-kit-components-ToolContributionSurfaces-DAoNJ2KS.js +0 -1
- package/dist/assets/volter-sdk-kit-components-ToolHost-z-CSuvra.js +0 -1
- package/dist/assets/volter-sdk-kit-components-Toolbar-CUsODOE2.js +0 -1
- package/dist/assets/volter-sdk-kit-components-TransientHint-BsejPKYD.js +0 -1
- package/dist/assets/volter-sdk-kit-components-VersionControlSection-ldwCuasW.js +0 -1
- package/dist/assets/volter-sdk-kit-components-ViewportOverlaysMenu-DjfcwDPM.js +0 -1
- package/dist/assets/volter-sdk-kit-components-VolterLogo-wmAjAypV.js +0 -1
- package/dist/assets/volter-sdk-kit-components-WorktreeSwitcher-JN-eaFqo.js +0 -1
- package/dist/assets/volter-sdk-kit-components-account-documents-BcgknOsj.js +0 -1
- package/dist/assets/volter-sdk-kit-components-asset-documents-B2W4TjZO.js +0 -1
- package/dist/assets/volter-sdk-kit-components-asset-editor-persistence-NTgC5Ngq.js +0 -1
- package/dist/assets/volter-sdk-kit-components-asset-selection-section-CLS4gJUE.js +0 -1
- package/dist/assets/volter-sdk-kit-components-asset-thumbnails-CaYPgAtN.js +0 -1
- package/dist/assets/volter-sdk-kit-components-asset-viewers-AudioViewer-DbLUYMKF.js +0 -1
- package/dist/assets/volter-sdk-kit-components-asset-viewers-GenericJsonViewer-B3ieuK68.js +0 -1
- package/dist/assets/volter-sdk-kit-components-asset-viewers-ImageViewer-DicJ06Cl.js +0 -1
- package/dist/assets/volter-sdk-kit-components-asset-viewers-JsonAssetDocument-DRBY_95W.js +0 -1
- package/dist/assets/volter-sdk-kit-components-asset-viewers-OnlineAssetDetail-BR14tR5R.js +0 -1
- package/dist/assets/volter-sdk-kit-components-asset-viewers-SourceAssetViewer-BI9bFeTE.js +0 -1
- package/dist/assets/volter-sdk-kit-components-asset-viewers-SpritesheetSpriteView-d7Wqtjxk.js +0 -1
- package/dist/assets/volter-sdk-kit-components-asset-viewers-VideoViewer-Ykl90edA.js +0 -1
- package/dist/assets/volter-sdk-kit-components-asset-viewers-shader-source-BmwRhUts.js +0 -1
- package/dist/assets/volter-sdk-kit-components-board-guides-Dw7AT-AY.js +0 -1
- package/dist/assets/volter-sdk-kit-components-canvas-scene-hotkeys-s3AK_b58.js +0 -1
- package/dist/assets/volter-sdk-kit-components-canvas-temporary-pivot-DKdXJcd9.js +0 -1
- package/dist/assets/volter-sdk-kit-components-core-utilities-C5ZKnxiW.js +0 -1
- package/dist/assets/volter-sdk-kit-components-inspector-preview-section-BHsR6Ljx.js +0 -1
- package/dist/assets/volter-sdk-kit-components-inspector-revert-label-BcItYP-3.js +0 -1
- package/dist/assets/volter-sdk-kit-components-inspector-selection-DnVCu9NI.js +0 -1
- package/dist/assets/volter-sdk-kit-components-inspector-stories-gating-BbWmsm9H.js +0 -1
- package/dist/assets/volter-sdk-kit-components-inspector-transform-BCj8sqj5.js +0 -1
- package/dist/assets/volter-sdk-kit-components-inspector-transform-subject-DmyQlGz0.js +0 -1
- package/dist/assets/volter-sdk-kit-components-kind-documents-BECHMIFC.js +0 -1
- package/dist/assets/volter-sdk-kit-components-primitives-DraftColorInput-BB28QlBb.js +0 -1
- package/dist/assets/volter-sdk-kit-components-project-tool-documents-CrMMOzM5.js +0 -1
- package/dist/assets/volter-sdk-kit-components-scene-documents-B3yfDsBz.js +0 -1
- package/dist/assets/volter-sdk-kit-components-status-contributions-CDzNj8Hu.js +0 -1
- package/dist/assets/volter-sdk-kit-components-tool-documents-BpEG-ABF.js +0 -1
- package/dist/assets/volter-sdk-kit-components-tool-schema-form-BOiPCwKc.js +0 -1
- package/dist/assets/volter-sdk-kit-components-use-after-paint-AcvAjLMf.js +0 -1
- package/dist/assets/volter-sdk-kit-components-use-project-image-assets-CRFbWY4e.js +0 -1
- package/dist/assets/volter-sdk-kit-components-workspace-history-DTgNtIrO.js +0 -1
- package/dist/assets/volter-sdk-kit-components-world-documents-N9ea5nLy.js +0 -1
- package/dist/assets/volter-sdk-kit-components-world-overlay-gestures-CvVXrTkV.js +0 -1
- package/dist/assets/volter-sdk-kit-composite-screenshot-BsiNQIxC.js +0 -1
- package/dist/assets/volter-sdk-kit-content-entry-source-registry-BX8YW40L.js +0 -1
- package/dist/assets/volter-sdk-kit-contribution-surfaces-CMblNYDG.js +0 -1
- package/dist/assets/volter-sdk-kit-coverage-canvas-reveal-BtPYs0AY.js +0 -1
- package/dist/assets/volter-sdk-kit-coverage-design-time-surfaces-BCRK-uUC.js +0 -1
- package/dist/assets/volter-sdk-kit-coverage-ontology-invariants-3YuOn0LN.js +0 -1
- package/dist/assets/volter-sdk-kit-coverage-session-vitals-BpsIwBM0.js +0 -1
- package/dist/assets/volter-sdk-kit-creation-site-registry-C1_mEFTL.js +0 -1
- package/dist/assets/volter-sdk-kit-delegate-harness-registry-V07K9odj.js +0 -1
- package/dist/assets/volter-sdk-kit-document-areas-TQELDKqa.js +0 -1
- package/dist/assets/volter-sdk-kit-document-context-registry-BaPLLOGQ.js +0 -1
- package/dist/assets/volter-sdk-kit-document-open-registry-D-zxkb7y.js +0 -1
- package/dist/assets/volter-sdk-kit-document-play-extension-F8i5xdiU.js +0 -1
- package/dist/assets/volter-sdk-kit-document-preview-source-DgDf2lpD.js +0 -1
- package/dist/assets/volter-sdk-kit-document-renderer-session-YWnbpDFE.js +0 -1
- package/dist/assets/volter-sdk-kit-document-stage-sessions-BKZBGbit.js +0 -1
- package/dist/assets/volter-sdk-kit-document-viewports-DNuE6MQl.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-api-DZDj3o86.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-chrome-capture-De6DmSgV.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-commands-CImZE1nE.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-console-nzCbsR0U.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-current-view-POB-DPkt.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-document-probe-B5tRXCfR.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-git-client-SsYoNC6J.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-hotkeys-B4ocILot.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-lease-CBvYmCsH.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-lease-view-DVuaJEec.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-mode-B2vWMS-_.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-notifications-DgsalU9q.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-presence-BQiXcYKf.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-presentation-activity-DO7YpI0H.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-presentation-notice-BZtrnX57.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-runtime-C8mqfYkM.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-server-response-qipqMDto.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-session-attribution-_PNhRyeQ.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-session-mode-BcDn3FZY.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-state-facets-3r455vYW.js +0 -1
- package/dist/assets/volter-sdk-kit-editor-view-presentation-Dovw_-H_.js +0 -1
- package/dist/assets/volter-sdk-kit-environment-images-DNJU9lPC.js +0 -1
- package/dist/assets/volter-sdk-kit-eyedropper-session-DJMkT_IO.js +0 -1
- package/dist/assets/volter-sdk-kit-files-file-provider-BnmRHNTp.js +0 -1
- package/dist/assets/volter-sdk-kit-files-project-files-CiKUZlIY.js +0 -1
- package/dist/assets/volter-sdk-kit-finders-index-qZKU8xjn.js +0 -1
- package/dist/assets/volter-sdk-kit-finders-scenes-from-entrypoint-selection-DBTnLBhQ.js +0 -1
- package/dist/assets/volter-sdk-kit-frame-frame-parts-DY-_uCea.js +0 -1
- package/dist/assets/volter-sdk-kit-framed-document-capture-CsprF9Ct.js +0 -1
- package/dist/assets/volter-sdk-kit-game-surface-defaults-Dz1sExNZ.js +0 -1
- package/dist/assets/volter-sdk-kit-gameplay-export-state-BwkWHkY-.js +0 -1
- package/dist/assets/volter-sdk-kit-gameplay-replay-CgF6vM6H.js +0 -1
- package/dist/assets/volter-sdk-kit-gameplay-session-time-BrdLX9MN.js +0 -1
- package/dist/assets/volter-sdk-kit-gameplay-sessions-0YRBcIBD.js +0 -1
- package/dist/assets/volter-sdk-kit-hierarchy-component-marks-pwxcueeL.js +0 -1
- package/dist/assets/volter-sdk-kit-hierarchy-internals-qxAC9Yyz.js +0 -1
- package/dist/assets/volter-sdk-kit-hierarchy-kind-icon-Bguy3R2P.js +0 -1
- package/dist/assets/volter-sdk-kit-hierarchy-menu-registry-CQ_dm6ZG.js +0 -1
- package/dist/assets/volter-sdk-kit-hierarchy-node-rows-BJliwGW1.js +0 -1
- package/dist/assets/volter-sdk-kit-hierarchy-panel-view-C6zK-ewB.js +0 -1
- package/dist/assets/volter-sdk-kit-hierarchy-projection-q1LvhfSm.js +0 -1
- package/dist/assets/volter-sdk-kit-hierarchy-row-media-jZ989Tvr.js +0 -1
- package/dist/assets/volter-sdk-kit-hierarchy-row-model-BmrBiFlP.js +0 -1
- package/dist/assets/volter-sdk-kit-hierarchy-rows-BMI3XBi-.js +0 -1
- package/dist/assets/volter-sdk-kit-hierarchy-walk-oEWRF-Iz.js +0 -1
- package/dist/assets/volter-sdk-kit-history-editor-session-CdficO7Z.js +0 -1
- package/dist/assets/volter-sdk-kit-history-history-commands-D7VwYk3h.js +0 -1
- package/dist/assets/volter-sdk-kit-history-history-delegate-DgIAPV-4.js +0 -1
- package/dist/assets/volter-sdk-kit-history-history-limit-notices-Bu07tHVz.js +0 -1
- package/dist/assets/volter-sdk-kit-history-history-service-BzbUb6oV.js +0 -1
- package/dist/assets/volter-sdk-kit-history-persistence-coordinator-DuWeeacm.js +0 -1
- package/dist/assets/volter-sdk-kit-history-project-file-history-C7m0teYF.js +0 -1
- package/dist/assets/volter-sdk-kit-history-project-root-history-backends-mip7BKbu.js +0 -1
- package/dist/assets/volter-sdk-kit-history-resource-registry-CZoZX7pJ.js +0 -1
- package/dist/assets/volter-sdk-kit-history-snapshot-store-DFlmQKjf.js +0 -1
- package/dist/assets/volter-sdk-kit-history-source-history-backend-C1tXQx-3.js +0 -1
- package/dist/assets/volter-sdk-kit-hmr-registration-group-CdWSrJkL.js +0 -1
- package/dist/assets/volter-sdk-kit-hmr-stable-react-context-B_NNyLJr.js +0 -1
- package/dist/assets/volter-sdk-kit-hotkeys-9UuVecd2.js +0 -1
- package/dist/assets/volter-sdk-kit-inference-diagnostics-Bp6UhMrh.js +0 -1
- package/dist/assets/volter-sdk-kit-initial-project-mIrJ1z4F.js +0 -1
- package/dist/assets/volter-sdk-kit-inspection-active-subject-Ci13od8C.js +0 -1
- package/dist/assets/volter-sdk-kit-inspection-active-surface-BbND9Nn7.js +0 -1
- package/dist/assets/volter-sdk-kit-inspection-compose-subject-Cruyx55P.js +0 -1
- package/dist/assets/volter-sdk-kit-inspection-display-Ckb72SDN.js +0 -1
- package/dist/assets/volter-sdk-kit-inspection-document-subject-Dd7sTsiM.js +0 -1
- package/dist/assets/volter-sdk-kit-inspection-game-subject-Zye7SfKC.js +0 -1
- package/dist/assets/volter-sdk-kit-inspection-model-B6kt5U5M.js +0 -1
- package/dist/assets/volter-sdk-kit-inspection-node-media-3WYK4mrg.js +0 -1
- package/dist/assets/volter-sdk-kit-inspection-null-subject-j5MU6Bqp.js +0 -1
- package/dist/assets/volter-sdk-kit-inspection-serialize-C5ElmYGd.js +0 -1
- package/dist/assets/volter-sdk-kit-inspection-use-active-inspection-Dqr8YOfV.js +0 -1
- package/dist/assets/volter-sdk-kit-inspector-presentation-Bxm_mJug.js +0 -1
- package/dist/assets/volter-sdk-kit-inspector-property-grouping-DGsJwl0r.js +0 -1
- package/dist/assets/volter-sdk-kit-inspector-section-registry-BTw0xKeK.js +0 -1
- package/dist/assets/volter-sdk-kit-instance-source-actions-B_SYfHzK.js +0 -1
- package/dist/assets/volter-sdk-kit-js-heap-CMHIxDFc.js +0 -1
- package/dist/assets/volter-sdk-kit-key-actions-npGWeBwX.js +0 -1
- package/dist/assets/volter-sdk-kit-keymap-presets-Dgo5jMVc.js +0 -1
- package/dist/assets/volter-sdk-kit-layout-policy-D6cqDneT.js +0 -1
- package/dist/assets/volter-sdk-kit-light-explorer-model-D9220Fr3.js +0 -1
- package/dist/assets/volter-sdk-kit-live-canvas-frame-CQvRrTp5.js +0 -1
- package/dist/assets/volter-sdk-kit-live-document-StECWB5n.js +0 -1
- package/dist/assets/volter-sdk-kit-live-gesture-lock-DpKIl8Kh.js +0 -1
- package/dist/assets/volter-sdk-kit-live-seam-evidence-WkwVMDpm.js +0 -1
- package/dist/assets/volter-sdk-kit-live-session-registry-DmaGkq5x.js +0 -1
- package/dist/assets/volter-sdk-kit-live-transition-B5jM4iFM.js +0 -1
- package/dist/assets/volter-sdk-kit-manifest-project-amCdVxUh.js +0 -1
- package/dist/assets/volter-sdk-kit-module-fetch-diagnosis-CpTsYq8x.js +0 -1
- package/dist/assets/volter-sdk-kit-mount-failure-report-DcYXxWwN.js +0 -1
- package/dist/assets/volter-sdk-kit-native-selection-style-bMu0TkER.js +0 -1
- package/dist/assets/volter-sdk-kit-object3d-document-write-policy-DCtXUN3w.js +0 -1
- package/dist/assets/volter-sdk-kit-packaged-runtime-8FNZVNB9.js +0 -1
- package/dist/assets/volter-sdk-kit-performance-profiler-DKuyDNq0.js +0 -1
- package/dist/assets/volter-sdk-kit-performance-sources-CUq2AYlp.js +0 -1
- package/dist/assets/volter-sdk-kit-photograph-notice-CJC3RuIs.js +0 -1
- package/dist/assets/volter-sdk-kit-play-boot-phase-CvmjrYem.js +0 -1
- package/dist/assets/volter-sdk-kit-play-camera-flight-Dp3bYFl4.js +0 -1
- package/dist/assets/volter-sdk-kit-presentation-surface-DDAJLzOO.js +0 -1
- package/dist/assets/volter-sdk-kit-product-command-CevBP_kA.js +0 -1
- package/dist/assets/volter-sdk-kit-project-adapter-DZMJa9qO.js +0 -1
- package/dist/assets/volter-sdk-kit-project-asset-refresh-BlzSWFsZ.js +0 -1
- package/dist/assets/volter-sdk-kit-project-asset-roots-ByJUql0c.js +0 -1
- package/dist/assets/volter-sdk-kit-project-local-state-CzuDIgqm.js +0 -1
- package/dist/assets/volter-sdk-kit-project-manager-KiOTeJwI.js +0 -1
- package/dist/assets/volter-sdk-kit-project-module-changes-BDLfMwF6.js +0 -1
- package/dist/assets/volter-sdk-kit-project-module-split-DVZB3699.js +0 -1
- package/dist/assets/volter-sdk-kit-project-provenance-GZJY3tis.js +0 -1
- package/dist/assets/volter-sdk-kit-project-ready-EtjRqua9.js +0 -1
- package/dist/assets/volter-sdk-kit-project-shape-Jb91qwQJ.js +0 -1
- package/dist/assets/volter-sdk-kit-project-tools-n1IzvKJM.js +0 -1
- package/dist/assets/volter-sdk-kit-readiness-j18YadCv.js +0 -1
- package/dist/assets/volter-sdk-kit-renderer-resource-counts-BjvWDcz5.js +0 -1
- package/dist/assets/volter-sdk-kit-reported-play-state-BdYUBkLM.js +0 -1
- package/dist/assets/volter-sdk-kit-resolve-contributed-command-7ZIwPRlj.js +0 -1
- package/dist/assets/volter-sdk-kit-resolve-relative-specifier-BEqx2z44.js +0 -1
- package/dist/assets/volter-sdk-kit-retained-document-states-BWSvbm_C.js +0 -1
- package/dist/assets/volter-sdk-kit-scene-document-plan-B8Q6NbgU.js +0 -1
- package/dist/assets/volter-sdk-kit-scene-live-open-PVToaH1e.js +0 -1
- package/dist/assets/volter-sdk-kit-scoped-game-css-DOF-inf1.js +0 -1
- package/dist/assets/volter-sdk-kit-served-url-C3OFjtsJ.js +0 -1
- package/dist/assets/volter-sdk-kit-session-close-CfqKNfrE.js +0 -1
- package/dist/assets/volter-sdk-kit-session-tombstone-wgZaXyq-.js +0 -1
- package/dist/assets/volter-sdk-kit-settings-settings-provider-CkU3sFW7.js +0 -1
- package/dist/assets/volter-sdk-kit-settings-store-vv_SoMfR.js +0 -1
- package/dist/assets/volter-sdk-kit-shell-store-DTExcaKL.js +0 -1
- package/dist/assets/volter-sdk-kit-shell-store-door-Y-FBGkmI.js +0 -1
- package/dist/assets/volter-sdk-kit-source-conflict-CnIJpwkZ.js +0 -1
- package/dist/assets/volter-sdk-kit-stage-context-q9FWjN1-.js +0 -1
- package/dist/assets/volter-sdk-kit-stage-invalidation-43bhizXB.js +0 -1
- package/dist/assets/volter-sdk-kit-stage-store-registry-BQo-SIuU.js +0 -1
- package/dist/assets/volter-sdk-kit-startup-failure-B7USi1FF.js +0 -1
- package/dist/assets/volter-sdk-kit-state-report-deferral-Cur6y3FE.js +0 -1
- package/dist/assets/volter-sdk-kit-storage-host-files-storage-C9d8xXNc.js +0 -1
- package/dist/assets/volter-sdk-kit-storage-http-storage-MuV46OcN.js +0 -1
- package/dist/assets/volter-sdk-kit-storage-index-CcMXaj5N.js +0 -1
- package/dist/assets/volter-sdk-kit-storage-mem-storage-CaZsvmox.js +0 -1
- package/dist/assets/volter-sdk-kit-storage-path-lock-ClaJ7vSM.js +0 -1
- package/dist/assets/volter-sdk-kit-storage-paths-Ci2ZChlj.js +0 -1
- package/dist/assets/volter-sdk-kit-stories-StoryPreviewMount-OjN0fncW.js +0 -1
- package/dist/assets/volter-sdk-kit-stories-compose-project-stories-BlKWWJmk.js +0 -1
- package/dist/assets/volter-sdk-kit-stories-prefabs-finder-CcmeyBzg.js +0 -1
- package/dist/assets/volter-sdk-kit-stories-prefabs-from-stories-CA_oKZKb.js +0 -1
- package/dist/assets/volter-sdk-kit-stories-project-story-regions-CFAyIdjW.js +0 -1
- package/dist/assets/volter-sdk-kit-stories-scope-XvZpLAc5.js +0 -1
- package/dist/assets/volter-sdk-kit-stories-story-capture-K4eH6MMa.js +0 -1
- package/dist/assets/volter-sdk-kit-stories-story-declared-medium-e8MXBoO_.js +0 -1
- package/dist/assets/volter-sdk-kit-stories-story-discovery-DViKEE-J.js +0 -1
- package/dist/assets/volter-sdk-kit-stories-story-dom-runtime-DdlXu5tN.js +0 -1
- package/dist/assets/volter-sdk-kit-stories-story-grouping-BbgkS2Kl.js +0 -1
- package/dist/assets/volter-sdk-kit-stories-story-presentation-Bw39PGHN.js +0 -1
- package/dist/assets/volter-sdk-kit-stories-story-registry-DpouLkjB.js +0 -1
- package/dist/assets/volter-sdk-kit-story-document-openers-DckbFGIr.js +0 -1
- package/dist/assets/volter-sdk-kit-story-thumbnails-ruZKvQPb.js +0 -1
- package/dist/assets/volter-sdk-kit-surface-keyboard-ChQta2gu.js +0 -1
- package/dist/assets/volter-sdk-kit-surface-state-CUbH0mE7.js +0 -1
- package/dist/assets/volter-sdk-kit-system-seam-evidence-hHuyimda.js +0 -1
- package/dist/assets/volter-sdk-kit-tab-census-BKO-Cotm.js +0 -1
- package/dist/assets/volter-sdk-kit-tab-lifecycle-client--HEzpfrP.js +0 -1
- package/dist/assets/volter-sdk-kit-theme-library-cooHZE2t.js +0 -1
- package/dist/assets/volter-sdk-kit-theme-preference-BfzIz8X4.js +0 -1
- package/dist/assets/volter-sdk-kit-three-viewport-presentation-DJQ6GD49.js +0 -1
- package/dist/assets/volter-sdk-kit-tool-contribution-play-B1vfLya9.js +0 -1
- package/dist/assets/volter-sdk-kit-tool-loader-C_B2N1As.js +0 -1
- package/dist/assets/volter-sdk-kit-transform-mode-request-tOzI-V8h.js +0 -1
- package/dist/assets/volter-sdk-kit-transient-hint-qly8UT5T.js +0 -1
- package/dist/assets/volter-sdk-kit-transport-strip-CrqMX70b.js +0 -1
- package/dist/assets/volter-sdk-kit-ui-source-file-region-resolver-CjFRrSBS.js +0 -1
- package/dist/assets/volter-sdk-kit-ui-source-inspect-CPbxbbEw.js +0 -1
- package/dist/assets/volter-sdk-kit-ui-source-source-write-backend-Ci45ai4Y.js +0 -1
- package/dist/assets/volter-sdk-kit-ui-source-tier-source-write-backend-B_pwEKI_.js +0 -1
- package/dist/assets/volter-sdk-kit-user-local-state-CZtLuAED.js +0 -1
- package/dist/assets/volter-sdk-kit-viewport-activation-timings-DtO34FL_.js +0 -1
- package/dist/assets/volter-sdk-kit-viewport-editor-controls-C4eYemqw.js +0 -1
- package/dist/assets/volter-sdk-kit-viewport-presentation-D1_lvqyl.js +0 -1
- package/dist/assets/volter-sdk-kit-viewport-surface-status-BsGJAuRu.js +0 -1
- package/dist/assets/volter-sdk-kit-wait-until-DlHFfLUu.js +0 -1
- package/dist/assets/volter-sdk-kit-worker-call-metrics-FsK4U-gz.js +0 -1
- package/dist/assets/volter-sdk-kit-workspace-areas-CvTSMn-H.js +0 -1
- package/dist/assets/volter-sdk-kit-workspace-aux-commands-CrxEUAQx.js +0 -1
- package/dist/assets/volter-sdk-kit-workspace-available-documents-Cl8CigSt.js +0 -1
- package/dist/assets/volter-sdk-kit-workspace-core-utilities-rQQcVO5n.js +0 -1
- package/dist/assets/volter-sdk-kit-workspace-document-ids-CisQDpex.js +0 -1
- package/dist/assets/volter-sdk-kit-workspace-document-registry-D4w40sGe.js +0 -1
- package/dist/assets/volter-sdk-kit-workspace-document-restore-B0s9617k.js +0 -1
- package/dist/assets/volter-sdk-kit-workspace-host-commands-DLqH47QQ.js +0 -1
- package/dist/assets/volter-sdk-kit-workspace-persistence-gate-eeXMeNbc.js +0 -1
- package/dist/assets/volter-sdk-kit-workspace-play-utilities-sGc6TcaG.js +0 -1
- package/dist/assets/volter-sdk-kit-workspace-presets-D-OZK4QQ.js +0 -1
- package/dist/assets/volter-sdk-kit-workspace-regions-CLU4KicA.js +0 -1
- package/dist/assets/volter-sdk-kit-workspace-static-panels-BtUQumTF.js +0 -1
- package/dist/assets/volter-sdk-kit-workspace-status-registry-BlOrc7aA.js +0 -1
- package/dist/assets/volter-sdk-kit-workspace-storage-B1cvxes9.js +0 -1
- package/dist/assets/volter-sdk-kit-workspace-style-Czyy_uk2.js +0 -1
- package/dist/assets/volter-sdk-kit-workspace-utility-commands-D7ToZCgr.js +0 -1
- package/dist/assets/volter-sdk-kit-workspace-utility-registry-Czk_iMpg.js +0 -1
- package/dist/assets/volter-sdk-kit-world-adoption-CvxzEI8V.js +0 -1
- package/dist/assets/volter-sdk-kit-world-canvas-viewport-state-CjG34H8g.js +0 -1
- package/dist/assets/volter-sdk-kit-world-document-routing-B3yT1rzx.js +0 -1
- package/dist/assets/volter-sdk-kit-world-pan-state-Co5VSMOo.js +0 -1
- package/dist/assets/volter-sdk-kit-write-pipe-GbyDlxkJ.js +0 -1
- package/dist/assets/volter-sdk-layout-arrangements-DmBix6Gx.js +0 -1
- package/dist/assets/volter-sdk-layouts-CQccgb8u.js +0 -1
- package/dist/assets/volter-sdk-mgLi8_Cw.js +0 -2364
- package/dist/assets/volter-sdk-selection-wggwzLen.js +0 -1
- package/dist/assets/volter-sdk-session-command-table-HilHgL7-.js +0 -1
- package/dist/assets/volter-sdk-session-editor-brand-CnZ3VbR-.js +0 -1
- package/dist/assets/volter-sdk-session-editor-compatibility-BOYTGttq.js +0 -1
- package/dist/assets/volter-sdk-session-editor-control-protocol-DG79HI_x.js +0 -1
- package/dist/assets/volter-sdk-session-entrypoint-selection-readers-D9FXlkS2.js +0 -1
- package/dist/assets/volter-sdk-session-game-css-scope-CZmonWfe.js +0 -1
- package/dist/assets/volter-sdk-session-limited-view-KNOq_tYc.js +0 -1
- package/dist/assets/volter-sdk-session-project-module-url-D7htWtkD.js +0 -1
- package/dist/assets/volter-sdk-session-relative-path-guard-DYa5PL0U.js +0 -1
- package/dist/assets/volter-sdk-session-tool-contribution-convention-GC2AWVch.js +0 -1
- package/dist/assets/volter-sdk-types-Couxbiwa.js +0 -1
- package/dist/assets/volter-sdk-views-D8qvTyCn.js +0 -1
- package/dist/assets/volter-sdk-widgets-design-system-DOW3sA7o.js +0 -1
- package/dist/assets/volter-sdk-widgets-editor-appearance-iH79zcxr.js +0 -1
- package/dist/assets/volter-sdk-widgets-editor-material-D-LB0zxr.js +0 -1
- package/dist/assets/volter-sdk-widgets-icon-set-registry-ylLmSwSr.js +0 -1
- package/dist/assets/volter-sdk-widgets-index-DMo0Rqvn.js +0 -1
- package/dist/assets/volter-sdk-widgets-inspector-widgets-AlignmentGrid-DhdNVPDu.js +0 -1
- package/dist/assets/volter-sdk-widgets-inspector-widgets-AssetSlotPicker-BEDX8viW.js +0 -1
- package/dist/assets/volter-sdk-widgets-inspector-widgets-BorderEditor-9Vk3QrCy.js +0 -1
- package/dist/assets/volter-sdk-widgets-inspector-widgets-ColorPicker-rhGdxW0L.js +0 -1
- package/dist/assets/volter-sdk-widgets-inspector-widgets-CurveEditor-BXu0Q3-y.js +0 -1
- package/dist/assets/volter-sdk-widgets-inspector-widgets-FilterEditor-C49uoql_.js +0 -1
- package/dist/assets/volter-sdk-widgets-inspector-widgets-FontPicker-BoRWZylN.js +0 -1
- package/dist/assets/volter-sdk-widgets-inspector-widgets-GradientEditor-GxINOtYX.js +0 -1
- package/dist/assets/volter-sdk-widgets-inspector-widgets-ScrubbableInput-rvCzzMDI.js +0 -1
- package/dist/assets/volter-sdk-widgets-inspector-widgets-ShadowEditor-DG-MGXQX.js +0 -1
- package/dist/assets/volter-sdk-widgets-inspector-widgets-color-utils-Cy4AI76M.js +0 -1
- package/dist/assets/volter-sdk-widgets-inspector-widgets-curve-utils-ncKgVdwJ.js +0 -1
- package/dist/assets/volter-sdk-widgets-inspector-widgets-index-BtW7A1an.js +0 -1
- package/dist/assets/volter-sdk-widgets-inspector-widgets-shared-lOZ7oJLL.js +0 -1
- package/dist/assets/volter-sdk-widgets-interactive-edit-scope-BbS6qOlJ.js +0 -1
- package/dist/assets/volter-sdk-widgets-patterns-Dialog-BqcAE1N1.js +0 -1
- package/dist/assets/volter-sdk-widgets-patterns-Fields-CD2kSMcv.js +0 -1
- package/dist/assets/volter-sdk-widgets-patterns-List-CZyrvaL-.js +0 -1
- package/dist/assets/volter-sdk-widgets-patterns-StateSurface-D8L-se9D.js +0 -1
- package/dist/assets/volter-sdk-widgets-patterns-Surfaces-sW43gM3D.js +0 -1
- package/dist/assets/volter-sdk-widgets-patterns-Tabs-CTEQRAHE.js +0 -1
- package/dist/assets/volter-sdk-widgets-patterns-Toolbar-CF8cj2Xd.js +0 -1
- package/dist/assets/volter-sdk-widgets-patterns-Tree-KffO8vo1.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-AnchoredMenu-D2my2vjj.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-Button-CiaR71jI.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-ColorInput-DAxGHgoQ.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-DraftTextInput-CCZYI-j9.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-EditorIcon-Fn9aFuF_.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-FormControls-BMxlOety.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-HoverPreview-BzwvyU3c.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-JsonInput-CTc6p9EQ.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-Layout-CE-beP_c.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-Menu-DfNc6W9I.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-NumberInput-Cyjw5Lzx.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-Panel-LGno17LT.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-SectionHeader-Cljf9N48.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-Text-B4gPva4d.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-ThemeRootPortal-CXqwIkjb.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-Tooltip-DjwM-P34.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-Vec3Input-DWMZJklN.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-banner-tones-bbpLeXlG.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-clamp-to-viewport-DB06CYVu.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-editor-icons-FxdDZA6W.js +0 -1
- package/dist/assets/volter-sdk-widgets-primitives-panel-header-styles-CEiBBzGS.js +0 -1
- package/dist/assets/volter-sdk-widgets-theme-BysNs-Ha.js +0 -1
- package/dist/assets/volter-sdk-widgets-z-index-CQdgvLGF.js +0 -1
- package/dist/assets/volter-shared-fontawesome-BiNKLNA8.js +0 -1
- package/dist/assets/volter-shared-jsx-dev-runtime-BgDFKHr4.js +0 -1
- package/dist/assets/volter-shared-jsx-runtime-B6IXdFn7.js +0 -1
- package/dist/assets/volter-shared-react-dom-DOBDwT0W.js +0 -1
- package/dist/assets/volter-shared-react-dom-client-DxxNJanr.js +0 -1
- package/dist/assets/volter-shared-react-wgC9wOqr.js +0 -1
- package/dist/assets/volter-shared-three-CUSZKPWM.js +0 -1
- package/dist/assets/worker-DvJ796ja.js +0 -8
- package/dist/volter-shared-sdk.json +0 -465
- package/src/contributions.d.ts +0 -4
- package/starter/add-play/game-state.ts +0 -25
- package/starter/add-play/game.tsx +0 -16
- package/starter/add-play/model.play.ts +0 -77
- package/starter/playable/src/models/canyon.blend +0 -0
- package/starter/playable/src/models/canyon.play.ts +0 -107
- package/starter/playable/src/models/canyon.py +0 -55
- package/starter/playable/src/models/circuit.py +0 -131
- package/starter/playable/src/models/complete_environment.py +0 -35
- package/starter/playable/src/models/course.ts +0 -12
- package/starter/playable/src/models/detail.py +0 -44
- package/starter/playable/src/models/driver_details.py +0 -25
- package/starter/playable/src/models/environment.py +0 -87
- package/starter/playable/src/models/finish_scene.py +0 -13
- package/starter/playable/src/models/kart_finish.py +0 -31
- package/starter/playable/src/models/polish.py +0 -75
- package/starter/playable/src/models/race-state.ts +0 -15
- package/starter/playable/src/models/refine.py +0 -69
- package/starter/playable/src/models/scene_helpers.py +0 -54
- package/starter/playable/src/models/scenery_ao.py +0 -114
- package/starter/playable/src/textures/asphalt.png +0 -0
- package/starter/playable/src/textures/generate.py +0 -16
- package/starter/playable/src/textures/sandstone.png +0 -0
- package/starter/playable/src/ui/game.stories.tsx +0 -16
- package/starter/playable/src/ui/game.tsx +0 -6
- package/starter/playable/src/ui/race-hud.tsx +0 -29
- package/starter/playable/src/ui/race-widgets.tsx +0 -29
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import{h6 as W,x as Rt,il as Tt,im as jt,n as h,j as b,dw as Pt,io as me,dO as te,ip as we,iq as Lt,ir as Ft,t as Q,is as Nt,cs as ne,ew as Dt,B as Ue,dZ as De,it as Bt,aw as vt,ax as xe,bE as It,aE as pe,gJ as Vt,iu as Me,aJ as Re,ij as se,iv as Ke,c1 as Gt,c4 as Wt,gz as Je,iw as zt,aA as qt,ix as Ht,iy as Ye,aO as Ut,iz as Kt,iA as Xe,iB as Jt}from"./volter-sdk-mgLi8_Cw.js";import{o as Yt,i as Se,j as ye,k as ke,l as Xt,m as Be,g as Qe,p as Qt,q as Zt,w as Ze,t as en,u as $e,v as tn,x as nn,y as rn,z as et,s as _t,A as on,B as sn,b as tt,C as Te,D as an,E as nt,F as ln,G as cn,H as dn}from"./blender-runtime-host-swgDAdoy.js";import{t as rt,v as ce,o as Ce,s as St,a as je}from"./object3d-document-session-registry-DDpmVmir.js";import{r as ot,b as un,a as pn,w as fn}from"./blender-properties-model-B7O1AR0g.js";import{A as bn,r as st,n as mn,i as hn,j as gn,b as he,k as at,l as yn}from"./play-live-BBkOuWQn.js";import{ay as wn}from"./three.module-CtVjCPcj.js";import"./output-pass-j4dAGrPY.js";import"./linear-resolve-Cuka7Ypb.js";function kt(r){return`blender-${r.toLowerCase().replace(/_/g,"-")}`}function le(r){return r?.type==="TSE_SOME_ID"&&r.struct==="Object"&&r.object!==void 0}function lt(r){if(r.struct)return r.struct}function it(r,o){return{id:r.id,label:r.name,role:"entity",kind:kt(r.icon),...lt(r)?{typeLabel:lt(r)}:{},parentId:o,childIds:r.children.map(i=>i.id),defaultExpanded:r.expanded}}const jn={transform:!0,inspectorFields:!1,persist:!0},Ae=new Set;let Et=0;const Ie=new Set;function ct(){queueMicrotask(()=>{Et++;for(const r of Ie)r()})}function vn(r){return Ie.add(r),()=>{Ie.delete(r)}}function dt(){return Et}function _n(r){for(const o of Ae)if(o.documentId===r||o.documentId===`object3d-document:${r}`)return o;return Ae.values().next().value??null}const Sn=()=>({position:[0,0,0],rotation:[0,0,0,1],scale:[1,1,1]});function ut(r,o){r.updateWorldMatrix(!0,!1);const i=o.matrixWorld.clone().invert().multiply(r.matrixWorld).elements;return[[i[0],i[1],i[2],i[3]],[i[4],i[5],i[6],i[7]],[i[8],i[9],i[10],i[11]],[i[12],i[13],i[14],i[15]]]}function ve(r,o){return`${r} 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 "${o}".`}const kn=[{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:`${ve("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:ve("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:ve("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:ve("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'"}],En="collection-instance:";function xn(){const r=new Map;for(const o of ye().byId.values()){if(o.type!=="TSE_LAYER_COLLECTION")continue;const i=o.data;i===void 0||!i.startsWith("bpy.data.collections[")||r.has(o.name)||r.set(o.name,{kind:`${En}${o.name}`,label:o.name,group:"Collection Instance",call:`object.collection_instance_add, collection=${fe(o.name)}`})}return[...r.values()]}function Ee(){return[...kn,...xn()]}function Cn(r){const[o,...i]=r.call.split(", ");return`bpy.ops.${o}(${i.join(", ")})`}function fe(r){return JSON.stringify(r)}const An={"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","image.import_as_mesh_planes":"Import Images as Planes","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_add":"Add to Collection","object.collection_instance_add":"Add Collection Instance","object.constraint_add":"Add Constraint","object.curves_empty_hair_add":"Add Empty Curves","object.curves_random_add":"Add Random Curves","object.data_instance_add":"Add Object Data Instance","object.delete":"Delete","object.duplicate":"Duplicate Objects","object.effector_add":"Add Effector","object.empty_add":"Add Empty","object.empty_image_add":"Add Empty Image/Drop Image to Empty","object.grease_pencil_add":"Add Grease Pencil","object.grease_pencil_dash_modifier_segment_add":"Add Segment","object.grease_pencil_time_modifier_segment_add":"Add Segment","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.material_slot_add":"Add Material Slot","object.metaball_add":"Add Metaball","object.modifier_add":"Add Modifier","object.origin_set":"Set Origin","object.particle_system_add":"Add Particle System Slot","object.pointcloud_random_add":"Add Point Cloud","object.quick_fur":"Quick Fur","object.rotation_clear":"Clear Rotation","object.scale_clear":"Clear Scale","object.shaderfx_add":"Add Effect","object.shape_key_add":"Add Shape Key","object.speaker_add":"Add Speaker","object.text_add":"Add Text","object.transform_apply":"Apply Object Transform","object.vertex_group_add":"Add Vertex Group","object.volume_add":"Add Volume","object.volume_import":"Import OpenVDB 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 On(r){const o=/bpy\.ops\.([a-z_]+\.[a-z0-9_]+)\(/.exec(r)?.[1];return o===void 0?void 0:An[o]}async function ge(r,o){const i=["before = {o.name for o in bpy.data.objects}",r,"made = [o.name for o in bpy.data.objects if o.name not in before]",'print("\\n".join(made))'].join(`
|
|
2
|
-
`),u=await $e(i,!0,o??On(r));return u.error!==null?{made:[],error:u.error}:{made:u.result.split(`
|
|
3
|
-
`).map(g=>g.trim()).filter(g=>g.length>0),error:null}}async function $n(r,o){const i=[`_sel = {${r.map(fe).join(", ")}}`,"_vl = bpy.context.view_layer","for _o in _vl.objects:"," _o.select_set(_o.name in _sel)",...o===null?[]:[`_vl.objects.active = bpy.data.objects.get(${fe(o)})`]].join(`
|
|
4
|
-
`),u=await $e(i,!1);u.error!==null&&W().console.error(`Blender refused the selection write: ${u.error}`,"blender-outliner")}async function Pe(r,o){if(r.length===0)return{destination:"Nothing is selected, so there was nothing to run it on.",persisted:!1};const i=[`targets = [bpy.data.objects[n] for n in [${r.map(fe).join(", ")}]]`,"with bpy.context.temp_override(selected_objects=targets, selected_editable_objects=targets, active_object=targets[0], object=targets[0]):",` ${o}`].join(`
|
|
5
|
-
`),{error:u}=await ge(i);return u!==null?{destination:u,persisted:!1}:(await ke(r),{destination:`Blender — ${o}; the session saves the .blend`,persisted:!0})}const Mn={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."},Rn="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 xt(r){return({defaultAdapter:o})=>{const i=new Set;let u=[],E=null,g=null;const w=new Map,v=new Map,A=()=>{for(const e of[...i])e()},j=()=>ye().byId,P=e=>{const t=j().get(e),n=r();return t===void 0||n===null?null:t.type==="TSE_VIEW_COLLECTION_BASE"?n.root:t.object===void 0?null:n.objectForBlenderName(t.object)},L=e=>{const t=r();if(t===null)return null;for(const n of j().values())if(le(n)&&t.objectForBlenderName(n.object)===e)return n.id;return null},O=e=>{for(const t of j().values())if(le(t)&&t.object===e)return t.id;return null},I=e=>{if(j().has(e))return e;const t=rt(o.hierarchy,e);return t===null?null:L(t)},V=e=>{const t=I(e);return t===null?null:P(t)},B=e=>{const t=V(e);return t===null?null:o.hierarchy.idForObject3D?.(t)??null},F={roots:()=>(en(H()),(ye().tree?.rows??[]).map(t=>it(t,null))),node:e=>{const t=ye(),n=t.byId.has(e)?e:I(e),l=n===null?void 0:t.byId.get(n);return l===void 0?null:it(l,t.parentOf.get(l.id)??null)},object3D:e=>V(e),idForObject3D:e=>L(e)};function H(){const e=j(),t=new Set;for(const n of u){const l=e.get(n)?.object;l!==void 0&&t.add(l)}return[...t]}const K=()=>{const e=[];for(const t of u){const n=V(t),l=n===null?null:o.hierarchy.idForObject3D?.(n);l&&e.push(l)}o.selection?.set(e,{intent:"exact"}),A()},f=()=>{if(m||g!==null)return;const e=Xt(),t=`${Be()}\0${e.active??""}\0${[...e.selected].sort().join("")}`;if(t===E)return;E=t;const n=e.selected.filter(c=>c!==e.active);e.active!==null&&e.selected.includes(e.active)&&n.push(e.active);const l=n.map(O).filter(c=>c!==null);l.length===u.length&&l.every((c,p)=>c===u[p])||(u=l,K())},y={get:()=>[...u],set:e=>{if(m)return;const t=Symbol("Blender selection");g=t;const n=e.map(I);u=n.filter(Z=>Z!==null),K();const l=j(),c=r(),p=[],M=[],X=[];e.forEach((Z,re)=>{const k=n[re];if(k!==null){const J=l.get(k),x=J?.object;x===void 0?M.push(J?.name??k):p.includes(x)||p.push(x);return}const C=rt(o.hierarchy,Z),U=C===null?null:c?.blenderObjectName(C)??null;U===null?X.push(Z):p.includes(U)||p.push(U)}),X.length>0&&W().console.warn(`No Blender object answers to ${X.join(", ")}, so Blender's selection leaves ${X.length===1?"it":"them"} out.`,"blender-outliner"),M.length>0&&W().console.warn(`${M.join(", ")} ${M.length===1?"is":"are"} not an object, so Blender's object selection does not carry ${M.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"),$n(p,p.length===0?null:p[p.length-1]).catch(Z=>W().console.error(`Blender refused the selection write: ${String(Z)}`,"blender-outliner")).finally(()=>{m||g!==t||(g=null,E=null,f())})}},$=e=>j().get(e)?.restrict,G={properties:e=>{const t=$(e);if(t===void 0)return[];const n=j().get(e),l=[{path:"name",label:"Name",type:"string",readonly:!le(n)}];return t.hide!==void 0&&l.push({path:"visible",label:"Show in Viewport",type:"boolean"}),t.render!==void 0&&l.push({path:"renderVisible",label:"Show in Renders",type:"boolean"}),t.exclude!==void 0&&l.push({path:"exclude",label:"Exclude from View Layer",type:"boolean"}),l},get:(e,t)=>{const n=j().get(e);if(n!==void 0){if(t==="name")return n.name;if(t==="visible")return n.restrict?.hide===void 0?void 0:!n.restrict.hide;if(t==="renderVisible")return n.restrict?.render===void 0?void 0:!n.restrict.render;if(t==="exclude")return n.restrict?.exclude}},editability:(e,t)=>{const n=j().get(e);return n===void 0?{writable:!1}:t==="name"?le(n)?{writable:!0}:{writable:!1,reason:`Renaming a ${n.struct??n.type} is not in this Outliner yet — only an object row renames here. Rename it with bpy.`}:n.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."}:t==="visible"&&n.restrict?.exclude===!0?{writable:!1,reason:Rn}:{writable:!0}},set:async(e,t,n)=>{const l=j().get(e);if(l===void 0)return;if(t==="name"){if(!le(l))return;const p=String(n);if(p===l.name||p.length===0)return;await Qe(`bpy.data.objects[${fe(l.object)}]`,"name",p),await ke([p]);const M=O(p);M!==null&&y.set([M]);return}if(t==="exclude"){await Ze(l.path,"exclude",n===!0);return}const c=t==="visible"?"hide":t==="renderVisible"?"render":null;c!==null&&await Ze(l.path,c,n===!1)}},R={get:e=>{const t=B(e);return(t===null?void 0:o.transforms?.get(t))??Sn()},editability:e=>{const t=I(e),n=t===null?void 0:j().get(t);return le(n)&&P(n.id)!==null?{writable:!0}:{writable:!1,reason:`Only an object has a transform; this row is a ${n?.struct??n?.type??"row"}.`}},beginEdit:e=>{const t=V(e);t!==null&&!w.has(t)&&(w.set(t,t.matrixWorld.clone()),v.set(e,t),Zt())},apply:(e,t)=>{const n=V(e);n!==null&&(n.position.fromArray(t.position),n.quaternion.fromArray(t.rotation),n.scale.fromArray(t.scale),n.updateMatrix(),n.updateMatrixWorld(!0),r()?.mirrorPose?.(n))},endEdit:async e=>{const t=v.get(e)??V(e);v.delete(e);const n=r();if(t===null)return;const l=w.get(t);w.delete(t);try{if(n===null||(t.updateWorldMatrix(!0,!1),l?.equals(t.matrixWorld)===!0))return;const c=n.blenderObjectName(t);if(c===null)return;const p=`bpy.data.objects[${JSON.stringify(c)}]`;try{return await Qe(p,"matrix_world",ut(t,n.root)),{destination:`Blender — ${p}.matrix_world; the session saves the .blend`,persisted:!0}}catch(M){return{destination:M instanceof Error?M.message:String(M),persisted:!1}}}finally{l&&await Qt()}}},Y=e=>{const t=I(e),n=t===null?void 0:j().get(t);return le(n)?n.object:null},D=e=>({destination:e,persisted:!1}),N=async e=>{await ke(e);const t=e.map(O).filter(n=>n!==null);return t.length>0&&y.set(t),t[0]??""},z=()=>{const e=o.documentId?.replace(/^object3d-document:/,""),t=ce().find(c=>c.documentId===e)?.rig().drawCamera()??null,n=r(),l=["bpy.ops.object.camera_add()","added = bpy.context.view_layer.objects.active"];return t!==null&&n!==null&&l.push("kept = added.location.copy()",`added.matrix_world = ${JSON.stringify(ut(t,n.root))}`,"added.location = kept"),l.push("if bpy.context.scene.camera is None:"," bpy.context.scene.camera = added"),l.join(`
|
|
6
|
-
`)},S={creatableKinds:()=>Ee().map(({kind:e,label:t})=>({kind:e,label:t})),create:e=>{const t=Ee().find(l=>l.kind===e);if(t===void 0)return{id:"",ack:D(`${e} is not a row of Blender's Add menu that this editor adds. Its rows are: ${Ee().map(l=>l.label).join(", ")}.`)};if(t.refusal!==void 0)return{id:"",ack:D(t.refusal)};const n=t.call==="object.camera_add"?z():Cn(t);return{id:"",ack:(async()=>{const{made:l,error:c}=await ge(n);return c!==null?D(c):l.length===0?D(`Blender ran ${n} 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 N(l),{destination:`Blender — ${n}; the session saves the .blend`,persisted:!0})})()}},remove:e=>S.removeMany?.([e])??void 0,removeMany:async e=>{const t=[];for(const p of e){const M=Y(p);if(M===null){const X=I(p)===null?void 0:j().get(I(p));return D(`Only an object can be deleted here; this row is a ${X?.struct??X?.type??"row"}. Deleting a collection, a modifier or a vertex group is that datablock’s own bpy call.`)}t.push(M)}if(t.length===0)return D("Nothing selected to delete.");const l=[`targets = ${`[bpy.data.objects[n] for n in [${t.map(fe).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:c}=await ge(l,"Delete Objects");return c!==null?D(c):(y.set([]),await ke([]),{destination:"Blender — bpy.ops.object.delete(use_global=False); the session saves the .blend",persisted:!0})},duplicate:e=>{const t=Y(e);if(t===null)return{id:e,ack:D("Only an object can be duplicated here. Duplicating a collection is `bpy.ops.object.collection_instance_add`, its own gesture.")};const n=[`source = bpy.data.objects[${fe(t)}]`,"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:e,ack:(async()=>{const{made:l,error:c}=await ge(n,"Duplicate Object");return c!==null?D(c):(await N(l),{destination:`Blender — bpy.ops.object.duplicate(linked=False) on ${t}; the session saves the .blend`,persisted:!0})})()}},duplicateMany:async e=>{const t=[...new Set(e.map(Y))];if(t.length===0||t.some(p=>p===null))return D("Select objects to duplicate; collections and data rows cannot be duplicated here.");const n=[`sources = [bpy.data.objects[name] for name in ${JSON.stringify(t)}]`,"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:l,error:c}=await ge(n,"Duplicate Objects");return c!==null?D(c):(await N(l),{destination:"Blender — duplicate selected objects as one native operation; the session saves the .blend",persisted:!0})},reparent:()=>D("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.")},T={get documentId(){return o.documentId},get documentRootObject(){return o.documentRootObject},capabilities:jn,provenance:Mn,hierarchy:F,selection:y,inspector:G,transforms:R,structure:S,subscribe:e=>{i.add(e);const t=Se(e),n=o.subscribe?.(e)??(()=>{});return()=>{i.delete(e),t(),n()}}},d={get documentId(){return T.documentId},selectedObjectNames:()=>H(),allObjectNames:()=>{const e=[];for(const t of j().values())le(t)&&e.push(t.object);return e},selectObjects:e=>{const t=e.map(O).filter(n=>n!==null);y.set(t)},rowIdForObject:e=>O(e),structure:S,subscribe:e=>{i.add(e);const t=Se(e);return()=>{i.delete(e),t()}}};Ae.add(d);let m=!1;const _=setTimeout(()=>{m||(ct(),f())},0),s=Yt(f),a=Se(f);return{adapter:T,dispose:()=>{m=!0,clearTimeout(_),s(),a(),Ae.delete(d),ct(),i.clear()}}}}const Tn=xt(tn);Rt({match:({adapter:r})=>ot(null,r)!==null,describe:({adapter:r})=>{const o=ot(null,r);if(o===null)return null;const i=o.kind==="object"?[...ye().byId.values()].find(w=>w.struct==="Object"&&w.object===o.name):void 0,u=un().context?.scene,E=u?pn(u):void 0,g=o.kind==="object"?o.name:(E?.kind==="struct"?E.name:null)??"Scene";return{id:`blender-properties:${JSON.stringify(o)}`,title:g,identity:{kindLabel:o.kind==="object"?"Object":"Scene",kind:kt(i?.icon??"SCENE_DATA"),rename:{readOnly:o.kind!=="object",set:async w=>{o.kind==="object"&&w.length>0&&await fn(`bpy.data.objects[${JSON.stringify(o.name)}]`,"name",w)}}},sections:[]}}});function Ct(r){const o=Number.isFinite(r)&&r>0?r:50;return{degrees:2*Math.atan(72/(2*o))*180/Math.PI,axis:"larger"}}Tt("model",{camera:{fov:Ct(50),opening:[.8187,.4458,.3617]},interaction:{bootTool:"select",boxSelect:"touch"},all:{lighting:{source:"studio",studioPreset:jt.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 Ve="volter.blender.area-split:",Ge=new Set,We=new Map;function Pn(r){try{return globalThis.localStorage?.getItem(Ve+r)==="1"}catch{return!1}}function qe(r){let o=We.get(r);return o===void 0&&(o=Pn(r),We.set(r,o)),o}function pt(r,o){if(qe(r)!==o){We.set(r,o);try{o?globalThis.localStorage?.setItem(Ve+r,"1"):globalThis.localStorage?.removeItem(Ve+r)}catch{}for(const i of[...Ge])i()}}function At(r){return Ge.add(r),()=>{Ge.delete(r)}}const Ln=[{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"}],Fn=[{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)"}],Nn=[{label:"Geometry to Origin",type:"GEOMETRY_ORIGIN"},{label:"Origin to Geometry",type:"ORIGIN_GEOMETRY"},{label:"Origin to 3D Cursor",type:"ORIGIN_CURSOR"}],Dn=[{submenu:"Mesh",at:"2699"},{submenu:"Curve",at:"2702"},{submenu:"Surface",at:"2704"},{submenu:"Metaball",at:"2705"},{kind:"text",at:"2706"},{kind:"point-cloud",at:"2707"},{submenu:"Volume",at:"2708"},{submenu:"Grease Pencil",at:"2709"},{separatorAt:"2711"},{kind:"armature",at:"2716"},{submenu:"Lattice",at:"2718"},{separatorAt:"2720"},{submenu:"Empty",at:"2722"},{submenu:"Image",at:"2723"},{separatorAt:"2725"},{submenu:"Light",at:"2727"},{submenu:"Light Probe",at:"2728"},{separatorAt:"2730"},{kind:"camera",at:"2735"},{separatorAt:"2737"},{kind:"speaker",at:"2739"},{separatorAt:"2741"},{submenu:"Force Field",at:"2743"},{separatorAt:"2745"},{submenu:"Collection Instance",at:"2759"}],Bn="No Collections to Instance";function _e({id:r,open:o,setOpen:i,anchorRef:u,children:E}){return b.jsxs("div",{ref:u,style:{position:"relative"},children:[b.jsx(Lt,{"data-testid":`blender-menu-${r}`,"aria-expanded":o===r,onClick:()=>i(o===r?null:r),onPointerEnter:()=>{o&&i(r)},style:{textTransform:"capitalize"},children:r}),o===r&&b.jsx(Ft,{anchorRef:u,dismissBoundaryRef:u,align:"start",gap:0,clamp:!0,"aria-label":r,onDismiss:()=>i(null),children:E})]})}function In(r,o,i){(async()=>{const u=await i;u===void 0||typeof u.destination!="string"||u.persisted!==!0&&r?.({tone:"error",title:`${o} was refused`,detail:u.destination})})()}function Ot({documentId:r,notify:o}){h.useSyncExternalStore(Se,Be,Be),h.useSyncExternalStore(vn,dt,dt);const[i,u]=h.useState(null),E=h.useRef(null),g=h.useRef(null),w=h.useRef(null),v=h.useRef(null),A=h.useRef(null),j=h.useSyncExternalStore(At,()=>r===void 0?!1:qe(r),()=>!1),P=_n(r);if(P===null)return null;const L=(f,y)=>()=>{u(null),In(o,f,y(P))},O=P.selectedObjectNames(),I=P.allObjectNames(),V=O.length===0?"Nothing is selected.":void 0,B=Ee(),F=f=>b.jsx(te,{"data-testid":`blender-add-${f.kind}`,disabled:f.refusal!==void 0,title:f.refusal,onSelect:L(`Add ${f.label}`,y=>y.structure.create(f.kind).ack),children:f.label},f.kind),H=f=>B.filter(y=>y.group===f).flatMap(y=>y.separatorBefore===!0?[b.jsx(we,{},`${y.kind}-separator`),F(y)]:[F(y)]),K=f=>{if("separatorAt"in f)return b.jsx(we,{},`separator-${f.separatorAt}`);if("kind"in f){const $=B.find(G=>G.kind===f.kind);return $===void 0?null:F($)}const y=H(f.submenu);return y.length===0?b.jsx(te,{"data-testid":"blender-add-collection-instance",disabled:!0,children:Bn},f.submenu):b.jsx(me,{label:f.submenu,"data-testid":`blender-add-${f.submenu.toLowerCase().replaceAll(" ","-")}`,children:y},f.submenu)};return b.jsxs(Pt,{compact:!0,label:"Blender Object Mode menus","data-testid":"blender-object-mode-menus",ref:E,children:[b.jsx(_e,{id:"view",open:i,setOpen:u,anchorRef:g,children:b.jsxs(me,{label:"Area","data-testid":"blender-view-area",children:[b.jsx(te,{"data-testid":"blender-area-vertical-split",disabled:j||r===void 0,title:j?"This area is already split.":void 0,onSelect:()=>{u(null),r!==void 0&&pt(r,!0)},children:"Vertical Split"}),b.jsx(we,{}),b.jsx(te,{"data-testid":"blender-area-close",disabled:!j,title:j?void 0:"There is no second area to close.",onSelect:()=>{u(null),r!==void 0&&pt(r,!1)},children:"Close Area"})]})}),b.jsxs(_e,{id:"select",open:i,setOpen:u,anchorRef:w,children:[b.jsx(te,{"data-testid":"blender-select-all",onSelect:L("Select All",f=>f.selectObjects(I)),children:"All"}),b.jsx(te,{"data-testid":"blender-select-none",onSelect:L("Select None",f=>f.selectObjects([])),children:"None"}),b.jsx(te,{"data-testid":"blender-select-invert",onSelect:L("Select Invert",f=>f.selectObjects(I.filter(y=>!O.includes(y)))),children:"Invert"})]}),b.jsx(_e,{id:"add",open:i,setOpen:u,anchorRef:v,children:Dn.map(f=>K(f))}),b.jsxs(_e,{id:"object",open:i,setOpen:u,anchorRef:A,children:[b.jsx(me,{label:"Set Origin","data-testid":"blender-object-origin",children:Nn.map(f=>b.jsx(te,{"data-testid":`blender-origin-${f.type}`,disabled:f.refusal!==void 0||O.length===0,title:f.refusal??V,onSelect:L(`Set Origin ▸ ${f.label}`,y=>Pe(y.selectedObjectNames(),`bpy.ops.object.origin_set(type='${f.type}')`)),children:f.label},f.type))}),b.jsx(me,{label:"Clear","data-testid":"blender-object-clear",children:Fn.map(f=>b.jsx(te,{"data-testid":`blender-clear-${f.label.toLowerCase()}`,disabled:O.length===0,title:V,onSelect:L(`Clear ▸ ${f.label}`,y=>Pe(y.selectedObjectNames(),f.call)),children:f.label},f.label))}),b.jsx(me,{label:"Apply","data-testid":"blender-object-apply",children:Ln.map(f=>b.jsx(te,{"data-testid":`blender-apply-${f.label.toLowerCase().replace(/ /g,"-")}`,disabled:O.length===0,title:V,onSelect:L(`Apply ▸ ${f.label}`,y=>Pe(y.selectedObjectNames(),`bpy.ops.object.transform_apply(${f.call})`)),children:f.label},f.label))}),b.jsx(we,{}),b.jsx(te,{"data-testid":"blender-object-duplicate",disabled:O.length===0,title:V,onSelect:L("Duplicate Objects",async f=>{const y=f.selectedObjectNames().map($=>f.rowIdForObject($)).filter($=>$!==null);return f.structure.duplicateMany?.(y)}),children:"Duplicate Objects"}),b.jsx(te,{"data-testid":"blender-object-delete",disabled:O.length===0,title:V,onSelect:L("Delete",f=>{const y=f.selectedObjectNames().map($=>f.rowIdForObject($)).filter($=>$!==null);return f.structure.removeMany?.(y)}),children:"Delete"})]})]})}const ie=(r,o,i)=>({weight:r,target:o,rate:i>0?1/i:0}),Le=(r,o)=>{r.weight=r.rate<=0?r.target:r.weight<r.target?Math.min(r.target,r.weight+o*r.rate):Math.max(r.target,r.weight-o*r.rate)};function Vn(r,o,i=new Map){const u=[],E=r.animationFacts(),g=Object.keys(E.actions),w=E.clock?.fps||24,v=E.clock?.start??1,A=Math.max(1,(E.clock?.end??v+249)-v+1),j=new Map;let P=0,L=!1;const O=new Map,I=(s,a,e)=>{s.clips.set(a,null),s.failed.set(a,e),u.push(`${s.rig.armature} / ${a}: ${e}`)},V=3,B=new Map,F=new Map,H=i,K=s=>!!s&&(s.objectSlots??2)>1,f=(s,a)=>{const e=s.rig.armature,t=s.facts.bones.map(p=>p.name).sort().join(""),n=`${E.actions[a]??""}\0${a}\0${t}`,l=H.get(n);if(l)return l.then(p=>K(p)&&p.armature!==e?o(e,a):p);const c=o(e,a).then(p=>(K(p)&&H.delete(n),p),p=>{throw H.delete(n),p});return H.set(n,c),c},y=(s,a)=>{if(s.clips.has(a))return s.clips.get(a);$(s,a)},$=(s,a)=>{const e=`${s.rig.armature}\0${a}`,t=F.get(e);if(t)return t;if(s.clips.has(a)&&s.clips.get(a)!==void 0)return Promise.resolve();s.clips.set(a,void 0);const n=f(s,a).then(l=>{try{const c=l?hn(l):null;for(const p of c?.unsupported??[])u.push(`${s.rig.armature}: ${p} plays only in Blender, not in a game.${st([p])}`);c?s.clips.set(a,c):I(s,a,l?.reason??`it animates none of ${s.rig.armature}'s bones`)}catch(c){I(s,a,`it could not be posed: ${c instanceof Error?c.message:String(c)}`)}},l=>{const c=(B.get(e)??0)+1;B.set(e,c);const p=`it could not be read: ${l instanceof Error?l.message:String(l)}`;c<V&&!L?s.clips.delete(a):I(s,a,p)}).finally(()=>F.delete(e));return F.set(e,n),n},G=()=>[...j.values()].flatMap(s=>{const a=new Set;s.facts.action&&a.add(s.facts.action);const e=s.facts.animation,t=e?.tracks.some(n=>n.solo)??!1;for(const n of e&&e.useNla?e.tracks:[])if(t?n.solo:!n.mute)for(const l of n.strips)l.action&&a.add(l.action);return[...a].filter(n=>n in E.actions).map(n=>({armature:s,action:n}))});for(const s of r.skeletons.rigs()){const a=E.armatures[s.armature];if(!a)continue;const e=new bn(s);e.facts(a);for(const n of e.unsupported())u.push(`${s.armature}: ${n} plays only in Blender, not in a game.${st([n])}`);const t={rig:s,pose:e,facts:a,clips:new Map,failed:new Map,line:[],tracks:new Map,constraints:new Map,posed:[]};a.action&&(t.line=[{action:a.action,from:0,loop:!0,speed:1,weight:ie(1,1,0)}]),j.set(s.armature,t)}const R=(s,a,e,t)=>{const n=y(s,a.action);if(!n)return n;const l=n.end-n.start,c=(P-a.from)*w*a.speed,p=l>0&&a.loop?n.start+(c%l+l)%l:Math.min(n.end,n.start+c);return{clip:n,frame:p,influence:e*a.weight.weight,blend:t}},Y=s=>{const a=[],e=[];let t=null,n=!1,l=!1;const c=k=>{k===void 0?n=!0:k&&(a.push(k),e.push(t))},p=s.facts.animation,M=v+P*w%A,X=p?.tracks.some(k=>k.solo)??!1;for(const k of p&&p.useNla?p.tracks:[]){const C=s.tracks.get(k.name);if(X?!k.solo:C?C.mute:k.mute)continue;const U=C?C.influence.weight:1;if(t=k.name,C?.action){const x=k.strips[0]?.blendType??"REPLACE";C.previous&&c(R(s,C.previous,U,x)),c(R(s,C.action,U,x)),l=!0;continue}const J=mn({...p,tracks:[{...k,mute:!1,solo:!1}]},M,x=>y(s,x));J.waiting&&(n=!0),J.evaluated&&(l=!0);for(const x of J.layers)a.push({...x,influence:x.influence*U}),e.push(k.name)}for(const[k,C]of s.tracks)!C.own||C.mute||!C.action||(t=k,C.previous&&c(R(s,C.previous,C.influence.weight,"REPLACE")),c(R(s,C.action,C.influence.weight,"REPLACE")),l=!0);const Z=!!p?.useNla,re=Z&&l;t=null;for(const k of Z&&X?[]:s.line)c(R(s,k,re?p.influence:1,re?p.blendType:"REPLACE"));return O.set(s,e),n?null:a},D=s=>{for(const e of j.values())if(e.rig.object===s)return e;const a=s.geometry?.userData.blenderSkin;return a?j.get(a.armature)??null:null},N=s=>{for(let e=s;e;e=e.parent){const t=D(e);if(t)return t}let a=null;return s.traverse(e=>{a||(a=D(e))}),a},z=(s,a)=>a in E.actions?s.failed.get(a)??null:`the file has no action "${a}"`,S=(s,a,e)=>({action:s,from:P,loop:a.loop??!0,speed:a.speed??1,weight:e}),T=s=>({ok:!0,armature:s.rig.armature}),d=new Set,m=s=>{if(!E.unkept.includes(s)||d.has(s))return;d.add(s);const a=`The game plays "${s}", which nothing in the file uses and has no fake user, so Blender drops it the next time the file saves. Give it a fake user (action.use_fake_user = True) or assign it.`;u.push(a),W().console.warn(a,"blender-animation")},_=s=>({ok:!1,why:`${s.name||"this object"} has no armature`});return{warnings:u,clips:s=>N(s)?g:[],play(s,a,e={}){const t=N(s);if(!t)return _(s);const n=z(t,a);if(n)return{ok:!1,why:n};m(a);const l=t.line.at(-1);if(l?.action===a&&l.weight.target>0)return e.restart&&(t.line[t.line.length-1]={...l,from:P}),T(t);const c=Math.max(0,e.fade??.2);return t.line=l&&c>0?[...t.line,S(a,e,ie(0,1,c))]:[S(a,e,ie(1,1,0))],T(t)},stop(s,a=.2){const e=N(s);if(e)if(a<=0)e.line=[];else for(const t of e.line)Object.assign(t.weight,ie(t.weight.weight,0,a))},playing:s=>{const a=N(s)?.line.at(-1);return a&&a.weight.target>0?a.action:null},track(s,a,e){const t=N(s);if(!t)return _(s);const n=t.facts.animation?.tracks.some(p=>p.name===a)??!1,l=t.tracks.get(a);if(e===null)return l?.own?Object.assign(l.influence,ie(l.influence.weight,0,.2)):t.tracks.delete(a),T(t);if(e.action){const p=z(t,e.action);if(p)return{ok:!1,why:p};m(e.action)}else if(!n&&!l)return{ok:!1,why:`${t.rig.armature} has no NLA track "${a}"; give it an \`action\` to make one`};const c=l??{action:null,previous:null,influence:ie(1,1,0),mute:!1,own:!n};if(e.influence!==void 0&&Object.assign(c.influence,ie(c.influence.weight,Math.max(0,Math.min(1,e.influence)),Math.max(0,e.fade??0))),e.mute!==void 0&&(c.mute=e.mute),e.action&&(c.action?.action!==e.action||e.restart)){const p=Math.max(0,e.fade??.2);c.previous=c.action&&p>0?c.action:null,c.action=S(e.action,e,ie(c.previous?0:1,1,p))}return t.tracks.set(a,c),T(t)},constraint(s,a,e,t){const n=N(s);if(!n)return _(s);const l=n.facts.bones.find(M=>M.name===a);if(!l)return{ok:!1,why:`${n.rig.armature} has no bone "${a}"`};const c=l.constraints?.find(M=>M.name===e);if(!c)return{ok:!1,why:`bone "${a}" has no constraint "${e}"; it has ${(l.constraints??[]).map(M=>`"${M.name}"`).join(", ")||"none"}`};if(c.type!=="DAMPED_TRACK")return{ok:!1,why:`"${e}" is a ${c.type} constraint, which plays only in Blender; a game plays Damped Track`};const p=`${a}\0${e}`;return n.constraints.set(p,{...n.constraints.get(p),...t}),T(n)},async prepare(){const s=G();for(let e=0;e<V&&!L;e+=1){const t=s.filter(({armature:n,action:l})=>n.clips.get(l)===void 0);if(t.length===0)break;await Promise.all(t.map(({armature:n,action:l})=>$(n,l)))}return{failed:s.filter(({armature:e,action:t})=>e.clips.get(t)==null&&e.failed.has(t)&&!/animates none/.test(e.failed.get(t)??"")).map(({armature:e,action:t})=>`${e.rig.armature} / ${t}: ${e.failed.get(t)}`)}},prefetch(){const s=new Map;for(const e of j.values()){const t=new Set;e.facts.action&&t.add(e.facts.action);for(const n of e.facts.animation?.tracks??[])for(const l of n.strips)l.action&&t.add(l.action);for(const n of t)n in E.actions&&s.set(n,[...s.get(n)??[],e])}const a=[...s].sort((e,t)=>t[1].length-e[1].length).flatMap(([e,t])=>t.map(n=>({armature:n,action:e})));(async()=>{for(;!L;){if(F.size>0){await Promise.allSettled([...F.values()]);continue}const e=a.find(({armature:t,action:n})=>!t.clips.has(n));if(!e)return;await $(e.armature,e.action)}})()},pending(){return G().filter(({armature:s,action:a})=>s.clips.get(a)===void 0&&!s.failed.has(a)).map(({armature:s,action:a})=>`${s.rig.armature} / ${a}`)},update(s){if(!L){P+=s;for(const a of j.values()){for(const l of a.line)Le(l.weight,s);let e=-1;a.line.forEach((l,c)=>{l.weight.weight>=1&&(e=c)}),e>0&&(a.line=a.line.slice(e)),a.line=a.line.filter(l=>l.weight.weight>0||l.weight.target>0);for(const[l,c]of a.tracks)Le(c.influence,s),c.action&&Le(c.action.weight,s),c.previous&&c.action&&c.action.weight.weight>=1&&(c.previous=null),c.own&&c.influence.weight===0&&c.influence.target===0&&a.tracks.delete(l);const t=Y(a);if(!t)continue;const n=O.get(a)??[];a.posed=t.map((l,c)=>({track:n[c]??null,action:l.clip.action,frame:l.frame,influence:l.influence,blend:l.blend})),a.pose.apply(t,{object:l=>r.objectForBlenderName(l),override:(l,c)=>a.constraints.get(`${l}\0${c}`)})}}},channels(s,a){const e=j.get(s)?.clips.get(a);if(!e)return[];const t=new Map;for(const n of e.channels){let l=t.get(n.bone);l||t.set(n.bone,l=new Set);for(const c of n.curves)if(c)for(let p=0;p<c.keys.length;p+=6)l.add(Math.round(c.keys[p]*1e3)/1e3)}return[...t].map(([n,l])=>({bone:n,keys:[...l].sort((c,p)=>c-p)}))},live:()=>[...j.values()].map(s=>({armature:s.rig.armature,layers:s.posed})),dispose(){L=!0,j.clear()}}}function Oe(r){return/file format is not supported|not a blend file/i.test(r)?"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(r)?"Blender could not access the model file. Check its file permissions, then try again.":/ENOENT|no such file|file not found/i.test(r)?"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(r)?"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 Gn=18e4;function ft({documentId:r,path:o,error:i,preview:u,retry:E,returnToPreview:g,preparingView:w=!1,note:v=null}){const A=i?"Could not open model":w?"Preparing model view":"Opening model",[j]=h.useState(()=>Date.now()),[P,L]=h.useState(()=>Date.now());h.useEffect(()=>{if(i)return;const B=setInterval(()=>L(Date.now()),5e3);return()=>clearInterval(B)},[i]);const O=P-j,I=!i&&O>=Gn,V=h.useMemo(()=>{const B={id:`opening:${r}`,label:A,secondaryLabel:o,role:"boundary",kind:"object",parentId:null,childIds:[]};return{capabilities:{transform:!1,inspectorFields:!1,persist:!1},hierarchy:{roots:()=>[B],node:F=>F===B.id?B:null},subscribe:()=>()=>{}}},[r,o,A]);return b.jsxs("div",{"data-testid":"blender-model-opening","aria-busy":!i,style:{position:"absolute",inset:0,overflow:"auto",background:Q.surface.panel,color:Q.content.primary},children:[!w&&b.jsx(Nt,{documentId:r,type:"Model",title:o,status:i?Oe(i):A,selection:()=>({adapter:V,nodeId:null})},A),u&&b.jsx("img",{src:u.image,alt:`Last view of ${u.path}`,draggable:!1,style:{position:"absolute",inset:0,width:"100%",height:"100%",objectFit:"contain",pointerEvents:"none"}}),b.jsxs("div",{style:{position:"relative",minHeight:"100%",display:"flex",flexDirection:"column",justifyContent:u?"flex-end":"center",alignItems:u?"flex-start":"center",boxSizing:"border-box",padding:ne[8],gap:ne[4]},children:[u&&b.jsxs("div",{style:{padding:`${ne[2]} ${ne[4]}`,background:Q.surface.chrome,border:`1px solid ${Q.boundary.default}`,borderRadius:Q.shape.small,maxWidth:"100%",overflowWrap:"anywhere"},children:["Previous model: ",u.path," · Preview only"]}),b.jsx(Dt,{tone:i?"error":"loading",style:{width:"min(100%, 32rem)",background:Q.surface.chrome,border:`1px solid ${Q.boundary.default}`,borderRadius:Q.shape.small,overflowWrap:"anywhere"},title:b.jsx("span",{style:{fontSize:De.lg},children:A}),description:b.jsxs(b.Fragment,{children:[b.jsx("div",{style:{color:Q.content.primary,marginBottom:ne[3]},children:o}),i?Oe(i):w?"The file is open. Preparing its viewport.":u?"The previous model stays visible while this file opens.":"Preparing Blender and opening this file. The model will appear here when it is ready.",I&&b.jsxs("div",{"data-testid":"blender-model-opening-stalled",style:{marginTop:ne[3],color:Q.content.primary},children:["Still opening after ",Math.floor(O/6e4)," minutes. It may have stalled: retry opening, or reload the page."]}),!i&&v&&b.jsx("div",{"data-testid":"blender-model-opening-note",style:{marginTop:ne[3],color:Q.content.muted,userSelect:"text"},children:v}),i&&b.jsx("div",{"data-testid":"blender-model-opening-detail",style:{marginTop:ne[3],fontFamily:Bt,fontSize:De.sm,color:Q.content.muted,whiteSpace:"pre-wrap",userSelect:"text",textAlign:"left"},children:i})]}),action:i||I?b.jsxs("div",{style:{display:"flex",flexWrap:"wrap",justifyContent:"center",gap:ne[3]},children:[u&&b.jsx(Ue,{onClick:g,children:"Return to previous model"}),b.jsx(Ue,{variant:"secondary",onClick:E,children:"Retry opening"})]}):b.jsx("progress",{"aria-label":`Opening ${o}`,style:{width:"min(100%, 18rem)",accentColor:Q.accent.default}})})]})]})}let de=null;const ze=new Set;let Fe=!1;function $t(){Fe||(Fe=!0,queueMicrotask(()=>{Fe=!1;for(const r of[...ze])r()}))}function bt(r){de?.project===r.project&&de.capturedAt>r.capturedAt||de!==r&&(de=r,$t())}function Wn(){de&&(de=null,$t())}function zn(r){return de?.project===r?de:null}function qn(r){return ze.add(r),()=>{ze.delete(r)}}const mt=new Map,ht="blender-model-open",Hn=3e4,gt=new WeakMap;let Un=0;function Kn(r){let o=gt.get(r);return o===void 0&&(o=++Un,gt.set(r,o)),o}const yt=new WeakSet,ir="workspace.document",cr="Blender Model",dr=({documentId:r,notify:o})=>b.jsx(Ot,{documentId:r,notify:o}),Jn="model",ur="owned",pr=[],oe=rn,Yn={wireframe:"WIREFRAME",solid:"SOLID",preview:"MATERIAL",rendered:"RENDERED"},wt=new WeakMap;function Xn(r){let o=wt.get(r);return o||(o={subject:()=>{const i=he.playhead();return r.subjectLine(i===null?null:Math.floor(i))},gridScale:i=>r.gridUnitName(i),cameraView:{camera:()=>r.cameraViewCamera(),zoom:r.cameraViewZoom,pan:r.cameraViewPan,showing:i=>r.setCameraViewShowing(i),setPose:(i,u,E,g)=>{const{location:w,rotation:v}=r.blenderPose(u,E);return $e(`from mathutils import Matrix, Quaternion, Vector
|
|
10
|
-
import bpy
|
|
11
|
-
object = bpy.data.objects[${JSON.stringify(i)}]
|
|
12
|
-
object.matrix_world = Matrix.LocRotScale(Vector((${w.join(", ")})), Quaternion((${v.join(", ")})), object.matrix_world.to_scale())`,g,"Lock Camera to View").then(A=>{A.error!==null&&W().console.error(`Blender refused the camera's pose: ${A.error}`,"blender-camera")},A=>W().console.error(`The camera's pose was not written to Blender: ${String(A)}`,"blender-camera"))},view:(i,u,E,g)=>r.cameraView(i,u,E,g)}},wt.set(r,o),o)}function fr(r){const{active:o,document:i,documentId:u,notify:E,publishContext:g}=r,w=i?.source?.path,v=i?.id,A=JSON.stringify([u,v,w]),[j,P]=h.useState(null),[L,O]=h.useState(null),[I,V]=h.useState(0),B=W().projectLocalState.projectRootPath(),F=h.useSyncExternalStore(qn,()=>zn(B),()=>null),H=h.useSyncExternalStore(vt,xe,xe),K=h.useRef(null),f=h.useRef({notify:E,publishContext:g});return f.current={notify:E,publishContext:g},h.useEffect(()=>W().session.onEnded(Wn),[]),h.useEffect(()=>{if(o===!1||!u||!v||!B||j?.key!==A||j.error)return;const y=Ce(u);if(!y)return;let $=!1,G;const R=async()=>{try{const Y=oe.snapshot(),D=pe(u);if(!D||y.root!==oe.root||!et(u,v,w,Y))return;const N=await y.requestPresentedFrame();if($||oe.snapshot()!==Y||Ce(u)!==y||y.root!==oe.root||pe(u)!==D||!et(u,v,w,Y))return;if(N&&N.width>0&&N.height>0){const z=window.document.createElement("canvas");z.width=Math.min(N.width,1024),z.height=Math.max(1,Math.round(z.width*N.height/N.width));const S=z.getContext("2d");S&&(S.drawImage(N,0,0,z.width,z.height),K.current={project:B,entryId:v,path:w??"Model",image:z.toDataURL("image/png"),capturedAt:performance.now()},bt(K.current))}}catch{}finally{$||(G=setTimeout(()=>{R()},1e3))}};return R(),()=>{$=!0,clearTimeout(G)}},[o,w,u,v,B,A,j,H]),h.useLayoutEffect(()=>{if(!(o===!1||!u||!v||!B||j?.key!==A||j.error))return()=>{if(!W().session.open())return;const y=K.current;y?.project===B&&y.entryId===v&&bt(y)}},[o,w,u,v,B,A,j]),h.useEffect(()=>{if(o===!1||!u)return;let y=!1,$;const G=w===void 0?null:{documentId:u,entryId:v,blend:w},R=nn(G),Y=()=>{$=f.current.publishContext?.(oe)};P(null),O(null);const D=W().documents;let N=!1,z=!1,S=!1;const T=w??"the model",d=async()=>{if(!(y||N||z)){if(G&&!on(G)){S=!0;return}N=!0,S=!1;try{if(G){if(!await sn(G,Y)){S=!0;return}}else Y();y||(z=!0,Gt(ht),P({key:A,error:null}))}catch(e){if(y)return;z=!0,$?.(),$=void 0;const t=e instanceof Error?e.message:String(e);P({key:A,error:t}),W().console.error(t,"blender-open"),f.current.notify?.({tone:"error",title:`Blender could not open ${T}`,detail:Oe(t)}),Wt(ht,{message:`Blender could not open ${T}: ${t}`,guidance:`${Oe(t)} Dismiss this to reach the model's Retry.`,command:null})}finally{N=!1}}},m=setInterval(()=>{y||z||O(S?`Still waiting: Blender is holding another model, and opens ${T} when it is free.`:`Still opening ${T}: Blender is working (a large file, or a cold start). ${It("status")} shows what it is busy with.`)},Hn);let _=!1;const s=()=>{y||_||(_=!0,setTimeout(()=>{_=!1,d()},0))},a=D.subscribe(s);return s(),()=>{y=!0,clearInterval(m),a(),$?.(),R()}},[o,w,u,v,A,I]),o===!1||!u?null:j?.key!==A||j.error?b.jsx(ft,{documentId:u,path:w??"Model",error:j?.key===A?j.error:null,preview:F,note:L,retry:()=>{P(null),V(y=>y+1)},returnToPreview:()=>{F&&W().workspace.open({kind:"document",id:F.entryId}).then(y=>{if(!y)throw new Error("The previous model is no longer available in this project.")}).catch(y=>f.current.notify?.({tone:"error",title:"Could not return to the previous model",detail:String(y)}))}}):b.jsxs(b.Fragment,{children:[b.jsx(Qn,{...r}),!pe(u)&&b.jsx(ft,{documentId:u,path:w??"Model",error:null,preparingView:!0,preview:F,retry:()=>{},returnToPreview:()=>{}})]})}function Qn(r){const{documentId:o}=r,i=r.document?.source?.path;h.useEffect(()=>o?gn(o,i):void 0,[o,i]),h.useEffect(()=>{if(!o)return;let S=!1,T=0,d=null;const m=[o,`${o}#area-2`,`${o}#play`],_=()=>{for(const n of m)Ce(n)?.setDisplayTransform(d?.transform??null)},s=async()=>{const n=++T,l=await an();if(!l)return;const[c,p]=await Promise.all([nt(`${l.scene}.view_settings`),nt(`${l.scene}.display_settings`)]);if(S||n!==T||c?.kind!=="struct"||c.type!=="ColorManagedViewSettings")return;if(p?.kind==="struct"){const q=p.groups.flatMap(ue=>ue.rows).find(ue=>ue.identifier==="display_device")?.value;if(typeof q=="string"&&q!=="sRGB")throw new Error(`Blender display device ${q} has no browser display processor yet`)}const M=c.groups.flatMap(q=>q.rows),X=M.find(q=>q.identifier==="view_transform")?.value,Z=M.find(q=>q.identifier==="exposure")?.value,re=M.find(q=>q.identifier==="look")?.value,k=M.find(q=>q.identifier==="gamma")?.value,C=typeof Z=="number"?2**Z:1,U={transform:typeof X=="string"?X:"AgX",look:typeof re=="string"?re:"None",exposure:C,gamma:typeof k=="number"?k:1},J=JSON.stringify(U);if(d?.key===J)return;const x=await ln(U);if(S||n!==T){x.dispose();return}const ae=d;d={key:J,transform:x},_(),ae?.transform.dispose();for(const q of m)Me(q,{modes:{rendered:{lighting:{tone:{mapper:"none",exposure:1}}},preview:{lighting:{tone:{mapper:"none",exposure:1}}}}})},a=()=>{s().catch(n=>W().console.error(String(n),"blender-colour"))},e=_t(a),t=St(_);return a(),()=>{S=!0,e(),t();const n=d;d=null,_(),n?.transform.dispose()}},[o]);const u=h.useSyncExternalStore(At,()=>o?qe(o):!1,()=>!1),[E,g]=h.useState(null);h.useEffect(()=>{if(!u||!o)return;const S=`${o}#area-2`;Vt(S).drawMode===void 0&&Me(S,{drawMode:"rendered"});const T=oe.follow();return g(T),()=>{g(null),T.dispose()}},[u,o]);const w=h.useSyncExternalStore(Re,()=>o?se("model")?.playing(o)??!1:!1,()=>!1),[v,A]=h.useState(null),j=h.useSyncExternalStore(Re,()=>o?se("model")?.aspectRatio?.(o)??null:null,()=>null),[P,L]=h.useState(!1),O=h.useSyncExternalStore(Re,()=>o?se("model")?.transport?.generation(o)??0:0,()=>0),[I,V]=h.useState(O),[B,F]=h.useState(null),H=h.useRef(!1),K=h.useRef(!1);h.useLayoutEffect(()=>{if(O!==I){if(w&&o){if(H.current=!0,!K.current){let S=null;try{S=pe(`${o}#play`)?.capture?.()??null}catch{}F(S)}K.current=!0}V(O)}},[O,I,w,o]);const f=se("model")?.transport,y=h.useCallback(S=>f?.subscribeClock(S)??(()=>{}),[f]),$=h.useSyncExternalStore(y,()=>o&&f?f.clock(o).failure??null:null,()=>null);h.useEffect(()=>{$!==null&&(K.current=!1,F(null))},[$]);const G=h.useRef([]);h.useEffect(()=>{if(!w||!o){H.current=!1;return}const S=`${o}#play`;Me(S,{drawMode:"rendered"});const T=oe.detach(),d=H.current;return H.current=!1,d||L(!1),A(T),d||(oe.setPlaying(!0),Ke(o)),()=>{if(H.current&&se("model")?.playing(o)){G.current.push(T);return}T.dispose();for(const m of G.current.splice(0))m.dispose();K.current=!1,A(null),F(null),oe.setPlaying(!1),Ke(o)}},[w,o,I]),h.useEffect(()=>{for(const S of G.current.filter(T=>T!==v))S.dispose();G.current=G.current.filter(S=>S===v)},[v]),h.useEffect(()=>()=>{for(const S of G.current.splice(0))S.dispose()},[]),h.useEffect(()=>{if(o)return()=>se("model")?.setPlaying(o,!1)},[o]);const R=w?v:null,Y=j===null?{position:"absolute",inset:0}:{position:"absolute",left:"50%",top:"50%",transform:"translate(-50%, -50%)",width:`min(100cqw, calc(100cqh * ${j}))`,height:`min(100cqh, calc(100cqw / ${j}))`};if(h.useEffect(()=>{if(!R||!o)return;const S=pe(o);if(!S)return;const T=S.capture,d=m=>pe(`${o}#play`)?.capture?.(m)??null;return S.capture=d,()=>{S.capture===d&&(T?S.capture=T:delete S.capture)}},[R,o]),!o)return null;const D=u?E:null,N={position:"relative",flex:"1 1 0",minWidth:0,margin:12},z=R!==null&&P;return b.jsxs("div",{style:R||D?{position:"absolute",inset:-12,display:"flex",gap:2}:{display:"contents"},children:[b.jsx("div",{inert:z||void 0,style:R?{position:"absolute",inset:12,zIndex:2,opacity:P?0:1,pointerEvents:P?"none":"auto",transition:"opacity 160ms ease-out"}:D?N:{display:"contents"},children:b.jsx(Ne,{...r,view:oe,main:!0})},"model"),R&&b.jsx("div",{style:{position:"absolute",inset:12,containerType:"size"},"data-testid":"blender-play-area",children:b.jsx("div",{"data-volter-play-frame":!0,style:Y,children:b.jsx(Ne,{...r,documentId:`${o}#play`,view:R.view,main:!1,playing:!0,onPlayReady:()=>{K.current=!1,L(!0),F(null)},onPlayReturn:()=>L(!1)})})},`play-${Kn(R)}`),R&&$!==null&&b.jsxs("div",{role:"alert","data-testid":"blender-play-failure",style:{position:"absolute",left:24,right:24,top:24,zIndex:4,padding:`${ne[2]} ${ne[3]}`,background:Q.surface.chrome,border:`1px solid ${Q.semantic.danger}`,borderRadius:Q.shape.small,color:Q.content.primary,fontSize:De.sm,whiteSpace:"pre-wrap",overflowWrap:"anywhere",userSelect:"text"},children:[b.jsx("strong",{style:{color:Q.semantic.danger},children:"Play is not running."})," ",$," Restart (or save the script) to try again, or Stop."]},"play-failure"),R&&B!==null&&b.jsx("div",{style:{position:"absolute",inset:12,containerType:"size",zIndex:3,pointerEvents:"none"},"data-testid":"blender-play-restart-still",children:b.jsx("img",{alt:"",src:B,style:{...Y,display:"block",objectFit:"fill"}})},"restart-still"),D&&b.jsxs("div",{style:{...N,visibility:R?"hidden":void 0},"aria-hidden":R?!0:void 0,"data-testid":"blender-second-area",children:[b.jsx(Ne,{...r,documentId:`${o}#area-2`,view:D.view,main:!1}),!R&&b.jsx(Zn,{documentId:o,areaId:`${o}#area-2`,notify:r.notify})]},"second")]})}function Zn({documentId:r,areaId:o,notify:i}){h.useSyncExternalStore(vt,xe,xe);const u=h.useSyncExternalStore(qt,()=>Ht(r)),E=pe(o)?.HeaderControls,g=h.useRef(null);return h.useEffect(()=>{const w=g.current,v=w?.parentElement;if(!v)return;const A=()=>Ye(r,{headerWidth:v.getBoundingClientRect().width+12,shelf:w});A();const j=new ResizeObserver(A);return j.observe(v),()=>{j.disconnect(),Ye(r,null)}},[r]),b.jsxs(b.Fragment,{children:[b.jsx("div",{ref:g,className:"volter-dock-document-shelf",role:"toolbar","aria-orientation":"vertical","aria-label":"Document tools"}),u&&Ut.createPortal(b.jsxs("div",{className:"volter-dock-document-toolbar-own","data-testid":`document-header:${o}`,style:{display:"flex",alignItems:"center"},children:[b.jsx(Ot,{documentId:r,notify:i}),E&&b.jsx(h.Suspense,{fallback:null,children:b.jsx(E,{documentId:o})})]}),u)]})}function Ne({active:r,document:o,documentId:i,notify:u,surfaces:E,view:g,main:w,playing:v=!1,onPlayReady:A,onPlayReturn:j}){const P=Xn(g),L=h.useCallback(()=>({root:g.root,prepareDraw:(d,m)=>g.prepareDraw(d,m),...v?{}:{onChange(d){const m=g.onChange(d),_=he.subscribe(d);return()=>{m(),_()}}},dispose(){}}),[g,v]),O=o?.source?.path,I=h.useCallback(d=>{const m=g.onChange(d),_=he.subscribe(d);let s=null;const a=()=>{s?.(),s=ce().find(t=>t.documentId===i)?.onFrame(d)??null};a();const e=je(a);return()=>{m(),_(),e(),s?.()}},[i,g]),V=h.useSyncExternalStore(I,P.subject),B=h.useMemo(()=>w?Tn:xt(()=>g),[w,g]);h.useEffect(()=>{if(w||v||!i)return;let d=!1;const m=()=>{if(d)return;const a=Ce(i);a===null||g.cameraViewCamera()===null||(d=a.toggleCameraView())};m();const _=St(m),s=g.subscribeFrames(m);return()=>{_(),s()}},[w,v,i,g]);const F=h.useRef(u),H=h.useRef(null),[K,f]=h.useState(!1);F.current=u;const y=h.useRef(A);y.current=A;const $=h.useRef(j);$.current=j,h.useEffect(()=>{if(!v||!i)return;if(O===void 0){F.current?.({tone:"error",title:"This model has no play script",detail:"A play script stands beside a model's .blend file, and this model has no file of its own."});return}const d=i.replace(/#play$/,""),m=window.document.createElement("div");Object.assign(m.style,{position:"absolute",inset:"0",pointerEvents:"none"}),m.dataset.testid="model-play-roots",H.current?.appendChild(m),f(!1);let _=!1,s=!1,a=null,e=null,t=null;const n=()=>{if(a||s||_)return;const k=ce().find(U=>U.documentId===i);if(!k||!g.root.parent)return;s=!0,e=k.rig().orbit,e.enabled=!1;const C=window.document.createElement("div");C.dataset.testid="model-play-loading",C.textContent="Loading…",Object.assign(C.style,{position:"absolute",inset:"0",display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0, 0, 0, 0.35)",color:"#e6e6e6",font:"600 14px system-ui, sans-serif",pointerEvents:"none"}),m.appendChild(C),g.prepareRendered(k.rig().drawCamera(),"render").then(async()=>{if(_)return;let U=mt.get(d);U||mt.set(d,U=new Map);let J=null;try{J=Vn(g,async(x,ae)=>{const q=await Te({object:x,action:ae,summary:!1});if(q===null)throw new Error("Blender's session is not started");return q},U)}catch(x){W().console.error(`The game's animation could not be set up, so the game starts without it: ${x instanceof Error?x.message:String(x)}`,"blender-animation")}if(t=J,!(!J&&(C.remove(),_))){if(J){const x=J,ae=3e3,q=2e4,ue=ee=>`${ee.length} clip${ee.length===1?"":"s"}`,Mt=window.setInterval(()=>{const ee=x.pending();ee.length>0&&(C.textContent=`Loading… waiting on Blender for ${ue(ee)}: ${ee.slice(0,6).join(", ")}${ee.length>6?` and ${ee.length-6} more`:""}`)},ae);let He=0;const be=await Promise.race([x.prepare().then(({failed:ee})=>({failed:ee,waiting:[]}),ee=>({failed:[`the loading phase failed: ${ee instanceof Error?ee.message:String(ee)}`],waiting:[]})),new Promise(ee=>{He=window.setTimeout(()=>ee({failed:[],waiting:x.pending()}),q)})]);if(window.clearInterval(Mt),window.clearTimeout(He),C.remove(),_)return;be.failed.length>0&&W().console.warn(`The game started without ${ue(be.failed)} it starts on: ${be.failed.join("; ")}`,"blender-animation"),be.waiting.length>0&&W().console.warn(`The game started after ${q/1e3} s still waiting on Blender for ${ue(be.waiting)}; each plays once Blender answers: ${be.waiting.join(", ")}`,"blender-animation"),x.prefetch()}at(t),a=se("model")?.run({...t?{animation:t}:{},documentId:d,container:m,ready:()=>{_||(f(!0),y.current?.())},returning:()=>{_||$.current?.()},sourcePath:O,root:g.root,camera:()=>k.rig().drawCamera(),editingCamera:()=>ce().find(x=>x.documentId===d)?.rig().drawCamera()??k.rig().drawCamera(),onFrame:x=>k.onFrame(x),ownMaterial:x=>cn(x),report:(x,ae)=>{W().console.error(`${x}: ${ae}`,"blender-play"),F.current?.({tone:"error",title:x,detail:ae})}})??null}},U=>{if(C.remove(),_)return;const J=`The game's stage could not be prepared for a rendered draw: ${U instanceof Error?U.message:String(U)}`;W().console.error(J,"model-play");const x=se("model");x?.transport?.fail?x.transport.fail(d,O,J):(F.current?.({tone:"error",title:"Play could not start",detail:J}),x?.setPlaying(d,!1))})};n();let l,c;const p=()=>{const k=ce().find(C=>C.documentId===i);k!==l&&(c?.(),l=k,c=k?.onFrame(n),n())};p();const M=je(p),X=k=>{k.key!=="Escape"||!Kt(k)||globalThis.document.pointerLockElement||performance.now()-Z<500||setTimeout(()=>{if(k.defaultPrevented)return;const C=se("model");C?.escape?C.escape(d):C?.setPlaying(d,!1)},0)};let Z=-1/0;const re=()=>{globalThis.document.pointerLockElement||(Z=performance.now())};return globalThis.document.addEventListener("pointerlockchange",re),window.addEventListener("keydown",X,!0),()=>{globalThis.document.removeEventListener("pointerlockchange",re),_=!0,M(),c?.(),window.removeEventListener("keydown",X,!0),a?.(),yn()===t&&at(null),t?.dispose(),t=null,m.remove(),e&&(e.enabled=!0)}},[v,i,O,g]),h.useEffect(()=>!w||!i?void 0:Je(()=>{const m=g.savedView(),_=Xe(i).drawMode,s=Yn[_];!m||s===void 0||m.drawMode===_||(g.noteSavedShading(s),dn(s))}),[w,i,g]),h.useEffect(()=>{if(w||!i)return;const d=()=>{const m=Jt(i);m===null||yt.has(m)||(yt.add(m),m.showHelpers&&m.toggleHelpers(),m.showGizmos&&m.toggleGizmos())};return d(),zt(d)},[w,i]),h.useEffect(()=>{if(!i)return;const d=g.overlayGroups(),m=()=>{const s=ce().find(a=>a.documentId===i);if(s)for(const{kind:a,object:e}of d)s.setHelper(a,e)};m();const _=je(m);return()=>{_();const s=ce().find(a=>a.documentId===i);for(const{kind:a}of d)s?.setHelper(a,null)}},[i,g]);const G=h.useSyncExternalStore(_t,tt,tt);h.useEffect(()=>{if(!i||!w)return;let d=!0;return he.sync(g,{clip:m=>Te({object:m}),bake:(m,_)=>Te({object:m,action:_,summary:!1})}).catch(m=>{d&&W().console.warn(`This file's action could not be read: ${m instanceof Error?m.message:String(m)}`,"blender-skin")}),()=>{d=!1}},[i,w,g,G]),h.useEffect(()=>{if(!i||!w)return;const{transport:d}=W();let m=null,_=!1,s=!1;const a=()=>{if(_||m)return;const n=d.for(i);n&&(m=he.attachTo(n))},e=()=>{_||s||(s=!0,queueMicrotask(()=>{s=!1,a()}))};e();const t=d.subscribe(e);return()=>{_=!0,t();const n=m;m=null,n&&queueMicrotask(n)}},[i,w]),h.useEffect(()=>{if(!i)return;const d=()=>ce().find(l=>l.documentId===i);let m,_=null;const s=new wn,a=()=>d()?.rig().drawCamera()??s,e=()=>{const l=d();l!==m&&(_?.(),_=l?l.onFrame(()=>g.refreshRendered()):null,m=l);const{lighting:c,drawMode:p}=Xe(i),M=p==="preview",X=M?{world:c.source==="scene",lights:c.preview.sceneLights}:void 0,Z=c.source==="scene"||M&&c.preview.sceneLights;g.holdRendered(Z&&l?a:null,X,v?"render":"viewport"),g.setWorkbench(c.source==="studio"&&c.studioPreset===jt.id)};e();const t=Je(e),n=je(e);return()=>{t(),n(),_?.(),g.holdRendered(null),g.setWorkbench(!1)}},[i,g,v]);const R=h.useRef(null),Y=d=>!v&&d.button===2&&d.shiftKey&&d.target instanceof HTMLCanvasElement,D=d=>{if(!Y(d)){R.current=null;return}d.preventDefault(),d.stopPropagation(),R.current={id:d.pointerId,x:d.clientX,y:d.clientY},d.isTrusted&&d.target.setPointerCapture(d.pointerId)},N=()=>{R.current=null},z=d=>{const m=R.current;if(m===null||d.pointerId!==m.id||d.button!==2||(R.current=null,d.preventDefault(),d.stopPropagation(),Math.hypot(d.clientX-m.x,d.clientY-m.y)>3))return;const _=g.placeCursor(d.clientX,d.clientY,d.target);if(_===null)return;const[s,a,e]=_.location,[t,n,l,c]=_.rotation;$e(`from mathutils import Matrix, Quaternion, Vector
|
|
13
|
-
bpy.context.scene.cursor.matrix = Matrix.LocRotScale(Vector((${s}, ${a}, ${e})), Quaternion((${t}, ${n}, ${l}, ${c})), None)`,!1,"Set 3D Cursor").then(p=>{p.error!==null&&W().console.error(`Blender refused the 3D cursor: ${p.error}`,"blender-cursor")},p=>W().console.error(`The 3D cursor was not written to Blender: ${String(p)}`,"blender-cursor"))},S=d=>{Y(d)&&d.preventDefault()};if(!i)return null;const T=E.Object3DAuthoring;return b.jsx("div",{ref:H,"data-play-ready":v?K:void 0,style:v?{position:"absolute",inset:0}:{display:"contents"},onPointerDownCapture:D,onPointerUpCapture:z,onPointerCancelCapture:N,onLostPointerCaptureCapture:N,onContextMenuCapture:S,children:b.jsx(T,{active:r??!0,fillContainer:v,documentId:i,sourcePath:O??"blender:runtime",displayName:o?.label??"Model",...V===null?{}:{subject:V},gridScale:P.gridScale,cameraView:P.cameraView,build:L,audit:!1,...v?{}:{authoring:B},cameraDirection:[.8187,.4458,.3617],openingFit:3,openingView:g.savedView(),presentation:(()=>{const d=g.savedView();if(!d)return null;const m={fov:Ct(d.lens)};return w&&d.drawMode?{camera:m,drawMode:d.drawMode,modes:{preview:{lighting:{source:d.sceneWorld?"scene":"preview",preview:{sceneLights:d.sceneLights}},backdrop:{source:d.sceneWorld?"scene":"fill"}}}}:{camera:m}})(),stageKind:Jn,dressing:{environment:!1,keyLight:!1,viewLocked:g.studioLights()}})})}export{dr as Toolbar,fr as default,Jn as documentKind,pr as inspectorBuiltins,ur as inspectorRail,ir as point,cr as title};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{h6 as n,iH as r}from"./volter-sdk-mgLi8_Cw.js";const c="workspace.menu",i={menu:"window",items:[{id:"blender-save-screenshot-editor",label:"Save Screenshot (Editor)…",testId:"menu-save-screenshot-editor",execute:async()=>{const e=n(),t=await e.documents.captureActive();r(t.base64);const o=`screenshots/screenshot-${new Date().toISOString().replace(/[:.]/g,"-")}.png`;await e.files.write(o,Uint8Array.from(atob(t.base64),s=>s.charCodeAt(0))),e.console.log(`Saved the screenshot to ${o}.`,"blender-screenshot")}}]};export{i as menu,c as point};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as m,aJ as Oe,j as r,ij as rt,i2 as Ie,ik as Me}from"./volter-sdk-mgLi8_Cw.js";import{s as ve,b as X,g as st}from"./blender-runtime-host-swgDAdoy.js";import{s as je,p as U,m as ie,a as pe,b as v,c as at,d as ot,e as Le,f as he,g as G,h as He,l as se}from"./play-live-BBkOuWQn.js";import"./output-pass-j4dAGrPY.js";import"./three.module-CtVjCPcj.js";import"./linear-resolve-Cuka7Ypb.js";const lt={transform:{startFrame:-5,pixelsPerFrame:8},refusal:null,size:{w:0,h:0},framedAt:0,drawn:null,onlySelected:!0,editor:"timeline"};let le=lt,ke=0;const de=new Set;let _e=0;function C(){return le}function D(){return ke}function ae(e){return de.add(e),()=>{de.delete(e)}}function z(e){le={...le,...e},ke+=1;for(const t of[...de])t()}function dt(e){le.onlySelected!==e&&z({onlySelected:e})}function Ce(){_e+=1,ke+=1;for(const e of[...de])e()}function ct(){return _e}function ze(e){z({refusal:e})}const ut=20,M=23,q=26,L=16,mt=2,pt=M+mt,Te=35,ht=6;function De(e){const t=[2,3,5],i=[];for(let n=0;n<t.length;n++){const o=t[n],s=Math.trunc(e/o),a=s*o===e;if(a&&s===2)return o;i[n]=a}for(let n=0;n<t.length;n++)if(i[n])return t[n];return e}function ft(e,t,i,n){if(i===0)return 1;const o=t/i;let s=Math.max(e,1);if(o*s>n)for(;s>1;){const a=De(s),u=Math.trunc(s/a);if(o*u<n)break;s=u}else for(;o*s<n&&s<1<<30;)s*=2;return s}function yt(e){return e<=1?null:e/De(Math.round(e))}const x={back:"#303030",header:"#303030",grid:"#161616",gridMinor:"#262626",scrubBack:"#1d1d1d",scrubText:"#808080",playhead:"#4772b3",playheadText:"#ffffff",keyBorder:"#000000"},xe={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"}},xt={KEYFRAME:1,EXTREME:1.2,MOVING_HOLD:.925,BREAKDOWN:.85,JITTER:.8,GENERATED:.75},ge=5.06,Be=2.12,gt=15,E={minPillWidth:24,textPadding:4,margin:2,radius:4,tipHalfWidth:6,tipHeight:6,stalkWidth:3},$e="#212121",l={text:"#a6a6a6",textHi:"#ffffff",rule:"#161616",widget:"#545454",widgetText:"#e6e6e6",widgetOutline:"#3d3d3d",widgetRadius:4,unit:ut,refusal:"#ffaf23",headerPadding:"0 8px",headerGap:8,statusPadding:"2px 8px"},bt=.2,ce={time:0,tick:0,paused:!1,speed:1},re={on:!1,available:!1,by:null};function Z(){return rt("model")}function K(e,t){t==="game"&&v.transport?.snapshot().playbackState==="playing"&&v.transport.pause(),at(e,t)}function O(e){const t=e?.document;if(typeof t=="string"&&t!=="")return t;const i=pe();if(i===null)throw new Error("No model document is open; open one, or name it with `document`.");return i}function B(){const e=Z();if(e===null)throw new Error("This project has no Play tool: `cyclotron add-play` adds @volter/play.");if(e.transport===void 0)throw new Error("The installed Play tool has no pause, step, speed or restart; update @volter/play.");return e}function I(e){const t=Z(),i=Le(e);return{document:e,mode:ie(e),playing:t?.playing(e)??!1,script:i===void 0||t?.scriptPath===void 0?null:{path:t.scriptPath(i),exists:t.hasScript?.(i)??null},clock:t?.transport?.clock(e)??ce,speeds:t?.transport?.speeds??[],autoplay:wt(e)}}function Ge(e,t){return e?t.on?"bot":t.person===!1?"none":"person":null}function wt(e){const t=Z(),i=t?.transport?.autoplay?.(e)??re,n=t?.playing(e)??!1,o=Ve(n,t?.transport?.clock(e)??ce,i);return{...i,driver:Ge(n,i),why:o}}function We(e,t,i){return i.available?null:e&&(t.running??!t.failure)?"no-bot":"not-running"}function Ve(e,t,i){switch(We(e,t,i)){case null:return null;case"no-bot":return"No autoplay — this game doesn’t provide a bot: its play script registers none with play.autoplay(controller).";case"not-running":return e?`Autoplay is available once the game is running, and it is not running yet${t.failure?`: ${t.failure}`:"."}`:"Autoplay is available once the game is running, and nothing is playing; `play` starts it."}}function fe(e,t){if(!B().playing(e))throw new Error(`Nothing is playing in ${e}, so there is nothing to ${t}; \`play\` starts it.`)}Ie({view:"model-play",title:"Game",verbs:[{id:"state",run:e=>I(O(e))},{id:"mode",run:e=>{const t=O(e),i=e?.mode??e?.to;if(i!==void 0){const n=ot(i);if(n===null)throw new Error(`mode is \`game\` or \`animation\`; got ${String(i)}.`);K(t,n)}return I(t)}},{id:"game-mode",title:"Game: Switch to Game Mode",run:e=>{const t=O(e);return K(t,"game"),I(t)}},{id:"animation-mode",title:"Game: Switch to Animation Mode",run:e=>{const t=O(e);return K(t,"animation"),I(t)}},{id:"play",title:"Game: Play",run:e=>{const t=O(e),i=B();return ie(t)!=="game"&&K(t,"game"),i.playing(t)||i.setPlaying(t,!0),I(t)}},{id:"stop",title:"Game: Stop",run:e=>{const t=O(e);return B().setPlaying(t,!1),I(t)}},{id:"pause",title:"Game: Pause",run:e=>{const t=O(e);return fe(t,"pause"),B().transport.setPaused(t,!0),I(t)}},{id:"resume",title:"Game: Resume",run:e=>{const t=O(e);return fe(t,"resume"),B().transport.setPaused(t,!1),I(t)}},{id:"step",title:"Game: Step One Tick",run:e=>{const t=O(e);fe(t,"step");const{transport:i}=B();if(!i.clock(t).paused)throw new Error("step runs one tick of a PAUSED game; `pause` first.");const n=e?.count,o=n===void 0?1:typeof n=="string"&&n.trim()!==""?Number(n):typeof n=="number"?n:Number.NaN;if(!Number.isInteger(o)||o<1||o>600)throw new Error(`step's \`count\` is a whole number from 1 to 600; got ${JSON.stringify(n)}.`);for(let s=0;s<o;s++)i.step(t);return I(t)}},{id:"speed",run:e=>{const t=O(e),{transport:i}=B(),n=e?.speed??e?.to,o=Number(typeof n=="string"?n.replace(/x$/i,""):n);if(!i.speeds.includes(o))throw new Error(`speed is one of ${i.speeds.join(", ")} (simulation seconds per real second); got ${JSON.stringify(n)}.`);return i.setSpeed(t,o),I(t)}},{id:"autoplay",run:e=>{const t=O(e),i=e?.on,n=i===!0||i==="on"||i==="true"?!0:i===!1||i==="off"||i==="false"?!1:void 0;if(n===void 0)throw new Error(`autoplay's \`on\` is true or false (\`play autoplay on|off\`); got ${String(i)}.`);const o=typeof e?.behavior=="string"&&e.behavior!==""?e.behavior:null,s=e?.for??e?.limit,a=s==null?null:Number(s);if(a!==null&&!(Number.isFinite(a)&&a>0))throw new Error(`autoplay's \`for\` is a positive number of simulation seconds; got ${JSON.stringify(s)}.`);const u=B(),{transport:f}=u;if(f.setAutoplay===void 0)throw new Error("The installed Play tool has no autoplay; update @volter/play.");const c=n?Ve(u.playing(t),f.clock(t),f.autoplay?.(t)??re):null;if(c!==null)throw new Error(c);return f.setAutoplay(t,n,"cli",n?{behavior:o,limit:a}:void 0),I(t)}},{id:"restart",title:"Game: Restart",run:e=>{const t=O(e),i=B();return ie(t)!=="game"&&K(t,"game"),i.transport.restart(t),I(t)}}]});const vt=e=>e.preventDefault();function oe(e){return r.jsx("svg",{width:12,height:12,viewBox:"0 0 12 12","aria-hidden":"true",children:r.jsx("path",{d:e,fill:l.widgetText})})}const V={play:"M3 2l7 4-7 4z",stop:"M2.5 2.5h7v7h-7z",pause:"M3 2h2v8H3zM7 2h2v8H7z",step:"M10 2H8.5v8H10zM2.5 2v8L7.5 6z",restart:"M6 1.5V0l3 2.25-3 2.25V3a3 3 0 1 0 3 3h1.5A4.5 4.5 0 1 1 6 1.5z"};function W({label:e,testId:t,disabled:i,pressed:n,wide:o,onClick:s,children:a}){const u=l.unit;return r.jsx("button",{type:"button","data-testid":t,title:e,"aria-label":e,"aria-pressed":n,disabled:i,onMouseDown:vt,onClick:s,style:{minWidth:u,height:u,padding:o?"0 6px":0,border:`1px solid ${l.widgetOutline}`,background:n?x.playhead:l.widget,color:l.widgetText,font:"inherit",display:"inline-flex",alignItems:"center",justifyContent:"center",gap:4,cursor:i?"not-allowed":"pointer",opacity:i?.4:1},children:a})}function Se({title:e}){m.useSyncExternalStore(je,U,U);const t=m.useSyncExternalStore(Oe,Z,()=>null),i=pe();if(t===null||i===null)return r.jsx("span",{style:{color:l.text},children:e});const n=ie(i),o=(s,a,u)=>r.jsx(W,{testId:`model-play-mode-${s}`,label:u,pressed:n===s,wide:!0,onClick:()=>K(i,s),children:a});return r.jsxs("div",{role:"group","aria-label":"Game or Animation","data-testid":"model-play-mode",style:{display:"flex"},children:[o("game","Game","Game: this area is the Game panel, with Play, pause, step, speed, restart and autoplay"),o("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")]})}function Ke(e){const t=Math.floor(e/60),i=(e-t*60).toFixed(2).padStart(5,"0");return t<60?`${t}:${i}`:`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}:${i}`}function Ae(e){return`${e}×`}function jt(){m.useSyncExternalStore(je,U,U);const e=pe(),t=m.useSyncExternalStore(Oe,Z,()=>null),i=t?.transport,n=e!==null&&(t?.playing(e)??!1),o=m.useCallback(h=>i?.subscribeClock(h)??(()=>{}),[i]),s=m.useSyncExternalStore(o,()=>e!==null&&i?i.clock(e):ce,()=>ce),a=m.useSyncExternalStore(o,()=>e!==null&&i?.autoplay?i.autoplay(e):re,()=>re),u=e===null?void 0:Le(e),f=u===void 0?null:t?.scriptPath?.(u)??null,c=u===void 0?null:t?.hasScript?.(u)??null,p=e!==null&&t!==null,b=e===null?"No model document is open.":c===!1&&f!==null?`No play script yet — Play runs ${f}. \`cyclotron add-play\` adds an example.`:n&&s.failure?`Not running — ${s.failure.replace(/\.$/,"")}. Restart (or save the script) to retry, or Stop.`:n?`${s.paused?"Paused":"Playing"} ${f??""}`.trim():f===null?"Stopped.":`Stopped · Play runs ${f}`;return r.jsxs("div",{"data-testid":"blender-game-panel","data-playing":n||void 0,"data-paused":n&&s.paused||void 0,"data-failed":n&&!!s.failure||void 0,style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",overflow:"hidden",background:x.back,color:l.text,font:"11px Inter, system-ui, sans-serif"},children:[r.jsxs("div",{style:{height:q,flex:`0 0 ${q}px`,display:"flex",alignItems:"center",gap:l.headerGap,padding:l.headerPadding,background:x.header,borderBottom:`1px solid ${l.rule}`},children:[r.jsx(Se,{title:"Game"}),r.jsx("div",{style:{flex:1}}),r.jsxs("div",{style:{display:"flex"},role:"group","aria-label":"Game transport",children:[r.jsxs(W,{testId:"model-play-button",label:n?"Stop playing (Escape)":"Play this model’s script",pressed:n,wide:!0,disabled:!p,onClick:()=>{e!==null&&t&&t.setPlaying(e,!t.playing(e))},children:[oe(n?V.stop:V.play),n?"Stop":"Play"]}),i&&r.jsxs(r.Fragment,{children:[r.jsx(W,{testId:"model-play-pause",label:s.paused?"Resume":"Pause",pressed:n&&s.paused,disabled:!n,onClick:()=>{e!==null&&i.setPaused(e,!i.clock(e).paused)},children:oe(s.paused?V.play:V.pause)}),r.jsx(W,{testId:"model-play-step",label:"Step one tick (while paused)",disabled:!n||!s.paused,onClick:()=>{e!==null&&i.step(e)},children:oe(V.step)}),r.jsx(W,{testId:"model-play-restart",label:"Restart on a fresh copy of the model",disabled:!n,onClick:()=>{e!==null&&i.restart(e)},children:oe(V.restart)})]})]}),i&&r.jsx("div",{style:{display:"flex"},role:"group","aria-label":"Game speed",children:i.speeds.map(h=>r.jsx(W,{testId:`model-play-speed-${h}`,label:`Speed ${Ae(h)}`,pressed:s.speed===h,wide:!0,disabled:e===null,onClick:()=>{e!==null&&i.setSpeed(e,h)},children:Ae(h)},h))}),r.jsx("div",{style:{flex:1}}),r.jsxs("span",{"data-testid":"model-play-clock",style:{color:l.widgetText,fontVariantNumeric:"tabular-nums",whiteSpace:"nowrap"},children:[Ke(s.time)," · tick ",s.tick]})]}),r.jsxs("div",{style:{flex:1,minHeight:0,display:"flex",alignItems:"stretch",gap:l.headerGap,padding:l.statusPadding,overflow:"hidden"},children:[r.jsxs("div",{style:{flex:"0 1 260px",minWidth:0,display:"flex",flexDirection:"column",gap:6},children:[r.jsx("span",{"data-testid":"model-play-status",title:b,style:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:b}),i?.autoplay&&e!==null&&r.jsx(kt,{documentId:e,playing:n,clock:s,autoplay:a,transport:i})]}),t?.log&&e!==null&&r.jsx(St,{documentId:e,log:t.log})]})]})}function kt({documentId:e,playing:t,clock:i,autoplay:n,transport:o}){const s=We(t,i,n),a=n.armed===!0,u=!t&&o.armAutoplay!==void 0,f=s==="no-bot"?"This game provides no bot: its play script registers none with play.autoplay(controller)":s==="not-running"?u?a?"Autoplay is armed for the next Play; press to disarm":"Turn autoplay on as soon as the game is running (if it offers a bot)":"Autoplay is available once the game is running":n.on?"Stop autoplay and drive yourself":"Let the game’s bot drive (any key or click in the game takes over)",c=s==="no-bot"?"No autoplay — this game doesn’t provide a bot":s==="not-running"?a?"Armed — turns on once the game is running":"Available once the game is running":null,p=n.behaviors??[],[b,h]=m.useState(null),T=n.on||a?n.behavior??null:b!==null&&p.includes(b)?b:p[0]??null,S=Ge(t,n),w=S!=="none"?null:n.by==="limit"&&n.limit?`Autoplay stopped at its ${Math.round(n.limit)} s limit`:n.refused?`Autoplay didn’t start: ${n.refused}`:null,P=[n.behavior,n.state].filter(Boolean).join(" — ");return r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:l.headerGap,minWidth:0},children:[p.length>1&&r.jsx("select",{"data-testid":"model-play-autoplay-behavior",title:"The bot behaviour Autoplay runs",value:T??"",disabled:n.on,onChange:g=>h(g.target.value),style:{background:l.widget,color:l.widgetText,border:"none",borderRadius:l.widgetRadius,font:"inherit",minWidth:0},children:p.map(g=>r.jsx("option",{value:g,children:g},g))}),r.jsx("span",{title:f,style:{display:"inline-flex"},children:r.jsx(W,{testId:"model-play-autoplay",label:f,pressed:n.on||a,wide:!0,disabled:u?!1:!t||!n.available||o.setAutoplay===void 0,onClick:()=>{const g=o.autoplay?.(e)??re;Z()?.playing(e)??!1?o.setAutoplay?.(e,!g.on,"panel",g.on?void 0:{behavior:T}):o.armAutoplay?.(e,!g.armed,{behavior:T})},children:"Autoplay"})}),c!==null?r.jsx("span",{"data-testid":"model-play-autoplay-note","data-reason":s??void 0,style:{color:l.widgetText,minWidth:0},children:c}):t&&r.jsx("span",{"data-testid":"model-play-driver","data-driver":S??void 0,title:n.state?`The bot: ${n.state}`:void 0,style:{color:n.on?x.playhead:l.widgetText,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",minWidth:0},children:S==="bot"?`Bot driving${P?` · ${P}`:""}`:w?`${w}${n.state?` — ${n.state}`:""}`:S==="person"?"You’re driving":"Nobody’s driving"})]})}const ye=200;function Ne(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return""}}function St({documentId:e,log:t}){const[i,n]=m.useState(""),[,o]=m.useReducer(c=>c+1,0);m.useEffect(()=>{let c=0;const p=t.subscribe(()=>{c===0&&(c=requestAnimationFrame(()=>{c=0,o()}))});return()=>{p(),cancelAnimationFrame(c)}},[t]);const s=t.tail(e,ye,i===""?void 0:i),a=m.useRef(null),u=m.useRef(!0);m.useLayoutEffect(()=>{const c=a.current;c&&u.current&&(c.scrollTop=c.scrollHeight)});const f=s.entries.at(-1)?.seq;return r.jsxs("div",{"data-testid":"model-play-log",style:{flex:1,minWidth:0,display:"flex",flexDirection:"column",gap:4},children:[r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:l.headerGap},children:[r.jsx("span",{children:"Play log"}),r.jsxs("select",{"data-testid":"model-play-log-kind","aria-label":"Show entries of kind",value:i,onChange:c=>{n(c.target.value),c.target.blur()},style:{height:l.unit,background:l.widget,color:l.widgetText,border:`1px solid ${l.widgetOutline}`,font:"inherit"},children:[r.jsx("option",{value:"",children:"All kinds"}),[...new Set([...s.kinds,...i===""?[]:[i]])].map(c=>r.jsx("option",{value:c,children:c},c))]}),r.jsx("span",{style:{color:l.widgetText},children:s.total===0?"Nothing logged yet":`${s.total} written${s.total>ye?` · newest ${ye} shown`:""}`})]}),r.jsx("div",{ref:a,"data-testid":"model-play-log-entries","data-newest":f,onScroll:c=>{const p=c.currentTarget;u.current=p.scrollTop+p.clientHeight>=p.scrollHeight-4},style:{flex:1,minHeight:0,overflowY:"auto",font:"12px/1.45 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",background:x.header,border:`1px solid ${l.rule}`,padding:"2px 6px"},children:s.entries.map(c=>r.jsxs("div",{"data-kind":c.kind,style:{display:"flex",gap:10,whiteSpace:"nowrap",color:c.source==="play"?l.widgetText:l.text},children:[r.jsx("span",{style:{flex:"0 0 auto",fontVariantNumeric:"tabular-nums"},children:Ke(c.simT)}),r.jsx("span",{style:{flex:"0 0 auto"},children:c.kind}),r.jsx("span",{style:{minWidth:0,overflow:"hidden",textOverflow:"ellipsis"},title:Ne(c.facts),children:Ne(c.facts)})]},c.seq))})]})}const Et=[{id:"timeline",label:"Timeline"},{id:"action",label:"Action Editor"},{id:"nla",label:"Nonlinear Animation"}],J=200;function Je(){m.useSyncExternalStore(ae,D,D);const{editor:e}=C();return r.jsx("select",{"aria-label":"Animation editor","data-testid":"animation-editor-type",value:e,onChange:t=>z({editor:t.target.value}),style:{height:l.unit,border:`1px solid ${l.widgetOutline}`,borderRadius:l.widgetRadius,background:l.widget,color:l.widgetText,font:"inherit"},children:Et.map(t=>r.jsx("option",{value:t.id,children:t.label},t.id))})}function Ye(){const e=m.useSyncExternalStore(He,se,()=>null),[,t]=m.useState(0);return m.useEffect(()=>{if(!e)return;let i=requestAnimationFrame(function n(){t(o=>(o+1)%1e6),i=requestAnimationFrame(n)});return()=>cancelAnimationFrame(i)},[e]),e}function Xe(){const e=m.useRef(null),[t,i]=m.useState({w:0,h:0});return m.useEffect(()=>{const n=e.current;if(!n)return;const o=new ResizeObserver(()=>i({w:n.clientWidth,h:n.clientHeight}));return o.observe(n),i({w:n.clientWidth,h:n.clientHeight}),()=>o.disconnect()},[]),{ref:e,size:t}}function Ue({children:e}){return r.jsxs("div",{style:{height:q,flex:`0 0 ${q}px`,display:"flex",alignItems:"center",gap:l.headerGap,padding:l.headerPadding,background:x.header,borderBottom:`1px solid ${l.rule}`},children:[r.jsx(Se,{title:"Animation"}),r.jsx(Je,{}),e]})}function qe({children:e,header:t}){return r.jsxs("div",{style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",overflow:"hidden",background:x.back,color:l.text,font:"11px Inter, system-ui, sans-serif"},children:[t,e]})}function Ze(e,t,i){const n=Math.max(1,t-e),o=Math.max(1e-6,i/(n*1.1)),s=e-n*.05,a=p=>(p-s)*o,f=[1,2,5,10,20,25,50,100,250,500,1e3].find(p=>p*o>=40)??1e3,c=[];if(i>0)for(let p=Math.ceil(s/f)*f;a(p)<=i&&c.length<500;p+=f)c.push(p);return{toX:a,majors:c,toFrame:p=>s+p/o}}function Qe({x:e,frame:t,height:i}){const n=`${Math.round(t)}`,o=Math.max(E.minPillWidth,n.length*6+2*E.textPadding);return r.jsxs("g",{children:[r.jsx("rect",{x:e-E.stalkWidth/2,y:M,width:E.stalkWidth,height:Math.max(0,i-M),fill:x.playhead}),r.jsx("rect",{x:e-o/2,y:E.margin,width:o,height:M-2*E.margin,rx:E.radius,fill:x.playhead}),r.jsx("text",{x:e,y:15.5,textAnchor:"middle",fill:x.playheadText,fontSize:11,children:n})]})}function et({majors:e,toX:t,width:i,height:n}){return r.jsxs("g",{children:[e.map(o=>r.jsx("line",{x1:t(o),y1:M,x2:t(o),y2:n,stroke:x.grid},`g${o}`)),r.jsx("rect",{x:0,y:0,width:i,height:M,fill:x.scrubBack}),e.map(o=>r.jsx("text",{x:t(o),y:15.5,textAnchor:"middle",fill:x.scrubText,fontSize:11,children:o},`t${o}`))]})}function Pe(e,t,i){const n=ge;return r.jsx("polygon",{points:`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`,fill:xe.KEYFRAME.fill,stroke:x.keyBorder,strokeWidth:Be},i)}const Mt=e=>`bpy.data.objects[${JSON.stringify(e)}].animation_data`;function Tt(){m.useSyncExternalStore(ve,X,X),m.useSyncExternalStore(he,G,G);const e=Ye(),{ref:t,size:i}=Xe(),[n,o]=m.useState(null),s=v.state(),a=v.subject??s.armature,u=e?.live().find(y=>y.armature===a)??null,f=e!==null,c=u?.layers.at(-1)??null,p=u?c?.action??null:s.action,b=m.useMemo(()=>u&&p?e.channels(u.armature,p):v.channels(),[u?p:s.action,s.engineCalls,e]),h=b.flatMap(y=>y.keys),T=h.length?Math.min(...h):s.start,S=h.length?Math.max(...h):s.end,w=Math.max(0,i.w-J),{toX:P,majors:g,toFrame:H}=Ze(T,S,w),$=u?c?.frame??T:s.frame,d=y=>M+L*(y+1),j=M+L*(b.length+2),k=[...new Set(h)].sort((y,F)=>y-F),N=async y=>{if(!(!a||f)){o(null);try{await st(Mt(a),"action",`bpy.data.actions[${JSON.stringify(y)}]`)}catch(F){o(`${y} could not be assigned to ${a}: ${F instanceof Error?F.message:String(F)}`)}}},R=r.jsxs(Ue,{children:[r.jsx("span",{style:{color:l.textHi},children:a??"No armature"}),r.jsxs("select",{"aria-label":"Action","data-testid":"action-editor-action",value:p??"",disabled:!a||f,title:f?"A game is running; it chooses the clips while it runs":"The action this armature plays (animation_data.action)",onChange:y=>void N(y.target.value),style:{height:l.unit,minWidth:180,border:`1px solid ${l.widgetOutline}`,borderRadius:l.widgetRadius,background:l.widget,color:l.widgetText,font:"inherit"},children:[p===null?r.jsx("option",{value:"",children:"No action"}):null,(u&&p?[p]:v.actionNames()).map(y=>r.jsx("option",{value:y,children:y},y))]}),u?r.jsxs("span",{"data-testid":"action-editor-live",style:{color:x.playhead},children:["● game running: ",u.layers.map(y=>`${y.action} @${y.frame.toFixed(1)} ×${y.influence.toFixed(2)}`).join(" + ")]}):null,r.jsx("div",{style:{flex:1}}),n?r.jsx("span",{style:{color:l.refusal},children:n}):null]});return r.jsx(qe,{header:R,children:r.jsx("div",{ref:t,style:{flex:1,minHeight:0,overflowY:"auto",overflowX:"hidden"},children:r.jsxs("div",{style:{display:"flex",minHeight:j},children:[r.jsxs("div",{style:{width:J,flex:`0 0 ${J}px`,borderRight:`1px solid ${l.rule}`},children:[r.jsx("div",{style:{height:M,background:x.scrubBack}}),r.jsx("div",{style:{height:L,paddingLeft:6,color:l.textHi},children:"Summary"}),b.map(y=>r.jsx("div",{style:{height:L,paddingLeft:18,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:y.bone},y.bone))]}),r.jsxs("svg",{width:w,height:j,style:{display:"block",cursor:f?"default":"ew-resize"},"aria-label":"Action Editor",onPointerDown:y=>{if(f)return;const F=y.currentTarget.getBoundingClientRect();v.transport?.seekFrame(Math.round(H(y.clientX-F.left)))},children:[r.jsx("rect",{x:0,y:0,width:w,height:j,fill:x.back}),r.jsx(et,{majors:g,toX:P,width:w,height:j}),k.map(y=>Pe(P(y),d(0)-L/2,`s${y}`)),b.map((y,F)=>y.keys.map(Q=>Pe(P(Q),d(F+1)-L/2,`${y.bone}${Q}`))),r.jsx(Qe,{x:P($),frame:$,height:j})]})]})})})}function $t(){m.useSyncExternalStore(ve,X,X),m.useSyncExternalStore(he,G,G);const e=Ye(),{ref:t,size:i}=Xe(),n=v.state(),o=v.stacks(),s=e?.live()??null,a=Math.max(0,i.w-J),{toX:u,majors:f}=Ze(n.start,n.end,a),c=[];for(const h of o){const T=s?.find(g=>g.armature===h.armature)?.layers??null,S=g=>{const H=T?.find($=>$.track===g);return H?`@${H.frame.toFixed(1)} ×${H.influence.toFixed(2)}`:void 0};c.push({label:h.armature,kind:"armature",strips:[]});const w=T?T.find(g=>g.track===null)?.action??null:h.action,P=S(null);c.push({label:w?`[Action] ${w}`:"[Action] (none)",kind:"action",strips:[],...P?{live:P}:{}});for(const g of[...h.animation?.tracks??[]].reverse()){const H=S(g.name);c.push({label:g.name,kind:"track",mute:g.mute,strips:g.strips.map($=>({name:$.name,start:$.start,end:$.end,mute:$.mute})),...H?{live:H}:{}})}}const p=M+L*(c.length+1),b=r.jsx(Ue,{children:s?r.jsx("span",{"data-testid":"nla-live",style:{color:x.playhead},children:"● game running: each playing track shows the game's frame and influence; the strips are the file's layout"}):null});return r.jsx(qe,{header:b,children:r.jsx("div",{ref:t,style:{flex:1,minHeight:0,overflowY:"auto",overflowX:"hidden"},children:r.jsxs("div",{style:{display:"flex",minHeight:p},children:[r.jsxs("div",{style:{width:J,flex:`0 0 ${J}px`,borderRight:`1px solid ${l.rule}`},children:[r.jsx("div",{style:{height:M,background:x.scrubBack}}),c.map((h,T)=>r.jsxs("div",{"data-testid":`nla-row-${h.kind}`,style:{height:L,paddingLeft:h.kind==="armature"?6:18,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",color:h.kind==="armature"?l.textHi:h.mute?"#6a6a6a":l.text},children:[h.label,h.live?r.jsxs("span",{style:{color:x.playhead},children:[" ",h.live]}):null]},`${h.label}${T}`))]}),r.jsxs("svg",{width:a,height:p,style:{display:"block"},"aria-label":"NLA",children:[r.jsx("rect",{x:0,y:0,width:a,height:p,fill:x.back}),r.jsx(et,{majors:f,toX:u,width:a,height:p}),c.map((h,T)=>{const S=M+L*T+2;return h.strips.map(w=>r.jsxs("g",{children:[r.jsx("rect",{x:u(w.start),y:S,width:Math.max(2,u(w.end)-u(w.start)),height:L-4,rx:2,fill:w.mute||h.mute?"#4a4a4a":s?h.live?"#5a7fb8":"#555555":"#7b7b7b",opacity:s?.6:1,stroke:"#1a1a1a"}),r.jsx("text",{x:u(w.start)+4,y:S+L-7,fill:"#ffffff",fontSize:10,children:w.name})]},`${T}${w.name}${w.start}`))}),s?null:r.jsx(Qe,{x:u(n.frame),frame:n.frame,height:p})]})]})})})}const Ct="workspace.document",At="Timeline",tt=.25,nt=200,be={"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."},Ee="A game is running; the Timeline is read-only until it stops (Stop in the Game panel).",ue="No scene transport is attached yet; open the model document first.";function A(){return v.transport}function we(){return A()?.snapshot().playbackState==="playing"}function Y(e){return ze(e),_()}const Re={JITTER:1,GENERATED:2,MOVING_HOLD:3,BREAKDOWN:4,KEYFRAME:5,EXTREME:6};function it(e,t){const i=[],n=new Map;for(const o of e)if(!(t&&!o.selected)){i.push(o.object);for(const s of o.keyframes){const a=n.get(s.frame);if(!a){n.set(s.frame,{...s});continue}a.select=a.select||s.select,(Re[s.type]??0)>(Re[a.type]??0)&&(a.type=s.type)}}return{columns:[...n.values()].sort((o,s)=>o.frame-s.frame),objects:i}}function me(){return it(v.state().summary,C().onlySelected).columns.map(e=>e.frame)}function _(){const e=C();return{...v.state(),transform:e.transform,size:e.size,refusal:e.refusal,drawn:e.drawn,editor:e.editor}}function ne(e){if(se()!==null)return Y(Ee);if(!v.playable)return Y(ue);const t=A();return t?(t.seekFrame(e),_()):Y("No stage transport is attached yet; open the model document first.")}Ie({view:"timeline",title:At,verbs:[{id:"state",run:()=>_()},{id:"editor",title:"Animation: Show Editor",run:e=>{const t=e?.editor??e?.to;return t!=="timeline"&&t!=="action"&&t!=="nla"?Y("editor is `timeline`, `action` (the Action Editor) or `nla`."):(z({editor:t}),_())}},{id:"frame",title:"Timeline: Set Frame",run:e=>{const t=Number(e?.frame??e?.to);if(!Number.isFinite(t))throw new Error("frame needs a numeric `frame` — a Blender frame number.");return ne(t)}},{id:"play",title:"Timeline: Play",run:()=>{if(se()!==null)throw new Error(Ee);if(!v.playable)throw new Error(ue);const e=A();if(!e)throw new Error("No stage transport is attached yet; open the model document first.");return e.play(),_()}},{id:"pause",title:"Timeline: Pause",run:()=>{const e=A();return e?(e.pause(),_()):Y("No stage transport is attached yet.")}},{id:"jump-start",title:"Timeline: Jump to Start",run:()=>ne(v.state().start)},{id:"jump-end",title:"Timeline: Jump to End",run:()=>ne(v.state().end)},{id:"next-keyframe",title:"Timeline: Next Keyframe",run:()=>{const e=v.frame(),t=me().find(i=>i>e+1e-4);return t===void 0?_():ne(t)}},{id:"prev-keyframe",title:"Timeline: Previous Keyframe",run:()=>{const e=v.frame(),t=me().reverse().find(i=>i<e-1e-4);return t===void 0?_():ne(t)}},{id:"view-all",title:"Timeline: View All",run:()=>(Ce(),_())},{id:"zoom",title:"Timeline: Zoom",run:e=>{const t=Number(e?.to??e?.zoom);if(!Number.isFinite(t))throw new Error("zoom needs a numeric `to` — CSS pixels per frame, 0.25 … 200.");const{transform:i,size:n}=C(),o=i.startFrame+n.w/2/i.pixelsPerFrame,s=Math.min(nt,Math.max(tt,t));return z({transform:{pixelsPerFrame:s,startFrame:o-n.w/2/s}}),_()}},{id:"pan",title:"Timeline: Pan",run:e=>{const t=Number(e?.frames??0);if(!Number.isFinite(t))throw new Error("pan needs a numeric `frames`.");const{transform:i}=C();return z({transform:{...i,startFrame:i.startFrame+t}}),_()}},...Object.keys(be).map(e=>({id:e,run:()=>Y(be[e])}))]});const Fe="timeline";function zt(){m.useSyncExternalStore(je,U,U),m.useSyncExternalStore(ae,D,D);const e=pe(),t=e!==null&&ie(e)==="game",{editor:i}=C(),n=t||i!=="timeline";return m.useEffect(()=>Me(Fe,n?bt:null),[n]),m.useEffect(()=>()=>Me(Fe,null),[]),t?r.jsx(jt,{}):i==="action"?r.jsx(Tt,{}):i==="nla"?r.jsx($t,{}):r.jsx(Nt,{})}function Nt(){m.useSyncExternalStore(ve,X,X),m.useSyncExternalStore(he,G,G),m.useSyncExternalStore(ae,D,D);const e=m.useRef(null),t=m.useRef(-1),{transform:i,size:n,refusal:o,onlySelected:s}=C(),a=v.state();m.useEffect(()=>{const d=e.current;if(!d)return;const j=new ResizeObserver(()=>{const k={w:d.clientWidth,h:d.clientHeight},N=C().size;(N.w!==k.w||N.h!==k.h)&&z({size:k})});return j.observe(d),z({size:{w:d.clientWidth,h:d.clientHeight}}),()=>j.disconnect()},[]);const u=ct();m.useEffect(()=>{if(u===t.current)return;t.current=u;const{w:d}=C().size;if(d===0)return;const j=Math.max(1,a.end-a.start),k=Math.min(nt,Math.max(tt,d*.9/j));z({transform:{pixelsPerFrame:k,startFrame:a.start-d*.05/k},framedAt:Date.now()})},[u,a.start,a.end]);const f=m.useCallback(d=>(d-i.startFrame)*i.pixelsPerFrame,[i]),c=m.useCallback(d=>i.startFrame+d/i.pixelsPerFrame,[i]),p=m.useMemo(()=>it(a.summary,s),[a.summary,s]),b=m.useMemo(()=>{if(n.w===0)return null;const d=n.w/i.pixelsPerFrame,j=Math.max(`${Math.round(i.startFrame)}`.length,`${Math.round(i.startFrame+d)}`.length),k=Math.max(Te,j*6+ht),N=ft(Math.round(a.fps),n.w+1,d,k),R=yt(N),y=Math.ceil(i.startFrame/N)*N,F=[];for(let ee=y;ee<=i.startFrame+d;ee+=N)F.push(ee);const Q=[];if(R!==null&&R*i.pixelsPerFrame>=Te/5){const ee=Math.ceil(i.startFrame/R)*R;for(let te=ee;te<=i.startFrame+d;te+=R)Math.abs(te/N-Math.round(te/N))>1e-6&&Q.push(te)}return{major:N,minor:R,majors:F,minors:Q}},[n.w,i,a.fps]),h=M,S=pt+L/2;m.useEffect(()=>{if(!b)return;const d=[...a.warnings];a.action||d.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."),d.push("While a clip plays, the picture is three.js evaluating the skin over the mesh columns Blender exported at the BIND frame. Anything else Blender would re-evaluate per frame — shape keys, a Displace or Cloth modifier reading the frame, a geometry driver — does not follow the playhead."),d.push("Blender puts this view's ONLY-SHOW-SELECTED toggle in the Timeline header's View MENU (`TIME_MT_view`'s `layout.prop(scene, \"show_keys_from_selected_only\")`, `space_time.py`); this header has no menu region, so the same toggle is drawn as a header button at the leading edge, where that menu sits. The filter itself is Blender's — `ADS_FILTER_ONLYSEL`, `anim_filter.cc:254-270`, tested per object at `:2307`."),s&&p.objects.length===0&&a.summary.length>0&&d.push(`The summary row is empty because nothing animated is SELECTED, which is Blender's own answer with this filter on. ${a.summary.map(k=>k.object).join(", ")} carr${a.summary.length===1?"ies":"y"} an action; select it, or turn the filter off.`),d.push("Markers, the cache bar and the preview range are drawn by Blender's Timeline and not here; the door carries none of them.");const j={drawn:{action:a.action,object:a.object,armature:a.armature,frame:a.frame,start:a.start,end:a.end,fps:a.fps,playing:we(),keyframes:p.columns.map(k=>k.frame),onlySelected:s,summaryObjects:p.objects,majorStep:b.major,minorStep:b.minor,majorLines:b.majors.length,minorLines:b.minors.length,labels:b.majors.length,diamonds:p.columns.length,diamondRadius:ge,diamondSprite:gt,bones:a.bones,tracks:a.tracks,engineCalls:a.engineCalls,warnings:d}};JSON.stringify(j.drawn)!==JSON.stringify(C().drawn)&&z(j)},[b,a,p,s]);const w=m.useRef(!1),P=m.useCallback(d=>{const j=e.current;if(!j||se()!==null)return;const k=j.getBoundingClientRect();A()?.seekFrame(Math.round(c(d-k.left)))},[c]),g=`${Math.round(a.frame)}`,H=Math.max(E.minPillWidth,g.length*6+2*E.textPadding),$=f(a.frame);return r.jsxs("div",{"data-testid":"blender-timeline",style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",overflow:"hidden",background:x.back,color:l.text,font:"11px Inter, system-ui, sans-serif"},children:[r.jsx(Rt,{}),r.jsx("div",{ref:e,style:{flex:1,minHeight:0,position:"relative"},children:r.jsxs("svg",{width:n.w,height:n.h,style:{display:"block",cursor:"ew-resize"},"aria-label":"Timeline",onPointerDown:d=>{w.current=!0,d.currentTarget.setPointerCapture(d.pointerId),P(d.clientX)},onPointerMove:d=>{w.current&&P(d.clientX)},onPointerUp:d=>{w.current=!1,d.currentTarget.releasePointerCapture(d.pointerId)},children:[r.jsx("title",{children:"Timeline"}),r.jsx("rect",{x:0,y:0,width:n.w,height:n.h,fill:x.back}),r.jsx("rect",{x:0,y:h,width:Math.max(0,f(a.start)),height:Math.max(0,n.h-h),fill:$e}),r.jsx("rect",{x:f(a.end),y:h,width:Math.max(0,n.w-f(a.end)),height:Math.max(0,n.h-h),fill:$e}),b?.minors.map(d=>r.jsx("line",{x1:f(d),y1:h,x2:f(d),y2:n.h,stroke:x.gridMinor,strokeWidth:1},`n${d}`)),b?.majors.map(d=>r.jsx("line",{x1:f(d),y1:h,x2:f(d),y2:n.h,stroke:x.grid,strokeWidth:1},`m${d}`)),r.jsx("rect",{x:0,y:0,width:n.w,height:M,fill:x.scrubBack}),b?.majors.map(d=>r.jsx("text",{x:f(d),y:15.5,textAnchor:"middle",fill:x.scrubText,fontSize:11,children:Math.round(d)},`t${d}`)),r.jsx("path",{d:`M3,${S-3.5} L6.5,${S} L3,${S+3.5} Z`,fill:x.scrubText}),p.columns.map(d=>{const j=xt[d.type]??1,k=ge*j,N=xe[d.type]??xe.KEYFRAME,R=f(d.frame);return r.jsx("polygon",{points:`${R},${S-k} ${R+k},${S} ${R},${S+k} ${R-k},${S}`,fill:d.select?N.selected:N.fill,stroke:x.keyBorder,strokeWidth:Be*j},`k${d.frame}`)}),r.jsx("rect",{x:$-E.stalkWidth/2,y:M,width:E.stalkWidth,height:Math.max(0,n.h-M),fill:x.playhead}),r.jsx("rect",{x:$-H/2,y:E.margin,width:H,height:M-2*E.margin,rx:E.radius,fill:x.playhead}),r.jsx("polygon",{points:`${$-E.tipHalfWidth},${M-E.margin} ${$+E.tipHalfWidth},${M-E.margin} ${$},${M-E.margin+E.tipHeight}`,fill:x.playhead}),r.jsx("text",{x:$,y:15.5,textAnchor:"middle",fill:x.playheadText,fontSize:11,children:g})]})}),o?r.jsx("div",{style:{borderTop:`1px solid ${l.rule}`,padding:l.statusPadding,color:l.refusal},children:o}):null]})}function Pt(){m.useSyncExternalStore(ae,D,D);const{onlySelected:e}=C(),[t,i]=m.useState(!1),n=(o,s,a)=>r.jsxs("button",{type:"button",onClick:()=>{a(),i(!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:l.widgetText,font:"inherit",textAlign:"left",cursor:"pointer"},children:[r.jsx("span",{style:{width:12,display:"inline-block"},children:s===null?"":s?"✓":""}),o]});return r.jsxs("span",{style:{position:"relative"},children:[r.jsx("button",{type:"button","aria-haspopup":"menu","aria-expanded":t,onClick:()=>i(o=>!o),style:{border:"none",background:"transparent",color:l.text,font:"inherit",padding:"0 var(--volter-space-2)",cursor:"pointer"},children:"View"}),t?r.jsxs("span",{role:"menu",style:{position:"absolute",top:"100%",left:0,zIndex:20,minWidth:210,display:"flex",flexDirection:"column",background:l.widget,border:`1px solid ${l.widgetOutline}`,boxShadow:"0 6px 18px rgba(0,0,0,0.45)"},children:[n("Only Show Selected",e,()=>dt(!e)),n("Frame All",null,()=>Ce())]}):null]})}function Rt(){m.useSyncExternalStore(he,G,G),m.useSyncExternalStore(ae,D,D);const e=v.state(),t=l.unit,i=m.useSyncExternalStore(He,se,()=>null)!==null,n=v.playable&&!i,o=(a,u,f,c)=>r.jsx("button",{type:"button",title:n?c:`${c} — ${i?Ee:ue}`,"aria-label":c,disabled:!n,onClick:f,style:{width:t,height:t,padding:0,border:`1px solid ${l.widgetOutline}`,background:l.widget,color:l.widgetText,display:"grid",placeItems:"center",cursor:n?"pointer":"not-allowed",opacity:n?1:.4},children:u},a),s=a=>r.jsx("svg",{width:12,height:12,viewBox:"0 0 12 12","aria-hidden":"true",children:r.jsx("path",{d:a,fill:l.widgetText})});return r.jsxs("div",{style:{height:q,flex:`0 0 ${q}px`,display:"flex",alignItems:"center",gap:l.headerGap,padding:l.headerPadding,background:x.header,borderBottom:`1px solid ${l.rule}`},children:[r.jsx(Se,{title:"Timeline"}),r.jsx(Je,{}),r.jsx(Pt,{}),r.jsx("div",{style:{flex:1}}),r.jsxs("div",{style:{display:"flex"},children:[o("jump-start",s("M2 2h1.5v8H2zM10 2v8L4.5 6z"),()=>A()?.seekFrame(e.start),"Jump to Start"),o("prev-key",s("M5 2.5v7L1.5 6zM8.5 3.2L11 6L8.5 8.8L6 6z"),()=>{const a=me().reverse().find(u=>u<v.frame()-1e-4);a!==void 0&&A()?.seekFrame(a)},"Jump to Previous Keyframe"),n&&we()?o("pause-rev",s("M3 2h2v8H3zM7 2h2v8H7z"),()=>A()?.pause(),"Pause"):o("play-reverse",s("M9 2L2 6l7 4z"),()=>A()?.play("reverse"),"Play Reverse"),n&&we()?o("pause",s("M3 2h2v8H3zM7 2h2v8H7z"),()=>A()?.pause(),"Pause"):o("play",s("M3 2l7 4-7 4z"),()=>A()?.play(),"Play"),o("next-key",s("M7 2.5v7L10.5 6zM3.5 3.2L6 6L3.5 8.8L1 6z"),()=>{const a=me().find(u=>u>v.frame()+1e-4);a!==void 0&&A()?.seekFrame(a)},"Jump to Next Keyframe"),o("jump-end",s("M10 2H8.5v8H10zM2 2v8L7.5 6z"),()=>A()?.seekFrame(e.end),"Jump to End")]}),r.jsxs("div",{style:{display:"flex"},children:[o("step-back",s("M2 2h1.5v8H2zM9.5 2v8L4.5 6z"),()=>A()?.seekFrame(Math.round(e.frame)-1),"Step Back One Frame"),o("step-forward",s("M10 2H8.5v8H10zM2.5 2v8L7.5 6z"),()=>A()?.seekFrame(Math.round(e.frame)+1),"Step Forward One Frame")]}),r.jsx("div",{style:{flex:1}}),r.jsx("input",{type:"number",value:Math.round(e.frame),onChange:a=>{const u=Number(a.target.value);Number.isFinite(u)&&A()?.seekFrame(u)},"aria-label":"Current frame",disabled:!n,title:n?void 0:ue,style:{width:75,height:t,textAlign:"center",border:`1px solid ${l.widgetOutline}`,borderRadius:l.widgetRadius,background:l.widget,color:l.widgetText,font:"inherit",cursor:n?"text":"not-allowed",opacity:n?1:.4}}),r.jsxs("span",{onClick:()=>ze(be["set-range"]),onKeyDown:()=>{},style:{color:l.text,cursor:"not-allowed"},children:["Start ",e.start," · End ",e.end]})]})}export{zt as default,Ct as point,At as title};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as c,j as u,i2 as le}from"./volter-sdk-mgLi8_Cw.js";import{s as ue,b as X,h as de}from"./blender-runtime-host-swgDAdoy.js";import"./output-pass-j4dAGrPY.js";import"./three.module-CtVjCPcj.js";import"./linear-resolve-Cuka7Ypb.js";const he={transform:{cx:.5,cy:.5,zoom:512},refusal:null,size:{w:0,h:0},framedAt:0,drawn:null};let L=he,N=0;const T=new Set;let te=0;function m(){return L}function Q(){return N}function fe(t){return T.add(t),()=>{T.delete(t)}}function v(t){L={...L,...t},N+=1;for(const r of[...T])r()}function pe(){te+=1,N+=1;for(const t of[...T])t()}function me(){return te}function ne(t){v({refusal:t})}const x={back:"#303030",grid:"#303030",face:"#ffffff",faceAlpha:10/255,uvShadow:"#707070",vertex:"#000000",faceDot:"#000000"},B={vertexSize:3,edgeWidth:1,facedotSize:3},se=1,ge=(B.vertexSize*se+1.5)*Math.SQRT2,ve=.75,we=B.facedotSize*se,ye=1,J=[1,1],K=[10,10],xe="Blender's `.space_image.grid` is #303030 at full alpha (userdef_default_theme.c:586) and this view's surface is #303030, so the tile grid draws at the theme's colour and is invisible against it. The image region's own clear is the overlay engine's (DRW_draw_view, space_image.cc:758), which is not in the source checkout — the sighted read settles the contrast.",be={shadow:{inner:x.uvShadow}},Ue=Math.max(B.edgeWidth,1),ee="#ff0000";function W(t){const r=atob(t),a=new Uint8Array(r.length);for(let d=0;d<r.length;d++)a[d]=r.charCodeAt(d);return a}function Ve(t){const r=W(t);return new Float32Array(r.buffer,r.byteOffset,r.byteLength>>2)}function z(t){const r=W(t);return new Uint32Array(r.buffer,r.byteOffset,r.byteLength>>2)}function Ee(t,r){const a=Number.parseInt(t.slice(1),16);return`rgba(${a>>16&255}, ${a>>8&255}, ${a&255}, ${Math.round(r*1e3)/1e3})`}const E={text:"#e6e6e6",refusal:"#ed5700",rule:"#232323",statusPadding:"3px 8px",statusGap:12},Te="workspace.document",_e="UV Editor",D=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."};le({view:"blender-uv-view",title:_e,verbs:[{id:"state",run:()=>m()},{id:"view-all",title:"UV Editor: View All",run:()=>(pe(),m())},{id:"zoom",title:"UV Editor: 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:a}=m();return v({transform:{...a,zoom:Math.min(oe,Math.max(re,r))}}),m()}},{id:"pan",title:"UV Editor: Pan",run:t=>{const r=Number(t?.u??0),a=Number(t?.v??0);if(!Number.isFinite(r)||!Number.isFinite(a))throw new Error("pan needs numeric `u` and `v`, in UV units.");const{transform:d}=m();return v({transform:{...d,cx:d.cx+r,cy:d.cy+a}}),m()}},{id:"move-uv",run:()=>R(_.move("the active UV map"))},{id:"select",run:()=>R(_.select)},{id:"pin",run:()=>R(_.pin)},{id:"unwrap",run:()=>R(_.unwrap)}]});function R(t){return ne(t),m()}function Se(t){return!t?.uvBase64||!t.triangleBase64?null:{uv:Ve(t.uvBase64),tris:z(t.triangleBase64),starts:z(t.loopStartBase64??""),totals:z(t.loopTotalBase64??""),pins:t.pinBase64?W(t.pinBase64):null}}function je(){const t=c.useSyncExternalStore(ue,X,X);c.useSyncExternalStore(fe,Q,Q);const r=c.useRef(0),a=c.useRef(null),d=c.useRef(null),j=c.useRef(null),{transform:b,refusal:C,size:U}=m(),[,F]=[0,c.useCallback(()=>v({}),[])];c.useEffect(()=>{let e=!0;return(async()=>{try{const s=await de();if(!e)return;d.current=s,j.current=null}catch(s){if(!e)return;j.current=s instanceof Error?s.message:String(s)}F()})(),()=>{e=!1}},[t,F]),c.useEffect(()=>{const e=a.current;if(!e)return;const s=new ResizeObserver(()=>{const l={w:e.clientWidth,h:e.clientHeight},h=m().size;(h.w!==l.w||h.h!==l.h)&&v({size:l})});return s.observe(e),v({size:{w:e.clientWidth,h:e.clientHeight}}),()=>s.disconnect()},[]);const n=d.current,M=c.useMemo(()=>Se(n),[n]),O=me();c.useEffect(()=>{if(O===r.current)return;r.current=O;const e=n?.bounds??[0,0,1,1],{w:s,h:l}=m().size;if(s===0||l===0)return;const[h,g,o,f]=e,V=Math.max(o-h,.001),S=Math.max(f-g,.001),k=Math.min(oe,Math.max(re,Math.min(s/V,l/S)*.9));v({transform:{cx:(h+o)/2,cy:(g+f)/2,zoom:k},framedAt:Date.now()})},[O,n]);const w=e=>(e-b.cx)*b.zoom+U.w/2,y=e=>U.h/2-(e-b.cy)*b.zoom,i=c.useMemo(()=>{if(!n||!M)return null;const{uv:e,tris:s,starts:l,totals:h,pins:g}=M,o=[],f=[],V=[],S=[],k=l.length;for(let p=0;p<k;p++){const ce=l[p],I=h[p];if(I<3)continue;let $="",H=0,G=0;for(let A=0;A<I;A++){const Z=ce+A,q=e[Z*2],Y=e[Z*2+1];H+=q,G+=Y,$+=`${A===0?"M":"L"}${w(q).toFixed(2)} ${y(Y).toFixed(2)}`}$+="Z",o.push($),f.push($),S.push({x:w(H/I),y:y(G/I)})}const P=e.length>>1;for(let p=0;p<P&&V.length<D;p++)V.push({x:w(e[p*2]),y:y(e[p*2+1]),pinned:g?g[p]!==0:!1});return{faces:o,outlines:f,dots:V,faceDots:S,corners:P,triangles:s.length/3}},[n,M,b,U]);c.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>D&&e.push(`${i.corners} UV corners exceed this view's ${D}-dot budget; ${i.corners-D} 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(xe),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."),v({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=c.useMemo(()=>{const e=[],[s,l]=J,[h,g]=K;for(let o=0;o<=s*h;o++){const f=o/h;e.push({key:`u${o}`,x1:w(f),y1:y(0),x2:w(f),y2:y(l),major:o%h===0})}for(let o=0;o<=l*g;o++){const f=o/g;e.push({key:`v${o}`,x1:w(0),y1:y(f),x2:w(s),y2:y(f),major:o%g===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}`:j.current??"UV Editor · reading…";return u.jsxs("div",{"data-testid":"blender-uv-editor",style:{display:"flex",flexDirection:"column",position:"absolute",inset:0,overflow:"hidden",background:x.back,color:E.text,font:"11px Inter, system-ui, sans-serif"},children:[u.jsx("div",{ref:a,style:{flex:1,minHeight:0,position:"relative"},children:u.jsxs("svg",{width:U.w,height:U.h,style:{display:"block"},onPointerDown:()=>ne(_.select),"aria-label":"UV layout",children:[u.jsx("title",{children:"UV layout"}),ie.map(e=>u.jsx("line",{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,stroke:x.grid,strokeWidth:e.major?2:1},e.key)),i?.faces.map((e,s)=>u.jsx("path",{d:e,fill:Ee(x.face,x.faceAlpha*ye)},`f${s}`)),i?.outlines.map((e,s)=>u.jsx("path",{d:e,fill:"none",stroke:be.shadow.inner,strokeWidth:Ue},`e${s}`)),i?.faceDots.map((e,s)=>u.jsx("circle",{cx:e.x,cy:e.y,r:we/2,fill:x.faceDot},`fd${s}`)),i?.dots.map((e,s)=>u.jsx("circle",{cx:e.x,cy:e.y,r:ge/2,fill:e.pinned?ee:x.vertex,stroke:e.pinned?ee:"none",strokeWidth:e.pinned?ve:0},`v${s}`))]})}),u.jsxs("div",{style:{borderTop:`1px solid ${E.rule}`,padding:E.statusPadding,display:"flex",gap:E.statusGap,alignItems:"center"},children:[u.jsx("span",{children:ae}),C?u.jsx("span",{style:{color:E.refusal},children:C}):null]})]})}export{je as default,Te as point,_e as title};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{h6 as s,n as r,j as n}from"./volter-sdk-mgLi8_Cw.js";const i="workspace.status",a="Version",l="right",c=998;function u(){const{project:t}=s(),e=r.useSyncExternalStore(t.subscribe,t.engineVersion,t.engineVersion);return e===null?null:n.jsxs("span",{className:"volter-status-copy","data-testid":"status-blender-version","data-engine-version":e,style:{display:"inline-flex",alignItems:"center",gap:"var(--volter-space-2)",fontSize:"var(--volter-font-md)"},title:`This project is built against engine ${e}`,children:[n.jsx("span",{"aria-hidden":"true",style:{width:"var(--volter-stroke-resting)",height:"var(--volter-icon-md)",background:"currentColor"}}),e]})}export{l as align,u as default,c as order,i as point,a as title};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as f,S as k,P as v,b as x,s as F,A as $,c as D,o as N}from"./worker-DvJ796ja.js";import{s as W}from"./session-CvHLFvpx.js";const u="/bw",B=`${k}/frame.bin`,A=new Set(["scripts/startup/vgai_three.py","scripts/startup/volter_three.py"]);async function T(e){const a=f(`wali/${e}`);try{return await import(a)}catch(l){throw new Error(`The substrate skew needs ${e}, which this editor serves from the WALI pack directory beside blender.wasm (${a}): ${l instanceof Error?l.message:String(l)}`)}}async function z(e,a){const l=performance.now(),r=await fetch(f("runtime.idx"));if(!r.ok)throw new Error(`${$}/runtime.idx answered ${r.status}`);const o=await r.json(),s=await fetch(f("runtime.bin"));if(!s.ok)throw new Error(`${$}/runtime.bin answered ${s.status}`);const i=new Uint8Array(await s.arrayBuffer());let d=0;for(const t of o.files){if(d+t.size>i.byteLength)throw new Error(`Blender runtime ${t.path}: bytes ${d}..${d+t.size} lie outside the ${i.byteLength}-byte runtime blob`);if(A.has(t.path)){d+=t.size;continue}const c=`${u}/${t.path}`;e.mkdirSync(c.slice(0,c.lastIndexOf("/")),{recursive:!0}),e.writeFileSync(c,i.subarray(d,d+t.size)),d+=t.size}if(d!==i.byteLength)throw new Error(`Blender runtime index accounts for ${d} of the ${i.byteLength} bytes served`);const h=Math.round(performance.now()-l);return a("log",`blender: staged Blender's ${o.files.length}-file runtime tree in ${h} ms`),{files:o.files.length,bytes:i.byteLength,ms:h}}async function C(e,a){const l=performance.now(),r=await fetch(f("runtime.idx"));if(!r.ok)throw new Error(`${$}/runtime.idx answered ${r.status}`);const o=await r.json(),s=o.files.reduce((b,n)=>b+n.size,0),i=await fetch(f("runtime.bin"));if(!i.ok||!i.body)throw new Error(`${$}/runtime.bin answered ${i.status}`);const d=new SharedArrayBuffer(s),h=new Uint8Array(d);let t=0;const c=i.body.getReader();for(;;){const{done:b,value:n}=await c.read();if(b)break;if(t+n.byteLength>s)throw new Error(`Blender runtime blob is longer than the ${s} bytes its index accounts for`);h.set(n,t),t+=n.byteLength}if(t!==s)throw new Error(`Blender runtime index accounts for ${s} bytes; the blob served ${t}`);const y=e(u,o.files,d,{mtimeMs:Date.now(),include:b=>!A.has(b)});return a("log",`blender: shared Blender's ${o.files.length}-file runtime tree in ${Math.round(performance.now()-l)} ms`),y}async function H(e,a,l){const r=performance.now(),o=await fetch(f("runtime.idx"));if(!o.ok)throw new Error(`${$}/runtime.idx answered ${o.status}`);const s=await o.text(),i=JSON.parse(s),h=[...new Uint8Array(await crypto.subtle.digest("SHA-256",new TextEncoder().encode(s))).slice(0,12)].map(n=>n.toString(16).padStart(2,"0")).join(""),t=`${_}${h}`;if(a)try{await a(t)}catch(n){l("log",`blender: the runtime tree stays in memory: it cannot be held in use (${n instanceof Error?n.message:String(n)})`);return}let c;try{c=new Worker(f("wali/browser-wali/tree-store-worker.js"),{type:"module"})}catch(n){l("log",`blender: the runtime tree stays in memory: no installer worker (${n instanceof Error?n.message:String(n)})`);return}const y=await new Promise(n=>{let g=!1;const S=w=>{g||(g=!0,n(w))};let E=setTimeout(()=>S({ok:!1,error:`no progress in ${R/1e3} s`}),R);c.onmessage=w=>{if(clearTimeout(E),typeof w.data?.progress=="number"){g||(E=setTimeout(()=>S({ok:!1,error:`no progress in ${R/1e3} s`}),R));return}c.terminate(),S(w.data)},c.onerror=w=>{clearTimeout(E),c.terminate(),S({ok:!1,error:w.message||"the installer worker failed to start"})},c.postMessage({projectId:t,family:_,root:u,files:i.files,blobUrl:new URL(f("runtime.bin"),location.href).href,mtimeMs:Date.now()})});if(!y.ok){l("log",`blender: the runtime tree stays in memory: it could not be installed (${y.error})`);return}const b=e(u,i.files,t,{mtimeMs:Date.now(),include:n=>!A.has(n)});return l("log",`blender: Blender's ${i.files.length}-file runtime tree is on disk (${y.installed?`installed, ${Math.round((y.bytes??0)/1e6)} MB`:"installed before"}) in ${Math.round(performance.now()-r)} ms`),b}const _="host-tree.blender-runtime-",R=2e4;function U(e){const a=new Set,l=()=>{for(const r of[...a])r()};return e.on?.("change",l),e.on?.("delete",l),{...e.on?{changed:r=>new Promise(o=>{const s=()=>{clearTimeout(i),a.delete(s),o()},i=setTimeout(s,r);a.add(s)})}:{},readFile:r=>e.readFile(r),writeFile:(r,o)=>(e.writeFileSync(r,o),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 o=e.statSync(r);return{size:o.size,mode:o.mode&4095|(o.isDirectory()?16384:32768),mtimeMs:o.mtimeMs}},unlink:async r=>e.unlinkSync(r)}}async function V(e,a){const l=performance.now(),[r,o,s]=await Promise.all([T("browser-wali/worker-program.js"),T("browser-runtime/browser-memory-filesystem.js"),T("browser-wali/shared-file-layer.js").catch(()=>({}))]),i=r.BrowserWaliWorkerProgram,d=o.BrowserMemoryFileSystem;if(!i||!d)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 h=r.preloadWaliModule;h&&a.integrity&&h(f("blender.wasm"),a.integrity).catch(()=>{});const t=new d;for(const m of["/tmp","/root","/work",k,...v,e.project])t.mkdirSync(m,{recursive:!0});const c=s.sharedFileLayerFromIndex,y=s.storeFileLayerFromIndex,b=s.holdTreeStore,n=(y?await H(y,b,e.log):void 0)??(c?await C(c,e.log):void 0);n||await z(t,e.log),t.writeFileSync(x,W);const g=a.workers??{pool:16,blender:4},S=new i(t,{url:f("blender.wasm"),...a.integrity?{integrity:a.integrity}:{},cwd:"/work",env:{HOME:"/root",TMPDIR:"/tmp",PATH:"/usr/bin:/bin",BLENDER_SYSTEM_RESOURCES:u,BLENDER_SYSTEM_SCRIPTS:`${u}/scripts`,BLENDER_SYSTEM_DATAFILES:`${u}/datafiles`,BLENDER_SYSTEM_PYTHON:`${u}/python`,PYTHONPATH:`${u}/python/lib/numpy313.zip:${u}/python/lib/wheels313.zip`,VOLTER_SESSION_ROOT:k,VOLTER_EXPORT_BUFFER_PATH:B,OPENIMAGEIO_THREADS:"1"},...n?{layers:[n]}:{},privateRoots:["/tmp"],threadPoolSize:g.pool,network:{allowedHosts:[],maxConnections:0,maxBytes:0}});let E=null,w=null;const L=m=>{for(const p of m.split(`
|
|
2
|
-
`))p!==""&&(p.startsWith("@@VOLTER-READY ")&&(E=p.slice(15)),e.log(D(p),p))};for(S.run(["/blender","-b","--factory-startup","-noaudio","--python-use-system-env","-t",String(g.blender),"--python",x],{onStdout:L,onStderr:L,onDiagnostic:m=>e.log("error",`@@VOLTER-ERROR ${m}`)}).then(m=>{w=`Blender exited ${m.exitCode}`},m=>{w=m instanceof Error?m.message:String(m)}).finally(()=>{w!==null&&e.log("error",`@@VOLTER-ERROR the Blender program ended: ${w}`)});E===null;){if(w!==null)throw new Error(`Blender never reached its session: ${w}`);await F(5)}const M=performance.now()-l,I=JSON.parse(E);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 O=U(t),{request:P}=N(O,e,()=>w);return{skew:"wali",banner:I,files:O,request:P,readArena:()=>t.readFile(B),bootMs:M,memoryBytes:()=>null,releasedPayloadBytes:null}}export{V as startWaliBlenderEngine};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{L as l}from"./blender-runtime-host-swgDAdoy.js";import"./output-pass-j4dAGrPY.js";import"./three.module-CtVjCPcj.js";import"./linear-resolve-Cuka7Ypb.js";import"./volter-sdk-mgLi8_Cw.js";const s="workspace.command",e=(o,n)=>({...n===void 0?{}:{timeoutMs:n},derivedRefresh:o,handle:r=>l(r)}),c={"blender-draw-batching":e("none"),"blender-start":e("none",12e4),"blender-stop":e("none",30*6e4),"blender-execute":e("always",30*6e4),"blender-native-preview":e("none",12e4),"blender-scene-info":e("none",6e4),"blender-object-info":e("none",6e4),"blender-screenshot-view":e("always",6e4),"blender-read-file":e("none",6e4),"blender-write-file":e("none",6e4),"blender-list-files":e("none",6e4),"blender-rna":e("none",6e4),"blender-rna-context":e("none",6e4),"blender-rna-set":e("always",6e4),"blender-outliner":e("none",6e4),"blender-node-tree":e("none",6e4),"blender-uv-layout":e("none",6e4),"blender-action-clip":e("none",12e4),"blender-node-view":e("none"),"blender-outliner-set":e("always",6e4),"blender-status":e("none")};export{c as commands,s as point};
|
|
@@ -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.",bindings:{"transform.select":[{key:"w"}],"transform.translate":[{key:"g"}],"transform.rotate":[{key:"r"}],"transform.scale":[{key:"s"}],"edit.delete":[{key:"x"}],"edit.duplicate":[{key:"d",shift:!0}],"edit.selectAll":[{key:"a"},{key:"a",mod:!0}],"edit.deselectAll":[{key:"a",alt:!0}],"viewport.frameSelection":[{key:"."},{key:"",code:"NumpadDecimal"}],"viewport.cyclePivot":[{key:","}],"canvas.panMode":[],"canvas.rulerMode":[],"canvas.toggleGrid":[],"view.perspective":[],"view.projection":[{key:"",code:"Numpad5"}],"view.back":[{key:"",code:"Numpad1",ctrl:!0}],"view.left":[{key:"",code:"Numpad3",ctrl:!0}],"view.bottom":[{key:"",code:"Numpad7",ctrl:!0}],"view.orbitLeft":[{key:"",code:"Numpad4"}],"view.orbitRight":[{key:"",code:"Numpad6"}],"view.orbitUp":[{key:"",code:"Numpad8"}],"view.orbitDown":[{key:"",code:"Numpad2"}],"view.opposite":[{key:"",code:"Numpad9"}],"view.rollLeft":[{key:"",code:"Numpad4",shift:!0}],"view.rollRight":[{key:"",code:"Numpad6",shift:!0}],"view.all":[{key:"",code:"Home"}],"view.zoomIn":[{key:"",code:"NumpadAdd"},{key:"",code:"Equal",ctrl:!0}],"view.zoomOut":[{key:"",code:"NumpadSubtract"},{key:"",code:"Minus",ctrl:!0}]},navigation:{orbit:"middle",turntable:{degreesPerPixel:.4},autoPerspective:!0,zoom:{step:1.2,drag:"dolly"}}};export{t as keymap,e as point};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{j as e}from"./volter-sdk-mgLi8_Cw.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};
|