@volter/editor-core 0.5.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (719) hide show
  1. package/BUNDLED_NOTICES +1527 -0
  2. package/LICENSE +686 -0
  3. package/LICENSE-APACHE +202 -0
  4. package/NOTICE +18 -0
  5. package/README.md +24 -0
  6. package/dist/build/chunk-JS4D4XZ3.js +175 -0
  7. package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
  8. package/dist/build/vite-plugin-product-contributions.js +100 -0
  9. package/dist/build/vite-plugin-product-contributions.js.map +7 -0
  10. package/dist/build/vite-plugin-shared-react.js +25 -0
  11. package/dist/build/vite-plugin-shared-react.js.map +7 -0
  12. package/dist/build/vite-plugin-shared-three.js +86 -0
  13. package/dist/build/vite-plugin-shared-three.js.map +7 -0
  14. package/dist/server/chunk-KMJC7AGO.js +98 -0
  15. package/dist/server/chunk-KMJC7AGO.js.map +7 -0
  16. package/dist/server/chunk-PSILUMGS.js +46 -0
  17. package/dist/server/chunk-PSILUMGS.js.map +7 -0
  18. package/dist/server/frame-proxy.js +255 -0
  19. package/dist/server/frame-proxy.js.map +7 -0
  20. package/dist/server/open-browser.js +53 -0
  21. package/dist/server/open-browser.js.map +7 -0
  22. package/dist/server/process-shutdown.js +127 -0
  23. package/dist/server/process-shutdown.js.map +7 -0
  24. package/dist/server/session-registry.js +141 -0
  25. package/dist/server/session-registry.js.map +7 -0
  26. package/dist/server/spawn-opener.js +11 -0
  27. package/dist/server/spawn-opener.js.map +7 -0
  28. package/dist/server/worktree-identity.js +11 -0
  29. package/dist/server/worktree-identity.js.map +7 -0
  30. package/dist-server/packaged.mjs +88816 -0
  31. package/package.json +118 -0
  32. package/scripts/build-plugins.mjs +14 -0
  33. package/scripts/build-server.mjs +26 -0
  34. package/scripts/build-session.mjs +9 -0
  35. package/server/account-credentials.ts +60 -0
  36. package/server/account-service.ts +1434 -0
  37. package/server/adapter-region-includes.ts +47 -0
  38. package/server/asset-catalog-v2.ts +175 -0
  39. package/server/asset-history-snapshots.ts +196 -0
  40. package/server/asset-ledger-store.ts +195 -0
  41. package/server/asset-library-routes.ts +1595 -0
  42. package/server/blender-wasm-artifact.ts +430 -0
  43. package/server/boot-timings.ts +106 -0
  44. package/server/canonical-path.ts +50 -0
  45. package/server/checkout-workspace-preflight.ts +349 -0
  46. package/server/cloud-asset-catalog.ts +158 -0
  47. package/server/coding-inference-launch.ts +237 -0
  48. package/server/collaboration-account-client.ts +202 -0
  49. package/server/collaboration-attribution.ts +122 -0
  50. package/server/collaboration-session.ts +934 -0
  51. package/server/comfyui-bridge.ts +248 -0
  52. package/server/console-ledger.ts +499 -0
  53. package/server/creation-site-transform.ts +304 -0
  54. package/server/creation-site-write.ts +648 -0
  55. package/server/data-file-serialize.ts +158 -0
  56. package/server/editor-brand-html.ts +72 -0
  57. package/server/editor-control-socket.ts +366 -0
  58. package/server/editor-server-options.ts +190 -0
  59. package/server/editor-server.ts +1483 -0
  60. package/server/editor-sse.ts +352 -0
  61. package/server/engine-provenance.ts +169 -0
  62. package/server/engine-source-restart.ts +117 -0
  63. package/server/frame-bridge.ts +115 -0
  64. package/server/frame-proxy.ts +490 -0
  65. package/server/frame-workbench.ts +259 -0
  66. package/server/frontend-handoff.ts +229 -0
  67. package/server/game-globals-shadow.ts +113 -0
  68. package/server/gameplay-session-retention.ts +149 -0
  69. package/server/gameplay-sessions.ts +123 -0
  70. package/server/generation-jobs.ts +201 -0
  71. package/server/generation-reconciler.ts +137 -0
  72. package/server/generative-execution-context.ts +59 -0
  73. package/server/git-workflow.ts +612 -0
  74. package/server/harness-chat-caller.ts +36 -0
  75. package/server/harness-chat-service.ts +1681 -0
  76. package/server/idle-shutdown.ts +170 -0
  77. package/server/js-profiling-policy.ts +52 -0
  78. package/server/launcher-settings.ts +84 -0
  79. package/server/local-asset-catalog.ts +410 -0
  80. package/server/managed-account-defaults.ts +22 -0
  81. package/server/mock-control-plane.ts +540 -0
  82. package/server/model-import-conversion.ts +345 -0
  83. package/server/native-credential-store.ts +162 -0
  84. package/server/open-browser.ts +118 -0
  85. package/server/packaged.ts +1192 -0
  86. package/server/play-stall.ts +126 -0
  87. package/server/process-shutdown.ts +218 -0
  88. package/server/product-presets.ts +55 -0
  89. package/server/project-build-artifact.ts +95 -0
  90. package/server/project-components.ts +100 -0
  91. package/server/project-dependency-invalidation.ts +114 -0
  92. package/server/project-file-scan.ts +235 -0
  93. package/server/project-hmr-files.ts +215 -0
  94. package/server/project-install-roots.ts +210 -0
  95. package/server/project-kinds.ts +71 -0
  96. package/server/project-mcp-servers.ts +82 -0
  97. package/server/project-module-freshness.ts +109 -0
  98. package/server/project-module-instance.ts +375 -0
  99. package/server/project-optimize-deps-entries.ts +827 -0
  100. package/server/project-output-writer.ts +679 -0
  101. package/server/project-package-origin.ts +63 -0
  102. package/server/project-root-surface.ts +831 -0
  103. package/server/project-scratch-path.ts +47 -0
  104. package/server/project-script-hmr.ts +619 -0
  105. package/server/project-serving-plugins.ts +236 -0
  106. package/server/project-tools.ts +653 -0
  107. package/server/project-validation.ts +250 -0
  108. package/server/project-verbs.ts +127 -0
  109. package/server/project-view.ts +52 -0
  110. package/server/project-watch.ts +1134 -0
  111. package/server/project-work-coordinator.ts +288 -0
  112. package/server/provider-credentials.ts +331 -0
  113. package/server/recent-projects-store.ts +98 -0
  114. package/server/redact-secrets.ts +71 -0
  115. package/server/repository-presence.ts +267 -0
  116. package/server/routes/account.ts +357 -0
  117. package/server/routes/agents.ts +60 -0
  118. package/server/routes/assets.ts +154 -0
  119. package/server/routes/build.ts +13 -0
  120. package/server/routes/collaboration.ts +595 -0
  121. package/server/routes/configurations.ts +419 -0
  122. package/server/routes/context.ts +264 -0
  123. package/server/routes/control-plane.ts +1811 -0
  124. package/server/routes/logs.ts +272 -0
  125. package/server/routes/project-identity.ts +302 -0
  126. package/server/routes/project-open.ts +429 -0
  127. package/server/routes/project-source.ts +686 -0
  128. package/server/routes/project-state.ts +383 -0
  129. package/server/routes/relay.ts +1029 -0
  130. package/server/routes/route-helpers.ts +29 -0
  131. package/server/routes/served-modules.ts +138 -0
  132. package/server/routes/session-tabs.ts +196 -0
  133. package/server/routes/settings.ts +121 -0
  134. package/server/routes/share-control.ts +486 -0
  135. package/server/routes/themes.ts +116 -0
  136. package/server/routes/tools.ts +230 -0
  137. package/server/routes/worktrees.ts +595 -0
  138. package/server/scoped-game-css.ts +461 -0
  139. package/server/server-utils.ts +1194 -0
  140. package/server/session-product.ts +112 -0
  141. package/server/session-registry.ts +230 -0
  142. package/server/share-claims.ts +138 -0
  143. package/server/share-host.ts +526 -0
  144. package/server/share-session-gateway.ts +1362 -0
  145. package/server/share-tunnel.ts +123 -0
  146. package/server/spawn-opener.ts +74 -0
  147. package/server/support/play/log-format.ts +76 -0
  148. package/server/support/play/session-record.ts +199 -0
  149. package/server/support/project/build-discipline.ts +718 -0
  150. package/server/support/project/inspection-node.ts +119 -0
  151. package/server/support/project/log-naming.ts +54 -0
  152. package/server/support/project/provenance.ts +290 -0
  153. package/server/support/project/run-name.ts +18 -0
  154. package/server/support/project/session-journal.ts +830 -0
  155. package/server/support/project/shared.ts +327 -0
  156. package/server/tab-bootstrap.ts +62 -0
  157. package/server/tab-heartbeat.ts +477 -0
  158. package/server/tab-lifecycle.ts +550 -0
  159. package/server/tab-presence.ts +1508 -0
  160. package/server/team-agent-mirror.ts +95 -0
  161. package/server/twin-auth.ts +138 -0
  162. package/server/vendored-lock-recorder.ts +968 -0
  163. package/server/worktree-identity.ts +121 -0
  164. package/server/worktree-management.ts +398 -0
  165. package/server/worktree-retention.d.mts +13 -0
  166. package/server/worktree-retention.mjs +205 -0
  167. package/src/EditorContext.tsx +169 -0
  168. package/src/account.ts +333 -0
  169. package/src/action-registry.ts +532 -0
  170. package/src/active-product.ts +74 -0
  171. package/src/active-project.ts +155 -0
  172. package/src/adapter-editor-config.ts +25 -0
  173. package/src/adapter-observation.ts +49 -0
  174. package/src/animation/stage-transport.ts +379 -0
  175. package/src/animation/three-clips-subject.ts +172 -0
  176. package/src/api/asset-library-wire.ts +45 -0
  177. package/src/api/assets.ts +365 -0
  178. package/src/api/base.ts +10 -0
  179. package/src/api/build.ts +99 -0
  180. package/src/api/git-wire.ts +56 -0
  181. package/src/api/logs.ts +92 -0
  182. package/src/api/project-identity.ts +74 -0
  183. package/src/api/project-open.ts +355 -0
  184. package/src/api/project-source.ts +162 -0
  185. package/src/api/project-state.ts +107 -0
  186. package/src/api/relay.ts +268 -0
  187. package/src/api/settings.ts +36 -0
  188. package/src/api/themes.ts +45 -0
  189. package/src/api/worktrees.ts +257 -0
  190. package/src/asset-compare-core.ts +171 -0
  191. package/src/asset-compare.ts +294 -0
  192. package/src/asset-editor-context.tsx +100 -0
  193. package/src/asset-events.ts +97 -0
  194. package/src/asset-inspector-actions.ts +87 -0
  195. package/src/asset-preview-framing.ts +357 -0
  196. package/src/asset-preview.ts +2802 -0
  197. package/src/asset-selection-viewer-registry.ts +113 -0
  198. package/src/asset-selection.ts +133 -0
  199. package/src/asset-workflow/asset-capabilities.ts +344 -0
  200. package/src/asset-workflow/asset-import-jobs.ts +106 -0
  201. package/src/asset-workflow/asset-ledger-backend.ts +126 -0
  202. package/src/asset-workflow/asset-ledger.ts +156 -0
  203. package/src/asset-workflow/asset-materialization-report.ts +140 -0
  204. package/src/asset-workflow/asset-pack-manifest.ts +320 -0
  205. package/src/asset-workflow/asset-types.ts +142 -0
  206. package/src/asset-workflow/asset-workflow-quality.ts +61 -0
  207. package/src/asset-workflow/audio-preview-player.ts +193 -0
  208. package/src/asset-workflow/audio-waveform.ts +22 -0
  209. package/src/asset-workflow/cloud-asset-client.ts +263 -0
  210. package/src/asset-workflow/folder-preview.ts +345 -0
  211. package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
  212. package/src/asset-workflow/image-view-scale.ts +32 -0
  213. package/src/asset-workflow/import-contract.ts +124 -0
  214. package/src/asset-workflow/ledger-write-lock.ts +244 -0
  215. package/src/asset-workflow/model-inspection.ts +818 -0
  216. package/src/asset-workflow/pixi-spritesheet.ts +197 -0
  217. package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
  218. package/src/asset-workflow/project-asset-commands.ts +23 -0
  219. package/src/asset-workflow/project-asset-health.ts +139 -0
  220. package/src/asset-workflow/project-asset-operations.ts +154 -0
  221. package/src/asset-workflow/project-asset-roots.ts +68 -0
  222. package/src/asset-workflow/project-content.ts +288 -0
  223. package/src/asset-workflow/project-source-index.ts +550 -0
  224. package/src/asset-workflow/thumbnail-system.ts +256 -0
  225. package/src/authoring/active-adapter.ts +199 -0
  226. package/src/authoring/active-systems.ts +422 -0
  227. package/src/authoring/adapter-key.ts +18 -0
  228. package/src/authoring/authoring-asset-url.ts +27 -0
  229. package/src/authoring/bootstrap-state.ts +49 -0
  230. package/src/authoring/boundary-authoring-adapter.ts +184 -0
  231. package/src/authoring/breakpoint-state.ts +43 -0
  232. package/src/authoring/canvas-scene-guides.ts +76 -0
  233. package/src/authoring/component-instance-root.ts +171 -0
  234. package/src/authoring/composite-authoring-adapter.ts +2110 -0
  235. package/src/authoring/consumer-actions.ts +520 -0
  236. package/src/authoring/css-numeric-style.ts +97 -0
  237. package/src/authoring/design-time-layers.ts +849 -0
  238. package/src/authoring/design-time-mount-registry.ts +235 -0
  239. package/src/authoring/design-time-settle.ts +343 -0
  240. package/src/authoring/edit-mode-authoring.ts +619 -0
  241. package/src/authoring/eyedropper-session.ts +60 -0
  242. package/src/authoring/instance-source-menu-register.ts +13 -0
  243. package/src/authoring/instance-source-menu.ts +135 -0
  244. package/src/authoring/layered-pick.ts +183 -0
  245. package/src/authoring/live-gesture-lock.ts +50 -0
  246. package/src/authoring/live-object-transform.ts +62 -0
  247. package/src/authoring/mount-failure-report.ts +154 -0
  248. package/src/authoring/mounted-root-subjects.ts +144 -0
  249. package/src/authoring/no-authoring-adapter.ts +55 -0
  250. package/src/authoring/null-inspection-subjects.tsx +75 -0
  251. package/src/authoring/object3d-document-persistence.ts +106 -0
  252. package/src/authoring/object3d-document-session-registry.ts +120 -0
  253. package/src/authoring/object3d-document-session.ts +1326 -0
  254. package/src/authoring/object3d-gesture-controller.ts +113 -0
  255. package/src/authoring/panel-authoring.ts +121 -0
  256. package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
  257. package/src/authoring/prefab-instance-section-model.ts +55 -0
  258. package/src/authoring/project-authoring-session.ts +105 -0
  259. package/src/authoring/provenance.ts +99 -0
  260. package/src/authoring/quarks-particle-systems.ts +19 -0
  261. package/src/authoring/react-canvas-navigation.ts +255 -0
  262. package/src/authoring/react-design-canvas-style.ts +20 -0
  263. package/src/authoring/react-story-board.ts +937 -0
  264. package/src/authoring/selection-scope.ts +195 -0
  265. package/src/authoring/shell-document-ops.ts +169 -0
  266. package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
  267. package/src/authoring/shell-viewport-policy.ts +48 -0
  268. package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
  269. package/src/authoring/stories-scope.ts +35 -0
  270. package/src/authoring/story-board-chrome-fit.ts +107 -0
  271. package/src/authoring/story-board-presentation.ts +111 -0
  272. package/src/authoring/three-projection-core.ts +226 -0
  273. package/src/authoring/viewport-pick-context.ts +40 -0
  274. package/src/authoring/viewport-raycast.ts +240 -0
  275. package/src/authoring/viewport-tool-context.ts +73 -0
  276. package/src/authoring/world-canvas-viewport-state.ts +35 -0
  277. package/src/authoring/world-hidden-viewport.ts +152 -0
  278. package/src/authoring/world-pan-state.ts +198 -0
  279. package/src/authoring/world-session-state.ts +101 -0
  280. package/src/authoring/write-pipe.ts +173 -0
  281. package/src/availability-tick.ts +66 -0
  282. package/src/bitmap-label.ts +120 -0
  283. package/src/blender-tab-metrics.ts +161 -0
  284. package/src/board-open-actions.ts +20 -0
  285. package/src/boot-routing.ts +391 -0
  286. package/src/build-identity.ts +15 -0
  287. package/src/bytes-codec.ts +62 -0
  288. package/src/camera-authoring.ts +175 -0
  289. package/src/cancellation-reason.ts +58 -0
  290. package/src/canvas-preview-frames.ts +482 -0
  291. package/src/capture-camera-pose.ts +77 -0
  292. package/src/chrome-registry.ts +159 -0
  293. package/src/chrome-slot-registry.ts +91 -0
  294. package/src/collaboration-client.ts +264 -0
  295. package/src/collaboration-presence.ts +41 -0
  296. package/src/command-dispatch.ts +19 -0
  297. package/src/command-listener.ts +2743 -0
  298. package/src/command-registry.ts +70 -0
  299. package/src/component-board-registry.ts +205 -0
  300. package/src/component-states-registry.ts +200 -0
  301. package/src/components/AgentPresentationNotice.tsx +75 -0
  302. package/src/components/AlignToolbar.tsx +204 -0
  303. package/src/components/AppRoot.tsx +394 -0
  304. package/src/components/ApplicationMenus.tsx +415 -0
  305. package/src/components/AssetBrowser.tsx +2843 -0
  306. package/src/components/AssetEditorShell.tsx +216 -0
  307. package/src/components/AssetInspectorToolSection.tsx +124 -0
  308. package/src/components/BoardRulers.tsx +354 -0
  309. package/src/components/CameraInfo.tsx +81 -0
  310. package/src/components/CanvasSceneViewport.tsx +556 -0
  311. package/src/components/CapabilityCoverageSection.tsx +185 -0
  312. package/src/components/CenterDocuments.tsx +22 -0
  313. package/src/components/ChromeSlot.tsx +20 -0
  314. package/src/components/CodeView.tsx +470 -0
  315. package/src/components/CollaborationHeaderControl.css +74 -0
  316. package/src/components/CompactInspectorCard.tsx +190 -0
  317. package/src/components/CompactInspectorShell.tsx +39 -0
  318. package/src/components/ConsolePanel.css +55 -0
  319. package/src/components/ConsolePanel.tsx +270 -0
  320. package/src/components/DefaultEditorLayout.tsx +106 -0
  321. package/src/components/DocumentHeaderStrip.tsx +96 -0
  322. package/src/components/DocumentShelfRail.tsx +45 -0
  323. package/src/components/DocumentThumbnail.tsx +345 -0
  324. package/src/components/EditorLeaseGuard.tsx +372 -0
  325. package/src/components/ErrorBanner.tsx +123 -0
  326. package/src/components/FolderPreviewTile.tsx +159 -0
  327. package/src/components/GameHierarchy.tsx +3842 -0
  328. package/src/components/GameplaySessionTimeline.tsx +295 -0
  329. package/src/components/InspectionProjection.tsx +968 -0
  330. package/src/components/Inspector.tsx +233 -0
  331. package/src/components/InspectorCanvasPreview.tsx +35 -0
  332. package/src/components/InspectorFieldsSection.tsx +290 -0
  333. package/src/components/InspectorObjectPreview.tsx +57 -0
  334. package/src/components/InspectorStoriesSection.tsx +92 -0
  335. package/src/components/InspectorToolSection.tsx +96 -0
  336. package/src/components/InspectorTransformSection.tsx +245 -0
  337. package/src/components/LightExplorerPanel.tsx +433 -0
  338. package/src/components/MediaProperties.tsx +145 -0
  339. package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
  340. package/src/components/Object3DDocumentToolbar.css +100 -0
  341. package/src/components/Object3DDocumentToolbar.tsx +454 -0
  342. package/src/components/Object3DDocumentViewport.tsx +58 -0
  343. package/src/components/ProjectHeader.css +617 -0
  344. package/src/components/ProjectHeader.tsx +328 -0
  345. package/src/components/ProjectLayout.tsx +249 -0
  346. package/src/components/ReactCanvasControls.tsx +284 -0
  347. package/src/components/RootSelectionOverlay.tsx +3162 -0
  348. package/src/components/RootTextEditor.tsx +79 -0
  349. package/src/components/SaveStatus.tsx +70 -0
  350. package/src/components/StageHost.tsx +1954 -0
  351. package/src/components/StageOverlays.tsx +21 -0
  352. package/src/components/StartupErrorScreen.tsx +76 -0
  353. package/src/components/StartupLoadingScreen.tsx +65 -0
  354. package/src/components/StatsOverlay.tsx +78 -0
  355. package/src/components/SurfaceStateOverlay.tsx +24 -0
  356. package/src/components/ToolContributionSurfaces.tsx +65 -0
  357. package/src/components/ToolHost.tsx +370 -0
  358. package/src/components/ToolObject3DPreview.tsx +39 -0
  359. package/src/components/Toolbar.tsx +595 -0
  360. package/src/components/TransientHint.tsx +44 -0
  361. package/src/components/TransportStrip.tsx +174 -0
  362. package/src/components/VersionControlSection.tsx +470 -0
  363. package/src/components/VgaiLogo.css +83 -0
  364. package/src/components/VgaiLogo.tsx +35 -0
  365. package/src/components/ViewportControlsHint.tsx +60 -0
  366. package/src/components/ViewportFurniture.tsx +401 -0
  367. package/src/components/ViewportOverlay.tsx +145 -0
  368. package/src/components/ViewportOverlaysMenu.tsx +153 -0
  369. package/src/components/ViewportShadingMenu.tsx +300 -0
  370. package/src/components/ViewportViewMenu.tsx +101 -0
  371. package/src/components/WorkspaceDocumentSurface.tsx +204 -0
  372. package/src/components/WorkspaceUtilitySurface.tsx +22 -0
  373. package/src/components/WorktreeSwitcher.css +239 -0
  374. package/src/components/WorktreeSwitcher.tsx +890 -0
  375. package/src/components/account-documents.tsx +1162 -0
  376. package/src/components/asset-documents.tsx +812 -0
  377. package/src/components/asset-editor-persistence.ts +216 -0
  378. package/src/components/asset-selection-section.tsx +535 -0
  379. package/src/components/asset-thumbnails.tsx +312 -0
  380. package/src/components/asset-viewers/AudioViewer.tsx +201 -0
  381. package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
  382. package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
  383. package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
  384. package/src/components/asset-viewers/ImageViewer.tsx +300 -0
  385. package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
  386. package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
  387. package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
  388. package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
  389. package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
  390. package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
  391. package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
  392. package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
  393. package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
  394. package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
  395. package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
  396. package/src/components/asset-viewers/VideoViewer.tsx +101 -0
  397. package/src/components/asset-viewers/shader-source.ts +144 -0
  398. package/src/components/asset-workflow.css +731 -0
  399. package/src/components/board-guides.ts +150 -0
  400. package/src/components/compact-inspector.css +539 -0
  401. package/src/components/core-utilities.tsx +90 -0
  402. package/src/components/editor-notifications.css +40 -0
  403. package/src/components/engine-workspace.css +274 -0
  404. package/src/components/inspector-preview-section.tsx +238 -0
  405. package/src/components/inspector-property-grouping.ts +64 -0
  406. package/src/components/inspector-revert-label.ts +20 -0
  407. package/src/components/inspector-selection.ts +42 -0
  408. package/src/components/inspector-stories-gating.ts +171 -0
  409. package/src/components/inspector-transform-subject.ts +11 -0
  410. package/src/components/inspector-transform.ts +75 -0
  411. package/src/components/kind-documents.tsx +500 -0
  412. package/src/components/palette-action-publisher.tsx +140 -0
  413. package/src/components/primitives/DraftColorInput.tsx +74 -0
  414. package/src/components/product-shell.css +1829 -0
  415. package/src/components/project-tool-documents.tsx +410 -0
  416. package/src/components/scene-documents.tsx +223 -0
  417. package/src/components/stage-keyboard.tsx +37 -0
  418. package/src/components/stage-overlay-set.tsx +107 -0
  419. package/src/components/stage-presence-markers.ts +478 -0
  420. package/src/components/standard-viewport-dressing.ts +417 -0
  421. package/src/components/status-contributions.tsx +403 -0
  422. package/src/components/tool-documents.tsx +309 -0
  423. package/src/components/tool-schema-form.tsx +262 -0
  424. package/src/components/use-after-paint.ts +41 -0
  425. package/src/components/use-project-image-assets.ts +86 -0
  426. package/src/components/viewport-header-controls.css +90 -0
  427. package/src/components/viewport-surface-status.tsx +55 -0
  428. package/src/components/workspace-history.ts +32 -0
  429. package/src/components/workspace-static-panel-registry.tsx +152 -0
  430. package/src/components/workspace-surfaces.css +621 -0
  431. package/src/components/world-documents.tsx +586 -0
  432. package/src/components/world-overlay-gestures.ts +1694 -0
  433. package/src/composite-screenshot.ts +1641 -0
  434. package/src/console-sync.ts +131 -0
  435. package/src/constraint-helper.ts +338 -0
  436. package/src/content-entry-source-registry.ts +184 -0
  437. package/src/coverage/authoring-seam-evidence.ts +300 -0
  438. package/src/coverage/canvas-reveal.ts +192 -0
  439. package/src/coverage/design-time-surfaces.ts +101 -0
  440. package/src/coverage/live-seam-evidence.ts +11 -0
  441. package/src/coverage/ontology-invariants.ts +466 -0
  442. package/src/coverage/session-vitals.ts +501 -0
  443. package/src/coverage/system-seam-evidence.ts +72 -0
  444. package/src/crash-null-boundary.ts +36 -0
  445. package/src/creation-site-edit.ts +1479 -0
  446. package/src/creation-site-registry.ts +160 -0
  447. package/src/delegate-harness-registry.ts +143 -0
  448. package/src/document-context-registry.ts +177 -0
  449. package/src/document-open-registry.ts +200 -0
  450. package/src/document-preview-source.ts +20 -0
  451. package/src/document-renderer-session.ts +138 -0
  452. package/src/editor-api.ts +46 -0
  453. package/src/editor-chrome-capture.ts +139 -0
  454. package/src/editor-commands.ts +164 -0
  455. package/src/editor-console.ts +563 -0
  456. package/src/editor-current-view.ts +82 -0
  457. package/src/editor-document-probe.ts +881 -0
  458. package/src/editor-git-client.ts +115 -0
  459. package/src/editor-host-door.ts +462 -0
  460. package/src/editor-hotkeys.ts +842 -0
  461. package/src/editor-lease-view.ts +39 -0
  462. package/src/editor-lease.ts +415 -0
  463. package/src/editor-mode.ts +19 -0
  464. package/src/editor-notifications.ts +140 -0
  465. package/src/editor-presence.ts +563 -0
  466. package/src/editor-presentation-activity.ts +50 -0
  467. package/src/editor-presentation-notice.ts +42 -0
  468. package/src/editor-runtime.tsx +145 -0
  469. package/src/editor-server-response.ts +86 -0
  470. package/src/editor-session-attribution.ts +75 -0
  471. package/src/editor-session-mode.ts +54 -0
  472. package/src/editor-shell-store.ts +1304 -0
  473. package/src/editor-state-facets.ts +74 -0
  474. package/src/editor-styles.css +33 -0
  475. package/src/editor-view-presentation.ts +810 -0
  476. package/src/editor-viewport.ts +5302 -0
  477. package/src/entity-lod.ts +31 -0
  478. package/src/entity-object.ts +91 -0
  479. package/src/files/file-provider.ts +62 -0
  480. package/src/files/project-files.ts +264 -0
  481. package/src/finders/index.ts +136 -0
  482. package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
  483. package/src/frame/bridge.tsx +1408 -0
  484. package/src/frame/product.ts +77 -0
  485. package/src/gameplay-dom-recording.ts +319 -0
  486. package/src/gameplay-export-state.ts +14 -0
  487. package/src/gameplay-replay.ts +417 -0
  488. package/src/gameplay-session-time.ts +9 -0
  489. package/src/gameplay-sessions.ts +204 -0
  490. package/src/harness-chat-types.ts +253 -0
  491. package/src/hierarchy-component-marks.ts +298 -0
  492. package/src/hierarchy-drop.ts +91 -0
  493. package/src/hierarchy-expansion-state.ts +80 -0
  494. package/src/hierarchy-header-slot.ts +52 -0
  495. package/src/hierarchy-internals.ts +197 -0
  496. package/src/hierarchy-kind-icon.ts +217 -0
  497. package/src/hierarchy-mark-reader.ts +73 -0
  498. package/src/hierarchy-menu-registry.ts +67 -0
  499. package/src/hierarchy-node-rows.ts +307 -0
  500. package/src/hierarchy-panel-view.ts +280 -0
  501. package/src/hierarchy-projection.ts +76 -0
  502. package/src/hierarchy-row-cache.ts +243 -0
  503. package/src/hierarchy-row-model.ts +308 -0
  504. package/src/hierarchy-rows.ts +11 -0
  505. package/src/hierarchy-walk.ts +86 -0
  506. package/src/history/editor-session.ts +25 -0
  507. package/src/history/history-commands.ts +147 -0
  508. package/src/history/history-delegate.ts +163 -0
  509. package/src/history/history-limit-notices.ts +43 -0
  510. package/src/history/history-service.ts +1173 -0
  511. package/src/history/persistence-coordinator.ts +35 -0
  512. package/src/history/project-file-history.ts +386 -0
  513. package/src/history/project-root-history-backends.ts +139 -0
  514. package/src/history/resource-registry.ts +209 -0
  515. package/src/history/snapshot-store.ts +103 -0
  516. package/src/history/source-history-backend.ts +546 -0
  517. package/src/history/types.ts +124 -0
  518. package/src/hmr-registration-group.ts +67 -0
  519. package/src/hmr-stable-react-context.ts +23 -0
  520. package/src/hotkeys.ts +188 -0
  521. package/src/inference-diagnostics.ts +69 -0
  522. package/src/initial-project.ts +80 -0
  523. package/src/inspection/active-subject.ts +578 -0
  524. package/src/inspection/active-surface.ts +142 -0
  525. package/src/inspection/compose.ts +1064 -0
  526. package/src/inspection/display.ts +170 -0
  527. package/src/inspection/document-subject.ts +109 -0
  528. package/src/inspection/game-subject.ts +85 -0
  529. package/src/inspection/model.ts +542 -0
  530. package/src/inspection/null-subject.ts +115 -0
  531. package/src/inspection/serialize.ts +357 -0
  532. package/src/inspection/use-active-inspection.ts +180 -0
  533. package/src/inspector-presentation.ts +201 -0
  534. package/src/inspector-section-registry.ts +221 -0
  535. package/src/instance-source-actions.ts +163 -0
  536. package/src/instanced-presentation.ts +164 -0
  537. package/src/js-heap.ts +71 -0
  538. package/src/key-actions.ts +91 -0
  539. package/src/keymap-presets.ts +401 -0
  540. package/src/layout-policy.ts +31 -0
  541. package/src/learn-links.ts +73 -0
  542. package/src/light-explorer-model.ts +134 -0
  543. package/src/live-canvas-frame.ts +55 -0
  544. package/src/live-document.ts +279 -0
  545. package/src/live-module-source.ts +230 -0
  546. package/src/live-session-registry.ts +220 -0
  547. package/src/live-transition.ts +633 -0
  548. package/src/manifest-project.ts +107 -0
  549. package/src/model-thumbnail.ts +523 -0
  550. package/src/native-selection-style.ts +202 -0
  551. package/src/object3d-document-write-policy.ts +137 -0
  552. package/src/packaged-runtime.ts +108 -0
  553. package/src/palettes/maya.palette.json +57 -0
  554. package/src/palettes/substance.palette.json +57 -0
  555. package/src/pasteboard-module.ts +81 -0
  556. package/src/performance-profiler.ts +367 -0
  557. package/src/performance-sources.ts +69 -0
  558. package/src/play-boot-phase.ts +145 -0
  559. package/src/presentation-surface.ts +248 -0
  560. package/src/project-adapter.ts +1143 -0
  561. package/src/project-asset-refresh.ts +26 -0
  562. package/src/project-declaration-refresh.ts +31 -0
  563. package/src/project-local-state.ts +118 -0
  564. package/src/project-manager.ts +243 -0
  565. package/src/project-module-changes.ts +163 -0
  566. package/src/project-module-split.ts +266 -0
  567. package/src/project-provenance.ts +115 -0
  568. package/src/project-ready.ts +42 -0
  569. package/src/project-session-reset.ts +67 -0
  570. package/src/project-shape.ts +68 -0
  571. package/src/project-tool-discovery.ts +66 -0
  572. package/src/project-tools.ts +107 -0
  573. package/src/project-work-types.ts +149 -0
  574. package/src/projection/three.ts +898 -0
  575. package/src/projection/types.ts +44 -0
  576. package/src/readiness.ts +113 -0
  577. package/src/reflection-probe-helper.ts +142 -0
  578. package/src/reported-play-state.ts +90 -0
  579. package/src/resolve-relative-specifier.ts +33 -0
  580. package/src/scene-document-plan.ts +315 -0
  581. package/src/scene-framing.ts +315 -0
  582. package/src/scene-live-open.ts +210 -0
  583. package/src/scene-view-fog.ts +89 -0
  584. package/src/scoped-game-css.ts +152 -0
  585. package/src/session-orphan-record.ts +193 -0
  586. package/src/session-tombstone.ts +126 -0
  587. package/src/settings/settings-provider.ts +82 -0
  588. package/src/settings-store.ts +345 -0
  589. package/src/shared-view-restore.ts +42 -0
  590. package/src/shell-store-door.ts +45 -0
  591. package/src/source-conflict.ts +122 -0
  592. package/src/spatial-handle-visuals.ts +332 -0
  593. package/src/stage-context.ts +341 -0
  594. package/src/stage-store-registry.ts +63 -0
  595. package/src/stale-chunk-recovery.ts +34 -0
  596. package/src/state-report-deferral.ts +73 -0
  597. package/src/storage/host-files-storage.ts +97 -0
  598. package/src/storage/http-storage.ts +174 -0
  599. package/src/storage/index.ts +75 -0
  600. package/src/storage/mem-storage.ts +149 -0
  601. package/src/storage/path-lock.ts +44 -0
  602. package/src/storage/paths.ts +26 -0
  603. package/src/storage/types.ts +116 -0
  604. package/src/stories/StoryComponentThumbnail.tsx +184 -0
  605. package/src/stories/StoryPreviewMount.tsx +306 -0
  606. package/src/stories/component-content-source.tsx +106 -0
  607. package/src/stories/component-states-source.ts +78 -0
  608. package/src/stories/compose-project-stories.ts +255 -0
  609. package/src/stories/pixi-story-model.ts +30 -0
  610. package/src/stories/prefabs-finder.ts +54 -0
  611. package/src/stories/prefabs-from-stories.ts +182 -0
  612. package/src/stories/project-story-discovery.ts +78 -0
  613. package/src/stories/project-story-regions.ts +24 -0
  614. package/src/stories/story-actions.ts +54 -0
  615. package/src/stories/story-capture-command.ts +124 -0
  616. package/src/stories/story-capture.ts +584 -0
  617. package/src/stories/story-declared-medium.ts +126 -0
  618. package/src/stories/story-discovery.ts +176 -0
  619. package/src/stories/story-document-openers.ts +36 -0
  620. package/src/stories/story-dom-runtime.ts +78 -0
  621. package/src/stories/story-grouping.ts +111 -0
  622. package/src/stories/story-lane.ts +88 -0
  623. package/src/stories/story-mount-turn.ts +27 -0
  624. package/src/stories/story-opener.ts +260 -0
  625. package/src/stories/story-pixi-preview.ts +408 -0
  626. package/src/stories/story-presentation.ts +215 -0
  627. package/src/stories/story-registry.ts +517 -0
  628. package/src/stories/story-three-preview.ts +807 -0
  629. package/src/stories/three-story-model.ts +96 -0
  630. package/src/story-three-preview-runtime.ts +56 -0
  631. package/src/surface-keyboard.ts +112 -0
  632. package/src/surface-state.ts +124 -0
  633. package/src/tab-bootstrap.js +628 -0
  634. package/src/tab-census.ts +198 -0
  635. package/src/tab-lifecycle-client.ts +196 -0
  636. package/src/theme-library.ts +844 -0
  637. package/src/theme-preference.ts +378 -0
  638. package/src/theme.css +3437 -0
  639. package/src/three-viewport/bone-selection-highlight.ts +119 -0
  640. package/src/three-viewport/camera-fit.ts +41 -0
  641. package/src/three-viewport/interactive-renderer.ts +132 -0
  642. package/src/three-viewport/selection-brackets.ts +310 -0
  643. package/src/three-viewport/selection-outline.ts +183 -0
  644. package/src/three-viewport/skeleton-helper.ts +61 -0
  645. package/src/three-viewport/source-color.ts +167 -0
  646. package/src/three-viewport/studio-environment.ts +96 -0
  647. package/src/three-viewport-presentation.ts +23 -0
  648. package/src/tool-contribution-play.ts +74 -0
  649. package/src/tool-loader.ts +1798 -0
  650. package/src/transform-mode-request.ts +57 -0
  651. package/src/transient-hint.ts +78 -0
  652. package/src/trigger-volume-helper.ts +116 -0
  653. package/src/ui-source/adapter-region-includes.ts +241 -0
  654. package/src/ui-source/ensure-import.ts +132 -0
  655. package/src/ui-source/file-region-resolver.ts +302 -0
  656. package/src/ui-source/inspect.ts +775 -0
  657. package/src/ui-source/oid-transform.ts +1845 -0
  658. package/src/ui-source/plan-csf-story.ts +196 -0
  659. package/src/ui-source/plan-extract-component.ts +421 -0
  660. package/src/ui-source/plan-fork-component.ts +621 -0
  661. package/src/ui-source/plan-named-style.ts +95 -0
  662. package/src/ui-source/plan-source-edit.ts +353 -0
  663. package/src/ui-source/r3f-contract-resolver.ts +327 -0
  664. package/src/ui-source/r3f-diagnostic-index.ts +165 -0
  665. package/src/ui-source/r3f-environment-binding.ts +133 -0
  666. package/src/ui-source/r3f-joint-binding.ts +251 -0
  667. package/src/ui-source/r3f-lod-binding.ts +91 -0
  668. package/src/ui-source/r3f-particle-binding.ts +235 -0
  669. package/src/ui-source/r3f-physics-binding.ts +483 -0
  670. package/src/ui-source/r3f-project-contracts.ts +444 -0
  671. package/src/ui-source/relative-import-specifier.ts +34 -0
  672. package/src/ui-source/reparent-guard.ts +544 -0
  673. package/src/ui-source/source-edit-request.ts +97 -0
  674. package/src/ui-source/source-write-backend.ts +618 -0
  675. package/src/ui-source/syntactic-prop-specs.ts +296 -0
  676. package/src/ui-source/tier-source-write-backend.ts +279 -0
  677. package/src/ui-source/ts-ast.ts +171 -0
  678. package/src/ui-source/utility-class-support.ts +169 -0
  679. package/src/ui-source/write-component-default.ts +133 -0
  680. package/src/ui-source/writer.ts +1989 -0
  681. package/src/viewport-activation-timings.ts +840 -0
  682. package/src/viewport-authoring-policy.ts +186 -0
  683. package/src/viewport-controls-hint.ts +57 -0
  684. package/src/viewport-door.ts +237 -0
  685. package/src/viewport-shading-boundary.ts +12 -0
  686. package/src/vite-error-surface.ts +141 -0
  687. package/src/wait-until.ts +37 -0
  688. package/src/workspace-areas.ts +156 -0
  689. package/src/workspace-aux-commands.ts +11 -0
  690. package/src/workspace-available-documents.ts +127 -0
  691. package/src/workspace-core-utilities.ts +31 -0
  692. package/src/workspace-document-ids.ts +59 -0
  693. package/src/workspace-document-registry.ts +612 -0
  694. package/src/workspace-document-restore.ts +145 -0
  695. package/src/workspace-host-commands.ts +141 -0
  696. package/src/workspace-persistence-gate.ts +40 -0
  697. package/src/workspace-play-utilities.ts +44 -0
  698. package/src/workspace-presets.ts +425 -0
  699. package/src/workspace-regions.ts +294 -0
  700. package/src/workspace-state-persistence.ts +536 -0
  701. package/src/workspace-static-panels.ts +73 -0
  702. package/src/workspace-status-registry.ts +121 -0
  703. package/src/workspace-style.ts +239 -0
  704. package/src/workspace-utility-commands.ts +74 -0
  705. package/src/workspace-utility-registry.ts +263 -0
  706. package/src/workspace-viewport-rect.ts +97 -0
  707. package/src/world-adoption.ts +115 -0
  708. package/src/world-document-routing.ts +104 -0
  709. package/vite-plugin-creation-site-write.ts +184 -0
  710. package/vite-plugin-creation-site.ts +80 -0
  711. package/vite-plugin-game-static.ts +303 -0
  712. package/vite-plugin-module-doorways.ts +336 -0
  713. package/vite-plugin-product-contributions.ts +197 -0
  714. package/vite-plugin-project-game-static.ts +125 -0
  715. package/vite-plugin-project-jsx-js.ts +65 -0
  716. package/vite-plugin-project-root-absolute-assets.ts +359 -0
  717. package/vite-plugin-shared-react.ts +420 -0
  718. package/vite-plugin-shared-three.ts +203 -0
  719. package/vite-plugin-ui-oid.ts +2106 -0
@@ -0,0 +1,119 @@
1
+ import { EDITOR_LAYER } from '@volter/editor-threejs/viewport/editor-layers';
2
+ import { setObjectMark } from '@volter/editor-threejs/ecs/object-marks';
3
+ import * as THREE from 'three';
4
+ import { LineMaterial } from 'three/addons/lines/LineMaterial.js';
5
+ import { LineSegments2 } from 'three/addons/lines/LineSegments2.js';
6
+ import { LineSegmentsGeometry } from 'three/addons/lines/LineSegmentsGeometry.js';
7
+
8
+ /**
9
+ * Viewport-owned emphasis for bones selected in an Object3D document.
10
+ * SkeletonHelper supplies the whole rig context; this draws the selected
11
+ * joint and its incident segments through the model so selection cannot be
12
+ * lost inside opaque geometry.
13
+ */
14
+ export class BoneSelectionHighlight extends THREE.Group {
15
+ private readonly segments: Array<readonly [THREE.Bone, THREE.Bone]> = [];
16
+ private readonly linePositions: Float32Array;
17
+ private readonly pointPositions: Float32Array;
18
+ private readonly lines: LineSegments2;
19
+ private readonly lineMaterial: LineMaterial;
20
+ private readonly points: THREE.Points;
21
+ private readonly worldPosition = new THREE.Vector3();
22
+
23
+ constructor(
24
+ private readonly bones: readonly THREE.Bone[],
25
+ color: number,
26
+ ) {
27
+ super();
28
+ const seen = new Set<string>();
29
+ for (const bone of bones) {
30
+ const parent = bone.parent as THREE.Bone | null;
31
+ if (parent?.isBone) this.addSegment(parent, bone, seen);
32
+ for (const child of bone.children) {
33
+ if ((child as THREE.Bone).isBone) this.addSegment(bone, child as THREE.Bone, seen);
34
+ }
35
+ }
36
+
37
+ this.linePositions = new Float32Array(Math.max(this.segments.length * 6, 6));
38
+ const lineGeometry = new LineSegmentsGeometry();
39
+ lineGeometry.setPositions(this.linePositions);
40
+ this.lineMaterial = new LineMaterial({
41
+ color,
42
+ linewidth: 5,
43
+ worldUnits: false,
44
+ depthTest: false,
45
+ depthWrite: false,
46
+ toneMapped: false,
47
+ alphaToCoverage: true,
48
+ });
49
+ this.lines = new LineSegments2(lineGeometry, this.lineMaterial);
50
+ this.lines.onBeforeRender = (renderer) => {
51
+ renderer.getSize(this.lineMaterial.resolution);
52
+ };
53
+ this.lines.frustumCulled = false;
54
+ this.lines.renderOrder = 1001;
55
+ this.add(this.lines);
56
+
57
+ this.pointPositions = new Float32Array(Math.max(bones.length * 3, 3));
58
+ const pointGeometry = new THREE.BufferGeometry();
59
+ pointGeometry.setAttribute('position', new THREE.BufferAttribute(this.pointPositions, 3));
60
+ const pointMaterial = new THREE.PointsMaterial({
61
+ color,
62
+ size: 11,
63
+ sizeAttenuation: false,
64
+ depthTest: false,
65
+ depthWrite: false,
66
+ toneMapped: false,
67
+ });
68
+ this.points = new THREE.Points(pointGeometry, pointMaterial);
69
+ this.points.frustumCulled = false;
70
+ this.points.renderOrder = 1002;
71
+ this.add(this.points);
72
+
73
+ this.name = '__object3d_document_bone_selection';
74
+ setObjectMark(this, 'editorHelper', true);
75
+ this.traverse((object) => object.layers.set(EDITOR_LAYER));
76
+ this.update();
77
+ }
78
+
79
+ setColor(color: number): void {
80
+ this.lineMaterial.color.setHex(color);
81
+ (this.points.material as THREE.PointsMaterial).color.setHex(color);
82
+ }
83
+
84
+ update(): void {
85
+ let offset = 0;
86
+ for (const [start, end] of this.segments) {
87
+ start.getWorldPosition(this.worldPosition);
88
+ this.linePositions.set(this.worldPosition.toArray(), offset);
89
+ end.getWorldPosition(this.worldPosition);
90
+ this.linePositions.set(this.worldPosition.toArray(), offset + 3);
91
+ offset += 6;
92
+ }
93
+ const lineStart = this.lines.geometry.getAttribute('instanceStart');
94
+ if (lineStart) (lineStart as THREE.InterleavedBufferAttribute).data.needsUpdate = true;
95
+
96
+ offset = 0;
97
+ for (const bone of this.bones) {
98
+ bone.getWorldPosition(this.worldPosition);
99
+ this.pointPositions.set(this.worldPosition.toArray(), offset);
100
+ offset += 3;
101
+ }
102
+ const points = this.points.geometry.getAttribute('position');
103
+ if (points) points.needsUpdate = true;
104
+ }
105
+
106
+ dispose(): void {
107
+ this.lines.geometry.dispose();
108
+ this.lineMaterial.dispose();
109
+ this.points.geometry.dispose();
110
+ (this.points.material as THREE.Material).dispose();
111
+ }
112
+
113
+ private addSegment(start: THREE.Bone, end: THREE.Bone, seen: Set<string>): void {
114
+ const key = `${start.uuid}:${end.uuid}`;
115
+ if (seen.has(key)) return;
116
+ seen.add(key);
117
+ this.segments.push([start, end]);
118
+ }
119
+ }
@@ -0,0 +1,41 @@
1
+ import * as THREE from 'three';
2
+
3
+ /** Distance that fits an axis-aligned world box for one perspective viewing direction. */
4
+ export function perspectiveDistanceToFitBox(
5
+ box: THREE.Box3,
6
+ camera: THREE.PerspectiveCamera,
7
+ direction: THREE.Vector3,
8
+ padding = 1.15,
9
+ ): number {
10
+ if (box.isEmpty()) return 3;
11
+ const viewDirection = direction.clone().normalize();
12
+ const fallbackUp =
13
+ Math.abs(viewDirection.dot(camera.up)) > 0.999 ? new THREE.Vector3(0, 0, 1) : camera.up;
14
+ const right = new THREE.Vector3().crossVectors(fallbackUp, viewDirection).normalize();
15
+ const up = new THREE.Vector3().crossVectors(viewDirection, right).normalize();
16
+ const center = box.getCenter(new THREE.Vector3());
17
+ let halfDepth = 0;
18
+ let halfHeight = 0;
19
+ let halfWidth = 0;
20
+ for (const x of [box.min.x, box.max.x]) {
21
+ for (const y of [box.min.y, box.max.y]) {
22
+ for (const z of [box.min.z, box.max.z]) {
23
+ const offset = new THREE.Vector3(x, y, z).sub(center);
24
+ halfWidth = Math.max(halfWidth, Math.abs(offset.dot(right)));
25
+ halfHeight = Math.max(halfHeight, Math.abs(offset.dot(up)));
26
+ halfDepth = Math.max(halfDepth, Math.abs(offset.dot(viewDirection)));
27
+ }
28
+ }
29
+ }
30
+ const verticalHalfFov = THREE.MathUtils.degToRad(camera.fov * 0.5);
31
+ const horizontalHalfFov = Math.atan(Math.tan(verticalHalfFov) * Math.max(camera.aspect, 0.01));
32
+ const fitDistance = Math.max(
33
+ halfHeight / Math.tan(verticalHalfFov),
34
+ halfWidth / Math.tan(horizontalHalfFov),
35
+ );
36
+ // The floor is the camera's own near plane, not a metre count: a 3 m floor
37
+ // framed every prop under two metres at the same distance, so a 0.5 m
38
+ // mushroom opened as a thumb-sized thing in the middle of the viewport
39
+ // and Frame did nothing (measured 2026-09-06: fit 0.62 m, answer 3.0 m).
40
+ return Math.max(fitDistance * padding + halfDepth, camera.near * 4, 0.01);
41
+ }
@@ -0,0 +1,132 @@
1
+ /**
2
+ * The reusable renderer lane for interactive Object3D document stages.
3
+ *
4
+ * A document owns its source and per-pane state; this pool owns only the GPU
5
+ * attachment. Hidden panes return their lease, so open tabs do not each pin a
6
+ * WebGL context. One idle entry keeps the expensive driver/program setup warm
7
+ * for the next revealed pane. Active panes receive exclusive leases and scale
8
+ * with the number of panes that are actually visible.
9
+ */
10
+
11
+ import { markHostRenderer } from '@volter/editor-threejs/viewport/renderer-ownership';
12
+ import * as THREE from 'three';
13
+
14
+ const IDLE_CAPACITY = 1;
15
+
16
+ interface InteractiveRendererEntry {
17
+ readonly canvas: HTMLCanvasElement;
18
+ readonly renderer: THREE.WebGLRenderer;
19
+ leased: boolean;
20
+ lost: boolean;
21
+ onContextLost: (() => void) | null;
22
+ }
23
+
24
+ const entries: InteractiveRendererEntry[] = [];
25
+
26
+ export interface InteractiveViewportRendererLease {
27
+ readonly canvas: HTMLCanvasElement;
28
+ readonly renderer: THREE.WebGLRenderer;
29
+ release(): void;
30
+ }
31
+
32
+ function disposeEntry(entry: InteractiveRendererEntry): void {
33
+ const index = entries.indexOf(entry);
34
+ if (index >= 0) entries.splice(index, 1);
35
+ entry.renderer.dispose();
36
+ entry.renderer.forceContextLoss();
37
+ entry.canvas.remove();
38
+ }
39
+
40
+ function createEntry(width: number, height: number): InteractiveRendererEntry {
41
+ const canvas = document.createElement('canvas');
42
+ canvas.style.width = '100%';
43
+ canvas.style.height = '100%';
44
+ canvas.style.display = 'block';
45
+ canvas.width = Math.max(1, width);
46
+ canvas.height = Math.max(1, height);
47
+ const entry: InteractiveRendererEntry = {
48
+ canvas,
49
+ renderer: markHostRenderer(new THREE.WebGLRenderer({ canvas, antialias: true, alpha: true })),
50
+ leased: true,
51
+ lost: false,
52
+ onContextLost: null,
53
+ };
54
+ canvas.addEventListener('webglcontextlost', () => {
55
+ entry.lost = true;
56
+ entry.onContextLost?.();
57
+ const index = entries.indexOf(entry);
58
+ if (index >= 0) entries.splice(index, 1);
59
+ if (!entry.leased) disposeEntry(entry);
60
+ });
61
+ entries.push(entry);
62
+ return entry;
63
+ }
64
+
65
+ /** Reset every mutable renderer setting a document is allowed to change. */
66
+ function resetRenderer(entry: InteractiveRendererEntry): void {
67
+ const { renderer } = entry;
68
+ renderer.setRenderTarget(null);
69
+ renderer.setScissorTest(false);
70
+ renderer.setViewport(0, 0, Math.max(1, entry.canvas.width), Math.max(1, entry.canvas.height));
71
+ renderer.setScissor(0, 0, Math.max(1, entry.canvas.width), Math.max(1, entry.canvas.height));
72
+ renderer.autoClear = true;
73
+ renderer.autoClearColor = true;
74
+ renderer.autoClearDepth = true;
75
+ renderer.autoClearStencil = true;
76
+ renderer.sortObjects = true;
77
+ renderer.localClippingEnabled = false;
78
+ renderer.clippingPlanes = [];
79
+ renderer.shadowMap.enabled = false;
80
+ renderer.shadowMap.autoUpdate = true;
81
+ renderer.toneMapping = THREE.NoToneMapping;
82
+ renderer.toneMappingExposure = 1;
83
+ renderer.outputColorSpace = THREE.SRGBColorSpace;
84
+ renderer.xr.enabled = false;
85
+ renderer.setAnimationLoop(null);
86
+ renderer.setClearColor(0x000000, 0);
87
+ renderer.clear(true, true, true);
88
+ renderer.info.reset();
89
+ }
90
+
91
+ /** Acquire one exclusive interactive renderer. */
92
+ export function acquireInteractiveViewportRenderer(
93
+ width: number,
94
+ height: number,
95
+ onContextLost?: () => void,
96
+ ): InteractiveViewportRendererLease {
97
+ let entry = entries.find((candidate) => !candidate.leased && !candidate.lost);
98
+ if (!entry) entry = createEntry(width, height);
99
+ entry.leased = true;
100
+ entry.onContextLost = onContextLost ?? null;
101
+ const held = entry;
102
+ let released = false;
103
+ return {
104
+ canvas: held.canvas,
105
+ renderer: held.renderer,
106
+ release(): void {
107
+ if (released) return;
108
+ released = true;
109
+ held.leased = false;
110
+ held.onContextLost = null;
111
+ held.canvas.remove();
112
+ if (held.lost) {
113
+ disposeEntry(held);
114
+ return;
115
+ }
116
+ resetRenderer(held);
117
+ const idle = entries.filter((candidate) => !candidate.leased && !candidate.lost);
118
+ for (const overflow of idle.slice(IDLE_CAPACITY)) disposeEntry(overflow);
119
+ },
120
+ };
121
+ }
122
+
123
+ /** Diagnostic readback used by live acceptance checks. */
124
+ export function interactiveViewportRendererCounts(): {
125
+ readonly active: number;
126
+ readonly idle: number;
127
+ } {
128
+ return {
129
+ active: entries.filter((entry) => entry.leased && !entry.lost).length,
130
+ idle: entries.filter((entry) => !entry.leased && !entry.lost).length,
131
+ };
132
+ }
@@ -0,0 +1,310 @@
1
+ /**
2
+ * Selection fallback: eight CORNER BRACKETS on an entity's world AABB.
3
+ *
4
+ * Renderable geometry receives the native silhouette in
5
+ * `selection-outline.ts`. These brackets remain for cameras, lights,
6
+ * audio sources and empty transforms: objects with no pixels for a silhouette
7
+ * effect to find. At each AABB corner, three short arms run back along the
8
+ * box's own edges, preserving an extent cue without drawing a full wire box.
9
+ *
10
+ * Drawn with three's fat-line addons (`LineSegments2` + `LineSegmentsGeometry`
11
+ * + `LineMaterial`) so the stroke is a real screen-space width rather than the
12
+ * driver's 1px `gl.LINES`, which is the other half of why the old box vanished.
13
+ * The screen-space width needs `LineMaterial.resolution`; nothing here or in
14
+ * the viewport sets it, because `LineSegments2.onBeforeRender` already pushes
15
+ * the live renderer viewport into that uniform on every draw. A second writer
16
+ * would only be a stale one.
17
+ *
18
+ * The Bounds DIAGNOSTIC (`helperVisibility.bounds`) deliberately keeps the
19
+ * plain full twelve-edge box on every entity: that view is about density, and
20
+ * brackets on everything would be noise.
21
+ */
22
+
23
+ import { contentWorldBounds } from '@volter/editor-threejs/viewport/content-bounds';
24
+ import * as THREE from 'three';
25
+ import { LineMaterial } from 'three/addons/lines/LineMaterial.js';
26
+ import { LineSegments2 } from 'three/addons/lines/LineSegments2.js';
27
+ import { LineSegmentsGeometry } from 'three/addons/lines/LineSegmentsGeometry.js';
28
+
29
+ /** Stroke width in CSS pixels (`LineMaterial` screen-space units). */
30
+ export const SELECTION_BRACKET_LINEWIDTH = 3;
31
+
32
+ /**
33
+ * How far the cage stands OFF the entity, as a fraction of each axis extent.
34
+ *
35
+ * Owner ask (2026-08-11): "the corner highlights are exactly ON the model. I
36
+ * frequently do not see it." Drawn on the exact AABB, a bracket on anything
37
+ * box-shaped is coplanar with the surface it is supposed to be marking — it
38
+ * z-fights, it takes the object's own shading, and on a flat face it simply
39
+ * disappears into the edge it lies along. The cage has to float clear of the
40
+ * silhouette to read as a separate thing.
41
+ */
42
+ export const BRACKET_STANDOFF_FRACTION = 0.05;
43
+
44
+ /** World-unit floor for that stand-off, so a tiny prop still gets clearance. */
45
+ export const BRACKET_STANDOFF_MIN = 0.03;
46
+
47
+ /** World-unit ceiling, so a terrain-scale box does not float meters away. */
48
+ export const BRACKET_STANDOFF_MAX = 0.6;
49
+
50
+ /** Arm length as a fraction of that axis's box extent. */
51
+ export const BRACKET_ARM_FRACTION = 0.15;
52
+
53
+ /** World-unit floor, so a small prop still shows a bracket rather than a dot. */
54
+ export const BRACKET_ARM_MIN = 0.08;
55
+
56
+ /** World-unit ceiling, so a terrain-scale box does not draw multi-meter arms. */
57
+ export const BRACKET_ARM_MAX = 3;
58
+
59
+ /**
60
+ * Hard cap as a fraction of the extent. Without it the clamped MIN would make
61
+ * arms from opposite corners meet on a small box — which is a full box outline
62
+ * again, i.e. exactly the shape we are moving away from.
63
+ */
64
+ export const BRACKET_ARM_EXTENT_CAP = 0.45;
65
+
66
+ /**
67
+ * Non-zero floor so a flat box (a ground plane's zero Y extent) still yields a
68
+ * real direction vector. `LineMaterial` normalizes the segment direction, so a
69
+ * genuinely zero-length segment is a NaN in the vertex shader.
70
+ */
71
+ const BRACKET_ARM_EPSILON = 1e-3;
72
+
73
+ /** Eight corners × three arms. */
74
+ export const BRACKET_SEGMENT_COUNT = 24;
75
+
76
+ /** Six floats per segment (start xyz, end xyz). */
77
+ const FLOATS_PER_SEGMENT = 6;
78
+
79
+ /** The eight AABB corners as min(0)/max(1) picks per axis. */
80
+ const BOX_CORNERS: readonly (readonly [0 | 1, 0 | 1, 0 | 1])[] = [
81
+ [0, 0, 0],
82
+ [0, 0, 1],
83
+ [0, 1, 0],
84
+ [0, 1, 1],
85
+ [1, 0, 0],
86
+ [1, 0, 1],
87
+ [1, 1, 0],
88
+ [1, 1, 1],
89
+ ];
90
+
91
+ /** Arm length for one axis, given that axis's extent of the world AABB. */
92
+ export function bracketArmLength(extent: number): number {
93
+ const scaled = THREE.MathUtils.clamp(
94
+ extent * BRACKET_ARM_FRACTION,
95
+ BRACKET_ARM_MIN,
96
+ BRACKET_ARM_MAX,
97
+ );
98
+ return Math.max(Math.min(scaled, extent * BRACKET_ARM_EXTENT_CAP), BRACKET_ARM_EPSILON);
99
+ }
100
+
101
+ /** Clearance for one axis, given that axis's extent of the world AABB. */
102
+ export function bracketStandoff(extent: number): number {
103
+ return THREE.MathUtils.clamp(
104
+ extent * BRACKET_STANDOFF_FRACTION,
105
+ BRACKET_STANDOFF_MIN,
106
+ BRACKET_STANDOFF_MAX,
107
+ );
108
+ }
109
+
110
+ /**
111
+ * Write the 24 bracket segments for `box` into `out` (length
112
+ * `BRACKET_SEGMENT_COUNT * 6`). Positions are world-space; the holder object
113
+ * stays at the identity transform.
114
+ */
115
+ export function writeBracketSegments(box: THREE.Box3, out: Float32Array): void {
116
+ const { min, max } = box;
117
+ const ax = bracketArmLength(max.x - min.x);
118
+ const ay = bracketArmLength(max.y - min.y);
119
+ const az = bracketArmLength(max.z - min.z);
120
+
121
+ let i = 0;
122
+ for (const [cx, cy, cz] of BOX_CORNERS) {
123
+ const x = cx === 0 ? min.x : max.x;
124
+ const y = cy === 0 ? min.y : max.y;
125
+ const z = cz === 0 ? min.z : max.z;
126
+ // Arms run INWARD along their edge, so a bracket always sits on the box
127
+ // rather than sticking out past the corner.
128
+ const dx = cx === 0 ? ax : -ax;
129
+ const dy = cy === 0 ? ay : -ay;
130
+ const dz = cz === 0 ? az : -az;
131
+ // X arm
132
+ out[i++] = x;
133
+ out[i++] = y;
134
+ out[i++] = z;
135
+ out[i++] = x + dx;
136
+ out[i++] = y;
137
+ out[i++] = z;
138
+ // Y arm
139
+ out[i++] = x;
140
+ out[i++] = y;
141
+ out[i++] = z;
142
+ out[i++] = x;
143
+ out[i++] = y + dy;
144
+ out[i++] = z;
145
+ // Z arm
146
+ out[i++] = x;
147
+ out[i++] = y;
148
+ out[i++] = z;
149
+ out[i++] = x;
150
+ out[i++] = y;
151
+ out[i++] = z + dz;
152
+ }
153
+ }
154
+
155
+ export interface SelectionBracketsOptions {
156
+ /** Renderer-ready current palette accent. */
157
+ readonly color: number;
158
+ /**
159
+ * Edge length of a fixed-size cube centered on the entity's world position,
160
+ * used instead of a computed AABB. This is the degenerate-geometry path —
161
+ * cameras, lights and audio sources own no renderable geometry, so the bounds
162
+ * walk returns an empty or meaningless box.
163
+ */
164
+ readonly fixedSize?: number;
165
+ }
166
+
167
+ /**
168
+ * Corner brackets for one entity, recomputed in place when its bounds are
169
+ * invalidated.
170
+ *
171
+ * A bounds refresh costs one `contentWorldBounds` walk plus 144 writes into the
172
+ * already-allocated instance buffer. Static selections retain that result;
173
+ * root motion and vertex animation invalidate it. Nothing reallocates after
174
+ * construction.
175
+ */
176
+ export class SelectionBrackets extends LineSegments2 {
177
+ /** The entity object this bracket set is glued to. */
178
+ readonly entityObject: THREE.Object3D;
179
+
180
+ private readonly _fixedSize: number | undefined;
181
+ private readonly _positions = new Float32Array(BRACKET_SEGMENT_COUNT * FLOATS_PER_SEGMENT);
182
+ private readonly _box = new THREE.Box3();
183
+ private readonly _worldPos = new THREE.Vector3();
184
+ private readonly _fixedExtent = new THREE.Vector3();
185
+ private readonly _standoff = new THREE.Vector3();
186
+ private readonly _lastRootMatrix = new Float32Array(16);
187
+ private readonly _requiresContinuousBounds: boolean;
188
+
189
+ constructor(entityObject: THREE.Object3D, options: SelectionBracketsOptions) {
190
+ const geometry = new LineSegmentsGeometry();
191
+ const material = new LineMaterial({
192
+ color: options.color,
193
+ linewidth: SELECTION_BRACKET_LINEWIDTH,
194
+ // Screen-space width: a bracket must read the same on a 0.2m prop and a
195
+ // 200m terrain chunk.
196
+ worldUnits: false,
197
+ alphaToCoverage: true,
198
+ toneMapped: false,
199
+ // DRAW THROUGH. A depth-tested cage is hidden by the very object it
200
+ // marks the moment the two touch, and by anything standing in front of
201
+ // it — so the one question this shape exists to answer, "where is my
202
+ // selection", goes unanswered exactly when the scene is busy enough for
203
+ // the reader to be asking. Selection is chrome about the scene, not
204
+ // geometry in it, and chrome is never occluded.
205
+ depthTest: false,
206
+ depthWrite: false,
207
+ });
208
+ super(geometry, material);
209
+ this.entityObject = entityObject;
210
+ this._fixedSize = options.fixedSize;
211
+ // A static hierarchy's world bounds do not change because the camera did.
212
+ // Detect the cases whose vertices can move without an editor transform
213
+ // notification; those keep the old every-frame bounds refresh. Ordinary
214
+ // terrain/building groups instead refresh only when their root transform
215
+ // changes (and `_syncBoxHelpers` reconstructs them after source/store
216
+ // changes), avoiding one recursive Box3 walk per selected subtree per RAF.
217
+ let requiresContinuousBounds = false;
218
+ entityObject.traverse((child) => {
219
+ const mesh = child as THREE.Mesh;
220
+ if (
221
+ (child as THREE.SkinnedMesh).isSkinnedMesh ||
222
+ (Array.isArray(mesh.morphTargetInfluences) && mesh.morphTargetInfluences.length > 0) ||
223
+ // Presence, not `instanceof`. This mixer is written by the ENGINE
224
+ // (`ecs/user-data.ts`), which under the packaged runtime is the
225
+ // PROJECT's installed engine constructing it from the PROJECT's
226
+ // `three` — a different module instance, so `instanceof` is false for
227
+ // a real mixer and an animated selection silently loses its
228
+ // continuous bounds. `AnimationMixer` carries no `is*` brand, but the
229
+ // userData KEY is itself the declaration, which is exactly how the
230
+ // engine's own reader tests it (`render-batch-system.ts`'s
231
+ // `getUserData(cur, '_animMixer')`).
232
+ Boolean(child.userData['_animMixer'])
233
+ ) {
234
+ requiresContinuousBounds = true;
235
+ }
236
+ });
237
+ this._requiresContinuousBounds = requiresContinuousBounds;
238
+ // Drawn after the scene so the un-depth-tested cage lands on top of it.
239
+ // Left below the transform gizmo, which owns the foreground while a drag
240
+ // is live.
241
+ this.renderOrder = 1;
242
+ // Positions are world-space and may be rewritten immediately before a
243
+ // draw, so the geometry's own bounds can be stale; culling 24 instanced
244
+ // quads buys nothing worth that risk.
245
+ this.frustumCulled = false;
246
+ geometry.setPositions(this._positions);
247
+ this.update();
248
+ }
249
+
250
+ setColor(color: number): void {
251
+ (this.material as LineMaterial).color.setHex(color);
252
+ }
253
+
254
+ /**
255
+ * Cheap RAF path. Static selected subtrees retain their already-computed
256
+ * world AABB until their root moves; animated vertex data still refreshes
257
+ * continuously. Call {@link update} to force a refresh after an out-of-band
258
+ * descendant mutation.
259
+ */
260
+ updateIfNeeded(): void {
261
+ this.entityObject.updateWorldMatrix(true, false);
262
+ const matrix = this.entityObject.matrixWorld.elements;
263
+ let rootChanged = false;
264
+ for (let index = 0; index < matrix.length; index++) {
265
+ if (matrix[index] !== this._lastRootMatrix[index]) {
266
+ rootChanged = true;
267
+ break;
268
+ }
269
+ }
270
+ if (rootChanged || this._requiresContinuousBounds) this.update();
271
+ }
272
+
273
+ /** Recompute the AABB and reposition the arms. Safe to call every frame. */
274
+ update(): void {
275
+ this.entityObject.updateWorldMatrix(true, false);
276
+ if (this._fixedSize !== undefined) {
277
+ this.entityObject.getWorldPosition(this._worldPos);
278
+ this._fixedExtent.setScalar(this._fixedSize);
279
+ this._box.setFromCenterAndSize(this._worldPos, this._fixedExtent);
280
+ } else {
281
+ // Content only — a built-internal child (a world-space particle renderer
282
+ // at identity, a pooled batch) would otherwise drag the cage off to
283
+ // wherever its machinery lives. See `content-bounds.ts`.
284
+ contentWorldBounds(this.entityObject, this._box);
285
+ if (this._box.isEmpty()) return;
286
+ }
287
+ // Stand the cage off the silhouette. Per-axis, so a flat object (a ground
288
+ // plane, a wall panel) gains real clearance on the axis it has no extent
289
+ // in rather than staying welded to its own face.
290
+ this._box.getSize(this._standoff);
291
+ this._standoff.set(
292
+ bracketStandoff(this._standoff.x),
293
+ bracketStandoff(this._standoff.y),
294
+ bracketStandoff(this._standoff.z),
295
+ );
296
+ this._box.expandByVector(this._standoff);
297
+ writeBracketSegments(this._box, this._positions);
298
+ const start = this.geometry.getAttribute('instanceStart');
299
+ // Both instanceStart and instanceEnd are views onto the one interleaved
300
+ // buffer that owns `_positions`; flagging either one uploads all of it.
301
+ if (start) (start as THREE.InterleavedBufferAttribute).data.needsUpdate = true;
302
+ this._lastRootMatrix.set(this.entityObject.matrixWorld.elements);
303
+ }
304
+
305
+ /** Release GPU resources. Mirrors the viewport's BoxHelper dispose path. */
306
+ dispose(): void {
307
+ this.geometry.dispose();
308
+ (this.material as LineMaterial).dispose();
309
+ }
310
+ }