@pascal-app/viewer 0.8.0 → 0.9.1

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 (194) hide show
  1. package/dist/components/renderers/node-renderer.d.ts +1 -1
  2. package/dist/components/renderers/node-renderer.d.ts.map +1 -1
  3. package/dist/components/renderers/node-renderer.js +38 -22
  4. package/dist/components/renderers/parametric-node-renderer.d.ts +5 -0
  5. package/dist/components/renderers/parametric-node-renderer.d.ts.map +1 -0
  6. package/dist/components/renderers/parametric-node-renderer.js +34 -0
  7. package/dist/components/renderers/scene-renderer.d.ts +1 -1
  8. package/dist/components/renderers/scene-renderer.d.ts.map +1 -1
  9. package/dist/components/viewer/ground-occluder.d.ts +1 -1
  10. package/dist/components/viewer/ground-occluder.d.ts.map +1 -1
  11. package/dist/components/viewer/ground-occluder.js +12 -24
  12. package/dist/components/viewer/index.d.ts +37 -1
  13. package/dist/components/viewer/index.d.ts.map +1 -1
  14. package/dist/components/viewer/index.js +186 -63
  15. package/dist/components/viewer/lights.d.ts +1 -1
  16. package/dist/components/viewer/lights.d.ts.map +1 -1
  17. package/dist/components/viewer/lights.js +170 -43
  18. package/dist/components/viewer/perf-monitor.d.ts +1 -1
  19. package/dist/components/viewer/perf-monitor.d.ts.map +1 -1
  20. package/dist/components/viewer/perf-monitor.js +99 -11
  21. package/dist/components/viewer/post-processing.d.ts.map +1 -1
  22. package/dist/components/viewer/post-processing.js +231 -54
  23. package/dist/components/viewer/registered-systems.d.ts +12 -0
  24. package/dist/components/viewer/registered-systems.d.ts.map +1 -0
  25. package/dist/components/viewer/registered-systems.js +47 -0
  26. package/dist/components/viewer/scene-bvh.d.ts +17 -0
  27. package/dist/components/viewer/scene-bvh.d.ts.map +1 -0
  28. package/dist/components/viewer/scene-bvh.js +94 -0
  29. package/dist/components/viewer/selection-manager.d.ts +1 -1
  30. package/dist/components/viewer/selection-manager.d.ts.map +1 -1
  31. package/dist/components/viewer/selection-manager.js +20 -5
  32. package/dist/components/viewer/viewer-camera.d.ts +1 -1
  33. package/dist/components/viewer/viewer-camera.d.ts.map +1 -1
  34. package/dist/components/viewer/walkthrough-controls.d.ts +1 -1
  35. package/dist/components/viewer/walkthrough-controls.d.ts.map +1 -1
  36. package/dist/hooks/use-gltf-ktx2.d.ts.map +1 -1
  37. package/dist/hooks/use-node-events.d.ts +5 -73
  38. package/dist/hooks/use-node-events.d.ts.map +1 -1
  39. package/dist/hooks/use-node-events.js +19 -7
  40. package/dist/index.d.ts +36 -4
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +67 -3
  43. package/dist/lib/csg-utils.d.ts +16 -0
  44. package/dist/lib/csg-utils.d.ts.map +1 -0
  45. package/dist/lib/csg-utils.js +33 -0
  46. package/dist/lib/drawable-geometry.d.ts +21 -0
  47. package/dist/lib/drawable-geometry.d.ts.map +1 -0
  48. package/dist/lib/drawable-geometry.js +22 -0
  49. package/dist/lib/edge-style.d.ts +3 -0
  50. package/dist/lib/edge-style.d.ts.map +1 -0
  51. package/dist/lib/edge-style.js +11 -0
  52. package/dist/lib/gpu-perf.d.ts +4 -0
  53. package/dist/lib/gpu-perf.d.ts.map +1 -0
  54. package/dist/lib/gpu-perf.js +23 -0
  55. package/dist/lib/ink-edges.d.ts +9 -0
  56. package/dist/lib/ink-edges.d.ts.map +1 -0
  57. package/dist/lib/ink-edges.js +43 -0
  58. package/dist/lib/isolation.d.ts +39 -0
  59. package/dist/lib/isolation.d.ts.map +1 -0
  60. package/dist/lib/isolation.js +103 -0
  61. package/dist/lib/layers.d.ts +18 -0
  62. package/dist/lib/layers.d.ts.map +1 -1
  63. package/dist/lib/layers.js +18 -0
  64. package/dist/lib/materials.d.ts +25 -15
  65. package/dist/lib/materials.d.ts.map +1 -1
  66. package/dist/lib/materials.js +277 -62
  67. package/dist/lib/merged-outline-node.d.ts.map +1 -1
  68. package/dist/lib/merged-outline-node.js +7 -0
  69. package/dist/lib/polygon-union.d.ts +4 -0
  70. package/dist/lib/polygon-union.d.ts.map +1 -0
  71. package/dist/lib/polygon-union.js +289 -0
  72. package/dist/lib/polygon-union.test.d.ts +2 -0
  73. package/dist/lib/polygon-union.test.d.ts.map +1 -0
  74. package/dist/lib/polygon-union.test.js +105 -0
  75. package/dist/lib/scene-themes.d.ts +29 -0
  76. package/dist/lib/scene-themes.d.ts.map +1 -0
  77. package/dist/lib/scene-themes.js +193 -0
  78. package/dist/store/use-viewer.d.ts +42 -4
  79. package/dist/store/use-viewer.d.ts.map +1 -1
  80. package/dist/store/use-viewer.js +26 -3
  81. package/dist/systems/ceiling/ceiling-system.d.ts +6 -2
  82. package/dist/systems/ceiling/ceiling-system.d.ts.map +1 -1
  83. package/dist/systems/ceiling/ceiling-system.js +62 -12
  84. package/dist/systems/door/door-system.d.ts.map +1 -1
  85. package/dist/systems/door/door-system.js +373 -22
  86. package/dist/systems/elevator/elevator-interaction-system.d.ts +2 -0
  87. package/dist/systems/elevator/elevator-interaction-system.d.ts.map +1 -0
  88. package/dist/systems/elevator/elevator-interaction-system.js +62 -0
  89. package/dist/systems/fence/fence-system.d.ts +3 -0
  90. package/dist/systems/fence/fence-system.d.ts.map +1 -1
  91. package/dist/systems/fence/fence-system.js +9 -5
  92. package/dist/systems/floor-elevation/floor-elevation-system.d.ts +20 -0
  93. package/dist/systems/floor-elevation/floor-elevation-system.d.ts.map +1 -0
  94. package/dist/systems/floor-elevation/floor-elevation-system.js +78 -0
  95. package/dist/systems/geometry/geometry-system.d.ts +34 -0
  96. package/dist/systems/geometry/geometry-system.d.ts.map +1 -0
  97. package/dist/systems/geometry/geometry-system.js +279 -0
  98. package/dist/systems/interactive/interactive-system.d.ts +1 -1
  99. package/dist/systems/interactive/interactive-system.d.ts.map +1 -1
  100. package/dist/systems/item/item-system.d.ts +7 -0
  101. package/dist/systems/item/item-system.d.ts.map +1 -1
  102. package/dist/systems/item/item-system.js +8 -11
  103. package/dist/systems/item-light/item-light-system.d.ts +1 -1
  104. package/dist/systems/item-light/item-light-system.d.ts.map +1 -1
  105. package/dist/systems/item-light/item-light-system.js +18 -5
  106. package/dist/systems/roof/roof-materials.d.ts +3 -2
  107. package/dist/systems/roof/roof-materials.d.ts.map +1 -1
  108. package/dist/systems/roof/roof-materials.js +38 -14
  109. package/dist/systems/roof/roof-system.d.ts +27 -0
  110. package/dist/systems/roof/roof-system.d.ts.map +1 -1
  111. package/dist/systems/roof/roof-system.js +396 -59
  112. package/dist/systems/slab/slab-system.d.ts.map +1 -1
  113. package/dist/systems/slab/slab-system.js +167 -49
  114. package/dist/systems/slab/slab-system.test.d.ts +2 -0
  115. package/dist/systems/slab/slab-system.test.d.ts.map +1 -0
  116. package/dist/systems/slab/slab-system.test.js +62 -0
  117. package/dist/systems/stair/stair-materials.d.ts +4 -3
  118. package/dist/systems/stair/stair-materials.d.ts.map +1 -1
  119. package/dist/systems/stair/stair-materials.js +30 -15
  120. package/dist/systems/stair/stair-system.d.ts.map +1 -1
  121. package/dist/systems/stair/stair-system.js +50 -61
  122. package/dist/systems/surface-hole-geometry.d.ts +3 -0
  123. package/dist/systems/surface-hole-geometry.d.ts.map +1 -0
  124. package/dist/systems/surface-hole-geometry.js +4 -0
  125. package/dist/systems/wall/wall-cutout.d.ts.map +1 -1
  126. package/dist/systems/wall/wall-cutout.js +18 -2
  127. package/dist/systems/wall/wall-materials.d.ts +4 -3
  128. package/dist/systems/wall/wall-materials.d.ts.map +1 -1
  129. package/dist/systems/wall/wall-materials.js +52 -28
  130. package/dist/systems/wall/wall-system.d.ts.map +1 -1
  131. package/dist/systems/wall/wall-system.js +171 -26
  132. package/dist/systems/window/window-system.d.ts.map +1 -1
  133. package/dist/systems/window/window-system.js +71 -7
  134. package/package.json +3 -4
  135. package/dist/components/renderers/building/building-renderer.d.ts +0 -5
  136. package/dist/components/renderers/building/building-renderer.d.ts.map +0 -1
  137. package/dist/components/renderers/building/building-renderer.js +0 -11
  138. package/dist/components/renderers/ceiling/ceiling-renderer.d.ts +0 -5
  139. package/dist/components/renderers/ceiling/ceiling-renderer.d.ts.map +0 -1
  140. package/dist/components/renderers/ceiling/ceiling-renderer.js +0 -58
  141. package/dist/components/renderers/column/column-renderer.d.ts +0 -5
  142. package/dist/components/renderers/column/column-renderer.d.ts.map +0 -1
  143. package/dist/components/renderers/column/column-renderer.js +0 -597
  144. package/dist/components/renderers/door/door-renderer.d.ts +0 -5
  145. package/dist/components/renderers/door/door-renderer.d.ts.map +0 -1
  146. package/dist/components/renderers/door/door-renderer.js +0 -16
  147. package/dist/components/renderers/fence/fence-renderer.d.ts +0 -5
  148. package/dist/components/renderers/fence/fence-renderer.d.ts.map +0 -1
  149. package/dist/components/renderers/fence/fence-renderer.js +0 -15
  150. package/dist/components/renderers/guide/guide-renderer.d.ts +0 -5
  151. package/dist/components/renderers/guide/guide-renderer.d.ts.map +0 -1
  152. package/dist/components/renderers/guide/guide-renderer.js +0 -38
  153. package/dist/components/renderers/item/item-renderer.d.ts +0 -5
  154. package/dist/components/renderers/item/item-renderer.d.ts.map +0 -1
  155. package/dist/components/renderers/item/item-renderer.js +0 -172
  156. package/dist/components/renderers/level/level-renderer.d.ts +0 -5
  157. package/dist/components/renderers/level/level-renderer.d.ts.map +0 -1
  158. package/dist/components/renderers/level/level-renderer.js +0 -11
  159. package/dist/components/renderers/roof/roof-materials.d.ts +0 -4
  160. package/dist/components/renderers/roof/roof-materials.d.ts.map +0 -1
  161. package/dist/components/renderers/roof/roof-materials.js +0 -16
  162. package/dist/components/renderers/roof/roof-renderer.d.ts +0 -5
  163. package/dist/components/renderers/roof/roof-renderer.d.ts.map +0 -1
  164. package/dist/components/renderers/roof/roof-renderer.js +0 -32
  165. package/dist/components/renderers/roof-segment/roof-segment-renderer.d.ts +0 -5
  166. package/dist/components/renderers/roof-segment/roof-segment-renderer.d.ts.map +0 -1
  167. package/dist/components/renderers/roof-segment/roof-segment-renderer.js +0 -40
  168. package/dist/components/renderers/scan/scan-renderer.d.ts +0 -5
  169. package/dist/components/renderers/scan/scan-renderer.d.ts.map +0 -1
  170. package/dist/components/renderers/scan/scan-renderer.js +0 -54
  171. package/dist/components/renderers/site/site-renderer.d.ts +0 -5
  172. package/dist/components/renderers/site/site-renderer.d.ts.map +0 -1
  173. package/dist/components/renderers/site/site-renderer.js +0 -106
  174. package/dist/components/renderers/slab/slab-renderer.d.ts +0 -5
  175. package/dist/components/renderers/slab/slab-renderer.d.ts.map +0 -1
  176. package/dist/components/renderers/slab/slab-renderer.js +0 -58
  177. package/dist/components/renderers/spawn/spawn-renderer.d.ts +0 -5
  178. package/dist/components/renderers/spawn/spawn-renderer.d.ts.map +0 -1
  179. package/dist/components/renderers/spawn/spawn-renderer.js +0 -32
  180. package/dist/components/renderers/stair/stair-renderer.d.ts +0 -5
  181. package/dist/components/renderers/stair/stair-renderer.d.ts.map +0 -1
  182. package/dist/components/renderers/stair/stair-renderer.js +0 -603
  183. package/dist/components/renderers/stair-segment/stair-segment-renderer.d.ts +0 -5
  184. package/dist/components/renderers/stair-segment/stair-segment-renderer.d.ts.map +0 -1
  185. package/dist/components/renderers/stair-segment/stair-segment-renderer.js +0 -51
  186. package/dist/components/renderers/wall/wall-renderer.d.ts +0 -5
  187. package/dist/components/renderers/wall/wall-renderer.d.ts.map +0 -1
  188. package/dist/components/renderers/wall/wall-renderer.js +0 -16
  189. package/dist/components/renderers/window/window-renderer.d.ts +0 -5
  190. package/dist/components/renderers/window/window-renderer.d.ts.map +0 -1
  191. package/dist/components/renderers/window/window-renderer.js +0 -21
  192. package/dist/components/renderers/zone/zone-renderer.d.ts +0 -5
  193. package/dist/components/renderers/zone/zone-renderer.d.ts.map +0 -1
  194. package/dist/components/renderers/zone/zone-renderer.js +0 -181
@@ -0,0 +1,43 @@
1
+ import { abs, colorToDirection, float, max, min, mix, screenSize, screenUV, smoothstep, vec2, } from 'three/tsl';
2
+ // Screen-space ink outline (SketchUp / Moebius look). Reads the scene-pass
3
+ // depth + normal MRT and inks two signals:
4
+ //
5
+ // 1. Crease — center normal vs each neighbour (`1 - dot`): 0 on a flat
6
+ // surface, ~1 at a 90° corner. Catches wall↔roof, wall↔wall and window-
7
+ // reveal creases. Normals are re-normalized because the 8-bit normal MRT
8
+ // decodes to non-unit vectors, which otherwise crushes the signal.
9
+ // 2. Depth — raw-depth Laplacian (screen-linear across planes → ~0 on flat
10
+ // ground, no banding) normalized by (1 - depth)² so it becomes ≈
11
+ // worldStep / near, i.e. DISTANCE-INDEPENDENT (a window reveal reads the
12
+ // same zoomed in or out). A raw-Laplacian gate rejects flat-plane
13
+ // quantization noise so the far ground/roof never inks.
14
+ //
15
+ // Topology-agnostic: works on CSG triangle soup, organic GLBs, anything — it
16
+ // only sees the rendered buffers. `intensity` scales the final mask; `inkColor`
17
+ // should track the background luminance (dark lines on light scenes).
18
+ export function inkedEdges({ depthTex, normalTex, inkColor, radius, opacity, sceneRgb, }) {
19
+ const px = vec2(1, 1).div(screenSize).mul(radius);
20
+ const uvN = screenUV;
21
+ const dC = depthTex.sample(uvN).r;
22
+ const dR = depthTex.sample(uvN.add(vec2(px.x, 0))).r;
23
+ const dL = depthTex.sample(uvN.sub(vec2(px.x, 0))).r;
24
+ const dU = depthTex.sample(uvN.add(vec2(0, px.y))).r;
25
+ const dD = depthTex.sample(uvN.sub(vec2(0, px.y))).r;
26
+ const depthLap = abs(dR.add(dL).add(dU).add(dD).sub(dC.mul(4)));
27
+ const invDepth = float(1).sub(dC);
28
+ const depthMetric = depthLap.div(invDepth.mul(invDepth).add(float(0.00002)));
29
+ const noiseGate = smoothstep(float(0.00002), float(0.00006), depthLap);
30
+ // ≈ metres of step / near (near≈0.1): ~5cm starts a line, ~25cm solid.
31
+ const depthEdge = smoothstep(float(0.5), float(2.5), depthMetric).mul(noiseGate);
32
+ const nC = colorToDirection(normalTex.sample(uvN)).normalize();
33
+ const nR = colorToDirection(normalTex.sample(uvN.add(vec2(px.x, 0)))).normalize();
34
+ const nL = colorToDirection(normalTex.sample(uvN.sub(vec2(px.x, 0)))).normalize();
35
+ const nU = colorToDirection(normalTex.sample(uvN.add(vec2(0, px.y)))).normalize();
36
+ const nD = colorToDirection(normalTex.sample(uvN.sub(vec2(0, px.y)))).normalize();
37
+ const nDiff = max(max(float(1).sub(nC.dot(nR)), float(1).sub(nC.dot(nL))), max(float(1).sub(nC.dot(nU)), float(1).sub(nC.dot(nD))));
38
+ const normalEdge = smoothstep(float(0.01), float(0.05), nDiff);
39
+ // TSL's typed overloads are finicky across versions; the runtime is proven in
40
+ // the aesthetic sandbox, so cast at the mask/mix boundary.
41
+ const edgeMask = min(max(depthEdge, normalEdge).mul(opacity), float(1));
42
+ return mix(sceneRgb, inkColor, edgeMask);
43
+ }
@@ -0,0 +1,39 @@
1
+ import type { AnyNodeId } from '@pascal-app/core';
2
+ import type { Object3D } from 'three';
3
+ /** True while an isolation filter is applied (see {@link applyIsolation}). */
4
+ export declare function isIsolationActive(): boolean;
5
+ /**
6
+ * Compute the union of every isolated subtree's `Object3D` descendants.
7
+ *
8
+ * Pure traversal — exported so future "focus mode" / debug tooling can
9
+ * reuse the same definition of "what's in the isolated set". Each root
10
+ * is walked via `Object3D.traverse` (the live Three.js graph, not the
11
+ * data-model `children` array — those can disagree when systems mount
12
+ * synthesized sub-meshes that the data model doesn't track).
13
+ */
14
+ export declare function collectIsolationSubtree(ids: ReadonlyArray<string>): Set<Object3D>;
15
+ /**
16
+ * Imperative visibility filter on the live `sceneRegistry`. Hides every
17
+ * registered group (and its synthesized child meshes) outside the
18
+ * isolated subtree by disabling the {@link SCENE_LAYER} bit on the
19
+ * relevant `Object3D.layers` masks.
20
+ *
21
+ * Why layers instead of `obj.visible = false`? Three.js's visibility
22
+ * flag *cascades* — hiding a parent hides every descendant — so we
23
+ * can't hide a host wall while keeping a door rendered inside it.
24
+ * Layer masks are per-object and don't cascade: `WebGLRenderer
25
+ * .projectObject` skips objects whose layer mask doesn't intersect the
26
+ * camera's, but always recurses into their children. So we can disable
27
+ * `SCENE_LAYER` on the wall and the door (hosted under it in the
28
+ * scene graph) still renders, with its local position relative to the
29
+ * wall preserved automatically by the matrix walk.
30
+ *
31
+ * The original `layers.mask` is stashed under a private Symbol so
32
+ * {@link clearIsolation} can restore the exact prior state.
33
+ *
34
+ * Pass `null` to clear isolation (equivalent to calling
35
+ * {@link clearIsolation}).
36
+ */
37
+ export declare function applyIsolation(ids: ReadonlyArray<AnyNodeId> | null): void;
38
+ export declare function clearIsolation(): void;
39
+ //# sourceMappingURL=isolation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolation.d.ts","sourceRoot":"","sources":["../../src/lib/isolation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAgBrC,8EAA8E;AAC9E,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAUjF;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,IAAI,CAiBzE;AAcD,wBAAgB,cAAc,IAAI,IAAI,CAcrC"}
@@ -0,0 +1,103 @@
1
+ 'use client';
2
+ import { sceneRegistry } from '@pascal-app/core';
3
+ import { SCENE_LAYER } from './layers';
4
+ // Marker on each Object3D we modify during isolation so we can restore
5
+ // the original `layers.mask` bitfield. Stored under a `Symbol` so it
6
+ // can't collide with any kind's own userData fields.
7
+ const ORIGINAL_LAYERS = Symbol('isolation:original-layers');
8
+ // Whether a subtree is currently isolated (some objects have SCENE_LAYER
9
+ // disabled). Read by consumers that must not act on the partial view — e.g.
10
+ // the project-thumbnail autosave skips capturing while isolated so it never
11
+ // snapshots a single focused item as the whole project's thumbnail.
12
+ let isolationActive = false;
13
+ /** True while an isolation filter is applied (see {@link applyIsolation}). */
14
+ export function isIsolationActive() {
15
+ return isolationActive;
16
+ }
17
+ /**
18
+ * Compute the union of every isolated subtree's `Object3D` descendants.
19
+ *
20
+ * Pure traversal — exported so future "focus mode" / debug tooling can
21
+ * reuse the same definition of "what's in the isolated set". Each root
22
+ * is walked via `Object3D.traverse` (the live Three.js graph, not the
23
+ * data-model `children` array — those can disagree when systems mount
24
+ * synthesized sub-meshes that the data model doesn't track).
25
+ */
26
+ export function collectIsolationSubtree(ids) {
27
+ const keep = new Set();
28
+ for (const id of ids) {
29
+ const root = sceneRegistry.nodes.get(id);
30
+ if (!root)
31
+ continue;
32
+ root.traverse((child) => {
33
+ keep.add(child);
34
+ });
35
+ }
36
+ return keep;
37
+ }
38
+ /**
39
+ * Imperative visibility filter on the live `sceneRegistry`. Hides every
40
+ * registered group (and its synthesized child meshes) outside the
41
+ * isolated subtree by disabling the {@link SCENE_LAYER} bit on the
42
+ * relevant `Object3D.layers` masks.
43
+ *
44
+ * Why layers instead of `obj.visible = false`? Three.js's visibility
45
+ * flag *cascades* — hiding a parent hides every descendant — so we
46
+ * can't hide a host wall while keeping a door rendered inside it.
47
+ * Layer masks are per-object and don't cascade: `WebGLRenderer
48
+ * .projectObject` skips objects whose layer mask doesn't intersect the
49
+ * camera's, but always recurses into their children. So we can disable
50
+ * `SCENE_LAYER` on the wall and the door (hosted under it in the
51
+ * scene graph) still renders, with its local position relative to the
52
+ * wall preserved automatically by the matrix walk.
53
+ *
54
+ * The original `layers.mask` is stashed under a private Symbol so
55
+ * {@link clearIsolation} can restore the exact prior state.
56
+ *
57
+ * Pass `null` to clear isolation (equivalent to calling
58
+ * {@link clearIsolation}).
59
+ */
60
+ export function applyIsolation(ids) {
61
+ if (ids == null || ids.length === 0) {
62
+ clearIsolation();
63
+ return;
64
+ }
65
+ const keep = collectIsolationSubtree(ids);
66
+ // Iterate registered roots. For each one outside the keep set,
67
+ // disable `SCENE_LAYER` on it and on every descendant — *except*
68
+ // descendants that are themselves in `keep` (a kept node nested under
69
+ // a non-kept host: the isolated door under the hidden wall).
70
+ for (const [, obj] of sceneRegistry.nodes) {
71
+ if (keep.has(obj))
72
+ continue;
73
+ hideRecursive(obj, keep);
74
+ }
75
+ isolationActive = true;
76
+ }
77
+ function hideRecursive(obj, keep) {
78
+ if (keep.has(obj))
79
+ return;
80
+ const carrier = obj;
81
+ if (carrier[ORIGINAL_LAYERS] === undefined) {
82
+ carrier[ORIGINAL_LAYERS] = obj.layers.mask;
83
+ }
84
+ obj.layers.disable(SCENE_LAYER);
85
+ for (const child of obj.children) {
86
+ hideRecursive(child, keep);
87
+ }
88
+ }
89
+ export function clearIsolation() {
90
+ // We don't know which objects were touched without re-walking, so
91
+ // walk every registered root + its descendants and restore any
92
+ // stashed original-mask. `traverse` is cheap and idempotent here.
93
+ for (const [, obj] of sceneRegistry.nodes) {
94
+ obj.traverse((child) => {
95
+ const carrier = child;
96
+ if (carrier[ORIGINAL_LAYERS] !== undefined) {
97
+ child.layers.mask = carrier[ORIGINAL_LAYERS];
98
+ delete carrier[ORIGINAL_LAYERS];
99
+ }
100
+ });
101
+ }
102
+ isolationActive = false;
103
+ }
@@ -1,5 +1,23 @@
1
1
  /** Default Three.js layer for main scene geometry. */
2
2
  export declare const SCENE_LAYER = 0;
3
+ /**
4
+ * Layer for editor-only overlays (gizmos, move handles, tool previews, grid).
5
+ * The post-processing pipeline excludes this layer from the depth/normal MRT
6
+ * scene pass so the screen-space ink and SSGI never treat overlays as geometry,
7
+ * then composites it back on top via a dedicated overlay pass.
8
+ *
9
+ * Editor's `EDITOR_LAYER` (packages/editor) re-exports this — they MUST match.
10
+ */
11
+ export declare const OVERLAY_LAYER = 1;
3
12
  /** Layer used for zone rendering (floor fills and wall borders). */
4
13
  export declare const ZONE_LAYER = 2;
14
+ /**
15
+ * Layer for the editor ground grid. Rendered *inside* the scene pass (so scene
16
+ * geometry depth-occludes it instead of it bleeding through walls/objects) — it
17
+ * is a flat, depth-non-writing plane, so the screen-space ink never picks it up.
18
+ * Kept off OVERLAY_LAYER because overlays composite on top with no scene-depth
19
+ * test, which is exactly what we don't want for a full-floor plane. Excluded
20
+ * from thumbnails like the other editor-only layers.
21
+ */
22
+ export declare const GRID_LAYER = 3;
5
23
  //# sourceMappingURL=layers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"layers.d.ts","sourceRoot":"","sources":["../../src/lib/layers.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,eAAO,MAAM,WAAW,IAAI,CAAA;AAE5B,oEAAoE;AACpE,eAAO,MAAM,UAAU,IAAI,CAAA"}
1
+ {"version":3,"file":"layers.d.ts","sourceRoot":"","sources":["../../src/lib/layers.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,eAAO,MAAM,WAAW,IAAI,CAAA;AAE5B;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,IAAI,CAAA;AAE9B,oEAAoE;AACpE,eAAO,MAAM,UAAU,IAAI,CAAA;AAE3B;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,IAAI,CAAA"}
@@ -1,4 +1,22 @@
1
1
  /** Default Three.js layer for main scene geometry. */
2
2
  export const SCENE_LAYER = 0;
3
+ /**
4
+ * Layer for editor-only overlays (gizmos, move handles, tool previews, grid).
5
+ * The post-processing pipeline excludes this layer from the depth/normal MRT
6
+ * scene pass so the screen-space ink and SSGI never treat overlays as geometry,
7
+ * then composites it back on top via a dedicated overlay pass.
8
+ *
9
+ * Editor's `EDITOR_LAYER` (packages/editor) re-exports this — they MUST match.
10
+ */
11
+ export const OVERLAY_LAYER = 1;
3
12
  /** Layer used for zone rendering (floor fills and wall borders). */
4
13
  export const ZONE_LAYER = 2;
14
+ /**
15
+ * Layer for the editor ground grid. Rendered *inside* the scene pass (so scene
16
+ * geometry depth-occludes it instead of it bleeding through walls/objects) — it
17
+ * is a flat, depth-non-writing plane, so the screen-space ink never picks it up.
18
+ * Kept off OVERLAY_LAYER because overlays composite on top with no scene-depth
19
+ * test, which is exactly what we don't want for a full-floor plane. Excluded
20
+ * from thumbnails like the other editor-only layers.
21
+ */
22
+ export const GRID_LAYER = 3;
@@ -1,20 +1,30 @@
1
- import { type MaterialPresetPayload, type MaterialSchema } from '@pascal-app/core';
1
+ import { type MaterialPresetPayload, type MaterialSchema, type SurfaceRole } from '@pascal-app/core';
2
2
  import * as THREE from 'three';
3
- import { MeshStandardNodeMaterial } from 'three/webgpu';
4
- export declare const baseMaterial: MeshStandardNodeMaterial;
5
- export declare const glassMaterial: MeshStandardNodeMaterial;
3
+ import { MeshLambertNodeMaterial } from 'three/webgpu';
4
+ export type RenderShading = 'solid' | 'rendered';
5
+ export type ColorPreset = 'clay' | 'white' | 'mono' | 'blueprint';
6
+ export declare const CLAY_PALETTE: Record<SurfaceRole, string>;
7
+ export declare const WHITE_PALETTE: Record<SurfaceRole, string>;
8
+ export declare const MONO_PALETTE: Record<SurfaceRole, string>;
9
+ export declare const BLUEPRINT_PALETTE: Record<SurfaceRole, string>;
10
+ export declare const PRESET_PALETTES: Record<ColorPreset, Record<SurfaceRole, string>>;
11
+ export declare function resolveSurfaceColor(role: SurfaceRole, preset: ColorPreset, sceneThemeId?: string): string;
12
+ export declare const glassMaterial: MeshLambertNodeMaterial;
6
13
  export declare function applyMaterialPresetToMaterials(materialInput: THREE.Material | THREE.Material[], preset: MaterialPresetPayload | null | undefined): void;
7
- export declare function createMaterialFromPreset(preset: MaterialPresetPayload): THREE.MeshStandardMaterial;
8
- export declare function createMaterialFromPresetRef(materialPreset?: string): THREE.MeshStandardMaterial | null;
9
- export declare function createMaterial(material?: MaterialSchema): THREE.MeshStandardMaterial;
10
- export declare function createDefaultMaterial(color?: string, roughness?: number): THREE.MeshStandardMaterial;
11
- export declare const DEFAULT_WALL_MATERIAL: THREE.MeshStandardMaterial;
12
- export declare const DEFAULT_SLAB_MATERIAL: THREE.MeshStandardMaterial;
13
- export declare const DEFAULT_DOOR_MATERIAL: THREE.MeshStandardMaterial;
14
- export declare const DEFAULT_WINDOW_MATERIAL: THREE.MeshStandardMaterial;
15
- export declare const DEFAULT_CEILING_MATERIAL: THREE.MeshStandardMaterial;
16
- export declare const DEFAULT_ROOF_MATERIAL: THREE.MeshStandardMaterial;
17
- export declare const DEFAULT_STAIR_MATERIAL: THREE.MeshStandardMaterial;
14
+ export declare function createMaterialFromPreset(preset: MaterialPresetPayload, shading?: RenderShading): THREE.Material;
15
+ export declare function createMaterialFromPresetRef(materialPreset?: string, shading?: RenderShading): THREE.Material | null;
16
+ export declare function createMaterial(material?: MaterialSchema, shading?: RenderShading): THREE.Material;
17
+ export declare function createDefaultMaterial(color?: string, roughness?: number, shading?: RenderShading, side?: THREE.Side): THREE.Material;
18
+ export declare function createSurfaceRoleMaterial(role: SurfaceRole, preset: ColorPreset, side?: THREE.Side, sceneThemeId?: string): THREE.Material;
19
+ export declare function baseMaterial(shading?: RenderShading): THREE.Material;
20
+ export declare function DEFAULT_WALL_MATERIAL(shading?: RenderShading): THREE.Material;
21
+ export declare function DEFAULT_SLAB_MATERIAL(shading?: RenderShading): THREE.Material;
22
+ export declare function DEFAULT_DOOR_MATERIAL(shading?: RenderShading): THREE.Material;
23
+ export declare function DEFAULT_WINDOW_MATERIAL(shading?: RenderShading): THREE.Material;
24
+ export declare function DEFAULT_CEILING_MATERIAL(shading?: RenderShading): THREE.Material;
25
+ export declare function DEFAULT_ROOF_MATERIAL(shading?: RenderShading): THREE.Material;
26
+ export declare function DEFAULT_SHELF_MATERIAL(shading?: RenderShading): THREE.Material;
27
+ export declare function DEFAULT_STAIR_MATERIAL(shading?: RenderShading): THREE.Material;
18
28
  export declare function disposeMaterial(material: THREE.Material): void;
19
29
  export declare function clearMaterialCache(): void;
20
30
  //# sourceMappingURL=materials.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"materials.d.ts","sourceRoot":"","sources":["../../src/lib/materials.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,qBAAqB,EAE1B,KAAK,cAAc,EAEpB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AAEvD,eAAO,MAAM,YAAY,0BAIvB,CAAA;AAEF,eAAO,MAAM,aAAa,0BAOxB,CAAA;AAkNF,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,EAChD,MAAM,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,QAcjD;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,qBAAqB,GAC5B,KAAK,CAAC,oBAAoB,CAW5B;AAED,wBAAgB,2BAA2B,CACzC,cAAc,CAAC,EAAE,MAAM,GACtB,KAAK,CAAC,oBAAoB,GAAG,IAAI,CAInC;AAED,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,KAAK,CAAC,oBAAoB,CAsBpF;AAED,wBAAgB,qBAAqB,CACnC,KAAK,SAAY,EACjB,SAAS,SAAM,GACd,KAAK,CAAC,oBAAoB,CAO5B;AAED,eAAO,MAAM,qBAAqB,4BAAwC,CAAA;AAC1E,eAAO,MAAM,qBAAqB,4BAAwC,CAAA;AAC1E,eAAO,MAAM,qBAAqB,4BAAwC,CAAA;AAC1E,eAAO,MAAM,uBAAuB,4BAOlC,CAAA;AACF,eAAO,MAAM,wBAAwB,4BAAyC,CAAA;AAC9E,eAAO,MAAM,qBAAqB,4BAAyC,CAAA;AAC3E,eAAO,MAAM,sBAAsB,4BAAwC,CAAA;AAE3E,wBAAgB,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAE9D;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAWzC"}
1
+ {"version":3,"file":"materials.d.ts","sourceRoot":"","sources":["../../src/lib/materials.ts"],"names":[],"mappings":"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"}