@volter/editor-game 0.5.65 → 0.5.67
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/audio-unlock.service.ts +2 -2
- package/contributions/autoplay.service.ts +1 -1
- package/contributions/bridge.command.ts +3 -3
- package/contributions/canvas/component-board.service.ts +16 -0
- package/contributions/canvas/design-time-mount.service.ts +45 -0
- package/contributions/canvas-story-capture.service.ts +12 -0
- package/contributions/edit-mode-audio.service.ts +2 -2
- package/contributions/edit-mode-networking.service.ts +1 -1
- package/contributions/gameplay.command.ts +4 -4
- package/contributions/generation.service.ts +3 -3
- package/contributions/generations.status.tsx +1 -1
- package/contributions/godot.palette.json +99 -0
- package/contributions/godot.style.ts +82 -0
- package/contributions/godot.view.ts +75 -0
- package/contributions/ingest.service.ts +4 -4
- package/contributions/instances.command.ts +1 -1
- package/contributions/navmesh.menu.ts +1 -1
- package/contributions/network-observer.service.ts +14 -0
- package/contributions/play.command.ts +11 -5
- package/contributions/react/component-board.service.ts +1 -1
- package/contributions/react/design-time-mount.service.ts +1 -1
- package/contributions/react/react-inspector.service.ts +2 -2
- package/contributions/scene-document.service.ts +5 -5
- package/contributions/state-watch.menu.ts +1 -1
- package/contributions/state-watch.utility.tsx +1 -1
- package/contributions/team-playtest.service.ts +4 -4
- package/contributions/three/component-board.service.ts +1 -1
- package/contributions/three/component-verbs.command.ts +8 -8
- package/contributions/three/three-authoring.service.ts +8 -5
- package/contributions/three-story-capture.service.ts +12 -0
- package/contributions/unity.palette.json +102 -0
- package/contributions/unity.style.ts +72 -0
- package/contributions/unity.view.ts +82 -0
- package/contributions/unreal.palette.json +105 -0
- package/contributions/unreal.style.ts +66 -0
- package/contributions/unreal.view.ts +93 -0
- package/dist-node/serving.mjs +16 -0
- package/package.json +33 -16
- package/serving/index.ts +27 -0
- package/src/asset-budget/AssetBudgetPanel.tsx +1 -1
- package/src/asset-budget/asset-budget-model.ts +4 -4
- package/src/asset-budget/optimize-apply.ts +7 -7
- package/src/audio/AudioDebuggerPanel.tsx +1 -1
- package/src/bridge/dispatch.ts +16 -16
- package/src/bridge/live-frames.ts +1 -1
- package/src/bridge/screenshot.ts +6 -6
- package/src/build/BuildProfilesPanel.tsx +3 -3
- package/src/canvas/canvas-board/CanvasBoardDocument.tsx +676 -0
- package/src/canvas/canvas-board/canvas-board-model.ts +407 -0
- package/src/canvas/canvas-board/canvas-component-board.ts +56 -0
- package/src/canvas/canvas-design-mount.ts +524 -0
- package/src/canvas/design-time-canvas-mount.ts +79 -0
- package/src/coverage/live-authoring-surface.ts +6 -6
- package/src/coverage/live-project-verbs.ts +2 -2
- package/src/coverage/native-system-coverage.ts +6 -6
- package/src/coverage/root-coverage.ts +1 -1
- package/src/coverage/session-coverage.ts +5 -5
- package/src/design-system-stories/ApplicationChrome.stories.tsx +5 -5
- package/src/design-system-stories/InspectorNarrowBodies.stories.tsx +13 -53
- package/src/edit-mode/edit-mode-audio.ts +4 -4
- package/src/edit-mode/edit-mode-networking.ts +2 -2
- package/src/game-document/GameCaptureFrameButton.tsx +2 -2
- package/src/game-document/GameDocument.tsx +2 -2
- package/src/game-document/GamePanel.tsx +8 -8
- package/src/game-document/InstanceInspectorPicker.tsx +2 -2
- package/src/game-document/crowd-debug.ts +1 -1
- package/src/game-document/device-preview.ts +10 -11
- package/src/game-document/physics-debug.ts +1 -1
- package/src/generation/GenerationActivity.tsx +6 -8
- package/src/generation/generation-documents.tsx +8 -8
- package/src/generation/generation-jobs.ts +2 -2
- package/src/generation/generation-presentation.ts +1 -1
- package/src/host/adapter-reach.ts +1 -1
- package/src/host/adapter-runtime-bindings.ts +97 -6
- package/src/host/api/configurations.ts +2 -2
- package/src/host/authoring/babylon-authoring-adapter.ts +8 -8
- 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 +2 -2
- package/src/host/authoring/ingest-data-writer.ts +1 -1
- package/src/host/authoring/ingest-source-persistence.ts +8 -8
- package/src/host/authoring/mount-isolated-pixi-screen.ts +1 -1
- package/src/host/authoring/mounted-authoring.ts +4 -4
- package/src/host/authoring/phaser-live-authoring-adapter.ts +4 -4
- package/src/host/authoring/pixi-authoring-adapter.ts +42 -17
- package/src/host/authoring/pixi-creation-site-write-target.ts +2 -2
- package/src/host/authoring/pixi-live-write-target.ts +7 -7
- package/src/host/authoring/pixi-source-identity.ts +3 -3
- package/src/host/authoring/pixi-source-write-target.ts +1614 -0
- package/src/host/authoring/pixi-still-presentation.ts +2 -2
- package/src/host/authoring/pixi-structure-history.ts +3 -3
- package/src/host/authoring/pixi-transform-channels.ts +16 -14
- package/src/host/authoring/source-persistence-backend.ts +6 -6
- package/src/host/authoring/struct-write-pipe.ts +3 -3
- package/src/host/binding-resolver.ts +8 -9
- package/src/host/browser-transpile.ts +2 -2
- package/src/host/canvas-entry-runtime.ts +59 -48
- package/src/host/canvas-preview-frames.ts +482 -0
- package/src/host/components/CameraAuthoringOverlay.tsx +1 -1
- package/src/host/components/HeaderTelemetry.tsx +9 -16
- package/src/host/components/PixiIsolationSceneContent.tsx +17 -16
- package/src/host/components/ThreeIsolationSceneContent.tsx +5 -5
- package/src/host/components/frame-debugger-model.ts +2 -2
- package/src/host/components/header-telemetry-model.ts +2 -2
- package/src/host/components/scene-document.tsx +29 -61
- package/src/host/components/utility-view-state.ts +1 -1
- package/src/host/components/world-root-stage-binding.tsx +17 -26
- package/src/host/components/world-root-stage.ts +130 -63
- 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 +4 -5
- package/src/host/design-system-stories/fixtures/editor-runtime.tsx +14 -8
- package/src/host/document-preview-three.ts +2 -2
- package/src/host/entry-adjudication.ts +6 -6
- package/src/host/game-css-scope-transform.ts +4 -0
- package/src/host/game-module-access.ts +1 -1
- package/src/host/game-realm-page.ts +16 -8
- package/src/host/game-realm-reclaim.ts +1 -1
- package/src/host/gameplay-export.ts +25 -14
- package/src/host/gameplay-recording.ts +5 -5
- package/src/host/gated-globals.ts +6 -6
- package/src/host/history/json-history-resource.ts +3 -3
- 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 +25 -3
- package/src/host/r3f-entry-runtime.ts +65 -34
- package/src/host/react-mount-runtime.ts +8 -49
- package/src/host/realm-services.ts +2 -2
- package/src/host/roots/canvas-root.tsx +361 -0
- package/src/host/roots/module-root.ts +1 -1
- package/src/host/roots/r3f-root.tsx +473 -0
- package/src/host/roots/react-root.ts +9 -43
- package/src/host/scene-view-drawability.ts +2 -2
- package/src/host/served-bundle-runtime-modules.ts +1 -19
- package/src/host/server-log-bridge.ts +3 -3
- package/src/host/stories/mounted-story-viewport-source.ts +1 -1
- package/src/host/stories/pixi-story-model.ts +30 -0
- package/src/host/stories/story-media-captures.ts +46 -0
- package/src/host/stories/story-media-presence.ts +3 -3
- package/src/host/stories/story-pixi-preview.ts +408 -0
- package/src/host/stories/story-three-preview.ts +806 -0
- package/src/host/stories/three-story-captures.ts +35 -0
- package/src/host/story-three-preview-runtime.ts +56 -0
- package/src/host/three-ingest-runtime.ts +1 -1
- package/src/host/use-active-performance-source.ts +3 -3
- package/src/host/viewport-pose-memory.ts +1 -1
- package/src/host/viewport-root-presentation.ts +6 -5
- package/src/ingest/active-ingest.ts +2 -2
- package/src/ingest/authoring/ingest-dom-surface-authoring.ts +4 -4
- package/src/ingest/authoring/ingest-root-adapter.ts +13 -13
- package/src/ingest/capture-wait-report.ts +1 -1
- package/src/ingest/deferred-ingest-play.ts +11 -10
- package/src/ingest/discovery-public-ingest.ts +2 -2
- package/src/ingest/ingest-boot-viewport.ts +6 -8
- package/src/ingest/ingest-canvas-scene-document.tsx +17 -16
- package/src/ingest/ingest-canvas-scene.ts +5 -8
- package/src/ingest/ingest-evidence-hook.ts +1 -1
- package/src/ingest/ingest-frame-snapshot.ts +1 -1
- package/src/ingest/ingest-play-control.ts +4 -4
- package/src/ingest/ingest-render-debug.ts +11 -11
- package/src/ingest/ingest-siblings.ts +16 -28
- package/src/ingest/module-mode.ts +18 -19
- package/src/ingest/mount-canvas-ingest-root.ts +27 -27
- package/src/ingest/mount-coverage.ts +4 -4
- package/src/ingest/mount-dom-ingest-root.ts +16 -16
- package/src/ingest/mount-ingest-root.ts +14 -14
- package/src/ingest/mount-three-ingest-root.ts +12 -12
- package/src/ingest/resolve-canvas.ts +1 -1
- package/src/ingest/served-html-boot.ts +1 -1
- package/src/ingest/surface-canvas.ts +1 -1
- package/src/ingest/unmount-ingest-root.ts +7 -7
- package/src/navmesh/navmesh-handler.ts +24 -16
- package/src/network/NetworkInspectorPanel.tsx +449 -14
- package/src/network/network-inspector-model.ts +14 -2
- package/src/play/play-log-events.ts +1 -1
- package/src/play/play-mode.ts +99 -142
- package/src/play/play-recording.ts +2 -2
- package/src/play/react-play-live-authoring.ts +3 -3
- package/src/play/run-selection.ts +93 -0
- package/src/play-bar/PlayBar.tsx +20 -39
- package/src/profiler/FrameDebuggerPanel.tsx +1 -1
- package/src/profiler/PerformancePanel.tsx +4 -4
- package/src/react/design-time-react-mount.ts +37 -85
- package/src/react/dom-authoring-adapter.ts +11 -11
- package/src/react/react-inspector-section.tsx +13 -13
- package/src/react/react-world-authoring-adapter.ts +31 -143
- package/src/react/story-documents/story-documents.tsx +18 -22
- package/src/react/ui-board-document.tsx +10 -11
- package/src/react/ui-component-board.ts +5 -5
- package/src/runtime/adapter/audio-meter.ts +21 -0
- package/src/runtime/adapter/first-party-audio-system.ts +230 -0
- package/src/runtime/adapter/ingest/contract-debug-adapter.ts +114 -0
- package/src/runtime/adapter/ingest/contract-system-adapters.ts +256 -0
- package/src/runtime/adapter/ingest/merge-debug-adapters.ts +197 -0
- package/src/runtime/adapter/ingest/observation-debug-adapter.ts +162 -0
- package/src/runtime/adapter/ingest/upstream-pin.ts +51 -0
- package/src/runtime/adapter/native-debug-module.ts +498 -0
- package/src/runtime/audio/bus-mixer.ts +161 -0
- package/src/runtime/audio/pose-guard.ts +80 -0
- package/src/runtime/core/frame-pacing.ts +126 -0
- package/src/runtime/core/game-loop.ts +225 -0
- package/src/runtime/core/game-scoped-slot.ts +28 -0
- package/src/runtime/core/seeded-random.ts +162 -0
- package/src/runtime/core/sim-clock.ts +391 -0
- package/src/runtime/core/system-runner.ts +269 -0
- package/src/runtime/core/types.ts +104 -0
- package/src/runtime/create-runtime.ts +1128 -0
- package/src/runtime/debug-bridge.ts +570 -0
- package/src/runtime/debug-registry.ts +899 -0
- package/src/runtime/dev/chrome-trace.ts +153 -0
- package/src/runtime/dev/instruments.ts +403 -0
- package/src/runtime/dev/logger.ts +119 -0
- package/src/runtime/dev/performance-profiler.ts +367 -0
- package/src/runtime/dev/register-render-vitals.ts +276 -0
- package/src/runtime/dev/render-census.ts +354 -0
- package/src/runtime/dev/render-debug-adapter.ts +218 -0
- package/src/runtime/dev/render-memory.ts +226 -0
- package/src/runtime/dev/render-vitals.ts +338 -0
- package/src/runtime/dev/static-batch-advisor.ts +188 -0
- package/src/runtime/dev/webgl-frame-capture.ts +366 -0
- package/src/runtime/dev/webgl-gpu-timer.ts +53 -0
- package/src/runtime/dev-build.ts +47 -0
- package/src/runtime/game.ts +1636 -0
- package/src/runtime/gameplay-rng-trap.ts +135 -0
- package/src/runtime/host-context.ts +64 -0
- package/src/runtime/input-router.ts +169 -0
- package/src/runtime/mount-manifest.ts +480 -0
- package/src/runtime/pixi/authoring.ts +706 -0
- package/src/runtime/pixi/ingest.ts +116 -0
- package/src/runtime/pixi/physics-registry.ts +49 -0
- package/src/runtime/pixi/render-pass-bracket.ts +117 -0
- package/src/runtime/pixi/scene-capture.ts +179 -0
- package/src/runtime/pixi/system-adapters.ts +69 -0
- package/src/runtime/playtest.ts +22 -0
- package/src/runtime/presentation.ts +141 -0
- package/src/runtime/render-control.ts +642 -0
- package/src/runtime/render-seed.ts +77 -0
- package/src/runtime/run-ticks-settled.ts +73 -0
- package/src/runtime/setup/setup-audio.ts +72 -0
- package/src/services/audio-pose-guard.ts +2 -2
- package/src/services/game-audio.ts +152 -0
- package/src/services/game-network.ts +657 -0
- package/src/services/game-physics.ts +334 -0
- package/src/state-watch/StateWatchPanel.tsx +1 -1
- package/src/three/authoring/camera-runtime-inspector-section.tsx +4 -3
- package/src/three/authoring/constraint-inspector-section.tsx +8 -7
- package/src/three/authoring/model-asset-inspector-section.tsx +14 -17
- package/src/three/authoring/oid-source-persistence.ts +13 -13
- package/src/three/authoring/r3f-design-session.ts +79 -61
- package/src/three/authoring/r3f-source-authoring-adapter.ts +112 -108
- package/src/three/authoring/reflection-probe-inspector-section.tsx +5 -4
- 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 +33 -33
- package/src/three/component-verbs/extract-menu.ts +8 -7
- package/src/three/component-verbs/fork-menu.ts +8 -7
- package/src/three/component-verbs/internals-menu.ts +3 -3
- package/src/three/drei-asset-caches.ts +13 -0
- package/src/three/story-documents/three-story-documents.tsx +24 -34
- package/src/three/three-board/ThreeBoardDocument.tsx +25 -25
- package/src/three/three-board/board-scene.ts +7 -7
- package/src/three/three-board/three-component-board.ts +5 -5
- 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/services/game-audio-unlock.ts +0 -48
- 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
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* same predicate the drawer tab's own `available` gate reads. `disabled` is
|
|
4
4
|
* asked at render, so it follows the session.
|
|
5
5
|
*/
|
|
6
|
-
import { getActiveDebug } from '@volter/editor-
|
|
6
|
+
import { getActiveDebug } from '@volter/editor-sdk/kit/authoring/active-systems';
|
|
7
7
|
import type { MenuContribution } from '@volter/editor-sdk/chrome';
|
|
8
8
|
import { editorHost } from '@volter/editor-sdk/host';
|
|
9
9
|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* `available` reads the PRIMARY authoring mount's debug adapter, exactly what
|
|
8
8
|
* the panel itself reads, so the gate and the content can never disagree.
|
|
9
9
|
*/
|
|
10
|
-
import { getActiveDebug } from '@volter/editor-
|
|
10
|
+
import { getActiveDebug } from '@volter/editor-sdk/kit/authoring/active-systems';
|
|
11
11
|
import { StateWatchPanel } from '../src/state-watch/StateWatchPanel';
|
|
12
12
|
|
|
13
13
|
export const point = 'workspace.utility';
|
|
@@ -11,10 +11,10 @@
|
|
|
11
11
|
* through the `@editor/*` alias.
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import { getActiveNetworking, subscribeActiveNetworking } from '@volter/editor-
|
|
15
|
-
import { connectCollaboration } from '@volter/editor-
|
|
16
|
-
import { reportCollaborationPresence } from '@volter/editor-
|
|
17
|
-
import { EDITOR_PARTICIPANT_ID } from '@volter/editor-
|
|
14
|
+
import { getActiveNetworking, subscribeActiveNetworking } from '@volter/editor-sdk/kit/authoring/active-systems';
|
|
15
|
+
import { connectCollaboration } from '@volter/editor-sdk/kit/collaboration-client';
|
|
16
|
+
import { reportCollaborationPresence } from '@volter/editor-sdk/kit/collaboration-presence';
|
|
17
|
+
import { EDITOR_PARTICIPANT_ID } from '@volter/editor-sdk/kit/editor-presence';
|
|
18
18
|
import { activePlaytest, enterPlayMode, exitPlayMode } from '../src/play/play-mode';
|
|
19
19
|
|
|
20
20
|
export const point = 'workspace.service';
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* the same question as "do you want three?".
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import { registerComponentBoard } from '@volter/editor-
|
|
17
|
+
import { registerComponentBoard } from '@volter/editor-sdk/kit/component-board-registry';
|
|
18
18
|
import { threeComponentBoard } from '../../src/three/three-board/three-component-board';
|
|
19
19
|
|
|
20
20
|
export const point = 'workspace.service';
|
|
@@ -24,14 +24,14 @@
|
|
|
24
24
|
* the two cannot drift.
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
-
import { getActiveAuthoring } from '@volter/editor-
|
|
28
|
-
import type { EditorShellStore } from '@volter/editor-
|
|
27
|
+
import { getActiveAuthoring } from '@volter/editor-sdk/kit/authoring/active-adapter';
|
|
28
|
+
import type { EditorShellStore } from '@volter/editor-threejs/kit/editor-shell-store';
|
|
29
29
|
import { canExtractNode, isExtractedHint } from '../../src/host/instance-extract-actions';
|
|
30
30
|
import { canForkInstance, isForkedHint } from '../../src/host/instance-fork-actions';
|
|
31
|
-
import { shellStoreForHost } from '@volter/editor-core/shell-store-door';
|
|
32
31
|
import type { CommandContribution } from '@volter/editor-sdk/commands';
|
|
33
32
|
import { instanceExtractSourceFor } from '../../src/three/component-verbs/extract-menu';
|
|
34
33
|
import { instanceForkSourceFor } from '../../src/three/component-verbs/fork-menu';
|
|
34
|
+
import { threeStoreForHost } from '@volter/editor-threejs/kit/three-state';
|
|
35
35
|
|
|
36
36
|
/** The shell store, or the refusal that says the page has not installed one —
|
|
37
37
|
* the same shape `bridge.command.ts` takes it in, made explicit because both
|
|
@@ -42,7 +42,7 @@ const NO_STORE = { ok: false as const, error: 'the editor shell has not started
|
|
|
42
42
|
function subjectId(cmd: Record<string, unknown>, store: EditorShellStore): string | undefined {
|
|
43
43
|
const given = cmd['id'];
|
|
44
44
|
if (typeof given === 'string' && given.trim() !== '') return given;
|
|
45
|
-
return [...store.selectedEntityIds][0];
|
|
45
|
+
return [...store.shell.selectedEntityIds][0];
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
export const commands: CommandContribution['commands'] = {
|
|
@@ -51,11 +51,11 @@ export const commands: CommandContribution['commands'] = {
|
|
|
51
51
|
derivedRefresh: 'always',
|
|
52
52
|
handle: async (cmd) => {
|
|
53
53
|
try {
|
|
54
|
-
const store =
|
|
54
|
+
const store = threeStoreForHost();
|
|
55
55
|
if (!store) return NO_STORE;
|
|
56
56
|
const id = subjectId(cmd, store);
|
|
57
57
|
if (!id) return { ok: false, error: 'extract-component needs an id or a selected row.' };
|
|
58
|
-
const adapter = getActiveAuthoring(store);
|
|
58
|
+
const adapter = getActiveAuthoring(store.shell);
|
|
59
59
|
const source = instanceExtractSourceFor(adapter, id);
|
|
60
60
|
if (!canExtractNode(adapter.hierarchy.node(id), source, id)) {
|
|
61
61
|
return {
|
|
@@ -82,11 +82,11 @@ export const commands: CommandContribution['commands'] = {
|
|
|
82
82
|
derivedRefresh: 'always',
|
|
83
83
|
handle: async (cmd) => {
|
|
84
84
|
try {
|
|
85
|
-
const store =
|
|
85
|
+
const store = threeStoreForHost();
|
|
86
86
|
if (!store) return NO_STORE;
|
|
87
87
|
const id = subjectId(cmd, store);
|
|
88
88
|
if (!id) return { ok: false, error: 'fork-component needs an id or a selected row.' };
|
|
89
|
-
const adapter = getActiveAuthoring(store);
|
|
89
|
+
const adapter = getActiveAuthoring(store.shell);
|
|
90
90
|
const source = instanceForkSourceFor(adapter, id);
|
|
91
91
|
if (!canForkInstance(adapter.hierarchy.node(id), source, id)) {
|
|
92
92
|
return {
|
|
@@ -25,11 +25,13 @@
|
|
|
25
25
|
* product that composes this package pays for it.
|
|
26
26
|
*/
|
|
27
27
|
|
|
28
|
-
import { setBaseAuthoringFactory } from '@volter/editor-
|
|
29
|
-
import { registerDesignTimeMount } from '@volter/editor-
|
|
30
|
-
import { queueEditModeRebuild } from '@volter/editor-
|
|
28
|
+
import { setBaseAuthoringFactory } from '@volter/editor-sdk/kit/authoring/active-adapter';
|
|
29
|
+
import { registerDesignTimeMount } from '@volter/editor-sdk/kit/authoring/design-time-mount-registry';
|
|
30
|
+
import { queueEditModeRebuild } from '@volter/editor-sdk/kit/authoring/edit-mode-authoring';
|
|
31
31
|
import { authoringJournal } from '../../src/host/history/json-history-resource';
|
|
32
32
|
import { oidThree } from '../../src/three/authoring/three-authoring-adapter';
|
|
33
|
+
import type { WorldRootSessionContext } from '../../src/host/components/world-root-stage';
|
|
34
|
+
import { threeStateOf } from '@volter/editor-threejs/kit/three-state';
|
|
33
35
|
|
|
34
36
|
export const point = 'workspace.service';
|
|
35
37
|
|
|
@@ -45,12 +47,13 @@ export function start(): () => void {
|
|
|
45
47
|
// R3F design session's fiber scene, once it adopts) is what the hierarchy
|
|
46
48
|
// shows, and an unmounted world honestly shows nothing rather than a
|
|
47
49
|
// fabricated document.
|
|
48
|
-
oidThree(store, () => store.scene, worldId, authoringJournal(worldId)),
|
|
50
|
+
oidThree(threeStateOf(store), () => threeStateOf(store).scene, worldId, authoringJournal(worldId)),
|
|
49
51
|
);
|
|
50
52
|
const stopMount = registerDesignTimeMount({
|
|
51
53
|
kind: 'three',
|
|
52
54
|
owner: '@volter/editor-game/three/three-authoring',
|
|
53
|
-
|
|
55
|
+
async mountWorldRootSession(stage) {
|
|
56
|
+
const context = stage as WorldRootSessionContext;
|
|
54
57
|
const { mountR3FDesignSession } = await session;
|
|
55
58
|
return mountR3FDesignSession(context.store, context.composite, context.renderer);
|
|
56
59
|
},
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The three.js story thumbnail capture (`@volter/editor-sdk/kit/story-thumbnails`), installed at
|
|
3
|
+
* boot (`workspace.service`): a prefab story renders in an offscreen React Three Fiber stage
|
|
4
|
+
* (`src/host/stories/three-story-captures.ts`). It is the game's, because prefab stories are R3F.
|
|
5
|
+
*/
|
|
6
|
+
import { registerThreeStoryCapture } from '../src/host/stories/three-story-captures';
|
|
7
|
+
|
|
8
|
+
export const point = 'workspace.service';
|
|
9
|
+
|
|
10
|
+
export function start(): () => void {
|
|
11
|
+
return registerThreeStoryCapture();
|
|
12
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 3,
|
|
3
|
+
"name": "Unity",
|
|
4
|
+
"theme": {
|
|
5
|
+
"id": "unity",
|
|
6
|
+
"color": {
|
|
7
|
+
"surface": {
|
|
8
|
+
"shell": "#191919",
|
|
9
|
+
"panel": "#383838",
|
|
10
|
+
"chrome": "#282828",
|
|
11
|
+
"raised": "#585858",
|
|
12
|
+
"inset": "#2a2a2a",
|
|
13
|
+
"overlay": "rgba(40,40,40,0.96)"
|
|
14
|
+
},
|
|
15
|
+
"boundary": {
|
|
16
|
+
"default": "#232323",
|
|
17
|
+
"strong": "#191919",
|
|
18
|
+
"area": "#191919",
|
|
19
|
+
"indent": "#4a4a4a",
|
|
20
|
+
"divider": "#2f2f2f"
|
|
21
|
+
},
|
|
22
|
+
"content": {
|
|
23
|
+
"primary": "#d2d2d2",
|
|
24
|
+
"muted": "#c4c4c4",
|
|
25
|
+
"dim": "#8f8f8f",
|
|
26
|
+
"onAccent": "#ffffff",
|
|
27
|
+
"menu": "#d2d2d2",
|
|
28
|
+
"status": "#a0a0a0",
|
|
29
|
+
"placeholder": "#6f6f6f",
|
|
30
|
+
"active": "#7bbcff",
|
|
31
|
+
"selected": "#ffffff",
|
|
32
|
+
"onBright": {
|
|
33
|
+
"primary": "#191919",
|
|
34
|
+
"muted": "rgba(25,25,25,0.82)",
|
|
35
|
+
"dim": "rgba(25,25,25,0.7)"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"accent": {
|
|
39
|
+
"default": "#3a79bb",
|
|
40
|
+
"muted": "#2c5d87"
|
|
41
|
+
},
|
|
42
|
+
"widget": {
|
|
43
|
+
"regular": "#585858",
|
|
44
|
+
"menu": "#383838",
|
|
45
|
+
"field": "#2a2a2a",
|
|
46
|
+
"emboss": "rgba(0,0,0,0.2)"
|
|
47
|
+
},
|
|
48
|
+
"viewport": {
|
|
49
|
+
"background": "#474747",
|
|
50
|
+
"grid": "#76726f",
|
|
51
|
+
"axisX": "#db3e1d",
|
|
52
|
+
"axisY": "#9af348",
|
|
53
|
+
"axisZ": "#3a7af8",
|
|
54
|
+
"selection": "#ff6600",
|
|
55
|
+
"wire": "#5e779b",
|
|
56
|
+
"active": "#ff6600"
|
|
57
|
+
},
|
|
58
|
+
"gizmo": {
|
|
59
|
+
"x": "#db3e1d",
|
|
60
|
+
"y": "#9af348",
|
|
61
|
+
"z": "#3a7af8",
|
|
62
|
+
"hover": "#c9c890",
|
|
63
|
+
"drag": "#f6f232"
|
|
64
|
+
},
|
|
65
|
+
"region": {
|
|
66
|
+
"outliner": "#383838",
|
|
67
|
+
"properties": "#383838"
|
|
68
|
+
},
|
|
69
|
+
"category": {
|
|
70
|
+
"object": "#8fb8f0",
|
|
71
|
+
"modifier": "#8fb8f0",
|
|
72
|
+
"material": "#e0a060",
|
|
73
|
+
"data": "#9fd88c",
|
|
74
|
+
"scene": "#d2d2d2",
|
|
75
|
+
"collection": "#d2d2d2",
|
|
76
|
+
"tool": "#d2d2d2",
|
|
77
|
+
"operator": "#9fd88c"
|
|
78
|
+
},
|
|
79
|
+
"semantic": {
|
|
80
|
+
"danger": "#ff6b5b",
|
|
81
|
+
"dangerMuted": "rgba(255,120,107,0.28)",
|
|
82
|
+
"dangerFaint": "rgba(255,120,107,0.12)",
|
|
83
|
+
"warning": "#ffc107",
|
|
84
|
+
"warningMuted": "rgba(255,221,101,0.28)",
|
|
85
|
+
"success": "#7cc576",
|
|
86
|
+
"successMuted": "rgba(69,255,139,0.28)",
|
|
87
|
+
"dynamic": "#ffdd65",
|
|
88
|
+
"dynamicMuted": "rgba(255,221,101,0.18)",
|
|
89
|
+
"instance": "#7bbcff"
|
|
90
|
+
},
|
|
91
|
+
"neutralOverlay": {
|
|
92
|
+
"hover": "rgba(255,255,255,0.07)",
|
|
93
|
+
"active": "rgba(255,255,255,0.13)"
|
|
94
|
+
},
|
|
95
|
+
"scrim": "rgba(0,0,0,0.6)"
|
|
96
|
+
},
|
|
97
|
+
"typography": {
|
|
98
|
+
"sans": "'Inter', 'Segoe UI', system-ui, sans-serif",
|
|
99
|
+
"mono": "'Roboto Mono', Menlo, monospace"
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE UNITY LOOK — Unity 6's dark editor skin and its Scene view's colours,
|
|
3
|
+
* made only of values (`docs/VIEWPORT-STAGE.md`, the Unity column).
|
|
4
|
+
*
|
|
5
|
+
* The viewport group transcribes UnityCsReference: the fill is the Scene
|
|
6
|
+
* view's flat colour with the skybox off (0.278, 0.278, 0.278); selection is
|
|
7
|
+
* `Handles.selectedColor`'s outline `#ff6600`. The grid (0.5, 0.5, 0.5, 0.4)
|
|
8
|
+
* is fitted against `engine-reference/unity/NewEmptyScene_01.png`: its lines
|
|
9
|
+
* sit about 10 levels over the skybox ground (104, 97, 92). The axis colours, named by the world's axes, are
|
|
10
|
+
* `Handles.xAxisColor`, `yAxisColor` and `zAxisColor`; Unity's floor draws no axis
|
|
11
|
+
* lines, which is its view's presentation (`overlays.axes` all off), not this look's.
|
|
12
|
+
* Light, skybox 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 './unity.palette.json';
|
|
16
|
+
|
|
17
|
+
export const point = 'workspace.style';
|
|
18
|
+
export const style: StyleContribution = {
|
|
19
|
+
id: 'unity',
|
|
20
|
+
title: 'Unity',
|
|
21
|
+
paletteId: 'unity',
|
|
22
|
+
materialId: 'unity',
|
|
23
|
+
material: {
|
|
24
|
+
id: 'unity',
|
|
25
|
+
title: 'Unity',
|
|
26
|
+
description: 'Flat grey panels, three-pixel control corners, a shadow under popups.',
|
|
27
|
+
shape: { small: '3px', medium: '3px', large: '4px', full: '9999px' },
|
|
28
|
+
elevation: {
|
|
29
|
+
small: 'none',
|
|
30
|
+
medium: '0 2px 8px rgba(0,0,0,0.5)',
|
|
31
|
+
large: '0 6px 18px rgba(0,0,0,0.55)',
|
|
32
|
+
},
|
|
33
|
+
stage: {
|
|
34
|
+
// THE SCENE VIEW'S OWN CHROME (`NewEmptyScene_01.png`, `PrimitiveCube.png`): the Scene
|
|
35
|
+
// view's toolbar is a flush band with the draw mode first ("Shaded"); the tools are
|
|
36
|
+
// Unity's Tools overlay at the view's left; the view's name is the label under the scene
|
|
37
|
+
// gizmo ("Persp"), which toggles the projection.
|
|
38
|
+
chrome: { bar: 'strip', viewName: 'gizmo', tools: 'shelf', display: 'bar-start' },
|
|
39
|
+
// Unity's draw modes and its Gizmos menu (`NewEmptyScene_01.png`: `Shaded`, `Gizmos`).
|
|
40
|
+
words: { shading: { solid: 'Shaded', wireframe: 'Wireframe' }, helpers: 'Gizmos' },
|
|
41
|
+
// A handle is 80 points on screen whatever the distance (`HandleUtility.GetHandleSize`,
|
|
42
|
+
// `k_KHandleSize`), the radius of the rotate disc; the stage's ring radius is this many
|
|
43
|
+
// CSS px. The documentation's frames are small Scene views at about half scale, so their
|
|
44
|
+
// arrows look long beside the object; on screen they are these points.
|
|
45
|
+
gizmoSize: 80,
|
|
46
|
+
// Unity's scene gizmo: cones round a grey cube (`Editor-SceneGizmo.png`).
|
|
47
|
+
navigationGizmo: 'cones',
|
|
48
|
+
// `Handles.ArrowHandleCap`: a shaft to 0.9 of the handle and a cone centred at 1.0, scaled
|
|
49
|
+
// 0.2 of it. The cone mesh's own proportions are the editor's resource, so they are read
|
|
50
|
+
// off `TransformGizmo35.png` at 1x: a tip at about 1.1 handles and a cone about 0.25 of
|
|
51
|
+
// the handle long, 1.25 of three's head.
|
|
52
|
+
gizmoArrowLength: 1.1,
|
|
53
|
+
gizmoArrowHead: 1.25,
|
|
54
|
+
// The axis colours' alpha (`Handles.cs`); hover and drag are fixed colours (the palette).
|
|
55
|
+
gizmoOpacity: 0.93,
|
|
56
|
+
// `SceneViewGrid`: one-pixel lines at both levels, the ten-cell level a little stronger.
|
|
57
|
+
gridLineWidth: 1,
|
|
58
|
+
gridMajorWidth: 1,
|
|
59
|
+
gridMajorContrast: 1.25,
|
|
60
|
+
// Unity's selection outline is a hard orange line about two pixels wide at 1x, around
|
|
61
|
+
// the whole silhouette, occluded parts included (`game-objects-transform-modes.png`,
|
|
62
|
+
// `SceneVisExVisible.png`, where it crosses the rock in front of the structure); at 3
|
|
63
|
+
// device px the crisp line measures one full and one partial pixel on a 1x capture, as there.
|
|
64
|
+
outlineStyle: 'crisp',
|
|
65
|
+
outlineWidth: 3,
|
|
66
|
+
outlineHidden: true,
|
|
67
|
+
// The Selection Wire's alpha: `(94, 119, 155, 64)` (the palette holds its colour).
|
|
68
|
+
wireOpacity: 0.25,
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
palette,
|
|
72
|
+
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UNITY'S DEFAULT SCENE VIEW: its procedural sky with a narrow horizon band (colours fitted to
|
|
3
|
+
* `NewEmptyScene_01.png`, not transcribed), the grid, no axis lines, the outline alone, the Move
|
|
4
|
+
* tool without a free-move centre.
|
|
5
|
+
* A named view (`@volter/editor-sdk/kit/viewport-presentation` `ViewPreset`): what the view does
|
|
6
|
+
* and how it is lit, never its look — pair it with the Unity style for the whole target.
|
|
7
|
+
*/
|
|
8
|
+
import type { ViewPreset } from '@volter/editor-sdk/kit/viewport-presentation';
|
|
9
|
+
|
|
10
|
+
export const point = 'workspace.view';
|
|
11
|
+
export const view: ViewPreset = {
|
|
12
|
+
id: 'unity',
|
|
13
|
+
title: 'Unity',
|
|
14
|
+
layer: {
|
|
15
|
+
// Unity's Scene camera: `kDefaultPerspectiveFov` 60, vertical when the view is wider than tall
|
|
16
|
+
// and horizontal otherwise (`SceneView.GetVerticalFOV`) — on its smaller side.
|
|
17
|
+
camera: { fov: { degrees: 60, axis: 'smaller' } },
|
|
18
|
+
all: {
|
|
19
|
+
lighting: {
|
|
20
|
+
source: 'preview',
|
|
21
|
+
preview: {
|
|
22
|
+
sun: {
|
|
23
|
+
enabled: true,
|
|
24
|
+
color: '#fff4d6',
|
|
25
|
+
energy: 1,
|
|
26
|
+
altitude: 50,
|
|
27
|
+
azimuth: 150,
|
|
28
|
+
shadowDistance: 100,
|
|
29
|
+
},
|
|
30
|
+
environment: {
|
|
31
|
+
enabled: true,
|
|
32
|
+
sky: {
|
|
33
|
+
top: '#4a84c2',
|
|
34
|
+
horizon: '#f0ffff',
|
|
35
|
+
ground: '#68615c',
|
|
36
|
+
topCurve: 0.04,
|
|
37
|
+
groundCurve: 0.003,
|
|
38
|
+
},
|
|
39
|
+
energy: 1,
|
|
40
|
+
rotation: 0,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
tone: {
|
|
44
|
+
mapper: 'none',
|
|
45
|
+
exposure: 1,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
backdrop: {
|
|
49
|
+
source: 'environment',
|
|
50
|
+
opacity: 1,
|
|
51
|
+
blur: 0,
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
overlays: {
|
|
55
|
+
// No zoom and pan buttons under the gizmo and no camera readout: the engine draws neither.
|
|
56
|
+
navigationControls: false,
|
|
57
|
+
cameraReadout: false,
|
|
58
|
+
grid: {
|
|
59
|
+
visible: true,
|
|
60
|
+
majorEvery: 10,
|
|
61
|
+
},
|
|
62
|
+
selection: {
|
|
63
|
+
outline: true,
|
|
64
|
+
wire: false,
|
|
65
|
+
box: false,
|
|
66
|
+
},
|
|
67
|
+
axes: {
|
|
68
|
+
x: false,
|
|
69
|
+
y: false,
|
|
70
|
+
z: false,
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
interaction: {
|
|
74
|
+
bootTool: 'move',
|
|
75
|
+
transformHandles: {
|
|
76
|
+
scale: false,
|
|
77
|
+
viewRotate: false,
|
|
78
|
+
freeMove: false,
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
};
|
|
@@ -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,66 @@
|
|
|
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
|
+
// THE LEVEL VIEWPORT'S OWN CHROME (`level-editor.png`): one row of rounded pills over the
|
|
35
|
+
// view that runs on from its start: the view's name ("Perspective") and the view mode
|
|
36
|
+
// ("Lit"), then the transform tools, then the transform controls with the snap steps
|
|
37
|
+
// (`10`, `10°`, `0.5`).
|
|
38
|
+
chrome: { bar: 'pills', viewName: 'bar', tools: 'bar-start', display: 'bar-start', transformControls: 'bar' },
|
|
39
|
+
// Unreal's words for the view modes and the Show menu (`level-editor.png`: `Lit`, `Show`).
|
|
40
|
+
words: { shading: { solid: 'Lit', unlit: 'Unlit', wireframe: 'Wireframe' }, helpers: 'Show' },
|
|
41
|
+
// Unreal keeps its widget a constant size on screen; in `level-editor.png` the Move
|
|
42
|
+
// arrows reach 85 to 100 px from the centre sphere. Fitted, not transcribed: the stage's
|
|
43
|
+
// ring radius is this many CSS px, so the 0.85 tip below stands at 94 px.
|
|
44
|
+
gizmoSize: 110,
|
|
45
|
+
// The axis triad in the viewport's bottom-left corner (`level-editor.png`).
|
|
46
|
+
navigationGizmo: 'triad',
|
|
47
|
+
navigationCorner: 'bottom-left',
|
|
48
|
+
navigationSize: 1.3,
|
|
49
|
+
// Unreal's arrows end in slim cones about 14 px long on ~85 px shafts (`level-editor.png`),
|
|
50
|
+
// fitted side by side at 1x.
|
|
51
|
+
gizmoArrowLength: 0.85,
|
|
52
|
+
gizmoArrowHead: 0.8,
|
|
53
|
+
// A hard yellow-orange line about three pixels wide around the whole silhouette; the
|
|
54
|
+
// parts other objects hide are drawn too (dotted in Unreal, behind the table). Widths
|
|
55
|
+
// over 4 widen the blur kernel and the band goes pale and soft (measured: 5 peaks at
|
|
56
|
+
// #dfad6b over the sky), so 3 is the widest solid band the crisp form draws.
|
|
57
|
+
outlineStyle: 'crisp',
|
|
58
|
+
outlineWidth: 3,
|
|
59
|
+
outlineHidden: true,
|
|
60
|
+
gridLineWidth: 1,
|
|
61
|
+
gridMajorWidth: 1,
|
|
62
|
+
gridMajorContrast: 1.3,
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
palette,
|
|
66
|
+
};
|
|
@@ -0,0 +1,93 @@
|
|
|
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
|
+
// Unreal's level viewport: a 90° horizontal field of view, its viewport setting's default.
|
|
19
|
+
camera: { fov: { degrees: 90, axis: 'horizontal' } },
|
|
20
|
+
all: {
|
|
21
|
+
lighting: {
|
|
22
|
+
source: 'preview',
|
|
23
|
+
preview: {
|
|
24
|
+
sun: {
|
|
25
|
+
enabled: true,
|
|
26
|
+
color: '#ffffff',
|
|
27
|
+
energy: 2.5,
|
|
28
|
+
altitude: 45,
|
|
29
|
+
azimuth: 300,
|
|
30
|
+
shadowDistance: 100,
|
|
31
|
+
},
|
|
32
|
+
environment: {
|
|
33
|
+
enabled: true,
|
|
34
|
+
sky: {
|
|
35
|
+
top: '#566b8c',
|
|
36
|
+
horizon: '#8ea6bf',
|
|
37
|
+
ground: '#2b323b',
|
|
38
|
+
topCurve: 0.1,
|
|
39
|
+
groundCurve: 0.12,
|
|
40
|
+
clouds: { cover: 0.55, opacity: 0.9, scale: 16 },
|
|
41
|
+
},
|
|
42
|
+
energy: 1,
|
|
43
|
+
rotation: 0,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
tone: {
|
|
47
|
+
mapper: 'none',
|
|
48
|
+
exposure: 1,
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
backdrop: {
|
|
52
|
+
source: 'environment',
|
|
53
|
+
opacity: 1,
|
|
54
|
+
blur: 0,
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
overlays: {
|
|
58
|
+
// No zoom and pan buttons under the gizmo and no camera readout: the engine draws neither.
|
|
59
|
+
navigationControls: false,
|
|
60
|
+
cameraReadout: false,
|
|
61
|
+
navigation: 'indicator',
|
|
62
|
+
grid: {
|
|
63
|
+
visible: false,
|
|
64
|
+
},
|
|
65
|
+
floor: {
|
|
66
|
+
visible: true,
|
|
67
|
+
color: '#0a1428',
|
|
68
|
+
},
|
|
69
|
+
selection: {
|
|
70
|
+
outline: true,
|
|
71
|
+
wire: false,
|
|
72
|
+
box: false,
|
|
73
|
+
},
|
|
74
|
+
axes: {
|
|
75
|
+
x: false,
|
|
76
|
+
y: false,
|
|
77
|
+
z: false,
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
interaction: {
|
|
81
|
+
bootTool: 'move',
|
|
82
|
+
transformHandles: {
|
|
83
|
+
scale: false,
|
|
84
|
+
viewRotate: false,
|
|
85
|
+
freeMove: true,
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
world: {
|
|
89
|
+
upAxis: 'z',
|
|
90
|
+
handedness: 'left',
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
};
|