@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,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project-scoped hierarchy expansion preferences.
|
|
3
|
+
*
|
|
4
|
+
* Expansion belongs to an authored node's stable adapter id, not to its
|
|
5
|
+
* current row index. That lets the same preference survive an edit/live
|
|
6
|
+
* adapter replacement (Play/Stop) and ordinary React remounts. The project
|
|
7
|
+
* scope prevents common ids such as `game` or `root` leaking between games.
|
|
8
|
+
*
|
|
9
|
+
* Only explicit user choices are stored. A node with no entry follows the
|
|
10
|
+
* hierarchy's current shallow-open default, so changing the projection does
|
|
11
|
+
* not require a migration of a fully materialized tree state.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/** The section of the project-local document this module owns. */
|
|
15
|
+
const SECTION = 'hierarchyExpansion';
|
|
16
|
+
|
|
17
|
+
import {
|
|
18
|
+
projectLocalSection,
|
|
19
|
+
projectLocalStateReady,
|
|
20
|
+
writeProjectLocalSection,
|
|
21
|
+
} from './project-local-state';
|
|
22
|
+
|
|
23
|
+
type ProjectPreferences = Map<string, boolean>;
|
|
24
|
+
|
|
25
|
+
const preferences = new Map<string, ProjectPreferences>();
|
|
26
|
+
let hydrated = false;
|
|
27
|
+
|
|
28
|
+
function hydrate(): void {
|
|
29
|
+
if (hydrated) return;
|
|
30
|
+
if (!projectLocalStateReady()) return;
|
|
31
|
+
hydrated = true;
|
|
32
|
+
const parsed = projectLocalSection<Record<string, Record<string, boolean>>>(SECTION) ?? {};
|
|
33
|
+
for (const [projectId, nodes] of Object.entries(parsed)) {
|
|
34
|
+
preferences.set(projectId, new Map(Object.entries(nodes)));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function persist(): void {
|
|
39
|
+
const serialized: Record<string, Record<string, boolean>> = {};
|
|
40
|
+
for (const [projectId, nodes] of preferences) {
|
|
41
|
+
serialized[projectId] = Object.fromEntries(nodes);
|
|
42
|
+
}
|
|
43
|
+
writeProjectLocalSection(SECTION, serialized);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function hierarchyExpansionPreference(
|
|
47
|
+
projectId: string,
|
|
48
|
+
nodeId: string,
|
|
49
|
+
): boolean | undefined {
|
|
50
|
+
hydrate();
|
|
51
|
+
return preferences.get(projectId)?.get(nodeId);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Apply a whole branch/view operation with one storage write. */
|
|
55
|
+
export function setHierarchyExpansionPreferences(
|
|
56
|
+
projectId: string,
|
|
57
|
+
entries: Iterable<readonly [nodeId: string, expanded: boolean]>,
|
|
58
|
+
): void {
|
|
59
|
+
hydrate();
|
|
60
|
+
let project = preferences.get(projectId);
|
|
61
|
+
if (!project) {
|
|
62
|
+
project = new Map();
|
|
63
|
+
preferences.set(projectId, project);
|
|
64
|
+
}
|
|
65
|
+
for (const [nodeId, expanded] of entries) project.set(nodeId, expanded);
|
|
66
|
+
persist();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Return every node in one project to the shallow first-open policy. */
|
|
70
|
+
export function clearHierarchyExpansionPreferences(projectId: string): void {
|
|
71
|
+
hydrate();
|
|
72
|
+
preferences.delete(projectId);
|
|
73
|
+
persist();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Test-only reset for this process (the in-memory map; the document is untouched). */
|
|
77
|
+
export function _resetHierarchyExpansionPreferencesForTest(): void {
|
|
78
|
+
preferences.clear();
|
|
79
|
+
hydrated = true;
|
|
80
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Hierarchy panel's controls do not belong to a row of their own.
|
|
3
|
+
*
|
|
4
|
+
* Blender's Outliner header is ONE row: the editor-type selector, the
|
|
5
|
+
* display-mode selector, the search field, the filter popover and the
|
|
6
|
+
* new-collection button all sit on the same strip, and the tree starts
|
|
7
|
+
* directly under it. Ours had grown three rows — the dock group's tab strip
|
|
8
|
+
* (Content · Hierarchy · Library, which IS Blender's editor-type selector),
|
|
9
|
+
* a provenance breadcrumb, and a search row — for one panel's header.
|
|
10
|
+
*
|
|
11
|
+
* The tab strip is the row that stays, so the controls move ONTO it: this
|
|
12
|
+
* module is the seam. The dock's `rightHeaderActionsComponent` publishes the
|
|
13
|
+
* element it renders for the group whose ACTIVE panel is the Hierarchy
|
|
14
|
+
* (`frame/bridge.tsx`'s outliner part), and `components/GameHierarchy.tsx`
|
|
15
|
+
* portals its controls into it.
|
|
16
|
+
*
|
|
17
|
+
* It is a SLOT, not a control registry: the panel keeps owning its search
|
|
18
|
+
* term, its expansion verbs and its Create menu, and nothing about them is
|
|
19
|
+
* republished through module state. A host that renders the panel without a
|
|
20
|
+
* dock — the design-system stories, a bounded host — publishes no element,
|
|
21
|
+
* and the panel falls back to rendering its own toolbar row inline. That
|
|
22
|
+
* fallback is the reason this is a DOM slot and not a props channel: there is
|
|
23
|
+
* exactly one implementation of the controls either way.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
let slot: HTMLElement | null = null;
|
|
27
|
+
const listeners = new Set<() => void>();
|
|
28
|
+
|
|
29
|
+
export function hierarchyHeaderSlot(): HTMLElement | null {
|
|
30
|
+
return slot;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function subscribeHierarchyHeaderSlot(listener: () => void): () => void {
|
|
34
|
+
listeners.add(listener);
|
|
35
|
+
return () => {
|
|
36
|
+
listeners.delete(listener);
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function setHierarchyHeaderSlot(element: HTMLElement | null): void {
|
|
41
|
+
if (slot === element) return;
|
|
42
|
+
slot = element;
|
|
43
|
+
for (const listener of listeners) listener();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Clear only if THIS element is still the published one — a dock group that
|
|
47
|
+
* unmounts after its successor has already claimed the slot would otherwise
|
|
48
|
+
* blank a live header. */
|
|
49
|
+
export function clearHierarchyHeaderSlot(element: HTMLElement | null): void {
|
|
50
|
+
if (slot !== element) return;
|
|
51
|
+
setHierarchyHeaderSlot(null);
|
|
52
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "reveal internals, read-only". Godot's Editable Children, minus the editing.
|
|
3
|
+
*
|
|
4
|
+
* WHAT THIS IS. `R3fSourceAuthoringAdapter.projectedChildren` surfaces only
|
|
5
|
+
* CROSS-BOUNDARY children: an instance's own host nodes and its unstamped model
|
|
6
|
+
* internals (bones, GLTF meshes) are "traversed but not surfaced", so an
|
|
7
|
+
* `<Enemy>` reads as a leaf even though it rendered a 60-bone rig. Everything
|
|
8
|
+
* needed to show that rig already exists — `indexGraph` mints a path-keyed id
|
|
9
|
+
* for every non-helper object and `hierarchy.node(id)` describes it — so this
|
|
10
|
+
* module adds no identity machinery. It adds a VIEW: a decorator over the
|
|
11
|
+
* adapter's `HierarchyProvider` that appends the hidden children of the ids the
|
|
12
|
+
* author revealed, and answers which ids it minted rows for.
|
|
13
|
+
*
|
|
14
|
+
* WHY A DECORATOR AND NOT A NEW FLATTENER. `flattenHierarchyRows` walks
|
|
15
|
+
* `roots()`/`node(id).childIds`; virtualization, the child cap, collapse,
|
|
16
|
+
* selection-reveal and the search filter are all layered on TOP of that one
|
|
17
|
+
* walk. Injecting internals INTO the provider means every one of those keeps
|
|
18
|
+
* working untouched — a revealed skeleton is windowed, capped and collapsed by
|
|
19
|
+
* the same code as everything else, and no second row pipeline exists to drift.
|
|
20
|
+
*
|
|
21
|
+
* WHY THE STATE IS SESSION-ONLY. Reveal is deliberately NOT written to
|
|
22
|
+
* `hierarchy-expansion-state.ts` (which persists per project in localStorage):
|
|
23
|
+
* a skeleton that reappears on every project open is noise in the panel the
|
|
24
|
+
* author needs most, and unlike a normal fold it is not a statement about the
|
|
25
|
+
* authored tree at all — it is a temporary "let me look inside this". It lives
|
|
26
|
+
* in a module-level Set for the life of the tab, cleared on project switch by
|
|
27
|
+
* nothing at all, because ids are project-scoped (`r3f:<worldId>:<oid>`) and a
|
|
28
|
+
* stale id simply never matches.
|
|
29
|
+
*
|
|
30
|
+
* READ-ONLY IS ENFORCED ELSEWHERE, ON PURPOSE: this module only says WHICH rows
|
|
31
|
+
* are internal; `hierarchy-row-model.ts`'s `rowAffordances` is the single
|
|
32
|
+
* predicate that turns that into "no drag, no rename, no write, no search".
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
import type { EditorNode, HierarchyProvider } from '@volter/editor-project/adapter';
|
|
36
|
+
|
|
37
|
+
/** The (optional, structural) adapter capability H6 needs — the same
|
|
38
|
+
* contract-free probe shape H3's `InstanceSourceLocator` and H5's
|
|
39
|
+
* `RowDiagnosticsSource` use, so no adapter is forced to implement it and no
|
|
40
|
+
* editor module imports an R3F type to read it. */
|
|
41
|
+
export interface InternalsSource {
|
|
42
|
+
readonly hierarchy: Pick<HierarchyProvider, 'roots' | 'node'>;
|
|
43
|
+
/** Cheap "would revealing this row show anything?" — used to decide whether
|
|
44
|
+
* the menu item appears at all. */
|
|
45
|
+
readonly hasInternals?: ((id: string) => boolean) | undefined;
|
|
46
|
+
/** The RAW live children of `id` that the adapter's own projection hides,
|
|
47
|
+
* each described exactly as `hierarchy.node` would describe it, but
|
|
48
|
+
* re-parented to its RAW parent so a revealed subtree reads as the tree it
|
|
49
|
+
* actually is. `undefined` for an id the adapter does not own. */
|
|
50
|
+
readonly internalChildren?: ((id: string) => EditorNode[] | undefined) | undefined;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface InternalsProjection {
|
|
54
|
+
/** The provider to flatten. Identity-equal to the source's own when nothing
|
|
55
|
+
* is revealed, so the common case costs nothing. */
|
|
56
|
+
readonly hierarchy: Pick<HierarchyProvider, 'roots' | 'node'>;
|
|
57
|
+
/** True for a row that exists ONLY because of a reveal. */
|
|
58
|
+
isInternal(id: string): boolean;
|
|
59
|
+
/** The revealed ids that actually produced rows (a revealed id whose object
|
|
60
|
+
* is gone after an HMR remount is silently inert, not an error). */
|
|
61
|
+
readonly revealRootIds: ReadonlySet<string>;
|
|
62
|
+
/** Every id this projection minted a row for, transitively. */
|
|
63
|
+
readonly internalIds: ReadonlySet<string>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Depth backstop for a pathological live tree — the same belt-and-braces
|
|
67
|
+
* constant `hierarchy-node-rows.ts` keeps for the same reason. */
|
|
68
|
+
const MAX_DEPTH = 500;
|
|
69
|
+
|
|
70
|
+
const EMPTY: ReadonlySet<string> = new Set();
|
|
71
|
+
|
|
72
|
+
// ------------------------------------------------------------ session state
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Ids whose internals are currently revealed. Module-level and NOT persisted —
|
|
76
|
+
* see this file's header for why a revealed skeleton must not survive a reload.
|
|
77
|
+
*/
|
|
78
|
+
const revealed = new Set<string>();
|
|
79
|
+
|
|
80
|
+
export function isInternalsRevealed(id: string): boolean {
|
|
81
|
+
return revealed.has(id);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Returns the new state, so a caller can report what it did. */
|
|
85
|
+
export function toggleInternalsRevealed(id: string): boolean {
|
|
86
|
+
if (revealed.delete(id)) return false;
|
|
87
|
+
revealed.add(id);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function revealedInternalsIds(): ReadonlySet<string> {
|
|
92
|
+
return revealed;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Test-only reset for the module-level session set. */
|
|
96
|
+
export function __resetRevealedInternalsForTest(): void {
|
|
97
|
+
revealed.clear();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// -------------------------------------------------------------- projection
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Build the revealing view of `source.hierarchy`.
|
|
104
|
+
*
|
|
105
|
+
* The walk is EAGER (every revealed subtree is expanded to its leaves up
|
|
106
|
+
* front) rather than lazy inside `node()`, because "is this row internal?" must
|
|
107
|
+
* be answerable in any order — the panel asks it while rendering a row, long
|
|
108
|
+
* after the flatten that produced it, and a lazily-populated set would make the
|
|
109
|
+
* answer depend on call order. It costs one `internalChildren` call per
|
|
110
|
+
* revealed node, which the R3F adapter answers in O(children × depth) with no
|
|
111
|
+
* subtree walk.
|
|
112
|
+
*
|
|
113
|
+
* A revealed node's internals are appended AFTER its projected children, which
|
|
114
|
+
* is what keeps a nested instance's row in its authored place: the flattener
|
|
115
|
+
* dedupes by id on first occurrence, so the instance is emitted as the real
|
|
116
|
+
* child it is, and the internal path that also reaches it is skipped.
|
|
117
|
+
*/
|
|
118
|
+
export function internalsProjection(
|
|
119
|
+
source: InternalsSource,
|
|
120
|
+
revealedIds: ReadonlySet<string> = revealed,
|
|
121
|
+
): InternalsProjection {
|
|
122
|
+
// Called THROUGH `source` below, never as a detached reference: every real
|
|
123
|
+
// implementer is a class method that needs its own `this`.
|
|
124
|
+
if (typeof source.internalChildren !== 'function' || revealedIds.size === 0) {
|
|
125
|
+
return {
|
|
126
|
+
hierarchy: source.hierarchy,
|
|
127
|
+
isInternal: () => false,
|
|
128
|
+
revealRootIds: EMPTY,
|
|
129
|
+
internalIds: EMPTY,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** id -> the internal child ids appended to it. */
|
|
134
|
+
const appended = new Map<string, string[]>();
|
|
135
|
+
/** id -> the node an internal row renders (never re-asked of the adapter,
|
|
136
|
+
* whose own `node()` would answer with the PROJECTED parent). */
|
|
137
|
+
const internalNodes = new Map<string, EditorNode>();
|
|
138
|
+
const revealRootIds = new Set<string>();
|
|
139
|
+
|
|
140
|
+
const walk = (id: string, depth: number): void => {
|
|
141
|
+
if (depth > MAX_DEPTH || appended.has(id)) return;
|
|
142
|
+
const children = source.internalChildren!(id) ?? [];
|
|
143
|
+
if (children.length === 0) return;
|
|
144
|
+
appended.set(
|
|
145
|
+
id,
|
|
146
|
+
children.map((child) => child.id),
|
|
147
|
+
);
|
|
148
|
+
for (const child of children) {
|
|
149
|
+
if (internalNodes.has(child.id)) continue;
|
|
150
|
+
internalNodes.set(child.id, child);
|
|
151
|
+
walk(child.id, depth + 1);
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
for (const id of revealedIds) {
|
|
156
|
+
walk(id, 0);
|
|
157
|
+
if (appended.has(id)) revealRootIds.add(id);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const decorate = (node: EditorNode | null): EditorNode | null => {
|
|
161
|
+
if (!node) return null;
|
|
162
|
+
const extra = appended.get(node.id);
|
|
163
|
+
return extra ? { ...node, childIds: [...node.childIds, ...extra] } : node;
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
return {
|
|
167
|
+
hierarchy: {
|
|
168
|
+
roots: () => source.hierarchy.roots().map((root) => decorate(root)!),
|
|
169
|
+
node: (id) => decorate(internalNodes.get(id) ?? source.hierarchy.node(id)),
|
|
170
|
+
},
|
|
171
|
+
isInternal: (id) => internalNodes.has(id),
|
|
172
|
+
revealRootIds,
|
|
173
|
+
internalIds: new Set(internalNodes.keys()),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* H6's first-open policy, applied ON TOP of the panel's own
|
|
179
|
+
* `defaultExpansionByNode` result: **the reveal root's direct children are
|
|
180
|
+
* visible, everything deeper starts folded.**
|
|
181
|
+
*
|
|
182
|
+
* Two overrides express exactly that. The revealed row itself opens (otherwise
|
|
183
|
+
* "Reveal Internals" would appear to do nothing on an instance that happened to
|
|
184
|
+
* be folded), and every internal row starts closed — a rig is 60 rows deep and
|
|
185
|
+
* dumping all of it into the panel is the opposite of the "look inside this one
|
|
186
|
+
* thing" the action is for. Both are DEFAULTS: an explicit fold the author
|
|
187
|
+
* performs afterwards still wins, because the panel consults session and
|
|
188
|
+
* persisted preferences before this map.
|
|
189
|
+
*/
|
|
190
|
+
export function applyRevealExpansionDefaults(
|
|
191
|
+
defaults: Map<string, boolean>,
|
|
192
|
+
projection: Pick<InternalsProjection, 'revealRootIds' | 'internalIds'>,
|
|
193
|
+
): Map<string, boolean> {
|
|
194
|
+
for (const id of projection.internalIds) defaults.set(id, false);
|
|
195
|
+
for (const id of projection.revealRootIds) defaults.set(id, true);
|
|
196
|
+
return defaults;
|
|
197
|
+
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hierarchy row glyphs. Canvas kinds used to fall through to a circle because
|
|
3
|
+
* KIND_ICON only named three-lane kinds — every Sprite/Text/Container looked
|
|
4
|
+
* the same.
|
|
5
|
+
*
|
|
6
|
+
* THE THREE OBJECT KINDS OWN THEIR NAMES, for the same reason
|
|
7
|
+
* `editorIcons.modeling` does (`components/primitives/editor-icons.ts` — read
|
|
8
|
+
* its docblock) and here the reason is COLOUR rather than shape. An icon set
|
|
9
|
+
* keys a glyph by `icon.iconName` and may give it a category TONE, so a tone
|
|
10
|
+
* on `cube` would tint EVERY site that asks for a cube — and measured in the
|
|
11
|
+
* live editor, the Blender set's `object` orange landed on the viewport
|
|
12
|
+
* header's Perspective/Orthographic dropdown (`Object3DDocumentToolbar.tsx`
|
|
13
|
+
* draws it with `faCube`) and on the transform-space toggle, neither of which
|
|
14
|
+
* is an object. `faLightbulb` and `faCamera` reuse the same way (the viewport
|
|
15
|
+
* lighting overlay, the camera view menu).
|
|
16
|
+
*
|
|
17
|
+
* Blender's evidence for the colour is the OUTLINER specifically — a row's
|
|
18
|
+
* type glyph — so the tone belongs to a name only the outliner asks for.
|
|
19
|
+
* The `icon` tuple stays Font Awesome's, so a set that does not carry these
|
|
20
|
+
* names paints exactly what it painted before.
|
|
21
|
+
*/
|
|
22
|
+
import type { IconDefinition } from '@fortawesome/fontawesome-svg-core';
|
|
23
|
+
import {
|
|
24
|
+
faBookOpen,
|
|
25
|
+
faCamera,
|
|
26
|
+
faCircle,
|
|
27
|
+
faCircleDot,
|
|
28
|
+
faCirclePlay,
|
|
29
|
+
faCode,
|
|
30
|
+
faCube,
|
|
31
|
+
faDrawPolygon,
|
|
32
|
+
faFont,
|
|
33
|
+
faImage,
|
|
34
|
+
faLayerGroup,
|
|
35
|
+
faLightbulb,
|
|
36
|
+
faLink,
|
|
37
|
+
faList,
|
|
38
|
+
faObjectGroup,
|
|
39
|
+
faPuzzlePiece,
|
|
40
|
+
faSquare,
|
|
41
|
+
faSquareCheck,
|
|
42
|
+
faVideoSlash,
|
|
43
|
+
faVolumeHigh,
|
|
44
|
+
} from '@fortawesome/free-solid-svg-icons';
|
|
45
|
+
|
|
46
|
+
/** A definition under a name of OURS carrying Font Awesome's drawing until an
|
|
47
|
+
* icon set supplies its own — the same three lines as `editor-icons.ts`'s
|
|
48
|
+
* `meshGlyph`, kept local so this module's import closure stays FA-only. */
|
|
49
|
+
function outlinerGlyph(iconName: string, source: IconDefinition): IconDefinition {
|
|
50
|
+
return { ...source, iconName: iconName as IconDefinition['iconName'] };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const OUTLINER_OBJECT = outlinerGlyph('outliner-object', faCube);
|
|
54
|
+
const OUTLINER_LIGHT = outlinerGlyph('outliner-light', faLightbulb);
|
|
55
|
+
const OUTLINER_CAMERA = outlinerGlyph('outliner-camera', faCamera);
|
|
56
|
+
// The speaker is the header's mute button too (`HeaderTelemetry.tsx`), which is
|
|
57
|
+
// exactly the reuse this module's docblock names: an outliner tone on the bare
|
|
58
|
+
// `volume-high` would tint that control as well.
|
|
59
|
+
const OUTLINER_AUDIO = outlinerGlyph('outliner-audio', faVolumeHigh);
|
|
60
|
+
/**
|
|
61
|
+
* A DATABLOCK row, not an object row — the geometry a mesh carries
|
|
62
|
+
* (ARCHITECTURE-CORE §A model is
|
|
63
|
+
* data). Blender's Outliner draws it in the DATA green where the object above
|
|
64
|
+
* it is orange, which is the whole reason it gets a name of its own rather
|
|
65
|
+
* than reusing the rail's `properties-data`: the two are the same drawing but
|
|
66
|
+
* the two sites' STATES differ: the outliner composites its glyphs at α 0.80
|
|
67
|
+
* over the row, and so does the Properties rail's CLOSED tab, while its open
|
|
68
|
+
* tab paints the ink full. One ink, three states — the palette carries the
|
|
69
|
+
* ink and each site declares its own alpha (`theme.ts`'s category docblock
|
|
70
|
+
* carries the solve and the frames it was measured in).
|
|
71
|
+
*/
|
|
72
|
+
const OUTLINER_DATA = outlinerGlyph('outliner-data', faDrawPolygon);
|
|
73
|
+
/**
|
|
74
|
+
* A MESH object's own mark. Blender's Outliner does not draw a cube for one:
|
|
75
|
+
* measured on `outliner.png`, the Cube row carries an apex-down triangle — the
|
|
76
|
+
* object-type sibling of the datablock's mark, in the object orange — while
|
|
77
|
+
* `outliner-object`'s cube stays for a generic three-object row that names no
|
|
78
|
+
* mesh. A set without the name draws Font Awesome's cube, exactly as before.
|
|
79
|
+
*/
|
|
80
|
+
const OUTLINER_MESH = outlinerGlyph('outliner-mesh', faCube);
|
|
81
|
+
|
|
82
|
+
const KIND_ICON: Record<string, IconDefinition> = {
|
|
83
|
+
three: OUTLINER_OBJECT,
|
|
84
|
+
react: faCode,
|
|
85
|
+
canvas: faLayerGroup,
|
|
86
|
+
scene: faBookOpen,
|
|
87
|
+
mesh: OUTLINER_MESH,
|
|
88
|
+
'skinned-mesh': OUTLINER_MESH,
|
|
89
|
+
'mesh-data': OUTLINER_DATA,
|
|
90
|
+
// A MODEL DOCUMENT'S ROOT is the datablock, not an object carrying one
|
|
91
|
+
// (ARCHITECTURE-CORE §A model is data) — which is why `@volter/editor-blender` hangs a
|
|
92
|
+
// `mesh-data` row off it in the first place. These are the two kind names
|
|
93
|
+
// `source-object3d-authoring-adapter.ts` mints for that root, and they read
|
|
94
|
+
// the DATA glyph for the same reason `mesh-data` does. This is the "one
|
|
95
|
+
// line here and nothing else moves" the note below describes; the consumer
|
|
96
|
+
// that needed it is the Properties breadcrumb, whose glyph Blender takes
|
|
97
|
+
// from the datablock and never from the open tab.
|
|
98
|
+
'three-source': OUTLINER_DATA,
|
|
99
|
+
'model-asset': OUTLINER_DATA,
|
|
100
|
+
light: OUTLINER_LIGHT,
|
|
101
|
+
camera: OUTLINER_CAMERA,
|
|
102
|
+
audio: OUTLINER_AUDIO,
|
|
103
|
+
'reflection-probe': faCircleDot,
|
|
104
|
+
group: faObjectGroup,
|
|
105
|
+
object: faCircle,
|
|
106
|
+
component: faPuzzlePiece,
|
|
107
|
+
img: faImage,
|
|
108
|
+
a: faLink,
|
|
109
|
+
ul: faList,
|
|
110
|
+
ol: faList,
|
|
111
|
+
li: faList,
|
|
112
|
+
button: faSquare,
|
|
113
|
+
sprite: faImage,
|
|
114
|
+
animatedsprite: faCirclePlay,
|
|
115
|
+
nineslicesprite: faImage,
|
|
116
|
+
tilingsprite: faImage,
|
|
117
|
+
text: faFont,
|
|
118
|
+
graphics: faSquare,
|
|
119
|
+
container: faObjectGroup,
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* THE TWO RESTRICTION-COLUMN GLYPHS THAT ARE NOT THE EYE — Blender's Disable
|
|
124
|
+
* in Renders column (`outliner_draw.cc:1363-1384`). Names of OURS for the same
|
|
125
|
+
* reason the outliner marks above have them: the bare `camera` name is the
|
|
126
|
+
* viewport header's camera menu, and a skin that drew Blender's
|
|
127
|
+
* `restrict_render_*` mark under it would repaint that menu too.
|
|
128
|
+
*/
|
|
129
|
+
export const OUTLINER_RENDER_ON = outlinerGlyph('outliner-render-on', faCamera);
|
|
130
|
+
export const OUTLINER_RENDER_OFF = outlinerGlyph('outliner-render-off', faVideoSlash);
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* THE EXCLUDE COLUMN's pair — Blender's leftmost restriction column, drawn for
|
|
134
|
+
* `LayerCollection` rows (`outliner_draw.cc:1634-1653`). It asks for
|
|
135
|
+
* `ICON_NONE` on an icon toggle, which is how a boolean draws the WIDGET's own
|
|
136
|
+
* checkbox, so the marks are `checkbox_hlt` / `checkbox_dehlt` — named here the
|
|
137
|
+
* way the render pair is, because a bare `checkbox` name would repaint every
|
|
138
|
+
* checkbox in the editor.
|
|
139
|
+
*/
|
|
140
|
+
export const OUTLINER_EXCLUDE_ON = outlinerGlyph('outliner-exclude-on', faSquareCheck);
|
|
141
|
+
export const OUTLINER_EXCLUDE_OFF = outlinerGlyph('outliner-exclude-off', faSquare);
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* A `blender-` KIND NAMES ITS OWN GLYPH, and that is the whole rule.
|
|
145
|
+
*
|
|
146
|
+
* `@volter/editor-blender`'s Outliner rows carry Blender's own `ICON_*` per row
|
|
147
|
+
* (`tree_element_get_icon`, `outliner_draw.cc:2619-2945`) — 70-odd marks across
|
|
148
|
+
* the object types, the data types, the modifier and constraint families. A
|
|
149
|
+
* table here with one line per mark would be a transcription of Blender's
|
|
150
|
+
* switch maintained in a second place; the adapter already knows the name, so
|
|
151
|
+
* the kind IS the name (`blender-outliner-ob-mesh`, `blender-mod-subsurf`) and
|
|
152
|
+
* the icon SET decides whether it draws it. A set that does not carry the name
|
|
153
|
+
* falls through to Font Awesome's circle, exactly as any unknown kind does.
|
|
154
|
+
*/
|
|
155
|
+
const BLENDER_KIND = /^blender-[a-z0-9-]+$/;
|
|
156
|
+
|
|
157
|
+
export function hierarchyKindIcon(
|
|
158
|
+
kind: string,
|
|
159
|
+
fallback: IconDefinition = faCircle,
|
|
160
|
+
): IconDefinition {
|
|
161
|
+
const known = KIND_ICON[kind];
|
|
162
|
+
if (known) return known;
|
|
163
|
+
if (BLENDER_KIND.test(kind)) return outlinerGlyph(kind, fallback);
|
|
164
|
+
return fallback;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* THE DATABLOCK KINDS — the rows Blender's Outliner hangs OFF an object rather
|
|
169
|
+
* than under it, and the one place this editor decides which those are.
|
|
170
|
+
*
|
|
171
|
+
* Measured on `outliner.png`: at rest every object row is COLLAPSED and carries
|
|
172
|
+
* its datablock as an inline glyph after the label, one cell to the right
|
|
173
|
+
* (Camera's at src x 288-327, Cube's at 263-302, Light's at 266-291 — the label
|
|
174
|
+
* ink ends at 246/222/218, so the gap is 40-41 device px, one 20-point cell
|
|
175
|
+
* every time). Expanding is what produces the child row.
|
|
176
|
+
*
|
|
177
|
+
* WHY A KIND LIST AND NOT A ROLE. The datablock row is `role: 'element'`
|
|
178
|
+
* and so is every ordinary JSX
|
|
179
|
+
* child in the DOM and React lanes — a rule keyed on the role would collapse
|
|
180
|
+
* those trees by default, which is a regression, not a transcription. The KIND
|
|
181
|
+
* is the adapter's own vocabulary and this module is already where the host
|
|
182
|
+
* reads it: `KIND_ICON` above gives `mesh-data` the DATA glyph because it is a
|
|
183
|
+
* datablock. A future `light-data`/`camera-data` adds one line here and
|
|
184
|
+
* nothing else moves.
|
|
185
|
+
*
|
|
186
|
+
* `EditorNode` gains no field for this. The kind is open by construction (the
|
|
187
|
+
* previous unit's ruling), so a new noun on the kernel object would buy
|
|
188
|
+
* nothing that the name the adapter already sends does not.
|
|
189
|
+
*/
|
|
190
|
+
const DATABLOCK_KINDS: ReadonlySet<string> = new Set([
|
|
191
|
+
'mesh-data',
|
|
192
|
+
// Blender's own DATA marks, which is exactly what
|
|
193
|
+
// `tree_element_get_icon_from_id` (`outliner_draw.cc:2479-2610`) answers for
|
|
194
|
+
// a non-object ID: the mark a Model document's rows carry for an object's
|
|
195
|
+
// data, its materials and its shape keys. The object marks
|
|
196
|
+
// (`blender-outliner-ob-*`) are deliberately NOT here — those are the row
|
|
197
|
+
// itself, not something hung off it.
|
|
198
|
+
'blender-material-data',
|
|
199
|
+
'blender-shapekey-data',
|
|
200
|
+
'blender-texture-data',
|
|
201
|
+
'blender-image-data',
|
|
202
|
+
]);
|
|
203
|
+
|
|
204
|
+
/** The prefixes of the same set that are keyed by a VALUE rather than a struct
|
|
205
|
+
* — a light's lamp type and a probe's (`outliner_draw.cc:2508-2521`,
|
|
206
|
+
* `:2578-2589`) — plus the `OUTLINER_DATA_*` family. */
|
|
207
|
+
const DATABLOCK_KIND_PREFIXES: readonly string[] = [
|
|
208
|
+
'blender-outliner-data-',
|
|
209
|
+
'blender-light-',
|
|
210
|
+
'blender-lightprobe-',
|
|
211
|
+
];
|
|
212
|
+
|
|
213
|
+
export function isDatablockKind(kind: string | undefined): boolean {
|
|
214
|
+
if (kind === undefined) return false;
|
|
215
|
+
if (DATABLOCK_KINDS.has(kind)) return true;
|
|
216
|
+
return DATABLOCK_KIND_PREFIXES.some((prefix) => kind.startsWith(prefix));
|
|
217
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one place the hierarchy panel's mark convention meets a real `Object3D`.
|
|
3
|
+
*
|
|
4
|
+
* `hierarchy-component-marks.ts` is deliberately pure — it takes a
|
|
5
|
+
* {@link NodeMarkReader} and never learns what a node is made of — and
|
|
6
|
+
* `GameHierarchy` is deliberately contract-only (rule zero: no 3D-library value
|
|
7
|
+
* import). This module is the seam between them: it asks the adapter's OPTIONAL
|
|
8
|
+
* `object3D` capability for the node and reads
|
|
9
|
+
* `@volter/editor-threejs/adapter/hierarchy-marks`' two marks off it.
|
|
10
|
+
*
|
|
11
|
+
* An adapter with no `Object3D` seam (React, Pixi, DOM) yields {@link NO_MARKS},
|
|
12
|
+
* which `componentMarkView` recognizes by identity and short-circuits on — so a
|
|
13
|
+
* non-three surface pays nothing and renders byte-identically.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { HierarchyProvider } from '@volter/editor-project/adapter';
|
|
17
|
+
import { componentRootName, isBuiltInternal } from '@volter/editor-threejs/adapter/hierarchy-marks';
|
|
18
|
+
import { getUserData } from '@volter/editor-threejs/ecs/user-data';
|
|
19
|
+
import { isComponentInstanceRoot } from './authoring/component-instance-root';
|
|
20
|
+
import { NO_MARKS, type NodeMarkReader, type NodeMarks } from './hierarchy-component-marks';
|
|
21
|
+
|
|
22
|
+
/** Project-local R3F source already carries its component ownership on the
|
|
23
|
+
* native node. Read that existing stamp as the automatic equivalent of an
|
|
24
|
+
* imperative `markComponentRoot`; explicit marks still win. */
|
|
25
|
+
function componentName(object: Parameters<typeof componentRootName>[0]): string | undefined {
|
|
26
|
+
const explicit = componentRootName(object);
|
|
27
|
+
// Some project-local components are the native authoring ENTITY constructor rather than a
|
|
28
|
+
// reusable component boundary. Importers are the canonical case: `<UnityNode>` creates the
|
|
29
|
+
// GameObject itself, while a generated `<Player>` prefab remains a component instance around
|
|
30
|
+
// that node. `authoringRoot` is the existing generic declaration for exactly that distinction.
|
|
31
|
+
// An explicit component mark still wins, so a prefab root can be both its own authoring object
|
|
32
|
+
// and the boundary of the reusable prefab instance. A built-internal mark suppresses only the
|
|
33
|
+
// automatic component classification: a React helper that renders implementation machinery is
|
|
34
|
+
// still implementation, not a prefab merely because Fiber recorded its component boundary.
|
|
35
|
+
if (
|
|
36
|
+
explicit ||
|
|
37
|
+
isBuiltInternal(object) ||
|
|
38
|
+
getUserData(object, 'authoringRoot') === true ||
|
|
39
|
+
!isComponentInstanceRoot(object)
|
|
40
|
+
) {
|
|
41
|
+
return explicit;
|
|
42
|
+
}
|
|
43
|
+
const authored = getUserData(object, 'authoringComponent');
|
|
44
|
+
return typeof authored === 'string' && authored ? authored : undefined;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* A memoized reader over `hierarchy.object3D`.
|
|
49
|
+
*
|
|
50
|
+
* The cache lives for the reader's lifetime — one render pass — because the
|
|
51
|
+
* live graph it reads is re-walked every render anyway (`hierarchy.roots()` IS
|
|
52
|
+
* the refresh point on a live adapter). Within one pass the marks cannot move,
|
|
53
|
+
* and the walk asks for the same id many times: once per `node()` projection,
|
|
54
|
+
* again per internals probe.
|
|
55
|
+
*/
|
|
56
|
+
export function markReaderFor(hierarchy: Pick<HierarchyProvider, 'object3D'>): NodeMarkReader {
|
|
57
|
+
const object3D = hierarchy.object3D;
|
|
58
|
+
if (typeof object3D !== 'function') return NO_MARKS;
|
|
59
|
+
const cache = new Map<string, NodeMarks | undefined>();
|
|
60
|
+
return (id) => {
|
|
61
|
+
if (cache.has(id)) return cache.get(id);
|
|
62
|
+
const object = object3D.call(hierarchy, id);
|
|
63
|
+
const marks: NodeMarks | undefined = object
|
|
64
|
+
? {
|
|
65
|
+
componentRoot: componentName(object),
|
|
66
|
+
authoredEntity: getUserData(object, 'authoringRoot') === true,
|
|
67
|
+
builtInternal: isBuiltInternal(object),
|
|
68
|
+
}
|
|
69
|
+
: undefined;
|
|
70
|
+
cache.set(id, marks);
|
|
71
|
+
return marks;
|
|
72
|
+
};
|
|
73
|
+
}
|