@volter/editor-game 0.5.65
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/LICENSE +661 -0
- package/NOTICE +23 -0
- package/contributions/asset-budget-asset.menu.ts +26 -0
- package/contributions/asset-budget.action.ts +18 -0
- package/contributions/asset-budget.document.tsx +21 -0
- package/contributions/asset-budget.menu.ts +22 -0
- package/contributions/audio-unlock.service.ts +17 -0
- package/contributions/audio.utility.tsx +15 -0
- package/contributions/autoplay.service.ts +48 -0
- package/contributions/bridge.command.ts +172 -0
- package/contributions/build-profiles.document.tsx +21 -0
- package/contributions/build-progress.status.tsx +45 -0
- package/contributions/build.action.ts +26 -0
- package/contributions/build.command.ts +27 -0
- package/contributions/build.header.tsx +37 -0
- package/contributions/build.menu.ts +31 -0
- package/contributions/build.service.ts +31 -0
- package/contributions/connection.status.tsx +43 -0
- package/contributions/coverage.service.ts +118 -0
- package/contributions/edit-mode-audio.service.ts +23 -0
- package/contributions/edit-mode-networking.service.ts +30 -0
- package/contributions/game-document.service.ts +25 -0
- package/contributions/game-eval.command.ts +210 -0
- package/contributions/game.layout.ts +19 -0
- package/contributions/gameplay.command.ts +255 -0
- package/contributions/generation.service.ts +96 -0
- package/contributions/generations.status.tsx +53 -0
- package/contributions/ingest.service.ts +80 -0
- package/contributions/instances.command.ts +75 -0
- package/contributions/navmesh.menu.ts +39 -0
- package/contributions/navmesh.service.ts +19 -0
- package/contributions/network.utility.tsx +17 -0
- package/contributions/play.command.ts +355 -0
- package/contributions/profiler.action.ts +16 -0
- package/contributions/profiler.menu.ts +22 -0
- package/contributions/profiler.utility.tsx +17 -0
- package/contributions/react/component-board.service.ts +21 -0
- package/contributions/react/design-time-mount.service.ts +60 -0
- package/contributions/react/pasteboard.action.ts +41 -0
- package/contributions/react/react-inspector.service.ts +85 -0
- package/contributions/react/story-documents.service.ts +44 -0
- package/contributions/scene-document.service.ts +32 -0
- package/contributions/state-watch.action.ts +17 -0
- package/contributions/state-watch.menu.ts +23 -0
- package/contributions/state-watch.utility.tsx +20 -0
- package/contributions/team-playtest.service.ts +124 -0
- package/contributions/three/camera-runtime.inspector.tsx +34 -0
- package/contributions/three/component-board.service.ts +24 -0
- package/contributions/three/component-verbs.command.ts +110 -0
- package/contributions/three/component-verbs.service.ts +92 -0
- package/contributions/three/constraints.inspector.tsx +34 -0
- package/contributions/three/model-asset-sections.service.ts +26 -0
- package/contributions/three/reflection-probe-capture.inspector.tsx +32 -0
- package/contributions/three/story-documents.service.ts +31 -0
- package/contributions/three/three-authoring.service.ts +66 -0
- package/contributions/transport.header.tsx +19 -0
- package/contributions/xstate-behavior.action.ts +42 -0
- package/contributions/xstate-behavior.document.tsx +73 -0
- package/contributions/xstate-behavior.inspector.tsx +28 -0
- package/contributions/xstate-behavior.menu.ts +23 -0
- package/package.json +144 -0
- package/src/asset-budget/AssetBudgetPanel.tsx +1172 -0
- package/src/asset-budget/asset-budget-model.ts +799 -0
- package/src/asset-budget/basis-encoder.ts +165 -0
- package/src/asset-budget/gltf-io.ts +154 -0
- package/src/asset-budget/gltf-optimize.ts +384 -0
- package/src/asset-budget/image-dims.ts +78 -0
- package/src/asset-budget/optimize-apply.ts +221 -0
- package/src/audio/AudioDebuggerPanel.tsx +457 -0
- package/src/audio/audio-debugger-model.ts +87 -0
- package/src/bridge/call.ts +60 -0
- package/src/bridge/dispatch.ts +459 -0
- package/src/bridge/live-frames.ts +25 -0
- package/src/bridge/screenshot.ts +316 -0
- package/src/build/BuildProfilesPanel.tsx +476 -0
- package/src/build/build-session.ts +247 -0
- package/src/build/format-bytes.ts +14 -0
- package/src/command-results.ts +36 -0
- package/src/coverage/live-authoring-surface.ts +30 -0
- package/src/coverage/live-project-verbs.ts +162 -0
- package/src/coverage/native-system-coverage.ts +143 -0
- package/src/coverage/root-coverage.ts +79 -0
- package/src/coverage/session-coverage.ts +193 -0
- package/src/design-system-stories/ApplicationChrome.stories.tsx +100 -0
- package/src/design-system-stories/InspectorNarrowBodies.stories.tsx +406 -0
- package/src/edit-mode/edit-mode-audio.ts +56 -0
- package/src/edit-mode/edit-mode-networking.ts +112 -0
- package/src/game-document/DevicePresetPicker.tsx +84 -0
- package/src/game-document/GameCaptureFrameButton.tsx +45 -0
- package/src/game-document/GameDocument.tsx +215 -0
- package/src/game-document/GamePanel.tsx +662 -0
- package/src/game-document/InstanceInspectorPicker.tsx +183 -0
- package/src/game-document/crowd-debug.ts +183 -0
- package/src/game-document/device-preview.ts +336 -0
- package/src/game-document/game-view-store.ts +107 -0
- package/src/game-document/physics-debug.ts +187 -0
- package/src/generation/GenerationActivity.tsx +421 -0
- package/src/generation/GenerationGallery.css +231 -0
- package/src/generation/generation-documents.tsx +338 -0
- package/src/generation/generation-jobs.ts +128 -0
- package/src/generation/generation-presentation.ts +257 -0
- package/src/host/adapter-reach.ts +445 -0
- package/src/host/adapter-runtime-bindings.ts +303 -0
- package/src/host/after-paint.ts +112 -0
- package/src/host/api/configurations.ts +66 -0
- package/src/host/authoring/babylon-authoring-adapter.ts +703 -0
- package/src/host/authoring/canvas-runtime-recognition.ts +50 -0
- package/src/host/authoring/contract-hierarchy-authoring.ts +144 -0
- package/src/host/authoring/contract-scenes-stories.ts +204 -0
- package/src/host/authoring/creation-site-related.ts +55 -0
- package/src/host/authoring/ephemeral-persistence.ts +29 -0
- package/src/host/authoring/gesture-persist.ts +84 -0
- package/src/host/authoring/ingest-data-writer.ts +232 -0
- package/src/host/authoring/ingest-source-persistence.ts +826 -0
- package/src/host/authoring/mount-isolated-pixi-screen.ts +250 -0
- package/src/host/authoring/mounted-authoring.ts +41 -0
- package/src/host/authoring/owned-pixi-ticker-listeners.ts +96 -0
- package/src/host/authoring/phaser-live-authoring-adapter.ts +265 -0
- package/src/host/authoring/pixi-authoring-adapter.ts +1554 -0
- package/src/host/authoring/pixi-creation-site-write-target.ts +60 -0
- package/src/host/authoring/pixi-isolation-assets.ts +25 -0
- package/src/host/authoring/pixi-live-write-target.ts +979 -0
- package/src/host/authoring/pixi-source-identity.ts +141 -0
- package/src/host/authoring/pixi-still-presentation.ts +71 -0
- package/src/host/authoring/pixi-structure-history.ts +237 -0
- package/src/host/authoring/pixi-transform-channels.ts +205 -0
- package/src/host/authoring/selection-remount-handoff.ts +23 -0
- package/src/host/authoring/source-persistence-backend.ts +373 -0
- package/src/host/authoring/source-refresh-revisions.ts +81 -0
- package/src/host/authoring/struct-write-pipe.ts +143 -0
- package/src/host/auto-frame-window.ts +89 -0
- package/src/host/binding-resolver.ts +393 -0
- package/src/host/browser-transpile.ts +631 -0
- package/src/host/canvas-entry-runtime.ts +95 -0
- package/src/host/components/CameraAuthoringOverlay.tsx +216 -0
- package/src/host/components/HeaderTelemetry.tsx +341 -0
- package/src/host/components/PixiIsolationSceneContent.tsx +280 -0
- package/src/host/components/ResolutionPicker.tsx +89 -0
- package/src/host/components/ThreeIsolationSceneContent.tsx +180 -0
- package/src/host/components/frame-debugger-model.ts +579 -0
- package/src/host/components/header-telemetry-model.ts +74 -0
- package/src/host/components/scene-document.tsx +447 -0
- package/src/host/components/utility-view-state.ts +87 -0
- package/src/host/components/world-root-stage-binding.tsx +133 -0
- package/src/host/components/world-root-stage.ts +1046 -0
- package/src/host/coverage/authoring-read-probe.ts +583 -0
- package/src/host/coverage/capability-coverage.ts +1587 -0
- package/src/host/coverage/coverage-accounting.ts +261 -0
- package/src/host/coverage/game-contract-seam-evidence.ts +82 -0
- package/src/host/coverage/project-verb-coverage.ts +148 -0
- package/src/host/coverage/system-adapter-coverage.ts +373 -0
- package/src/host/design-system-stories/StoryLayout.tsx +104 -0
- package/src/host/design-system-stories/fixtures/authoring.ts +247 -0
- package/src/host/design-system-stories/fixtures/editor-runtime.tsx +115 -0
- package/src/host/document-preview-three.ts +110 -0
- package/src/host/entry-adjudication.ts +89 -0
- package/src/host/game-location-guard.ts +150 -0
- package/src/host/game-module-access.ts +196 -0
- package/src/host/game-realm-page.ts +358 -0
- package/src/host/game-realm-reclaim.ts +55 -0
- package/src/host/game-realm-storage.ts +104 -0
- package/src/host/gameplay-export.ts +288 -0
- package/src/host/gameplay-recording.ts +717 -0
- package/src/host/gated-globals.ts +1511 -0
- package/src/host/history/json-history-resource.ts +254 -0
- package/src/host/ingest/registry.ts +261 -0
- package/src/host/instance-extract-actions.ts +120 -0
- package/src/host/instance-fork-actions.ts +120 -0
- package/src/host/play-control-hook.ts +26 -0
- package/src/host/playwright-shim.ts +479 -0
- package/src/host/projection/dom.ts +295 -0
- package/src/host/projection/pixi.ts +288 -0
- package/src/host/r3f-entry-runtime.ts +77 -0
- package/src/host/react-mount-runtime.ts +162 -0
- package/src/host/realm-services.ts +148 -0
- package/src/host/recording-preview.ts +106 -0
- package/src/host/roots/module-root.ts +203 -0
- package/src/host/roots/react-root.ts +181 -0
- package/src/host/same-realm-loop-gate.ts +544 -0
- package/src/host/scene-view-drawability.ts +69 -0
- package/src/host/sdk/tools.ts +31 -0
- package/src/host/served-bundle-runtime-modules.ts +331 -0
- package/src/host/server-log-bridge.ts +60 -0
- package/src/host/staged-projects.ts +24 -0
- package/src/host/stories/mounted-story-viewport-source.ts +64 -0
- package/src/host/stories/story-arg-descriptors.ts +50 -0
- package/src/host/stories/story-media-presence.ts +152 -0
- package/src/host/surface-content.ts +87 -0
- package/src/host/take-named-export.ts +23 -0
- package/src/host/three-ingest-runtime.ts +76 -0
- package/src/host/types-fastnoise-lite.d.ts +7 -0
- package/src/host/types-mikktspace.d.ts +20 -0
- package/src/host/types-troika-three-text.d.ts +7 -0
- package/src/host/use-active-performance-source.ts +53 -0
- package/src/host/viewport-pose-memory.ts +48 -0
- package/src/host/viewport-root-presentation.ts +40 -0
- package/src/ingest/active-ingest.ts +251 -0
- package/src/ingest/active-scene-navigation.ts +43 -0
- package/src/ingest/authoring/ingest-dom-surface-authoring.ts +191 -0
- package/src/ingest/authoring/ingest-root-adapter.ts +897 -0
- package/src/ingest/capture-wait-report.ts +122 -0
- package/src/ingest/deferred-ingest-play.ts +216 -0
- package/src/ingest/deferred-ingest-session.ts +23 -0
- package/src/ingest/discovery-public-ingest.ts +242 -0
- package/src/ingest/dom-stub-mark.ts +7 -0
- package/src/ingest/entry-load.ts +56 -0
- package/src/ingest/game-contract-realm.ts +34 -0
- package/src/ingest/game-pointer-lock.ts +89 -0
- package/src/ingest/held-scene-repaint.ts +73 -0
- package/src/ingest/host-surface-box.ts +174 -0
- package/src/ingest/ingest-boot-viewport.ts +54 -0
- package/src/ingest/ingest-canvas-scene-document.tsx +177 -0
- package/src/ingest/ingest-canvas-scene.ts +50 -0
- package/src/ingest/ingest-evidence-hook.ts +131 -0
- package/src/ingest/ingest-frame-snapshot.ts +183 -0
- package/src/ingest/ingest-play-commands.ts +134 -0
- package/src/ingest/ingest-play-control.ts +299 -0
- package/src/ingest/ingest-render-debug.ts +320 -0
- package/src/ingest/ingest-siblings.ts +487 -0
- package/src/ingest/ingest-status.ts +62 -0
- package/src/ingest/live-ingest-facet.ts +46 -0
- package/src/ingest/module-mode.ts +229 -0
- package/src/ingest/mount-canvas-ingest-root.ts +899 -0
- package/src/ingest/mount-coverage.ts +296 -0
- package/src/ingest/mount-dom-ingest-root.ts +282 -0
- package/src/ingest/mount-ingest-root.ts +744 -0
- package/src/ingest/mount-three-ingest-root.ts +366 -0
- package/src/ingest/resolve-canvas.ts +47 -0
- package/src/ingest/resolve-three.ts +123 -0
- package/src/ingest/served-bundle.ts +109 -0
- package/src/ingest/served-html-boot.ts +292 -0
- package/src/ingest/surface-canvas.ts +84 -0
- package/src/ingest/surface-dom.ts +84 -0
- package/src/ingest/surface-three.ts +128 -0
- package/src/ingest/types.ts +76 -0
- package/src/ingest/unmount-ingest-root.ts +224 -0
- package/src/navmesh/navmesh-actions.ts +27 -0
- package/src/navmesh/navmesh-handler.ts +237 -0
- package/src/navmesh/navmesh-workflow-store.ts +78 -0
- package/src/network/NetworkInspectorPanel.tsx +644 -0
- package/src/network/network-inspector-model.ts +225 -0
- package/src/play/play-boot-stall.ts +118 -0
- package/src/play/play-log-events.ts +26 -0
- package/src/play/play-mode.ts +2553 -0
- package/src/play/play-recording.ts +335 -0
- package/src/play/react-play-live-authoring.ts +165 -0
- package/src/play-bar/PlayBar.tsx +488 -0
- package/src/play-bar/PlayerCountPicker.tsx +100 -0
- package/src/profiler/FrameDebuggerPanel.tsx +458 -0
- package/src/profiler/PerformancePanel.tsx +1068 -0
- package/src/profiler/ProfilerPanel.tsx +53 -0
- package/src/profiler/frame-debugger-store.ts +97 -0
- package/src/profiler/main-thread-busy.ts +90 -0
- package/src/react/design-time-react-mount.ts +782 -0
- package/src/react/dom-authoring-adapter.ts +764 -0
- package/src/react/pasteboard-materialize.ts +154 -0
- package/src/react/react-inspector-section.tsx +2496 -0
- package/src/react/react-world-authoring-adapter.ts +3795 -0
- package/src/react/story-documents/story-args-section.ts +19 -0
- package/src/react/story-documents/story-documents.tsx +1380 -0
- package/src/react/story-paint-bounds.ts +94 -0
- package/src/react/ui-board-document.tsx +101 -0
- package/src/react/ui-board-title.ts +9 -0
- package/src/react/ui-component-board.ts +72 -0
- package/src/services/audio-pose-guard.ts +81 -0
- package/src/services/game-audio-unlock.ts +48 -0
- package/src/state-watch/StateWatchPanel.tsx +535 -0
- package/src/three/authoring/camera-runtime-inspector-section.tsx +135 -0
- package/src/three/authoring/constraint-inspector-section.tsx +189 -0
- package/src/three/authoring/design-time-renderer.ts +189 -0
- package/src/three/authoring/model-asset-inspector-section.css +41 -0
- package/src/three/authoring/model-asset-inspector-section.tsx +869 -0
- package/src/three/authoring/oid-source-persistence.ts +557 -0
- package/src/three/authoring/r3f-design-session.ts +1174 -0
- package/src/three/authoring/r3f-source-authoring-adapter.ts +5949 -0
- package/src/three/authoring/reflection-probe-inspector-section.tsx +76 -0
- package/src/three/authoring/spatial-audio-handles.ts +215 -0
- package/src/three/authoring/spatial-collider-handles.ts +229 -0
- package/src/three/authoring/spatial-joint-handles.ts +114 -0
- package/src/three/authoring/spatial-light-handles.ts +178 -0
- package/src/three/authoring/spatial-lod-handles.ts +93 -0
- package/src/three/authoring/spatial-particle-handles.ts +368 -0
- package/src/three/authoring/three-authoring-adapter.ts +1953 -0
- package/src/three/authoring/three-scene-identity.ts +19 -0
- package/src/three/authoring/three-spatial-handles.ts +161 -0
- package/src/three/authoring/typed-three-inspector.ts +528 -0
- package/src/three/component-verbs/extract-menu.ts +71 -0
- package/src/three/component-verbs/fork-menu.ts +78 -0
- package/src/three/component-verbs/internals-menu.ts +91 -0
- package/src/three/story-documents/three-story-documents.tsx +607 -0
- package/src/three/three-board/ThreeBoardDocument.tsx +888 -0
- package/src/three/three-board/board-framing.ts +412 -0
- package/src/three/three-board/board-layout.ts +401 -0
- package/src/three/three-board/board-scene.ts +901 -0
- package/src/three/three-board/three-component-board.ts +62 -0
- package/src/xstate/XStateBehaviorSection.tsx +130 -0
- package/src/xstate/XStateMachineInspector.tsx +566 -0
- package/src/xstate/character-animation-machine.fixture.ts +74 -0
- package/src/xstate/live-behaviors.ts +106 -0
- package/src/xstate/use-live-actor-state.ts +44 -0
- package/src/xstate/xstate-graph.ts +235 -0
- package/src/xstate/xstate-layout.ts +76 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module-adapter auto-mounting. Every `{ module }` surface resolves through
|
|
3
|
+
* `resolveAllRoots` and mounts through the universal roots host. The mounted
|
|
4
|
+
* root's own `AuthoringAdapter` drives the generic hierarchy and inspector;
|
|
5
|
+
* absence produces the same explicit no-authoring floor as ingest.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { measureAdapterReach } from '../host/adapter-reach';
|
|
9
|
+
import { setActiveAuthoring } from '@volter/editor-core/authoring/active-adapter';
|
|
10
|
+
import { setActiveSystems } from '@volter/editor-core/authoring/active-systems';
|
|
11
|
+
import {
|
|
12
|
+
addMountFailureReport,
|
|
13
|
+
clearMountFailureReports,
|
|
14
|
+
formatMountFailureMessage,
|
|
15
|
+
} from '@volter/editor-core/authoring/mount-failure-report';
|
|
16
|
+
import { makeNoAuthoringAdapter } from '@volter/editor-core/authoring/no-authoring-adapter';
|
|
17
|
+
import { resolveAllRoots } from '../host/binding-resolver';
|
|
18
|
+
import { editorConsole } from '@volter/editor-core/editor-console';
|
|
19
|
+
import type { EditorShellStore } from '@volter/editor-core/editor-shell-store';
|
|
20
|
+
import { fetchGameManifest } from '@volter/editor-core/manifest-project';
|
|
21
|
+
import { getCurrentProject } from '@volter/editor-core/project-manager';
|
|
22
|
+
import type { GameSession, RootMountSpec } from '@volter/game-runtime/runtime/create-runtime';
|
|
23
|
+
import type { AuthoringAdapter } from '@volter/editor-project/adapter';
|
|
24
|
+
import { declaredRoots, ingestRoots } from '@volter/editor-project/adapter/manifest-interpreter';
|
|
25
|
+
import type { ResolvedAdapterRoot, ResolvedGameManifest } from '@volter/editor-project/manifest/load';
|
|
26
|
+
|
|
27
|
+
interface ModuleSession {
|
|
28
|
+
store: EditorShellStore;
|
|
29
|
+
stop: () => void;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let _session: ModuleSession | null = null;
|
|
33
|
+
|
|
34
|
+
/** True if a `{ module }` adapter world is currently auto-mounted. */
|
|
35
|
+
export function isModuleModeActive(): boolean {
|
|
36
|
+
return _session !== null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Selection is editor-global UI state (the SAME rule `ThreeAuthoringAdapter`'s
|
|
41
|
+
* own doc comment states) — a custom `{ module }` adapter has no `EditorShellStore`
|
|
42
|
+
* reference to delegate to (by design: `ThreeHostContext` is editor-neutral), so
|
|
43
|
+
* the hierarchy panel's row click (`adapter.selection?.set([node.id])`) would
|
|
44
|
+
* silently no-op without this. Wrap the mounted adapter with a store-backed
|
|
45
|
+
* `SelectionProvider` UNLESS it already declares its own (an adapter author
|
|
46
|
+
* who genuinely wants custom multi-select semantics is not overridden). This
|
|
47
|
+
* costs the adapter author nothing — they never see `EditorShellStore` at all.
|
|
48
|
+
*/
|
|
49
|
+
export function withStoreSelection(
|
|
50
|
+
authoring: AuthoringAdapter,
|
|
51
|
+
store: EditorShellStore,
|
|
52
|
+
): AuthoringAdapter {
|
|
53
|
+
if (authoring.selection) return authoring;
|
|
54
|
+
return {
|
|
55
|
+
...authoring,
|
|
56
|
+
selection: {
|
|
57
|
+
get: () => [...store.selectedEntityIds],
|
|
58
|
+
set: (ids) => store.selectMultiple(ids),
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Tear down the auto-mounted module session. */
|
|
64
|
+
export function exitModuleMode(): void {
|
|
65
|
+
const s = _session;
|
|
66
|
+
if (!s) return;
|
|
67
|
+
_session = null;
|
|
68
|
+
setActiveAuthoring(null);
|
|
69
|
+
setActiveSystems(null);
|
|
70
|
+
clearMountFailureReports(); // D-W3: no session -> nothing left to report (mirrors ingest/mount-ingest-root.ts's unmountThreeIngestRoot)
|
|
71
|
+
s.store.setPlayState('stopped');
|
|
72
|
+
try {
|
|
73
|
+
s.stop();
|
|
74
|
+
} catch {
|
|
75
|
+
/* ignore */
|
|
76
|
+
}
|
|
77
|
+
delete (window as unknown as Record<string, unknown>)['__vgaiModule'];
|
|
78
|
+
editorConsole.log('Module adapter mode stopped', 'adapter');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Mount a single `{ module }` world through the universal host: a one-element
|
|
83
|
+
* `resolveAllRoots` + `createGameRuntime`
|
|
84
|
+
* — with NO global side effects of its own (no `setActiveAuthoring`, no
|
|
85
|
+
* `store`/viewport writes, no dev hooks). The editor's module route and
|
|
86
|
+
* composite module siblings share this exact resolve-and-mount step.
|
|
87
|
+
*/
|
|
88
|
+
export async function mountModuleRootRuntime(
|
|
89
|
+
manifest: ResolvedGameManifest,
|
|
90
|
+
world: ResolvedAdapterRoot,
|
|
91
|
+
projectRoot: string,
|
|
92
|
+
container: HTMLElement,
|
|
93
|
+
width: number,
|
|
94
|
+
height: number,
|
|
95
|
+
): Promise<{ session: GameSession; specs: RootMountSpec[] }> {
|
|
96
|
+
const { createGameRuntime } = await import('@volter/game-runtime/runtime/create-runtime');
|
|
97
|
+
const specs = await resolveAllRoots({ ...manifest, roots: [world] }, projectRoot);
|
|
98
|
+
const session = await createGameRuntime({ container, roots: specs, width, height });
|
|
99
|
+
return { session, specs };
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export async function enterModuleModeFromManifestRoot(
|
|
103
|
+
store: EditorShellStore,
|
|
104
|
+
manifest: ResolvedGameManifest,
|
|
105
|
+
world: ResolvedAdapterRoot,
|
|
106
|
+
projectRoot: string,
|
|
107
|
+
): Promise<void> {
|
|
108
|
+
// The Game document exists only while a runtime does, so install it (and
|
|
109
|
+
// wait for its panel to commit) before reading the container it owns.
|
|
110
|
+
await acquireLiveDocument();
|
|
111
|
+
const gameContainer = liveDocumentContainer();
|
|
112
|
+
if (!gameContainer) {
|
|
113
|
+
editorConsole.error('Game container not mounted — cannot auto-mount module adapter', 'adapter');
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
store.setPlayState('playing');
|
|
118
|
+
editorConsole.log(
|
|
119
|
+
`Mounting custom adapter module for world "${world.id}" (kind: ${world.surface})`,
|
|
120
|
+
'adapter',
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
const w = gameContainer.clientWidth || 800;
|
|
124
|
+
const h = gameContainer.clientHeight || 600;
|
|
125
|
+
const { session, specs } = await mountModuleRootRuntime(
|
|
126
|
+
manifest,
|
|
127
|
+
world,
|
|
128
|
+
projectRoot,
|
|
129
|
+
gameContainer,
|
|
130
|
+
w,
|
|
131
|
+
h,
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
const worldInstance = session.game.roots[0]!;
|
|
135
|
+
const mounted = worldInstance.mounted;
|
|
136
|
+
const adapterId = specs[0]!.adapter.id;
|
|
137
|
+
|
|
138
|
+
_session = { store, stop: () => session.stop() };
|
|
139
|
+
|
|
140
|
+
let activeAuthoring: AuthoringAdapter;
|
|
141
|
+
if (mounted.authoring) {
|
|
142
|
+
activeAuthoring = withStoreSelection(mounted.authoring, store);
|
|
143
|
+
} else {
|
|
144
|
+
// Honest answer for a module adapter that declares no authoring surface.
|
|
145
|
+
activeAuthoring = makeNoAuthoringAdapter(store, `${adapterId} (no authoring surface)`);
|
|
146
|
+
}
|
|
147
|
+
setActiveAuthoring(activeAuthoring);
|
|
148
|
+
setActiveSystems(mounted.systems ?? {});
|
|
149
|
+
store.setActiveViewportTab('play');
|
|
150
|
+
store.notifyIngestEdit();
|
|
151
|
+
clearMountFailureReports(); // D-W3: mount succeeded
|
|
152
|
+
|
|
153
|
+
// Measured from the mounted adapter rather than declared by the route.
|
|
154
|
+
const reach = measureAdapterReach(mounted);
|
|
155
|
+
|
|
156
|
+
(window as unknown as Record<string, unknown>)['__vgaiModule'] = {
|
|
157
|
+
worldId: world.id,
|
|
158
|
+
adapterId,
|
|
159
|
+
reach,
|
|
160
|
+
...(import.meta.env.DEV ? { adapter: activeAuthoring, store } : {}),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Route 0 of `ingest/mount-ingest-root.ts`'s `autoLaunchIngest` (checked before the
|
|
166
|
+
* ingest routes — see that function's doc comment): a manifest-backed project
|
|
167
|
+
* whose FIRST world declares a `{ module }` adapter auto-mounts it. Same
|
|
168
|
+
* "applied or not" contract as `tryManifestIngestRoute`.
|
|
169
|
+
*
|
|
170
|
+
* D-V2 (composite): if the manifest declares ANY `{ ingest }` world (anywhere
|
|
171
|
+
* in `roots`, not just first), this route declines — composites are owned by
|
|
172
|
+
* the ingest routes (`ingest/mount-ingest-root.ts`'s `tryManifestIngestRoute*`), which
|
|
173
|
+
* mount the one ingest world through their own enter path and any `{ module
|
|
174
|
+
* }` SIBLING through the scoped runtime (`ingest-siblings.ts`, D-V4) instead
|
|
175
|
+
* of this single-world route's global-side-effect-laden mount. Without this
|
|
176
|
+
* guard, a composite whose FIRST world happens to be a `{ module }` sibling
|
|
177
|
+
* (array order is manifest order, independent of which world is the primary
|
|
178
|
+
* ingest) would be mis-mounted here as if it were a standalone module world.
|
|
179
|
+
* This route's own `firstRoot.adapter.type !== 'module'` behavior for a
|
|
180
|
+
* non-composite manifest is otherwise untouched.
|
|
181
|
+
*/
|
|
182
|
+
export async function tryManifestModuleRoute(store: EditorShellStore): Promise<boolean> {
|
|
183
|
+
const manifest = await fetchGameManifest().catch(() => null);
|
|
184
|
+
if (manifest && ingestRoots(manifest).length > 0) return false;
|
|
185
|
+
const firstRoot = manifest ? declaredRoots(manifest)[0] : undefined;
|
|
186
|
+
if (firstRoot === undefined || firstRoot.adapter.type !== 'module') return false;
|
|
187
|
+
|
|
188
|
+
const project = getCurrentProject();
|
|
189
|
+
if (!project) {
|
|
190
|
+
editorConsole.error(
|
|
191
|
+
'Manifest declares a { module } world but no project is open — cannot auto-mount',
|
|
192
|
+
'adapter',
|
|
193
|
+
);
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
// No acquire/refuse here: `enterModuleModeFromManifestRoot` mounts into the Game
|
|
197
|
+
// document's container, so they own `acquireGameDocument` (see
|
|
198
|
+
// `ingest/mount-ingest-root.ts`'s module doc — a route-level refusal would
|
|
199
|
+
// pre-empt the mount and leave a bare console line instead of the
|
|
200
|
+
// mount-failure report below).
|
|
201
|
+
try {
|
|
202
|
+
await enterModuleModeFromManifestRoot(store, manifest!, firstRoot, project.rootPath);
|
|
203
|
+
} catch (err) {
|
|
204
|
+
editorConsole.error(`Manifest { module } auto-mount failed: ${err}`, 'adapter');
|
|
205
|
+
// The fourth of the four manifest-route catch blocks (three/pixi/react in
|
|
206
|
+
// ingest/mount-ingest-root.ts, this one for `{ module }` roots); same loud
|
|
207
|
+
// mount-failure-slot population.
|
|
208
|
+
addMountFailureReport({
|
|
209
|
+
worldId: firstRoot.id,
|
|
210
|
+
kind: firstRoot.surface,
|
|
211
|
+
identity: firstRoot.adapter.identity,
|
|
212
|
+
message: formatMountFailureMessage(err),
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
import { acquireLiveDocument, liveDocumentContainer } from '@volter/editor-core/live-document';
|
|
219
|
+
// THE MODULE LANE, as the host sees it (`live-session-registry.ts`).
|
|
220
|
+
import { registerLiveSession } from '@volter/editor-core/live-session-registry';
|
|
221
|
+
|
|
222
|
+
registerLiveSession({
|
|
223
|
+
id: 'module',
|
|
224
|
+
priority: 2,
|
|
225
|
+
mounted: isModuleModeActive,
|
|
226
|
+
playing: isModuleModeActive,
|
|
227
|
+
stop: exitModuleMode,
|
|
228
|
+
instanceContainer: () => null,
|
|
229
|
+
});
|