@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,417 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The STANDARD VIEWPORT dressing — the ONE chrome-and-dressing definition every
|
|
3
|
+
* 3D document viewport inherits (owner-ratified contract). A document surface
|
|
4
|
+
* (`Object3DDocumentViewport` and everything mounted on it: the 3D board,
|
|
5
|
+
* story turntables, model/entity asset documents) gets the editor's standard
|
|
6
|
+
* look from this module instead of instantiating its own background/lighting:
|
|
7
|
+
*
|
|
8
|
+
* - `scene.environment` baked from three's own `RoomEnvironment` through
|
|
9
|
+
* `PMREMGenerator`, so PBR materials actually read;
|
|
10
|
+
* - a subtle dark vertical-gradient backdrop (never a flat hex);
|
|
11
|
+
* - one NEUTRAL directional key light for definition (it was warm; see the
|
|
12
|
+
* measurement where it is constructed);
|
|
13
|
+
* - an optional ground grid following the Scene viewport's grid conventions
|
|
14
|
+
* (1 m cells, `0x999999`, `EDITOR_LAYER` — see `editor-viewport.ts`),
|
|
15
|
+
* centred on the content and fading out with distance so it never
|
|
16
|
+
* degenerates into convergence-line artifacts at the horizon.
|
|
17
|
+
*
|
|
18
|
+
* Everything created here is EDITOR CHROME: marked per `editor-layers.ts`'s
|
|
19
|
+
* conventions (`userData.editorHelper`, and `EDITOR_LAYER` for the grid) so no
|
|
20
|
+
* hierarchy walk, pick, or export ever mistakes it for content — and it is
|
|
21
|
+
* never serialized, never touching project data (the anti-shim rule). It
|
|
22
|
+
* exists only inside the document viewport's scene at view time.
|
|
23
|
+
*
|
|
24
|
+
* Ownership: {@link applyStandardViewportDressing} owns every object and
|
|
25
|
+
* texture it creates, INCLUDING the {@link StandardEnvironment} handed to it
|
|
26
|
+
* (PMREM render targets leak if not disposed). Its returned `dispose` is the
|
|
27
|
+
* one teardown path; it is idempotent.
|
|
28
|
+
*
|
|
29
|
+
* The environment bake lives in `@volter/editor-threejs/viewport/environment`
|
|
30
|
+
* because it is the one GL-bound step — it needs a live `WebGLRenderer`,
|
|
31
|
+
* where the rest of the dressing is plain scene-graph work.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
import { contentWorldBounds } from '@volter/editor-threejs/viewport/content-bounds';
|
|
35
|
+
import { EDITOR_LAYER } from '@volter/editor-threejs/viewport/editor-layers';
|
|
36
|
+
import type { StandardEnvironment } from '@volter/editor-threejs/viewport/environment';
|
|
37
|
+
import { setUserData } from '@volter/editor-threejs/ecs/user-data';
|
|
38
|
+
import * as THREE from 'three';
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Front-right three-quarter view for project-owned R3F components. Their
|
|
42
|
+
* gameplay-forward convention is −Z, so the camera belongs on that side of
|
|
43
|
+
* the subject. The 3D board and an opened story must never show opposite
|
|
44
|
+
* faces of the same prefab.
|
|
45
|
+
*/
|
|
46
|
+
export const STANDARD_COMPONENT_CAMERA_DIRECTION = [0.8, 0.5, -1] as const;
|
|
47
|
+
|
|
48
|
+
/** The standard backdrop, dark at the ground line and lifting toward the top.
|
|
49
|
+
* These are the STUDIO tints; the painted stops blend them with the active
|
|
50
|
+
* palette (see {@link paletteBackdropStops}) so a document stage follows the
|
|
51
|
+
* editor's palette the way the Asset Lab's CSS studio stage does. */
|
|
52
|
+
const GRADIENT_BOTTOM = new THREE.Color(0x1e2530);
|
|
53
|
+
const GRADIENT_TOP = new THREE.Color(0x4c5b70);
|
|
54
|
+
|
|
55
|
+
export interface BackdropStops {
|
|
56
|
+
readonly bottom: THREE.Color;
|
|
57
|
+
readonly top: THREE.Color;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* The backdrop's stops for the ACTIVE PALETTE: the ground line is the
|
|
62
|
+
* palette's panel surface and the top is its raised surface, each blended
|
|
63
|
+
* with the studio tint and lifted for ACES. Measured under the Blender
|
|
64
|
+
* palette (panel #303030, raised #3d3d3d) the stage reads as Blender's grey
|
|
65
|
+
* ground instead of a black void; under Classic Graphite it stays within a
|
|
66
|
+
* few steps of the studio constants. Falls back to the studio constants
|
|
67
|
+
* where no palette is installed (a bounded host, headless).
|
|
68
|
+
*/
|
|
69
|
+
export function paletteBackdropStops(): BackdropStops {
|
|
70
|
+
const root =
|
|
71
|
+
typeof document === 'undefined' ? null : document.querySelector('[data-vgai-palette]');
|
|
72
|
+
if (!root) return { bottom: GRADIENT_BOTTOM.clone(), top: GRADIENT_TOP.clone() };
|
|
73
|
+
const style = getComputedStyle(root);
|
|
74
|
+
const canvas = document.createElement('canvas');
|
|
75
|
+
canvas.width = canvas.height = 1;
|
|
76
|
+
const context = canvas.getContext('2d');
|
|
77
|
+
const read = (name: string, fallback: THREE.Color): THREE.Color => {
|
|
78
|
+
const value = style.getPropertyValue(name).trim();
|
|
79
|
+
if (!context || !value || !CSS.supports('color', value)) return fallback.clone();
|
|
80
|
+
// Palette surfaces may be translucent (Glass). Let the browser composite
|
|
81
|
+
// their CSS colors over the shell; Three.Color has no alpha channel.
|
|
82
|
+
context.fillStyle = fallback.getStyle();
|
|
83
|
+
context.fillRect(0, 0, 1, 1);
|
|
84
|
+
context.fillStyle = style.getPropertyValue('--vgai-surface-shell').trim();
|
|
85
|
+
context.fillRect(0, 0, 1, 1);
|
|
86
|
+
context.fillStyle = value;
|
|
87
|
+
context.fillRect(0, 0, 1, 1);
|
|
88
|
+
const [r, g, b] = context.getImageData(0, 0, 1, 1).data;
|
|
89
|
+
return new THREE.Color().setRGB(r! / 255, g! / 255, b! / 255, THREE.SRGBColorSpace);
|
|
90
|
+
};
|
|
91
|
+
const panel = read('--vgai-surface-panel', GRADIENT_BOTTOM);
|
|
92
|
+
const raised = read('--vgai-surface-raised', GRADIENT_TOP);
|
|
93
|
+
// A background texture is not tone-mapped, so what is authored here is
|
|
94
|
+
// what the screen shows. The small lift keeps the ground a step above the
|
|
95
|
+
// panel it sits beside (Blender's viewport is lighter than its editors).
|
|
96
|
+
// Measured on screen under the Blender palette: ground #40, top #50, beside
|
|
97
|
+
// Blender's own #3f–#4e.
|
|
98
|
+
const bottom = panel.lerp(GRADIENT_BOTTOM, 0.25).lerp(new THREE.Color(0xffffff), 0.03);
|
|
99
|
+
const top = raised.lerp(GRADIENT_TOP, 0.25).lerp(new THREE.Color(0xffffff), 0.04);
|
|
100
|
+
return { bottom, top };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Fires when the palette the backdrop follows changes. The theme installer
|
|
105
|
+
* stamps its root with `data-vgai-palette` / `data-vgai-material` on every
|
|
106
|
+
* switch, so the DOM is the contract here — a document stage never imports
|
|
107
|
+
* the shell's preference store (its closure is pinned,
|
|
108
|
+
* `scripts/validate-editor-closure.mjs`). Returns the unsubscribe.
|
|
109
|
+
*/
|
|
110
|
+
export function watchPaletteBackdrop(onChange: () => void): () => void {
|
|
111
|
+
if (typeof document === 'undefined' || typeof MutationObserver === 'undefined') return () => {};
|
|
112
|
+
const root = document.querySelector('[data-vgai-palette]');
|
|
113
|
+
if (!root) return () => {};
|
|
114
|
+
const observer = new MutationObserver(onChange);
|
|
115
|
+
observer.observe(root, {
|
|
116
|
+
attributes: true,
|
|
117
|
+
attributeFilter: ['data-vgai-palette', 'data-vgai-material'],
|
|
118
|
+
});
|
|
119
|
+
return () => observer.disconnect();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** One 1×N vertical-gradient strip; the renderer stretches it full-frame. */
|
|
123
|
+
export function createGradientBackgroundTexture(
|
|
124
|
+
stops: BackdropStops = paletteBackdropStops(),
|
|
125
|
+
): THREE.DataTexture {
|
|
126
|
+
const height = 128;
|
|
127
|
+
const data = new Uint8Array(height * 4);
|
|
128
|
+
const color = new THREE.Color();
|
|
129
|
+
for (let row = 0; row < height; row++) {
|
|
130
|
+
// Row 0 is the BOTTOM of the texture, so the gradient runs ground → sky.
|
|
131
|
+
// `Color` holds LINEAR components under colour management while the
|
|
132
|
+
// texture below is declared sRGB, so the bytes are encoded on the way
|
|
133
|
+
// out — written raw, every stop rendered several steps darker than
|
|
134
|
+
// authored (measured: the stage read #050506 for a #1e2530 stop).
|
|
135
|
+
color
|
|
136
|
+
.copy(stops.bottom)
|
|
137
|
+
.lerp(stops.top, row / (height - 1))
|
|
138
|
+
.convertLinearToSRGB();
|
|
139
|
+
data[row * 4] = Math.round(color.r * 255);
|
|
140
|
+
data[row * 4 + 1] = Math.round(color.g * 255);
|
|
141
|
+
data[row * 4 + 2] = Math.round(color.b * 255);
|
|
142
|
+
data[row * 4 + 3] = 255;
|
|
143
|
+
}
|
|
144
|
+
const texture = new THREE.DataTexture(data, 1, height, THREE.RGBAFormat);
|
|
145
|
+
texture.colorSpace = THREE.SRGBColorSpace;
|
|
146
|
+
texture.magFilter = THREE.LinearFilter;
|
|
147
|
+
texture.minFilter = THREE.LinearFilter;
|
|
148
|
+
texture.needsUpdate = true;
|
|
149
|
+
return texture;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Grid frame for this scene's content: the Scene viewport's 50 m floor grown
|
|
154
|
+
* in 10 m steps so a large layout (the 3D board's districts) never hangs past
|
|
155
|
+
* its own ground reference — and CENTRED on the content's ground footprint, so
|
|
156
|
+
* an off-origin layout (the board grows into one quadrant) still sits inside
|
|
157
|
+
* the grid's crisp middle rather than out on its fading rim.
|
|
158
|
+
*/
|
|
159
|
+
function gridFrameForScene(scene: THREE.Object3D): { size: number; centre: [number, number] } {
|
|
160
|
+
const bounds = contentWorldBounds(scene);
|
|
161
|
+
if (bounds.isEmpty()) return { size: 50, centre: [0, 0] };
|
|
162
|
+
const extent = Math.max(bounds.max.x - bounds.min.x, bounds.max.z - bounds.min.z);
|
|
163
|
+
return {
|
|
164
|
+
size: Math.min(Math.max(Math.ceil(extent / 10) * 10 + 20, 50), 1000),
|
|
165
|
+
centre: [(bounds.min.x + bounds.max.x) / 2, (bounds.min.z + bounds.max.z) / 2],
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** The Scene grid's 1 m cells, coarsening in 1/2/5/10 m steps once the extent
|
|
170
|
+
* would put more than ~60 lines on screen — denser reads as moiré noise, not
|
|
171
|
+
* as a ground reference. */
|
|
172
|
+
function gridDivisions(size: number): number {
|
|
173
|
+
for (const cell of [1, 2, 5, 10]) {
|
|
174
|
+
if (size / cell <= 60) return Math.round(size / cell);
|
|
175
|
+
}
|
|
176
|
+
return Math.round(size / 10);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Fade the grid out with DISTANCE, in the grid's own shader.
|
|
181
|
+
*
|
|
182
|
+
* A finite grid drawn hard to its edge degenerates at grazing angles: the far
|
|
183
|
+
* lines compress toward the horizon into harsh convergence/moiré artifacts,
|
|
184
|
+
* and the grid ends on an abrupt square rim. Multiplying the fragment alpha by
|
|
185
|
+
* a smoothstep over the fragment's radial distance from the grid's centre
|
|
186
|
+
* dissolves both — near cells stay a crisp ground reference, the outer band
|
|
187
|
+
* (which is exactly what sits at the horizon in a low shot) melts into the
|
|
188
|
+
* backdrop before it can alias. The fade is anchored to the grid's OWN extent
|
|
189
|
+
* rather than to the camera, so no zoom level ever dissolves the whole
|
|
190
|
+
* reference; the band scales with `gridFrameForScene`, which already tracks
|
|
191
|
+
* the content. Injection at `color_fragment` is where `LineBasicMaterial` has
|
|
192
|
+
* `diffuseColor` in scope.
|
|
193
|
+
*
|
|
194
|
+
* Exported because the dressing OWNS the grid treatment: `editor-viewport.ts`
|
|
195
|
+
* applies the same fade to its own editing grid, so no viewport anywhere ends
|
|
196
|
+
* a grid on a hard aliasing rim.
|
|
197
|
+
*/
|
|
198
|
+
export function applyGridDistanceFade(material: THREE.Material, gridSize: number): void {
|
|
199
|
+
// The band ends at the grid's own extent: it exists so the floor never ends
|
|
200
|
+
// on a hard rim, not to shrink the floor. The old 0.18/0.42 band was tuned
|
|
201
|
+
// for a camera standing close — a document that opens further back (the
|
|
202
|
+
// Model document's `openingFit`) photographed a floor with NO visible grid
|
|
203
|
+
// at all, measured against Blender's uniform lattice.
|
|
204
|
+
//
|
|
205
|
+
// `gridSize` is `GridHelper`'s size, which is the grid's DIAMETER — it spans
|
|
206
|
+
// ±size/2 — while the shader below compares against a RADIUS
|
|
207
|
+
// (`length(vGridPlanePosition)`). Comparing the two directly put the whole
|
|
208
|
+
// band outside the geometry: on a 400 m grid the fade started at 220 m when
|
|
209
|
+
// the farthest point along either axis is 200 m, so alpha never left 1.0 and
|
|
210
|
+
// the floor ended on exactly the hard rim this function exists to prevent
|
|
211
|
+
// (measured against Blender: our horizon stepped from #3f3f3f to #4f4f4f in
|
|
212
|
+
// four scanlines across the full stage width, Blender's held #3f3f3f-#41
|
|
213
|
+
// throughout). The band is a fraction of the RADIUS, so it reaches zero at
|
|
214
|
+
// the grid's edge, where the fade belongs.
|
|
215
|
+
const gridRadius = gridSize / 2;
|
|
216
|
+
const fadeStart = gridRadius * 0.55;
|
|
217
|
+
const fadeEnd = gridRadius;
|
|
218
|
+
material.onBeforeCompile = (shader) => {
|
|
219
|
+
shader.uniforms['uGridFadeStart'] = { value: fadeStart };
|
|
220
|
+
shader.uniforms['uGridFadeEnd'] = { value: fadeEnd };
|
|
221
|
+
shader.vertexShader = shader.vertexShader
|
|
222
|
+
.replace('#include <common>', '#include <common>\nvarying vec2 vGridPlanePosition;')
|
|
223
|
+
.replace(
|
|
224
|
+
'#include <begin_vertex>',
|
|
225
|
+
'#include <begin_vertex>\nvGridPlanePosition = position.xz;',
|
|
226
|
+
);
|
|
227
|
+
shader.fragmentShader = shader.fragmentShader
|
|
228
|
+
.replace(
|
|
229
|
+
'#include <common>',
|
|
230
|
+
'#include <common>\nvarying vec2 vGridPlanePosition;\nuniform float uGridFadeStart;\nuniform float uGridFadeEnd;',
|
|
231
|
+
)
|
|
232
|
+
.replace(
|
|
233
|
+
'#include <color_fragment>',
|
|
234
|
+
'#include <color_fragment>\ndiffuseColor.a *= 1.0 - smoothstep(uGridFadeStart, uGridFadeEnd, length(vGridPlanePosition));',
|
|
235
|
+
);
|
|
236
|
+
};
|
|
237
|
+
// Distinct fade bands must not share one cached program.
|
|
238
|
+
material.customProgramCacheKey = () => `vgai-grid-fade:${fadeStart}:${fadeEnd}`;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
export interface StandardViewportDressingOptions {
|
|
242
|
+
/**
|
|
243
|
+
* The baked IBL from `@volter/editor-threejs/viewport/environment`; `null` opts the
|
|
244
|
+
* scene out of an environment entirely. Ownership transfers here.
|
|
245
|
+
*/
|
|
246
|
+
readonly environment: StandardEnvironment | null;
|
|
247
|
+
/** Apply the vertical-gradient backdrop. Default `true`; a host whose
|
|
248
|
+
* backdrop lives elsewhere (the Asset Lab's alpha-canvas studio stage, an
|
|
249
|
+
* explicit SDK-contributed background) opts out. */
|
|
250
|
+
readonly background?: boolean;
|
|
251
|
+
/** Add the warm directional key light. Default `true`; a source that
|
|
252
|
+
* authors its own lights opts out — authored lighting always wins. */
|
|
253
|
+
readonly keyLight?: boolean;
|
|
254
|
+
/** Add the ground grid (content standing on y=0 by design). Default `false`. */
|
|
255
|
+
readonly grid?: boolean;
|
|
256
|
+
readonly content?: THREE.Object3D;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export interface StandardViewportDressing {
|
|
260
|
+
/** The gradient applied to `scene.background`, or `null` when opted out —
|
|
261
|
+
* hosts hand it on (e.g. as a document session's neutral background). */
|
|
262
|
+
readonly backgroundTexture: THREE.Texture | null;
|
|
263
|
+
/** The dressing's lights, for hosts whose lighting presets retune them. */
|
|
264
|
+
readonly lights: readonly THREE.Light[];
|
|
265
|
+
frameContent(content: THREE.Object3D): void;
|
|
266
|
+
/** The ONE teardown path for everything this dressing created. Idempotent. */
|
|
267
|
+
dispose(): void;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* The room bake's strength on a document stage. NOT the asset-preview lane's
|
|
272
|
+
* `STUDIO_ENVIRONMENT_INTENSITY` (0.45): that lane has no key light, this rig
|
|
273
|
+
* does, and the two are fitted together — with the mesh package's
|
|
274
|
+
* `STUDIO_GREY`, which is the other half of this number.
|
|
275
|
+
*
|
|
276
|
+
* THE FRAME AND THE COORDINATES, so every round compares. Reference:
|
|
277
|
+
* Blender's object-mode cube, `modeling-object-none.png` at its native 2x —
|
|
278
|
+
* front face 111, left 130, top 141, spread 30, read identically at 2x and
|
|
279
|
+
* downscaled to our 1728-wide frame. Ours: a fresh `--template models`
|
|
280
|
+
* scaffold, the Model document on its own default camera, `vgai screenshot
|
|
281
|
+
* editor` at 1x (1728x941), 11x11 medians at (735,505) front, (665,500) left,
|
|
282
|
+
* (710,440) top.
|
|
283
|
+
*
|
|
284
|
+
* THE ROUNDS (albedo, strength -> front/left/top):
|
|
285
|
+
* #545454, 1.00 -> 108/130/159 reproduces the earlier round exactly
|
|
286
|
+
* #545454, 0.60 -> 90/100/135
|
|
287
|
+
* #545454, 0.30 -> 73/ 69/111 what shipped before this — see below
|
|
288
|
+
* #4f4f4f, 1.04 -> 103/125/154 the min-max alternative; duller by eye
|
|
289
|
+
* #5a5a5a, 0.85 -> 110/128/159 LANDED
|
|
290
|
+
*
|
|
291
|
+
* WHY 0.30 WAS WRONG: at that strength the cube is not uniformly dark. The
|
|
292
|
+
* left face collapses BELOW the front one (69 against 73), inverting
|
|
293
|
+
* Blender's own order — the left face is almost pure IBL, the front face
|
|
294
|
+
* mostly key — so the narrow spread it bought was the two side faces meeting
|
|
295
|
+
* in the dark, not Blender's shape.
|
|
296
|
+
*
|
|
297
|
+
* WHY THE TOP FACE STAYS ~18 HOT, and why no value here fixes it. This
|
|
298
|
+
* subject has exactly TWO lighting bases, the directional key and the room
|
|
299
|
+
* bake, so face radiance is p*K + q*E; the albedo, the key's intensity and
|
|
300
|
+
* this strength only move p and q (the albedo scales both, adding no third
|
|
301
|
+
* degree of freedom). Split from the rounds above, in scene-linear through
|
|
302
|
+
* ACES: K = 0.044 / 0.020 / 0.070 and E = 0.069 / 0.134 / 0.161
|
|
303
|
+
* (front/left/top). The model predicted 89/100/136 at strength 0.6 against
|
|
304
|
+
* 90/100/135 measured, so it holds — and it says Blender's three faces need a
|
|
305
|
+
* NEGATIVE p or q. Solving front+left exactly leaves the top at 161; the best
|
|
306
|
+
* min-max anywhere in the family is 101/123/151, ten off on all three and
|
|
307
|
+
* still 50 of spread. The residual is the RoomEnvironment's
|
|
308
|
+
* ceiling-to-floor gradient against Blender's camera-following studio light:
|
|
309
|
+
* closing it needs a different environment or a key from the camera's side,
|
|
310
|
+
* not a different number here. So this is fitted on the two faces that ARE
|
|
311
|
+
* reachable, which carry 74% of the cube's pixels (front 54%, left 20%,
|
|
312
|
+
* top 26%).
|
|
313
|
+
*
|
|
314
|
+
* The host applies this to the CONTENT scene it creates (`StageHost.tsx`),
|
|
315
|
+
* the one place the per-draw mirror cannot overwrite it.
|
|
316
|
+
*/
|
|
317
|
+
export const STANDARD_ENVIRONMENT_INTENSITY = 0.85;
|
|
318
|
+
|
|
319
|
+
/** Apply the standard dressing to one document viewport scene. */
|
|
320
|
+
export function applyStandardViewportDressing(
|
|
321
|
+
scene: THREE.Scene,
|
|
322
|
+
options: StandardViewportDressingOptions,
|
|
323
|
+
): StandardViewportDressing {
|
|
324
|
+
const { environment, background = true, keyLight = true, grid = false } = options;
|
|
325
|
+
const chrome: THREE.Object3D[] = [];
|
|
326
|
+
const lights: THREE.Light[] = [];
|
|
327
|
+
let backgroundTexture: THREE.DataTexture | null = null;
|
|
328
|
+
|
|
329
|
+
if (environment) scene.environment = environment.texture;
|
|
330
|
+
|
|
331
|
+
if (background) {
|
|
332
|
+
backgroundTexture = createGradientBackgroundTexture();
|
|
333
|
+
scene.background = backgroundTexture;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
if (keyLight) {
|
|
337
|
+
// NEUTRAL, not warm. It was `0xfff3dd` — (255,243,221), a 15% warm bias —
|
|
338
|
+
// and that is what made every document's subject read warm against the
|
|
339
|
+
// reference: measured live on the Model document's cube, our three faces
|
|
340
|
+
// came out (124,123,120), (145,145,145), (172,171,169) — R−B of +4/0/+3 —
|
|
341
|
+
// where Blender's object-mode cube (`modeling-object-none.png` at 2x) is
|
|
342
|
+
// (111,112,113), (129,131,131), (141,143,145), COOL by 2 to 4. White key,
|
|
343
|
+
// and every face measures R−B of 0. The INTENSITY is unchanged: measured
|
|
344
|
+
// across four rounds, halving and thirding it moved the faces 6–8 levels
|
|
345
|
+
// and barely touched the spread between them, so it is not what this
|
|
346
|
+
// difference was made of and every other document surface keeps its
|
|
347
|
+
// definition.
|
|
348
|
+
const key = new THREE.DirectionalLight(0xffffff, 1.9);
|
|
349
|
+
key.name = 'vgai:standard-dressing-key';
|
|
350
|
+
key.position.set(6, 10, -4);
|
|
351
|
+
key.castShadow = true;
|
|
352
|
+
// `userData.editorHelper` keeps it out of hierarchy walks and picks;
|
|
353
|
+
// layers stay default so it lights layer-0 content under any camera.
|
|
354
|
+
setUserData(key, 'editorHelper', true);
|
|
355
|
+
scene.add(key);
|
|
356
|
+
chrome.push(key);
|
|
357
|
+
lights.push(key);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
let gridHelper: THREE.GridHelper | null = null;
|
|
361
|
+
let gridFrame = '';
|
|
362
|
+
const frameContent = (content: THREE.Object3D) => {
|
|
363
|
+
if (!grid) return;
|
|
364
|
+
const { size, centre } = gridFrameForScene(content);
|
|
365
|
+
const frame = `${size}:${centre.join(':')}`;
|
|
366
|
+
if (frame === gridFrame) return;
|
|
367
|
+
gridFrame = frame;
|
|
368
|
+
if (gridHelper) {
|
|
369
|
+
gridHelper.removeFromParent();
|
|
370
|
+
gridHelper.dispose();
|
|
371
|
+
chrome.splice(chrome.indexOf(gridHelper), 1);
|
|
372
|
+
}
|
|
373
|
+
// The Scene viewport's grid color (`editor-viewport.ts`), softened with
|
|
374
|
+
// transparency so it reads as a ground reference under the gradient
|
|
375
|
+
// rather than competing with the content.
|
|
376
|
+
const helper = new THREE.GridHelper(size, gridDivisions(size), 0x999999, 0x999999);
|
|
377
|
+
gridHelper = helper;
|
|
378
|
+
const gridMaterial = helper.material as THREE.Material;
|
|
379
|
+
gridMaterial.transparent = true;
|
|
380
|
+
gridMaterial.opacity = 0.35;
|
|
381
|
+
gridMaterial.depthWrite = false;
|
|
382
|
+
applyGridDistanceFade(gridMaterial, size);
|
|
383
|
+
helper.name = 'vgai:standard-dressing-grid';
|
|
384
|
+
// Just below the ground line so content standing exactly on y=0 never
|
|
385
|
+
// z-fights the grid lines; centred on the content's own footprint.
|
|
386
|
+
helper.position.set(centre[0], -0.02, centre[1]);
|
|
387
|
+
helper.layers.set(EDITOR_LAYER);
|
|
388
|
+
setUserData(helper, 'editorHelper', true);
|
|
389
|
+
scene.add(helper);
|
|
390
|
+
chrome.push(helper);
|
|
391
|
+
};
|
|
392
|
+
frameContent(options.content ?? scene);
|
|
393
|
+
|
|
394
|
+
let disposed = false;
|
|
395
|
+
return {
|
|
396
|
+
backgroundTexture,
|
|
397
|
+
lights,
|
|
398
|
+
frameContent,
|
|
399
|
+
dispose(): void {
|
|
400
|
+
if (disposed) return;
|
|
401
|
+
disposed = true;
|
|
402
|
+
for (const object of chrome) {
|
|
403
|
+
object.removeFromParent();
|
|
404
|
+
// GridHelper frees its geometry+material; Light frees its shadow map.
|
|
405
|
+
(object as { dispose?: () => void }).dispose?.();
|
|
406
|
+
}
|
|
407
|
+
if (environment) {
|
|
408
|
+
if (scene.environment === environment.texture) scene.environment = null;
|
|
409
|
+
environment.dispose();
|
|
410
|
+
}
|
|
411
|
+
if (backgroundTexture) {
|
|
412
|
+
if (scene.background === backgroundTexture) scene.background = null;
|
|
413
|
+
backgroundTexture.dispose();
|
|
414
|
+
}
|
|
415
|
+
},
|
|
416
|
+
};
|
|
417
|
+
}
|