@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.
Files changed (39) hide show
  1. package/dist/host-css-coerce.d.ts +39 -0
  2. package/dist/host-css-coerce.d.ts.map +1 -0
  3. package/dist/host-css-coerce.js +69 -0
  4. package/dist/host-css-coerce.js.map +1 -0
  5. package/dist/host-layout-plain.d.ts +164 -0
  6. package/dist/host-layout-plain.d.ts.map +1 -0
  7. package/dist/host-layout-plain.js +255 -0
  8. package/dist/host-layout-plain.js.map +1 -0
  9. package/dist/index.d.ts +42 -5
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +41 -5
  12. package/dist/index.js.map +1 -1
  13. package/dist/layout-sync.d.ts +51 -0
  14. package/dist/layout-sync.d.ts.map +1 -0
  15. package/dist/layout-sync.js +59 -0
  16. package/dist/layout-sync.js.map +1 -0
  17. package/dist/scene3d-manager.d.ts +29 -0
  18. package/dist/scene3d-manager.d.ts.map +1 -0
  19. package/dist/scene3d-manager.js +339 -0
  20. package/dist/scene3d-manager.js.map +1 -0
  21. package/dist/split-host.d.ts +48 -9
  22. package/dist/split-host.d.ts.map +1 -1
  23. package/dist/split-host.js +74 -39
  24. package/dist/split-host.js.map +1 -1
  25. package/dist/stacked-host.d.ts +64 -14
  26. package/dist/stacked-host.d.ts.map +1 -1
  27. package/dist/stacked-host.js +77 -41
  28. package/dist/stacked-host.js.map +1 -1
  29. package/dist/three-scene-basics.d.ts +313 -2
  30. package/dist/three-scene-basics.d.ts.map +1 -1
  31. package/dist/three-scene-basics.js +418 -1
  32. package/dist/three-scene-basics.js.map +1 -1
  33. package/dist/utils.d.ts +156 -0
  34. package/dist/utils.d.ts.map +1 -1
  35. package/dist/utils.js +207 -6
  36. package/dist/utils.js.map +1 -1
  37. package/package.json +15 -18
  38. package/LICENSE +0 -21
  39. package/README.md +0 -111
package/dist/index.js CHANGED
@@ -1,7 +1,43 @@
1
- export { createThreeGeometraSplitHost, } from './split-host.js';
2
- export { createThreeGeometraStackedHost, } from './stacked-host.js';
3
- export { resizeGeometraThreePerspectiveView, setWebGLDrawingBufferSize } from './utils.js';
4
- export { createGeometraThreeSceneBasics, } from './three-scene-basics.js';
5
- /** Re-export for hybrid apps using {@link createThreeGeometraSplitHost} with `onData`. */
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,GAK7B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,8BAA8B,GAI/B,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,kCAAkC,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAC1F,OAAO,EACL,8BAA8B,GAE/B,MAAM,yBAAyB,CAAA;AAEhC,0FAA0F;AAC1F,OAAO,EAAE,kCAAkC,EAAE,MAAM,kBAAkB,CAAA"}
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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"}