@volter/editor-threejs 0.5.66 → 0.5.68

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 (99) hide show
  1. package/contributions/animation-timeline.utility.tsx +44 -0
  2. package/contributions/three-integration.service.ts +13 -0
  3. package/package.json +96 -6
  4. package/src/adapter/renderer-config.ts +3 -4
  5. package/src/adapter/three-contract.ts +72 -0
  6. package/src/ecs/object-marks.ts +1 -1
  7. package/src/ecs/user-data.ts +0 -9
  8. package/src/host-hierarchy-objects.ts +31 -0
  9. package/src/kit/animation/three-clips-subject.ts +190 -0
  10. package/src/kit/asset-compare.ts +294 -0
  11. package/src/kit/asset-preview-command.ts +265 -0
  12. package/src/kit/asset-preview-framing.ts +357 -0
  13. package/src/kit/asset-preview.ts +2802 -0
  14. package/src/kit/asset-workflow/model-inspection.ts +830 -0
  15. package/src/kit/authoring/component-instance-root.ts +171 -0
  16. package/src/kit/authoring/design-time-settle.ts +343 -0
  17. package/src/kit/authoring/live-object-transform.ts +62 -0
  18. package/src/kit/authoring/object3d-document-session-registry.ts +154 -0
  19. package/src/kit/authoring/object3d-document-session.ts +1965 -0
  20. package/src/kit/authoring/object3d-gesture-controller.ts +113 -0
  21. package/src/kit/authoring/quarks-particle-systems.ts +19 -0
  22. package/src/kit/authoring/shell-viewport-policy.ts +48 -0
  23. package/src/kit/authoring/source-object3d-authoring-adapter.ts +526 -0
  24. package/src/kit/authoring/three-projection-core.ts +226 -0
  25. package/src/kit/authoring/viewport-pick-context.ts +39 -0
  26. package/src/kit/authoring/viewport-raycast.ts +240 -0
  27. package/src/kit/authoring/world-hidden-viewport.ts +95 -0
  28. package/src/kit/camera-authoring.ts +175 -0
  29. package/src/kit/components/CameraInfo.tsx +56 -0
  30. package/src/kit/components/InspectorObjectPreview.tsx +57 -0
  31. package/src/kit/components/Object3DDocumentToolbar.tsx +549 -0
  32. package/src/kit/components/Object3DDocumentViewport.tsx +58 -0
  33. package/src/kit/components/StageHost.tsx +2547 -0
  34. package/src/kit/components/StageOverlays.tsx +21 -0
  35. package/src/kit/components/StatsOverlay.tsx +78 -0
  36. package/src/kit/components/ToolObject3DPreview.tsx +39 -0
  37. package/src/kit/components/ViewportFurniture.tsx +655 -0
  38. package/src/kit/components/ViewportOverlay.tsx +215 -0
  39. package/src/kit/components/ViewportShadingMenu.tsx +340 -0
  40. package/src/kit/components/ViewportViewMenu.tsx +155 -0
  41. package/src/kit/components/asset-viewers/EntityModelDocument.tsx +121 -0
  42. package/src/kit/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
  43. package/src/kit/components/asset-viewers/LiveModuleDocument.tsx +395 -0
  44. package/src/kit/components/asset-viewers/LutAssetDocument.tsx +444 -0
  45. package/src/kit/components/asset-viewers/ModelAssetDocument.tsx +105 -0
  46. package/src/kit/components/asset-viewers/Object3DPreview.tsx +356 -0
  47. package/src/kit/components/asset-viewers/QuarksAssetDocument.tsx +527 -0
  48. package/src/kit/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
  49. package/src/kit/components/asset-viewers/three-asset-viewers.tsx +132 -0
  50. package/src/kit/components/object3d-contribution-surfaces.tsx +33 -0
  51. package/src/kit/components/stage-keyboard.tsx +40 -0
  52. package/src/kit/components/stage-overlay-set.tsx +105 -0
  53. package/src/kit/components/stage-presence-markers.ts +482 -0
  54. package/src/kit/components/stage-transform-chrome.ts +30 -0
  55. package/src/kit/components/stage-transform-tools.tsx +73 -0
  56. package/src/kit/components/stage-view-name.ts +30 -0
  57. package/src/kit/components/standard-viewport-dressing.ts +1042 -0
  58. package/src/kit/components/world-root-binding.ts +64 -0
  59. package/src/kit/constraint-helper.ts +338 -0
  60. package/src/kit/editor-shell-store.ts +814 -0
  61. package/src/kit/editor-viewport.ts +6621 -0
  62. package/src/kit/entity-lod.ts +31 -0
  63. package/src/kit/entity-object.ts +92 -0
  64. package/src/kit/hierarchy-mark-reader.ts +74 -0
  65. package/src/kit/instanced-presentation.ts +164 -0
  66. package/src/kit/live-module-source.ts +230 -0
  67. package/src/kit/model-thumbnail.ts +539 -0
  68. package/src/kit/play-camera-flight.ts +300 -0
  69. package/src/kit/projection/three.ts +898 -0
  70. package/src/kit/reflection-probe-helper.ts +142 -0
  71. package/src/kit/scene-document-viewport.ts +51 -0
  72. package/src/kit/scene-framing.ts +315 -0
  73. package/src/kit/scene-view-fog.ts +89 -0
  74. package/src/kit/spatial-handle-visuals.ts +332 -0
  75. package/src/kit/stories/three-story-model.ts +66 -0
  76. package/src/kit/three-canvas-render.ts +44 -0
  77. package/src/kit/three-hierarchy-row-media.ts +26 -0
  78. package/src/kit/three-inspection-media.ts +73 -0
  79. package/src/kit/three-integration.ts +86 -0
  80. package/src/kit/three-state.ts +33 -0
  81. package/src/kit/three-viewport/bone-selection-highlight.ts +119 -0
  82. package/src/kit/three-viewport/camera-fit.ts +41 -0
  83. package/src/kit/three-viewport/interactive-renderer.ts +132 -0
  84. package/src/kit/three-viewport/selection-brackets.ts +355 -0
  85. package/src/kit/three-viewport/selection-outline.ts +333 -0
  86. package/src/kit/three-viewport/skeleton-helper.ts +61 -0
  87. package/src/kit/three-viewport/source-color.ts +197 -0
  88. package/src/kit/three-viewport/studio-environment.ts +96 -0
  89. package/src/kit/trigger-volume-helper.ts +116 -0
  90. package/src/kit/viewport-actions.ts +128 -0
  91. package/src/kit/viewport-authoring-policy.ts +154 -0
  92. package/src/kit/viewport-commands.ts +318 -0
  93. package/src/kit/viewport-hotkeys.ts +119 -0
  94. package/src/kit/viewport-shading-boundary.ts +12 -0
  95. package/src/kit/viewport-status-facet.ts +53 -0
  96. package/src/object3d-contributions.ts +494 -0
  97. package/src/render/viewport-shading.ts +6 -2
  98. package/src/viewport-api.ts +92 -0
  99. package/src/viewport-door.ts +237 -0
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Lightweight registry for live Object3D document sessions.
3
+ *
4
+ * State/control readers only need to find a session that some document has
5
+ * already constructed. Keeping this map beside the implementation made every
6
+ * reader load the implementation's postprocessing, skeleton, outline and
7
+ * diagnostic-rendering graph during a plain Scene boot. The class remains the
8
+ * native session type; this module owns only its live identities.
9
+ */
10
+ import { startingPresentation, viewGridVisible, viewPresentationBinding } from '@volter/editor-sdk/kit/viewport-presentation';
11
+ import {
12
+ type DocumentViewport,
13
+ registerDocumentViewport,
14
+ } from '@volter/editor-sdk/kit/document-viewports';
15
+ import { lazy } from 'react';
16
+ import type { Object3DDocumentSession } from './object3d-document-session';
17
+ import { registerDocumentStageSession } from '@volter/editor-sdk/kit/document-stage-sessions';
18
+
19
+ // The document header's shading, helpers and capture menus. Behind `lazy()`, so
20
+ // this registry stays the light read it is for every other caller.
21
+ const Object3DDocumentToolbar = lazy(() =>
22
+ import('../components/Object3DDocumentToolbar').then((m) => ({ default: m.Object3DDocumentToolbar })),
23
+ );
24
+
25
+ const sessions = new Map<string, Object3DDocumentSession>();
26
+ const preparations = new Map<string, () => Promise<void>>();
27
+ let registryVersion = 0;
28
+ const registryListeners = new Set<() => void>();
29
+
30
+ function notifyRegistry(): void {
31
+ registryVersion++;
32
+ for (const listener of registryListeners) listener();
33
+ }
34
+
35
+ /** `stage` is what the mounting stage adds to the document's viewport (its
36
+ * transform tools, which only the stage host knows how to draw). */
37
+ export function registerObject3DDocumentSession(
38
+ session: Object3DDocumentSession,
39
+ stage: Partial<DocumentViewport> = {},
40
+ ): () => void {
41
+ sessions.set(session.documentId, session);
42
+ const stopStageSession = registerDocumentStageSession(session);
43
+ const stopViewport = registerDocumentViewport(session.documentId, {
44
+ ...object3DDocumentViewport(session),
45
+ ...stage,
46
+ });
47
+ notifyRegistry();
48
+ return () => {
49
+ stopViewport();
50
+ stopStageSession();
51
+ if (sessions.get(session.documentId) !== session) return;
52
+ sessions.delete(session.documentId);
53
+ notifyRegistry();
54
+ };
55
+ }
56
+
57
+ const xyz = ([x, y, z]: readonly [number, number, number]) => ({ x, y, z });
58
+
59
+ /** An Object3D document's own viewport: its session's camera, view mode, grid,
60
+ * framing, selection and photograph (`@volter/editor-sdk/kit/document-viewports`). */
61
+ function object3DDocumentViewport(session: Object3DDocumentSession): DocumentViewport {
62
+ type Preset = Parameters<Object3DDocumentSession['setViewPreset']>[0];
63
+ type Mode = Parameters<Object3DDocumentSession['setMode']>[0];
64
+ return {
65
+ read: () => {
66
+ const pose = session.cameraPose();
67
+ const presentation = session.presentation();
68
+ return {
69
+ camera: { position: xyz(pose.position), target: xyz(pose.target), ...(pose.fov ? { fov: pose.fov } : {}) },
70
+ diagnostic: presentation.skeleton ? 'skeleton' : presentation.mode,
71
+ grid: viewGridVisible(session.documentId),
72
+ };
73
+ },
74
+ setDiagnostic: (diagnostic) => {
75
+ // `preview` and `rendered` are lit as the stage says; a stage that says nothing refuses them.
76
+ if (diagnostic === 'preview' || diagnostic === 'rendered') {
77
+ const stageKind = viewPresentationBinding(session.documentId)?.stageKind;
78
+ if (!stageKind || startingPresentation(stageKind)?.modes?.[diagnostic]?.lighting === undefined) return false;
79
+ }
80
+ session.setSkeleton(diagnostic === 'skeleton');
81
+ session.setBounds(diagnostic === 'bounds');
82
+ session.setMode(diagnostic === 'skeleton' || diagnostic === 'bounds' ? 'solid' : (diagnostic as Mode));
83
+ return true;
84
+ },
85
+ setCamera: (camera) => {
86
+ if (typeof camera !== 'string') {
87
+ session.setCameraPose(camera.position, camera.target, camera.fov);
88
+ } else if (camera === 'perspective') {
89
+ session.setProjection('perspective');
90
+ session.frame();
91
+ } else session.setViewPreset(camera as Preset);
92
+ return true;
93
+ },
94
+ frame: (target) => (target === 'selection' ? session.frameSelection() : (session.frame(), true)),
95
+ selection: { read: () => session.selection(), apply: (ids) => session.select(ids) },
96
+ idsNamed: (name) => {
97
+ const ids: string[] = [];
98
+ session.root.traverse((object) => {
99
+ if (object.name !== name) return;
100
+ const id = session.idForObject(object);
101
+ if (id) ids.push(id);
102
+ });
103
+ return ids;
104
+ },
105
+ setTransformMode: (mode) => session.viewport.setTransformMode(mode),
106
+ capture: (size) => session.captureImage(size ?? 512),
107
+ prepare: () => prepareObject3DDocument(session.documentId),
108
+ HeaderControls: Object3DDocumentToolbar,
109
+ };
110
+ }
111
+
112
+ export function object3DDocumentSession(documentId: string): Object3DDocumentSession | null {
113
+ return sessions.get(documentId) ?? null;
114
+ }
115
+
116
+ /** Async source-backed documents refresh their graph before a requested view
117
+ * is presented. The callback owns its build and failure semantics. */
118
+ export function registerObject3DDocumentPreparation(
119
+ documentId: string,
120
+ prepare: () => Promise<void>,
121
+ ): () => void {
122
+ preparations.set(documentId, prepare);
123
+ return () => {
124
+ if (preparations.get(documentId) === prepare) preparations.delete(documentId);
125
+ };
126
+ }
127
+
128
+ export async function prepareObject3DDocument(documentId: string): Promise<void> {
129
+ await preparations.get(documentId)?.();
130
+ }
131
+
132
+ /** Every live CHROMED document session — the ones that own a toolbar, an
133
+ * inspector context and a performance source. This is a presentation registry,
134
+ * not the Edit-static one: whether a surface's CONTENT time is held is asked of
135
+ * `coverage/design-time-surfaces.ts`, which every mount publishes into
136
+ * (chromeless preview cards included). */
137
+ export function allObject3DDocumentSessions(): readonly Object3DDocumentSession[] {
138
+ return [...sessions.values()];
139
+ }
140
+
141
+ export function subscribeObject3DDocumentSessions(listener: () => void): () => void {
142
+ registryListeners.add(listener);
143
+ return () => registryListeners.delete(listener);
144
+ }
145
+
146
+ export function object3DDocumentSessionsVersion(): number {
147
+ return registryVersion;
148
+ }
149
+
150
+ export function __resetObject3DDocumentSessionsForTest(): void {
151
+ sessions.clear();
152
+ preparations.clear();
153
+ notifyRegistry();
154
+ }