@pascal-app/viewer 1.0.0-beta.5 → 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.
Files changed (190) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -0
  3. package/dist/capture/asset-url.d.ts +2 -0
  4. package/dist/capture/asset-url.d.ts.map +1 -0
  5. package/dist/capture/asset-url.js +13 -0
  6. package/dist/capture/capture-runtime.d.ts +43 -0
  7. package/dist/capture/capture-runtime.d.ts.map +1 -0
  8. package/dist/capture/capture-runtime.js +228 -0
  9. package/dist/capture/frame.d.ts +4 -0
  10. package/dist/capture/frame.d.ts.map +1 -0
  11. package/dist/capture/frame.js +21 -0
  12. package/dist/capture/index.d.ts +12 -0
  13. package/dist/capture/index.d.ts.map +1 -0
  14. package/dist/capture/index.js +11 -0
  15. package/dist/capture/layer-visibility.d.ts +5 -0
  16. package/dist/capture/layer-visibility.d.ts.map +1 -0
  17. package/dist/capture/layer-visibility.js +11 -0
  18. package/dist/capture/layers/clay-matcap.d.ts +3 -0
  19. package/dist/capture/layers/clay-matcap.d.ts.map +1 -0
  20. package/dist/capture/layers/clay-matcap.js +26 -0
  21. package/dist/capture/layers/device-motion-layer.d.ts +7 -0
  22. package/dist/capture/layers/device-motion-layer.d.ts.map +1 -0
  23. package/dist/capture/layers/device-motion-layer.js +78 -0
  24. package/dist/capture/layers/point-cloud-layer.d.ts +15 -0
  25. package/dist/capture/layers/point-cloud-layer.d.ts.map +1 -0
  26. package/dist/capture/layers/point-cloud-layer.js +106 -0
  27. package/dist/capture/layers/room-model-layer.d.ts +9 -0
  28. package/dist/capture/layers/room-model-layer.d.ts.map +1 -0
  29. package/dist/capture/layers/room-model-layer.js +71 -0
  30. package/dist/capture/layers/surface-mesh-data.d.ts +9 -0
  31. package/dist/capture/layers/surface-mesh-data.d.ts.map +1 -0
  32. package/dist/capture/layers/surface-mesh-data.js +74 -0
  33. package/dist/capture/layers/surface-mesh-layer.d.ts +7 -0
  34. package/dist/capture/layers/surface-mesh-layer.d.ts.map +1 -0
  35. package/dist/capture/layers/surface-mesh-layer.js +16 -0
  36. package/dist/capture/preview.d.ts +3 -0
  37. package/dist/capture/preview.d.ts.map +1 -0
  38. package/dist/capture/preview.js +2 -0
  39. package/dist/capture/source-state.d.ts +22 -0
  40. package/dist/capture/source-state.d.ts.map +1 -0
  41. package/dist/capture/source-state.js +182 -0
  42. package/dist/capture/stream-rendering.d.ts +14 -0
  43. package/dist/capture/stream-rendering.d.ts.map +1 -0
  44. package/dist/capture/stream-rendering.js +69 -0
  45. package/dist/capture/trajectory.d.ts +20 -0
  46. package/dist/capture/trajectory.d.ts.map +1 -0
  47. package/dist/capture/trajectory.js +77 -0
  48. package/dist/components/viewer/batched-mesh-spike.d.ts +14 -0
  49. package/dist/components/viewer/batched-mesh-spike.d.ts.map +1 -0
  50. package/dist/components/viewer/batched-mesh-spike.js +64 -0
  51. package/dist/components/viewer/frame-limiter.d.ts.map +1 -1
  52. package/dist/components/viewer/frame-limiter.js +4 -3
  53. package/dist/components/viewer/index.d.ts.map +1 -1
  54. package/dist/components/viewer/index.js +70 -62
  55. package/dist/components/viewer/lights.d.ts.map +1 -1
  56. package/dist/components/viewer/lights.js +123 -89
  57. package/dist/components/viewer/perf-monitor.d.ts +6 -1
  58. package/dist/components/viewer/perf-monitor.d.ts.map +1 -1
  59. package/dist/components/viewer/perf-monitor.js +307 -116
  60. package/dist/components/viewer/perf-panel.d.ts +3 -0
  61. package/dist/components/viewer/perf-panel.d.ts.map +1 -0
  62. package/dist/components/viewer/perf-panel.js +178 -0
  63. package/dist/components/viewer/pointer-raycast-layers.d.ts +15 -0
  64. package/dist/components/viewer/pointer-raycast-layers.d.ts.map +1 -0
  65. package/dist/components/viewer/pointer-raycast-layers.js +28 -0
  66. package/dist/components/viewer/post-processing.d.ts.map +1 -1
  67. package/dist/components/viewer/post-processing.js +124 -83
  68. package/dist/components/viewer/registered-systems.d.ts +14 -5
  69. package/dist/components/viewer/registered-systems.d.ts.map +1 -1
  70. package/dist/components/viewer/registered-systems.js +22 -10
  71. package/dist/components/viewer/scene-atmosphere.d.ts +30 -0
  72. package/dist/components/viewer/scene-atmosphere.d.ts.map +1 -0
  73. package/dist/components/viewer/scene-atmosphere.js +89 -0
  74. package/dist/components/viewer/scene-environment.d.ts.map +1 -1
  75. package/dist/components/viewer/scene-environment.js +19 -5
  76. package/dist/components/viewer/scene-ground-replacement.d.ts +5 -0
  77. package/dist/components/viewer/scene-ground-replacement.d.ts.map +1 -0
  78. package/dist/components/viewer/scene-ground-replacement.js +35 -0
  79. package/dist/components/viewer/viewer-camera.d.ts.map +1 -1
  80. package/dist/components/viewer/viewer-camera.js +4 -1
  81. package/dist/components/viewer/viewer-presentations.d.ts +67 -0
  82. package/dist/components/viewer/viewer-presentations.d.ts.map +1 -0
  83. package/dist/components/viewer/viewer-presentations.js +120 -0
  84. package/dist/hooks/use-library-materials-version.d.ts +7 -0
  85. package/dist/hooks/use-library-materials-version.d.ts.map +1 -0
  86. package/dist/hooks/use-library-materials-version.js +10 -0
  87. package/dist/hooks/use-node-events.d.ts.map +1 -1
  88. package/dist/hooks/use-node-events.js +1 -0
  89. package/dist/index.d.ts +15 -6
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +15 -6
  92. package/dist/lib/csg-utils.d.ts +1 -0
  93. package/dist/lib/csg-utils.d.ts.map +1 -1
  94. package/dist/lib/csg-utils.js +6 -1
  95. package/dist/lib/gpu-perf.d.ts +0 -2
  96. package/dist/lib/gpu-perf.d.ts.map +1 -1
  97. package/dist/lib/gpu-perf.js +7 -21
  98. package/dist/lib/layer-pass.d.ts +28 -0
  99. package/dist/lib/layer-pass.d.ts.map +1 -0
  100. package/dist/lib/layer-pass.js +254 -0
  101. package/dist/lib/materials.d.ts +12 -0
  102. package/dist/lib/materials.d.ts.map +1 -1
  103. package/dist/lib/materials.js +51 -17
  104. package/dist/lib/merged-outline-node.d.ts +17 -8
  105. package/dist/lib/merged-outline-node.d.ts.map +1 -1
  106. package/dist/lib/merged-outline-node.js +194 -52
  107. package/dist/lib/perf-actions.d.ts +55 -0
  108. package/dist/lib/perf-actions.d.ts.map +1 -0
  109. package/dist/lib/perf-actions.js +211 -0
  110. package/dist/lib/perf-observers.d.ts +2 -0
  111. package/dist/lib/perf-observers.d.ts.map +1 -0
  112. package/dist/lib/perf-observers.js +17 -0
  113. package/dist/lib/perf-panel-store.d.ts +71 -0
  114. package/dist/lib/perf-panel-store.d.ts.map +1 -0
  115. package/dist/lib/perf-panel-store.js +29 -0
  116. package/dist/lib/perf-tracks.d.ts +43 -0
  117. package/dist/lib/perf-tracks.d.ts.map +1 -0
  118. package/dist/lib/perf-tracks.js +113 -0
  119. package/dist/lib/pointer-events.d.ts +7 -0
  120. package/dist/lib/pointer-events.d.ts.map +1 -0
  121. package/dist/lib/pointer-events.js +680 -0
  122. package/dist/lib/post-processing-resources.d.ts +12 -0
  123. package/dist/lib/post-processing-resources.d.ts.map +1 -0
  124. package/dist/lib/post-processing-resources.js +19 -0
  125. package/dist/lib/renderer-capability.d.ts.map +1 -1
  126. package/dist/lib/renderer-capability.js +4 -2
  127. package/dist/lib/scene-visibility.d.ts +2 -1
  128. package/dist/lib/scene-visibility.d.ts.map +1 -1
  129. package/dist/lib/scene-visibility.js +22 -1
  130. package/dist/store/use-viewer.d.ts +2 -2
  131. package/dist/store/use-viewer.d.ts.map +1 -1
  132. package/dist/systems/ceiling/ceiling-system.js +1 -1
  133. package/dist/systems/door/door-animation-system.d.ts.map +1 -1
  134. package/dist/systems/door/door-animation-system.js +6 -9
  135. package/dist/systems/door/door-system.d.ts.map +1 -1
  136. package/dist/systems/door/door-system.js +13 -2
  137. package/dist/systems/geometry/geometry-system.d.ts.map +1 -1
  138. package/dist/systems/geometry/geometry-system.js +3 -2
  139. package/dist/systems/level/level-system.d.ts.map +1 -1
  140. package/dist/systems/level/level-system.js +1 -1
  141. package/dist/systems/level/level-utils.d.ts +9 -0
  142. package/dist/systems/level/level-utils.d.ts.map +1 -1
  143. package/dist/systems/level/level-utils.js +14 -0
  144. package/dist/systems/perf-action-settle/perf-action-settle-system.d.ts +8 -0
  145. package/dist/systems/perf-action-settle/perf-action-settle-system.d.ts.map +1 -0
  146. package/dist/systems/perf-action-settle/perf-action-settle-system.js +32 -0
  147. package/dist/systems/roof/roof-system.d.ts.map +1 -1
  148. package/dist/systems/roof/roof-system.js +1196 -58
  149. package/dist/systems/scan/scan-system.js +6 -5
  150. package/dist/systems/slab/slab-system.d.ts.map +1 -1
  151. package/dist/systems/slab/slab-system.js +1 -2
  152. package/dist/systems/stair/stair-system.d.ts.map +1 -1
  153. package/dist/systems/stair/stair-system.js +9 -8
  154. package/dist/systems/surface-hole-geometry.d.ts +1 -1
  155. package/dist/systems/surface-hole-geometry.d.ts.map +1 -1
  156. package/dist/systems/surface-hole-geometry.js +1 -1
  157. package/dist/systems/wall/level-miter-cache.d.ts.map +1 -1
  158. package/dist/systems/wall/wall-build-lifecycle.d.ts +9 -0
  159. package/dist/systems/wall/wall-build-lifecycle.d.ts.map +1 -0
  160. package/dist/systems/wall/wall-build-lifecycle.js +74 -0
  161. package/dist/systems/wall/wall-cutout-cache.d.ts +57 -0
  162. package/dist/systems/wall/wall-cutout-cache.d.ts.map +1 -0
  163. package/dist/systems/wall/wall-cutout-cache.js +304 -0
  164. package/dist/systems/wall/wall-cutout.d.ts +12 -1
  165. package/dist/systems/wall/wall-cutout.d.ts.map +1 -1
  166. package/dist/systems/wall/wall-cutout.js +24 -161
  167. package/dist/systems/wall/wall-material-variant.d.ts +31 -0
  168. package/dist/systems/wall/wall-material-variant.d.ts.map +1 -0
  169. package/dist/systems/wall/wall-material-variant.js +10 -0
  170. package/dist/systems/wall/wall-materials.d.ts +6 -0
  171. package/dist/systems/wall/wall-materials.d.ts.map +1 -1
  172. package/dist/systems/wall/wall-materials.js +29 -13
  173. package/dist/systems/wall/wall-placeholder-sweep.d.ts +50 -0
  174. package/dist/systems/wall/wall-placeholder-sweep.d.ts.map +1 -0
  175. package/dist/systems/wall/wall-placeholder-sweep.js +51 -0
  176. package/dist/systems/wall/wall-rebuild-notifications.d.ts +5 -0
  177. package/dist/systems/wall/wall-rebuild-notifications.d.ts.map +1 -0
  178. package/dist/systems/wall/wall-rebuild-notifications.js +23 -0
  179. package/dist/systems/wall/wall-system.d.ts +11 -4
  180. package/dist/systems/wall/wall-system.d.ts.map +1 -1
  181. package/dist/systems/wall/wall-system.js +405 -153
  182. package/dist/systems/window/window-animation-system.d.ts.map +1 -1
  183. package/dist/systems/window/window-animation-system.js +9 -8
  184. package/dist/systems/window/window-system.d.ts +1 -0
  185. package/dist/systems/window/window-system.d.ts.map +1 -1
  186. package/dist/systems/window/window-system.js +16 -2
  187. package/package.json +17 -4
  188. package/dist/lib/polygon-union.d.ts +0 -4
  189. package/dist/lib/polygon-union.d.ts.map +0 -1
  190. package/dist/lib/polygon-union.js +0 -289
@@ -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":"AAmEA,wBAAgB,gBAAgB,SAkB/B"}
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 = prevEnvironment;
74
- scene.environmentIntensity = prevIntensity;
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, appearance]);
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":"viewer-camera.d.ts","sourceRoot":"","sources":["../../../src/components/viewer/viewer-camera.tsx"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,mCAQxB,CAAA"}
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
- return cameraMode === 'perspective' ? (_jsx(PerspectiveCamera, { far: 1000, 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
+ // 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;uBAwC1D,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"}
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,9 +9,13 @@ 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';
@@ -19,16 +23,21 @@ export { applyWorldScaleBoxUVs } from './lib/box-uv';
19
23
  export { ADDITION, Brush, computeGeometryBoundsTree, csgEvaluator, csgGeometry, csgMaterials, INTERSECTION, prepareBrushForCSG, SUBTRACTION, } from './lib/csg-utils';
20
24
  export { disposeObject3DResources } from './lib/dispose-object3d';
21
25
  export type { EdgeMode } from './lib/edge-style';
26
+ export { PERF_OVERLAY_ENABLED } from './lib/gpu-perf';
22
27
  export { computeHeroFraming, DEFAULT_FRAMING_EXCLUDED_TYPES, type HeroFraming, heroCameraPose, temporarilyHideNodeTypes, unionRegisteredNodeBounds, } from './lib/hero-pose';
23
28
  export { applyIsolation, clearIsolation, collectIsolationSubtree, isIsolationActive, } from './lib/isolation';
24
29
  export { configureKtx2Support, ensureKtx2Support } from './lib/ktx2-loader';
25
- export { BATCHED_LAYER, GRID_LAYER, OVERLAY_LAYER, SCENE_LAYER, setSurfaceRaycastLayers, ZONE_LAYER, } from './lib/layers';
26
- 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, resolveMaterialRef, resolveSlotDefaultMaterial, resolveSurfaceColor, WHITE_PALETTE, } from './lib/materials';
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';
27
33
  export { mergedOutline } from './lib/merged-outline-node';
28
- export { unionPolygons } from './lib/polygon-union';
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';
29
38
  export { detectRendererCapability, initializeGpuRenderer, type RendererBackendParameters, type RendererCapability, type RendererCapabilityCanvas, type RendererInitializationResult, type RendererPowerPreference, } from './lib/renderer-capability';
30
39
  export { getSceneTheme, SCENE_THEME_IDS, SCENE_THEMES, type SceneTheme, } from './lib/scene-themes';
31
- export { type HiddenReason, hideFromScene, showInScene } from './lib/scene-visibility';
40
+ export { type HiddenReason, hideFromScene, showInScene, temporarilyShowShadowOnly, } from './lib/scene-visibility';
32
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';
33
42
  export { buildTerrainPerimeterFillGeometry, type TerrainPerimeterPoint, } from './lib/terrain-perimeter-fill';
34
43
  export { getPascalTextureRef, type PascalTextureColorSpace, type PascalTextureMap, type PascalTextureRef, stampPascalTextureRef, textureMapForSlot, } from './lib/texture-reference';
@@ -47,7 +56,7 @@ export { InteractiveSystem } from './systems/interactive/interactive-system';
47
56
  export { ItemSystem } from './systems/item/item-system';
48
57
  export { ItemLightSystem } from './systems/item-light/item-light-system';
49
58
  export { LevelSystem } from './systems/level/level-system';
50
- export { snapLevelsToTruePositions } from './systems/level/level-utils';
59
+ export { EXPLODED_GAP, getLevelPresentationY, snapLevelsToTruePositions, } from './systems/level/level-utils';
51
60
  export { getRoofMaterialArray } from './systems/roof/roof-materials';
52
61
  export { clipGeometryBySegmentTrim, generateRoofSegmentGeometry, getRoofOuterSurfaceFrameAtPoint, getRoofSegmentBrushes, mapRoofGroupMaterialIndex, ROOF_MATERIAL_SLOT_COUNT, RoofSystem, remapRoofShellFaces, roofCsgDummyMats, type SurfaceFrame, } from './systems/roof/roof-system';
53
62
  export { ScanSystem } from './systems/scan/scan-system';
@@ -57,7 +66,7 @@ export { StairSystem } from './systems/stair/stair-system';
57
66
  export { buildOpeningCutoutGeometry, getOpeningCutoutBottomPadding, hasFlatOpeningCutoutBottom, } from './systems/wall/opening-cutout-geometry';
58
67
  export { getWallHideState, WallCutout } from './systems/wall/wall-cutout';
59
68
  export { getVisibleWallMaterials } from './systems/wall/wall-materials';
60
- export { drainRebuiltWalls, getPendingWallRebuildCount, WallSystem, } from './systems/wall/wall-system';
69
+ export { drainRebuiltWalls, getPendingWallRebuildCount, isWallInitialBuildActive, WallSystem, } from './systems/wall/wall-system';
61
70
  export { poseWindowMovingParts, WindowAnimationSystem, } from './systems/window/window-animation-system';
62
71
  export { buildWindowPreviewMesh, WindowSystem } from './systems/window/window-system';
63
72
  export { ZoneSystem } from './systems/zone/zone-system';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -17,9 +17,13 @@ export { buildGlbReferenceNodes, buildGlbReplaceNodes, } from './components/view
17
17
  export { GlbScene, } from './components/viewer/glb-scene';
18
18
  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';
19
19
  export { DEFAULT_HOVER_STYLES, SSGI_PARAMS, } from './components/viewer/post-processing';
20
+ export { SceneAtmosphere, useSceneAtmosphere, } from './components/viewer/scene-atmosphere';
20
21
  export { SceneEnvironment } from './components/viewer/scene-environment';
22
+ export { SceneGroundReplacement, useSceneGroundReplacement, } from './components/viewer/scene-ground-replacement';
23
+ export { isViewerPresentationTextureBorrowed, markViewerPresentationTextureBorrowed, registerViewerPresentation, ViewerPresentations, viewerPresentationRegistry, } from './components/viewer/viewer-presentations';
21
24
  export { useAssetUrl } from './hooks/use-asset-url';
22
25
  export { useGLTFKTX2 } from './hooks/use-gltf-ktx2';
26
+ export { useLibraryMaterialsVersion } from './hooks/use-library-materials-version';
23
27
  export { useNodeEvents } from './hooks/use-node-events';
24
28
  export { ASSETS_CDN_URL, resolveAssetUrl, resolveCdnUrl } from './lib/asset-url';
25
29
  export { backdropGradient, deepSkyColor, horizonHazeColor } from './lib/backdrop';
@@ -29,16 +33,21 @@ export { applyWorldScaleBoxUVs } from './lib/box-uv';
29
33
  // because three-bvh-csg / three-mesh-bvh are viewer-only deps.
30
34
  export { ADDITION, Brush, computeGeometryBoundsTree, csgEvaluator, csgGeometry, csgMaterials, INTERSECTION, prepareBrushForCSG, SUBTRACTION, } from './lib/csg-utils';
31
35
  export { disposeObject3DResources } from './lib/dispose-object3d';
36
+ export { PERF_OVERLAY_ENABLED } from './lib/gpu-perf';
32
37
  export { computeHeroFraming, DEFAULT_FRAMING_EXCLUDED_TYPES, heroCameraPose, temporarilyHideNodeTypes, unionRegisteredNodeBounds, } from './lib/hero-pose';
33
38
  export { applyIsolation, clearIsolation, collectIsolationSubtree, isIsolationActive, } from './lib/isolation';
34
39
  export { configureKtx2Support, ensureKtx2Support } from './lib/ktx2-loader';
35
- export { BATCHED_LAYER, GRID_LAYER, OVERLAY_LAYER, SCENE_LAYER, setSurfaceRaycastLayers, ZONE_LAYER, } from './lib/layers';
36
- export { applyMaterialPresetToMaterials, BLUEPRINT_PALETTE, baseMaterial, CLAY_PALETTE, 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, resolveMaterialRef, resolveSlotDefaultMaterial, resolveSurfaceColor, WHITE_PALETTE, } from './lib/materials';
40
+ export { LayerPassIndex } from './lib/layer-pass';
41
+ export { BATCHED_LAYER, GRID_LAYER, OVERLAY_LAYER, SCENE_LAYER, SHADOW_ONLY_LAYER, setSurfaceRaycastLayers, ZONE_LAYER, } from './lib/layers';
42
+ export { applyMaterialPresetToMaterials, BLUEPRINT_PALETTE, baseMaterial, CLAY_PALETTE, 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, registerMaterialCacheCleanup, resolveMaterialRef, resolveSlotDefaultMaterial, resolveSurfaceColor, WHITE_PALETTE, } from './lib/materials';
37
43
  export { mergedOutline } from './lib/merged-outline-node';
38
- export { unionPolygons } from './lib/polygon-union';
44
+ export * from './lib/perf-actions';
45
+ export { publishPerfBatchStats } from './lib/perf-panel-store';
46
+ export * from './lib/perf-tracks';
47
+ export { markPureRaycast } from './lib/pointer-events';
39
48
  export { detectRendererCapability, initializeGpuRenderer, } from './lib/renderer-capability';
40
49
  export { getSceneTheme, SCENE_THEME_IDS, SCENE_THEMES, } from './lib/scene-themes';
41
- export { hideFromScene, showInScene } from './lib/scene-visibility';
50
+ export { hideFromScene, showInScene, temporarilyShowShadowOnly, } from './lib/scene-visibility';
42
51
  export { createSnapshotPipeline, SNAPSHOT_MAX_EDGE, SNAPSHOT_MIME, SNAPSHOT_QUALITY, THUMBNAIL_HEIGHT, THUMBNAIL_WIDTH, } from './lib/snapshot-pipeline';
43
52
  export { buildTerrainPerimeterFillGeometry, } from './lib/terrain-perimeter-fill';
44
53
  export { getPascalTextureRef, stampPascalTextureRef, textureMapForSlot, } from './lib/texture-reference';
@@ -67,7 +76,7 @@ export { InteractiveSystem } from './systems/interactive/interactive-system';
67
76
  export { ItemSystem } from './systems/item/item-system';
68
77
  export { ItemLightSystem } from './systems/item-light/item-light-system';
69
78
  export { LevelSystem } from './systems/level/level-system';
70
- export { snapLevelsToTruePositions } from './systems/level/level-utils';
79
+ export { EXPLODED_GAP, getLevelPresentationY, snapLevelsToTruePositions, } from './systems/level/level-utils';
71
80
  export { getRoofMaterialArray } from './systems/roof/roof-materials';
72
81
  // Generic roof-segment primitives. Kinds that compose CSG against
73
82
  // the roof shell (chimney's self-trim, dormer's virtual-segment cut)
@@ -90,7 +99,7 @@ export { getVisibleWallMaterials } from './systems/wall/wall-materials';
90
99
  // definition can compose them into `def.system` without duplicating the
91
100
  // 800+ lines of CSG / mitering logic during Phase 3. These exports are
92
101
  // removed in Phase 6 when the legacy mount points are deleted.
93
- export { drainRebuiltWalls, getPendingWallRebuildCount, WallSystem, } from './systems/wall/wall-system';
102
+ export { drainRebuiltWalls, getPendingWallRebuildCount, isWallInitialBuildActive, WallSystem, } from './systems/wall/wall-system';
94
103
  export { poseWindowMovingParts, WindowAnimationSystem, } from './systems/window/window-animation-system';
95
104
  export { buildWindowPreviewMesh, WindowSystem } from './systems/window/window-system';
96
105
  export { ZoneSystem } from './systems/zone/zone-system';
@@ -6,5 +6,6 @@ export declare function csgMaterials(brush: Brush): THREE.Material[];
6
6
  export declare const csgEvaluator: Evaluator;
7
7
  export declare function computeGeometryBoundsTree(geometry: THREE.BufferGeometry): void;
8
8
  export declare function prepareBrushForCSG(brush: Brush): void;
9
+ export declare function subtractCsgBrush(left: Brush, right: Brush, evaluator: Evaluator): Brush;
9
10
  export { ADDITION, Brush, INTERSECTION, SUBTRACTION } from 'three-bvh-csg';
10
11
  //# sourceMappingURL=csg-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"csg-utils.d.ts","sourceRoot":"","sources":["../../src/lib/csg-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,KAAK,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AA4CrD,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,KAAK,CAAC,cAAc,GAC7B,KAAK,CAAC,cAAc,CAoCtB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,cAAc,CAE9D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAG3D;AAED,eAAO,MAAM,YAAY,WAAkB,CAAA;AAK3C,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,QAMvE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,QAI9C;AAID,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"csg-utils.d.ts","sourceRoot":"","sources":["../../src/lib/csg-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,KAAK,KAAK,EAAE,SAAS,EAAe,MAAM,eAAe,CAAA;AA4ClE,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,KAAK,CAAC,cAAc,GAC7B,KAAK,CAAC,cAAc,CAoCtB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,cAAc,CAE9D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAG3D;AAED,eAAO,MAAM,YAAY,WAAkB,CAAA;AAK3C,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,QAMvE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,QAI9C;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,GAAG,KAAK,CAIvF;AAID,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import * as THREE from 'three';
2
- import { Evaluator } from 'three-bvh-csg';
2
+ import { Evaluator, SUBTRACTION } from 'three-bvh-csg';
3
3
  import { computeBoundsTree } from 'three-mesh-bvh';
4
4
  /**
5
5
  * Shared CSG primitives used by kinds whose geometry subtracts pieces
@@ -88,6 +88,11 @@ export function prepareBrushForCSG(brush) {
88
88
  computeGeometryBoundsTree(brush.geometry);
89
89
  brush.updateMatrixWorld();
90
90
  }
91
+ export function subtractCsgBrush(left, right, evaluator) {
92
+ const result = evaluator.evaluate(left, right, SUBTRACTION);
93
+ prepareBrushForCSG(result);
94
+ return result;
95
+ }
91
96
  // Re-export Brush + SUBTRACTION + ADDITION + INTERSECTION so kinds don't need a
92
97
  // direct `three-bvh-csg` dependency.
93
98
  export { ADDITION, Brush, INTERSECTION, SUBTRACTION } from 'three-bvh-csg';