@pascal-app/viewer 1.0.7 → 1.1.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 (67) hide show
  1. package/README.md +54 -21
  2. package/dist/components/viewer/glb-replace-instances.d.ts +6 -3
  3. package/dist/components/viewer/glb-replace-instances.d.ts.map +1 -1
  4. package/dist/components/viewer/glb-replace-instances.js +5 -4
  5. package/dist/components/viewer/glb-scene.d.ts +3 -1
  6. package/dist/components/viewer/glb-scene.d.ts.map +1 -1
  7. package/dist/components/viewer/glb-scene.js +2 -1
  8. package/dist/components/viewer/index.d.ts.map +1 -1
  9. package/dist/components/viewer/index.js +8 -4
  10. package/dist/components/viewer/registered-systems.d.ts.map +1 -1
  11. package/dist/components/viewer/registered-systems.js +2 -2
  12. package/dist/components/viewer/unsupported-gpu-fallback.d.ts.map +1 -1
  13. package/dist/components/viewer/unsupported-gpu-fallback.js +21 -1
  14. package/dist/components/viewer/use-daylight-rooms.d.ts.map +1 -1
  15. package/dist/components/viewer/use-daylight-rooms.js +75 -33
  16. package/dist/hooks/use-gltf-ktx2.d.ts.map +1 -1
  17. package/dist/hooks/use-gltf-ktx2.js +2 -1
  18. package/dist/index.d.ts +5 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +5 -1
  21. package/dist/lib/asset-url.d.ts +0 -1
  22. package/dist/lib/asset-url.d.ts.map +1 -1
  23. package/dist/lib/asset-url.js +3 -3
  24. package/dist/lib/daylight/room-context.d.ts.map +1 -1
  25. package/dist/lib/daylight/room-context.js +3 -2
  26. package/dist/lib/daylight/room-map.d.ts +124 -0
  27. package/dist/lib/daylight/room-map.d.ts.map +1 -0
  28. package/dist/lib/daylight/room-map.js +630 -0
  29. package/dist/lib/daylight/room-scene.d.ts +4 -2
  30. package/dist/lib/daylight/room-scene.d.ts.map +1 -1
  31. package/dist/lib/daylight/room-scene.js +72 -37
  32. package/dist/lib/daylight/rooms.d.ts +60 -30
  33. package/dist/lib/daylight/rooms.d.ts.map +1 -1
  34. package/dist/lib/daylight/rooms.js +331 -286
  35. package/dist/lib/ktx2-loader.d.ts.map +1 -1
  36. package/dist/lib/ktx2-loader.js +2 -1
  37. package/dist/lib/measurement-label.d.ts +4 -0
  38. package/dist/lib/measurement-label.d.ts.map +1 -0
  39. package/dist/lib/measurement-label.js +54 -0
  40. package/dist/lib/measurement-presentation.d.ts +5 -0
  41. package/dist/lib/measurement-presentation.d.ts.map +1 -0
  42. package/dist/lib/measurement-presentation.js +8 -0
  43. package/dist/lib/pointer-events.d.ts.map +1 -1
  44. package/dist/lib/pointer-events.js +3 -3
  45. package/dist/lib/texture-reference.d.ts.map +1 -1
  46. package/dist/lib/texture-reference.js +4 -3
  47. package/dist/lib/viewer-config.d.ts +21 -0
  48. package/dist/lib/viewer-config.d.ts.map +1 -0
  49. package/dist/lib/viewer-config.js +21 -0
  50. package/dist/lib/viewer-preference-storage.d.ts +7 -0
  51. package/dist/lib/viewer-preference-storage.d.ts.map +1 -0
  52. package/dist/lib/viewer-preference-storage.js +23 -0
  53. package/dist/store/use-viewer.d.ts +2 -56
  54. package/dist/store/use-viewer.d.ts.map +1 -1
  55. package/dist/store/use-viewer.js +3 -1
  56. package/dist/systems/elevator/elevator-interaction-system.d.ts +16 -2
  57. package/dist/systems/elevator/elevator-interaction-system.d.ts.map +1 -1
  58. package/dist/systems/elevator/elevator-interaction-system.js +41 -8
  59. package/dist/systems/geometry/geometry-status.d.ts +8 -0
  60. package/dist/systems/geometry/geometry-status.d.ts.map +1 -0
  61. package/dist/systems/geometry/geometry-status.js +24 -0
  62. package/dist/systems/roof/roof-system.d.ts.map +1 -1
  63. package/dist/systems/roof/roof-system.js +107 -65
  64. package/dist/systems/wall/wall-system.d.ts +11 -0
  65. package/dist/systems/wall/wall-system.d.ts.map +1 -1
  66. package/dist/systems/wall/wall-system.js +56 -10
  67. package/package.json +3 -3
package/README.md CHANGED
@@ -5,13 +5,13 @@
5
5
  ## Installation
6
6
 
7
7
  ```bash
8
- npm install @pascal-app/core @pascal-app/viewer @pascal-app/editor @pascal-app/nodes
8
+ npm install @pascal-app/core @pascal-app/viewer @pascal-app/nodes
9
9
  ```
10
10
 
11
11
  ## Peer Dependencies
12
12
 
13
13
  ```bash
14
- npm install next react react-dom three @react-three/fiber @react-three/drei lucide-react zustand
14
+ npm install react react-dom three @react-three/fiber @react-three/drei lucide-react zustand
15
15
  ```
16
16
 
17
17
  ## What's Included
@@ -25,33 +25,66 @@ npm install next react react-dom three @react-three/fiber @react-three/drei luci
25
25
 
26
26
  ## Usage
27
27
 
28
- ```typescript
29
- import { loadPlugin } from '@pascal-app/core'
30
- import { builtinPlugin } from '@pascal-app/nodes'
31
- import { Viewer } from '@pascal-app/viewer'
32
- import { useEffect, useState } from 'react'
28
+ The live render entry rebuilds geometry from a scene graph in ordinary React applications,
29
+ including Vite. It requires neither Next.js, Tailwind, nor `@pascal-app/editor`.
33
30
 
34
- const registryReady = loadPlugin(builtinPlugin)
31
+ ```tsx
32
+ import { acquireSceneReadOnlyLease, loadPlugin, useScene } from '@pascal-app/core'
33
+ import { renderPlugin } from '@pascal-app/nodes/render'
34
+ import { configureViewer, Viewer } from '@pascal-app/viewer'
35
+ import { OrbitControls } from '@react-three/drei'
36
+ import scene from './scene.json'
37
+
38
+ configureViewer({
39
+ assetsBaseUrl: 'https://editor.pascal.app',
40
+ storageUrl: 'https://your-storage.example',
41
+ // Optional self-hosted decoder directories (include the trailing slash):
42
+ // decoders: { dracoPath: '/decoders/draco/', basisPath: '/decoders/basis/' },
43
+ })
44
+ await loadPlugin(renderPlugin)
45
+ const releaseReadOnly = acquireSceneReadOnlyLease()
46
+ useScene.getState().setScene(scene.nodes, scene.rootNodeIds, {
47
+ materials: scene.materials,
48
+ collections: scene.collections,
49
+ installedPlugins: scene.installedPlugins,
50
+ })
35
51
 
36
52
  function App() {
37
- const [ready, setReady] = useState(false)
38
-
39
- useEffect(() => {
40
- void registryReady.then(() => setReady(true))
41
- }, [])
42
-
43
- if (!ready) return null
44
-
45
53
  return (
46
54
  <div style={{ width: '100vw', height: '100vh' }}>
47
- <Viewer />
55
+ <Viewer>
56
+ <OrbitControls makeDefault target={[0, 1, 0]} />
57
+ </Viewer>
48
58
  </div>
49
59
  )
50
60
  }
61
+
62
+ // On teardown, unmount App before releasing the lease:
63
+ // releaseReadOnly()
51
64
  ```
52
65
 
53
- Load the built-in plugin once, before mounting any viewer. Without it, the registry has no node
54
- definitions and scene nodes cannot render. Host-provided plugins use the same `loadPlugin` API.
66
+ Load exactly one built-in plugin per runtime: `renderPlugin` for a viewer, or the full
67
+ `builtinPlugin` from `@pascal-app/nodes` for an editor. Without registration, nodes cannot render.
68
+ The read-only lease suppresses document-writing systems while the live geometry systems rebuild
69
+ from the supplied graph. Keep it until the viewer unmounts.
70
+
71
+ **One active scene per page/package instance.** `useScene`, `useViewer`, the node registry,
72
+ `sceneRegistry`, loader caches and viewer systems are shared singletons. Concurrent viewers cannot
73
+ own independent graphs. Unmount the previous viewer and release its read-only lease and host
74
+ subscriptions before switching projects; hydrate the new graph and reset the host's viewer
75
+ selection/project presentation before remounting. Use a separate page/iframe for independent graphs.
76
+
77
+ `configureViewer` resolves asset and storage origins at call time. Without configuration, assets
78
+ use `https://editor.pascal.app`, with the existing `NEXT_PUBLIC_ASSETS_CDN_URL` and
79
+ `NEXT_PUBLIC_SUPABASE_URL` environments used when available. Next hosts should pass those values
80
+ explicitly at bootstrap. Draco defaults to version 1.5.5 and Basis to the Three.js 0.187.0
81
+ transcoder. Configure before loading assets: changing paths does not unload cached models or
82
+ already initialized decoder workers. KTX2 support is detected per renderer and misaligned textures
83
+ retain the RGBA fallback. Denied browser storage disables preference persistence without blocking
84
+ rendering.
85
+
86
+ See [`fixtures/viewer-live`](../../fixtures/viewer-live) for a complete small graph and the
87
+ isolated packed-package dev/production smoke test.
55
88
 
56
89
  ## Custom Camera Controls
57
90
 
@@ -212,11 +245,11 @@ function ViewerControls() {
212
245
  ## Asset CDN Helpers
213
246
 
214
247
  ```typescript
215
- import { resolveCdnUrl, ASSETS_CDN_URL } from '@pascal-app/viewer'
248
+ import { resolveCdnUrl } from '@pascal-app/viewer'
216
249
 
217
250
  // Resolves relative paths to CDN URLs
218
251
  const url = resolveCdnUrl('/items/chair/model.glb')
219
- // → 'https://pascal-cdn.wawasensei.dev/items/chair/model.glb'
252
+ // → 'https://editor.pascal.app/items/chair/model.glb'
220
253
 
221
254
  // Handles external URLs and asset:// protocol
222
255
  const externalUrl = resolveCdnUrl('https://example.com/model.glb')
@@ -1,4 +1,4 @@
1
- import { type AnyNode } from '@pascal-app/core';
1
+ import { type AnyNode, type GeometryContext } from '@pascal-app/core';
2
2
  import type { Object3D } from 'three';
3
3
  /**
4
4
  * Re-renders `bake: 'replace'` kinds (e.g. plugin trees) live over the baked GLB.
@@ -9,10 +9,13 @@ import type { Object3D } from 'three';
9
9
  * free, and a forest stays a few instanced draw calls.
10
10
  *
11
11
  * Memoized: `GlbScene` re-renders each frame on camera move; `nodes` and
12
- * `identity` are stable refs, so this whole subtree short-circuits.
12
+ * `identity` are stable refs, so this whole subtree short-circuits; `resolve`
13
+ * must be stable too.
13
14
  */
14
- export declare const GlbReplaceInstances: import("react").MemoExoticComponent<({ nodes, identity, }: {
15
+ export declare const GlbReplaceInstances: import("react").MemoExoticComponent<({ nodes, identity, resolve, }: {
15
16
  nodes: AnyNode[];
16
17
  identity: Map<string, Object3D>;
18
+ /** Looks up nodes of the published scene graph; handed to every renderer. */
19
+ resolve?: GeometryContext['resolve'];
17
20
  }) => import("react").JSX.Element>;
18
21
  //# sourceMappingURL=glb-replace-instances.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"glb-replace-instances.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/glb-replace-instances.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,OAAO,EAA0C,MAAM,kBAAkB,CAAA;AAGvF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAerC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,6DAG7B;IACD,KAAK,EAAE,OAAO,EAAE,CAAA;IAChB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;CAChC,iCAyCC,CAAA"}
1
+ {"version":3,"file":"glb-replace-instances.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/glb-replace-instances.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,OAAO,EAEZ,KAAK,eAAe,EAErB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAiBrC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,sEAI7B;IACD,KAAK,EAAE,OAAO,EAAE,CAAA;IAChB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC/B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;CACrC,iCAyCC,CAAA"}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
3
- import { nodeRegistry } from '@pascal-app/core';
3
+ import { nodeRegistry, } from '@pascal-app/core';
4
4
  import { createPortal } from '@react-three/fiber';
5
5
  import { Fragment, lazy, memo, Suspense, useMemo } from 'react';
6
6
  // Lazy components cached by their source so React.lazy isn't re-invoked per render.
@@ -22,9 +22,10 @@ function getReplaceRenderer(source) {
22
22
  * free, and a forest stays a few instanced draw calls.
23
23
  *
24
24
  * Memoized: `GlbScene` re-renders each frame on camera move; `nodes` and
25
- * `identity` are stable refs, so this whole subtree short-circuits.
25
+ * `identity` are stable refs, so this whole subtree short-circuits; `resolve`
26
+ * must be stable too.
26
27
  */
27
- export const GlbReplaceInstances = memo(function GlbReplaceInstances({ nodes, identity, }) {
28
+ export const GlbReplaceInstances = memo(function GlbReplaceInstances({ nodes, identity, resolve, }) {
28
29
  const byLevel = useMemo(() => {
29
30
  const levels = new Map();
30
31
  for (const node of nodes) {
@@ -54,7 +55,7 @@ export const GlbReplaceInstances = memo(function GlbReplaceInstances({ nodes, id
54
55
  if (!source)
55
56
  return;
56
57
  const Renderer = getReplaceRenderer(source);
57
- portals.push(_jsx(Fragment, { children: createPortal(_jsx(Suspense, { fallback: null, children: _jsx(Renderer, { nodes: kindNodes }) }), anchor) }, `${parentId}:${kind}`));
58
+ portals.push(_jsx(Fragment, { children: createPortal(_jsx(Suspense, { fallback: null, children: _jsx(Renderer, { nodes: kindNodes, resolve: resolve }) }), anchor) }, `${parentId}:${kind}`));
58
59
  });
59
60
  });
60
61
  return _jsx(_Fragment, { children: portals });
@@ -67,7 +67,9 @@ export declare function GlbScene({ url, interactiveItems, referenceNodes, replac
67
67
  /** Clicks and hovers on the building; without it the scene is look-only. */
68
68
  onPick?: (event: GlbPickEvent) => void;
69
69
  onWalkthroughChange?: (state: GlbWalkthrough) => void;
70
- /** The scene graph's nodes, so the selection callout can say what each element is. */
70
+ /** Every node of the scene graph the artifact was baked from: the selection
71
+ * callout says what each element is, and `replace` renderers resolve their
72
+ * parent and siblings. A stable reference. */
71
73
  sceneNodes?: Readonly<Record<string, AnyNode>>;
72
74
  }): import("react").JSX.Element;
73
75
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"glb-scene.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/glb-scene.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,OAAO,EAab,MAAM,kBAAkB,CAAA;AASzB,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAoB9B,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAuB3E;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAA;IACvB,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAA;IAC/D,SAAS,EAAE;QAAE,GAAG,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAA;CAC1E,CAAA;AAKD;0EAC0E;AAC1E,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAC/D,GAAG,IAAI,CAAA;AAqDR,KAAK,YAAY,GAAG;IAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAA;CAAE,CAAA;AA4CpE;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,SAAS,YAAY,EAAE,EAC7B,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,GAC5C,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG;IAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAA;CAAE,CAAC,GAAG,IAAI,CAkB5E;AASD;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EACH,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,eAAe,EACf,MAAM,EACN,mBAAmB,EACnB,UAAU,GACX,EAAE;IACD,GAAG,EAAE,MAAM,CAAA;IACX;oFACgF;IAChF,gBAAgB,CAAC,EAAE,kBAAkB,EAAE,CAAA;IACvC;mFAC+E;IAC/E,cAAc,CAAC,EAAE,OAAO,EAAE,CAAA;IAC1B;kFAC8E;IAC9E,YAAY,CAAC,EAAE,OAAO,EAAE,CAAA;IACxB,iFAAiF;IACjF,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAA;IACxE,4EAA4E;IAC5E,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;IACtC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAA;IACrD,sFAAsF;IACtF,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAC/C,+BAu7BA"}
1
+ {"version":3,"file":"glb-scene.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/glb-scene.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,OAAO,EAcb,MAAM,kBAAkB,CAAA;AASzB,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAoB9B,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAuB3E;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAA;IACvB,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAA;IAC/D,SAAS,EAAE;QAAE,GAAG,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAA;CAC1E,CAAA;AAKD;0EAC0E;AAC1E,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAC/D,GAAG,IAAI,CAAA;AAqDR,KAAK,YAAY,GAAG;IAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAA;CAAE,CAAA;AA4CpE;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,SAAS,YAAY,EAAE,EAC7B,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,GAC5C,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG;IAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAA;CAAE,CAAC,GAAG,IAAI,CAkB5E;AASD;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EACH,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,eAAe,EACf,MAAM,EACN,mBAAmB,EACnB,UAAU,GACX,EAAE;IACD,GAAG,EAAE,MAAM,CAAA;IACX;oFACgF;IAChF,gBAAgB,CAAC,EAAE,kBAAkB,EAAE,CAAA;IACvC;mFAC+E;IAC/E,cAAc,CAAC,EAAE,OAAO,EAAE,CAAA;IAC1B;kFAC8E;IAC9E,YAAY,CAAC,EAAE,OAAO,EAAE,CAAA;IACxB,iFAAiF;IACjF,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAA;IACxE,4EAA4E;IAC5E,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;IACtC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAA;IACrD;;mDAE+C;IAC/C,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAC/C,+BA47BA"}
@@ -127,6 +127,7 @@ export function GlbScene({ url, interactiveItems, referenceNodes, replaceNodes,
127
127
  const gltf = useGLTFKTX2(url);
128
128
  const rootRef = useRef(null);
129
129
  const actions = useClipActions(gltf.animations, rootRef);
130
+ const resolveNode = useMemo(() => sceneNodes ? (id) => sceneNodes[id] : undefined, [sceneNodes]);
130
131
  const proceduralPlayback = useMemo(() => {
131
132
  const byNode = new Map();
132
133
  gltf.scene.traverse((object) => {
@@ -987,7 +988,7 @@ export function GlbScene({ url, interactiveItems, referenceNodes, replaceNodes,
987
988
  for (const mesh of occluderOwnMeshes)
988
989
  clearShadowOnly(mesh);
989
990
  }, [occluderOwnMeshes]);
990
- return (_jsxs("group", { ref: rootRef, children: [walkingOnFoot && shuttersInView ? _jsx(GlbShuttersPrompt, {}) : null, _jsx("primitive", { object: gltf.scene, onClick: handleClick, onPointerMissed: handlePointerMissed, onPointerMove: handlePointerMove, onPointerOut: handlePointerOut }), _jsx(GlbSelectionCallout, { identity: identity, isOpen: isOpen, items: interactiveItems, loopMechanisms: loopMechanisms, sceneNodes: sceneNodes, toggleOpen: toggleOpenable }), interactiveItems?.length ? (_jsx(GlbInteractive, { actions: actions, identity: identity, items: interactiveItems })) : null, referenceNodes?.length ? (_jsx(GlbReferenceNodes, { identity: identity, nodes: referenceNodes })) : null, replaceNodes?.length ? (_jsx(GlbReplaceInstances, { identity: identity, nodes: replaceNodes })) : null, _jsx(GlbDaylightGround, { root: gltf.scene })] }));
991
+ return (_jsxs("group", { ref: rootRef, children: [walkingOnFoot && shuttersInView ? _jsx(GlbShuttersPrompt, {}) : null, _jsx("primitive", { object: gltf.scene, onClick: handleClick, onPointerMissed: handlePointerMissed, onPointerMove: handlePointerMove, onPointerOut: handlePointerOut }), _jsx(GlbSelectionCallout, { identity: identity, isOpen: isOpen, items: interactiveItems, loopMechanisms: loopMechanisms, sceneNodes: sceneNodes, toggleOpen: toggleOpenable }), interactiveItems?.length ? (_jsx(GlbInteractive, { actions: actions, identity: identity, items: interactiveItems })) : null, referenceNodes?.length ? (_jsx(GlbReferenceNodes, { identity: identity, nodes: referenceNodes })) : null, replaceNodes?.length ? (_jsx(GlbReplaceInstances, { identity: identity, nodes: replaceNodes, resolve: resolveNode })) : null, _jsx(GlbDaylightGround, { root: gltf.scene })] }));
991
992
  }
992
993
  function playShutterSound(node) {
993
994
  const id = node.userData.pascalId;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,SAAS,EAGd,KAAK,gBAAgB,EAKtB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAkB,KAAK,YAAY,EAAsB,MAAM,oBAAoB,CAAA;AAC1F,OAAO,EACL,KAAK,aAAa,EAOnB,MAAM,OAAO,CAAA;AACd,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAMrC,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,EAAuB,KAAK,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAI5F,OAAkB,EAAE,KAAK,aAAa,EAAsB,MAAM,wBAAwB,CAAA;AAe1F,OAAuB,EAAwB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAa1F,OAAO,QAAQ,oBAAoB,CAAC;IAOlC,UAAU,aAAa;QACrB,qBAAqB,EAAE,YAAY,CAAC,OAAO,KAAK,CAAC,qBAAqB,CAAC,CAAA;KACxE;CACF;AAsPD;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAS/C;AAsED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,aAAa,CAAC;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE,CAAC,CAAA;IACrD,KAAK,EAAE,aAAa,CAAC;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE,CAAC,CAAA;IACnD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CACnC;AASD,UAAU,WAAW;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,gBAAgB,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAA;IACvC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,aAAa,CAAC,EAAE;QACd,OAAO,CAAC,EAAE,aAAa,CAAA;QACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,WAAW,CAAC,EAAE,WAAW,CAAA;KAC1B,CAAA;IACD,6FAA6F;IAC7F,YAAY,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;IACtC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,CAAA;IAC5B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IACtC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAC7C;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACxC;;;;OAIG;IACH,YAAY,CAAC,EAAE,uBAAuB,CAAA;IACtC;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,sEAAsE;IACtE,SAAS,CAAC,EAAE,sBAAsB,CAAA;CACnC;AAED,yDAAyD;AACzD,MAAM,MAAM,YAAY,GAAG;IACzB;;;;;OAKG;IACH,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,IAAI,GAAG,IAAI,CAAA;CAC3C,CAAA;AAED,QAAA,MAAM,MAAM,sGA6SV,CAAA;eA+Ea,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,SAAS,EAId,KAAK,gBAAgB,EAKtB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAkB,KAAK,YAAY,EAAsB,MAAM,oBAAoB,CAAA;AAC1F,OAAO,EACL,KAAK,aAAa,EAOnB,MAAM,OAAO,CAAA;AACd,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAMrC,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,EAAuB,KAAK,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAK5F,OAAkB,EAAE,KAAK,aAAa,EAAsB,MAAM,wBAAwB,CAAA;AAe1F,OAAuB,EAAwB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAa1F,OAAO,QAAQ,oBAAoB,CAAC;IAOlC,UAAU,aAAa;QACrB,qBAAqB,EAAE,YAAY,CAAC,OAAO,KAAK,CAAC,qBAAqB,CAAC,CAAA;KACxE;CACF;AAsPD;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAS/C;AAsED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,aAAa,CAAC;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE,CAAC,CAAA;IACrD,KAAK,EAAE,aAAa,CAAC;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE,CAAC,CAAA;IACnD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CACnC;AASD,UAAU,WAAW;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,gBAAgB,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAA;IACvC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,aAAa,CAAC,EAAE;QACd,OAAO,CAAC,EAAE,aAAa,CAAA;QACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,WAAW,CAAC,EAAE,WAAW,CAAA;KAC1B,CAAA;IACD,6FAA6F;IAC7F,YAAY,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;IACtC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,CAAA;IAC5B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IACtC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAC7C;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACxC;;;;OAIG;IACH,YAAY,CAAC,EAAE,uBAAuB,CAAA;IACtC;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,sEAAsE;IACtE,SAAS,CAAC,EAAE,sBAAsB,CAAA;CACnC;AAED,yDAAyD;AACzD,MAAM,MAAM,YAAY,GAAG;IACzB;;;;;OAKG;IACH,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,IAAI,GAAG,IAAI,CAAA;CAC3C,CAAA;AAED,QAAA,MAAM,MAAM,sGA+SV,CAAA;eA+Ea,MAAM"}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { nodeRegistry, RoofElevationSystem, StairOpeningSystem, sceneRegistry, useInteractive, useScene, } from '@pascal-app/core';
3
+ import { isDevelopmentBuild, nodeRegistry, RoofElevationSystem, StairOpeningSystem, sceneRegistry, useInteractive, useScene, } from '@pascal-app/core';
4
4
  import { Canvas, extend, useFrame, useThree } from '@react-three/fiber';
5
5
  import { forwardRef, useEffect, useImperativeHandle, useLayoutEffect, useRef, useState, } from 'react';
6
6
  import * as THREE from 'three/webgpu';
@@ -13,6 +13,7 @@ import { choosePointerEvents } from '../../lib/pointer-events';
13
13
  import { initializeGpuRenderer } from '../../lib/renderer-capability';
14
14
  import { getSceneTheme } from '../../lib/scene-themes';
15
15
  import { installTextureNodeNullGuard } from '../../lib/texture-node-guard';
16
+ import { viewerPreferenceStorage } from '../../lib/viewer-preference-storage';
16
17
  import useViewer, {} from '../../store/use-viewer';
17
18
  import { FloorElevationSystem } from '../../systems/floor-elevation/floor-elevation-system';
18
19
  import { GeometrySystem } from '../../systems/geometry/geometry-system';
@@ -68,7 +69,7 @@ const DIRTY_BUILD_KINDS = new Set([
68
69
  'wall',
69
70
  'window',
70
71
  ]);
71
- const warnedEmptyDraw = process.env.NODE_ENV === 'production' ? null : new WeakSet();
72
+ const warnedEmptyDraw = isDevelopmentBuild() ? new WeakSet() : null;
72
73
  /**
73
74
  * Renderer-level safety net against the empty-vertex-buffer crash.
74
75
  *
@@ -375,7 +376,7 @@ const Viewer = forwardRef(function Viewer({ children, hoverStyles = DEFAULT_HOVE
375
376
  if (!hasDefaultRender || typeof window === 'undefined')
376
377
  return;
377
378
  let persistedState = {};
378
- const rawPreferences = window.localStorage.getItem('viewer-preferences');
379
+ const rawPreferences = viewerPreferenceStorage.getItem('viewer-preferences');
379
380
  if (rawPreferences) {
380
381
  try {
381
382
  const parsed = JSON.parse(rawPreferences);
@@ -421,7 +422,10 @@ const Viewer = forwardRef(function Viewer({ children, hoverStyles = DEFAULT_HOVE
421
422
  if (showGpuFallback) {
422
423
  return _jsx(UnsupportedGpuViewerFallback, {});
423
424
  }
424
- return (_jsxs(_Fragment, { children: [(perf || PERF_OVERLAY_ENABLED) && _jsx(PerfPanel, {}), _jsx(Canvas, { ref: subscribeWallBuildInteractions, camera: { position: [50, 50, 50], fov: 50 }, className: `transition-colors duration-700 ${transparentBackground ? 'bg-transparent' : isDark ? 'bg-[#1f2433]' : 'bg-[#fafafa]'}`, dpr: [1, maxDpr], events: pointerEvents, frameloop: "never", gl: ((props) => {
425
+ return (_jsxs(_Fragment, { children: [(perf || PERF_OVERLAY_ENABLED) && _jsx(PerfPanel, {}), _jsx(Canvas, { ref: subscribeWallBuildInteractions, camera: { position: [50, 50, 50], fov: 50 }, style: {
426
+ backgroundColor: transparentBackground ? 'transparent' : isDark ? '#1f2433' : '#fafafa',
427
+ transition: 'background-color 700ms cubic-bezier(0.4, 0, 0.2, 1), color 700ms cubic-bezier(0.4, 0, 0.2, 1)',
428
+ }, dpr: [1, maxDpr], events: pointerEvents, frameloop: "never", gl: ((props) => {
425
429
  const canvas = props.canvas;
426
430
  const cached = canvas ? WEBGPU_RENDERER_CACHE.get(canvas) : undefined;
427
431
  if (cached)
@@ -1 +1 @@
1
- {"version":3,"file":"registered-systems.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/registered-systems.tsx"],"names":[],"mappings":"AAoDA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,uCAkChC"}
1
+ {"version":3,"file":"registered-systems.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/registered-systems.tsx"],"names":[],"mappings":"AAqDA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,uCAkChC"}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
3
- import { createSceneApi, isNodeKindEnabled, nodeRegistry, useRegistryVersion, useScene, } from '@pascal-app/core';
3
+ import { createSceneApi, isDevelopmentBuild, isNodeKindEnabled, nodeRegistry, useRegistryVersion, useScene, } from '@pascal-app/core';
4
4
  import { Component, lazy, Suspense, useMemo } from 'react';
5
5
  const DEFAULT_PRIORITY = 5;
6
6
  const lazyCache = new WeakMap();
@@ -20,7 +20,7 @@ class SystemErrorBoundary extends Component {
20
20
  return { failed: true };
21
21
  }
22
22
  componentDidCatch(error) {
23
- if (process.env.NODE_ENV !== 'production') {
23
+ if (isDevelopmentBuild()) {
24
24
  console.error(`[viewer] Disabled system ${this.props.systemId}`, error);
25
25
  }
26
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"unsupported-gpu-fallback.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/unsupported-gpu-fallback.tsx"],"names":[],"mappings":"AAAA,wBAAgB,4BAA4B,gCAY3C"}
1
+ {"version":3,"file":"unsupported-gpu-fallback.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/unsupported-gpu-fallback.tsx"],"names":[],"mappings":"AAAA,wBAAgB,4BAA4B,gCAsC3C"}
@@ -1,4 +1,24 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  export function UnsupportedGpuViewerFallback() {
3
- return (_jsx("div", { className: "flex h-full min-h-64 w-full items-center justify-center bg-[#fafafa] p-6 text-center text-neutral-900", children: _jsxs("div", { className: "max-w-md rounded-2xl border border-neutral-200 bg-white p-6 shadow-sm", children: [_jsx("h2", { className: "font-semibold text-lg", children: "3D viewer unavailable" }), _jsx("p", { className: "mt-2 text-neutral-600 text-sm", children: "This browser or environment could not initialize WebGPU or WebGL, so Pascal cannot render the 3D scene here. Try opening the editor in a browser with hardware acceleration enabled." })] }) }));
3
+ return (_jsx("div", { style: {
4
+ display: 'flex',
5
+ height: '100%',
6
+ minHeight: 256,
7
+ width: '100%',
8
+ alignItems: 'center',
9
+ justifyContent: 'center',
10
+ background: '#fafafa',
11
+ padding: 24,
12
+ textAlign: 'center',
13
+ color: '#171717',
14
+ boxSizing: 'border-box',
15
+ }, children: _jsxs("div", { style: {
16
+ maxWidth: 448,
17
+ boxSizing: 'border-box',
18
+ borderRadius: 16,
19
+ border: '1px solid #e5e5e5',
20
+ background: 'white',
21
+ padding: 24,
22
+ boxShadow: '0 1px 2px 0 rgb(0 0 0 / 0.05)',
23
+ }, children: [_jsx("h2", { style: { margin: 0, fontWeight: 600, fontSize: 18, lineHeight: '28px' }, children: "3D viewer unavailable" }), _jsx("p", { style: { margin: '8px 0 0', color: '#525252', fontSize: 14, lineHeight: '20px' }, children: "This browser or environment could not initialize WebGPU or WebGL, so Pascal cannot render the 3D scene here. Try opening the editor in a browser with hardware acceleration enabled." })] }) }));
4
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-daylight-rooms.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/use-daylight-rooms.ts"],"names":[],"mappings":"AAoCA;;;;GAIG;AACH,wBAAgB,gBAAgB,SAuF/B;AAuCD,mHAAmH;AACnH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAAC,EAC5D,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAAC,GAC/D,OAAO,CAcT"}
1
+ {"version":3,"file":"use-daylight-rooms.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/use-daylight-rooms.ts"],"names":[],"mappings":"AAyCA;;;;GAIG;AACH,wBAAgB,gBAAgB,SAiI/B;AAuCD,mHAAmH;AACnH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAAC,EAC5D,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAAC,GAC/D,OAAO,CAcT"}
@@ -3,12 +3,16 @@ import { sceneRegistry, useInteractive, useScene } from '@pascal-app/core';
3
3
  import { useFrame, useThree } from '@react-three/fiber';
4
4
  import { useEffect, useRef } from 'react';
5
5
  import { Box3, Vector3 } from 'three';
6
- import { bakedRoomScene, feedLamps, lampFeeds, liveDoorOpenness, liveLevelObjects, liveRoomScene, syncLampEmitters, } from '../../lib/daylight/room-scene';
6
+ import { DEFAULT_TEXTURE_LIMIT } from '../../lib/daylight/room-map';
7
+ import { bakedLevelObjects, bakedRoomScene, feedLamps, lampFeeds, liveDoorOpenness, liveLevelObjects, liveRoomScene, syncLampEmitters, } from '../../lib/daylight/room-scene';
7
8
  import { daylightRooms } from '../../lib/daylight/rooms';
9
+ import { heldReasons } from '../../lib/scene-visibility';
8
10
  import useViewer from '../../store/use-viewer';
9
11
  /** Seconds between scene-change checks, and the quiet time before a rebuild. */
10
12
  const CHECK_INTERVAL = 0.5;
11
13
  const REBUILD_DELAY = 0.4;
14
+ /** Longest wait for the scene to settle before building anyway (seconds). */
15
+ const SETTLE_WAIT = 10;
12
16
  /**
13
17
  * Furniture: what the rooms are built from (walls, slabs, ceilings, roofs, doors, windows,
14
18
  * zones) never includes it, so moving or placing it doesn't rebuild them (a rebuild casts
@@ -30,11 +34,21 @@ const LAMP_POSITION_STEP = 0.05;
30
34
  */
31
35
  export function useDaylightRooms() {
32
36
  const scene = useThree((s) => s.scene);
37
+ const gl = useThree((s) => s.gl);
33
38
  const nodesVersion = useRef(0);
34
39
  const state = useRef({
35
40
  signature: '',
36
41
  pendingSince: -1,
37
42
  sinceCheck: CHECK_INTERVAL,
43
+ /** Times the scene finished rebuilding geometry (no dirty nodes left), and whether it is now. */
44
+ settles: 0,
45
+ dirty: false,
46
+ dirtyRooms: false,
47
+ /** Dirty nodes left when rooms were last built mid-load (they rebuild as the count falls). */
48
+ builtDirty: Number.POSITIVE_INFINITY,
49
+ /** Level offsets last frame: rays are cast at stacked heights, so no build while levels move. */
50
+ offsets: [],
51
+ levelsMoved: false,
38
52
  live: true,
39
53
  bakedRoot: null,
40
54
  levelObjects: [],
@@ -47,6 +61,23 @@ export function useDaylightRooms() {
47
61
  const s = state.current;
48
62
  const lampDefault = useInteractive.getState().lampDefault;
49
63
  s.sinceCheck += delta;
64
+ // Rooms are built from finished walls, windows and covers: wait for the scene to settle, and
65
+ // build again each time it does (walls and openings finish without a geometry revision).
66
+ const { dirtyNodes, nodes } = useScene.getState();
67
+ const dirty = dirtyNodes.size > 0;
68
+ if (dirty && !s.dirtyRooms)
69
+ for (const id of dirtyNodes) {
70
+ const type = nodes[id]?.type;
71
+ if (type && !FURNITURE_TYPES.has(type)) {
72
+ s.dirtyRooms = true;
73
+ break;
74
+ }
75
+ }
76
+ if (s.dirty && !dirty && s.dirtyRooms) {
77
+ s.settles++;
78
+ s.dirtyRooms = false;
79
+ }
80
+ s.dirty = dirty;
50
81
  if (s.sinceCheck >= CHECK_INTERVAL) {
51
82
  s.sinceCheck = 0;
52
83
  // Items can swap their materials (edits, loads): keep the lamps' own emitters installed.
@@ -55,7 +86,7 @@ export function useDaylightRooms() {
55
86
  const baked = live ? null : findBakedRoot(scene);
56
87
  const feedKeys = feedSignature();
57
88
  const signature = live
58
- ? `live|${roomObjectsSignature()}|${nodesVersion.current}|${useViewer.getState().geometryRevision}|${feedKeys}`
89
+ ? `live|${roomObjectsSignature()}|${nodesVersion.current}|${useViewer.getState().geometryRevision}|${s.settles}|${feedKeys}`
59
90
  : `baked|${baked?.uuid ?? ''}|${baked?.children.length ?? 0}|${feedKeys}`;
60
91
  if (signature !== s.signature) {
61
92
  s.signature = signature;
@@ -66,16 +97,20 @@ export function useDaylightRooms() {
66
97
  }
67
98
  if (s.pendingSince >= 0) {
68
99
  s.pendingSince += delta;
69
- if (s.pendingSince >= REBUILD_DELAY) {
100
+ const exploded = useViewer.getState().levelMode === 'exploded' || s.levelsMoved;
101
+ if (s.pendingSince >= REBUILD_DELAY &&
102
+ !exploded &&
103
+ (!(s.live && dirty) || s.pendingSince > SETTLE_WAIT)) {
70
104
  s.pendingSince = -1;
71
105
  const input = s.live
72
106
  ? liveRoomScene(lampDefault)
73
107
  : s.bakedRoot
74
108
  ? bakedRoomScene(s.bakedRoot, lampDefault)
75
109
  : null;
110
+ daylightRooms.map.textureLimit = textureLimit(gl);
76
111
  daylightRooms.build(input ?? {
77
112
  bounds: emptyBounds,
78
- levelY: [0],
113
+ levels: [],
79
114
  zones: [],
80
115
  covers: [],
81
116
  walls: [],
@@ -83,18 +118,29 @@ export function useDaylightRooms() {
83
118
  lamps: feedLamps(),
84
119
  virtualLampsOn: lampDefault,
85
120
  });
86
- s.levelObjects = s.live ? liveLevelObjects() : bakedLevels(s.bakedRoot);
121
+ s.levelObjects = s.live ? liveLevelObjects() : bakedLevelObjects(s.bakedRoot);
122
+ // Built before the scene settled (a large scene still building walls and windows): build
123
+ // again after the next wait while geometry keeps arriving, so the rooms catch up.
124
+ if (s.live && dirty && dirtyNodes.size < s.builtDirty) {
125
+ s.builtDirty = dirtyNodes.size;
126
+ s.pendingSince = 0;
127
+ }
128
+ else if (!dirty)
129
+ s.builtDirty = Number.POSITIVE_INFINITY;
87
130
  flagGlassMaterials(scene);
88
131
  syncLampEmitters();
89
132
  }
90
133
  }
91
- // Live level heights (stacked / exploded motion) and the camera, in assembled space.
92
- const offsets = s.levelObjects.map((object, index) => object.getWorldPosition(scratch).y - (daylightRooms.levelY[index] ?? 0));
93
- daylightRooms.setLevelOffsets(offsets);
94
- const focused = focusedLevelIndex(s.levelObjects);
95
- daylightRooms.levelShown = s.levelObjects.map((object, index) => (focused < 0 || index <= focused) && shownInScene(object));
96
- daylightRooms.cameraY.value = camera.position.y - (offsets[0] ?? 0);
97
- daylightRooms.focusedLevel.value = focused;
134
+ // Live level heights (stacked / exploded motion), what is shown, and the camera.
135
+ const levels = daylightRooms.levels;
136
+ const offsets = s.levelObjects.map((object, index) => object ? object.getWorldPosition(scratch).y - (levels[index]?.y ?? 0) : 0);
137
+ s.levelsMoved = offsets.some((offset, index) => Math.abs(offset - (s.offsets[index] ?? offset)) > 1e-4);
138
+ s.offsets = offsets;
139
+ const shown = s.levelObjects.map((object) => !!object && presented(object));
140
+ const focus = selectedFocusLevel();
141
+ const selected = s.levelObjects.map((object) => !!object && object === focus);
142
+ daylightRooms.setLevelPresentation(offsets, shown, selected);
143
+ daylightRooms.cameraY.value = camera.position.y;
98
144
  // Lamp switches (fed lamps by key; virtual lamps follow the time-of-day default) and doors.
99
145
  const lit = litFeedKeys();
100
146
  if (daylightRooms.setLampStates((lamp) => (lamp.itemId ? lit.has(lamp.itemId) : lampDefault)))
@@ -204,33 +250,29 @@ function findBakedRoot(scene) {
204
250
  });
205
251
  return found;
206
252
  }
207
- /** Visible itself and through every ancestor (hidden levels are switched off on their group). */
208
- function shownInScene(object) {
253
+ /**
254
+ * On screen: visible through every ancestor (hidden levels are switched off on their group) and
255
+ * not drawn for shadows only (levels hidden above the selection keep shadowing it).
256
+ */
257
+ function presented(object) {
209
258
  for (let x = object; x; x = x.parent)
210
259
  if (!x.visible)
211
260
  return false;
212
- return true;
261
+ return !heldReasons(object)?.has('shadow-only');
213
262
  }
214
- function bakedLevels(root) {
215
- if (!root)
216
- return [];
217
- const levels = [];
218
- root.traverse((object) => {
219
- if (object.userData.kind === 'level')
220
- levels.push(object);
221
- });
222
- return levels.sort((a, b) => a.position.y - b.position.y);
223
- }
224
- /**
225
- * The level whose rooms open to the sky because the levels above it are hidden (solo level, or
226
- * levels above the selection hidden) — the enhanced viewer's "focus level". −1 otherwise.
227
- */
228
- function focusedLevelIndex(levelObjects) {
263
+ /** The selected level when the levels over it are hidden (solo, or hide-above), else null. */
264
+ function selectedFocusLevel() {
229
265
  const viewer = useViewer.getState();
230
266
  const hidesAbove = viewer.levelMode === 'solo' || viewer.hideLevelsAboveSelection;
231
267
  const levelId = viewer.selection.levelId;
232
268
  if (!hidesAbove || !levelId)
233
- return -1;
234
- const object = sceneRegistry.nodes.get(levelId);
235
- return object ? levelObjects.indexOf(object) : -1;
269
+ return null;
270
+ return sceneRegistry.nodes.get(levelId) ?? null;
271
+ }
272
+ /** The device's largest 2D texture side (WebGPU device limits, or the WebGL context's). */
273
+ function textureLimit(gl) {
274
+ const backend = gl.backend;
275
+ const limit = backend?.device?.limits?.maxTextureDimension2D ??
276
+ backend?.gl?.getParameter(backend.gl.MAX_TEXTURE_SIZE);
277
+ return limit && limit > 0 ? limit : DEFAULT_TEXTURE_LIMIT;
236
278
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-gltf-ktx2.d.ts","sourceRoot":"","sources":["../../src/hooks/use-gltf-ktx2.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAM3C,QAAA,MAAM,WAAW,SAAU,MAAM,KAAG,UAAU,CAAC,OAAO,OAAO,CAQ5D,CAAA;AAED,OAAO,EAAE,WAAW,EAAE,CAAA"}
1
+ {"version":3,"file":"use-gltf-ktx2.d.ts","sourceRoot":"","sources":["../../src/hooks/use-gltf-ktx2.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAO3C,QAAA,MAAM,WAAW,SAAU,MAAM,KAAG,UAAU,CAAC,OAAO,OAAO,CAQ5D,CAAA;AAED,OAAO,EAAE,WAAW,EAAE,CAAA"}
@@ -3,9 +3,10 @@ import { useThree } from '@react-three/fiber';
3
3
  import { MeshoptDecoder } from 'three/examples/jsm/libs/meshopt_decoder.module.js';
4
4
  import { preserveGltfUnlit } from '../lib/gltf-unlit';
5
5
  import { configureKtx2Support } from '../lib/ktx2-loader';
6
+ import { getViewerConfig } from '../lib/viewer-config';
6
7
  const useGLTFKTX2 = (path) => {
7
8
  const gl = useThree((state) => state.gl);
8
- return useGLTF(path, true, true, (loader) => {
9
+ return useGLTF(path, getViewerConfig().decoders.dracoPath, true, (loader) => {
9
10
  loader.register(preserveGltfUnlit);
10
11
  configureKtx2Support(loader, gl);
11
12
  loader.setMeshoptDecoder(MeshoptDecoder);
package/dist/index.d.ts CHANGED
@@ -21,7 +21,7 @@ export { useAssetUrl } from './hooks/use-asset-url';
21
21
  export { useGLTFKTX2 } from './hooks/use-gltf-ktx2';
22
22
  export { useLibraryMaterialsVersion } from './hooks/use-library-materials-version';
23
23
  export { useNodeEvents } from './hooks/use-node-events';
24
- export { ASSETS_CDN_URL, resolveAssetUrl, resolveCdnUrl } from './lib/asset-url';
24
+ export { resolveAssetUrl, resolveCdnUrl } from './lib/asset-url';
25
25
  export { backdropColors, backdropGradient, deepSkyColor, horizonHazeColor } from './lib/backdrop';
26
26
  export { applyWorldScaleBoxUVs } from './lib/box-uv';
27
27
  export { ADDITION, Brush, computeGeometryBoundsTree, csgEvaluator, csgGeometry, csgMaterials, Evaluator, ensureRenderableGeometryAttributes, INTERSECTION, prepareBrushForCSG, SUBTRACTION, } from './lib/csg-utils';
@@ -47,6 +47,8 @@ export { LayerPassIndex } from './lib/layer-pass';
47
47
  export { BATCHED_LAYER, GRID_LAYER, OVERLAY_LAYER, SCENE_LAYER, SHADOW_ONLY_LAYER, setSurfaceRaycastLayers, ZONE_LAYER, } from './lib/layers';
48
48
  export { holdLiveFrame } from './lib/live-frame-hold';
49
49
  export { applyMaterialPresetToMaterials, BLUEPRINT_PALETTE, baseMaterial, CLAY_PALETTE, type ColorPreset, clearMaterialCache, createDefaultMaterial, createMaterial, createMaterialFromPreset, createMaterialFromPresetRef, createSurfaceRoleMaterial, DEFAULT_CEILING_MATERIAL, DEFAULT_DOOR_MATERIAL, DEFAULT_ROOF_MATERIAL, DEFAULT_SHELF_MATERIAL, DEFAULT_SLAB_MATERIAL, DEFAULT_STAIR_MATERIAL, DEFAULT_WALL_MATERIAL, DEFAULT_WINDOW_MATERIAL, disposeMaterial, getMaterialTextureVersion, glassMaterial, MONO_PALETTE, materialCastsShadow, materialTextureLoadState, PRESET_PALETTES, type RenderShading, registerMaterialCacheCleanup, resolveMaterialRef, resolveSlotDefaultMaterial, resolveSurfaceColor, setSlotDefaultOverrides, WHITE_PALETTE, } from './lib/materials';
50
+ export * from './lib/measurement-label';
51
+ export * from './lib/measurement-presentation';
50
52
  export { mergedOutline } from './lib/merged-outline-node';
51
53
  export { createNodeTopSurfaceHeightSampler } from './lib/node-top-surface-height';
52
54
  export * from './lib/perf-actions';
@@ -68,6 +70,7 @@ export { buildTerrainPerimeterFillGeometry, type TerrainPerimeterPoint, } from '
68
70
  export { getPascalTextureRef, type PascalTextureColorSpace, type PascalTextureMap, type PascalTextureRef, stampPascalTextureRef, textureMapForSlot, } from './lib/texture-reference';
69
71
  export { packNormalToRGB, unpackRGBToNormal } from './lib/tsl-compat';
70
72
  export { AMBIANCE_SECONDS, ambianceNow, ambianceTarget, easeAmbiance, eyeUnderTheGround, FADE_SECONDS, groundHoleOpenNode, groundHoleOpenNow, stepAmbianceProgress, temporarilyWithoutAmbiance, UNDERGROUND_RIM, undergroundAmbianceNode, } from './lib/underground-ambiance';
73
+ export { ASSETS_CDN_URL, configureViewer, getViewerConfig, type ViewerConfig, } from './lib/viewer-config';
71
74
  export { createZoneShape, createZoneWallGeometry } from './lib/zone-geometry';
72
75
  export type { LightSource } from './store/use-item-light-pool';
73
76
  export { catalogLightSource, useItemLightPool } from './store/use-item-light-pool';
@@ -79,6 +82,7 @@ export { DoorAnimationSystem } from './systems/door/door-animation-system';
79
82
  export { buildDoorPreviewMesh, DoorSystem, poseDoorMovingParts } from './systems/door/door-system';
80
83
  export { ElevatorInteractionSystem } from './systems/elevator/elevator-interaction-system';
81
84
  export { FloorElevationSystem } from './systems/floor-elevation/floor-elevation-system';
85
+ export { type GeometryFailure, setGeometryFailure, useGeometryStatus, } from './systems/geometry/geometry-status';
82
86
  export { GuideSystem } from './systems/guide/guide-system';
83
87
  export { InteractiveSystem } from './systems/interactive/interactive-system';
84
88
  export { openingSettled, proceduralSettled } from './systems/interactive/opening-settled';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}