@geometra/renderer-three 0.2.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/host-css-coerce.d.ts +39 -0
- package/dist/host-css-coerce.d.ts.map +1 -0
- package/dist/host-css-coerce.js +69 -0
- package/dist/host-css-coerce.js.map +1 -0
- package/dist/host-layout-plain.d.ts +164 -0
- package/dist/host-layout-plain.d.ts.map +1 -0
- package/dist/host-layout-plain.js +255 -0
- package/dist/host-layout-plain.js.map +1 -0
- package/dist/index.d.ts +42 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -5
- package/dist/index.js.map +1 -1
- package/dist/layout-sync.d.ts +51 -0
- package/dist/layout-sync.d.ts.map +1 -0
- package/dist/layout-sync.js +59 -0
- package/dist/layout-sync.js.map +1 -0
- package/dist/scene3d-manager.d.ts +29 -0
- package/dist/scene3d-manager.d.ts.map +1 -0
- package/dist/scene3d-manager.js +339 -0
- package/dist/scene3d-manager.js.map +1 -0
- package/dist/split-host.d.ts +48 -9
- package/dist/split-host.d.ts.map +1 -1
- package/dist/split-host.js +74 -39
- package/dist/split-host.js.map +1 -1
- package/dist/stacked-host.d.ts +64 -14
- package/dist/stacked-host.d.ts.map +1 -1
- package/dist/stacked-host.js +77 -41
- package/dist/stacked-host.js.map +1 -1
- package/dist/three-scene-basics.d.ts +313 -2
- package/dist/three-scene-basics.d.ts.map +1 -1
- package/dist/three-scene-basics.js +418 -1
- package/dist/three-scene-basics.js.map +1 -1
- package/dist/utils.d.ts +156 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +207 -6
- package/dist/utils.js.map +1 -1
- package/package.json +15 -18
- package/LICENSE +0 -21
- package/README.md +0 -111
package/dist/index.js
CHANGED
|
@@ -1,7 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
/**
|
|
2
|
+
* `@geometra/renderer-three` — split/stacked Three.js + Geometra canvas hosts, WebGL sizing helpers
|
|
3
|
+
* ({@link resizeGeometraThreePerspectiveView}, {@link toPlainGeometraThreeViewSizingState}, {@link isPlainGeometraThreeViewSizingState}, {@link resizeGeometraThreeDrawingBufferView} / {@link resizeGeometraThreeDrawingBufferViewHeadless}, DPR capping, {@link GEOMETRA_HEADLESS_RAW_DEVICE_PIXEL_RATIO}, {@link resolveHeadlessHostDevicePixelRatio}, {@link createGeometraThreePerspectiveResizeHandlerHeadless}), shared scene defaults
|
|
4
|
+
* ({@link createGeometraThreeSceneBasics}, {@link resolveGeometraThreeSceneBasicsOptions}, {@link toPlainGeometraThreeSceneBasicsOptions},
|
|
5
|
+
* {@link createGeometraThreeSceneBasicsFromPlain},
|
|
6
|
+
* {@link createGeometraThreeWebGLWithSceneBasics}, {@link createGeometraThreeWebGLWithSceneBasicsFromPlain},
|
|
7
|
+
* {@link resizeGeometraThreeWebGLWithSceneBasicsView}, {@link resizeGeometraThreeWebGLWithSceneBasicsViewHeadless},
|
|
8
|
+
* {@link resizeGeometraThreeWebGLWithSceneBasicsViewFromPlainViewSizing},
|
|
9
|
+
* {@link toPlainGeometraThreeViewSizingStateHeadless},
|
|
10
|
+
* {@link renderGeometraThreeWebGLWithSceneBasicsFrame},
|
|
11
|
+
* {@link tickGeometraThreeWebGLWithSceneBasicsFrame} (`onFrame` may return `false` to skip `render` and make the tick return `false`; {@link disposeGeometraThreeWebGLWithSceneBasics} inside `onFrame` skips `render` too, like host {@link ThreeRuntimeContext.destroy}; if `onFrame` throws, the error propagates and `render` is not called, matching split/stacked {@link ThreeGeometraSplitHostOptions.onThreeFrame} ordering), {@link resizeTickGeometraThreeWebGLWithSceneBasics} (resize + tick with explicit raw DPR), {@link resizeTickGeometraThreeWebGLWithSceneBasicsFromPlainViewSizing} (resize + tick from plain {@link PlainGeometraThreeViewSizingState}), {@link resizeTickGeometraThreeWebGLWithSceneBasicsFromPlainHostSnapshot} (same from full {@link PlainGeometraThreeHostSnapshot} / composite JSON), {@link resizeTickGeometraThreeWebGLWithSceneBasicsHeadless} (same with raw DPR **1**), {@link disposeGeometraThreeWebGLWithSceneBasics} (optional `clock` stops timing after dispose),
|
|
12
|
+
* {@link toPlainGeometraThreeHostSnapshot}, {@link toPlainGeometraThreeHostSnapshotHeadless},
|
|
13
|
+
* {@link toPlainGeometraThreeHostSnapshotFromViewSizing}, {@link mergePlainGeometraThreeHostSnapshot},
|
|
14
|
+
* {@link toPlainGeometraSplitHostLayoutOptions} / {@link toPlainGeometraStackedHostLayoutOptions},
|
|
15
|
+
* {@link toPlainGeometraThreeSplitHostSnapshot} / {@link toPlainGeometraThreeStackedHostSnapshot} (and headless variants)
|
|
16
|
+
* for JSON-stable split/stacked layout plus viewport/scene in one object ({@link isGeometraHybridHostKind}, {@link coerceGeometraHybridHostKind}, {@link GEOMETRA_HYBRID_HOST_KINDS},
|
|
17
|
+
* {@link isPlainGeometraThreeHostSnapshot}, {@link isPlainGeometraThreeSceneBasicsOptions}, {@link isPlainGeometraSplitHostLayoutOptions}, {@link isPlainGeometraStackedHostLayoutOptions},
|
|
18
|
+
* {@link isPlainGeometraThreeSplitHostSnapshot}, {@link isPlainGeometraThreeStackedHostSnapshot}, {@link isPlainGeometraHybridHostKind}),
|
|
19
|
+
* {@link toPlainGeometraStackedHudRect} for stacked HUD box math (same insets as {@link createThreeGeometraStackedHost}), and
|
|
20
|
+
* {@link createGeometraHostLayoutSyncRaf} for custom hybrid layouts, {@link coerceHostStackingZIndexCss},
|
|
21
|
+
* {@link coerceGeometraHudPointerEvents}, and {@link coerceGeometraHudPlacement} for stacked-overlay stacking and
|
|
22
|
+
* HUD corner rules, and {@link GEOMETRA_SPLIT_HOST_LAYOUT_DEFAULTS} /
|
|
23
|
+
* {@link GEOMETRA_STACKED_HOST_LAYOUT_DEFAULTS} for host layout defaults (custom layouts, logs, agent payloads).
|
|
24
|
+
*/
|
|
25
|
+
export { createThreeGeometraSplitHost, GEOMETRA_SPLIT_HOST_LAYOUT_DEFAULTS, } from './split-host.js';
|
|
26
|
+
export { createThreeGeometraStackedHost, GEOMETRA_STACKED_HOST_LAYOUT_DEFAULTS, } from './stacked-host.js';
|
|
27
|
+
export { GEOMETRA_HEADLESS_RAW_DEVICE_PIXEL_RATIO, createGeometraThreePerspectiveResizeHandler, createGeometraThreePerspectiveResizeHandlerHeadless, geometraHostPerspectiveAspectFromCss, isPlainGeometraThreeViewSizingState, normalizeGeometraLayoutPixels, resizeGeometraThreeDrawingBufferView, resizeGeometraThreeDrawingBufferViewHeadless, resizeGeometraThreePerspectiveView, resolveHeadlessHostDevicePixelRatio, resolveHostDevicePixelRatio, setWebGLDrawingBufferSize, syncGeometraThreePerspectiveFromBuffer, toPlainGeometraThreeViewSizingState, toPlainGeometraThreeViewSizingStateHeadless, } from './utils.js';
|
|
28
|
+
export { GEOMETRA_HOST_WEBGL_RENDERER_OPTIONS, GEOMETRA_THREE_HOST_SCENE_DEFAULTS, createGeometraHostWebGLRendererParams, createGeometraThreeSceneBasics, createGeometraThreeSceneBasicsFromPlain, resolveGeometraThreeSceneBasicsOptions, toPlainGeometraThreeSceneBasicsOptions, toPlainGeometraThreeHostSnapshot, toPlainGeometraThreeHostSnapshotHeadless, toPlainGeometraThreeHostSnapshotFromViewSizing, mergePlainGeometraThreeHostSnapshot, createGeometraThreeWebGLRenderer, createGeometraThreeWebGLWithSceneBasics, createGeometraThreeWebGLWithSceneBasicsFromPlain, disposeGeometraThreeWebGLWithSceneBasics, isPlainGeometraThreeHostSnapshot, isPlainGeometraThreeSceneBasicsOptions, renderGeometraThreeWebGLWithSceneBasicsFrame, tickGeometraThreeWebGLWithSceneBasicsFrame, resizeGeometraThreeWebGLWithSceneBasicsView, resizeGeometraThreeWebGLWithSceneBasicsViewHeadless, resizeGeometraThreeWebGLWithSceneBasicsViewFromPlainViewSizing, resizeTickGeometraThreeWebGLWithSceneBasics, resizeTickGeometraThreeWebGLWithSceneBasicsFromPlainViewSizing, resizeTickGeometraThreeWebGLWithSceneBasicsFromPlainHostSnapshot, resizeTickGeometraThreeWebGLWithSceneBasicsHeadless, } from './three-scene-basics.js';
|
|
29
|
+
export { createGeometraHostLayoutSyncRaf, } from './layout-sync.js';
|
|
30
|
+
export { coerceGeometraHudPlacement, coerceGeometraHudPointerEvents, coerceHostNonNegativeCssPx, coerceHostStackingZIndexCss, } from './host-css-coerce.js';
|
|
31
|
+
export { GEOMETRA_HYBRID_HOST_KINDS, coerceGeometraHybridHostKind, isGeometraHybridHostKind, isPlainGeometraHybridHostKind, isPlainGeometraSplitHostLayoutOptions, isPlainGeometraStackedHostLayoutOptions, isPlainGeometraThreeSplitHostSnapshot, isPlainGeometraThreeStackedHostSnapshot, toPlainGeometraSplitHostLayoutOptions, toPlainGeometraStackedHostLayoutOptions, toPlainGeometraThreeSplitHostSnapshot, toPlainGeometraThreeSplitHostSnapshotHeadless, toPlainGeometraThreeStackedHostSnapshot, toPlainGeometraThreeStackedHostSnapshotHeadless, toPlainGeometraStackedHudRect, } from './host-layout-plain.js';
|
|
32
|
+
/**
|
|
33
|
+
* WebSocket **data channel** id for tracker snapshot JSON on the GEOM socket (re-exported from
|
|
34
|
+
* `@geometra/client`). Use in `onData` handlers passed through {@link createThreeGeometraSplitHost} /
|
|
35
|
+
* {@link createThreeGeometraStackedHost} so comparisons stay aligned with the thin client and agent
|
|
36
|
+
* payloads without importing `@geometra/client` only for this string.
|
|
37
|
+
*
|
|
38
|
+
* The runtime value is **`geom.tracker.snapshot`**; `npm run release:gate` asserts it still matches
|
|
39
|
+
* the installed `@geometra/client` package.
|
|
40
|
+
*/
|
|
6
41
|
export { GEOM_DATA_CHANNEL_TRACKER_SNAPSHOT } from '@geometra/client';
|
|
42
|
+
export { Scene3dManager } from './scene3d-manager.js';
|
|
7
43
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EACL,4BAA4B,EAC5B,mCAAmC,GAMpC,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,8BAA8B,EAC9B,qCAAqC,GAGtC,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,wCAAwC,EACxC,2CAA2C,EAC3C,mDAAmD,EACnD,oCAAoC,EACpC,mCAAmC,EACnC,6BAA6B,EAC7B,oCAAoC,EACpC,4CAA4C,EAC5C,kCAAkC,EAClC,mCAAmC,EACnC,2BAA2B,EAC3B,yBAAyB,EACzB,sCAAsC,EACtC,mCAAmC,EACnC,2CAA2C,GAE5C,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,oCAAoC,EACpC,kCAAkC,EAClC,qCAAqC,EACrC,8BAA8B,EAC9B,uCAAuC,EACvC,sCAAsC,EACtC,sCAAsC,EACtC,gCAAgC,EAChC,wCAAwC,EACxC,8CAA8C,EAC9C,mCAAmC,EACnC,gCAAgC,EAChC,uCAAuC,EACvC,gDAAgD,EAChD,wCAAwC,EACxC,gCAAgC,EAChC,sCAAsC,EACtC,4CAA4C,EAC5C,0CAA0C,EAC1C,2CAA2C,EAC3C,mDAAmD,EACnD,8DAA8D,EAC9D,2CAA2C,EAC3C,8DAA8D,EAC9D,gEAAgE,EAChE,mDAAmD,GAOpD,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,+BAA+B,GAGhC,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAC9B,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,wBAAwB,EACxB,6BAA6B,EAC7B,qCAAqC,EACrC,uCAAuC,EACvC,qCAAqC,EACrC,uCAAuC,EACvC,qCAAqC,EACrC,uCAAuC,EACvC,qCAAqC,EACrC,6CAA6C,EAC7C,uCAAuC,EACvC,+CAA+C,EAC/C,6BAA6B,GAU9B,MAAM,wBAAwB,CAAA;AAE/B;;;;;;;;GAQG;AACH,OAAO,EAAE,kCAAkC,EAAE,MAAM,kBAAkB,CAAA;AAErE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One `requestAnimationFrame` coalescer for hybrid Three + Geometra hosts: paired
|
|
3
|
+
* `ResizeObserver` notifications run WebGL buffer sync at most once per frame, and an optional
|
|
4
|
+
* synthetic `window` `resize` can fire on the same tick so the Geometra thin client picks up
|
|
5
|
+
* layout size without double work on real window resizes.
|
|
6
|
+
*
|
|
7
|
+
* {@link createThreeGeometraSplitHost} and {@link createThreeGeometraStackedHost} use this
|
|
8
|
+
* internally; export is for custom layouts that need the same behavior.
|
|
9
|
+
*/
|
|
10
|
+
export interface GeometraHostLayoutSyncRaf {
|
|
11
|
+
/**
|
|
12
|
+
* At most one drawing-buffer sync per animation frame. When `notifyGeometra` is true for any
|
|
13
|
+
* call coalesced into that frame, `dispatchGeometraResize` runs after `syncLayout`.
|
|
14
|
+
*/
|
|
15
|
+
schedule(notifyGeometra: boolean): void;
|
|
16
|
+
/** Cancel a pending frame (e.g. on host destroy). */
|
|
17
|
+
cancel(): void;
|
|
18
|
+
}
|
|
19
|
+
export interface GeometraHostLayoutSyncRafOptions {
|
|
20
|
+
/** Return true after teardown so scheduled frames no-op. */
|
|
21
|
+
isDestroyed: () => boolean;
|
|
22
|
+
/** Resize WebGL + camera (runs inside the rAF callback). */
|
|
23
|
+
syncLayout: () => void;
|
|
24
|
+
/**
|
|
25
|
+
* e.g. `() => win.dispatchEvent(new Event('resize'))` for Geometra thin client.
|
|
26
|
+
* Runs only when {@link GeometraHostLayoutSyncRaf.schedule} requested a notify for this coalesced
|
|
27
|
+
* frame, after the layout sync callback, and only if {@link isDestroyed} is still false (avoids
|
|
28
|
+
* synthetic `resize` after teardown). If teardown happens after a successful `syncLayout` but before
|
|
29
|
+
* dispatch, the pending notify is cleared for the same reason. If the layout sync callback throws, the
|
|
30
|
+
* pending notify stays set so a later coalesced frame can still dispatch once sync succeeds. If `dispatchGeometraResize`
|
|
31
|
+
* throws, the pending notify is also left set so a later coalesced frame can retry the dispatch after
|
|
32
|
+
* `syncLayout` runs again.
|
|
33
|
+
*/
|
|
34
|
+
dispatchGeometraResize: () => void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Build a layout sync coalescer bound to `win` (typically the Geometra client’s `window` option).
|
|
38
|
+
* Call {@link GeometraHostLayoutSyncRaf.schedule} from `ResizeObserver` callbacks with
|
|
39
|
+
* `notifyGeometra: true` when Geometra’s canvas layout changed without a browser `resize`, and
|
|
40
|
+
* from real `window` `resize` handlers with `notifyGeometra: false`.
|
|
41
|
+
*
|
|
42
|
+
* If `syncLayout` or `dispatchGeometraResize` throws, the error propagates from the scheduled
|
|
43
|
+
* animation-frame callback (same as an uncaught rAF handler in the browser). A pending Geometra
|
|
44
|
+
* notify is cleared only after a successful `dispatchGeometraResize`; see
|
|
45
|
+
* {@link GeometraHostLayoutSyncRafOptions.dispatchGeometraResize}. If `isDestroyed` is true before
|
|
46
|
+
* `syncLayout` runs, or becomes true after `syncLayout` before `dispatchGeometraResize` (when
|
|
47
|
+
* {@link GeometraHostLayoutSyncRaf.cancel} was not used), the pending notify flag is cleared so later
|
|
48
|
+
* schedules do not inherit a stale synthetic `resize`.
|
|
49
|
+
*/
|
|
50
|
+
export declare function createGeometraHostLayoutSyncRaf(win: Window, options: GeometraHostLayoutSyncRafOptions): GeometraHostLayoutSyncRaf;
|
|
51
|
+
//# sourceMappingURL=layout-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-sync.d.ts","sourceRoot":"","sources":["../src/layout-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,GAAG,IAAI,CAAA;IACvC,qDAAqD;IACrD,MAAM,IAAI,IAAI,CAAA;CACf;AAED,MAAM,WAAW,gCAAgC;IAC/C,4DAA4D;IAC5D,WAAW,EAAE,MAAM,OAAO,CAAA;IAC1B,4DAA4D;IAC5D,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB;;;;;;;;;OASG;IACH,sBAAsB,EAAE,MAAM,IAAI,CAAA;CACnC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,gCAAgC,GACxC,yBAAyB,CAoC3B"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One `requestAnimationFrame` coalescer for hybrid Three + Geometra hosts: paired
|
|
3
|
+
* `ResizeObserver` notifications run WebGL buffer sync at most once per frame, and an optional
|
|
4
|
+
* synthetic `window` `resize` can fire on the same tick so the Geometra thin client picks up
|
|
5
|
+
* layout size without double work on real window resizes.
|
|
6
|
+
*
|
|
7
|
+
* {@link createThreeGeometraSplitHost} and {@link createThreeGeometraStackedHost} use this
|
|
8
|
+
* internally; export is for custom layouts that need the same behavior.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Build a layout sync coalescer bound to `win` (typically the Geometra client’s `window` option).
|
|
12
|
+
* Call {@link GeometraHostLayoutSyncRaf.schedule} from `ResizeObserver` callbacks with
|
|
13
|
+
* `notifyGeometra: true` when Geometra’s canvas layout changed without a browser `resize`, and
|
|
14
|
+
* from real `window` `resize` handlers with `notifyGeometra: false`.
|
|
15
|
+
*
|
|
16
|
+
* If `syncLayout` or `dispatchGeometraResize` throws, the error propagates from the scheduled
|
|
17
|
+
* animation-frame callback (same as an uncaught rAF handler in the browser). A pending Geometra
|
|
18
|
+
* notify is cleared only after a successful `dispatchGeometraResize`; see
|
|
19
|
+
* {@link GeometraHostLayoutSyncRafOptions.dispatchGeometraResize}. If `isDestroyed` is true before
|
|
20
|
+
* `syncLayout` runs, or becomes true after `syncLayout` before `dispatchGeometraResize` (when
|
|
21
|
+
* {@link GeometraHostLayoutSyncRaf.cancel} was not used), the pending notify flag is cleared so later
|
|
22
|
+
* schedules do not inherit a stale synthetic `resize`.
|
|
23
|
+
*/
|
|
24
|
+
export function createGeometraHostLayoutSyncRaf(win, options) {
|
|
25
|
+
const { isDestroyed, syncLayout, dispatchGeometraResize } = options;
|
|
26
|
+
let layoutSyncRafId;
|
|
27
|
+
let pendingGeometraResizeNotify = false;
|
|
28
|
+
const schedule = (notifyGeometra) => {
|
|
29
|
+
if (notifyGeometra)
|
|
30
|
+
pendingGeometraResizeNotify = true;
|
|
31
|
+
if (layoutSyncRafId !== undefined)
|
|
32
|
+
return;
|
|
33
|
+
layoutSyncRafId = win.requestAnimationFrame(() => {
|
|
34
|
+
layoutSyncRafId = undefined;
|
|
35
|
+
if (isDestroyed()) {
|
|
36
|
+
pendingGeometraResizeNotify = false;
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
syncLayout();
|
|
40
|
+
if (isDestroyed()) {
|
|
41
|
+
pendingGeometraResizeNotify = false;
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (pendingGeometraResizeNotify) {
|
|
45
|
+
dispatchGeometraResize();
|
|
46
|
+
pendingGeometraResizeNotify = false;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
const cancel = () => {
|
|
51
|
+
if (layoutSyncRafId !== undefined) {
|
|
52
|
+
win.cancelAnimationFrame(layoutSyncRafId);
|
|
53
|
+
layoutSyncRafId = undefined;
|
|
54
|
+
}
|
|
55
|
+
pendingGeometraResizeNotify = false;
|
|
56
|
+
};
|
|
57
|
+
return { schedule, cancel };
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=layout-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-sync.js","sourceRoot":"","sources":["../src/layout-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA8BH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,+BAA+B,CAC7C,GAAW,EACX,OAAyC;IAEzC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAA;IAEnE,IAAI,eAAmC,CAAA;IACvC,IAAI,2BAA2B,GAAG,KAAK,CAAA;IAEvC,MAAM,QAAQ,GAAG,CAAC,cAAuB,EAAE,EAAE;QAC3C,IAAI,cAAc;YAAE,2BAA2B,GAAG,IAAI,CAAA;QACtD,IAAI,eAAe,KAAK,SAAS;YAAE,OAAM;QACzC,eAAe,GAAG,GAAG,CAAC,qBAAqB,CAAC,GAAG,EAAE;YAC/C,eAAe,GAAG,SAAS,CAAA;YAC3B,IAAI,WAAW,EAAE,EAAE,CAAC;gBAClB,2BAA2B,GAAG,KAAK,CAAA;gBACnC,OAAM;YACR,CAAC;YACD,UAAU,EAAE,CAAA;YACZ,IAAI,WAAW,EAAE,EAAE,CAAC;gBAClB,2BAA2B,GAAG,KAAK,CAAA;gBACnC,OAAM;YACR,CAAC;YACD,IAAI,2BAA2B,EAAE,CAAC;gBAChC,sBAAsB,EAAE,CAAA;gBACxB,2BAA2B,GAAG,KAAK,CAAA;YACrC,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,GAAG,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAA;YACzC,eAAe,GAAG,SAAS,CAAA;QAC7B,CAAC;QACD,2BAA2B,GAAG,KAAK,CAAA;IACrC,CAAC,CAAA;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;AAC7B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import type { Scene3dElement } from '@geometra/core';
|
|
3
|
+
/**
|
|
4
|
+
* Manages a Three.js scene graph from declarative {@link Scene3dObject} descriptors streamed
|
|
5
|
+
* from a Geometra server. Call {@link Scene3dManager.sync} each frame (or when the tree updates)
|
|
6
|
+
* to reconcile the live scene with the latest descriptor array.
|
|
7
|
+
*/
|
|
8
|
+
export declare class Scene3dManager {
|
|
9
|
+
readonly scene: THREE.Scene;
|
|
10
|
+
readonly camera: THREE.PerspectiveCamera;
|
|
11
|
+
private managed;
|
|
12
|
+
private sceneGroup;
|
|
13
|
+
private orbitControls;
|
|
14
|
+
private orbitControlsModule;
|
|
15
|
+
constructor(scene: THREE.Scene, camera: THREE.PerspectiveCamera);
|
|
16
|
+
/**
|
|
17
|
+
* Reconcile the live Three.js scene with the given element's props.
|
|
18
|
+
* Creates, updates, or removes objects as needed.
|
|
19
|
+
*/
|
|
20
|
+
sync(element: Scene3dElement, canvas?: HTMLCanvasElement): void;
|
|
21
|
+
/** Update orbit controls damping each frame. */
|
|
22
|
+
tick(): void;
|
|
23
|
+
private syncOrbitControls;
|
|
24
|
+
private applyOrbitConfig;
|
|
25
|
+
private reconcileObjects;
|
|
26
|
+
private clearManaged;
|
|
27
|
+
dispose(): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=scene3d-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene3d-manager.d.ts","sourceRoot":"","sources":["../src/scene3d-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EASV,cAAc,EAEf,MAAM,gBAAgB,CAAA;AAWvB;;;;GAIG;AACH,qBAAa,cAAc;IAOvB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK;IAC3B,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,iBAAiB;IAP1C,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,aAAa,CAAoF;IACzG,OAAO,CAAC,mBAAmB,CAA6E;gBAG7F,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,MAAM,EAAE,KAAK,CAAC,iBAAiB;IAK1C;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI;IAkC/D,gDAAgD;IAChD,IAAI,IAAI,IAAI;IAIZ,OAAO,CAAC,iBAAiB;IAkCzB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,YAAY;IAQpB,OAAO,IAAI,IAAI;CAQhB"}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
/**
|
|
3
|
+
* Manages a Three.js scene graph from declarative {@link Scene3dObject} descriptors streamed
|
|
4
|
+
* from a Geometra server. Call {@link Scene3dManager.sync} each frame (or when the tree updates)
|
|
5
|
+
* to reconcile the live scene with the latest descriptor array.
|
|
6
|
+
*/
|
|
7
|
+
export class Scene3dManager {
|
|
8
|
+
scene;
|
|
9
|
+
camera;
|
|
10
|
+
managed = [];
|
|
11
|
+
sceneGroup = new THREE.Group();
|
|
12
|
+
orbitControls = null;
|
|
13
|
+
orbitControlsModule = null;
|
|
14
|
+
constructor(scene, camera) {
|
|
15
|
+
this.scene = scene;
|
|
16
|
+
this.camera = camera;
|
|
17
|
+
scene.add(this.sceneGroup);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Reconcile the live Three.js scene with the given element's props.
|
|
21
|
+
* Creates, updates, or removes objects as needed.
|
|
22
|
+
*/
|
|
23
|
+
sync(element, canvas) {
|
|
24
|
+
const { objects, background, fov, near, far, cameraPosition, cameraTarget, orbitControls } = element.props;
|
|
25
|
+
// Update scene background
|
|
26
|
+
if (background !== undefined) {
|
|
27
|
+
this.scene.background = new THREE.Color(background);
|
|
28
|
+
}
|
|
29
|
+
// Update camera
|
|
30
|
+
if (fov !== undefined && fov > 0 && fov < 180) {
|
|
31
|
+
this.camera.fov = fov;
|
|
32
|
+
}
|
|
33
|
+
if (near !== undefined && near > 0) {
|
|
34
|
+
this.camera.near = near;
|
|
35
|
+
}
|
|
36
|
+
if (far !== undefined && far > this.camera.near) {
|
|
37
|
+
this.camera.far = far;
|
|
38
|
+
}
|
|
39
|
+
if (cameraPosition) {
|
|
40
|
+
this.camera.position.set(cameraPosition[0], cameraPosition[1], cameraPosition[2]);
|
|
41
|
+
}
|
|
42
|
+
this.camera.updateProjectionMatrix();
|
|
43
|
+
if (cameraTarget) {
|
|
44
|
+
this.camera.lookAt(cameraTarget[0], cameraTarget[1], cameraTarget[2]);
|
|
45
|
+
}
|
|
46
|
+
// Orbit controls
|
|
47
|
+
this.syncOrbitControls(orbitControls, canvas);
|
|
48
|
+
// Reconcile objects
|
|
49
|
+
this.reconcileObjects(objects);
|
|
50
|
+
}
|
|
51
|
+
/** Update orbit controls damping each frame. */
|
|
52
|
+
tick() {
|
|
53
|
+
this.orbitControls?.update();
|
|
54
|
+
}
|
|
55
|
+
syncOrbitControls(config, canvas) {
|
|
56
|
+
if (!config) {
|
|
57
|
+
if (this.orbitControls) {
|
|
58
|
+
this.orbitControls.dispose();
|
|
59
|
+
this.orbitControls = null;
|
|
60
|
+
}
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (!canvas)
|
|
64
|
+
return;
|
|
65
|
+
if (!this.orbitControls && this.orbitControlsModule) {
|
|
66
|
+
this.orbitControls = new this.orbitControlsModule.OrbitControls(this.camera, canvas);
|
|
67
|
+
this.orbitControls.enableDamping = true;
|
|
68
|
+
}
|
|
69
|
+
if (!this.orbitControls && !this.orbitControlsModule) {
|
|
70
|
+
// Lazy-load OrbitControls
|
|
71
|
+
void import('three/examples/jsm/controls/OrbitControls.js').then((mod) => {
|
|
72
|
+
this.orbitControlsModule = mod;
|
|
73
|
+
if (!this.orbitControls) {
|
|
74
|
+
this.orbitControls = new mod.OrbitControls(this.camera, canvas);
|
|
75
|
+
this.orbitControls.enableDamping = true;
|
|
76
|
+
this.applyOrbitConfig(config);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
this.applyOrbitConfig(config);
|
|
82
|
+
}
|
|
83
|
+
applyOrbitConfig(config) {
|
|
84
|
+
if (!this.orbitControls || typeof config === 'boolean')
|
|
85
|
+
return;
|
|
86
|
+
if (config.damping !== undefined)
|
|
87
|
+
this.orbitControls.dampingFactor = config.damping;
|
|
88
|
+
if (config.minDistance !== undefined)
|
|
89
|
+
this.orbitControls.minDistance = config.minDistance;
|
|
90
|
+
if (config.maxDistance !== undefined)
|
|
91
|
+
this.orbitControls.maxDistance = config.maxDistance;
|
|
92
|
+
if (config.maxPolarAngle !== undefined)
|
|
93
|
+
this.orbitControls.maxPolarAngle = config.maxPolarAngle;
|
|
94
|
+
}
|
|
95
|
+
reconcileObjects(objects) {
|
|
96
|
+
// Simple reconciliation: rebuild if count or types changed, update positions otherwise
|
|
97
|
+
const needsRebuild = objects.length !== this.managed.length ||
|
|
98
|
+
objects.some((obj, i) => obj.type !== this.managed[i]?.descriptor.type);
|
|
99
|
+
if (needsRebuild) {
|
|
100
|
+
this.clearManaged();
|
|
101
|
+
for (const desc of objects) {
|
|
102
|
+
const object = createThreeObject(desc);
|
|
103
|
+
this.managed.push({ descriptor: desc, object });
|
|
104
|
+
this.sceneGroup.add(object);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Update existing objects in place
|
|
109
|
+
for (let i = 0; i < objects.length; i++) {
|
|
110
|
+
const desc = objects[i];
|
|
111
|
+
const entry = this.managed[i];
|
|
112
|
+
updateThreeObject(entry.object, entry.descriptor, desc);
|
|
113
|
+
entry.descriptor = desc;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
clearManaged() {
|
|
118
|
+
for (const entry of this.managed) {
|
|
119
|
+
this.sceneGroup.remove(entry.object);
|
|
120
|
+
disposeObject(entry.object);
|
|
121
|
+
}
|
|
122
|
+
this.managed = [];
|
|
123
|
+
}
|
|
124
|
+
dispose() {
|
|
125
|
+
this.clearManaged();
|
|
126
|
+
this.scene.remove(this.sceneGroup);
|
|
127
|
+
if (this.orbitControls) {
|
|
128
|
+
this.orbitControls.dispose();
|
|
129
|
+
this.orbitControls = null;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
// Object creation from descriptors
|
|
135
|
+
// ---------------------------------------------------------------------------
|
|
136
|
+
function createThreeObject(desc) {
|
|
137
|
+
switch (desc.type) {
|
|
138
|
+
case 'sphere':
|
|
139
|
+
return createSphere(desc);
|
|
140
|
+
case 'points':
|
|
141
|
+
return createPoints(desc);
|
|
142
|
+
case 'line':
|
|
143
|
+
return createLine(desc);
|
|
144
|
+
case 'ring':
|
|
145
|
+
return createRing(desc);
|
|
146
|
+
case 'ambientLight':
|
|
147
|
+
return createAmbientLight(desc);
|
|
148
|
+
case 'directionalLight':
|
|
149
|
+
return createDirectionalLight(desc);
|
|
150
|
+
case 'group':
|
|
151
|
+
return createGroup(desc);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function createSphere(desc) {
|
|
155
|
+
const geom = new THREE.SphereGeometry(desc.radius ?? 1, desc.widthSegments ?? 32, desc.heightSegments ?? 32);
|
|
156
|
+
const mat = new THREE.MeshStandardMaterial({
|
|
157
|
+
color: desc.color ?? 0xffffff,
|
|
158
|
+
emissive: desc.emissive ?? 0x000000,
|
|
159
|
+
metalness: desc.metalness ?? 0,
|
|
160
|
+
roughness: desc.roughness ?? 1,
|
|
161
|
+
});
|
|
162
|
+
const mesh = new THREE.Mesh(geom, mat);
|
|
163
|
+
if (desc.position)
|
|
164
|
+
mesh.position.set(desc.position[0], desc.position[1], desc.position[2]);
|
|
165
|
+
return mesh;
|
|
166
|
+
}
|
|
167
|
+
function createPoints(desc) {
|
|
168
|
+
const geom = new THREE.BufferGeometry();
|
|
169
|
+
const positions = new Float32Array(desc.positions);
|
|
170
|
+
geom.setAttribute('position', new THREE.BufferAttribute(positions, 3));
|
|
171
|
+
const mat = new THREE.PointsMaterial({
|
|
172
|
+
color: desc.color ?? 0xffffff,
|
|
173
|
+
size: desc.size ?? 1,
|
|
174
|
+
depthWrite: false,
|
|
175
|
+
opacity: desc.opacity ?? 1,
|
|
176
|
+
transparent: (desc.opacity ?? 1) < 1,
|
|
177
|
+
});
|
|
178
|
+
return new THREE.Points(geom, mat);
|
|
179
|
+
}
|
|
180
|
+
function createLine(desc) {
|
|
181
|
+
const pts = desc.points.map((p) => new THREE.Vector3(p[0], p[1], p[2]));
|
|
182
|
+
const geom = new THREE.BufferGeometry().setFromPoints(pts);
|
|
183
|
+
let mat;
|
|
184
|
+
if (desc.dashed) {
|
|
185
|
+
mat = new THREE.LineDashedMaterial({
|
|
186
|
+
color: desc.color ?? 0xffffff,
|
|
187
|
+
transparent: (desc.opacity ?? 1) < 1,
|
|
188
|
+
opacity: desc.opacity ?? 1,
|
|
189
|
+
dashSize: desc.dashSize ?? 0.14,
|
|
190
|
+
gapSize: desc.gapSize ?? 0.1,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
mat = new THREE.LineBasicMaterial({
|
|
195
|
+
color: desc.color ?? 0xffffff,
|
|
196
|
+
transparent: (desc.opacity ?? 1) < 1,
|
|
197
|
+
opacity: desc.opacity ?? 1,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
const line = new THREE.Line(geom, mat);
|
|
201
|
+
if (desc.dashed)
|
|
202
|
+
line.computeLineDistances();
|
|
203
|
+
return line;
|
|
204
|
+
}
|
|
205
|
+
function createRing(desc) {
|
|
206
|
+
const geom = new THREE.RingGeometry(desc.innerRadius, desc.outerRadius, desc.segments ?? 128);
|
|
207
|
+
const mat = new THREE.MeshBasicMaterial({
|
|
208
|
+
color: desc.color ?? 0xffffff,
|
|
209
|
+
side: THREE.DoubleSide,
|
|
210
|
+
transparent: (desc.opacity ?? 1) < 1,
|
|
211
|
+
opacity: desc.opacity ?? 1,
|
|
212
|
+
});
|
|
213
|
+
const mesh = new THREE.Mesh(geom, mat);
|
|
214
|
+
if (desc.position)
|
|
215
|
+
mesh.position.set(desc.position[0], desc.position[1], desc.position[2]);
|
|
216
|
+
if (desc.rotation)
|
|
217
|
+
mesh.rotation.set(desc.rotation[0], desc.rotation[1], desc.rotation[2]);
|
|
218
|
+
return mesh;
|
|
219
|
+
}
|
|
220
|
+
function createAmbientLight(desc) {
|
|
221
|
+
return new THREE.AmbientLight(desc.color ?? 0xffffff, desc.intensity ?? 1);
|
|
222
|
+
}
|
|
223
|
+
function createDirectionalLight(desc) {
|
|
224
|
+
const light = new THREE.DirectionalLight(desc.color ?? 0xffffff, desc.intensity ?? 1);
|
|
225
|
+
if (desc.position)
|
|
226
|
+
light.position.set(desc.position[0], desc.position[1], desc.position[2]);
|
|
227
|
+
return light;
|
|
228
|
+
}
|
|
229
|
+
function createGroup(desc) {
|
|
230
|
+
const group = new THREE.Group();
|
|
231
|
+
if (desc.position)
|
|
232
|
+
group.position.set(desc.position[0], desc.position[1], desc.position[2]);
|
|
233
|
+
for (const child of desc.objects) {
|
|
234
|
+
group.add(createThreeObject(child));
|
|
235
|
+
}
|
|
236
|
+
return group;
|
|
237
|
+
}
|
|
238
|
+
// ---------------------------------------------------------------------------
|
|
239
|
+
// In-place updates (position, color, etc.) without full rebuild
|
|
240
|
+
// ---------------------------------------------------------------------------
|
|
241
|
+
function updateThreeObject(object, _oldDesc, newDesc) {
|
|
242
|
+
switch (newDesc.type) {
|
|
243
|
+
case 'sphere':
|
|
244
|
+
updateSphere(object, newDesc);
|
|
245
|
+
break;
|
|
246
|
+
case 'points':
|
|
247
|
+
updatePoints(object, newDesc);
|
|
248
|
+
break;
|
|
249
|
+
case 'line':
|
|
250
|
+
updateLine(object, newDesc);
|
|
251
|
+
break;
|
|
252
|
+
case 'ring':
|
|
253
|
+
updateRing(object, newDesc);
|
|
254
|
+
break;
|
|
255
|
+
case 'ambientLight':
|
|
256
|
+
updateAmbientLight(object, newDesc);
|
|
257
|
+
break;
|
|
258
|
+
case 'directionalLight':
|
|
259
|
+
updateDirectionalLight(object, newDesc);
|
|
260
|
+
break;
|
|
261
|
+
case 'group':
|
|
262
|
+
// Groups require full reconciliation of children — handled by rebuild path
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
function updateSphere(mesh, desc) {
|
|
267
|
+
if (desc.position)
|
|
268
|
+
mesh.position.set(desc.position[0], desc.position[1], desc.position[2]);
|
|
269
|
+
const mat = mesh.material;
|
|
270
|
+
if (desc.color !== undefined)
|
|
271
|
+
mat.color.setHex(desc.color);
|
|
272
|
+
if (desc.emissive !== undefined)
|
|
273
|
+
mat.emissive.setHex(desc.emissive);
|
|
274
|
+
}
|
|
275
|
+
function updatePoints(points, desc) {
|
|
276
|
+
const geom = points.geometry;
|
|
277
|
+
const posAttr = geom.getAttribute('position');
|
|
278
|
+
const newPositions = new Float32Array(desc.positions);
|
|
279
|
+
if (posAttr.count * 3 === newPositions.length) {
|
|
280
|
+
posAttr.set(newPositions);
|
|
281
|
+
posAttr.needsUpdate = true;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
function updateLine(line, desc) {
|
|
285
|
+
const pts = desc.points.map((p) => new THREE.Vector3(p[0], p[1], p[2]));
|
|
286
|
+
line.geometry.dispose();
|
|
287
|
+
line.geometry = new THREE.BufferGeometry().setFromPoints(pts);
|
|
288
|
+
if (desc.dashed)
|
|
289
|
+
line.computeLineDistances();
|
|
290
|
+
}
|
|
291
|
+
function updateRing(mesh, desc) {
|
|
292
|
+
if (desc.position)
|
|
293
|
+
mesh.position.set(desc.position[0], desc.position[1], desc.position[2]);
|
|
294
|
+
if (desc.rotation)
|
|
295
|
+
mesh.rotation.set(desc.rotation[0], desc.rotation[1], desc.rotation[2]);
|
|
296
|
+
}
|
|
297
|
+
function updateAmbientLight(light, desc) {
|
|
298
|
+
if (desc.color !== undefined)
|
|
299
|
+
light.color.setHex(desc.color);
|
|
300
|
+
if (desc.intensity !== undefined)
|
|
301
|
+
light.intensity = desc.intensity;
|
|
302
|
+
}
|
|
303
|
+
function updateDirectionalLight(light, desc) {
|
|
304
|
+
if (desc.color !== undefined)
|
|
305
|
+
light.color.setHex(desc.color);
|
|
306
|
+
if (desc.intensity !== undefined)
|
|
307
|
+
light.intensity = desc.intensity;
|
|
308
|
+
if (desc.position)
|
|
309
|
+
light.position.set(desc.position[0], desc.position[1], desc.position[2]);
|
|
310
|
+
}
|
|
311
|
+
// ---------------------------------------------------------------------------
|
|
312
|
+
// Disposal
|
|
313
|
+
// ---------------------------------------------------------------------------
|
|
314
|
+
function disposeObject(object) {
|
|
315
|
+
if (object instanceof THREE.Mesh) {
|
|
316
|
+
object.geometry.dispose();
|
|
317
|
+
if (Array.isArray(object.material)) {
|
|
318
|
+
for (const mat of object.material)
|
|
319
|
+
mat.dispose();
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
object.material.dispose();
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
else if (object instanceof THREE.Points) {
|
|
326
|
+
object.geometry.dispose();
|
|
327
|
+
object.material.dispose();
|
|
328
|
+
}
|
|
329
|
+
else if (object instanceof THREE.Line) {
|
|
330
|
+
object.geometry.dispose();
|
|
331
|
+
object.material.dispose();
|
|
332
|
+
}
|
|
333
|
+
else if (object instanceof THREE.Group) {
|
|
334
|
+
for (const child of [...object.children]) {
|
|
335
|
+
disposeObject(child);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=scene3d-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene3d-manager.js","sourceRoot":"","sources":["../src/scene3d-manager.ts"],"names":[],"mappings":"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"}
|