@geometra/renderer-three 0.2.0 → 1.4.0

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 (47) hide show
  1. package/dist/__tests__/scene3d-manager.test.d.ts +2 -0
  2. package/dist/__tests__/scene3d-manager.test.d.ts.map +1 -0
  3. package/dist/__tests__/scene3d-manager.test.js +80 -0
  4. package/dist/__tests__/scene3d-manager.test.js.map +1 -0
  5. package/dist/host-css-coerce.d.ts +39 -0
  6. package/dist/host-css-coerce.d.ts.map +1 -0
  7. package/dist/host-css-coerce.js +69 -0
  8. package/dist/host-css-coerce.js.map +1 -0
  9. package/dist/host-layout-plain.d.ts +164 -0
  10. package/dist/host-layout-plain.d.ts.map +1 -0
  11. package/dist/host-layout-plain.js +255 -0
  12. package/dist/host-layout-plain.js.map +1 -0
  13. package/dist/index.d.ts +43 -5
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +42 -5
  16. package/dist/index.js.map +1 -1
  17. package/dist/layout-sync.d.ts +51 -0
  18. package/dist/layout-sync.d.ts.map +1 -0
  19. package/dist/layout-sync.js +59 -0
  20. package/dist/layout-sync.js.map +1 -0
  21. package/dist/page-host.d.ts +41 -0
  22. package/dist/page-host.d.ts.map +1 -0
  23. package/dist/page-host.js +89 -0
  24. package/dist/page-host.js.map +1 -0
  25. package/dist/scene3d-manager.d.ts +33 -0
  26. package/dist/scene3d-manager.d.ts.map +1 -0
  27. package/dist/scene3d-manager.js +394 -0
  28. package/dist/scene3d-manager.js.map +1 -0
  29. package/dist/split-host.d.ts +65 -9
  30. package/dist/split-host.d.ts.map +1 -1
  31. package/dist/split-host.js +115 -39
  32. package/dist/split-host.js.map +1 -1
  33. package/dist/stacked-host.d.ts +64 -14
  34. package/dist/stacked-host.d.ts.map +1 -1
  35. package/dist/stacked-host.js +77 -41
  36. package/dist/stacked-host.js.map +1 -1
  37. package/dist/three-scene-basics.d.ts +313 -2
  38. package/dist/three-scene-basics.d.ts.map +1 -1
  39. package/dist/three-scene-basics.js +418 -1
  40. package/dist/three-scene-basics.js.map +1 -1
  41. package/dist/utils.d.ts +156 -0
  42. package/dist/utils.d.ts.map +1 -1
  43. package/dist/utils.js +207 -6
  44. package/dist/utils.js.map +1 -1
  45. package/package.json +15 -18
  46. package/LICENSE +0 -21
  47. package/README.md +0 -111
@@ -1,7 +1,15 @@
1
- import * as THREE from 'three';
2
1
  import { createBrowserCanvasClient, } from '@geometra/renderer-canvas';
3
- import { createGeometraThreeSceneBasics } from './three-scene-basics.js';
4
- import { resizeGeometraThreePerspectiveView } from './utils.js';
2
+ import { GEOMETRA_THREE_HOST_SCENE_DEFAULTS, createGeometraThreeWebGLWithSceneBasics, disposeGeometraThreeWebGLWithSceneBasics, } from './three-scene-basics.js';
3
+ import { createGeometraHostLayoutSyncRaf } from './layout-sync.js';
4
+ import { coerceHostNonNegativeCssPx } from './host-css-coerce.js';
5
+ import { resizeGeometraThreePerspectiveView, resolveHostDevicePixelRatio } from './utils.js';
6
+ /**
7
+ * Default Geometra column width for {@link createThreeGeometraSplitHost}; same value as the
8
+ * `geometraWidth` option fallback and README.
9
+ */
10
+ export const GEOMETRA_SPLIT_HOST_LAYOUT_DEFAULTS = {
11
+ geometraWidth: 420,
12
+ };
5
13
  function panelStyle(el, flex) {
6
14
  el.style.flex = flex;
7
15
  el.style.minWidth = '0';
@@ -19,18 +27,28 @@ function fullSizeCanvas(canvas) {
19
27
  *
20
28
  * This is the recommended **hybrid** layout: 3D stays in Three; chrome and data panes stay in Geometra’s protocol.
21
29
  * Geometra’s client still uses `resizeTarget: window` by default; when only the Geometra column changes size,
22
- * a `ResizeObserver` dispatches a synthetic `resize` on `window` so layout width/height track the panel
23
- * (coalesced to at most once per animation frame when both panes notify in the same frame).
30
+ * a `ResizeObserver` schedules a synthetic `resize` on `window` so layout width/height track the panel.
31
+ * The host `root` and both flex panes are observed (same idea as {@link createThreeGeometraStackedHost} observing
32
+ * its `root`) so container-driven root box changes still coalesce into the same rAF pass even if a panel callback
33
+ * ordering quirk would otherwise miss a tick.
34
+ * Panel-driven updates coalesce to at most **one** animation frame per burst: a single `requestAnimationFrame`
35
+ * pass runs the Three.js buffer resize and (when needed) that synthetic `resize`, so both flex panes firing
36
+ * in the same frame do not call `renderer.setSize` twice.
37
+ *
38
+ * Real `window` `resize` events schedule the same coalesced Three.js pass **without** an extra synthetic
39
+ * `resize`, so the thin client is not double-notified when the browser already fired `resize`.
24
40
  *
25
41
  * The Three.js pane listens to `window` `resize` as well so `devicePixelRatio` updates (zoom / display changes)
26
- * refresh the WebGL drawing buffer without relying on panel `ResizeObserver` alone.
42
+ * refresh the WebGL drawing buffer without relying on panel `ResizeObserver` alone. Optional
43
+ * {@link ThreeGeometraSplitHostOptions.maxDevicePixelRatio} caps the ratio used for the WebGL buffer.
27
44
  *
28
45
  * Pass through {@link BrowserCanvasClientOptions} from `@geometra/renderer-canvas` / `@geometra/client`
29
46
  * (for example `binaryFraming`, `onError`, `onFrameMetrics`, `onData` for JSON side-channels on the same
30
47
  * socket as layout; channel names are defined by your app and the Geometra server).
31
48
  */
32
49
  export function createThreeGeometraSplitHost(options) {
33
- const { container, geometraWidth = 420, geometraOnLeft = false, threeBackground = 0x000000, cameraFov = 50, cameraNear = 0.1, cameraFar = 2000, cameraPosition = [0, 0, 5], onThreeReady, onThreeFrame, window: providedWindow, ...browserOptions } = options;
50
+ const { container, geometraWidth: geometraWidthOpt = GEOMETRA_SPLIT_HOST_LAYOUT_DEFAULTS.geometraWidth, geometraOnLeft = false, maxDevicePixelRatio, threeBackground = GEOMETRA_THREE_HOST_SCENE_DEFAULTS.threeBackground, cameraFov = GEOMETRA_THREE_HOST_SCENE_DEFAULTS.cameraFov, cameraNear = GEOMETRA_THREE_HOST_SCENE_DEFAULTS.cameraNear, cameraFar = GEOMETRA_THREE_HOST_SCENE_DEFAULTS.cameraFar, cameraPosition = GEOMETRA_THREE_HOST_SCENE_DEFAULTS.cameraPosition, onThreeReady, onThreeFrame, overlayUrl, overlayRendererOptions, overlayPointerEvents = 'none', overlayBinaryFraming, window: providedWindow, ...browserOptions } = options;
51
+ const geometraWidth = coerceHostNonNegativeCssPx(geometraWidthOpt, GEOMETRA_SPLIT_HOST_LAYOUT_DEFAULTS.geometraWidth);
34
52
  const doc = container.ownerDocument;
35
53
  const win = providedWindow ?? doc.defaultView;
36
54
  if (!win) {
@@ -59,15 +77,24 @@ export function createThreeGeometraSplitHost(options) {
59
77
  const threeCanvas = doc.createElement('canvas');
60
78
  fullSizeCanvas(threeCanvas);
61
79
  threePanel.appendChild(threeCanvas);
80
+ // Overlay canvas on the Three.js panel (optional)
81
+ let overlayCanvasEl;
82
+ if (overlayUrl) {
83
+ overlayCanvasEl = doc.createElement('canvas');
84
+ overlayCanvasEl.style.display = 'block';
85
+ overlayCanvasEl.style.position = 'absolute';
86
+ overlayCanvasEl.style.left = '0';
87
+ overlayCanvasEl.style.top = '0';
88
+ overlayCanvasEl.style.width = '100%';
89
+ overlayCanvasEl.style.height = '100%';
90
+ overlayCanvasEl.style.pointerEvents = overlayPointerEvents;
91
+ overlayCanvasEl.style.zIndex = '1';
92
+ threePanel.appendChild(overlayCanvasEl);
93
+ }
62
94
  const geometraCanvas = doc.createElement('canvas');
63
95
  fullSizeCanvas(geometraCanvas);
64
96
  geometraPanel.appendChild(geometraCanvas);
65
- const glRenderer = new THREE.WebGLRenderer({
66
- canvas: threeCanvas,
67
- antialias: true,
68
- alpha: false,
69
- });
70
- const { scene, camera, clock } = createGeometraThreeSceneBasics({
97
+ const { renderer: glRenderer, scene, camera, clock } = createGeometraThreeWebGLWithSceneBasics(threeCanvas, {
71
98
  threeBackground,
72
99
  cameraFov,
73
100
  cameraNear,
@@ -75,35 +102,68 @@ export function createThreeGeometraSplitHost(options) {
75
102
  cameraPosition,
76
103
  });
77
104
  const resizeThree = () => {
78
- resizeGeometraThreePerspectiveView(glRenderer, camera, threePanel.clientWidth, threePanel.clientHeight, win.devicePixelRatio || 1);
105
+ resizeGeometraThreePerspectiveView(glRenderer, camera, threePanel.clientWidth, threePanel.clientHeight, resolveHostDevicePixelRatio(win.devicePixelRatio || 1, maxDevicePixelRatio));
79
106
  };
107
+ let destroyed = false;
108
+ const layoutSync = createGeometraHostLayoutSyncRaf(win, {
109
+ isDestroyed: () => destroyed,
110
+ syncLayout: resizeThree,
111
+ dispatchGeometraResize: () => {
112
+ win.dispatchEvent(new Event('resize'));
113
+ },
114
+ });
80
115
  const onWindowResize = () => {
81
- resizeThree();
116
+ layoutSync.schedule(false);
82
117
  };
83
118
  win.addEventListener('resize', onWindowResize, { passive: true });
84
119
  resizeThree();
85
- const geometraHandle = createBrowserCanvasClient({
86
- ...browserOptions,
87
- canvas: geometraCanvas,
88
- window: win,
89
- });
90
- let geometraResizeRafId;
91
- const triggerGeometraResize = () => {
92
- if (geometraResizeRafId !== undefined)
93
- return;
94
- geometraResizeRafId = win.requestAnimationFrame(() => {
95
- geometraResizeRafId = undefined;
96
- win.dispatchEvent(new Event('resize'));
97
- });
98
- };
120
+ const geometraHandle = (() => {
121
+ try {
122
+ return createBrowserCanvasClient({
123
+ ...browserOptions,
124
+ canvas: geometraCanvas,
125
+ window: win,
126
+ });
127
+ }
128
+ catch (err) {
129
+ layoutSync.cancel();
130
+ win.removeEventListener('resize', onWindowResize);
131
+ disposeGeometraThreeWebGLWithSceneBasics({ renderer: glRenderer, clock });
132
+ root.remove();
133
+ throw err;
134
+ }
135
+ })();
136
+ // Overlay Geometra client (optional)
137
+ let overlayHandle;
138
+ if (overlayUrl && overlayCanvasEl) {
139
+ try {
140
+ overlayHandle = createBrowserCanvasClient({
141
+ url: overlayUrl,
142
+ binaryFraming: overlayBinaryFraming ?? browserOptions.binaryFraming,
143
+ canvas: overlayCanvasEl,
144
+ window: win,
145
+ rendererOptions: {
146
+ background: 'transparent',
147
+ ...overlayRendererOptions,
148
+ },
149
+ });
150
+ }
151
+ catch (err) {
152
+ layoutSync.cancel();
153
+ win.removeEventListener('resize', onWindowResize);
154
+ geometraHandle.destroy();
155
+ disposeGeometraThreeWebGLWithSceneBasics({ renderer: glRenderer, clock });
156
+ root.remove();
157
+ throw err;
158
+ }
159
+ }
99
160
  const roContainer = new ResizeObserver(() => {
100
- resizeThree();
101
- triggerGeometraResize();
161
+ layoutSync.schedule(true);
102
162
  });
163
+ roContainer.observe(root);
103
164
  roContainer.observe(threePanel);
104
165
  roContainer.observe(geometraPanel);
105
166
  let rafId;
106
- let destroyed = false;
107
167
  const destroy = () => {
108
168
  if (destroyed)
109
169
  return;
@@ -112,14 +172,12 @@ export function createThreeGeometraSplitHost(options) {
112
172
  win.cancelAnimationFrame(rafId);
113
173
  rafId = undefined;
114
174
  }
115
- if (geometraResizeRafId !== undefined) {
116
- win.cancelAnimationFrame(geometraResizeRafId);
117
- geometraResizeRafId = undefined;
118
- }
175
+ layoutSync.cancel();
119
176
  win.removeEventListener('resize', onWindowResize);
120
177
  roContainer.disconnect();
178
+ overlayHandle?.destroy();
121
179
  geometraHandle.destroy();
122
- glRenderer.dispose();
180
+ disposeGeometraThreeWebGLWithSceneBasics({ renderer: glRenderer, clock });
123
181
  root.remove();
124
182
  };
125
183
  const ctxBase = {
@@ -129,14 +187,30 @@ export function createThreeGeometraSplitHost(options) {
129
187
  threeCanvas,
130
188
  destroy,
131
189
  };
132
- onThreeReady?.(ctxBase);
190
+ try {
191
+ onThreeReady?.(ctxBase);
192
+ }
193
+ catch (err) {
194
+ destroy();
195
+ throw err;
196
+ }
133
197
  const loop = () => {
134
198
  if (destroyed)
135
199
  return;
136
200
  rafId = win.requestAnimationFrame(loop);
137
201
  const delta = clock.getDelta();
138
202
  const elapsed = clock.elapsedTime;
139
- onThreeFrame?.({ ...ctxBase, clock, delta, elapsed });
203
+ try {
204
+ if (onThreeFrame?.({ ...ctxBase, clock, delta, elapsed }) === false) {
205
+ return;
206
+ }
207
+ }
208
+ catch (err) {
209
+ destroy();
210
+ throw err;
211
+ }
212
+ if (destroyed)
213
+ return;
140
214
  glRenderer.render(scene, camera);
141
215
  };
142
216
  if (!destroyed) {
@@ -148,11 +222,13 @@ export function createThreeGeometraSplitHost(options) {
148
222
  geometraPanel,
149
223
  threeCanvas,
150
224
  geometraCanvas,
225
+ overlayCanvas: overlayCanvasEl,
151
226
  renderer: glRenderer,
152
227
  scene,
153
228
  camera,
154
229
  clock,
155
230
  geometra: geometraHandle,
231
+ overlay: overlayHandle,
156
232
  destroy,
157
233
  };
158
234
  }
@@ -1 +1 @@
1
- {"version":3,"file":"split-host.js","sourceRoot":"","sources":["../src/split-host.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"split-host.js","sourceRoot":"","sources":["../src/split-host.ts"],"names":[],"mappings":"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"}
@@ -1,34 +1,74 @@
1
1
  import * as THREE from 'three';
2
- import { type BrowserCanvasClientHandle, type BrowserCanvasClientOptions } from '@geometra/renderer-canvas';
3
- import type { ThreeFrameContext, ThreeRuntimeContext } from './split-host.js';
2
+ import { type BrowserCanvasClientHandle } from '@geometra/renderer-canvas';
3
+ import type { GeometraHostBrowserCanvasClientOptions, ThreeFrameContext, ThreeRuntimeContext } from './split-host.js';
4
4
  import { type GeometraThreeSceneBasicsOptions } from './three-scene-basics.js';
5
- /** Corner anchor for the Geometra HUD overlay (CSS `position: absolute` on the host). */
6
- export type GeometraHudPlacement = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
7
- export interface ThreeGeometraStackedHostOptions extends Omit<BrowserCanvasClientOptions, 'canvas'>, GeometraThreeSceneBasicsOptions {
5
+ import { type GeometraHudPlacement } from './host-css-coerce.js';
6
+ export type { GeometraHudPlacement } from './host-css-coerce.js';
7
+ /**
8
+ * Default HUD width, height, corner, and margin for {@link createThreeGeometraStackedHost}; same as
9
+ * those option fallbacks and README.
10
+ */
11
+ export declare const GEOMETRA_STACKED_HOST_LAYOUT_DEFAULTS: {
12
+ readonly geometraHudWidth: 420;
13
+ readonly geometraHudHeight: 320;
14
+ readonly geometraHudPlacement: "bottom-right";
15
+ readonly geometraHudMargin: 12;
16
+ };
17
+ export interface ThreeGeometraStackedHostOptions extends GeometraHostBrowserCanvasClientOptions, GeometraThreeSceneBasicsOptions {
8
18
  /** Host element; a full-size stacking context is appended (existing children are left untouched). */
9
19
  container: HTMLElement;
10
- /** HUD width in CSS pixels. Default: 420. */
20
+ /**
21
+ * HUD width in CSS pixels. Default: {@link GEOMETRA_STACKED_HOST_LAYOUT_DEFAULTS.geometraHudWidth}.
22
+ * Non-finite or negative values fall back to the default so layout does not emit invalid `px` styles.
23
+ */
11
24
  geometraHudWidth?: number;
12
- /** HUD height in CSS pixels. Default: 320. */
25
+ /**
26
+ * HUD height in CSS pixels. Default: {@link GEOMETRA_STACKED_HOST_LAYOUT_DEFAULTS.geometraHudHeight}.
27
+ * Non-finite or negative values fall back to the default.
28
+ */
13
29
  geometraHudHeight?: number;
14
- /** HUD corner. Default: `bottom-right`. */
30
+ /**
31
+ * HUD corner. Default: {@link GEOMETRA_STACKED_HOST_LAYOUT_DEFAULTS.geometraHudPlacement}.
32
+ * Runtime strings (e.g. from JSON or agents) are normalized with {@link coerceGeometraHudPlacement}
33
+ * (trim + case-insensitive match for the four literals; anything else uses the default).
34
+ */
15
35
  geometraHudPlacement?: GeometraHudPlacement;
16
- /** Inset from the chosen corner in CSS pixels. Default: 12. */
36
+ /**
37
+ * Inset from the chosen corner in CSS pixels. Default: {@link GEOMETRA_STACKED_HOST_LAYOUT_DEFAULTS.geometraHudMargin}.
38
+ * Non-finite or negative values fall back to the default.
39
+ */
17
40
  geometraHudMargin?: number;
18
41
  /**
19
42
  * CSS `pointer-events` on the HUD wrapper (e.g. `'none'` so input falls through to the WebGL canvas).
20
- * Default: `'auto'`.
43
+ * Default: `'auto'`. Blank or whitespace-only strings fall back to the default; use
44
+ * {@link coerceGeometraHudPointerEvents} in custom layouts for the same rules.
21
45
  */
22
46
  geometraHudPointerEvents?: string;
47
+ /**
48
+ * CSS `z-index` on the HUD wrapper when you stack other siblings in {@link ThreeGeometraStackedHostOptions.container}
49
+ * or need a fixed order above the WebGL layer (Three canvas uses `0`). Default: `1`.
50
+ * Non-finite numbers and blank/whitespace-only strings fall back to the default so the HUD keeps a predictable stack order.
51
+ */
52
+ geometraHudZIndex?: string | number;
53
+ /**
54
+ * Upper bound for `window.devicePixelRatio` when sizing the WebGL drawing buffer (e.g. `2` on retina
55
+ * to cut memory and fragment cost). When omitted, the full device pixel ratio is used.
56
+ */
57
+ maxDevicePixelRatio?: number;
23
58
  /**
24
59
  * Called once after scene, camera, and renderer are created.
25
60
  * Call `ctx.destroy()` to tear down immediately; the render loop will not start if the host is already destroyed.
61
+ * If this callback throws, the host is fully torn down and the error is rethrown.
26
62
  */
27
63
  onThreeReady?: (ctx: ThreeRuntimeContext) => void;
28
64
  /**
29
65
  * Called every frame before `renderer.render`.
66
+ * Return **`false`** to skip `render` for this frame only (same idea as
67
+ * {@link tickGeometraThreeWebGLWithSceneBasicsFrame}). If you call {@link ThreeRuntimeContext.destroy} here,
68
+ * teardown runs and this frame’s `render` is skipped.
69
+ * If this callback throws, the host is fully torn down and the error is rethrown (same as {@link onThreeReady}).
30
70
  */
31
- onThreeFrame?: (ctx: ThreeFrameContext) => void;
71
+ onThreeFrame?: (ctx: ThreeFrameContext) => void | false;
32
72
  }
33
73
  export interface ThreeGeometraStackedHostHandle {
34
74
  root: HTMLDivElement;
@@ -41,19 +81,29 @@ export interface ThreeGeometraStackedHostHandle {
41
81
  camera: THREE.PerspectiveCamera;
42
82
  clock: THREE.Clock;
43
83
  geometra: BrowserCanvasClientHandle;
84
+ /**
85
+ * Stops the render loop, tears down WebGL via {@link disposeGeometraThreeWebGLWithSceneBasics} (clock stop +
86
+ * the same renderer registration headless {@link renderGeometraThreeWebGLWithSceneBasicsFrame} /
87
+ * {@link tickGeometraThreeWebGLWithSceneBasicsFrame} use to skip draws after dispose), disconnects observers,
88
+ * and tears down the Geometra client.
89
+ */
44
90
  destroy(): void;
45
91
  }
46
92
  /**
47
93
  * Stacked host: full-viewport Three.js `WebGLRenderer` with a positioned Geometra canvas **HUD** on top.
48
94
  *
49
95
  * Pointer routing follows normal hit-testing: events hit the Geometra canvas where it overlaps the WebGL layer
50
- * (`z-index` above the Three canvas); elsewhere, the Three canvas receives input. Override with
51
- * {@link ThreeGeometraStackedHostOptions.geometraHudPointerEvents} (e.g. `'none'` for a click-through HUD).
96
+ * (HUD `z-index` above the Three canvas, which uses `0`); elsewhere, the Three canvas receives input. Override with
97
+ * {@link ThreeGeometraStackedHostOptions.geometraHudPointerEvents} (e.g. `'none'` for a click-through HUD) or
98
+ * {@link ThreeGeometraStackedHostOptions.geometraHudZIndex} when you add other positioned siblings.
52
99
  *
53
100
  * Geometra’s client still uses `resizeTarget: window` by default; when only the HUD box changes size,
54
101
  * a coalesced synthetic `resize` is dispatched on `window` (same pattern as {@link createThreeGeometraSplitHost}).
102
+ * `ResizeObserver` callbacks and real `window` `resize` share one rAF-coalesced Three.js buffer pass; the
103
+ * synthetic `resize` is emitted only from observer-driven layout changes, not from real window resizes.
55
104
  * The Three.js layer listens to `window` `resize` for `devicePixelRatio` changes and uses the host `root` size
56
- * for the drawing buffer.
105
+ * for the drawing buffer. Optional {@link ThreeGeometraStackedHostOptions.maxDevicePixelRatio} caps the ratio
106
+ * used for the WebGL buffer.
57
107
  */
58
108
  export declare function createThreeGeometraStackedHost(options: ThreeGeometraStackedHostOptions): ThreeGeometraStackedHostHandle;
59
109
  //# sourceMappingURL=stacked-host.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stacked-host.d.ts","sourceRoot":"","sources":["../src/stacked-host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAEL,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAChC,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAC7E,OAAO,EAAkC,KAAK,+BAA+B,EAAE,MAAM,yBAAyB,CAAA;AAG9G,yFAAyF;AACzF,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,CAAA;AAE5F,MAAM,WAAW,+BACf,SAAQ,IAAI,CAAC,0BAA0B,EAAE,QAAQ,CAAC,EAChD,+BAA+B;IACjC,qGAAqG;IACrG,SAAS,EAAE,WAAW,CAAA;IACtB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,8CAA8C;IAC9C,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,2CAA2C;IAC3C,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;IAC3C,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;OAGG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,IAAI,CAAA;IACjD;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,CAAA;CAChD;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,cAAc,CAAA;IACpB,8EAA8E;IAC9E,WAAW,EAAE,cAAc,CAAA;IAC3B,WAAW,EAAE,iBAAiB,CAAA;IAC9B,cAAc,EAAE,iBAAiB,CAAA;IACjC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAA;IAC7B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAA;IAClB,MAAM,EAAE,KAAK,CAAC,iBAAiB,CAAA;IAC/B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAA;IAClB,QAAQ,EAAE,yBAAyB,CAAA;IACnC,OAAO,IAAI,IAAI,CAAA;CAChB;AAsCD;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,+BAA+B,GACvC,8BAA8B,CA6KhC"}
1
+ {"version":3,"file":"stacked-host.d.ts","sourceRoot":"","sources":["../src/stacked-host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EACV,sCAAsC,EACtC,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAIL,KAAK,+BAA+B,EACrC,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAKL,KAAK,oBAAoB,EAC1B,MAAM,sBAAsB,CAAA;AAG7B,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAEhE;;;GAGG;AACH,eAAO,MAAM,qCAAqC;;;;;CAUjD,CAAA;AAED,MAAM,WAAW,+BACf,SAAQ,sCAAsC,EAC5C,+BAA+B;IACjC,qGAAqG;IACrG,SAAS,EAAE,WAAW,CAAA;IACtB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;IAC3C;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACnC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,IAAI,CAAA;IACjD;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,GAAG,KAAK,CAAA;CACxD;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,cAAc,CAAA;IACpB,8EAA8E;IAC9E,WAAW,EAAE,cAAc,CAAA;IAC3B,WAAW,EAAE,iBAAiB,CAAA;IAC9B,cAAc,EAAE,iBAAiB,CAAA;IACjC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAA;IAC7B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAA;IAClB,MAAM,EAAE,KAAK,CAAC,iBAAiB,CAAA;IAC/B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAA;IAClB,QAAQ,EAAE,yBAAyB,CAAA;IACnC;;;;;OAKG;IACH,OAAO,IAAI,IAAI,CAAA;CAChB;AAsCD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,+BAA+B,GACvC,8BAA8B,CAkNhC"}
@@ -1,7 +1,18 @@
1
- import * as THREE from 'three';
2
1
  import { createBrowserCanvasClient, } from '@geometra/renderer-canvas';
3
- import { createGeometraThreeSceneBasics } from './three-scene-basics.js';
4
- import { resizeGeometraThreePerspectiveView } from './utils.js';
2
+ import { GEOMETRA_THREE_HOST_SCENE_DEFAULTS, createGeometraThreeWebGLWithSceneBasics, disposeGeometraThreeWebGLWithSceneBasics, } from './three-scene-basics.js';
3
+ import { createGeometraHostLayoutSyncRaf } from './layout-sync.js';
4
+ import { coerceGeometraHudPlacement, coerceGeometraHudPointerEvents, coerceHostNonNegativeCssPx, coerceHostStackingZIndexCss, } from './host-css-coerce.js';
5
+ import { resizeGeometraThreePerspectiveView, resolveHostDevicePixelRatio } from './utils.js';
6
+ /**
7
+ * Default HUD width, height, corner, and margin for {@link createThreeGeometraStackedHost}; same as
8
+ * those option fallbacks and README.
9
+ */
10
+ export const GEOMETRA_STACKED_HOST_LAYOUT_DEFAULTS = {
11
+ geometraHudWidth: 420,
12
+ geometraHudHeight: 320,
13
+ geometraHudPlacement: 'bottom-right',
14
+ geometraHudMargin: 12,
15
+ };
5
16
  function fullSizeCanvas(canvas) {
6
17
  canvas.style.display = 'block';
7
18
  canvas.style.width = '100%';
@@ -36,16 +47,25 @@ function applyHudPlacement(wrap, placement, marginPx) {
36
47
  * Stacked host: full-viewport Three.js `WebGLRenderer` with a positioned Geometra canvas **HUD** on top.
37
48
  *
38
49
  * Pointer routing follows normal hit-testing: events hit the Geometra canvas where it overlaps the WebGL layer
39
- * (`z-index` above the Three canvas); elsewhere, the Three canvas receives input. Override with
40
- * {@link ThreeGeometraStackedHostOptions.geometraHudPointerEvents} (e.g. `'none'` for a click-through HUD).
50
+ * (HUD `z-index` above the Three canvas, which uses `0`); elsewhere, the Three canvas receives input. Override with
51
+ * {@link ThreeGeometraStackedHostOptions.geometraHudPointerEvents} (e.g. `'none'` for a click-through HUD) or
52
+ * {@link ThreeGeometraStackedHostOptions.geometraHudZIndex} when you add other positioned siblings.
41
53
  *
42
54
  * Geometra’s client still uses `resizeTarget: window` by default; when only the HUD box changes size,
43
55
  * a coalesced synthetic `resize` is dispatched on `window` (same pattern as {@link createThreeGeometraSplitHost}).
56
+ * `ResizeObserver` callbacks and real `window` `resize` share one rAF-coalesced Three.js buffer pass; the
57
+ * synthetic `resize` is emitted only from observer-driven layout changes, not from real window resizes.
44
58
  * The Three.js layer listens to `window` `resize` for `devicePixelRatio` changes and uses the host `root` size
45
- * for the drawing buffer.
59
+ * for the drawing buffer. Optional {@link ThreeGeometraStackedHostOptions.maxDevicePixelRatio} caps the ratio
60
+ * used for the WebGL buffer.
46
61
  */
47
62
  export function createThreeGeometraStackedHost(options) {
48
- const { container, geometraHudWidth = 420, geometraHudHeight = 320, geometraHudPlacement = 'bottom-right', geometraHudMargin = 12, geometraHudPointerEvents = 'auto', threeBackground = 0x000000, cameraFov = 50, cameraNear = 0.1, cameraFar = 2000, cameraPosition = [0, 0, 5], onThreeReady, onThreeFrame, window: providedWindow, ...browserOptions } = options;
63
+ const { container, geometraHudWidth: geometraHudWidthOpt = GEOMETRA_STACKED_HOST_LAYOUT_DEFAULTS.geometraHudWidth, geometraHudHeight: geometraHudHeightOpt = GEOMETRA_STACKED_HOST_LAYOUT_DEFAULTS.geometraHudHeight, geometraHudPlacement: geometraHudPlacementOpt = GEOMETRA_STACKED_HOST_LAYOUT_DEFAULTS.geometraHudPlacement, geometraHudMargin: geometraHudMarginOpt = GEOMETRA_STACKED_HOST_LAYOUT_DEFAULTS.geometraHudMargin, geometraHudPointerEvents: geometraHudPointerEventsOpt = 'auto', geometraHudZIndex = 1, maxDevicePixelRatio, threeBackground = GEOMETRA_THREE_HOST_SCENE_DEFAULTS.threeBackground, cameraFov = GEOMETRA_THREE_HOST_SCENE_DEFAULTS.cameraFov, cameraNear = GEOMETRA_THREE_HOST_SCENE_DEFAULTS.cameraNear, cameraFar = GEOMETRA_THREE_HOST_SCENE_DEFAULTS.cameraFar, cameraPosition = GEOMETRA_THREE_HOST_SCENE_DEFAULTS.cameraPosition, onThreeReady, onThreeFrame, window: providedWindow, ...browserOptions } = options;
64
+ const geometraHudWidth = coerceHostNonNegativeCssPx(geometraHudWidthOpt, GEOMETRA_STACKED_HOST_LAYOUT_DEFAULTS.geometraHudWidth);
65
+ const geometraHudHeight = coerceHostNonNegativeCssPx(geometraHudHeightOpt, GEOMETRA_STACKED_HOST_LAYOUT_DEFAULTS.geometraHudHeight);
66
+ const geometraHudMargin = coerceHostNonNegativeCssPx(geometraHudMarginOpt, GEOMETRA_STACKED_HOST_LAYOUT_DEFAULTS.geometraHudMargin);
67
+ const geometraHudPlacement = coerceGeometraHudPlacement(geometraHudPlacementOpt, GEOMETRA_STACKED_HOST_LAYOUT_DEFAULTS.geometraHudPlacement);
68
+ const geometraHudPointerEvents = coerceGeometraHudPointerEvents(geometraHudPointerEventsOpt, 'auto');
49
69
  const doc = container.ownerDocument;
50
70
  const win = providedWindow ?? doc.defaultView;
51
71
  if (!win) {
@@ -70,7 +90,7 @@ export function createThreeGeometraStackedHost(options) {
70
90
  root.appendChild(threeCanvas);
71
91
  const geometraHud = doc.createElement('div');
72
92
  geometraHud.style.position = 'absolute';
73
- geometraHud.style.zIndex = '1';
93
+ geometraHud.style.zIndex = coerceHostStackingZIndexCss(geometraHudZIndex, 1);
74
94
  geometraHud.style.width = `${geometraHudWidth}px`;
75
95
  geometraHud.style.height = `${geometraHudHeight}px`;
76
96
  geometraHud.style.minWidth = '0';
@@ -82,12 +102,7 @@ export function createThreeGeometraStackedHost(options) {
82
102
  const geometraCanvas = doc.createElement('canvas');
83
103
  fullSizeCanvas(geometraCanvas);
84
104
  geometraHud.appendChild(geometraCanvas);
85
- const glRenderer = new THREE.WebGLRenderer({
86
- canvas: threeCanvas,
87
- antialias: true,
88
- alpha: false,
89
- });
90
- const { scene, camera, clock } = createGeometraThreeSceneBasics({
105
+ const { renderer: glRenderer, scene, camera, clock } = createGeometraThreeWebGLWithSceneBasics(threeCanvas, {
91
106
  threeBackground,
92
107
  cameraFov,
93
108
  cameraNear,
@@ -95,38 +110,46 @@ export function createThreeGeometraStackedHost(options) {
95
110
  cameraPosition,
96
111
  });
97
112
  const resizeThree = () => {
98
- resizeGeometraThreePerspectiveView(glRenderer, camera, root.clientWidth, root.clientHeight, win.devicePixelRatio || 1);
113
+ resizeGeometraThreePerspectiveView(glRenderer, camera, root.clientWidth, root.clientHeight, resolveHostDevicePixelRatio(win.devicePixelRatio || 1, maxDevicePixelRatio));
99
114
  };
115
+ let destroyed = false;
116
+ const layoutSync = createGeometraHostLayoutSyncRaf(win, {
117
+ isDestroyed: () => destroyed,
118
+ syncLayout: resizeThree,
119
+ dispatchGeometraResize: () => {
120
+ win.dispatchEvent(new Event('resize'));
121
+ },
122
+ });
100
123
  const onWindowResize = () => {
101
- resizeThree();
124
+ layoutSync.schedule(false);
102
125
  };
103
126
  win.addEventListener('resize', onWindowResize, { passive: true });
104
127
  resizeThree();
105
- const geometraHandle = createBrowserCanvasClient({
106
- ...browserOptions,
107
- canvas: geometraCanvas,
108
- window: win,
109
- });
110
- let geometraResizeRafId;
111
- const triggerGeometraResize = () => {
112
- if (geometraResizeRafId !== undefined)
113
- return;
114
- geometraResizeRafId = win.requestAnimationFrame(() => {
115
- geometraResizeRafId = undefined;
116
- win.dispatchEvent(new Event('resize'));
117
- });
118
- };
128
+ const geometraHandle = (() => {
129
+ try {
130
+ return createBrowserCanvasClient({
131
+ ...browserOptions,
132
+ canvas: geometraCanvas,
133
+ window: win,
134
+ });
135
+ }
136
+ catch (err) {
137
+ layoutSync.cancel();
138
+ win.removeEventListener('resize', onWindowResize);
139
+ disposeGeometraThreeWebGLWithSceneBasics({ renderer: glRenderer, clock });
140
+ root.remove();
141
+ throw err;
142
+ }
143
+ })();
119
144
  const roRoot = new ResizeObserver(() => {
120
- resizeThree();
121
- triggerGeometraResize();
145
+ layoutSync.schedule(true);
122
146
  });
123
147
  roRoot.observe(root);
124
148
  const roHud = new ResizeObserver(() => {
125
- triggerGeometraResize();
149
+ layoutSync.schedule(true);
126
150
  });
127
151
  roHud.observe(geometraHud);
128
152
  let rafId;
129
- let destroyed = false;
130
153
  const destroy = () => {
131
154
  if (destroyed)
132
155
  return;
@@ -135,15 +158,12 @@ export function createThreeGeometraStackedHost(options) {
135
158
  win.cancelAnimationFrame(rafId);
136
159
  rafId = undefined;
137
160
  }
138
- if (geometraResizeRafId !== undefined) {
139
- win.cancelAnimationFrame(geometraResizeRafId);
140
- geometraResizeRafId = undefined;
141
- }
161
+ layoutSync.cancel();
142
162
  win.removeEventListener('resize', onWindowResize);
143
163
  roRoot.disconnect();
144
164
  roHud.disconnect();
145
165
  geometraHandle.destroy();
146
- glRenderer.dispose();
166
+ disposeGeometraThreeWebGLWithSceneBasics({ renderer: glRenderer, clock });
147
167
  root.remove();
148
168
  };
149
169
  const ctxBase = {
@@ -153,14 +173,30 @@ export function createThreeGeometraStackedHost(options) {
153
173
  threeCanvas,
154
174
  destroy,
155
175
  };
156
- onThreeReady?.(ctxBase);
176
+ try {
177
+ onThreeReady?.(ctxBase);
178
+ }
179
+ catch (err) {
180
+ destroy();
181
+ throw err;
182
+ }
157
183
  const loop = () => {
158
184
  if (destroyed)
159
185
  return;
160
186
  rafId = win.requestAnimationFrame(loop);
161
187
  const delta = clock.getDelta();
162
188
  const elapsed = clock.elapsedTime;
163
- onThreeFrame?.({ ...ctxBase, clock, delta, elapsed });
189
+ try {
190
+ if (onThreeFrame?.({ ...ctxBase, clock, delta, elapsed }) === false) {
191
+ return;
192
+ }
193
+ }
194
+ catch (err) {
195
+ destroy();
196
+ throw err;
197
+ }
198
+ if (destroyed)
199
+ return;
164
200
  glRenderer.render(scene, camera);
165
201
  };
166
202
  if (!destroyed) {
@@ -1 +1 @@
1
- {"version":3,"file":"stacked-host.js","sourceRoot":"","sources":["../src/stacked-host.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stacked-host.js","sourceRoot":"","sources":["../src/stacked-host.ts"],"names":[],"mappings":"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"}