@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.
- package/README.md +54 -21
- package/dist/components/viewer/glb-replace-instances.d.ts +6 -3
- package/dist/components/viewer/glb-replace-instances.d.ts.map +1 -1
- package/dist/components/viewer/glb-replace-instances.js +5 -4
- package/dist/components/viewer/glb-scene.d.ts +3 -1
- package/dist/components/viewer/glb-scene.d.ts.map +1 -1
- package/dist/components/viewer/glb-scene.js +2 -1
- package/dist/components/viewer/index.d.ts.map +1 -1
- package/dist/components/viewer/index.js +8 -4
- package/dist/components/viewer/registered-systems.d.ts.map +1 -1
- package/dist/components/viewer/registered-systems.js +2 -2
- package/dist/components/viewer/unsupported-gpu-fallback.d.ts.map +1 -1
- package/dist/components/viewer/unsupported-gpu-fallback.js +21 -1
- package/dist/components/viewer/use-daylight-rooms.d.ts.map +1 -1
- package/dist/components/viewer/use-daylight-rooms.js +75 -33
- package/dist/hooks/use-gltf-ktx2.d.ts.map +1 -1
- package/dist/hooks/use-gltf-ktx2.js +2 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/lib/asset-url.d.ts +0 -1
- package/dist/lib/asset-url.d.ts.map +1 -1
- package/dist/lib/asset-url.js +3 -3
- package/dist/lib/daylight/room-context.d.ts.map +1 -1
- package/dist/lib/daylight/room-context.js +3 -2
- package/dist/lib/daylight/room-map.d.ts +124 -0
- package/dist/lib/daylight/room-map.d.ts.map +1 -0
- package/dist/lib/daylight/room-map.js +630 -0
- package/dist/lib/daylight/room-scene.d.ts +4 -2
- package/dist/lib/daylight/room-scene.d.ts.map +1 -1
- package/dist/lib/daylight/room-scene.js +72 -37
- package/dist/lib/daylight/rooms.d.ts +60 -30
- package/dist/lib/daylight/rooms.d.ts.map +1 -1
- package/dist/lib/daylight/rooms.js +331 -286
- package/dist/lib/ktx2-loader.d.ts.map +1 -1
- package/dist/lib/ktx2-loader.js +2 -1
- package/dist/lib/measurement-label.d.ts +4 -0
- package/dist/lib/measurement-label.d.ts.map +1 -0
- package/dist/lib/measurement-label.js +54 -0
- package/dist/lib/measurement-presentation.d.ts +5 -0
- package/dist/lib/measurement-presentation.d.ts.map +1 -0
- package/dist/lib/measurement-presentation.js +8 -0
- package/dist/lib/pointer-events.d.ts.map +1 -1
- package/dist/lib/pointer-events.js +3 -3
- package/dist/lib/texture-reference.d.ts.map +1 -1
- package/dist/lib/texture-reference.js +4 -3
- package/dist/lib/viewer-config.d.ts +21 -0
- package/dist/lib/viewer-config.d.ts.map +1 -0
- package/dist/lib/viewer-config.js +21 -0
- package/dist/lib/viewer-preference-storage.d.ts +7 -0
- package/dist/lib/viewer-preference-storage.d.ts.map +1 -0
- package/dist/lib/viewer-preference-storage.js +23 -0
- package/dist/store/use-viewer.d.ts +2 -56
- package/dist/store/use-viewer.d.ts.map +1 -1
- package/dist/store/use-viewer.js +3 -1
- package/dist/systems/elevator/elevator-interaction-system.d.ts +16 -2
- package/dist/systems/elevator/elevator-interaction-system.d.ts.map +1 -1
- package/dist/systems/elevator/elevator-interaction-system.js +41 -8
- package/dist/systems/geometry/geometry-status.d.ts +8 -0
- package/dist/systems/geometry/geometry-status.d.ts.map +1 -0
- package/dist/systems/geometry/geometry-status.js +24 -0
- package/dist/systems/roof/roof-system.d.ts.map +1 -1
- package/dist/systems/roof/roof-system.js +107 -65
- package/dist/systems/wall/wall-system.d.ts +11 -0
- package/dist/systems/wall/wall-system.d.ts.map +1 -1
- package/dist/systems/wall/wall-system.js +56 -10
- 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/
|
|
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
|
|
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
|
-
|
|
29
|
-
|
|
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
|
-
|
|
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
|
|
54
|
-
|
|
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
|
|
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
|
|
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,
|
|
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
|
-
/**
|
|
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,
|
|
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,
|
|
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 =
|
|
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 =
|
|
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 },
|
|
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":"
|
|
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 (
|
|
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,
|
|
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", {
|
|
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":"
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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() :
|
|
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)
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
/**
|
|
208
|
-
|
|
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
|
|
261
|
+
return !heldReasons(object)?.has('shadow-only');
|
|
213
262
|
}
|
|
214
|
-
|
|
215
|
-
|
|
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
|
|
234
|
-
|
|
235
|
-
|
|
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;
|
|
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,
|
|
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 {
|
|
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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAO3D,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AAGnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAA;AACxF,OAAO,EACL,OAAO,IAAI,MAAM,EACjB,sBAAsB,EACtB,KAAK,YAAY,EACjB,KAAK,sBAAsB,GAC5B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,KAAK,YAAY,EACjB,OAAO,IAAI,SAAS,EACpB,KAAK,aAAa,GACnB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EACL,eAAe,EACf,KAAK,oBAAoB,GAC1B,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EACL,wBAAwB,EACxB,cAAc,EACd,KAAK,kBAAkB,GACxB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EACL,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,yCAAyC,CAAA;AAChD,OAAO,EACL,KAAK,YAAY,EACjB,QAAQ,EACR,KAAK,cAAc,EACnB,cAAc,GACf,MAAM,+BAA+B,CAAA;AACtC,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,wBAAwB,EACxB,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,eAAe,GAChB,MAAM,gDAAgD,CAAA;AACvD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAClF,OAAO,EACL,oBAAoB,EACpB,WAAW,GACZ,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,EAC1B,kBAAkB,GACnB,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAA;AACxE,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,8CAA8C,CAAA;AACrD,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,gBAAgB,GACjB,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAA;AAClF,OAAO,EACL,mCAAmC,EACnC,qCAAqC,EACrC,0BAA0B,EAC1B,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACnC,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACnC,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,0CAA0C,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAA;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|