@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.
Files changed (281) hide show
  1. package/contributions/audio-unlock.service.ts +2 -2
  2. package/contributions/autoplay.service.ts +1 -1
  3. package/contributions/bridge.command.ts +3 -3
  4. package/contributions/canvas/component-board.service.ts +16 -0
  5. package/contributions/canvas/design-time-mount.service.ts +45 -0
  6. package/contributions/canvas-story-capture.service.ts +12 -0
  7. package/contributions/edit-mode-audio.service.ts +2 -2
  8. package/contributions/edit-mode-networking.service.ts +1 -1
  9. package/contributions/gameplay.command.ts +4 -4
  10. package/contributions/generation.service.ts +3 -3
  11. package/contributions/generations.status.tsx +1 -1
  12. package/contributions/godot.palette.json +99 -0
  13. package/contributions/godot.style.ts +82 -0
  14. package/contributions/godot.view.ts +75 -0
  15. package/contributions/ingest.service.ts +4 -4
  16. package/contributions/instances.command.ts +1 -1
  17. package/contributions/navmesh.menu.ts +1 -1
  18. package/contributions/network-observer.service.ts +14 -0
  19. package/contributions/play.command.ts +11 -5
  20. package/contributions/react/component-board.service.ts +1 -1
  21. package/contributions/react/design-time-mount.service.ts +1 -1
  22. package/contributions/react/react-inspector.service.ts +2 -2
  23. package/contributions/scene-document.service.ts +5 -5
  24. package/contributions/state-watch.menu.ts +1 -1
  25. package/contributions/state-watch.utility.tsx +1 -1
  26. package/contributions/team-playtest.service.ts +4 -4
  27. package/contributions/three/component-board.service.ts +1 -1
  28. package/contributions/three/component-verbs.command.ts +8 -8
  29. package/contributions/three/three-authoring.service.ts +8 -5
  30. package/contributions/three-story-capture.service.ts +12 -0
  31. package/contributions/unity.palette.json +102 -0
  32. package/contributions/unity.style.ts +72 -0
  33. package/contributions/unity.view.ts +82 -0
  34. package/contributions/unreal.palette.json +105 -0
  35. package/contributions/unreal.style.ts +66 -0
  36. package/contributions/unreal.view.ts +93 -0
  37. package/dist-node/serving.mjs +16 -0
  38. package/package.json +33 -16
  39. package/serving/index.ts +27 -0
  40. package/src/asset-budget/AssetBudgetPanel.tsx +1 -1
  41. package/src/asset-budget/asset-budget-model.ts +4 -4
  42. package/src/asset-budget/optimize-apply.ts +7 -7
  43. package/src/audio/AudioDebuggerPanel.tsx +1 -1
  44. package/src/bridge/dispatch.ts +16 -16
  45. package/src/bridge/live-frames.ts +1 -1
  46. package/src/bridge/screenshot.ts +6 -6
  47. package/src/build/BuildProfilesPanel.tsx +3 -3
  48. package/src/canvas/canvas-board/CanvasBoardDocument.tsx +676 -0
  49. package/src/canvas/canvas-board/canvas-board-model.ts +407 -0
  50. package/src/canvas/canvas-board/canvas-component-board.ts +56 -0
  51. package/src/canvas/canvas-design-mount.ts +524 -0
  52. package/src/canvas/design-time-canvas-mount.ts +79 -0
  53. package/src/coverage/live-authoring-surface.ts +6 -6
  54. package/src/coverage/live-project-verbs.ts +2 -2
  55. package/src/coverage/native-system-coverage.ts +6 -6
  56. package/src/coverage/root-coverage.ts +1 -1
  57. package/src/coverage/session-coverage.ts +5 -5
  58. package/src/design-system-stories/ApplicationChrome.stories.tsx +5 -5
  59. package/src/design-system-stories/InspectorNarrowBodies.stories.tsx +13 -53
  60. package/src/edit-mode/edit-mode-audio.ts +4 -4
  61. package/src/edit-mode/edit-mode-networking.ts +2 -2
  62. package/src/game-document/GameCaptureFrameButton.tsx +2 -2
  63. package/src/game-document/GameDocument.tsx +2 -2
  64. package/src/game-document/GamePanel.tsx +8 -8
  65. package/src/game-document/InstanceInspectorPicker.tsx +2 -2
  66. package/src/game-document/crowd-debug.ts +1 -1
  67. package/src/game-document/device-preview.ts +10 -11
  68. package/src/game-document/physics-debug.ts +1 -1
  69. package/src/generation/GenerationActivity.tsx +6 -8
  70. package/src/generation/generation-documents.tsx +8 -8
  71. package/src/generation/generation-jobs.ts +2 -2
  72. package/src/generation/generation-presentation.ts +1 -1
  73. package/src/host/adapter-reach.ts +1 -1
  74. package/src/host/adapter-runtime-bindings.ts +97 -6
  75. package/src/host/api/configurations.ts +2 -2
  76. package/src/host/authoring/babylon-authoring-adapter.ts +8 -8
  77. package/src/host/authoring/contract-hierarchy-authoring.ts +1 -1
  78. package/src/host/authoring/contract-scenes-stories.ts +1 -1
  79. package/src/host/authoring/creation-site-related.ts +2 -2
  80. package/src/host/authoring/ephemeral-persistence.ts +1 -1
  81. package/src/host/authoring/gesture-persist.ts +2 -2
  82. package/src/host/authoring/ingest-data-writer.ts +1 -1
  83. package/src/host/authoring/ingest-source-persistence.ts +8 -8
  84. package/src/host/authoring/mount-isolated-pixi-screen.ts +1 -1
  85. package/src/host/authoring/mounted-authoring.ts +4 -4
  86. package/src/host/authoring/phaser-live-authoring-adapter.ts +4 -4
  87. package/src/host/authoring/pixi-authoring-adapter.ts +42 -17
  88. package/src/host/authoring/pixi-creation-site-write-target.ts +2 -2
  89. package/src/host/authoring/pixi-live-write-target.ts +7 -7
  90. package/src/host/authoring/pixi-source-identity.ts +3 -3
  91. package/src/host/authoring/pixi-source-write-target.ts +1614 -0
  92. package/src/host/authoring/pixi-still-presentation.ts +2 -2
  93. package/src/host/authoring/pixi-structure-history.ts +3 -3
  94. package/src/host/authoring/pixi-transform-channels.ts +16 -14
  95. package/src/host/authoring/source-persistence-backend.ts +6 -6
  96. package/src/host/authoring/struct-write-pipe.ts +3 -3
  97. package/src/host/binding-resolver.ts +8 -9
  98. package/src/host/browser-transpile.ts +2 -2
  99. package/src/host/canvas-entry-runtime.ts +59 -48
  100. package/src/host/canvas-preview-frames.ts +482 -0
  101. package/src/host/components/CameraAuthoringOverlay.tsx +1 -1
  102. package/src/host/components/HeaderTelemetry.tsx +9 -16
  103. package/src/host/components/PixiIsolationSceneContent.tsx +17 -16
  104. package/src/host/components/ThreeIsolationSceneContent.tsx +5 -5
  105. package/src/host/components/frame-debugger-model.ts +2 -2
  106. package/src/host/components/header-telemetry-model.ts +2 -2
  107. package/src/host/components/scene-document.tsx +29 -61
  108. package/src/host/components/utility-view-state.ts +1 -1
  109. package/src/host/components/world-root-stage-binding.tsx +17 -26
  110. package/src/host/components/world-root-stage.ts +130 -63
  111. package/src/host/coverage/capability-coverage.ts +13 -1
  112. package/src/host/coverage/game-contract-seam-evidence.ts +1 -1
  113. package/src/host/coverage/project-verb-coverage.ts +2 -17
  114. package/src/host/coverage/system-adapter-coverage.ts +4 -5
  115. package/src/host/design-system-stories/fixtures/editor-runtime.tsx +14 -8
  116. package/src/host/document-preview-three.ts +2 -2
  117. package/src/host/entry-adjudication.ts +6 -6
  118. package/src/host/game-css-scope-transform.ts +4 -0
  119. package/src/host/game-module-access.ts +1 -1
  120. package/src/host/game-realm-page.ts +16 -8
  121. package/src/host/game-realm-reclaim.ts +1 -1
  122. package/src/host/gameplay-export.ts +25 -14
  123. package/src/host/gameplay-recording.ts +5 -5
  124. package/src/host/gated-globals.ts +6 -6
  125. package/src/host/history/json-history-resource.ts +3 -3
  126. package/src/host/instance-extract-actions.ts +1 -1
  127. package/src/host/instance-fork-actions.ts +1 -1
  128. package/src/host/projection/dom.ts +2 -2
  129. package/src/host/projection/pixi.ts +25 -3
  130. package/src/host/r3f-entry-runtime.ts +65 -34
  131. package/src/host/react-mount-runtime.ts +8 -49
  132. package/src/host/realm-services.ts +2 -2
  133. package/src/host/roots/canvas-root.tsx +361 -0
  134. package/src/host/roots/module-root.ts +1 -1
  135. package/src/host/roots/r3f-root.tsx +473 -0
  136. package/src/host/roots/react-root.ts +9 -43
  137. package/src/host/scene-view-drawability.ts +2 -2
  138. package/src/host/served-bundle-runtime-modules.ts +1 -19
  139. package/src/host/server-log-bridge.ts +3 -3
  140. package/src/host/stories/mounted-story-viewport-source.ts +1 -1
  141. package/src/host/stories/pixi-story-model.ts +30 -0
  142. package/src/host/stories/story-media-captures.ts +46 -0
  143. package/src/host/stories/story-media-presence.ts +3 -3
  144. package/src/host/stories/story-pixi-preview.ts +408 -0
  145. package/src/host/stories/story-three-preview.ts +806 -0
  146. package/src/host/stories/three-story-captures.ts +35 -0
  147. package/src/host/story-three-preview-runtime.ts +56 -0
  148. package/src/host/three-ingest-runtime.ts +1 -1
  149. package/src/host/use-active-performance-source.ts +3 -3
  150. package/src/host/viewport-pose-memory.ts +1 -1
  151. package/src/host/viewport-root-presentation.ts +6 -5
  152. package/src/ingest/active-ingest.ts +2 -2
  153. package/src/ingest/authoring/ingest-dom-surface-authoring.ts +4 -4
  154. package/src/ingest/authoring/ingest-root-adapter.ts +13 -13
  155. package/src/ingest/capture-wait-report.ts +1 -1
  156. package/src/ingest/deferred-ingest-play.ts +11 -10
  157. package/src/ingest/discovery-public-ingest.ts +2 -2
  158. package/src/ingest/ingest-boot-viewport.ts +6 -8
  159. package/src/ingest/ingest-canvas-scene-document.tsx +17 -16
  160. package/src/ingest/ingest-canvas-scene.ts +5 -8
  161. package/src/ingest/ingest-evidence-hook.ts +1 -1
  162. package/src/ingest/ingest-frame-snapshot.ts +1 -1
  163. package/src/ingest/ingest-play-control.ts +4 -4
  164. package/src/ingest/ingest-render-debug.ts +11 -11
  165. package/src/ingest/ingest-siblings.ts +16 -28
  166. package/src/ingest/module-mode.ts +18 -19
  167. package/src/ingest/mount-canvas-ingest-root.ts +27 -27
  168. package/src/ingest/mount-coverage.ts +4 -4
  169. package/src/ingest/mount-dom-ingest-root.ts +16 -16
  170. package/src/ingest/mount-ingest-root.ts +14 -14
  171. package/src/ingest/mount-three-ingest-root.ts +12 -12
  172. package/src/ingest/resolve-canvas.ts +1 -1
  173. package/src/ingest/served-html-boot.ts +1 -1
  174. package/src/ingest/surface-canvas.ts +1 -1
  175. package/src/ingest/unmount-ingest-root.ts +7 -7
  176. package/src/navmesh/navmesh-handler.ts +24 -16
  177. package/src/network/NetworkInspectorPanel.tsx +449 -14
  178. package/src/network/network-inspector-model.ts +14 -2
  179. package/src/play/play-log-events.ts +1 -1
  180. package/src/play/play-mode.ts +99 -142
  181. package/src/play/play-recording.ts +2 -2
  182. package/src/play/react-play-live-authoring.ts +3 -3
  183. package/src/play/run-selection.ts +93 -0
  184. package/src/play-bar/PlayBar.tsx +20 -39
  185. package/src/profiler/FrameDebuggerPanel.tsx +1 -1
  186. package/src/profiler/PerformancePanel.tsx +4 -4
  187. package/src/react/design-time-react-mount.ts +37 -85
  188. package/src/react/dom-authoring-adapter.ts +11 -11
  189. package/src/react/react-inspector-section.tsx +13 -13
  190. package/src/react/react-world-authoring-adapter.ts +31 -143
  191. package/src/react/story-documents/story-documents.tsx +18 -22
  192. package/src/react/ui-board-document.tsx +10 -11
  193. package/src/react/ui-component-board.ts +5 -5
  194. package/src/runtime/adapter/audio-meter.ts +21 -0
  195. package/src/runtime/adapter/first-party-audio-system.ts +230 -0
  196. package/src/runtime/adapter/ingest/contract-debug-adapter.ts +114 -0
  197. package/src/runtime/adapter/ingest/contract-system-adapters.ts +256 -0
  198. package/src/runtime/adapter/ingest/merge-debug-adapters.ts +197 -0
  199. package/src/runtime/adapter/ingest/observation-debug-adapter.ts +162 -0
  200. package/src/runtime/adapter/ingest/upstream-pin.ts +51 -0
  201. package/src/runtime/adapter/native-debug-module.ts +498 -0
  202. package/src/runtime/audio/bus-mixer.ts +161 -0
  203. package/src/runtime/audio/pose-guard.ts +80 -0
  204. package/src/runtime/core/frame-pacing.ts +126 -0
  205. package/src/runtime/core/game-loop.ts +225 -0
  206. package/src/runtime/core/game-scoped-slot.ts +28 -0
  207. package/src/runtime/core/seeded-random.ts +162 -0
  208. package/src/runtime/core/sim-clock.ts +391 -0
  209. package/src/runtime/core/system-runner.ts +269 -0
  210. package/src/runtime/core/types.ts +104 -0
  211. package/src/runtime/create-runtime.ts +1128 -0
  212. package/src/runtime/debug-bridge.ts +570 -0
  213. package/src/runtime/debug-registry.ts +899 -0
  214. package/src/runtime/dev/chrome-trace.ts +153 -0
  215. package/src/runtime/dev/instruments.ts +403 -0
  216. package/src/runtime/dev/logger.ts +119 -0
  217. package/src/runtime/dev/performance-profiler.ts +367 -0
  218. package/src/runtime/dev/register-render-vitals.ts +276 -0
  219. package/src/runtime/dev/render-census.ts +354 -0
  220. package/src/runtime/dev/render-debug-adapter.ts +218 -0
  221. package/src/runtime/dev/render-memory.ts +226 -0
  222. package/src/runtime/dev/render-vitals.ts +338 -0
  223. package/src/runtime/dev/static-batch-advisor.ts +188 -0
  224. package/src/runtime/dev/webgl-frame-capture.ts +366 -0
  225. package/src/runtime/dev/webgl-gpu-timer.ts +53 -0
  226. package/src/runtime/dev-build.ts +47 -0
  227. package/src/runtime/game.ts +1636 -0
  228. package/src/runtime/gameplay-rng-trap.ts +135 -0
  229. package/src/runtime/host-context.ts +64 -0
  230. package/src/runtime/input-router.ts +169 -0
  231. package/src/runtime/mount-manifest.ts +480 -0
  232. package/src/runtime/pixi/authoring.ts +706 -0
  233. package/src/runtime/pixi/ingest.ts +116 -0
  234. package/src/runtime/pixi/physics-registry.ts +49 -0
  235. package/src/runtime/pixi/render-pass-bracket.ts +117 -0
  236. package/src/runtime/pixi/scene-capture.ts +179 -0
  237. package/src/runtime/pixi/system-adapters.ts +69 -0
  238. package/src/runtime/playtest.ts +22 -0
  239. package/src/runtime/presentation.ts +141 -0
  240. package/src/runtime/render-control.ts +642 -0
  241. package/src/runtime/render-seed.ts +77 -0
  242. package/src/runtime/run-ticks-settled.ts +73 -0
  243. package/src/runtime/setup/setup-audio.ts +72 -0
  244. package/src/services/audio-pose-guard.ts +2 -2
  245. package/src/services/game-audio.ts +152 -0
  246. package/src/services/game-network.ts +657 -0
  247. package/src/services/game-physics.ts +334 -0
  248. package/src/state-watch/StateWatchPanel.tsx +1 -1
  249. package/src/three/authoring/camera-runtime-inspector-section.tsx +4 -3
  250. package/src/three/authoring/constraint-inspector-section.tsx +8 -7
  251. package/src/three/authoring/model-asset-inspector-section.tsx +14 -17
  252. package/src/three/authoring/oid-source-persistence.ts +13 -13
  253. package/src/three/authoring/r3f-design-session.ts +79 -61
  254. package/src/three/authoring/r3f-source-authoring-adapter.ts +112 -108
  255. package/src/three/authoring/reflection-probe-inspector-section.tsx +5 -4
  256. package/src/three/authoring/spatial-joint-handles.ts +1 -1
  257. package/src/three/authoring/spatial-lod-handles.ts +1 -1
  258. package/src/three/authoring/spatial-particle-handles.ts +1 -1
  259. package/src/three/authoring/three-authoring-adapter.ts +33 -33
  260. package/src/three/component-verbs/extract-menu.ts +8 -7
  261. package/src/three/component-verbs/fork-menu.ts +8 -7
  262. package/src/three/component-verbs/internals-menu.ts +3 -3
  263. package/src/three/drei-asset-caches.ts +13 -0
  264. package/src/three/story-documents/three-story-documents.tsx +24 -34
  265. package/src/three/three-board/ThreeBoardDocument.tsx +25 -25
  266. package/src/three/three-board/board-scene.ts +7 -7
  267. package/src/three/three-board/three-component-board.ts +5 -5
  268. package/contributions/react/pasteboard.action.ts +0 -41
  269. package/contributions/xstate-behavior.action.ts +0 -42
  270. package/contributions/xstate-behavior.document.tsx +0 -73
  271. package/contributions/xstate-behavior.inspector.tsx +0 -28
  272. package/contributions/xstate-behavior.menu.ts +0 -23
  273. package/src/react/pasteboard-materialize.ts +0 -154
  274. package/src/services/game-audio-unlock.ts +0 -48
  275. package/src/xstate/XStateBehaviorSection.tsx +0 -130
  276. package/src/xstate/XStateMachineInspector.tsx +0 -566
  277. package/src/xstate/character-animation-machine.fixture.ts +0 -74
  278. package/src/xstate/live-behaviors.ts +0 -106
  279. package/src/xstate/use-live-actor-state.ts +0 -44
  280. package/src/xstate/xstate-graph.ts +0 -235
  281. 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-core/authoring/active-systems';
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-core/authoring/active-systems';
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-core/authoring/active-systems';
15
- import { connectCollaboration } from '@volter/editor-core/collaboration-client';
16
- import { reportCollaborationPresence } from '@volter/editor-core/collaboration-presence';
17
- import { EDITOR_PARTICIPANT_ID } from '@volter/editor-core/editor-presence';
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-core/component-board-registry';
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-core/authoring/active-adapter';
28
- import type { EditorShellStore } from '@volter/editor-core/editor-shell-store';
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 = shellStoreForHost();
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 = shellStoreForHost();
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-core/authoring/active-adapter';
29
- import { registerDesignTimeMount } from '@volter/editor-core/authoring/design-time-mount-registry';
30
- import { queueEditModeRebuild } from '@volter/editor-core/authoring/edit-mode-authoring';
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
- mountWorldRootSession: async (context) => {
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
+ };