@volter/editor-core 0.5.57
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 +1527 -0
- package/LICENSE +686 -0
- package/LICENSE-APACHE +202 -0
- package/NOTICE +18 -0
- package/README.md +24 -0
- package/dist/build/chunk-JS4D4XZ3.js +175 -0
- package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
- package/dist/build/vite-plugin-product-contributions.js +100 -0
- package/dist/build/vite-plugin-product-contributions.js.map +7 -0
- package/dist/build/vite-plugin-shared-react.js +25 -0
- package/dist/build/vite-plugin-shared-react.js.map +7 -0
- package/dist/build/vite-plugin-shared-three.js +86 -0
- package/dist/build/vite-plugin-shared-three.js.map +7 -0
- package/dist/server/chunk-KMJC7AGO.js +98 -0
- package/dist/server/chunk-KMJC7AGO.js.map +7 -0
- package/dist/server/chunk-PSILUMGS.js +46 -0
- package/dist/server/chunk-PSILUMGS.js.map +7 -0
- package/dist/server/frame-proxy.js +255 -0
- package/dist/server/frame-proxy.js.map +7 -0
- package/dist/server/open-browser.js +53 -0
- package/dist/server/open-browser.js.map +7 -0
- package/dist/server/process-shutdown.js +127 -0
- package/dist/server/process-shutdown.js.map +7 -0
- package/dist/server/session-registry.js +141 -0
- package/dist/server/session-registry.js.map +7 -0
- package/dist/server/spawn-opener.js +11 -0
- package/dist/server/spawn-opener.js.map +7 -0
- package/dist/server/worktree-identity.js +11 -0
- package/dist/server/worktree-identity.js.map +7 -0
- package/dist-server/packaged.mjs +88816 -0
- package/package.json +118 -0
- package/scripts/build-plugins.mjs +14 -0
- package/scripts/build-server.mjs +26 -0
- package/scripts/build-session.mjs +9 -0
- package/server/account-credentials.ts +60 -0
- package/server/account-service.ts +1434 -0
- package/server/adapter-region-includes.ts +47 -0
- package/server/asset-catalog-v2.ts +175 -0
- package/server/asset-history-snapshots.ts +196 -0
- package/server/asset-ledger-store.ts +195 -0
- package/server/asset-library-routes.ts +1595 -0
- package/server/blender-wasm-artifact.ts +430 -0
- package/server/boot-timings.ts +106 -0
- package/server/canonical-path.ts +50 -0
- package/server/checkout-workspace-preflight.ts +349 -0
- package/server/cloud-asset-catalog.ts +158 -0
- package/server/coding-inference-launch.ts +237 -0
- package/server/collaboration-account-client.ts +202 -0
- package/server/collaboration-attribution.ts +122 -0
- package/server/collaboration-session.ts +934 -0
- package/server/comfyui-bridge.ts +248 -0
- package/server/console-ledger.ts +499 -0
- package/server/creation-site-transform.ts +304 -0
- package/server/creation-site-write.ts +648 -0
- package/server/data-file-serialize.ts +158 -0
- package/server/editor-brand-html.ts +72 -0
- package/server/editor-control-socket.ts +366 -0
- package/server/editor-server-options.ts +190 -0
- package/server/editor-server.ts +1483 -0
- package/server/editor-sse.ts +352 -0
- package/server/engine-provenance.ts +169 -0
- package/server/engine-source-restart.ts +117 -0
- package/server/frame-bridge.ts +115 -0
- package/server/frame-proxy.ts +490 -0
- package/server/frame-workbench.ts +259 -0
- package/server/frontend-handoff.ts +229 -0
- package/server/game-globals-shadow.ts +113 -0
- package/server/gameplay-session-retention.ts +149 -0
- package/server/gameplay-sessions.ts +123 -0
- package/server/generation-jobs.ts +201 -0
- package/server/generation-reconciler.ts +137 -0
- package/server/generative-execution-context.ts +59 -0
- package/server/git-workflow.ts +612 -0
- package/server/harness-chat-caller.ts +36 -0
- package/server/harness-chat-service.ts +1681 -0
- package/server/idle-shutdown.ts +170 -0
- package/server/js-profiling-policy.ts +52 -0
- package/server/launcher-settings.ts +84 -0
- package/server/local-asset-catalog.ts +410 -0
- package/server/managed-account-defaults.ts +22 -0
- package/server/mock-control-plane.ts +540 -0
- package/server/model-import-conversion.ts +345 -0
- package/server/native-credential-store.ts +162 -0
- package/server/open-browser.ts +118 -0
- package/server/packaged.ts +1192 -0
- package/server/play-stall.ts +126 -0
- package/server/process-shutdown.ts +218 -0
- package/server/product-presets.ts +55 -0
- package/server/project-build-artifact.ts +95 -0
- package/server/project-components.ts +100 -0
- package/server/project-dependency-invalidation.ts +114 -0
- package/server/project-file-scan.ts +235 -0
- package/server/project-hmr-files.ts +215 -0
- package/server/project-install-roots.ts +210 -0
- package/server/project-kinds.ts +71 -0
- package/server/project-mcp-servers.ts +82 -0
- package/server/project-module-freshness.ts +109 -0
- package/server/project-module-instance.ts +375 -0
- package/server/project-optimize-deps-entries.ts +827 -0
- package/server/project-output-writer.ts +679 -0
- package/server/project-package-origin.ts +63 -0
- package/server/project-root-surface.ts +831 -0
- package/server/project-scratch-path.ts +47 -0
- package/server/project-script-hmr.ts +619 -0
- package/server/project-serving-plugins.ts +236 -0
- package/server/project-tools.ts +653 -0
- package/server/project-validation.ts +250 -0
- package/server/project-verbs.ts +127 -0
- package/server/project-view.ts +52 -0
- package/server/project-watch.ts +1134 -0
- package/server/project-work-coordinator.ts +288 -0
- package/server/provider-credentials.ts +331 -0
- package/server/recent-projects-store.ts +98 -0
- package/server/redact-secrets.ts +71 -0
- package/server/repository-presence.ts +267 -0
- package/server/routes/account.ts +357 -0
- package/server/routes/agents.ts +60 -0
- package/server/routes/assets.ts +154 -0
- package/server/routes/build.ts +13 -0
- package/server/routes/collaboration.ts +595 -0
- package/server/routes/configurations.ts +419 -0
- package/server/routes/context.ts +264 -0
- package/server/routes/control-plane.ts +1811 -0
- package/server/routes/logs.ts +272 -0
- package/server/routes/project-identity.ts +302 -0
- package/server/routes/project-open.ts +429 -0
- package/server/routes/project-source.ts +686 -0
- package/server/routes/project-state.ts +383 -0
- package/server/routes/relay.ts +1029 -0
- package/server/routes/route-helpers.ts +29 -0
- package/server/routes/served-modules.ts +138 -0
- package/server/routes/session-tabs.ts +196 -0
- package/server/routes/settings.ts +121 -0
- package/server/routes/share-control.ts +486 -0
- package/server/routes/themes.ts +116 -0
- package/server/routes/tools.ts +230 -0
- package/server/routes/worktrees.ts +595 -0
- package/server/scoped-game-css.ts +461 -0
- package/server/server-utils.ts +1194 -0
- package/server/session-product.ts +112 -0
- package/server/session-registry.ts +230 -0
- package/server/share-claims.ts +138 -0
- package/server/share-host.ts +526 -0
- package/server/share-session-gateway.ts +1362 -0
- package/server/share-tunnel.ts +123 -0
- package/server/spawn-opener.ts +74 -0
- package/server/support/play/log-format.ts +76 -0
- package/server/support/play/session-record.ts +199 -0
- package/server/support/project/build-discipline.ts +718 -0
- package/server/support/project/inspection-node.ts +119 -0
- package/server/support/project/log-naming.ts +54 -0
- package/server/support/project/provenance.ts +290 -0
- package/server/support/project/run-name.ts +18 -0
- package/server/support/project/session-journal.ts +830 -0
- package/server/support/project/shared.ts +327 -0
- package/server/tab-bootstrap.ts +62 -0
- package/server/tab-heartbeat.ts +477 -0
- package/server/tab-lifecycle.ts +550 -0
- package/server/tab-presence.ts +1508 -0
- package/server/team-agent-mirror.ts +95 -0
- package/server/twin-auth.ts +138 -0
- package/server/vendored-lock-recorder.ts +968 -0
- package/server/worktree-identity.ts +121 -0
- package/server/worktree-management.ts +398 -0
- package/server/worktree-retention.d.mts +13 -0
- package/server/worktree-retention.mjs +205 -0
- package/src/EditorContext.tsx +169 -0
- package/src/account.ts +333 -0
- package/src/action-registry.ts +532 -0
- package/src/active-product.ts +74 -0
- package/src/active-project.ts +155 -0
- package/src/adapter-editor-config.ts +25 -0
- package/src/adapter-observation.ts +49 -0
- package/src/animation/stage-transport.ts +379 -0
- package/src/animation/three-clips-subject.ts +172 -0
- package/src/api/asset-library-wire.ts +45 -0
- package/src/api/assets.ts +365 -0
- package/src/api/base.ts +10 -0
- package/src/api/build.ts +99 -0
- package/src/api/git-wire.ts +56 -0
- package/src/api/logs.ts +92 -0
- package/src/api/project-identity.ts +74 -0
- package/src/api/project-open.ts +355 -0
- package/src/api/project-source.ts +162 -0
- package/src/api/project-state.ts +107 -0
- package/src/api/relay.ts +268 -0
- package/src/api/settings.ts +36 -0
- package/src/api/themes.ts +45 -0
- package/src/api/worktrees.ts +257 -0
- package/src/asset-compare-core.ts +171 -0
- package/src/asset-compare.ts +294 -0
- package/src/asset-editor-context.tsx +100 -0
- package/src/asset-events.ts +97 -0
- package/src/asset-inspector-actions.ts +87 -0
- package/src/asset-preview-framing.ts +357 -0
- package/src/asset-preview.ts +2802 -0
- package/src/asset-selection-viewer-registry.ts +113 -0
- package/src/asset-selection.ts +133 -0
- package/src/asset-workflow/asset-capabilities.ts +344 -0
- package/src/asset-workflow/asset-import-jobs.ts +106 -0
- package/src/asset-workflow/asset-ledger-backend.ts +126 -0
- package/src/asset-workflow/asset-ledger.ts +156 -0
- package/src/asset-workflow/asset-materialization-report.ts +140 -0
- package/src/asset-workflow/asset-pack-manifest.ts +320 -0
- package/src/asset-workflow/asset-types.ts +142 -0
- package/src/asset-workflow/asset-workflow-quality.ts +61 -0
- package/src/asset-workflow/audio-preview-player.ts +193 -0
- package/src/asset-workflow/audio-waveform.ts +22 -0
- package/src/asset-workflow/cloud-asset-client.ts +263 -0
- package/src/asset-workflow/folder-preview.ts +345 -0
- package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
- package/src/asset-workflow/image-view-scale.ts +32 -0
- package/src/asset-workflow/import-contract.ts +124 -0
- package/src/asset-workflow/ledger-write-lock.ts +244 -0
- package/src/asset-workflow/model-inspection.ts +818 -0
- package/src/asset-workflow/pixi-spritesheet.ts +197 -0
- package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
- package/src/asset-workflow/project-asset-commands.ts +23 -0
- package/src/asset-workflow/project-asset-health.ts +139 -0
- package/src/asset-workflow/project-asset-operations.ts +154 -0
- package/src/asset-workflow/project-asset-roots.ts +68 -0
- package/src/asset-workflow/project-content.ts +288 -0
- package/src/asset-workflow/project-source-index.ts +550 -0
- package/src/asset-workflow/thumbnail-system.ts +256 -0
- package/src/authoring/active-adapter.ts +199 -0
- package/src/authoring/active-systems.ts +422 -0
- package/src/authoring/adapter-key.ts +18 -0
- package/src/authoring/authoring-asset-url.ts +27 -0
- package/src/authoring/bootstrap-state.ts +49 -0
- package/src/authoring/boundary-authoring-adapter.ts +184 -0
- package/src/authoring/breakpoint-state.ts +43 -0
- package/src/authoring/canvas-scene-guides.ts +76 -0
- package/src/authoring/component-instance-root.ts +171 -0
- package/src/authoring/composite-authoring-adapter.ts +2110 -0
- package/src/authoring/consumer-actions.ts +520 -0
- package/src/authoring/css-numeric-style.ts +97 -0
- package/src/authoring/design-time-layers.ts +849 -0
- package/src/authoring/design-time-mount-registry.ts +235 -0
- package/src/authoring/design-time-settle.ts +343 -0
- package/src/authoring/edit-mode-authoring.ts +619 -0
- package/src/authoring/eyedropper-session.ts +60 -0
- package/src/authoring/instance-source-menu-register.ts +13 -0
- package/src/authoring/instance-source-menu.ts +135 -0
- package/src/authoring/layered-pick.ts +183 -0
- package/src/authoring/live-gesture-lock.ts +50 -0
- package/src/authoring/live-object-transform.ts +62 -0
- package/src/authoring/mount-failure-report.ts +154 -0
- package/src/authoring/mounted-root-subjects.ts +144 -0
- package/src/authoring/no-authoring-adapter.ts +55 -0
- package/src/authoring/null-inspection-subjects.tsx +75 -0
- package/src/authoring/object3d-document-persistence.ts +106 -0
- package/src/authoring/object3d-document-session-registry.ts +120 -0
- package/src/authoring/object3d-document-session.ts +1326 -0
- package/src/authoring/object3d-gesture-controller.ts +113 -0
- package/src/authoring/panel-authoring.ts +121 -0
- package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
- package/src/authoring/prefab-instance-section-model.ts +55 -0
- package/src/authoring/project-authoring-session.ts +105 -0
- package/src/authoring/provenance.ts +99 -0
- package/src/authoring/quarks-particle-systems.ts +19 -0
- package/src/authoring/react-canvas-navigation.ts +255 -0
- package/src/authoring/react-design-canvas-style.ts +20 -0
- package/src/authoring/react-story-board.ts +937 -0
- package/src/authoring/selection-scope.ts +195 -0
- package/src/authoring/shell-document-ops.ts +169 -0
- package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
- package/src/authoring/shell-viewport-policy.ts +48 -0
- package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
- package/src/authoring/stories-scope.ts +35 -0
- package/src/authoring/story-board-chrome-fit.ts +107 -0
- package/src/authoring/story-board-presentation.ts +111 -0
- package/src/authoring/three-projection-core.ts +226 -0
- package/src/authoring/viewport-pick-context.ts +40 -0
- package/src/authoring/viewport-raycast.ts +240 -0
- package/src/authoring/viewport-tool-context.ts +73 -0
- package/src/authoring/world-canvas-viewport-state.ts +35 -0
- package/src/authoring/world-hidden-viewport.ts +152 -0
- package/src/authoring/world-pan-state.ts +198 -0
- package/src/authoring/world-session-state.ts +101 -0
- package/src/authoring/write-pipe.ts +173 -0
- package/src/availability-tick.ts +66 -0
- package/src/bitmap-label.ts +120 -0
- package/src/blender-tab-metrics.ts +161 -0
- package/src/board-open-actions.ts +20 -0
- package/src/boot-routing.ts +391 -0
- package/src/build-identity.ts +15 -0
- package/src/bytes-codec.ts +62 -0
- package/src/camera-authoring.ts +175 -0
- package/src/cancellation-reason.ts +58 -0
- package/src/canvas-preview-frames.ts +482 -0
- package/src/capture-camera-pose.ts +77 -0
- package/src/chrome-registry.ts +159 -0
- package/src/chrome-slot-registry.ts +91 -0
- package/src/collaboration-client.ts +264 -0
- package/src/collaboration-presence.ts +41 -0
- package/src/command-dispatch.ts +19 -0
- package/src/command-listener.ts +2743 -0
- package/src/command-registry.ts +70 -0
- package/src/component-board-registry.ts +205 -0
- package/src/component-states-registry.ts +200 -0
- package/src/components/AgentPresentationNotice.tsx +75 -0
- package/src/components/AlignToolbar.tsx +204 -0
- package/src/components/AppRoot.tsx +394 -0
- package/src/components/ApplicationMenus.tsx +415 -0
- package/src/components/AssetBrowser.tsx +2843 -0
- package/src/components/AssetEditorShell.tsx +216 -0
- package/src/components/AssetInspectorToolSection.tsx +124 -0
- package/src/components/BoardRulers.tsx +354 -0
- package/src/components/CameraInfo.tsx +81 -0
- package/src/components/CanvasSceneViewport.tsx +556 -0
- package/src/components/CapabilityCoverageSection.tsx +185 -0
- package/src/components/CenterDocuments.tsx +22 -0
- package/src/components/ChromeSlot.tsx +20 -0
- package/src/components/CodeView.tsx +470 -0
- package/src/components/CollaborationHeaderControl.css +74 -0
- package/src/components/CompactInspectorCard.tsx +190 -0
- package/src/components/CompactInspectorShell.tsx +39 -0
- package/src/components/ConsolePanel.css +55 -0
- package/src/components/ConsolePanel.tsx +270 -0
- package/src/components/DefaultEditorLayout.tsx +106 -0
- package/src/components/DocumentHeaderStrip.tsx +96 -0
- package/src/components/DocumentShelfRail.tsx +45 -0
- package/src/components/DocumentThumbnail.tsx +345 -0
- package/src/components/EditorLeaseGuard.tsx +372 -0
- package/src/components/ErrorBanner.tsx +123 -0
- package/src/components/FolderPreviewTile.tsx +159 -0
- package/src/components/GameHierarchy.tsx +3842 -0
- package/src/components/GameplaySessionTimeline.tsx +295 -0
- package/src/components/InspectionProjection.tsx +968 -0
- package/src/components/Inspector.tsx +233 -0
- package/src/components/InspectorCanvasPreview.tsx +35 -0
- package/src/components/InspectorFieldsSection.tsx +290 -0
- package/src/components/InspectorObjectPreview.tsx +57 -0
- package/src/components/InspectorStoriesSection.tsx +92 -0
- package/src/components/InspectorToolSection.tsx +96 -0
- package/src/components/InspectorTransformSection.tsx +245 -0
- package/src/components/LightExplorerPanel.tsx +433 -0
- package/src/components/MediaProperties.tsx +145 -0
- package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
- package/src/components/Object3DDocumentToolbar.css +100 -0
- package/src/components/Object3DDocumentToolbar.tsx +454 -0
- package/src/components/Object3DDocumentViewport.tsx +58 -0
- package/src/components/ProjectHeader.css +617 -0
- package/src/components/ProjectHeader.tsx +328 -0
- package/src/components/ProjectLayout.tsx +249 -0
- package/src/components/ReactCanvasControls.tsx +284 -0
- package/src/components/RootSelectionOverlay.tsx +3162 -0
- package/src/components/RootTextEditor.tsx +79 -0
- package/src/components/SaveStatus.tsx +70 -0
- package/src/components/StageHost.tsx +1954 -0
- package/src/components/StageOverlays.tsx +21 -0
- package/src/components/StartupErrorScreen.tsx +76 -0
- package/src/components/StartupLoadingScreen.tsx +65 -0
- package/src/components/StatsOverlay.tsx +78 -0
- package/src/components/SurfaceStateOverlay.tsx +24 -0
- package/src/components/ToolContributionSurfaces.tsx +65 -0
- package/src/components/ToolHost.tsx +370 -0
- package/src/components/ToolObject3DPreview.tsx +39 -0
- package/src/components/Toolbar.tsx +595 -0
- package/src/components/TransientHint.tsx +44 -0
- package/src/components/TransportStrip.tsx +174 -0
- package/src/components/VersionControlSection.tsx +470 -0
- package/src/components/VgaiLogo.css +83 -0
- package/src/components/VgaiLogo.tsx +35 -0
- package/src/components/ViewportControlsHint.tsx +60 -0
- package/src/components/ViewportFurniture.tsx +401 -0
- package/src/components/ViewportOverlay.tsx +145 -0
- package/src/components/ViewportOverlaysMenu.tsx +153 -0
- package/src/components/ViewportShadingMenu.tsx +300 -0
- package/src/components/ViewportViewMenu.tsx +101 -0
- package/src/components/WorkspaceDocumentSurface.tsx +204 -0
- package/src/components/WorkspaceUtilitySurface.tsx +22 -0
- package/src/components/WorktreeSwitcher.css +239 -0
- package/src/components/WorktreeSwitcher.tsx +890 -0
- package/src/components/account-documents.tsx +1162 -0
- package/src/components/asset-documents.tsx +812 -0
- package/src/components/asset-editor-persistence.ts +216 -0
- package/src/components/asset-selection-section.tsx +535 -0
- package/src/components/asset-thumbnails.tsx +312 -0
- package/src/components/asset-viewers/AudioViewer.tsx +201 -0
- package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
- package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
- package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
- package/src/components/asset-viewers/ImageViewer.tsx +300 -0
- package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
- package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
- package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
- package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
- package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
- package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
- package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
- package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
- package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
- package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
- package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
- package/src/components/asset-viewers/VideoViewer.tsx +101 -0
- package/src/components/asset-viewers/shader-source.ts +144 -0
- package/src/components/asset-workflow.css +731 -0
- package/src/components/board-guides.ts +150 -0
- package/src/components/compact-inspector.css +539 -0
- package/src/components/core-utilities.tsx +90 -0
- package/src/components/editor-notifications.css +40 -0
- package/src/components/engine-workspace.css +274 -0
- package/src/components/inspector-preview-section.tsx +238 -0
- package/src/components/inspector-property-grouping.ts +64 -0
- package/src/components/inspector-revert-label.ts +20 -0
- package/src/components/inspector-selection.ts +42 -0
- package/src/components/inspector-stories-gating.ts +171 -0
- package/src/components/inspector-transform-subject.ts +11 -0
- package/src/components/inspector-transform.ts +75 -0
- package/src/components/kind-documents.tsx +500 -0
- package/src/components/palette-action-publisher.tsx +140 -0
- package/src/components/primitives/DraftColorInput.tsx +74 -0
- package/src/components/product-shell.css +1829 -0
- package/src/components/project-tool-documents.tsx +410 -0
- package/src/components/scene-documents.tsx +223 -0
- package/src/components/stage-keyboard.tsx +37 -0
- package/src/components/stage-overlay-set.tsx +107 -0
- package/src/components/stage-presence-markers.ts +478 -0
- package/src/components/standard-viewport-dressing.ts +417 -0
- package/src/components/status-contributions.tsx +403 -0
- package/src/components/tool-documents.tsx +309 -0
- package/src/components/tool-schema-form.tsx +262 -0
- package/src/components/use-after-paint.ts +41 -0
- package/src/components/use-project-image-assets.ts +86 -0
- package/src/components/viewport-header-controls.css +90 -0
- package/src/components/viewport-surface-status.tsx +55 -0
- package/src/components/workspace-history.ts +32 -0
- package/src/components/workspace-static-panel-registry.tsx +152 -0
- package/src/components/workspace-surfaces.css +621 -0
- package/src/components/world-documents.tsx +586 -0
- package/src/components/world-overlay-gestures.ts +1694 -0
- package/src/composite-screenshot.ts +1641 -0
- package/src/console-sync.ts +131 -0
- package/src/constraint-helper.ts +338 -0
- package/src/content-entry-source-registry.ts +184 -0
- package/src/coverage/authoring-seam-evidence.ts +300 -0
- package/src/coverage/canvas-reveal.ts +192 -0
- package/src/coverage/design-time-surfaces.ts +101 -0
- package/src/coverage/live-seam-evidence.ts +11 -0
- package/src/coverage/ontology-invariants.ts +466 -0
- package/src/coverage/session-vitals.ts +501 -0
- package/src/coverage/system-seam-evidence.ts +72 -0
- package/src/crash-null-boundary.ts +36 -0
- package/src/creation-site-edit.ts +1479 -0
- package/src/creation-site-registry.ts +160 -0
- package/src/delegate-harness-registry.ts +143 -0
- package/src/document-context-registry.ts +177 -0
- package/src/document-open-registry.ts +200 -0
- package/src/document-preview-source.ts +20 -0
- package/src/document-renderer-session.ts +138 -0
- package/src/editor-api.ts +46 -0
- package/src/editor-chrome-capture.ts +139 -0
- package/src/editor-commands.ts +164 -0
- package/src/editor-console.ts +563 -0
- package/src/editor-current-view.ts +82 -0
- package/src/editor-document-probe.ts +881 -0
- package/src/editor-git-client.ts +115 -0
- package/src/editor-host-door.ts +462 -0
- package/src/editor-hotkeys.ts +842 -0
- package/src/editor-lease-view.ts +39 -0
- package/src/editor-lease.ts +415 -0
- package/src/editor-mode.ts +19 -0
- package/src/editor-notifications.ts +140 -0
- package/src/editor-presence.ts +563 -0
- package/src/editor-presentation-activity.ts +50 -0
- package/src/editor-presentation-notice.ts +42 -0
- package/src/editor-runtime.tsx +145 -0
- package/src/editor-server-response.ts +86 -0
- package/src/editor-session-attribution.ts +75 -0
- package/src/editor-session-mode.ts +54 -0
- package/src/editor-shell-store.ts +1304 -0
- package/src/editor-state-facets.ts +74 -0
- package/src/editor-styles.css +33 -0
- package/src/editor-view-presentation.ts +810 -0
- package/src/editor-viewport.ts +5302 -0
- package/src/entity-lod.ts +31 -0
- package/src/entity-object.ts +91 -0
- package/src/files/file-provider.ts +62 -0
- package/src/files/project-files.ts +264 -0
- package/src/finders/index.ts +136 -0
- package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
- package/src/frame/bridge.tsx +1408 -0
- package/src/frame/product.ts +77 -0
- package/src/gameplay-dom-recording.ts +319 -0
- package/src/gameplay-export-state.ts +14 -0
- package/src/gameplay-replay.ts +417 -0
- package/src/gameplay-session-time.ts +9 -0
- package/src/gameplay-sessions.ts +204 -0
- package/src/harness-chat-types.ts +253 -0
- package/src/hierarchy-component-marks.ts +298 -0
- package/src/hierarchy-drop.ts +91 -0
- package/src/hierarchy-expansion-state.ts +80 -0
- package/src/hierarchy-header-slot.ts +52 -0
- package/src/hierarchy-internals.ts +197 -0
- package/src/hierarchy-kind-icon.ts +217 -0
- package/src/hierarchy-mark-reader.ts +73 -0
- package/src/hierarchy-menu-registry.ts +67 -0
- package/src/hierarchy-node-rows.ts +307 -0
- package/src/hierarchy-panel-view.ts +280 -0
- package/src/hierarchy-projection.ts +76 -0
- package/src/hierarchy-row-cache.ts +243 -0
- package/src/hierarchy-row-model.ts +308 -0
- package/src/hierarchy-rows.ts +11 -0
- package/src/hierarchy-walk.ts +86 -0
- package/src/history/editor-session.ts +25 -0
- package/src/history/history-commands.ts +147 -0
- package/src/history/history-delegate.ts +163 -0
- package/src/history/history-limit-notices.ts +43 -0
- package/src/history/history-service.ts +1173 -0
- package/src/history/persistence-coordinator.ts +35 -0
- package/src/history/project-file-history.ts +386 -0
- package/src/history/project-root-history-backends.ts +139 -0
- package/src/history/resource-registry.ts +209 -0
- package/src/history/snapshot-store.ts +103 -0
- package/src/history/source-history-backend.ts +546 -0
- package/src/history/types.ts +124 -0
- package/src/hmr-registration-group.ts +67 -0
- package/src/hmr-stable-react-context.ts +23 -0
- package/src/hotkeys.ts +188 -0
- package/src/inference-diagnostics.ts +69 -0
- package/src/initial-project.ts +80 -0
- package/src/inspection/active-subject.ts +578 -0
- package/src/inspection/active-surface.ts +142 -0
- package/src/inspection/compose.ts +1064 -0
- package/src/inspection/display.ts +170 -0
- package/src/inspection/document-subject.ts +109 -0
- package/src/inspection/game-subject.ts +85 -0
- package/src/inspection/model.ts +542 -0
- package/src/inspection/null-subject.ts +115 -0
- package/src/inspection/serialize.ts +357 -0
- package/src/inspection/use-active-inspection.ts +180 -0
- package/src/inspector-presentation.ts +201 -0
- package/src/inspector-section-registry.ts +221 -0
- package/src/instance-source-actions.ts +163 -0
- package/src/instanced-presentation.ts +164 -0
- package/src/js-heap.ts +71 -0
- package/src/key-actions.ts +91 -0
- package/src/keymap-presets.ts +401 -0
- package/src/layout-policy.ts +31 -0
- package/src/learn-links.ts +73 -0
- package/src/light-explorer-model.ts +134 -0
- package/src/live-canvas-frame.ts +55 -0
- package/src/live-document.ts +279 -0
- package/src/live-module-source.ts +230 -0
- package/src/live-session-registry.ts +220 -0
- package/src/live-transition.ts +633 -0
- package/src/manifest-project.ts +107 -0
- package/src/model-thumbnail.ts +523 -0
- package/src/native-selection-style.ts +202 -0
- package/src/object3d-document-write-policy.ts +137 -0
- package/src/packaged-runtime.ts +108 -0
- package/src/palettes/maya.palette.json +57 -0
- package/src/palettes/substance.palette.json +57 -0
- package/src/pasteboard-module.ts +81 -0
- package/src/performance-profiler.ts +367 -0
- package/src/performance-sources.ts +69 -0
- package/src/play-boot-phase.ts +145 -0
- package/src/presentation-surface.ts +248 -0
- package/src/project-adapter.ts +1143 -0
- package/src/project-asset-refresh.ts +26 -0
- package/src/project-declaration-refresh.ts +31 -0
- package/src/project-local-state.ts +118 -0
- package/src/project-manager.ts +243 -0
- package/src/project-module-changes.ts +163 -0
- package/src/project-module-split.ts +266 -0
- package/src/project-provenance.ts +115 -0
- package/src/project-ready.ts +42 -0
- package/src/project-session-reset.ts +67 -0
- package/src/project-shape.ts +68 -0
- package/src/project-tool-discovery.ts +66 -0
- package/src/project-tools.ts +107 -0
- package/src/project-work-types.ts +149 -0
- package/src/projection/three.ts +898 -0
- package/src/projection/types.ts +44 -0
- package/src/readiness.ts +113 -0
- package/src/reflection-probe-helper.ts +142 -0
- package/src/reported-play-state.ts +90 -0
- package/src/resolve-relative-specifier.ts +33 -0
- package/src/scene-document-plan.ts +315 -0
- package/src/scene-framing.ts +315 -0
- package/src/scene-live-open.ts +210 -0
- package/src/scene-view-fog.ts +89 -0
- package/src/scoped-game-css.ts +152 -0
- package/src/session-orphan-record.ts +193 -0
- package/src/session-tombstone.ts +126 -0
- package/src/settings/settings-provider.ts +82 -0
- package/src/settings-store.ts +345 -0
- package/src/shared-view-restore.ts +42 -0
- package/src/shell-store-door.ts +45 -0
- package/src/source-conflict.ts +122 -0
- package/src/spatial-handle-visuals.ts +332 -0
- package/src/stage-context.ts +341 -0
- package/src/stage-store-registry.ts +63 -0
- package/src/stale-chunk-recovery.ts +34 -0
- package/src/state-report-deferral.ts +73 -0
- package/src/storage/host-files-storage.ts +97 -0
- package/src/storage/http-storage.ts +174 -0
- package/src/storage/index.ts +75 -0
- package/src/storage/mem-storage.ts +149 -0
- package/src/storage/path-lock.ts +44 -0
- package/src/storage/paths.ts +26 -0
- package/src/storage/types.ts +116 -0
- package/src/stories/StoryComponentThumbnail.tsx +184 -0
- package/src/stories/StoryPreviewMount.tsx +306 -0
- package/src/stories/component-content-source.tsx +106 -0
- package/src/stories/component-states-source.ts +78 -0
- package/src/stories/compose-project-stories.ts +255 -0
- package/src/stories/pixi-story-model.ts +30 -0
- package/src/stories/prefabs-finder.ts +54 -0
- package/src/stories/prefabs-from-stories.ts +182 -0
- package/src/stories/project-story-discovery.ts +78 -0
- package/src/stories/project-story-regions.ts +24 -0
- package/src/stories/story-actions.ts +54 -0
- package/src/stories/story-capture-command.ts +124 -0
- package/src/stories/story-capture.ts +584 -0
- package/src/stories/story-declared-medium.ts +126 -0
- package/src/stories/story-discovery.ts +176 -0
- package/src/stories/story-document-openers.ts +36 -0
- package/src/stories/story-dom-runtime.ts +78 -0
- package/src/stories/story-grouping.ts +111 -0
- package/src/stories/story-lane.ts +88 -0
- package/src/stories/story-mount-turn.ts +27 -0
- package/src/stories/story-opener.ts +260 -0
- package/src/stories/story-pixi-preview.ts +408 -0
- package/src/stories/story-presentation.ts +215 -0
- package/src/stories/story-registry.ts +517 -0
- package/src/stories/story-three-preview.ts +807 -0
- package/src/stories/three-story-model.ts +96 -0
- package/src/story-three-preview-runtime.ts +56 -0
- package/src/surface-keyboard.ts +112 -0
- package/src/surface-state.ts +124 -0
- package/src/tab-bootstrap.js +628 -0
- package/src/tab-census.ts +198 -0
- package/src/tab-lifecycle-client.ts +196 -0
- package/src/theme-library.ts +844 -0
- package/src/theme-preference.ts +378 -0
- package/src/theme.css +3437 -0
- package/src/three-viewport/bone-selection-highlight.ts +119 -0
- package/src/three-viewport/camera-fit.ts +41 -0
- package/src/three-viewport/interactive-renderer.ts +132 -0
- package/src/three-viewport/selection-brackets.ts +310 -0
- package/src/three-viewport/selection-outline.ts +183 -0
- package/src/three-viewport/skeleton-helper.ts +61 -0
- package/src/three-viewport/source-color.ts +167 -0
- package/src/three-viewport/studio-environment.ts +96 -0
- package/src/three-viewport-presentation.ts +23 -0
- package/src/tool-contribution-play.ts +74 -0
- package/src/tool-loader.ts +1798 -0
- package/src/transform-mode-request.ts +57 -0
- package/src/transient-hint.ts +78 -0
- package/src/trigger-volume-helper.ts +116 -0
- package/src/ui-source/adapter-region-includes.ts +241 -0
- package/src/ui-source/ensure-import.ts +132 -0
- package/src/ui-source/file-region-resolver.ts +302 -0
- package/src/ui-source/inspect.ts +775 -0
- package/src/ui-source/oid-transform.ts +1845 -0
- package/src/ui-source/plan-csf-story.ts +196 -0
- package/src/ui-source/plan-extract-component.ts +421 -0
- package/src/ui-source/plan-fork-component.ts +621 -0
- package/src/ui-source/plan-named-style.ts +95 -0
- package/src/ui-source/plan-source-edit.ts +353 -0
- package/src/ui-source/r3f-contract-resolver.ts +327 -0
- package/src/ui-source/r3f-diagnostic-index.ts +165 -0
- package/src/ui-source/r3f-environment-binding.ts +133 -0
- package/src/ui-source/r3f-joint-binding.ts +251 -0
- package/src/ui-source/r3f-lod-binding.ts +91 -0
- package/src/ui-source/r3f-particle-binding.ts +235 -0
- package/src/ui-source/r3f-physics-binding.ts +483 -0
- package/src/ui-source/r3f-project-contracts.ts +444 -0
- package/src/ui-source/relative-import-specifier.ts +34 -0
- package/src/ui-source/reparent-guard.ts +544 -0
- package/src/ui-source/source-edit-request.ts +97 -0
- package/src/ui-source/source-write-backend.ts +618 -0
- package/src/ui-source/syntactic-prop-specs.ts +296 -0
- package/src/ui-source/tier-source-write-backend.ts +279 -0
- package/src/ui-source/ts-ast.ts +171 -0
- package/src/ui-source/utility-class-support.ts +169 -0
- package/src/ui-source/write-component-default.ts +133 -0
- package/src/ui-source/writer.ts +1989 -0
- package/src/viewport-activation-timings.ts +840 -0
- package/src/viewport-authoring-policy.ts +186 -0
- package/src/viewport-controls-hint.ts +57 -0
- package/src/viewport-door.ts +237 -0
- package/src/viewport-shading-boundary.ts +12 -0
- package/src/vite-error-surface.ts +141 -0
- package/src/wait-until.ts +37 -0
- package/src/workspace-areas.ts +156 -0
- package/src/workspace-aux-commands.ts +11 -0
- package/src/workspace-available-documents.ts +127 -0
- package/src/workspace-core-utilities.ts +31 -0
- package/src/workspace-document-ids.ts +59 -0
- package/src/workspace-document-registry.ts +612 -0
- package/src/workspace-document-restore.ts +145 -0
- package/src/workspace-host-commands.ts +141 -0
- package/src/workspace-persistence-gate.ts +40 -0
- package/src/workspace-play-utilities.ts +44 -0
- package/src/workspace-presets.ts +425 -0
- package/src/workspace-regions.ts +294 -0
- package/src/workspace-state-persistence.ts +536 -0
- package/src/workspace-static-panels.ts +73 -0
- package/src/workspace-status-registry.ts +121 -0
- package/src/workspace-style.ts +239 -0
- package/src/workspace-utility-commands.ts +74 -0
- package/src/workspace-utility-registry.ts +263 -0
- package/src/workspace-viewport-rect.ts +97 -0
- package/src/world-adoption.ts +115 -0
- package/src/world-document-routing.ts +104 -0
- package/vite-plugin-creation-site-write.ts +184 -0
- package/vite-plugin-creation-site.ts +80 -0
- package/vite-plugin-game-static.ts +303 -0
- package/vite-plugin-module-doorways.ts +336 -0
- package/vite-plugin-product-contributions.ts +197 -0
- package/vite-plugin-project-game-static.ts +125 -0
- package/vite-plugin-project-jsx-js.ts +65 -0
- package/vite-plugin-project-root-absolute-assets.ts +359 -0
- package/vite-plugin-shared-react.ts +420 -0
- package/vite-plugin-shared-three.ts +203 -0
- package/vite-plugin-ui-oid.ts +2106 -0
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
import {
|
|
2
|
+
faBone,
|
|
3
|
+
faCamera,
|
|
4
|
+
faCaretDown,
|
|
5
|
+
faCheck,
|
|
6
|
+
faCube,
|
|
7
|
+
faEllipsis,
|
|
8
|
+
faExpand,
|
|
9
|
+
faRotateLeft,
|
|
10
|
+
} from '@fortawesome/free-solid-svg-icons';
|
|
11
|
+
import {
|
|
12
|
+
AnchoredMenu,
|
|
13
|
+
Button,
|
|
14
|
+
EditorBanner,
|
|
15
|
+
EditorIcon,
|
|
16
|
+
EditorPopover,
|
|
17
|
+
EditorToolbar,
|
|
18
|
+
IconButton,
|
|
19
|
+
MenuItem,
|
|
20
|
+
MenuSeparator,
|
|
21
|
+
Select,
|
|
22
|
+
Text,
|
|
23
|
+
TextInput,
|
|
24
|
+
Tooltip,
|
|
25
|
+
} from '@volter/editor-sdk/widgets';
|
|
26
|
+
import { useRef, useState, useSyncExternalStore } from 'react';
|
|
27
|
+
import { captureModelAssetPreview, captureObjectAssetPreview } from '../asset-preview';
|
|
28
|
+
import {
|
|
29
|
+
type ModelCameraPreset,
|
|
30
|
+
supportedModelDiagnosticModes,
|
|
31
|
+
} from '../asset-workflow/model-inspection';
|
|
32
|
+
import type { Object3DDocumentViewMode } from '../authoring/object3d-document-session';
|
|
33
|
+
import {
|
|
34
|
+
object3DDocumentSession,
|
|
35
|
+
object3DDocumentSessionsVersion,
|
|
36
|
+
subscribeObject3DDocumentSessions,
|
|
37
|
+
} from '../authoring/object3d-document-session-registry';
|
|
38
|
+
import {
|
|
39
|
+
contributedChromeVersion,
|
|
40
|
+
contributedHeaderItems,
|
|
41
|
+
subscribeContributedChrome,
|
|
42
|
+
} from '../chrome-registry';
|
|
43
|
+
import type { HelperVisibility } from '../editor-shell-store';
|
|
44
|
+
import { object3DDocumentWritePolicy } from '../object3d-document-write-policy';
|
|
45
|
+
import { stageStore, stageStoresVersion, subscribeStageStores } from '../stage-store-registry';
|
|
46
|
+
import { viewportStageHelperKinds } from '../viewport-door';
|
|
47
|
+
import { ViewportOverlaysGlyph, ViewportOverlaysMenu } from './ViewportOverlaysMenu';
|
|
48
|
+
import {
|
|
49
|
+
type ViewportDisplayModeChoice,
|
|
50
|
+
ViewportDisplayModeMenu,
|
|
51
|
+
viewportShadingModes,
|
|
52
|
+
viewportShadingSegments,
|
|
53
|
+
} from './ViewportShadingMenu';
|
|
54
|
+
|
|
55
|
+
const subscribeToNothing = () => () => undefined;
|
|
56
|
+
const noSessionVersion = () => 0;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* THE DOCUMENT'S OWN OVERLAY ROWS, beside Grid and Bounds.
|
|
60
|
+
*
|
|
61
|
+
* Blender's viewport overlay popover carries a BONES checkbox
|
|
62
|
+
* (`View3DOverlay.show_bones`, `makesrna/intern/rna_space.cc:5125-5129`, drawn
|
|
63
|
+
* by `scripts/startup/bl_ui/space_view3d.py:7161` with `text="Bones"`), and it
|
|
64
|
+
* is Blender's noun that is used here rather than the Helpers vocabulary's
|
|
65
|
+
* `Skeletons`, because this menu IS that popover — the comment on the eye below
|
|
66
|
+
* says so. `Weights` has no Blender checkbox at all: Blender reaches weight
|
|
67
|
+
* colours through Weight Paint MODE, and an inspection surface has no brushes
|
|
68
|
+
* to enter one, so it is a display toggle here (WORK.md §Blender in the tab is
|
|
69
|
+
* Blender, "Inspection parity", I4).
|
|
70
|
+
*
|
|
71
|
+
* A ROW STANDS ONLY WHERE THE DOCUMENT PUT A HELPER OF THAT KIND on this stage
|
|
72
|
+
* (`viewportStageHelperKinds`) — the same rule the Outliner's restriction
|
|
73
|
+
* columns follow: a control follows what the thing behind it answers, never a
|
|
74
|
+
* knob. So an imported GLB's Asset Lab document, which shows no bones, draws
|
|
75
|
+
* neither row.
|
|
76
|
+
*/
|
|
77
|
+
const DOCUMENT_HELPER_ROWS: readonly { key: keyof HelperVisibility; label: string }[] = [
|
|
78
|
+
{ key: 'skeletons', label: 'Bones' },
|
|
79
|
+
{ key: 'weights', label: 'Weights' },
|
|
80
|
+
];
|
|
81
|
+
export function Object3DDocumentToolbar({
|
|
82
|
+
documentId,
|
|
83
|
+
assetPath,
|
|
84
|
+
}: {
|
|
85
|
+
readonly documentId: string;
|
|
86
|
+
readonly assetPath?: string;
|
|
87
|
+
}) {
|
|
88
|
+
useSyncExternalStore(
|
|
89
|
+
subscribeObject3DDocumentSessions,
|
|
90
|
+
object3DDocumentSessionsVersion,
|
|
91
|
+
object3DDocumentSessionsVersion,
|
|
92
|
+
);
|
|
93
|
+
const session = object3DDocumentSession(documentId);
|
|
94
|
+
useSyncExternalStore(
|
|
95
|
+
subscribeContributedChrome,
|
|
96
|
+
contributedChromeVersion,
|
|
97
|
+
contributedChromeVersion,
|
|
98
|
+
);
|
|
99
|
+
useSyncExternalStore(
|
|
100
|
+
session?.subscribe ?? subscribeToNothing,
|
|
101
|
+
session?.getSnapshot ?? noSessionVersion,
|
|
102
|
+
session?.getSnapshot ?? noSessionVersion,
|
|
103
|
+
);
|
|
104
|
+
// THIS STAGE's own store and its own helpers: the shared panels read
|
|
105
|
+
// whichever store the FOCUSED document's stage runs on (ARCHITECTURE-CORE
|
|
106
|
+
// §One stage), and a toolbar is a control over ITS document, never over the
|
|
107
|
+
// world root's.
|
|
108
|
+
useSyncExternalStore(subscribeStageStores, stageStoresVersion, stageStoresVersion);
|
|
109
|
+
const stage = stageStore(documentId);
|
|
110
|
+
useSyncExternalStore(
|
|
111
|
+
stage?.subscribe ?? subscribeToNothing,
|
|
112
|
+
stage?.getSnapshot ?? noSessionVersion,
|
|
113
|
+
stage?.getSnapshot ?? noSessionVersion,
|
|
114
|
+
);
|
|
115
|
+
const helperKinds = viewportStageHelperKinds(documentId);
|
|
116
|
+
const [capture, setCapture] = useState<string | null>(null);
|
|
117
|
+
const [error, setError] = useState<string | null>(null);
|
|
118
|
+
const [viewOpen, setViewOpen] = useState(false);
|
|
119
|
+
const [moreOpen, setMoreOpen] = useState(false);
|
|
120
|
+
const viewRef = useRef<HTMLButtonElement>(null);
|
|
121
|
+
const moreRef = useRef<HTMLButtonElement>(null);
|
|
122
|
+
if (!session) return null;
|
|
123
|
+
const presentation = session.presentation();
|
|
124
|
+
const availableModes = new Set(
|
|
125
|
+
supportedModelDiagnosticModes(session.root)
|
|
126
|
+
.filter((item) => item.available)
|
|
127
|
+
.map((item) => item.mode),
|
|
128
|
+
);
|
|
129
|
+
const modes: Array<ViewportDisplayModeChoice<Object3DDocumentViewMode>> = [
|
|
130
|
+
...viewportShadingModes,
|
|
131
|
+
...(availableModes.has('uv')
|
|
132
|
+
? [{ mode: 'uv' as const, label: 'UV', description: 'UV coordinates as surface color' }]
|
|
133
|
+
: []),
|
|
134
|
+
...(availableModes.has('vertex-colors')
|
|
135
|
+
? [
|
|
136
|
+
{
|
|
137
|
+
mode: 'vertex-colors' as const,
|
|
138
|
+
label: 'Vertex colors',
|
|
139
|
+
description: 'Authored color attributes without textures',
|
|
140
|
+
},
|
|
141
|
+
]
|
|
142
|
+
: []),
|
|
143
|
+
];
|
|
144
|
+
|
|
145
|
+
const saveThumbnailFraming = async (reset: boolean) => {
|
|
146
|
+
if (!assetPath) return;
|
|
147
|
+
setError(null);
|
|
148
|
+
try {
|
|
149
|
+
// The shell owns where a framing is RECORDED (`.vgai/thumbnails.json`,
|
|
150
|
+
// written through the project-file route); this surface only knows the
|
|
151
|
+
// asset and the pose. See `object3d-document-write-policy.ts`.
|
|
152
|
+
await object3DDocumentWritePolicy().saveThumbnailFraming(
|
|
153
|
+
assetPath,
|
|
154
|
+
reset ? undefined : session.cameraPose(),
|
|
155
|
+
);
|
|
156
|
+
} catch (cause) {
|
|
157
|
+
setError(cause instanceof Error ? cause.message : String(cause));
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
const capturePreview = async () => {
|
|
162
|
+
setError(null);
|
|
163
|
+
try {
|
|
164
|
+
const options = { background: presentation.background } as const;
|
|
165
|
+
const result = assetPath?.toLowerCase().endsWith('.spz')
|
|
166
|
+
? await captureModelAssetPreview(assetPath, options)
|
|
167
|
+
: captureObjectAssetPreview(session.root, options);
|
|
168
|
+
setCapture(`data:image/png;base64,${result.contactSheet.base64}`);
|
|
169
|
+
} catch (cause) {
|
|
170
|
+
setError(cause instanceof Error ? cause.message : String(cause));
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
const frameLabel = session.selection().length > 0 ? 'Frame selection' : 'Frame all';
|
|
175
|
+
return (
|
|
176
|
+
<div className="vgai-model-document-header">
|
|
177
|
+
<EditorToolbar
|
|
178
|
+
compact
|
|
179
|
+
label="Viewport view controls"
|
|
180
|
+
className="vgai-model-viewport-toolbar vgai-model-viewport-toolbar--view"
|
|
181
|
+
>
|
|
182
|
+
{/* THE BUTTON SAYS WHAT IT DOES. `session.frame()` frames the
|
|
183
|
+
selection when there is one and the whole subject when there is
|
|
184
|
+
not, but it was labelled "Frame selection" unconditionally — so a
|
|
185
|
+
tester hunting a fit-the-board control on the 3D board reported
|
|
186
|
+
finding none, then discovered this button does exactly that
|
|
187
|
+
(runhuman passes 87 and 89). One control, named for the job it is
|
|
188
|
+
about to do. */}
|
|
189
|
+
<Tooltip text={frameLabel}>
|
|
190
|
+
<IconButton aria-label={frameLabel} onClick={() => session.frame()}>
|
|
191
|
+
<EditorIcon icon={faExpand} size="md" />
|
|
192
|
+
</IconButton>
|
|
193
|
+
</Tooltip>
|
|
194
|
+
<div className="vgai-viewport-popover-anchor">
|
|
195
|
+
<Tooltip text="Camera orientation and projection">
|
|
196
|
+
<Button
|
|
197
|
+
ref={viewRef}
|
|
198
|
+
type="button"
|
|
199
|
+
size="compact"
|
|
200
|
+
// A dropdown TRIGGER is a widget, not a label: Blender's
|
|
201
|
+
// `Object Mode v` in the same row of chrome is a 20px well
|
|
202
|
+
// (#272727 in a 1px #3c3c3c border) while its plain menu words
|
|
203
|
+
// — View/Select/Add — carry no chrome at all. `ghost` said this
|
|
204
|
+
// was the second kind; it is the first.
|
|
205
|
+
variant="secondary"
|
|
206
|
+
aria-label={`Camera view: ${presentation.projection}`}
|
|
207
|
+
aria-haspopup="menu"
|
|
208
|
+
aria-expanded={viewOpen}
|
|
209
|
+
onClick={() => setViewOpen((open) => !open)}
|
|
210
|
+
className="vgai-model-toolbar-labelled-control"
|
|
211
|
+
>
|
|
212
|
+
<EditorIcon icon={faCube} size="sm" />
|
|
213
|
+
<span>
|
|
214
|
+
{presentation.projection === 'perspective' ? 'Perspective' : 'Orthographic'}
|
|
215
|
+
</span>
|
|
216
|
+
<EditorIcon icon={faCaretDown} size="xs" />
|
|
217
|
+
</Button>
|
|
218
|
+
</Tooltip>
|
|
219
|
+
{viewOpen && (
|
|
220
|
+
<AnchoredMenu
|
|
221
|
+
anchorRef={viewRef}
|
|
222
|
+
align="start"
|
|
223
|
+
clamp
|
|
224
|
+
aria-label="Camera view"
|
|
225
|
+
onDismiss={() => setViewOpen(false)}
|
|
226
|
+
style={{ minWidth: 210 }}
|
|
227
|
+
>
|
|
228
|
+
{(['front', 'right', 'top', 'isometric'] as ModelCameraPreset[]).map((preset) => (
|
|
229
|
+
<MenuItem
|
|
230
|
+
key={preset}
|
|
231
|
+
onSelect={() => {
|
|
232
|
+
session.setViewPreset(preset);
|
|
233
|
+
setViewOpen(false);
|
|
234
|
+
}}
|
|
235
|
+
>
|
|
236
|
+
{preset === 'isometric'
|
|
237
|
+
? 'Perspective 3/4'
|
|
238
|
+
: `${preset[0]?.toUpperCase()}${preset.slice(1)} view`}
|
|
239
|
+
</MenuItem>
|
|
240
|
+
))}
|
|
241
|
+
<MenuSeparator />
|
|
242
|
+
{(['perspective', 'orthographic'] as const).map((projection) => (
|
|
243
|
+
<MenuItem
|
|
244
|
+
key={projection}
|
|
245
|
+
role="menuitemradio"
|
|
246
|
+
aria-checked={presentation.projection === projection}
|
|
247
|
+
onSelect={() => {
|
|
248
|
+
session.setProjection(projection);
|
|
249
|
+
setViewOpen(false);
|
|
250
|
+
}}
|
|
251
|
+
>
|
|
252
|
+
<span className="vgai-menu-check">
|
|
253
|
+
{presentation.projection === projection && (
|
|
254
|
+
<EditorIcon icon={faCheck} size="xs" />
|
|
255
|
+
)}
|
|
256
|
+
</span>
|
|
257
|
+
{projection === 'perspective' ? 'Perspective' : 'Orthographic'}
|
|
258
|
+
</MenuItem>
|
|
259
|
+
))}
|
|
260
|
+
</AnchoredMenu>
|
|
261
|
+
)}
|
|
262
|
+
</div>
|
|
263
|
+
{availableModes.has('skeleton') ? (
|
|
264
|
+
<Tooltip text={`Rig: ${presentation.skeleton ? 'Visible' : 'Hidden'}`}>
|
|
265
|
+
<IconButton
|
|
266
|
+
aria-label="Toggle rig overlay"
|
|
267
|
+
aria-pressed={presentation.skeleton}
|
|
268
|
+
onClick={() => session.setSkeleton(!presentation.skeleton)}
|
|
269
|
+
>
|
|
270
|
+
<EditorIcon icon={faBone} size="md" />
|
|
271
|
+
</IconButton>
|
|
272
|
+
</Tooltip>
|
|
273
|
+
) : null}
|
|
274
|
+
{/* A package's own controls on this document (`@volter/editor-sdk/chrome`,
|
|
275
|
+
`placement: 'object3d-document'`): handed the document's id; the
|
|
276
|
+
contribution resolves its subject through its own integration. */}
|
|
277
|
+
{contributedHeaderItems('object3d-document').map(({ id, Component }) => (
|
|
278
|
+
<Component key={id} documentId={documentId} />
|
|
279
|
+
))}
|
|
280
|
+
</EditorToolbar>
|
|
281
|
+
<EditorToolbar
|
|
282
|
+
compact
|
|
283
|
+
label="Viewport preview controls"
|
|
284
|
+
className="vgai-model-viewport-toolbar vgai-model-viewport-toolbar--preview"
|
|
285
|
+
>
|
|
286
|
+
{/* THE DISPLAY CONTROLS SIT AT THE TRAILING EDGE, which is where
|
|
287
|
+
Blender's are: its 3D View header packs Visibility, Gizmo,
|
|
288
|
+
Overlays, X-Ray and Shading hard against the region's right border
|
|
289
|
+
and leaves the middle empty. Ours used to clump them after the
|
|
290
|
+
view controls with three hundred pixels of bare header to their
|
|
291
|
+
right and this group's `...` alone at the edge. */}
|
|
292
|
+
{/* BLENDER'S SHADING CONTROL, one widget: the segments it has, and the
|
|
293
|
+
chevron's popover carrying every other mode AND the lighting rows
|
|
294
|
+
that used to be a second `Studio v` dropdown further along the row.
|
|
295
|
+
Blender's own shading popover is where Lighting lives (Studio /
|
|
296
|
+
MatCap / Flat), so the two controls were always one control drawn
|
|
297
|
+
twice — measured in `modeling-edit-none.png`, its header's trailing
|
|
298
|
+
cluster is five icon groups and no words at all. */}
|
|
299
|
+
<ViewportDisplayModeMenu
|
|
300
|
+
mode={presentation.mode}
|
|
301
|
+
onChange={(mode) => session.setMode(mode)}
|
|
302
|
+
choices={modes}
|
|
303
|
+
segments={viewportShadingSegments}
|
|
304
|
+
>
|
|
305
|
+
{session.lightingAvailable() ? (
|
|
306
|
+
<>
|
|
307
|
+
<label>
|
|
308
|
+
<span>Lighting</span>
|
|
309
|
+
<Select
|
|
310
|
+
aria-label="Lighting preset"
|
|
311
|
+
value={presentation.lighting}
|
|
312
|
+
onChange={(event) =>
|
|
313
|
+
session.setLighting(event.target.value as 'studio' | 'outdoor' | 'flat')
|
|
314
|
+
}
|
|
315
|
+
>
|
|
316
|
+
<option value="studio">Studio</option>
|
|
317
|
+
<option value="outdoor">Outdoor</option>
|
|
318
|
+
<option value="flat">Flat</option>
|
|
319
|
+
</Select>
|
|
320
|
+
</label>
|
|
321
|
+
<label>
|
|
322
|
+
<span>Exposure</span>
|
|
323
|
+
<TextInput
|
|
324
|
+
aria-label="Preview exposure"
|
|
325
|
+
type="range"
|
|
326
|
+
min="0.2"
|
|
327
|
+
max="2"
|
|
328
|
+
step="0.1"
|
|
329
|
+
value={presentation.exposure}
|
|
330
|
+
onChange={(event) => session.setExposure(Number(event.target.value))}
|
|
331
|
+
/>
|
|
332
|
+
<Text as="span" variant="caption">
|
|
333
|
+
{presentation.exposure.toFixed(1)}
|
|
334
|
+
</Text>
|
|
335
|
+
</label>
|
|
336
|
+
</>
|
|
337
|
+
) : null}
|
|
338
|
+
</ViewportDisplayModeMenu>
|
|
339
|
+
{/* THE EYE WAS THE OVERLAYS CONTROL ALL ALONG — measured by what it
|
|
340
|
+
toggles, which is Grid and Bounds, exactly Blender's Show Overlays
|
|
341
|
+
subject. It takes Blender's mark. It does NOT take Blender's split
|
|
342
|
+
toggle+chevron: that toggle binds to a MASTER overlays flag this
|
|
343
|
+
document's session does not have, and deriving one from "any
|
|
344
|
+
overlay is on" would silently drop the per-overlay state on the
|
|
345
|
+
first click. One button, one job, until the session has the flag. */}
|
|
346
|
+
<ViewportOverlaysMenu
|
|
347
|
+
glyph={<ViewportOverlaysGlyph />}
|
|
348
|
+
choices={[
|
|
349
|
+
{
|
|
350
|
+
id: 'grid',
|
|
351
|
+
label: 'Grid',
|
|
352
|
+
enabled: presentation.grid,
|
|
353
|
+
onToggle: () => session.setGrid(!presentation.grid),
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
id: 'bounds',
|
|
357
|
+
label: 'Bounds',
|
|
358
|
+
enabled: presentation.bounds,
|
|
359
|
+
onToggle: () => session.setBounds(!presentation.bounds),
|
|
360
|
+
},
|
|
361
|
+
...(stage === null
|
|
362
|
+
? []
|
|
363
|
+
: DOCUMENT_HELPER_ROWS.filter((row) => helperKinds.includes(row.key)).map((row) => ({
|
|
364
|
+
id: row.key,
|
|
365
|
+
label: row.label,
|
|
366
|
+
enabled: stage.helperVisibility[row.key],
|
|
367
|
+
onToggle: () => stage.toggleHelperType(row.key),
|
|
368
|
+
}))),
|
|
369
|
+
]}
|
|
370
|
+
/>
|
|
371
|
+
<div className="vgai-viewport-popover-anchor">
|
|
372
|
+
<Tooltip text="Asset preview actions">
|
|
373
|
+
<IconButton
|
|
374
|
+
ref={moreRef}
|
|
375
|
+
aria-label="Asset preview actions"
|
|
376
|
+
aria-haspopup="menu"
|
|
377
|
+
aria-expanded={moreOpen}
|
|
378
|
+
onClick={() => setMoreOpen((open) => !open)}
|
|
379
|
+
>
|
|
380
|
+
<EditorIcon icon={faEllipsis} size="md" />
|
|
381
|
+
</IconButton>
|
|
382
|
+
</Tooltip>
|
|
383
|
+
{moreOpen && (
|
|
384
|
+
<AnchoredMenu
|
|
385
|
+
anchorRef={moreRef}
|
|
386
|
+
clamp
|
|
387
|
+
aria-label="Asset preview actions"
|
|
388
|
+
onDismiss={() => setMoreOpen(false)}
|
|
389
|
+
style={{ minWidth: 210 }}
|
|
390
|
+
>
|
|
391
|
+
<MenuItem
|
|
392
|
+
onSelect={() => {
|
|
393
|
+
setMoreOpen(false);
|
|
394
|
+
void capturePreview();
|
|
395
|
+
}}
|
|
396
|
+
>
|
|
397
|
+
<EditorIcon icon={faCamera} size="sm" />
|
|
398
|
+
Capture preview
|
|
399
|
+
</MenuItem>
|
|
400
|
+
{assetPath ? (
|
|
401
|
+
<>
|
|
402
|
+
<MenuItem
|
|
403
|
+
onSelect={() => {
|
|
404
|
+
setMoreOpen(false);
|
|
405
|
+
void saveThumbnailFraming(false);
|
|
406
|
+
}}
|
|
407
|
+
>
|
|
408
|
+
Save thumbnail framing
|
|
409
|
+
</MenuItem>
|
|
410
|
+
<MenuItem
|
|
411
|
+
onSelect={() => {
|
|
412
|
+
setMoreOpen(false);
|
|
413
|
+
void saveThumbnailFraming(true);
|
|
414
|
+
}}
|
|
415
|
+
>
|
|
416
|
+
Reset thumbnail framing
|
|
417
|
+
</MenuItem>
|
|
418
|
+
</>
|
|
419
|
+
) : null}
|
|
420
|
+
<MenuSeparator />
|
|
421
|
+
<MenuItem
|
|
422
|
+
onSelect={() => {
|
|
423
|
+
session.resetPresentation();
|
|
424
|
+
setMoreOpen(false);
|
|
425
|
+
}}
|
|
426
|
+
>
|
|
427
|
+
<EditorIcon icon={faRotateLeft} size="sm" />
|
|
428
|
+
Reset viewport settings
|
|
429
|
+
</MenuItem>
|
|
430
|
+
</AnchoredMenu>
|
|
431
|
+
)}
|
|
432
|
+
</div>
|
|
433
|
+
</EditorToolbar>
|
|
434
|
+
{capture ? (
|
|
435
|
+
<EditorPopover className="vgai-model-capture-preview">
|
|
436
|
+
<div>
|
|
437
|
+
<Text as="strong" variant="label">
|
|
438
|
+
Deterministic views
|
|
439
|
+
</Text>
|
|
440
|
+
<Button type="button" variant="ghost" onClick={() => setCapture(null)}>
|
|
441
|
+
Close
|
|
442
|
+
</Button>
|
|
443
|
+
</div>
|
|
444
|
+
<img src={capture} alt="Front, right, top, and three-quarter model preview" />
|
|
445
|
+
</EditorPopover>
|
|
446
|
+
) : null}
|
|
447
|
+
{error ? (
|
|
448
|
+
<EditorBanner className="vgai-model-toolbar-error" tone="error">
|
|
449
|
+
{error}
|
|
450
|
+
</EditorBanner>
|
|
451
|
+
) : null}
|
|
452
|
+
</div>
|
|
453
|
+
);
|
|
454
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lazy document boundary for the shared Object3D authoring surface.
|
|
3
|
+
*
|
|
4
|
+
* Registries and open-document planners need to be able to name this surface
|
|
5
|
+
* during editor boot, but the implementation carries Asset Lab's animation,
|
|
6
|
+
* capture, model-inspection, and source-authoring graph. Importing that graph
|
|
7
|
+
* merely to register unopened document kinds put it on Scene's cold path.
|
|
8
|
+
* Keep the public component shape here and evaluate the implementation only
|
|
9
|
+
* when React actually renders an Object3D document.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { lazy, Suspense, useEffect } from 'react';
|
|
13
|
+
import { announceObject3DDocumentStage } from '../authoring/object3d-document-session-registry';
|
|
14
|
+
import type { Object3DDocumentViewportProps } from './StageHost';
|
|
15
|
+
import { OBJECT3D_SURFACE_BUILDING, ViewportSurfaceStatus } from './viewport-surface-status';
|
|
16
|
+
|
|
17
|
+
const LazyObject3DDocumentViewport = lazy(async () => {
|
|
18
|
+
const module = await import('./StageHost');
|
|
19
|
+
return { default: module.Object3DDocumentViewport };
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
export function Object3DDocumentViewport(props: Object3DDocumentViewportProps) {
|
|
23
|
+
// ANNOUNCE BEFORE THE CHUNK RESOLVES. An opener's `ready` asks whether this
|
|
24
|
+
// document is mounting a stage at a moment when the implementation import is
|
|
25
|
+
// still in flight, and this boundary is the only thing rendered by then —
|
|
26
|
+
// announcing from inside `StageHost` would answer "no stage" for exactly the
|
|
27
|
+
// window the wait exists to cover.
|
|
28
|
+
useAnnouncedObject3DDocumentStage(props.documentId, props.chromeless);
|
|
29
|
+
return (
|
|
30
|
+
<Suspense
|
|
31
|
+
fallback={
|
|
32
|
+
<ViewportSurfaceStatus testId="object3d-document-loading">
|
|
33
|
+
{OBJECT3D_SURFACE_BUILDING}
|
|
34
|
+
</ViewportSurfaceStatus>
|
|
35
|
+
}
|
|
36
|
+
>
|
|
37
|
+
<LazyObject3DDocumentViewport {...props} />
|
|
38
|
+
</Suspense>
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The announcement, spelled here and again at `StageHost.tsx`'s own
|
|
44
|
+
* `Object3DDocumentViewport` — deliberately NOT a shared hook, because
|
|
45
|
+
* importing one across these two files is the static edge that would put this
|
|
46
|
+
* boundary inside the implementation's own pinned closure and defeat the
|
|
47
|
+
* laziness the boundary exists for.
|
|
48
|
+
*
|
|
49
|
+
* A CHROMELESS mount announces nothing, for the same reason it registers no
|
|
50
|
+
* session (`StageHost.tsx:2235`): it is a thumbnail of a document, several can
|
|
51
|
+
* be alive for one id at once, and an opener waiting on one would wait forever.
|
|
52
|
+
*/
|
|
53
|
+
function useAnnouncedObject3DDocumentStage(documentId: string, chromeless = false): void {
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
if (chromeless) return;
|
|
56
|
+
return announceObject3DDocumentStage(documentId);
|
|
57
|
+
}, [documentId, chromeless]);
|
|
58
|
+
}
|