@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.
- package/dist/components/renderers/node-renderer.d.ts +1 -1
- package/dist/components/renderers/node-renderer.d.ts.map +1 -1
- package/dist/components/renderers/node-renderer.js +38 -22
- package/dist/components/renderers/parametric-node-renderer.d.ts +5 -0
- package/dist/components/renderers/parametric-node-renderer.d.ts.map +1 -0
- package/dist/components/renderers/parametric-node-renderer.js +34 -0
- package/dist/components/renderers/scene-renderer.d.ts +1 -1
- package/dist/components/renderers/scene-renderer.d.ts.map +1 -1
- package/dist/components/viewer/ground-occluder.d.ts +1 -1
- package/dist/components/viewer/ground-occluder.d.ts.map +1 -1
- package/dist/components/viewer/ground-occluder.js +12 -24
- package/dist/components/viewer/index.d.ts +37 -1
- package/dist/components/viewer/index.d.ts.map +1 -1
- package/dist/components/viewer/index.js +186 -63
- package/dist/components/viewer/lights.d.ts +1 -1
- package/dist/components/viewer/lights.d.ts.map +1 -1
- package/dist/components/viewer/lights.js +170 -43
- package/dist/components/viewer/perf-monitor.d.ts +1 -1
- package/dist/components/viewer/perf-monitor.d.ts.map +1 -1
- package/dist/components/viewer/perf-monitor.js +99 -11
- package/dist/components/viewer/post-processing.d.ts.map +1 -1
- package/dist/components/viewer/post-processing.js +231 -54
- package/dist/components/viewer/registered-systems.d.ts +12 -0
- package/dist/components/viewer/registered-systems.d.ts.map +1 -0
- package/dist/components/viewer/registered-systems.js +47 -0
- package/dist/components/viewer/scene-bvh.d.ts +17 -0
- package/dist/components/viewer/scene-bvh.d.ts.map +1 -0
- package/dist/components/viewer/scene-bvh.js +94 -0
- package/dist/components/viewer/selection-manager.d.ts +1 -1
- package/dist/components/viewer/selection-manager.d.ts.map +1 -1
- package/dist/components/viewer/selection-manager.js +20 -5
- package/dist/components/viewer/viewer-camera.d.ts +1 -1
- package/dist/components/viewer/viewer-camera.d.ts.map +1 -1
- package/dist/components/viewer/walkthrough-controls.d.ts +1 -1
- package/dist/components/viewer/walkthrough-controls.d.ts.map +1 -1
- package/dist/hooks/use-gltf-ktx2.d.ts.map +1 -1
- package/dist/hooks/use-node-events.d.ts +5 -73
- package/dist/hooks/use-node-events.d.ts.map +1 -1
- package/dist/hooks/use-node-events.js +19 -7
- package/dist/index.d.ts +36 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +67 -3
- package/dist/lib/csg-utils.d.ts +16 -0
- package/dist/lib/csg-utils.d.ts.map +1 -0
- package/dist/lib/csg-utils.js +33 -0
- package/dist/lib/drawable-geometry.d.ts +21 -0
- package/dist/lib/drawable-geometry.d.ts.map +1 -0
- package/dist/lib/drawable-geometry.js +22 -0
- package/dist/lib/edge-style.d.ts +3 -0
- package/dist/lib/edge-style.d.ts.map +1 -0
- package/dist/lib/edge-style.js +11 -0
- package/dist/lib/gpu-perf.d.ts +4 -0
- package/dist/lib/gpu-perf.d.ts.map +1 -0
- package/dist/lib/gpu-perf.js +23 -0
- package/dist/lib/ink-edges.d.ts +9 -0
- package/dist/lib/ink-edges.d.ts.map +1 -0
- package/dist/lib/ink-edges.js +43 -0
- package/dist/lib/isolation.d.ts +39 -0
- package/dist/lib/isolation.d.ts.map +1 -0
- package/dist/lib/isolation.js +103 -0
- package/dist/lib/layers.d.ts +18 -0
- package/dist/lib/layers.d.ts.map +1 -1
- package/dist/lib/layers.js +18 -0
- package/dist/lib/materials.d.ts +25 -15
- package/dist/lib/materials.d.ts.map +1 -1
- package/dist/lib/materials.js +277 -62
- package/dist/lib/merged-outline-node.d.ts.map +1 -1
- package/dist/lib/merged-outline-node.js +7 -0
- package/dist/lib/polygon-union.d.ts +4 -0
- package/dist/lib/polygon-union.d.ts.map +1 -0
- package/dist/lib/polygon-union.js +289 -0
- package/dist/lib/polygon-union.test.d.ts +2 -0
- package/dist/lib/polygon-union.test.d.ts.map +1 -0
- package/dist/lib/polygon-union.test.js +105 -0
- package/dist/lib/scene-themes.d.ts +29 -0
- package/dist/lib/scene-themes.d.ts.map +1 -0
- package/dist/lib/scene-themes.js +193 -0
- package/dist/store/use-viewer.d.ts +42 -4
- package/dist/store/use-viewer.d.ts.map +1 -1
- package/dist/store/use-viewer.js +26 -3
- package/dist/systems/ceiling/ceiling-system.d.ts +6 -2
- package/dist/systems/ceiling/ceiling-system.d.ts.map +1 -1
- package/dist/systems/ceiling/ceiling-system.js +62 -12
- package/dist/systems/door/door-system.d.ts.map +1 -1
- package/dist/systems/door/door-system.js +373 -22
- package/dist/systems/elevator/elevator-interaction-system.d.ts +2 -0
- package/dist/systems/elevator/elevator-interaction-system.d.ts.map +1 -0
- package/dist/systems/elevator/elevator-interaction-system.js +62 -0
- package/dist/systems/fence/fence-system.d.ts +3 -0
- package/dist/systems/fence/fence-system.d.ts.map +1 -1
- package/dist/systems/fence/fence-system.js +9 -5
- package/dist/systems/floor-elevation/floor-elevation-system.d.ts +20 -0
- package/dist/systems/floor-elevation/floor-elevation-system.d.ts.map +1 -0
- package/dist/systems/floor-elevation/floor-elevation-system.js +78 -0
- package/dist/systems/geometry/geometry-system.d.ts +34 -0
- package/dist/systems/geometry/geometry-system.d.ts.map +1 -0
- package/dist/systems/geometry/geometry-system.js +279 -0
- package/dist/systems/interactive/interactive-system.d.ts +1 -1
- package/dist/systems/interactive/interactive-system.d.ts.map +1 -1
- package/dist/systems/item/item-system.d.ts +7 -0
- package/dist/systems/item/item-system.d.ts.map +1 -1
- package/dist/systems/item/item-system.js +8 -11
- package/dist/systems/item-light/item-light-system.d.ts +1 -1
- package/dist/systems/item-light/item-light-system.d.ts.map +1 -1
- package/dist/systems/item-light/item-light-system.js +18 -5
- package/dist/systems/roof/roof-materials.d.ts +3 -2
- package/dist/systems/roof/roof-materials.d.ts.map +1 -1
- package/dist/systems/roof/roof-materials.js +38 -14
- package/dist/systems/roof/roof-system.d.ts +27 -0
- package/dist/systems/roof/roof-system.d.ts.map +1 -1
- package/dist/systems/roof/roof-system.js +396 -59
- package/dist/systems/slab/slab-system.d.ts.map +1 -1
- package/dist/systems/slab/slab-system.js +167 -49
- package/dist/systems/slab/slab-system.test.d.ts +2 -0
- package/dist/systems/slab/slab-system.test.d.ts.map +1 -0
- package/dist/systems/slab/slab-system.test.js +62 -0
- package/dist/systems/stair/stair-materials.d.ts +4 -3
- package/dist/systems/stair/stair-materials.d.ts.map +1 -1
- package/dist/systems/stair/stair-materials.js +30 -15
- package/dist/systems/stair/stair-system.d.ts.map +1 -1
- package/dist/systems/stair/stair-system.js +50 -61
- package/dist/systems/surface-hole-geometry.d.ts +3 -0
- package/dist/systems/surface-hole-geometry.d.ts.map +1 -0
- package/dist/systems/surface-hole-geometry.js +4 -0
- package/dist/systems/wall/wall-cutout.d.ts.map +1 -1
- package/dist/systems/wall/wall-cutout.js +18 -2
- package/dist/systems/wall/wall-materials.d.ts +4 -3
- package/dist/systems/wall/wall-materials.d.ts.map +1 -1
- package/dist/systems/wall/wall-materials.js +52 -28
- package/dist/systems/wall/wall-system.d.ts.map +1 -1
- package/dist/systems/wall/wall-system.js +171 -26
- package/dist/systems/window/window-system.d.ts.map +1 -1
- package/dist/systems/window/window-system.js +71 -7
- package/package.json +3 -4
- package/dist/components/renderers/building/building-renderer.d.ts +0 -5
- package/dist/components/renderers/building/building-renderer.d.ts.map +0 -1
- package/dist/components/renderers/building/building-renderer.js +0 -11
- package/dist/components/renderers/ceiling/ceiling-renderer.d.ts +0 -5
- package/dist/components/renderers/ceiling/ceiling-renderer.d.ts.map +0 -1
- package/dist/components/renderers/ceiling/ceiling-renderer.js +0 -58
- package/dist/components/renderers/column/column-renderer.d.ts +0 -5
- package/dist/components/renderers/column/column-renderer.d.ts.map +0 -1
- package/dist/components/renderers/column/column-renderer.js +0 -597
- package/dist/components/renderers/door/door-renderer.d.ts +0 -5
- package/dist/components/renderers/door/door-renderer.d.ts.map +0 -1
- package/dist/components/renderers/door/door-renderer.js +0 -16
- package/dist/components/renderers/fence/fence-renderer.d.ts +0 -5
- package/dist/components/renderers/fence/fence-renderer.d.ts.map +0 -1
- package/dist/components/renderers/fence/fence-renderer.js +0 -15
- package/dist/components/renderers/guide/guide-renderer.d.ts +0 -5
- package/dist/components/renderers/guide/guide-renderer.d.ts.map +0 -1
- package/dist/components/renderers/guide/guide-renderer.js +0 -38
- package/dist/components/renderers/item/item-renderer.d.ts +0 -5
- package/dist/components/renderers/item/item-renderer.d.ts.map +0 -1
- package/dist/components/renderers/item/item-renderer.js +0 -172
- package/dist/components/renderers/level/level-renderer.d.ts +0 -5
- package/dist/components/renderers/level/level-renderer.d.ts.map +0 -1
- package/dist/components/renderers/level/level-renderer.js +0 -11
- package/dist/components/renderers/roof/roof-materials.d.ts +0 -4
- package/dist/components/renderers/roof/roof-materials.d.ts.map +0 -1
- package/dist/components/renderers/roof/roof-materials.js +0 -16
- package/dist/components/renderers/roof/roof-renderer.d.ts +0 -5
- package/dist/components/renderers/roof/roof-renderer.d.ts.map +0 -1
- package/dist/components/renderers/roof/roof-renderer.js +0 -32
- package/dist/components/renderers/roof-segment/roof-segment-renderer.d.ts +0 -5
- package/dist/components/renderers/roof-segment/roof-segment-renderer.d.ts.map +0 -1
- package/dist/components/renderers/roof-segment/roof-segment-renderer.js +0 -40
- package/dist/components/renderers/scan/scan-renderer.d.ts +0 -5
- package/dist/components/renderers/scan/scan-renderer.d.ts.map +0 -1
- package/dist/components/renderers/scan/scan-renderer.js +0 -54
- package/dist/components/renderers/site/site-renderer.d.ts +0 -5
- package/dist/components/renderers/site/site-renderer.d.ts.map +0 -1
- package/dist/components/renderers/site/site-renderer.js +0 -106
- package/dist/components/renderers/slab/slab-renderer.d.ts +0 -5
- package/dist/components/renderers/slab/slab-renderer.d.ts.map +0 -1
- package/dist/components/renderers/slab/slab-renderer.js +0 -58
- package/dist/components/renderers/spawn/spawn-renderer.d.ts +0 -5
- package/dist/components/renderers/spawn/spawn-renderer.d.ts.map +0 -1
- package/dist/components/renderers/spawn/spawn-renderer.js +0 -32
- package/dist/components/renderers/stair/stair-renderer.d.ts +0 -5
- package/dist/components/renderers/stair/stair-renderer.d.ts.map +0 -1
- package/dist/components/renderers/stair/stair-renderer.js +0 -603
- package/dist/components/renderers/stair-segment/stair-segment-renderer.d.ts +0 -5
- package/dist/components/renderers/stair-segment/stair-segment-renderer.d.ts.map +0 -1
- package/dist/components/renderers/stair-segment/stair-segment-renderer.js +0 -51
- package/dist/components/renderers/wall/wall-renderer.d.ts +0 -5
- package/dist/components/renderers/wall/wall-renderer.d.ts.map +0 -1
- package/dist/components/renderers/wall/wall-renderer.js +0 -16
- package/dist/components/renderers/window/window-renderer.d.ts +0 -5
- package/dist/components/renderers/window/window-renderer.d.ts.map +0 -1
- package/dist/components/renderers/window/window-renderer.js +0 -21
- package/dist/components/renderers/zone/zone-renderer.d.ts +0 -5
- package/dist/components/renderers/zone/zone-renderer.d.ts.map +0 -1
- 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
|
+
}
|
package/dist/lib/layers.d.ts
CHANGED
|
@@ -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
|
package/dist/lib/layers.d.ts.map
CHANGED
|
@@ -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"}
|
package/dist/lib/layers.js
CHANGED
|
@@ -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;
|
package/dist/lib/materials.d.ts
CHANGED
|
@@ -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 {
|
|
4
|
-
export
|
|
5
|
-
export
|
|
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.
|
|
8
|
-
export declare function createMaterialFromPresetRef(materialPreset?: string): THREE.
|
|
9
|
-
export declare function createMaterial(material?: MaterialSchema): THREE.
|
|
10
|
-
export declare function createDefaultMaterial(color?: string, roughness?: number): THREE.
|
|
11
|
-
export declare
|
|
12
|
-
export declare
|
|
13
|
-
export declare
|
|
14
|
-
export declare
|
|
15
|
-
export declare
|
|
16
|
-
export declare
|
|
17
|
-
export declare
|
|
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,
|
|
1
|
+
{"version":3,"file":"materials.d.ts","sourceRoot":"","sources":["../../src/lib/materials.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,qBAAqB,EAE1B,KAAK,cAAc,EAEnB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,uBAAuB,EAA4B,MAAM,cAAc,CAAA;AAKhF,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,UAAU,CAAA;AAChD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAA;AAEjE,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAQpD,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAQrD,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAQpD,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAQzD,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAK5E,CAAA;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,WAAW,EACnB,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,CAKR;AAOD,eAAO,MAAM,aAAa,yBAKxB,CAAA;AAyTF,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,EAC7B,OAAO,GAAE,aAA0B,GAClC,KAAK,CAAC,QAAQ,CAYhB;AAED,wBAAgB,2BAA2B,CACzC,cAAc,CAAC,EAAE,MAAM,EACvB,OAAO,GAAE,aAA0B,GAClC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAIvB;AAED,wBAAgB,cAAc,CAC5B,QAAQ,CAAC,EAAE,cAAc,EACzB,OAAO,GAAE,aAA0B,GAClC,KAAK,CAAC,QAAQ,CAmChB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,SAAY,EACjB,SAAS,SAAM,EACf,OAAO,GAAE,aAA0B,EACnC,IAAI,GAAE,KAAK,CAAC,IAAsB,GACjC,KAAK,CAAC,QAAQ,CAchB;AAkBD,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE,KAAK,CAAC,IAAsB,EAClC,YAAY,CAAC,EAAE,MAAM,GACpB,KAAK,CAAC,QAAQ,CA+BhB;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAA0B,GAAG,KAAK,CAAC,QAAQ,CAEhF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,aAA0B,GAAG,KAAK,CAAC,QAAQ,CAEzF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,aAA0B,GAAG,KAAK,CAAC,QAAQ,CAEzF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,aAA0B,GAAG,KAAK,CAAC,QAAQ,CAEzF;AAED,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,aAA0B,GAAG,KAAK,CAAC,QAAQ,CA0B3F;AAED,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,aAA0B,GAAG,KAAK,CAAC,QAAQ,CAE5F;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,aAA0B,GAAG,KAAK,CAAC,QAAQ,CAEzF;AAED,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,aAA0B,GAAG,KAAK,CAAC,QAAQ,CAE1F;AAED,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,aAA0B,GAAG,KAAK,CAAC,QAAQ,CAE1F;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAE9D;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAqBzC"}
|