@pascal-app/viewer 1.0.0-beta.4 → 1.0.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/LICENSE +21 -0
- package/README.md +107 -0
- package/dist/capture/asset-url.d.ts +2 -0
- package/dist/capture/asset-url.d.ts.map +1 -0
- package/dist/capture/asset-url.js +13 -0
- package/dist/capture/capture-runtime.d.ts +43 -0
- package/dist/capture/capture-runtime.d.ts.map +1 -0
- package/dist/capture/capture-runtime.js +228 -0
- package/dist/capture/frame.d.ts +4 -0
- package/dist/capture/frame.d.ts.map +1 -0
- package/dist/capture/frame.js +21 -0
- package/dist/capture/index.d.ts +12 -0
- package/dist/capture/index.d.ts.map +1 -0
- package/dist/capture/index.js +11 -0
- package/dist/capture/layer-visibility.d.ts +5 -0
- package/dist/capture/layer-visibility.d.ts.map +1 -0
- package/dist/capture/layer-visibility.js +11 -0
- package/dist/capture/layers/clay-matcap.d.ts +3 -0
- package/dist/capture/layers/clay-matcap.d.ts.map +1 -0
- package/dist/capture/layers/clay-matcap.js +26 -0
- package/dist/capture/layers/device-motion-layer.d.ts +7 -0
- package/dist/capture/layers/device-motion-layer.d.ts.map +1 -0
- package/dist/capture/layers/device-motion-layer.js +78 -0
- package/dist/capture/layers/point-cloud-layer.d.ts +15 -0
- package/dist/capture/layers/point-cloud-layer.d.ts.map +1 -0
- package/dist/capture/layers/point-cloud-layer.js +106 -0
- package/dist/capture/layers/room-model-layer.d.ts +9 -0
- package/dist/capture/layers/room-model-layer.d.ts.map +1 -0
- package/dist/capture/layers/room-model-layer.js +71 -0
- package/dist/capture/layers/surface-mesh-data.d.ts +9 -0
- package/dist/capture/layers/surface-mesh-data.d.ts.map +1 -0
- package/dist/capture/layers/surface-mesh-data.js +74 -0
- package/dist/capture/layers/surface-mesh-layer.d.ts +7 -0
- package/dist/capture/layers/surface-mesh-layer.d.ts.map +1 -0
- package/dist/capture/layers/surface-mesh-layer.js +16 -0
- package/dist/capture/preview.d.ts +3 -0
- package/dist/capture/preview.d.ts.map +1 -0
- package/dist/capture/preview.js +2 -0
- package/dist/capture/source-state.d.ts +22 -0
- package/dist/capture/source-state.d.ts.map +1 -0
- package/dist/capture/source-state.js +182 -0
- package/dist/capture/stream-rendering.d.ts +14 -0
- package/dist/capture/stream-rendering.d.ts.map +1 -0
- package/dist/capture/stream-rendering.js +69 -0
- package/dist/capture/trajectory.d.ts +20 -0
- package/dist/capture/trajectory.d.ts.map +1 -0
- package/dist/capture/trajectory.js +77 -0
- package/dist/components/viewer/batched-mesh-spike.d.ts +14 -0
- package/dist/components/viewer/batched-mesh-spike.d.ts.map +1 -0
- package/dist/components/viewer/batched-mesh-spike.js +64 -0
- package/dist/components/viewer/frame-limiter.d.ts +11 -0
- package/dist/components/viewer/frame-limiter.d.ts.map +1 -1
- package/dist/components/viewer/frame-limiter.js +59 -18
- package/dist/components/viewer/index.d.ts +15 -0
- package/dist/components/viewer/index.d.ts.map +1 -1
- package/dist/components/viewer/index.js +74 -82
- package/dist/components/viewer/lights.d.ts.map +1 -1
- package/dist/components/viewer/lights.js +123 -89
- package/dist/components/viewer/perf-monitor.d.ts +6 -1
- package/dist/components/viewer/perf-monitor.d.ts.map +1 -1
- package/dist/components/viewer/perf-monitor.js +306 -115
- package/dist/components/viewer/perf-panel.d.ts +3 -0
- package/dist/components/viewer/perf-panel.d.ts.map +1 -0
- package/dist/components/viewer/perf-panel.js +178 -0
- package/dist/components/viewer/pointer-raycast-layers.d.ts +15 -0
- package/dist/components/viewer/pointer-raycast-layers.d.ts.map +1 -0
- package/dist/components/viewer/pointer-raycast-layers.js +28 -0
- package/dist/components/viewer/post-processing.d.ts.map +1 -1
- package/dist/components/viewer/post-processing.js +124 -83
- package/dist/components/viewer/registered-systems.d.ts +14 -5
- package/dist/components/viewer/registered-systems.d.ts.map +1 -1
- package/dist/components/viewer/registered-systems.js +22 -10
- package/dist/components/viewer/scene-atmosphere.d.ts +30 -0
- package/dist/components/viewer/scene-atmosphere.d.ts.map +1 -0
- package/dist/components/viewer/scene-atmosphere.js +89 -0
- package/dist/components/viewer/scene-environment.d.ts.map +1 -1
- package/dist/components/viewer/scene-environment.js +19 -5
- package/dist/components/viewer/scene-ground-replacement.d.ts +5 -0
- package/dist/components/viewer/scene-ground-replacement.d.ts.map +1 -0
- package/dist/components/viewer/scene-ground-replacement.js +35 -0
- package/dist/components/viewer/selection-manager.d.ts.map +1 -1
- package/dist/components/viewer/selection-manager.js +7 -2
- package/dist/components/viewer/unsupported-gpu-fallback.d.ts +2 -0
- package/dist/components/viewer/unsupported-gpu-fallback.d.ts.map +1 -0
- package/dist/components/viewer/unsupported-gpu-fallback.js +4 -0
- package/dist/components/viewer/viewer-camera.d.ts.map +1 -1
- package/dist/components/viewer/viewer-camera.js +4 -1
- package/dist/components/viewer/viewer-presentations.d.ts +67 -0
- package/dist/components/viewer/viewer-presentations.d.ts.map +1 -0
- package/dist/components/viewer/viewer-presentations.js +120 -0
- package/dist/hooks/use-library-materials-version.d.ts +7 -0
- package/dist/hooks/use-library-materials-version.d.ts.map +1 -0
- package/dist/hooks/use-library-materials-version.js +10 -0
- package/dist/hooks/use-node-events.d.ts.map +1 -1
- package/dist/hooks/use-node-events.js +1 -0
- package/dist/index.d.ts +20 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -7
- package/dist/lib/csg-utils.d.ts +1 -0
- package/dist/lib/csg-utils.d.ts.map +1 -1
- package/dist/lib/csg-utils.js +6 -1
- package/dist/lib/dispose-object3d.d.ts +4 -0
- package/dist/lib/dispose-object3d.d.ts.map +1 -0
- package/dist/lib/dispose-object3d.js +27 -0
- package/dist/lib/geometry-groups.d.ts +17 -0
- package/dist/lib/geometry-groups.d.ts.map +1 -0
- package/dist/lib/geometry-groups.js +53 -0
- package/dist/lib/gpu-perf.d.ts +0 -2
- package/dist/lib/gpu-perf.d.ts.map +1 -1
- package/dist/lib/gpu-perf.js +7 -21
- package/dist/lib/isolation.d.ts +8 -8
- package/dist/lib/isolation.d.ts.map +1 -1
- package/dist/lib/isolation.js +18 -30
- package/dist/lib/layer-pass.d.ts +28 -0
- package/dist/lib/layer-pass.d.ts.map +1 -0
- package/dist/lib/layer-pass.js +254 -0
- package/dist/lib/layers.d.ts +16 -0
- package/dist/lib/layers.d.ts.map +1 -1
- package/dist/lib/layers.js +18 -0
- package/dist/lib/materials.d.ts +12 -0
- package/dist/lib/materials.d.ts.map +1 -1
- package/dist/lib/materials.js +51 -17
- package/dist/lib/merged-outline-node.d.ts +17 -8
- package/dist/lib/merged-outline-node.d.ts.map +1 -1
- package/dist/lib/merged-outline-node.js +194 -52
- package/dist/lib/perf-actions.d.ts +55 -0
- package/dist/lib/perf-actions.d.ts.map +1 -0
- package/dist/lib/perf-actions.js +211 -0
- package/dist/lib/perf-observers.d.ts +2 -0
- package/dist/lib/perf-observers.d.ts.map +1 -0
- package/dist/lib/perf-observers.js +17 -0
- package/dist/lib/perf-panel-store.d.ts +71 -0
- package/dist/lib/perf-panel-store.d.ts.map +1 -0
- package/dist/lib/perf-panel-store.js +29 -0
- package/dist/lib/perf-tracks.d.ts +43 -0
- package/dist/lib/perf-tracks.d.ts.map +1 -0
- package/dist/lib/perf-tracks.js +113 -0
- package/dist/lib/pointer-events.d.ts +7 -0
- package/dist/lib/pointer-events.d.ts.map +1 -0
- package/dist/lib/pointer-events.js +680 -0
- package/dist/lib/post-processing-resources.d.ts +12 -0
- package/dist/lib/post-processing-resources.d.ts.map +1 -0
- package/dist/lib/post-processing-resources.js +19 -0
- package/dist/lib/renderer-capability.d.ts +56 -0
- package/dist/lib/renderer-capability.d.ts.map +1 -0
- package/dist/lib/renderer-capability.js +116 -0
- package/dist/lib/scene-visibility.d.ts +15 -0
- package/dist/lib/scene-visibility.d.ts.map +1 -0
- package/dist/lib/scene-visibility.js +69 -0
- package/dist/lib/shadow-only.d.ts +16 -0
- package/dist/lib/shadow-only.d.ts.map +1 -1
- package/dist/lib/shadow-only.js +8 -17
- package/dist/lib/snapshot-pipeline.d.ts +9 -0
- package/dist/lib/snapshot-pipeline.d.ts.map +1 -1
- package/dist/lib/snapshot-pipeline.js +33 -9
- package/dist/store/use-viewer.d.ts +7 -6
- package/dist/store/use-viewer.d.ts.map +1 -1
- package/dist/systems/ceiling/ceiling-system.js +1 -1
- package/dist/systems/door/door-animation-system.d.ts.map +1 -1
- package/dist/systems/door/door-animation-system.js +6 -9
- package/dist/systems/door/door-system.d.ts.map +1 -1
- package/dist/systems/door/door-system.js +13 -2
- package/dist/systems/floor-elevation/floor-elevation-system.d.ts.map +1 -1
- package/dist/systems/floor-elevation/floor-elevation-system.js +9 -0
- package/dist/systems/geometry/geometry-system.d.ts.map +1 -1
- package/dist/systems/geometry/geometry-system.js +5 -28
- package/dist/systems/level/level-system.d.ts.map +1 -1
- package/dist/systems/level/level-system.js +8 -2
- package/dist/systems/level/level-utils.d.ts +9 -0
- package/dist/systems/level/level-utils.d.ts.map +1 -1
- package/dist/systems/level/level-utils.js +14 -0
- package/dist/systems/perf-action-settle/perf-action-settle-system.d.ts +8 -0
- package/dist/systems/perf-action-settle/perf-action-settle-system.d.ts.map +1 -0
- package/dist/systems/perf-action-settle/perf-action-settle-system.js +32 -0
- package/dist/systems/roof/roof-system.d.ts.map +1 -1
- package/dist/systems/roof/roof-system.js +1196 -58
- package/dist/systems/scan/scan-system.js +6 -5
- package/dist/systems/slab/slab-system.d.ts.map +1 -1
- package/dist/systems/slab/slab-system.js +1 -2
- package/dist/systems/stair/stair-system.d.ts.map +1 -1
- package/dist/systems/stair/stair-system.js +9 -8
- package/dist/systems/surface-hole-geometry.d.ts +1 -1
- package/dist/systems/surface-hole-geometry.d.ts.map +1 -1
- package/dist/systems/surface-hole-geometry.js +1 -1
- package/dist/systems/wall/level-miter-cache.d.ts +10 -0
- package/dist/systems/wall/level-miter-cache.d.ts.map +1 -0
- package/dist/systems/wall/level-miter-cache.js +40 -0
- package/dist/systems/wall/wall-build-lifecycle.d.ts +9 -0
- package/dist/systems/wall/wall-build-lifecycle.d.ts.map +1 -0
- package/dist/systems/wall/wall-build-lifecycle.js +74 -0
- package/dist/systems/wall/wall-cutout-cache.d.ts +57 -0
- package/dist/systems/wall/wall-cutout-cache.d.ts.map +1 -0
- package/dist/systems/wall/wall-cutout-cache.js +304 -0
- package/dist/systems/wall/wall-cutout.d.ts +24 -1
- package/dist/systems/wall/wall-cutout.d.ts.map +1 -1
- package/dist/systems/wall/wall-cutout.js +33 -140
- package/dist/systems/wall/wall-material-variant.d.ts +31 -0
- package/dist/systems/wall/wall-material-variant.d.ts.map +1 -0
- package/dist/systems/wall/wall-material-variant.js +10 -0
- package/dist/systems/wall/wall-materials.d.ts +6 -0
- package/dist/systems/wall/wall-materials.d.ts.map +1 -1
- package/dist/systems/wall/wall-materials.js +29 -13
- package/dist/systems/wall/wall-placeholder-sweep.d.ts +50 -0
- package/dist/systems/wall/wall-placeholder-sweep.d.ts.map +1 -0
- package/dist/systems/wall/wall-placeholder-sweep.js +51 -0
- package/dist/systems/wall/wall-rebuild-notifications.d.ts +5 -0
- package/dist/systems/wall/wall-rebuild-notifications.d.ts.map +1 -0
- package/dist/systems/wall/wall-rebuild-notifications.js +23 -0
- package/dist/systems/wall/wall-system.d.ts +13 -2
- package/dist/systems/wall/wall-system.d.ts.map +1 -1
- package/dist/systems/wall/wall-system.js +413 -148
- package/dist/systems/window/window-animation-system.d.ts.map +1 -1
- package/dist/systems/window/window-animation-system.js +9 -8
- package/dist/systems/window/window-system.d.ts +1 -0
- package/dist/systems/window/window-system.d.ts.map +1 -1
- package/dist/systems/window/window-system.js +16 -2
- package/package.json +18 -3
- package/dist/components/viewer/scene-bvh.test.d.ts +0 -2
- package/dist/components/viewer/scene-bvh.test.d.ts.map +0 -1
- package/dist/components/viewer/scene-bvh.test.js +0 -13
- package/dist/lib/csg-utils.test.d.ts +0 -2
- package/dist/lib/csg-utils.test.d.ts.map +0 -1
- package/dist/lib/csg-utils.test.js +0 -45
- package/dist/lib/materials.test.d.ts +0 -2
- package/dist/lib/materials.test.d.ts.map +0 -1
- package/dist/lib/materials.test.js +0 -25
- package/dist/lib/merged-outline-node.test.d.ts +0 -2
- package/dist/lib/merged-outline-node.test.d.ts.map +0 -1
- package/dist/lib/merged-outline-node.test.js +0 -22
- package/dist/lib/polygon-union.d.ts +0 -4
- package/dist/lib/polygon-union.d.ts.map +0 -1
- package/dist/lib/polygon-union.js +0 -289
- package/dist/lib/polygon-union.test.d.ts +0 -2
- package/dist/lib/polygon-union.test.d.ts.map +0 -1
- package/dist/lib/polygon-union.test.js +0 -105
- package/dist/lib/texture-reference.test.d.ts +0 -2
- package/dist/lib/texture-reference.test.d.ts.map +0 -1
- package/dist/lib/texture-reference.test.js +0 -86
- package/dist/store/use-viewer.test.d.ts +0 -2
- package/dist/store/use-viewer.test.d.ts.map +0 -1
- package/dist/store/use-viewer.test.js +0 -61
- package/dist/systems/door/door-animation.test.d.ts +0 -2
- package/dist/systems/door/door-animation.test.d.ts.map +0 -1
- package/dist/systems/door/door-animation.test.js +0 -51
- package/dist/systems/door/door-floor-alignment.test.d.ts +0 -2
- package/dist/systems/door/door-floor-alignment.test.d.ts.map +0 -1
- package/dist/systems/door/door-floor-alignment.test.js +0 -50
- package/dist/systems/geometry/geometry-system.test.d.ts +0 -2
- package/dist/systems/geometry/geometry-system.test.d.ts.map +0 -1
- package/dist/systems/geometry/geometry-system.test.js +0 -30
- package/dist/systems/slab/slab-system.test.d.ts +0 -2
- package/dist/systems/slab/slab-system.test.d.ts.map +0 -1
- package/dist/systems/slab/slab-system.test.js +0 -102
- package/dist/systems/wall/opening-cutout-geometry.test.d.ts +0 -2
- package/dist/systems/wall/opening-cutout-geometry.test.d.ts.map +0 -1
- package/dist/systems/wall/opening-cutout-geometry.test.js +0 -172
- package/dist/systems/wall/wall-opening-cutout.test.d.ts +0 -2
- package/dist/systems/wall/wall-opening-cutout.test.d.ts.map +0 -1
- package/dist/systems/wall/wall-opening-cutout.test.js +0 -59
- package/dist/systems/wall/wall-support-extension.test.d.ts +0 -2
- package/dist/systems/wall/wall-support-extension.test.d.ts.map +0 -1
- package/dist/systems/wall/wall-support-extension.test.js +0 -116
- package/dist/systems/wall/wall-terrain-bottom.test.d.ts +0 -2
- package/dist/systems/wall/wall-terrain-bottom.test.d.ts.map +0 -1
- package/dist/systems/wall/wall-terrain-bottom.test.js +0 -34
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useThree } from '@react-three/fiber';
|
|
3
|
+
import { useLayoutEffect, useMemo, useRef } from 'react';
|
|
4
|
+
import { cameraPosition, fog, positionWorld, reference, smoothstep } from 'three/tsl';
|
|
5
|
+
import { useStore } from 'zustand';
|
|
6
|
+
import { createStore } from 'zustand/vanilla';
|
|
7
|
+
const sceneAtmospheres = new WeakMap();
|
|
8
|
+
function registryFor(scene) {
|
|
9
|
+
let registry = sceneAtmospheres.get(scene);
|
|
10
|
+
if (!registry) {
|
|
11
|
+
registry = {
|
|
12
|
+
base: null,
|
|
13
|
+
owners: [],
|
|
14
|
+
store: createStore(() => ({
|
|
15
|
+
source: null,
|
|
16
|
+
})),
|
|
17
|
+
};
|
|
18
|
+
sceneAtmospheres.set(scene, registry);
|
|
19
|
+
}
|
|
20
|
+
return registry;
|
|
21
|
+
}
|
|
22
|
+
function applyActiveOwner(scene, registry) {
|
|
23
|
+
const active = registry.owners.at(-1);
|
|
24
|
+
if (active) {
|
|
25
|
+
scene.environmentNode = active.source.environmentNode;
|
|
26
|
+
scene.environmentIntensity = 1;
|
|
27
|
+
scene.fogNode = active.fogNode;
|
|
28
|
+
registry.store.setState({ source: active.source });
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const base = registry.base;
|
|
32
|
+
if (base) {
|
|
33
|
+
scene.environmentNode = base.environmentNode;
|
|
34
|
+
scene.environmentIntensity = base.environmentIntensity;
|
|
35
|
+
scene.fogNode = base.fogNode;
|
|
36
|
+
}
|
|
37
|
+
registry.base = null;
|
|
38
|
+
registry.store.setState({ source: null });
|
|
39
|
+
}
|
|
40
|
+
/** Returns the atmosphere currently owning this React Three Fiber scene. */
|
|
41
|
+
export function useSceneAtmosphere() {
|
|
42
|
+
const scene = useThree((state) => state.scene);
|
|
43
|
+
const registry = useMemo(() => registryFor(scene), [scene]);
|
|
44
|
+
return useStore(registry.store, (state) => state.source);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Installs a generic radiance source into the current scene. The source object is
|
|
48
|
+
* expected to remain stable while its colors, vectors, and numbers mutate.
|
|
49
|
+
*/
|
|
50
|
+
export function SceneAtmosphere({ source }) {
|
|
51
|
+
const scene = useThree((state) => state.scene);
|
|
52
|
+
const invalidate = useThree((state) => state.invalidate);
|
|
53
|
+
const ownerId = useRef(Symbol('scene-atmosphere'));
|
|
54
|
+
const registry = useMemo(() => registryFor(scene), [scene]);
|
|
55
|
+
const fogNode = useMemo(() => {
|
|
56
|
+
const offset = positionWorld.sub(cameraPosition);
|
|
57
|
+
const direction = offset.normalize();
|
|
58
|
+
const fogRange = source;
|
|
59
|
+
const fogStart = reference('fogStart', 'float', fogRange);
|
|
60
|
+
const fogEnd = reference('fogEnd', 'float', fogRange);
|
|
61
|
+
const factor = smoothstep(fogStart, fogEnd, offset.length());
|
|
62
|
+
return fog(source.fogRadiance(direction), factor);
|
|
63
|
+
}, [source]);
|
|
64
|
+
useLayoutEffect(() => {
|
|
65
|
+
if (registry.owners.length === 0) {
|
|
66
|
+
registry.base = {
|
|
67
|
+
environmentNode: scene.environmentNode,
|
|
68
|
+
environmentIntensity: scene.environmentIntensity,
|
|
69
|
+
fogNode: scene.fogNode,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const owner = { id: ownerId.current, source, fogNode };
|
|
73
|
+
registry.owners.push(owner);
|
|
74
|
+
applyActiveOwner(scene, registry);
|
|
75
|
+
invalidate();
|
|
76
|
+
return () => {
|
|
77
|
+
const index = registry.owners.findIndex((entry) => entry.id === owner.id);
|
|
78
|
+
if (index < 0)
|
|
79
|
+
return;
|
|
80
|
+
const wasActive = index === registry.owners.length - 1;
|
|
81
|
+
registry.owners.splice(index, 1);
|
|
82
|
+
if (wasActive) {
|
|
83
|
+
applyActiveOwner(scene, registry);
|
|
84
|
+
invalidate();
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
}, [fogNode, invalidate, registry, scene, source]);
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-environment.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/scene-environment.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scene-environment.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/scene-environment.tsx"],"names":[],"mappings":"AAoEA,wBAAgB,gBAAgB,SA8B/B"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { useThree } from '@react-three/fiber';
|
|
3
|
-
import { useEffect, useMemo } from 'react';
|
|
3
|
+
import { useEffect, useMemo, useRef } from 'react';
|
|
4
4
|
import * as THREE from 'three/webgpu';
|
|
5
5
|
import { getSceneTheme } from '../../lib/scene-themes';
|
|
6
6
|
import useViewer from '../../store/use-viewer';
|
|
7
|
+
import { useSceneAtmosphere } from './scene-atmosphere';
|
|
7
8
|
/**
|
|
8
9
|
* Scene IBL — a small procedural gradient sky (cool zenith → warm horizon →
|
|
9
10
|
* dim ground bounce) used purely as the environment light source. The visible
|
|
@@ -64,16 +65,29 @@ export function SceneEnvironment() {
|
|
|
64
65
|
const scene = useThree((state) => state.scene);
|
|
65
66
|
const texture = useMemo(buildGradientSky, []);
|
|
66
67
|
const appearance = useViewer((state) => getSceneTheme(state.sceneTheme).appearance);
|
|
68
|
+
const atmosphere = useSceneAtmosphere();
|
|
69
|
+
const atmosphereRef = useRef(atmosphere);
|
|
70
|
+
atmosphereRef.current = atmosphere;
|
|
67
71
|
useEffect(() => {
|
|
68
72
|
const prevEnvironment = scene.environment;
|
|
69
73
|
const prevIntensity = scene.environmentIntensity;
|
|
70
74
|
scene.environment = texture;
|
|
71
|
-
scene.environmentIntensity = appearance === 'dark' ? ENV_INTENSITY_DARK : ENV_INTENSITY;
|
|
72
75
|
return () => {
|
|
73
|
-
scene.environment
|
|
74
|
-
|
|
76
|
+
if (scene.environment === texture) {
|
|
77
|
+
scene.environment = prevEnvironment;
|
|
78
|
+
if (!atmosphereRef.current)
|
|
79
|
+
scene.environmentIntensity = prevIntensity;
|
|
80
|
+
}
|
|
75
81
|
texture.dispose();
|
|
76
82
|
};
|
|
77
|
-
}, [scene, texture
|
|
83
|
+
}, [scene, texture]);
|
|
84
|
+
useEffect(() => {
|
|
85
|
+
// An atmosphere owns environmentIntensity while its environmentNode is
|
|
86
|
+
// active. The gradient remains installed as the fallback texture and takes
|
|
87
|
+
// over immediately when the atmosphere restores scene ownership.
|
|
88
|
+
if (atmosphere)
|
|
89
|
+
return;
|
|
90
|
+
scene.environmentIntensity = appearance === 'dark' ? ENV_INTENSITY_DARK : ENV_INTENSITY;
|
|
91
|
+
}, [appearance, atmosphere, scene]);
|
|
78
92
|
return null;
|
|
79
93
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Whether modeled exterior ground replaces this scene's fallback horizon disc. */
|
|
2
|
+
export declare function useSceneGroundReplacement(): boolean;
|
|
3
|
+
/** Mount alongside replacement ground. The last release restores the fallback. */
|
|
4
|
+
export declare function SceneGroundReplacement(): null;
|
|
5
|
+
//# sourceMappingURL=scene-ground-replacement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-ground-replacement.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/scene-ground-replacement.tsx"],"names":[],"mappings":"AAoBA,mFAAmF;AACnF,wBAAgB,yBAAyB,IAAI,OAAO,CAInD;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,SAarC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useThree } from '@react-three/fiber';
|
|
3
|
+
import { useLayoutEffect, useMemo } from 'react';
|
|
4
|
+
import { useStore } from 'zustand';
|
|
5
|
+
import { createStore } from 'zustand/vanilla';
|
|
6
|
+
const sceneGrounds = new WeakMap();
|
|
7
|
+
function groundStore(scene) {
|
|
8
|
+
let store = sceneGrounds.get(scene);
|
|
9
|
+
if (!store) {
|
|
10
|
+
store = createStore(() => ({ owners: 0 }));
|
|
11
|
+
sceneGrounds.set(scene, store);
|
|
12
|
+
}
|
|
13
|
+
return store;
|
|
14
|
+
}
|
|
15
|
+
/** Whether modeled exterior ground replaces this scene's fallback horizon disc. */
|
|
16
|
+
export function useSceneGroundReplacement() {
|
|
17
|
+
const scene = useThree((state) => state.scene);
|
|
18
|
+
const store = useMemo(() => groundStore(scene), [scene]);
|
|
19
|
+
return useStore(store, (state) => state.owners > 0);
|
|
20
|
+
}
|
|
21
|
+
/** Mount alongside replacement ground. The last release restores the fallback. */
|
|
22
|
+
export function SceneGroundReplacement() {
|
|
23
|
+
const scene = useThree((state) => state.scene);
|
|
24
|
+
const invalidate = useThree((state) => state.invalidate);
|
|
25
|
+
const store = useMemo(() => groundStore(scene), [scene]);
|
|
26
|
+
useLayoutEffect(() => {
|
|
27
|
+
store.setState((state) => ({ owners: state.owners + 1 }));
|
|
28
|
+
invalidate();
|
|
29
|
+
return () => {
|
|
30
|
+
store.setState((state) => ({ owners: state.owners - 1 }));
|
|
31
|
+
invalidate();
|
|
32
|
+
};
|
|
33
|
+
}, [invalidate, store]);
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection-manager.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/selection-manager.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"selection-manager.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/selection-manager.tsx"],"names":[],"mappings":"AAkTA,eAAO,MAAM,gBAAgB,mCA0G5B,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { emitter, getSelectableKinds, pointInPolygon, resolveSelectionProxyId, sceneRegistry, useScene, } from '@pascal-app/core';
|
|
3
|
+
import { emitter, getSelectableKinds, pointInPolygon, resolveSelectionProxyId, sceneRegistry, useRegistryVersion, useScene, } from '@pascal-app/core';
|
|
4
4
|
import { useThree } from '@react-three/fiber';
|
|
5
5
|
import { useEffect, useRef } from 'react';
|
|
6
6
|
import { Vector3 } from 'three';
|
|
@@ -234,7 +234,12 @@ const getStrategy = () => {
|
|
|
234
234
|
export const SelectionManager = () => {
|
|
235
235
|
const selection = useViewer((s) => s.selection);
|
|
236
236
|
const clickHandledRef = useRef(false);
|
|
237
|
+
// Plugin kinds register AFTER mount (async dynamic-import discovery) —
|
|
238
|
+
// re-derive the `getSelectableKinds()` subscription list when they land.
|
|
239
|
+
const registryVersion = useRegistryVersion();
|
|
237
240
|
useEffect(() => {
|
|
241
|
+
// re-subscribe when plugin kinds register after mount (async plugin load)
|
|
242
|
+
void registryVersion;
|
|
238
243
|
const onEnter = (event) => {
|
|
239
244
|
const strategy = getStrategy();
|
|
240
245
|
if (!strategy)
|
|
@@ -316,7 +321,7 @@ export const SelectionManager = () => {
|
|
|
316
321
|
emitter.off(`${type}:click`, onClick);
|
|
317
322
|
}
|
|
318
323
|
};
|
|
319
|
-
}, []);
|
|
324
|
+
}, [registryVersion]);
|
|
320
325
|
return (_jsxs(_Fragment, { children: [_jsx(PointerMissedHandler, { clickHandledRef: clickHandledRef }), _jsx(OutlinerSync, {})] }));
|
|
321
326
|
};
|
|
322
327
|
const PointerMissedHandler = ({ clickHandledRef, }) => {
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
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." })] }) }));
|
|
4
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewer-camera.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/viewer-camera.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"viewer-camera.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/viewer-camera.tsx"],"names":[],"mappings":"AAIA,eAAO,MAAM,YAAY,mCAUxB,CAAA"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { OrthographicCamera, PerspectiveCamera } from '@react-three/drei';
|
|
3
3
|
import useViewer from '../../store/use-viewer';
|
|
4
|
+
import { useSceneGroundReplacement } from './scene-ground-replacement';
|
|
4
5
|
export const ViewerCamera = () => {
|
|
5
6
|
const cameraMode = useViewer((state) => state.cameraMode);
|
|
6
|
-
|
|
7
|
+
// Exterior ground can include a coarse ocean horizon beyond the local terrain.
|
|
8
|
+
const far = useSceneGroundReplacement() ? 20_000 : 1000;
|
|
9
|
+
return cameraMode === 'perspective' ? (_jsx(PerspectiveCamera, { far: far, fov: 50, makeDefault: true, near: 0.1, position: [10, 10, 10] })) : (_jsx(OrthographicCamera, { far: 1000, makeDefault: true, near: -1000, position: [10, 10, 10], zoom: 20 }));
|
|
7
10
|
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { type AnyNode, type LazyComponent } from '@pascal-app/core';
|
|
2
|
+
import type { Object3D, Texture } from 'three';
|
|
3
|
+
export type ViewerPresentationConfiguration = {
|
|
4
|
+
/** Returns a detached, versioned snapshot suitable for host-owned persistence. */
|
|
5
|
+
getSnapshot: () => unknown;
|
|
6
|
+
/** Validates and applies a previously persisted snapshot. */
|
|
7
|
+
restore: (snapshot: unknown) => void;
|
|
8
|
+
/** Restores the contribution's initial presentation state. */
|
|
9
|
+
reset: () => void;
|
|
10
|
+
/** Notifies the host only when persisted presentation state changes. */
|
|
11
|
+
subscribe: (onChange: () => void) => () => void;
|
|
12
|
+
};
|
|
13
|
+
export type ViewerPresentationExportContext = {
|
|
14
|
+
/** Full semantic snapshot; output selection never removes generation context. */
|
|
15
|
+
nodes: Readonly<Record<string, AnyNode>>;
|
|
16
|
+
/** Detached contribution configuration captured once when export starts. */
|
|
17
|
+
configuration: unknown;
|
|
18
|
+
onlyVisible: boolean;
|
|
19
|
+
excludedNodeTypes: readonly string[];
|
|
20
|
+
};
|
|
21
|
+
export type ViewerPresentationStaticExport = {
|
|
22
|
+
label: string;
|
|
23
|
+
build: (ctx: ViewerPresentationExportContext) => Object3D | null | Promise<Object3D | null>;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Marks a cached presentation texture handle as borrowed. Static export owns
|
|
27
|
+
* every returned resource by default; the host clones marked handles before
|
|
28
|
+
* attaching the contribution and never disposes the marked source handle.
|
|
29
|
+
*/
|
|
30
|
+
export declare function markViewerPresentationTextureBorrowed<T extends Texture>(texture: T): T;
|
|
31
|
+
export declare function isViewerPresentationTextureBorrowed(texture: Texture): boolean;
|
|
32
|
+
export type ViewerPresentationContribution = {
|
|
33
|
+
/** Globally unique contribution id, conventionally `${pluginId}:presentation`. */
|
|
34
|
+
id: string;
|
|
35
|
+
/** Project installation gate. Omit only for host-owned, always-on presentation. */
|
|
36
|
+
pluginId?: string;
|
|
37
|
+
/** Lazy R3F subtree mounted as a sibling of the authored scene renderer. */
|
|
38
|
+
component: LazyComponent;
|
|
39
|
+
/** Optional host persistence seam; never stored in the semantic scene graph. */
|
|
40
|
+
configuration?: ViewerPresentationConfiguration;
|
|
41
|
+
/**
|
|
42
|
+
* Explicit opt-in static artifact contribution. The returned root must be
|
|
43
|
+
* detached and uses the presentation's existing world coordinates.
|
|
44
|
+
*/
|
|
45
|
+
staticExport?: ViewerPresentationStaticExport;
|
|
46
|
+
};
|
|
47
|
+
declare class ViewerPresentationRegistryImpl {
|
|
48
|
+
private readonly contributions;
|
|
49
|
+
private readonly listeners;
|
|
50
|
+
private cached;
|
|
51
|
+
subscribe: (onChange: () => void) => (() => void);
|
|
52
|
+
getSnapshot: () => ViewerPresentationContribution[];
|
|
53
|
+
reset(): void;
|
|
54
|
+
register(contribution: ViewerPresentationContribution): void;
|
|
55
|
+
private emit;
|
|
56
|
+
}
|
|
57
|
+
export declare const viewerPresentationRegistry: ViewerPresentationRegistryImpl;
|
|
58
|
+
export declare function registerViewerPresentation(contribution: ViewerPresentationContribution): void;
|
|
59
|
+
/**
|
|
60
|
+
* Mounts registered presentation-only R3F subtrees for the current project.
|
|
61
|
+
* Hosts place this once inside each Viewer they want to include presentation;
|
|
62
|
+
* semantic scene export remains isolated because the mount is a sibling of
|
|
63
|
+
* `scene-renderer`, not one of its authored descendants.
|
|
64
|
+
*/
|
|
65
|
+
export declare function ViewerPresentations(): (import("react").JSX.Element | null)[];
|
|
66
|
+
export {};
|
|
67
|
+
//# sourceMappingURL=viewer-presentations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewer-presentations.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/viewer-presentations.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,aAAa,EAAY,MAAM,kBAAkB,CAAA;AAE7E,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAG9C,MAAM,MAAM,+BAA+B,GAAG;IAC5C,kFAAkF;IAClF,WAAW,EAAE,MAAM,OAAO,CAAA;IAC1B,6DAA6D;IAC7D,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAA;IACpC,8DAA8D;IAC9D,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,wEAAwE;IACxE,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAA;CAChD,CAAA;AACD,MAAM,MAAM,+BAA+B,GAAG;IAC5C,iFAAiF;IACjF,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACxC,4EAA4E;IAC5E,aAAa,EAAE,OAAO,CAAA;IACtB,WAAW,EAAE,OAAO,CAAA;IACpB,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,8BAA8B,GAAG;IAC3C,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,CAAC,GAAG,EAAE,+BAA+B,KAAK,QAAQ,GAAG,IAAI,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;CAC5F,CAAA;AAGD;;;;GAIG;AACH,wBAAgB,qCAAqC,CAAC,CAAC,SAAS,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAGtF;AAED,wBAAgB,mCAAmC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAE7E;AAED,MAAM,MAAM,8BAA8B,GAAG;IAC3C,kFAAkF;IAClF,EAAE,EAAE,MAAM,CAAA;IACV,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,4EAA4E;IAC5E,SAAS,EAAE,aAAa,CAAA;IACxB,gFAAgF;IAChF,aAAa,CAAC,EAAE,+BAA+B,CAAA;IAC/C;;;OAGG;IACH,YAAY,CAAC,EAAE,8BAA8B,CAAA;CAC9C,CAAA;AAeD,cAAM,8BAA8B;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoD;IAClF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwB;IAClD,OAAO,CAAC,MAAM,CAAuC;IAErD,SAAS,GAAI,UAAU,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAK/C;IAED,WAAW,QAAO,8BAA8B,EAAE,CAAe;IAEjE,KAAK,IAAI,IAAI;IAKb,QAAQ,CAAC,YAAY,EAAE,8BAA8B,GAAG,IAAI;IAmD5D,OAAO,CAAC,IAAI;CAIb;AAED,eAAO,MAAM,0BAA0B,gCAAuC,CAAA;AAE9E,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,8BAA8B,GAAG,IAAI,CAE7F;AA2BD;;;;;GAKG;AACH,wBAAgB,mBAAmB,2CAalC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useScene } from '@pascal-app/core';
|
|
4
|
+
import { lazy, Suspense, useSyncExternalStore } from 'react';
|
|
5
|
+
import { ErrorBoundary } from '../error-boundary';
|
|
6
|
+
const borrowedStaticExportTextures = new WeakSet();
|
|
7
|
+
/**
|
|
8
|
+
* Marks a cached presentation texture handle as borrowed. Static export owns
|
|
9
|
+
* every returned resource by default; the host clones marked handles before
|
|
10
|
+
* attaching the contribution and never disposes the marked source handle.
|
|
11
|
+
*/
|
|
12
|
+
export function markViewerPresentationTextureBorrowed(texture) {
|
|
13
|
+
borrowedStaticExportTextures.add(texture);
|
|
14
|
+
return texture;
|
|
15
|
+
}
|
|
16
|
+
export function isViewerPresentationTextureBorrowed(texture) {
|
|
17
|
+
return borrowedStaticExportTextures.has(texture);
|
|
18
|
+
}
|
|
19
|
+
function isDevMode() {
|
|
20
|
+
try {
|
|
21
|
+
const meta = import.meta;
|
|
22
|
+
if (typeof meta?.env?.DEV === 'boolean')
|
|
23
|
+
return meta.env.DEV;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// import.meta unavailable in some CJS contexts — fall through.
|
|
27
|
+
}
|
|
28
|
+
if (typeof process !== 'undefined' && process.env?.NODE_ENV) {
|
|
29
|
+
return process.env.NODE_ENV !== 'production';
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
class ViewerPresentationRegistryImpl {
|
|
34
|
+
contributions = new Map();
|
|
35
|
+
listeners = new Set();
|
|
36
|
+
cached = [];
|
|
37
|
+
subscribe = (onChange) => {
|
|
38
|
+
this.listeners.add(onChange);
|
|
39
|
+
return () => {
|
|
40
|
+
this.listeners.delete(onChange);
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
getSnapshot = () => this.cached;
|
|
44
|
+
reset() {
|
|
45
|
+
this.contributions.clear();
|
|
46
|
+
this.emit();
|
|
47
|
+
}
|
|
48
|
+
register(contribution) {
|
|
49
|
+
if (typeof contribution.id !== 'string' || contribution.id.length === 0) {
|
|
50
|
+
throw new Error('[viewer:presentations] contribution id must be a non-empty string');
|
|
51
|
+
}
|
|
52
|
+
if (contribution.pluginId !== undefined &&
|
|
53
|
+
(typeof contribution.pluginId !== 'string' || contribution.pluginId.length === 0)) {
|
|
54
|
+
throw new Error('[viewer:presentations] plugin id must be a non-empty string when provided');
|
|
55
|
+
}
|
|
56
|
+
if (typeof contribution.component !== 'function') {
|
|
57
|
+
throw new Error('[viewer:presentations] component must be a lazy component loader');
|
|
58
|
+
}
|
|
59
|
+
if (contribution.configuration !== undefined &&
|
|
60
|
+
(contribution.configuration === null ||
|
|
61
|
+
typeof contribution.configuration !== 'object' ||
|
|
62
|
+
typeof contribution.configuration.getSnapshot !== 'function' ||
|
|
63
|
+
typeof contribution.configuration.restore !== 'function' ||
|
|
64
|
+
typeof contribution.configuration.reset !== 'function' ||
|
|
65
|
+
typeof contribution.configuration.subscribe !== 'function')) {
|
|
66
|
+
throw new Error('[viewer:presentations] configuration must implement getSnapshot, restore, reset, and subscribe');
|
|
67
|
+
}
|
|
68
|
+
if (contribution.staticExport !== undefined &&
|
|
69
|
+
(contribution.staticExport === null ||
|
|
70
|
+
typeof contribution.staticExport !== 'object' ||
|
|
71
|
+
typeof contribution.staticExport.label !== 'string' ||
|
|
72
|
+
contribution.staticExport.label.length === 0 ||
|
|
73
|
+
typeof contribution.staticExport.build !== 'function')) {
|
|
74
|
+
throw new Error('[viewer:presentations] staticExport must provide a non-empty label and build function');
|
|
75
|
+
}
|
|
76
|
+
if (this.contributions.has(contribution.id)) {
|
|
77
|
+
if (isDevMode()) {
|
|
78
|
+
console.warn(`[viewer:presentations] re-registering "${contribution.id}" (HMR)`);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
throw new Error(`[viewer:presentations] duplicate id: "${contribution.id}" already registered`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
this.contributions.set(contribution.id, contribution);
|
|
85
|
+
this.emit();
|
|
86
|
+
}
|
|
87
|
+
emit() {
|
|
88
|
+
this.cached = Array.from(this.contributions.values());
|
|
89
|
+
for (const listener of this.listeners)
|
|
90
|
+
listener();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export const viewerPresentationRegistry = new ViewerPresentationRegistryImpl();
|
|
94
|
+
export function registerViewerPresentation(contribution) {
|
|
95
|
+
viewerPresentationRegistry.register(contribution);
|
|
96
|
+
}
|
|
97
|
+
const lazyComponents = new WeakMap();
|
|
98
|
+
function resolvePresentationComponent(loader) {
|
|
99
|
+
const cached = lazyComponents.get(loader);
|
|
100
|
+
if (cached)
|
|
101
|
+
return cached;
|
|
102
|
+
const component = lazy(loader);
|
|
103
|
+
lazyComponents.set(loader, component);
|
|
104
|
+
return component;
|
|
105
|
+
}
|
|
106
|
+
function RegisteredViewerPresentation({ contribution, }) {
|
|
107
|
+
const Component = resolvePresentationComponent(contribution.component);
|
|
108
|
+
return (_jsx(ErrorBoundary, { fallback: null, scope: `presentation:${contribution.id}`, children: _jsx(Suspense, { fallback: null, children: _jsx(Component, {}) }) }));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Mounts registered presentation-only R3F subtrees for the current project.
|
|
112
|
+
* Hosts place this once inside each Viewer they want to include presentation;
|
|
113
|
+
* semantic scene export remains isolated because the mount is a sibling of
|
|
114
|
+
* `scene-renderer`, not one of its authored descendants.
|
|
115
|
+
*/
|
|
116
|
+
export function ViewerPresentations() {
|
|
117
|
+
const contributions = useSyncExternalStore(viewerPresentationRegistry.subscribe, viewerPresentationRegistry.getSnapshot, viewerPresentationRegistry.getSnapshot);
|
|
118
|
+
const installedPlugins = useScene((state) => state.installedPlugins);
|
|
119
|
+
return contributions.map((contribution) => contribution.pluginId && !installedPlugins.includes(contribution.pluginId) ? null : (_jsx(RegisteredViewerPresentation, { contribution: contribution }, contribution.id)));
|
|
120
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-render when dynamic library materials (un)register — AI-generated
|
|
3
|
+
* `library:mtl_*` presets arrive after mount, and material caches keyed on
|
|
4
|
+
* ref-resolution signatures must recompute once they land.
|
|
5
|
+
*/
|
|
6
|
+
export declare function useLibraryMaterialsVersion(): number;
|
|
7
|
+
//# sourceMappingURL=use-library-materials-version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-library-materials-version.d.ts","sourceRoot":"","sources":["../../src/hooks/use-library-materials-version.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAMnD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { getLibraryMaterialsVersion, subscribeLibraryMaterials } from '@pascal-app/core';
|
|
2
|
+
import { useSyncExternalStore } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Re-render when dynamic library materials (un)register — AI-generated
|
|
5
|
+
* `library:mtl_*` presets arrive after mount, and material caches keyed on
|
|
6
|
+
* ref-resolution signatures must recompute once they land.
|
|
7
|
+
*/
|
|
8
|
+
export function useLibraryMaterialsVersion() {
|
|
9
|
+
return useSyncExternalStore(subscribeLibraryMaterials, getLibraryMaterialsVersion, getLibraryMaterialsVersion);
|
|
10
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-node-events.d.ts","sourceRoot":"","sources":["../../src/hooks/use-node-events.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,WAAW,EAIjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAQpD,KAAK,UAAU,CAAC,CAAC,SAAS,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,CAAA;AAEtE,wBAAgB,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"use-node-events.d.ts","sourceRoot":"","sources":["../../src/hooks/use-node-events.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,WAAW,EAIjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAQpD,KAAK,UAAU,CAAC,CAAC,SAAS,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,CAAA;AAEtE,wBAAgB,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;uBAyC1D,UAAU,CAAC,YAAY,CAAC;qBAK1B,UAAU,CAAC,YAAY,CAAC;kBAQ3B,UAAU,CAAC,YAAY,CAAC;wBAIlB,UAAU,CAAC,YAAY,CAAC;wBAIxB,UAAU,CAAC,YAAY,CAAC;uBAIzB,UAAU,CAAC,YAAY,CAAC;uBAIxB,UAAU,CAAC,YAAY,CAAC;uBAIxB,UAAU,CAAC,YAAY,CAAC;EAK9C"}
|
|
@@ -18,6 +18,7 @@ export function useNodeEvents(node, type) {
|
|
|
18
18
|
// keys; the `as never` cast lets us emit a kind-specific payload
|
|
19
19
|
// through that generic surface without enumerating every kind.
|
|
20
20
|
emitter.emit(eventKey, payload);
|
|
21
|
+
emitter.emit(`node:${suffix}`, payload);
|
|
21
22
|
};
|
|
22
23
|
// Camera drags (orbit / pan / dolly) suppress ALL node pointer events.
|
|
23
24
|
//
|
package/dist/index.d.ts
CHANGED
|
@@ -9,29 +9,41 @@ export { type GlbHover, type GlbIdentity, type GlbLevel, GlbScene, type GlbWalkt
|
|
|
9
9
|
export { CROUCH_CAPSULE, CROUCH_EYE_OFFSET, CROUCH_FLOAT_HEIGHT, CROUCH_RUN_SPEED, CROUCH_WALK_SPEED, EYE_LERP_SPEED, GlbWalkthroughController, STAND_CAPSULE, STAND_CLEARANCE, STAND_FLOAT_HEIGHT, WALKTHROUGH_FOV, } from './components/viewer/glb-walkthrough-controller';
|
|
10
10
|
export type { HoverStyle, HoverStyles } from './components/viewer/post-processing';
|
|
11
11
|
export { DEFAULT_HOVER_STYLES, SSGI_PARAMS, } from './components/viewer/post-processing';
|
|
12
|
+
export { SceneAtmosphere, type SceneAtmosphereSource, useSceneAtmosphere, } from './components/viewer/scene-atmosphere';
|
|
12
13
|
export { SceneEnvironment } from './components/viewer/scene-environment';
|
|
14
|
+
export { SceneGroundReplacement, useSceneGroundReplacement, } from './components/viewer/scene-ground-replacement';
|
|
15
|
+
export { isViewerPresentationTextureBorrowed, markViewerPresentationTextureBorrowed, registerViewerPresentation, type ViewerPresentationConfiguration, type ViewerPresentationContribution, type ViewerPresentationExportContext, type ViewerPresentationStaticExport, ViewerPresentations, viewerPresentationRegistry, } from './components/viewer/viewer-presentations';
|
|
13
16
|
export { useAssetUrl } from './hooks/use-asset-url';
|
|
14
17
|
export { useGLTFKTX2 } from './hooks/use-gltf-ktx2';
|
|
18
|
+
export { useLibraryMaterialsVersion } from './hooks/use-library-materials-version';
|
|
15
19
|
export { useNodeEvents } from './hooks/use-node-events';
|
|
16
20
|
export { ASSETS_CDN_URL, resolveAssetUrl, resolveCdnUrl } from './lib/asset-url';
|
|
17
21
|
export { backdropGradient, deepSkyColor, horizonHazeColor } from './lib/backdrop';
|
|
18
22
|
export { applyWorldScaleBoxUVs } from './lib/box-uv';
|
|
19
23
|
export { ADDITION, Brush, computeGeometryBoundsTree, csgEvaluator, csgGeometry, csgMaterials, INTERSECTION, prepareBrushForCSG, SUBTRACTION, } from './lib/csg-utils';
|
|
24
|
+
export { disposeObject3DResources } from './lib/dispose-object3d';
|
|
20
25
|
export type { EdgeMode } from './lib/edge-style';
|
|
26
|
+
export { PERF_OVERLAY_ENABLED } from './lib/gpu-perf';
|
|
21
27
|
export { computeHeroFraming, DEFAULT_FRAMING_EXCLUDED_TYPES, type HeroFraming, heroCameraPose, temporarilyHideNodeTypes, unionRegisteredNodeBounds, } from './lib/hero-pose';
|
|
22
28
|
export { applyIsolation, clearIsolation, collectIsolationSubtree, isIsolationActive, } from './lib/isolation';
|
|
23
29
|
export { configureKtx2Support, ensureKtx2Support } from './lib/ktx2-loader';
|
|
24
|
-
export {
|
|
25
|
-
export {
|
|
30
|
+
export { LayerPassIndex } from './lib/layer-pass';
|
|
31
|
+
export { BATCHED_LAYER, GRID_LAYER, OVERLAY_LAYER, SCENE_LAYER, SHADOW_ONLY_LAYER, setSurfaceRaycastLayers, ZONE_LAYER, } from './lib/layers';
|
|
32
|
+
export { applyMaterialPresetToMaterials, BLUEPRINT_PALETTE, baseMaterial, CLAY_PALETTE, type ColorPreset, clearMaterialCache, createDefaultMaterial, createMaterial, 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, glassMaterial, MONO_PALETTE, PRESET_PALETTES, type RenderShading, registerMaterialCacheCleanup, resolveMaterialRef, resolveSlotDefaultMaterial, resolveSurfaceColor, WHITE_PALETTE, } from './lib/materials';
|
|
26
33
|
export { mergedOutline } from './lib/merged-outline-node';
|
|
27
|
-
export
|
|
34
|
+
export * from './lib/perf-actions';
|
|
35
|
+
export { type PerfBatchStats, publishPerfBatchStats } from './lib/perf-panel-store';
|
|
36
|
+
export * from './lib/perf-tracks';
|
|
37
|
+
export { markPureRaycast } from './lib/pointer-events';
|
|
38
|
+
export { detectRendererCapability, initializeGpuRenderer, type RendererBackendParameters, type RendererCapability, type RendererCapabilityCanvas, type RendererInitializationResult, type RendererPowerPreference, } from './lib/renderer-capability';
|
|
28
39
|
export { getSceneTheme, SCENE_THEME_IDS, SCENE_THEMES, type SceneTheme, } from './lib/scene-themes';
|
|
29
|
-
export {
|
|
40
|
+
export { type HiddenReason, hideFromScene, showInScene, temporarilyShowShadowOnly, } from './lib/scene-visibility';
|
|
41
|
+
export { createSnapshotPipeline, SNAPSHOT_MAX_EDGE, SNAPSHOT_MIME, SNAPSHOT_QUALITY, type SnapshotCaptureMode, type SnapshotCaptureResult, type SnapshotCropRegion, type SnapshotPipeline, type SnapshotSize, THUMBNAIL_HEIGHT, THUMBNAIL_WIDTH, } from './lib/snapshot-pipeline';
|
|
30
42
|
export { buildTerrainPerimeterFillGeometry, type TerrainPerimeterPoint, } from './lib/terrain-perimeter-fill';
|
|
31
43
|
export { getPascalTextureRef, type PascalTextureColorSpace, type PascalTextureMap, type PascalTextureRef, stampPascalTextureRef, textureMapForSlot, } from './lib/texture-reference';
|
|
32
44
|
export { packNormalToRGB, unpackRGBToNormal } from './lib/tsl-compat';
|
|
33
45
|
export { useItemLightPool } from './store/use-item-light-pool';
|
|
34
|
-
export { applyCountryUnitDefault, default as useViewer, type MetricNotation, } from './store/use-viewer';
|
|
46
|
+
export { applyCountryUnitDefault, default as useViewer, type MetricNotation, type WallMode, } from './store/use-viewer';
|
|
35
47
|
export { CeilingSystem } from './systems/ceiling/ceiling-system';
|
|
36
48
|
export { createColumnBoxGeometry, createColumnCylinderGeometry, createColumnSphereGeometry, createColumnTorusGeometry, } from './systems/column/column-geometry';
|
|
37
49
|
export { DoorAnimationSystem } from './systems/door/door-animation-system';
|
|
@@ -44,7 +56,7 @@ export { InteractiveSystem } from './systems/interactive/interactive-system';
|
|
|
44
56
|
export { ItemSystem } from './systems/item/item-system';
|
|
45
57
|
export { ItemLightSystem } from './systems/item-light/item-light-system';
|
|
46
58
|
export { LevelSystem } from './systems/level/level-system';
|
|
47
|
-
export { snapLevelsToTruePositions } from './systems/level/level-utils';
|
|
59
|
+
export { EXPLODED_GAP, getLevelPresentationY, snapLevelsToTruePositions, } from './systems/level/level-utils';
|
|
48
60
|
export { getRoofMaterialArray } from './systems/roof/roof-materials';
|
|
49
61
|
export { clipGeometryBySegmentTrim, generateRoofSegmentGeometry, getRoofOuterSurfaceFrameAtPoint, getRoofSegmentBrushes, mapRoofGroupMaterialIndex, ROOF_MATERIAL_SLOT_COUNT, RoofSystem, remapRoofShellFaces, roofCsgDummyMats, type SurfaceFrame, } from './systems/roof/roof-system';
|
|
50
62
|
export { ScanSystem } from './systems/scan/scan-system';
|
|
@@ -52,9 +64,9 @@ export { generateSlabGeometry } from './systems/slab/slab-system';
|
|
|
52
64
|
export { getStairBodyMaterials, getStairRailingMaterial, getStraightStairSegmentBodyMaterials, type StairBodyMaterials, } from './systems/stair/stair-materials';
|
|
53
65
|
export { StairSystem } from './systems/stair/stair-system';
|
|
54
66
|
export { buildOpeningCutoutGeometry, getOpeningCutoutBottomPadding, hasFlatOpeningCutoutBottom, } from './systems/wall/opening-cutout-geometry';
|
|
55
|
-
export { WallCutout } from './systems/wall/wall-cutout';
|
|
67
|
+
export { getWallHideState, WallCutout } from './systems/wall/wall-cutout';
|
|
56
68
|
export { getVisibleWallMaterials } from './systems/wall/wall-materials';
|
|
57
|
-
export { WallSystem } from './systems/wall/wall-system';
|
|
69
|
+
export { drainRebuiltWalls, getPendingWallRebuildCount, isWallInitialBuildActive, WallSystem, } from './systems/wall/wall-system';
|
|
58
70
|
export { poseWindowMovingParts, WindowAnimationSystem, } from './systems/window/window-animation-system';
|
|
59
71
|
export { buildWindowPreviewMesh, WindowSystem } from './systems/window/window-system';
|
|
60
72
|
export { ZoneSystem } from './systems/zone/zone-system';
|
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;AACnE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAO,EACL,KAAK,YAAY,EACjB,OAAO,IAAI,SAAS,EACpB,KAAK,aAAa,GACnB,MAAM,gCAAgC,CAAA;AACvC,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,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,QAAQ,EACR,KAAK,cAAc,GACpB,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,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAA;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAChF,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAIpD,OAAO,EACL,QAAQ,EACR,KAAK,EACL,yBAAyB,EACzB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,WAAW,GACZ,MAAM,iBAAiB,CAAA;AACxB,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EACL,kBAAkB,EAClB,8BAA8B,EAC9B,KAAK,WAAW,EAChB,cAAc,EACd,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,cAAc,EACd,cAAc,EACd,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC3E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|