@volter/editor-game 0.5.65 → 0.5.66
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/contributions/generation.service.ts +2 -2
- package/contributions/generations.status.tsx +1 -1
- package/contributions/godot.palette.json +99 -0
- package/contributions/godot.style.ts +62 -0
- package/contributions/godot.view.ts +69 -0
- package/contributions/ingest.service.ts +3 -3
- package/contributions/play.command.ts +1 -1
- package/contributions/react/react-inspector.service.ts +2 -2
- package/contributions/scene-document.service.ts +3 -3
- package/contributions/three/component-verbs.command.ts +3 -3
- package/contributions/unity.palette.json +102 -0
- package/contributions/unity.style.ts +62 -0
- package/contributions/unity.view.ts +76 -0
- package/contributions/unreal.palette.json +105 -0
- package/contributions/unreal.style.ts +58 -0
- package/contributions/unreal.view.ts +88 -0
- package/dist-node/serving.mjs +16 -0
- package/package.json +21 -14
- package/serving/index.ts +27 -0
- package/src/asset-budget/asset-budget-model.ts +3 -3
- package/src/asset-budget/optimize-apply.ts +7 -7
- package/src/bridge/dispatch.ts +2 -2
- package/src/bridge/screenshot.ts +3 -3
- package/src/coverage/live-authoring-surface.ts +1 -1
- package/src/coverage/live-project-verbs.ts +1 -1
- package/src/coverage/native-system-coverage.ts +1 -1
- package/src/coverage/session-coverage.ts +2 -2
- package/src/design-system-stories/InspectorNarrowBodies.stories.tsx +10 -50
- package/src/game-document/GameCaptureFrameButton.tsx +1 -1
- package/src/game-document/GamePanel.tsx +4 -4
- package/src/generation/GenerationActivity.tsx +3 -5
- package/src/generation/generation-documents.tsx +3 -3
- package/src/generation/generation-jobs.ts +1 -1
- package/src/generation/generation-presentation.ts +1 -1
- package/src/host/adapter-reach.ts +1 -1
- package/src/host/adapter-runtime-bindings.ts +1 -1
- package/src/host/api/configurations.ts +2 -2
- package/src/host/authoring/babylon-authoring-adapter.ts +2 -2
- package/src/host/authoring/contract-hierarchy-authoring.ts +1 -1
- package/src/host/authoring/contract-scenes-stories.ts +1 -1
- package/src/host/authoring/creation-site-related.ts +2 -2
- package/src/host/authoring/ephemeral-persistence.ts +1 -1
- package/src/host/authoring/gesture-persist.ts +1 -1
- package/src/host/authoring/ingest-source-persistence.ts +4 -4
- package/src/host/authoring/mount-isolated-pixi-screen.ts +1 -1
- package/src/host/authoring/pixi-authoring-adapter.ts +2 -2
- package/src/host/authoring/pixi-live-write-target.ts +3 -3
- package/src/host/authoring/pixi-still-presentation.ts +1 -1
- package/src/host/authoring/pixi-structure-history.ts +1 -1
- package/src/host/authoring/source-persistence-backend.ts +3 -3
- package/src/host/authoring/struct-write-pipe.ts +2 -2
- package/src/host/browser-transpile.ts +1 -1
- package/src/host/canvas-entry-runtime.ts +1 -1
- package/src/host/components/HeaderTelemetry.tsx +5 -12
- package/src/host/components/PixiIsolationSceneContent.tsx +8 -7
- package/src/host/components/ThreeIsolationSceneContent.tsx +2 -2
- package/src/host/components/scene-document.tsx +15 -47
- package/src/host/components/world-root-stage-binding.tsx +6 -15
- package/src/host/components/world-root-stage.ts +60 -14
- package/src/host/coverage/capability-coverage.ts +13 -1
- package/src/host/coverage/game-contract-seam-evidence.ts +1 -1
- package/src/host/coverage/project-verb-coverage.ts +2 -17
- package/src/host/coverage/system-adapter-coverage.ts +1 -1
- package/src/host/design-system-stories/fixtures/editor-runtime.tsx +9 -1
- package/src/host/document-preview-three.ts +1 -1
- package/src/host/game-module-access.ts +1 -1
- package/src/host/game-realm-page.ts +15 -7
- package/src/host/game-realm-reclaim.ts +1 -1
- package/src/host/gated-globals.ts +4 -4
- package/src/host/history/json-history-resource.ts +2 -2
- package/src/host/instance-extract-actions.ts +1 -1
- package/src/host/instance-fork-actions.ts +1 -1
- package/src/host/projection/dom.ts +2 -2
- package/src/host/projection/pixi.ts +1 -1
- package/src/host/r3f-entry-runtime.ts +1 -1
- package/src/host/react-mount-runtime.ts +1 -1
- package/src/host/realm-services.ts +1 -1
- package/src/host/roots/module-root.ts +1 -1
- package/src/host/scene-view-drawability.ts +2 -2
- package/src/host/server-log-bridge.ts +1 -1
- package/src/host/three-ingest-runtime.ts +1 -1
- package/src/host/use-active-performance-source.ts +1 -1
- package/src/ingest/active-ingest.ts +1 -1
- package/src/ingest/authoring/ingest-root-adapter.ts +5 -5
- package/src/ingest/capture-wait-report.ts +1 -1
- package/src/ingest/deferred-ingest-play.ts +5 -4
- package/src/ingest/ingest-boot-viewport.ts +4 -6
- package/src/ingest/ingest-canvas-scene-document.tsx +9 -8
- package/src/ingest/ingest-canvas-scene.ts +2 -5
- package/src/ingest/ingest-play-control.ts +3 -3
- package/src/ingest/ingest-render-debug.ts +1 -1
- package/src/ingest/ingest-siblings.ts +3 -3
- package/src/ingest/module-mode.ts +4 -5
- package/src/ingest/mount-canvas-ingest-root.ts +6 -6
- package/src/ingest/mount-coverage.ts +2 -2
- package/src/ingest/mount-dom-ingest-root.ts +5 -5
- package/src/ingest/mount-ingest-root.ts +7 -7
- package/src/ingest/mount-three-ingest-root.ts +4 -4
- package/src/ingest/unmount-ingest-root.ts +2 -2
- package/src/play/play-mode.ts +30 -16
- package/src/play/play-recording.ts +1 -1
- package/src/profiler/PerformancePanel.tsx +1 -1
- package/src/react/design-time-react-mount.ts +17 -23
- package/src/react/dom-authoring-adapter.ts +2 -2
- package/src/react/react-inspector-section.tsx +8 -8
- package/src/react/react-world-authoring-adapter.ts +20 -132
- package/src/react/story-documents/story-documents.tsx +9 -13
- package/src/react/ui-board-document.tsx +3 -4
- package/src/react/ui-component-board.ts +3 -3
- package/src/three/authoring/camera-runtime-inspector-section.tsx +1 -1
- package/src/three/authoring/constraint-inspector-section.tsx +3 -3
- package/src/three/authoring/model-asset-inspector-section.tsx +7 -11
- package/src/three/authoring/oid-source-persistence.ts +6 -6
- package/src/three/authoring/r3f-design-session.ts +21 -7
- package/src/three/authoring/r3f-source-authoring-adapter.ts +17 -17
- package/src/three/authoring/reflection-probe-inspector-section.tsx +3 -3
- package/src/three/authoring/spatial-joint-handles.ts +1 -1
- package/src/three/authoring/spatial-lod-handles.ts +1 -1
- package/src/three/authoring/spatial-particle-handles.ts +1 -1
- package/src/three/authoring/three-authoring-adapter.ts +4 -4
- package/src/three/component-verbs/extract-menu.ts +1 -1
- package/src/three/component-verbs/fork-menu.ts +1 -1
- package/src/three/component-verbs/internals-menu.ts +1 -1
- package/src/three/drei-asset-caches.ts +13 -0
- package/src/three/story-documents/three-story-documents.tsx +11 -21
- package/src/three/three-board/ThreeBoardDocument.tsx +12 -13
- package/src/three/three-board/board-scene.ts +1 -1
- package/src/three/three-board/three-component-board.ts +3 -3
- package/contributions/react/pasteboard.action.ts +0 -41
- package/contributions/xstate-behavior.action.ts +0 -42
- package/contributions/xstate-behavior.document.tsx +0 -73
- package/contributions/xstate-behavior.inspector.tsx +0 -28
- package/contributions/xstate-behavior.menu.ts +0 -23
- package/src/react/pasteboard-materialize.ts +0 -154
- package/src/xstate/XStateBehaviorSection.tsx +0 -130
- package/src/xstate/XStateMachineInspector.tsx +0 -566
- package/src/xstate/character-animation-machine.fixture.ts +0 -74
- package/src/xstate/live-behaviors.ts +0 -106
- package/src/xstate/use-live-actor-state.ts +0 -44
- package/src/xstate/xstate-graph.ts +0 -235
- package/src/xstate/xstate-layout.ts +0 -76
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 3,
|
|
3
|
+
"name": "Unreal",
|
|
4
|
+
"theme": {
|
|
5
|
+
"id": "unreal",
|
|
6
|
+
"color": {
|
|
7
|
+
"surface": {
|
|
8
|
+
"shell": "#151515",
|
|
9
|
+
"panel": "#242424",
|
|
10
|
+
"chrome": "#151515",
|
|
11
|
+
"raised": "#383838",
|
|
12
|
+
"inset": "#0f0f0f",
|
|
13
|
+
"overlay": "rgba(36,36,36,0.97)"
|
|
14
|
+
},
|
|
15
|
+
"boundary": {
|
|
16
|
+
"default": "#151515",
|
|
17
|
+
"strong": "#0f0f0f",
|
|
18
|
+
"area": "#151515",
|
|
19
|
+
"indent": "#383838",
|
|
20
|
+
"divider": "#1a1a1a"
|
|
21
|
+
},
|
|
22
|
+
"content": {
|
|
23
|
+
"primary": "#c0c0c0",
|
|
24
|
+
"muted": "#b4b4b4",
|
|
25
|
+
"dim": "#858585",
|
|
26
|
+
"onAccent": "#ffffff",
|
|
27
|
+
"menu": "#c0c0c0",
|
|
28
|
+
"status": "#a7a7a7",
|
|
29
|
+
"placeholder": "#6d6d6d",
|
|
30
|
+
"active": "#4d9be9",
|
|
31
|
+
"selected": "#ffffff",
|
|
32
|
+
"onBright": {
|
|
33
|
+
"primary": "#151515",
|
|
34
|
+
"muted": "rgba(21,21,21,0.82)",
|
|
35
|
+
"dim": "rgba(21,21,21,0.7)"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"accent": {
|
|
39
|
+
"default": "#0f6ece",
|
|
40
|
+
"muted": "#40576f"
|
|
41
|
+
},
|
|
42
|
+
"widget": {
|
|
43
|
+
"regular": "#383838",
|
|
44
|
+
"menu": "#242424",
|
|
45
|
+
"field": "#0f0f0f",
|
|
46
|
+
"emboss": "rgba(0,0,0,0.2)"
|
|
47
|
+
},
|
|
48
|
+
"viewport": {
|
|
49
|
+
"background": "#000000",
|
|
50
|
+
"grid": "#5a5a5a",
|
|
51
|
+
"axisX": "#c02800",
|
|
52
|
+
"axisY": "#66a600",
|
|
53
|
+
"axisZ": "#2e75df",
|
|
54
|
+
"selection": "#eaa112",
|
|
55
|
+
"wire": "#eaa112",
|
|
56
|
+
"active": "#eaa112"
|
|
57
|
+
},
|
|
58
|
+
"gizmo": {
|
|
59
|
+
"x": "#c02800",
|
|
60
|
+
"y": "#66a600",
|
|
61
|
+
"z": "#2e75df",
|
|
62
|
+
"navigationX": "#ff0000",
|
|
63
|
+
"navigationY": "#00ff00",
|
|
64
|
+
"navigationZ": "#0000ff",
|
|
65
|
+
"hover": "#ffff00",
|
|
66
|
+
"drag": "#ffff00"
|
|
67
|
+
},
|
|
68
|
+
"region": {
|
|
69
|
+
"outliner": "#242424",
|
|
70
|
+
"properties": "#242424"
|
|
71
|
+
},
|
|
72
|
+
"category": {
|
|
73
|
+
"object": "#8fb8f0",
|
|
74
|
+
"modifier": "#8fb8f0",
|
|
75
|
+
"material": "#a27f4b",
|
|
76
|
+
"data": "#9fd88c",
|
|
77
|
+
"scene": "#c0c0c0",
|
|
78
|
+
"collection": "#c0c0c0",
|
|
79
|
+
"tool": "#c0c0c0",
|
|
80
|
+
"operator": "#9fd88c"
|
|
81
|
+
},
|
|
82
|
+
"semantic": {
|
|
83
|
+
"danger": "#ff6b5b",
|
|
84
|
+
"dangerMuted": "rgba(255,120,107,0.28)",
|
|
85
|
+
"dangerFaint": "rgba(255,120,107,0.12)",
|
|
86
|
+
"warning": "#ffc107",
|
|
87
|
+
"warningMuted": "rgba(255,221,101,0.28)",
|
|
88
|
+
"success": "#7cc576",
|
|
89
|
+
"successMuted": "rgba(69,255,139,0.28)",
|
|
90
|
+
"dynamic": "#ffdd65",
|
|
91
|
+
"dynamicMuted": "rgba(255,221,101,0.18)",
|
|
92
|
+
"instance": "#7bbcff"
|
|
93
|
+
},
|
|
94
|
+
"neutralOverlay": {
|
|
95
|
+
"hover": "rgba(255,255,255,0.1)",
|
|
96
|
+
"active": "rgba(255,255,255,0.16)"
|
|
97
|
+
},
|
|
98
|
+
"scrim": "rgba(0,0,0,0.6)"
|
|
99
|
+
},
|
|
100
|
+
"typography": {
|
|
101
|
+
"sans": "'Inter', 'Segoe UI', system-ui, sans-serif",
|
|
102
|
+
"mono": "'Roboto Mono', Menlo, monospace"
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE UNREAL LOOK — Unreal Engine 5's dark editor skin and its Level Editor viewport's
|
|
3
|
+
* colours, made only of values (`docs/VIEWPORT-STAGE.md`, the Unreal column).
|
|
4
|
+
*
|
|
5
|
+
* Unreal is not installed here and its documentation states none of these numbers, so every
|
|
6
|
+
* value is READ from the documentation's frames (`engine-reference/unreal/level-editor.png`,
|
|
7
|
+
* 1920 x 1020), not transcribed from source. The chrome: panels #242424 on a #151515 shell,
|
|
8
|
+
* #0f0f0f fields, the #0f6ece armed-tool blue, #40576f selected rows. The viewport: the
|
|
9
|
+
* selection outline's core #eaa112, about three pixels wide; the Move widget's axes, their
|
|
10
|
+
* brightest unshaded pixels (#c02800, #66a600, #2e75df); the corner triad's pure #ff0000,
|
|
11
|
+
* #00ff00, #0000ff. The fill is black, what an Unreal level with no sky shows.
|
|
12
|
+
* Light, sky and overlays are the VIEW's presentation, not this look's.
|
|
13
|
+
*/
|
|
14
|
+
import type { StyleContribution } from '@volter/editor-sdk/looks';
|
|
15
|
+
import palette from './unreal.palette.json';
|
|
16
|
+
|
|
17
|
+
export const point = 'workspace.style';
|
|
18
|
+
export const style: StyleContribution = {
|
|
19
|
+
id: 'unreal',
|
|
20
|
+
title: 'Unreal',
|
|
21
|
+
paletteId: 'unreal',
|
|
22
|
+
materialId: 'unreal',
|
|
23
|
+
material: {
|
|
24
|
+
id: 'unreal',
|
|
25
|
+
title: 'Unreal',
|
|
26
|
+
description: 'Near-black flat panels, four-pixel corners, pill-shaped viewport toolbar buttons.',
|
|
27
|
+
shape: { small: '4px', medium: '4px', large: '6px', full: '9999px' },
|
|
28
|
+
elevation: {
|
|
29
|
+
small: 'none',
|
|
30
|
+
medium: '0 2px 8px rgba(0,0,0,0.55)',
|
|
31
|
+
large: '0 6px 18px rgba(0,0,0,0.6)',
|
|
32
|
+
},
|
|
33
|
+
stage: {
|
|
34
|
+
// Unreal keeps its widget a constant size on screen; in `level-editor.png` the Move
|
|
35
|
+
// arrows reach 85 to 100 px from the centre sphere. Fitted, not transcribed.
|
|
36
|
+
gizmoSize: 128,
|
|
37
|
+
// The axis triad in the viewport's bottom-left corner (`level-editor.png`).
|
|
38
|
+
navigationGizmo: 'triad',
|
|
39
|
+
navigationCorner: 'bottom-left',
|
|
40
|
+
navigationSize: 1.3,
|
|
41
|
+
// Unreal's arrows end in slim cones about 14 px long on ~85 px shafts (`level-editor.png`),
|
|
42
|
+
// fitted side by side at 1x.
|
|
43
|
+
gizmoArrowLength: 0.85,
|
|
44
|
+
gizmoArrowHead: 0.8,
|
|
45
|
+
// A hard yellow-orange line about three pixels wide around the whole silhouette; the
|
|
46
|
+
// parts other objects hide are drawn too (dotted in Unreal, behind the table). Widths
|
|
47
|
+
// over 4 widen the blur kernel and the band goes pale and soft (measured: 5 peaks at
|
|
48
|
+
// #dfad6b over the sky), so 3 is the widest solid band the crisp form draws.
|
|
49
|
+
outlineStyle: 'crisp',
|
|
50
|
+
outlineWidth: 3,
|
|
51
|
+
outlineHidden: true,
|
|
52
|
+
gridLineWidth: 1,
|
|
53
|
+
gridMajorWidth: 1,
|
|
54
|
+
gridMajorContrast: 1.3,
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
palette,
|
|
58
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UNREAL'S DEFAULT LEVEL VIEWPORT: a preview sky standing in for the level's own, no grid, the
|
|
3
|
+
* outline, the Move tool with its free-move centre, a Z-up LEFT-handed world, and the axis
|
|
4
|
+
* triad as an indicator, and a preview floor taking the sun's shadow. The view's behaviour (tool,
|
|
5
|
+
* handles, axes, world, grid off) is read from `default-interface.png`; the sky, cloud and floor
|
|
6
|
+
* values are FITTED to `level-editor.png` (sampled pixel colours and a side-by-side), not
|
|
7
|
+
* transcribed from Unreal's own BP_Sky_Sphere or floor material.
|
|
8
|
+
* A named view (`@volter/editor-sdk/kit/viewport-presentation` `ViewPreset`): what the view does
|
|
9
|
+
* and how it is lit, never its look — pair it with the Unreal style for the whole target.
|
|
10
|
+
*/
|
|
11
|
+
import type { ViewPreset } from '@volter/editor-sdk/kit/viewport-presentation';
|
|
12
|
+
|
|
13
|
+
export const point = 'workspace.view';
|
|
14
|
+
export const view: ViewPreset = {
|
|
15
|
+
id: 'unreal',
|
|
16
|
+
title: 'Unreal',
|
|
17
|
+
layer: {
|
|
18
|
+
all: {
|
|
19
|
+
lighting: {
|
|
20
|
+
source: 'preview',
|
|
21
|
+
preview: {
|
|
22
|
+
sun: {
|
|
23
|
+
enabled: true,
|
|
24
|
+
color: '#ffffff',
|
|
25
|
+
energy: 2.5,
|
|
26
|
+
altitude: 45,
|
|
27
|
+
azimuth: 300,
|
|
28
|
+
shadowDistance: 100,
|
|
29
|
+
},
|
|
30
|
+
environment: {
|
|
31
|
+
enabled: true,
|
|
32
|
+
sky: {
|
|
33
|
+
top: '#566b8c',
|
|
34
|
+
horizon: '#8ea6bf',
|
|
35
|
+
ground: '#2b323b',
|
|
36
|
+
topCurve: 0.1,
|
|
37
|
+
groundCurve: 0.12,
|
|
38
|
+
clouds: { cover: 0.55, opacity: 0.9, scale: 16 },
|
|
39
|
+
},
|
|
40
|
+
energy: 1,
|
|
41
|
+
rotation: 0,
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
tone: {
|
|
45
|
+
mapper: 'none',
|
|
46
|
+
exposure: 1,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
backdrop: {
|
|
50
|
+
source: 'environment',
|
|
51
|
+
opacity: 1,
|
|
52
|
+
blur: 0,
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
overlays: {
|
|
56
|
+
navigation: 'indicator',
|
|
57
|
+
grid: {
|
|
58
|
+
visible: false,
|
|
59
|
+
},
|
|
60
|
+
floor: {
|
|
61
|
+
visible: true,
|
|
62
|
+
color: '#0a1428',
|
|
63
|
+
},
|
|
64
|
+
selection: {
|
|
65
|
+
outline: true,
|
|
66
|
+
wire: false,
|
|
67
|
+
box: false,
|
|
68
|
+
},
|
|
69
|
+
axes: {
|
|
70
|
+
x: false,
|
|
71
|
+
y: false,
|
|
72
|
+
z: false,
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
interaction: {
|
|
76
|
+
bootTool: 'move',
|
|
77
|
+
transformHandles: {
|
|
78
|
+
scale: false,
|
|
79
|
+
viewRotate: false,
|
|
80
|
+
freeMove: true,
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
world: {
|
|
84
|
+
upAxis: 'z',
|
|
85
|
+
handedness: 'left',
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// serving/index.ts
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
var GAME_MODULE_ACCESS = "@editor/game-module-access";
|
|
4
|
+
var ALIASED_GAME_MODULE_ACCESS = /\/editor-core\/src\/game-module-access$/;
|
|
5
|
+
var servingPlugins = (_services) => [
|
|
6
|
+
{
|
|
7
|
+
name: "volter-editor-game:game-module-access",
|
|
8
|
+
enforce: "pre",
|
|
9
|
+
resolveId(id) {
|
|
10
|
+
return id === GAME_MODULE_ACCESS || ALIASED_GAME_MODULE_ACCESS.test(id) ? fileURLToPath(new URL("../src/host/game-module-access.ts", import.meta.url)) : null;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
];
|
|
14
|
+
export {
|
|
15
|
+
servingPlugins
|
|
16
|
+
};
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@volter/editor-game",
|
|
3
3
|
"author": "Volter AI, Inc.",
|
|
4
4
|
"license": "AGPL-3.0-only",
|
|
5
|
-
"version": "0.5.
|
|
5
|
+
"version": "0.5.66",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
8
8
|
},
|
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
},
|
|
16
16
|
"files": [
|
|
17
17
|
"src",
|
|
18
|
+
"serving",
|
|
18
19
|
"contributions",
|
|
20
|
+
"dist-node",
|
|
19
21
|
"LICENSE",
|
|
20
22
|
"NOTICE"
|
|
21
23
|
],
|
|
@@ -51,6 +53,8 @@
|
|
|
51
53
|
"./contributions/gameplay.command.ts",
|
|
52
54
|
"./contributions/generation.service.ts",
|
|
53
55
|
"./contributions/generations.status.tsx",
|
|
56
|
+
"./contributions/godot.style.ts",
|
|
57
|
+
"./contributions/godot.view.ts",
|
|
54
58
|
"./contributions/ingest.service.ts",
|
|
55
59
|
"./contributions/instances.command.ts",
|
|
56
60
|
"./contributions/navmesh.menu.ts",
|
|
@@ -66,13 +70,12 @@
|
|
|
66
70
|
"./contributions/state-watch.utility.tsx",
|
|
67
71
|
"./contributions/team-playtest.service.ts",
|
|
68
72
|
"./contributions/transport.header.tsx",
|
|
69
|
-
"./contributions/
|
|
70
|
-
"./contributions/
|
|
71
|
-
"./contributions/
|
|
72
|
-
"./contributions/
|
|
73
|
+
"./contributions/unity.style.ts",
|
|
74
|
+
"./contributions/unity.view.ts",
|
|
75
|
+
"./contributions/unreal.style.ts",
|
|
76
|
+
"./contributions/unreal.view.ts",
|
|
73
77
|
"./contributions/react/component-board.service.ts",
|
|
74
78
|
"./contributions/react/design-time-mount.service.ts",
|
|
75
|
-
"./contributions/react/pasteboard.action.ts",
|
|
76
79
|
"./contributions/react/react-inspector.service.ts",
|
|
77
80
|
"./contributions/react/story-documents.service.ts",
|
|
78
81
|
"./contributions/three/camera-runtime.inspector.tsx",
|
|
@@ -84,15 +87,16 @@
|
|
|
84
87
|
"./contributions/three/reflection-probe-capture.inspector.tsx",
|
|
85
88
|
"./contributions/three/story-documents.service.ts",
|
|
86
89
|
"./contributions/three/three-authoring.service.ts"
|
|
87
|
-
]
|
|
90
|
+
],
|
|
91
|
+
"serving": "./dist-node/serving.mjs"
|
|
88
92
|
},
|
|
89
93
|
"dependencies": {
|
|
90
|
-
"@volter/editor-core": "0.5.
|
|
91
|
-
"@volter/editor-sdk": "0.5.
|
|
92
|
-
"@volter/editor-project": "0.5.
|
|
93
|
-
"@volter/editor-threejs": "0.5.
|
|
94
|
-
"@volter/threejs-runtime": "0.5.
|
|
95
|
-
"@volter/game-runtime": "0.5.
|
|
94
|
+
"@volter/editor-core": "0.5.66",
|
|
95
|
+
"@volter/editor-sdk": "0.5.66",
|
|
96
|
+
"@volter/editor-project": "0.5.66",
|
|
97
|
+
"@volter/editor-threejs": "0.5.66",
|
|
98
|
+
"@volter/threejs-runtime": "0.5.66",
|
|
99
|
+
"@volter/game-runtime": "0.5.66",
|
|
96
100
|
"@colyseus/schema": "^4.0.14",
|
|
97
101
|
"@colyseus/sdk": "^0.17.34",
|
|
98
102
|
"@fortawesome/free-solid-svg-icons": "^7.2.0",
|
|
@@ -122,7 +126,8 @@
|
|
|
122
126
|
"recast-navigation": "^0.43.0",
|
|
123
127
|
"xstate": "^5.32.4",
|
|
124
128
|
"zod": "^4.3.6",
|
|
125
|
-
"@fortawesome/fontawesome-svg-core": "^7.2.0"
|
|
129
|
+
"@fortawesome/fontawesome-svg-core": "^7.2.0",
|
|
130
|
+
"@volter/editor-react": "0.5.66"
|
|
126
131
|
},
|
|
127
132
|
"peerDependencies": {
|
|
128
133
|
"@sparkjsdev/spark": "^2.1.0",
|
|
@@ -134,6 +139,8 @@
|
|
|
134
139
|
"@playwright/test": "^1.58.2"
|
|
135
140
|
},
|
|
136
141
|
"scripts": {
|
|
142
|
+
"build": "node scripts/build-serving.mjs",
|
|
143
|
+
"prepack": "npm run build",
|
|
137
144
|
"typecheck": "tsc -p tsconfig.json"
|
|
138
145
|
},
|
|
139
146
|
"peerDependenciesMeta": {
|
package/serving/index.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@volter/editor-game`'s server half (`package.json#vgai.serving`): the one deep specifier a
|
|
3
|
+
* game's own contributions name, `@editor/game-module-access` (the template's
|
|
4
|
+
* `src/contributions/use-game-modules.ts`), resolved to this package's module. The page
|
|
5
|
+
* bundle maps the same specifier for its own copy (`src/host/served-bundle-runtime-modules.ts`);
|
|
6
|
+
* a contribution the session's Vite serves needs the file.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { fileURLToPath } from 'node:url';
|
|
10
|
+
import type { ProjectServingServices } from '@volter/editor-sdk/session/project-serving';
|
|
11
|
+
|
|
12
|
+
const GAME_MODULE_ACCESS = '@editor/game-module-access';
|
|
13
|
+
/** The kit's `@editor/*` alias runs before any plugin and rewrites the specifier to the kit's
|
|
14
|
+
* own `src/`, where this module no longer lives; that form is this package's too. */
|
|
15
|
+
const ALIASED_GAME_MODULE_ACCESS = /\/editor-core\/src\/game-module-access$/;
|
|
16
|
+
|
|
17
|
+
export const servingPlugins = (_services: ProjectServingServices): readonly unknown[] => [
|
|
18
|
+
{
|
|
19
|
+
name: 'volter-editor-game:game-module-access',
|
|
20
|
+
enforce: 'pre',
|
|
21
|
+
resolveId(id: string): string | null {
|
|
22
|
+
return id === GAME_MODULE_ACCESS || ALIASED_GAME_MODULE_ACCESS.test(id)
|
|
23
|
+
? fileURLToPath(new URL('../src/host/game-module-access.ts', import.meta.url))
|
|
24
|
+
: null;
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
];
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
* raw attribute/index bytes for geometry.
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
-
import { sha256Hex } from '@volter/editor-
|
|
25
|
-
import type
|
|
24
|
+
import { sha256Hex } from '@volter/editor-sdk/kit/bytes-codec';
|
|
25
|
+
import { isPublicRootedBackend, type StorageBackend } from '@volter/editor-sdk/kit/storage-types';
|
|
26
26
|
import type { Document } from '@gltf-transform/core';
|
|
27
27
|
import { inspect } from '@gltf-transform/functions';
|
|
28
28
|
import { getGltfIO } from './gltf-io';
|
|
@@ -482,7 +482,7 @@ export async function collectProjectBudgetSource(
|
|
|
482
482
|
// `/vgai.project.json` (`manifest-project.ts`) and the `.vgai/`-scoped
|
|
483
483
|
// `/__editor/vgai-file` route (`project-provenance.ts`). Anything
|
|
484
484
|
// unavailable stays honestly absent — no fabricated owners or stamps.
|
|
485
|
-
if (backend
|
|
485
|
+
if (isPublicRootedBackend(backend)) {
|
|
486
486
|
const ownerFiles: AssetBudgetFile[] = [];
|
|
487
487
|
const virtualTexts = new Map<string, string>();
|
|
488
488
|
try {
|
|
@@ -20,11 +20,11 @@
|
|
|
20
20
|
* happened, so the failure is returned for the UI to surface.
|
|
21
21
|
*/
|
|
22
22
|
|
|
23
|
-
import { sha256Hex } from '@volter/editor-
|
|
24
|
-
import { assertEditorServerAnswered } from '@volter/editor-
|
|
25
|
-
import { sourceMutationAttribution } from '@volter/editor-
|
|
26
|
-
import { handleProjectMutationFailure } from '@volter/editor-
|
|
27
|
-
import type
|
|
23
|
+
import { sha256Hex } from '@volter/editor-sdk/kit/bytes-codec';
|
|
24
|
+
import { assertEditorServerAnswered } from '@volter/editor-sdk/kit/editor-server-response';
|
|
25
|
+
import { sourceMutationAttribution } from '@volter/editor-sdk/kit/editor-session-attribution';
|
|
26
|
+
import { handleProjectMutationFailure } from '@volter/editor-sdk/kit/source-conflict';
|
|
27
|
+
import { isPublicRootedBackend, type StorageBackend } from '@volter/editor-sdk/kit/storage-types';
|
|
28
28
|
import { invalidateCachedAsset } from '@volter/threejs-runtime/asset-loaders';
|
|
29
29
|
|
|
30
30
|
const PROVENANCE_PATH = '.vgai/provenance.json';
|
|
@@ -82,7 +82,7 @@ function ledgerAssetPath(storagePath: string): string {
|
|
|
82
82
|
* backend reaches the project root directly.
|
|
83
83
|
*/
|
|
84
84
|
async function readLedgerText(backend: StorageBackend): Promise<string | null> {
|
|
85
|
-
if (backend
|
|
85
|
+
if (isPublicRootedBackend(backend)) {
|
|
86
86
|
// NOT read through `editor-server-response.ts`: the GET half of this route
|
|
87
87
|
// answers `text/plain` (routes/project-source.ts) because it serves raw
|
|
88
88
|
// file bytes, and that reader's whole rule is "the editor server answers
|
|
@@ -99,7 +99,7 @@ async function readLedgerText(backend: StorageBackend): Promise<string | null> {
|
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
async function writeLedgerText(backend: StorageBackend, content: string): Promise<void> {
|
|
102
|
-
if (backend
|
|
102
|
+
if (isPublicRootedBackend(backend)) {
|
|
103
103
|
const write = async () => {
|
|
104
104
|
const res = await fetch('/__editor/vgai-file', {
|
|
105
105
|
method: 'POST',
|
package/src/bridge/dispatch.ts
CHANGED
|
@@ -16,8 +16,8 @@ import {
|
|
|
16
16
|
} from '@volter/editor-core/authoring/active-systems';
|
|
17
17
|
import { collectPlayRunPageErrors } from '@volter/editor-core/command-listener';
|
|
18
18
|
import { gameContractEpoch } from '../host/coverage/game-contract-seam-evidence';
|
|
19
|
-
import { recordLiveSeamEvidence } from '@volter/editor-
|
|
20
|
-
import { systemAdapterEpoch } from '@volter/editor-
|
|
19
|
+
import { recordLiveSeamEvidence } from '@volter/editor-sdk/kit/live-seam-evidence';
|
|
20
|
+
import { systemAdapterEpoch } from '@volter/editor-sdk/kit/system-seam-evidence';
|
|
21
21
|
import {
|
|
22
22
|
HOLD_STARVED_NO_DRIVER_REASON,
|
|
23
23
|
waitForHoldBudget,
|
package/src/bridge/screenshot.ts
CHANGED
|
@@ -6,15 +6,15 @@
|
|
|
6
6
|
* `@editor/*` alias until those modules move too. Nothing here is host API.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { commandLine } from '@volter/editor-
|
|
9
|
+
import { commandLine } from '@volter/editor-sdk/kit/product-command';
|
|
10
10
|
import {
|
|
11
11
|
type CaptureFlatness,
|
|
12
12
|
CaptureLayerError,
|
|
13
13
|
capturePlayComposite,
|
|
14
14
|
sampleFlatness,
|
|
15
15
|
} from '@volter/editor-core/composite-screenshot';
|
|
16
|
-
import { editorConsole } from '@volter/editor-
|
|
17
|
-
import { presentationSurface } from '@volter/editor-
|
|
16
|
+
import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
|
|
17
|
+
import { presentationSurface } from '@volter/editor-sdk/kit/presentation-surface';
|
|
18
18
|
import type { EditorCommandMessage, EditorCommandResult } from '@volter/editor-sdk/commands';
|
|
19
19
|
import { notPlayingResult, structuredErrorResult } from '../command-results';
|
|
20
20
|
import { isIngestActive } from '../ingest/active-ingest';
|
|
@@ -14,7 +14,7 @@ import { getCurrentProject } from '@volter/editor-core/project-manager';
|
|
|
14
14
|
import { authoringSurfaceFromTable } from '@volter/editor-core/scene-document-plan';
|
|
15
15
|
import { projectStoriesReady } from '@volter/editor-core/stories/story-registry';
|
|
16
16
|
import { availableWorkspaceDocuments } from '@volter/editor-core/workspace-available-documents';
|
|
17
|
-
import { openWorkspaceDocuments } from '@volter/editor-
|
|
17
|
+
import { openWorkspaceDocuments } from '@volter/editor-sdk/kit/workspace-document-registry';
|
|
18
18
|
|
|
19
19
|
export function authoringSurfaceCoverage(): CapabilityCoverageReport | null {
|
|
20
20
|
const facet = projectAdapterFacet();
|
|
@@ -38,7 +38,7 @@ import {
|
|
|
38
38
|
type ProjectRootFact,
|
|
39
39
|
type ProjectVerbFacts,
|
|
40
40
|
} from '../host/coverage/project-verb-coverage';
|
|
41
|
-
import { editorServerJson } from '@volter/editor-
|
|
41
|
+
import { editorServerJson } from '@volter/editor-sdk/kit/editor-server-response';
|
|
42
42
|
import { getCurrentProject } from '@volter/editor-core/project-manager';
|
|
43
43
|
|
|
44
44
|
/** What the server answers on `/__editor/project-verbs` — facts only. */
|
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
deriveCapabilityCoverage,
|
|
36
36
|
} from '../host/coverage/capability-coverage';
|
|
37
37
|
import { measureNativeSystemAdapters } from '../host/coverage/system-adapter-coverage';
|
|
38
|
-
import { liveCoverage } from '@volter/editor-
|
|
38
|
+
import { liveCoverage } from '@volter/editor-sdk/kit/live-session-registry';
|
|
39
39
|
import { getCurrentProject } from '@volter/editor-core/project-manager';
|
|
40
40
|
import { toolContributionPlay } from '@volter/editor-core/tool-contribution-play';
|
|
41
41
|
import type { DeclaredSystemAbsence, Game } from '@volter/game-runtime/runtime/game';
|
|
@@ -35,8 +35,8 @@ import {
|
|
|
35
35
|
formatCapabilityCoverageBlocks,
|
|
36
36
|
unionCoverageReport,
|
|
37
37
|
} from '../host/coverage/capability-coverage';
|
|
38
|
-
import { editorConsole } from '@volter/editor-
|
|
39
|
-
import { editorIsPlaying } from '@volter/editor-
|
|
38
|
+
import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
|
|
39
|
+
import { editorIsPlaying } from '@volter/editor-sdk/kit/editor-session-mode';
|
|
40
40
|
import { projectAdapterFacet } from '@volter/editor-core/project-adapter';
|
|
41
41
|
import { getCurrentProject } from '@volter/editor-core/project-manager';
|
|
42
42
|
import { authoringSurfaceCoverage } from './live-authoring-surface';
|
|
@@ -14,9 +14,6 @@
|
|
|
14
14
|
* subject wrapping them is synthetic (a live react/DOM subject needs a
|
|
15
15
|
* running document session + OID index, not constructible in a bounded
|
|
16
16
|
* story).
|
|
17
|
-
* - State machine — the REAL `XStateMachineInspector` over the REAL
|
|
18
|
-
* `characterAnimationMachine` fixture. Fully real; no live actor is needed
|
|
19
|
-
* (the static graph view is the design-time state).
|
|
20
17
|
* - Ingest coverage — the REAL `ingestCoverageSection(deriveCapabilityCoverage(…))`
|
|
21
18
|
* section, the exact one the Game Inspector composes.
|
|
22
19
|
* - Typed-three groups — a REAL composed subject: `AuthoringInspectorSurface`
|
|
@@ -31,20 +28,20 @@
|
|
|
31
28
|
|
|
32
29
|
import { UNCAPTURED_REACH } from '../host/adapter-reach';
|
|
33
30
|
import { SourceObject3DAuthoringAdapter } from '@volter/editor-core/authoring/source-object3d-authoring-adapter';
|
|
34
|
-
import {
|
|
31
|
+
import { faPalette } from '@fortawesome/free-solid-svg-icons';
|
|
35
32
|
import type { Meta, StoryObj } from '@storybook/react';
|
|
36
33
|
import { type ReactNode, useState } from 'react';
|
|
37
34
|
import * as THREE from 'three';
|
|
38
35
|
// Side-effect: registers the model-asset section contributions (Geometry,
|
|
39
36
|
// Animation, Materials, Source) into the inspector-section registry.
|
|
40
37
|
import '@volter/editor-core/authoring/model-asset-inspector-section';
|
|
41
|
-
import { ingestCoverageSection } from '@volter/editor-
|
|
38
|
+
import { ingestCoverageSection } from '@volter/editor-sdk/kit/CapabilityCoverageSection';
|
|
42
39
|
import { InspectionProjectionView } from '@volter/editor-core/components/InspectionProjection';
|
|
43
40
|
import { AuthoringInspectorSurface } from '@volter/editor-core/components/Inspector';
|
|
44
41
|
import { deriveCapabilityCoverage } from '../host/coverage/capability-coverage';
|
|
45
42
|
import { createAuthoringFixture } from '../host/design-system-stories/fixtures/authoring';
|
|
46
|
-
import { StoryEditorRuntime } from '../host/design-system-stories/fixtures/editor-runtime';
|
|
47
|
-
import type { InspectionSection, InspectionSubject } from '@volter/editor-
|
|
43
|
+
import { StoryEditorRuntime, storyThreeStore } from '../host/design-system-stories/fixtures/editor-runtime';
|
|
44
|
+
import type { InspectionSection, InspectionSubject } from '@volter/editor-sdk/kit/inspection-model';
|
|
48
45
|
import {
|
|
49
46
|
AlignmentGrid,
|
|
50
47
|
type AlignmentValue,
|
|
@@ -65,8 +62,6 @@ import {
|
|
|
65
62
|
uniformBorder,
|
|
66
63
|
uniformRadius,
|
|
67
64
|
} from '@volter/editor-sdk/widgets';
|
|
68
|
-
import { characterAnimationMachine } from '../xstate/character-animation-machine.fixture';
|
|
69
|
-
import { XStateMachineInspector } from '../xstate/XStateMachineInspector';
|
|
70
65
|
|
|
71
66
|
/** The narrow column's target width. `overflow: hidden` so a body that was
|
|
72
67
|
* built wider than the rail SPILLS visibly instead of scrolling. */
|
|
@@ -208,28 +203,6 @@ const cssSubject = columnSubject({
|
|
|
208
203
|
],
|
|
209
204
|
});
|
|
210
205
|
|
|
211
|
-
// ---- State machine (real inspector + real fixture machine) ---------------
|
|
212
|
-
|
|
213
|
-
const stateMachineSubject = columnSubject({
|
|
214
|
-
id: 'asset:character-animation',
|
|
215
|
-
title: 'Character Animation',
|
|
216
|
-
kindLabel: 'State machine',
|
|
217
|
-
sections: [
|
|
218
|
-
customSection(
|
|
219
|
-
'state-machine',
|
|
220
|
-
'State machine',
|
|
221
|
-
faBrain,
|
|
222
|
-
4000,
|
|
223
|
-
<div style={{ height: 300, minHeight: 0 }}>
|
|
224
|
-
<XStateMachineInspector
|
|
225
|
-
machine={characterAnimationMachine}
|
|
226
|
-
currentStateId="character-animation.idle"
|
|
227
|
-
/>
|
|
228
|
-
</div>,
|
|
229
|
-
),
|
|
230
|
-
],
|
|
231
|
-
});
|
|
232
|
-
|
|
233
206
|
// ---- Ingest coverage (the real composed section) -------------------------
|
|
234
207
|
|
|
235
208
|
const coverageReport = deriveCapabilityCoverage({
|
|
@@ -337,20 +310,7 @@ export const CssEditorsColumn: Story = {
|
|
|
337
310
|
),
|
|
338
311
|
};
|
|
339
312
|
|
|
340
|
-
/** (2) The real
|
|
341
|
-
export const StateMachineColumn: Story = {
|
|
342
|
-
render: () => (
|
|
343
|
-
<RailColumn>
|
|
344
|
-
<InspectionProjectionView
|
|
345
|
-
subject={stateMachineSubject}
|
|
346
|
-
presentation="column"
|
|
347
|
-
surface="asset-lab"
|
|
348
|
-
/>
|
|
349
|
-
</RailColumn>
|
|
350
|
-
),
|
|
351
|
-
};
|
|
352
|
-
|
|
353
|
-
/** (3) The real ingest coverage section. */
|
|
313
|
+
/** (2) The real ingest coverage section. */
|
|
354
314
|
export const IngestCoverageColumn: Story = {
|
|
355
315
|
render: () => (
|
|
356
316
|
<RailColumn>
|
|
@@ -359,7 +319,7 @@ export const IngestCoverageColumn: Story = {
|
|
|
359
319
|
),
|
|
360
320
|
};
|
|
361
321
|
|
|
362
|
-
/** (
|
|
322
|
+
/** (3) Typed-three grouped descriptor bodies — a real composed mesh subject
|
|
363
323
|
* (Material / Gameplay groups + loose fields). */
|
|
364
324
|
export const TypedThreeGroupsColumn: Story = {
|
|
365
325
|
render: () => {
|
|
@@ -369,7 +329,7 @@ export const TypedThreeGroupsColumn: Story = {
|
|
|
369
329
|
{(runtime) => (
|
|
370
330
|
<RailColumn>
|
|
371
331
|
<AuthoringInspectorSurface
|
|
372
|
-
store={runtime
|
|
332
|
+
store={storyThreeStore(runtime)}
|
|
373
333
|
adapter={adapter}
|
|
374
334
|
documentSelection={{ adapter, nodeId: 'player' }}
|
|
375
335
|
presentation="column"
|
|
@@ -382,17 +342,17 @@ export const TypedThreeGroupsColumn: Story = {
|
|
|
382
342
|
},
|
|
383
343
|
};
|
|
384
344
|
|
|
385
|
-
/** (
|
|
345
|
+
/** (4) Model-asset sections — a real composed subject (Geometry / Animation /
|
|
386
346
|
* Materials / Source) from a hand-authored THREE scene. */
|
|
387
347
|
export const ModelAssetColumn: Story = {
|
|
388
348
|
render: () => (
|
|
389
349
|
<StoryEditorRuntime>
|
|
390
350
|
{(runtime) => {
|
|
391
|
-
const adapter = buildModelAdapter(runtime
|
|
351
|
+
const adapter = buildModelAdapter(storyThreeStore(runtime));
|
|
392
352
|
return (
|
|
393
353
|
<RailColumn>
|
|
394
354
|
<AuthoringInspectorSurface
|
|
395
|
-
store={runtime
|
|
355
|
+
store={storyThreeStore(runtime)}
|
|
396
356
|
adapter={adapter}
|
|
397
357
|
documentSelection={{ adapter, nodeId: adapter.documentId }}
|
|
398
358
|
presentation="column"
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* the button stays on this side of the line with the store and model it reads.
|
|
12
12
|
*/
|
|
13
13
|
import { getInspectedRenderDebug } from '@volter/editor-core/authoring/active-systems';
|
|
14
|
-
import { useAvailabilitySelector } from '@volter/editor-
|
|
14
|
+
import { useAvailabilitySelector } from '@volter/editor-sdk/kit/availability-tick';
|
|
15
15
|
import { deriveRenderDebugCapabilities } from '../host/components/frame-debugger-model';
|
|
16
16
|
import { profilerView } from '../host/components/utility-view-state';
|
|
17
17
|
import { Button } from '@volter/editor-sdk/widgets';
|