@pascal-app/viewer 0.8.0 → 0.9.2
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/error-boundary.d.ts +6 -0
- package/dist/components/error-boundary.d.ts.map +1 -1
- package/dist/components/error-boundary.js +6 -0
- package/dist/components/renderers/node-renderer.d.ts +6 -2
- package/dist/components/renderers/node-renderer.d.ts.map +1 -1
- package/dist/components/renderers/node-renderer.js +41 -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 +37 -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/bvh-ecctrl.d.ts +77 -0
- package/dist/components/viewer/bvh-ecctrl.d.ts.map +1 -0
- package/dist/components/viewer/bvh-ecctrl.js +552 -0
- package/dist/components/viewer/frame-limiter.d.ts.map +1 -1
- package/dist/components/viewer/frame-limiter.js +39 -4
- package/dist/components/viewer/glb-interactive.d.ts +41 -0
- package/dist/components/viewer/glb-interactive.d.ts.map +1 -0
- package/dist/components/viewer/glb-interactive.js +394 -0
- package/dist/components/viewer/glb-reference-nodes.d.ts +29 -0
- package/dist/components/viewer/glb-reference-nodes.d.ts.map +1 -0
- package/dist/components/viewer/glb-reference-nodes.js +80 -0
- package/dist/components/viewer/glb-replace-instances.d.ts +18 -0
- package/dist/components/viewer/glb-replace-instances.d.ts.map +1 -0
- package/dist/components/viewer/glb-replace-instances.js +61 -0
- package/dist/components/viewer/glb-scene.d.ts +54 -0
- package/dist/components/viewer/glb-scene.d.ts.map +1 -0
- package/dist/components/viewer/glb-scene.js +920 -0
- package/dist/components/viewer/glb-walkthrough-controller.d.ts +12 -0
- package/dist/components/viewer/glb-walkthrough-controller.d.ts.map +1 -0
- package/dist/components/viewer/glb-walkthrough-controller.js +357 -0
- package/dist/components/viewer/index.d.ts +56 -3
- package/dist/components/viewer/index.d.ts.map +1 -1
- package/dist/components/viewer/index.js +280 -65
- 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 +201 -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 +115 -12
- package/dist/components/viewer/post-processing.d.ts +7 -1
- package/dist/components/viewer/post-processing.d.ts.map +1 -1
- package/dist/components/viewer/post-processing.js +395 -63
- 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 +49 -0
- package/dist/components/viewer/scene-bvh.d.ts +18 -0
- package/dist/components/viewer/scene-bvh.d.ts.map +1 -0
- package/dist/components/viewer/scene-bvh.js +97 -0
- package/dist/components/viewer/scene-bvh.test.d.ts +2 -0
- package/dist/components/viewer/scene-bvh.test.d.ts.map +1 -0
- package/dist/components/viewer/scene-bvh.test.js +13 -0
- package/dist/components/viewer/scene-environment.d.ts +2 -0
- package/dist/components/viewer/scene-environment.d.ts.map +1 -0
- package/dist/components/viewer/scene-environment.js +79 -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 +37 -14
- 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 +2 -1
- package/dist/components/viewer/walkthrough-controls.d.ts.map +1 -1
- package/dist/components/viewer/walkthrough-controls.js +20 -0
- package/dist/hooks/use-gltf-ktx2.d.ts.map +1 -1
- package/dist/hooks/use-gltf-ktx2.js +3 -22
- package/dist/hooks/use-node-events.d.ts +6 -74
- package/dist/hooks/use-node-events.d.ts.map +1 -1
- package/dist/hooks/use-node-events.js +28 -8
- package/dist/index.d.ts +48 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +82 -4
- package/dist/lib/backdrop.d.ts +33 -0
- package/dist/lib/backdrop.d.ts.map +1 -0
- package/dist/lib/backdrop.js +92 -0
- package/dist/lib/box-uv.d.ts +13 -0
- package/dist/lib/box-uv.d.ts.map +1 -0
- package/dist/lib/box-uv.js +32 -0
- package/dist/lib/csg-utils.d.ts +10 -0
- package/dist/lib/csg-utils.d.ts.map +1 -0
- package/dist/lib/csg-utils.js +93 -0
- package/dist/lib/csg-utils.test.d.ts +2 -0
- package/dist/lib/csg-utils.test.d.ts.map +1 -0
- package/dist/lib/csg-utils.test.js +45 -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 +4 -0
- package/dist/lib/edge-style.d.ts.map +1 -0
- package/dist/lib/edge-style.js +31 -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 +49 -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/ktx2-loader.d.ts +43 -0
- package/dist/lib/ktx2-loader.d.ts.map +1 -0
- package/dist/lib/ktx2-loader.js +136 -0
- package/dist/lib/layers.d.ts +28 -0
- package/dist/lib/layers.d.ts.map +1 -1
- package/dist/lib/layers.js +28 -0
- package/dist/lib/materials.d.ts +38 -15
- package/dist/lib/materials.d.ts.map +1 -1
- package/dist/lib/materials.js +364 -72
- 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 +30 -0
- package/dist/lib/scene-themes.d.ts.map +1 -0
- package/dist/lib/scene-themes.js +202 -0
- package/dist/lib/shadow-only.d.ts +4 -0
- package/dist/lib/shadow-only.d.ts.map +1 -0
- package/dist/lib/shadow-only.js +36 -0
- package/dist/lib/tsl-compat.d.ts +12 -0
- package/dist/lib/tsl-compat.d.ts.map +1 -0
- package/dist/lib/tsl-compat.js +13 -0
- package/dist/store/use-viewer.d.ts +92 -12
- package/dist/store/use-viewer.d.ts.map +1 -1
- package/dist/store/use-viewer.js +201 -6
- package/dist/store/use-viewer.test.d.ts +2 -0
- package/dist/store/use-viewer.test.d.ts.map +1 -0
- package/dist/store/use-viewer.test.js +42 -0
- 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 +66 -13
- package/dist/systems/door/door-animation.test.d.ts +2 -0
- package/dist/systems/door/door-animation.test.d.ts.map +1 -0
- package/dist/systems/door/door-animation.test.js +51 -0
- package/dist/systems/door/door-floor-alignment.test.d.ts +2 -0
- package/dist/systems/door/door-floor-alignment.test.d.ts.map +1 -0
- package/dist/systems/door/door-floor-alignment.test.js +50 -0
- package/dist/systems/door/door-system.d.ts +24 -0
- package/dist/systems/door/door-system.d.ts.map +1 -1
- package/dist/systems/door/door-system.js +864 -180
- 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 +20 -0
- package/dist/systems/fence/fence-system.d.ts.map +1 -1
- package/dist/systems/fence/fence-system.js +229 -57
- 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 +41 -0
- package/dist/systems/geometry/geometry-system.d.ts.map +1 -0
- package/dist/systems/geometry/geometry-system.js +348 -0
- package/dist/systems/geometry/geometry-system.test.d.ts +2 -0
- package/dist/systems/geometry/geometry-system.test.d.ts.map +1 -0
- package/dist/systems/geometry/geometry-system.test.js +30 -0
- package/dist/systems/interactive/control-widget.d.ts +10 -0
- package/dist/systems/interactive/control-widget.d.ts.map +1 -0
- package/dist/systems/interactive/control-widget.js +35 -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/interactive/interactive-system.js +55 -56
- 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 +28 -17
- 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/level/level-system.d.ts.map +1 -1
- package/dist/systems/level/level-system.js +28 -4
- package/dist/systems/level/level-utils.d.ts +0 -3
- package/dist/systems/level/level-utils.d.ts.map +1 -1
- package/dist/systems/level/level-utils.js +2 -41
- 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 +59 -14
- package/dist/systems/roof/roof-system.d.ts +46 -6
- package/dist/systems/roof/roof-system.d.ts.map +1 -1
- package/dist/systems/roof/roof-system.js +1365 -170
- package/dist/systems/slab/slab-system.d.ts +5 -3
- package/dist/systems/slab/slab-system.d.ts.map +1 -1
- package/dist/systems/slab/slab-system.js +204 -68
- 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 +63 -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 +55 -63
- 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/opening-cutout-geometry.d.ts +31 -0
- package/dist/systems/wall/opening-cutout-geometry.d.ts.map +1 -0
- package/dist/systems/wall/opening-cutout-geometry.js +167 -0
- package/dist/systems/wall/opening-cutout-geometry.test.d.ts +2 -0
- package/dist/systems/wall/opening-cutout-geometry.test.d.ts.map +1 -0
- package/dist/systems/wall/opening-cutout-geometry.test.js +172 -0
- package/dist/systems/wall/wall-cutout.d.ts.map +1 -1
- package/dist/systems/wall/wall-cutout.js +62 -17
- package/dist/systems/wall/wall-materials.d.ts +12 -7
- package/dist/systems/wall/wall-materials.d.ts.map +1 -1
- package/dist/systems/wall/wall-materials.js +279 -46
- package/dist/systems/wall/wall-opening-cutout.test.d.ts +2 -0
- package/dist/systems/wall/wall-opening-cutout.test.d.ts.map +1 -0
- package/dist/systems/wall/wall-opening-cutout.test.js +59 -0
- package/dist/systems/wall/wall-support-extension.test.d.ts +2 -0
- package/dist/systems/wall/wall-support-extension.test.d.ts.map +1 -0
- package/dist/systems/wall/wall-support-extension.test.js +48 -0
- package/dist/systems/wall/wall-system.d.ts +2 -2
- package/dist/systems/wall/wall-system.d.ts.map +1 -1
- package/dist/systems/wall/wall-system.js +493 -193
- package/dist/systems/window/window-animation-system.d.ts +12 -0
- package/dist/systems/window/window-animation-system.d.ts.map +1 -1
- package/dist/systems/window/window-animation-system.js +16 -5
- package/dist/systems/window/window-system.d.ts +7 -0
- package/dist/systems/window/window-system.d.ts.map +1 -1
- package/dist/systems/window/window-system.js +308 -18
- package/package.json +5 -6
- 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
- package/dist/components/viewer/ground-occluder.d.ts +0 -2
- package/dist/components/viewer/ground-occluder.d.ts.map +0 -1
- package/dist/components/viewer/ground-occluder.js +0 -79
|
@@ -14,18 +14,38 @@ export function useNodeEvents(node, type) {
|
|
|
14
14
|
stopPropagation: () => e.stopPropagation(),
|
|
15
15
|
nativeEvent: e,
|
|
16
16
|
};
|
|
17
|
+
// `emitter.emit` is typed over a fixed union of `${kind}:${suffix}`
|
|
18
|
+
// keys; the `as never` cast lets us emit a kind-specific payload
|
|
19
|
+
// through that generic surface without enumerating every kind.
|
|
17
20
|
emitter.emit(eventKey, payload);
|
|
18
21
|
};
|
|
22
|
+
// Camera drags (orbit / pan / dolly) suppress ALL node pointer events.
|
|
23
|
+
//
|
|
24
|
+
// `inputDragging` (host-driven drags: handle arrows, press-drag moves)
|
|
25
|
+
// additionally suppresses the SELECTION events — without it the click
|
|
26
|
+
// synthesized on pointer-release would reroute selection to whatever mesh
|
|
27
|
+
// sits under the cursor at release. It must NOT suppress the SPATIAL events
|
|
28
|
+
// (`enter` / `move` / `leave`): a surface-following move tool — a door /
|
|
29
|
+
// window sliding along a wall — runs WITH `inputDragging` set and depends on
|
|
30
|
+
// those events to track the cursor. Consumers that should ignore drag-time
|
|
31
|
+
// spatial events gate on `inputDragging` themselves (the editor's hover and
|
|
32
|
+
// paint paths, box-select), so emitting them during a drag only reaches the
|
|
33
|
+
// active move tool that wants them.
|
|
34
|
+
const spatialSuppressed = () => useViewer.getState().cameraDragging;
|
|
35
|
+
const selectionSuppressed = () => {
|
|
36
|
+
const s = useViewer.getState();
|
|
37
|
+
return s.cameraDragging || s.inputDragging;
|
|
38
|
+
};
|
|
19
39
|
return {
|
|
20
40
|
onPointerDown: (e) => {
|
|
21
|
-
if (
|
|
41
|
+
if (selectionSuppressed())
|
|
22
42
|
return;
|
|
23
43
|
if (e.button !== 0)
|
|
24
44
|
return;
|
|
25
45
|
emit('pointerdown', e);
|
|
26
46
|
},
|
|
27
47
|
onPointerUp: (e) => {
|
|
28
|
-
if (
|
|
48
|
+
if (selectionSuppressed())
|
|
29
49
|
return;
|
|
30
50
|
if (e.button !== 0)
|
|
31
51
|
return;
|
|
@@ -34,32 +54,32 @@ export function useNodeEvents(node, type) {
|
|
|
34
54
|
// which often fails if the mouse moves even 1 pixel.
|
|
35
55
|
emit('click', e);
|
|
36
56
|
},
|
|
37
|
-
onClick: (
|
|
57
|
+
onClick: (_e) => {
|
|
38
58
|
// Disable default R3F click since we synthesize it on pointerup
|
|
39
59
|
// This prevents double-clicks from firing twice.
|
|
40
60
|
},
|
|
41
61
|
onPointerEnter: (e) => {
|
|
42
|
-
if (
|
|
62
|
+
if (spatialSuppressed())
|
|
43
63
|
return;
|
|
44
64
|
emit('enter', e);
|
|
45
65
|
},
|
|
46
66
|
onPointerLeave: (e) => {
|
|
47
|
-
if (
|
|
67
|
+
if (spatialSuppressed())
|
|
48
68
|
return;
|
|
49
69
|
emit('leave', e);
|
|
50
70
|
},
|
|
51
71
|
onPointerMove: (e) => {
|
|
52
|
-
if (
|
|
72
|
+
if (spatialSuppressed())
|
|
53
73
|
return;
|
|
54
74
|
emit('move', e);
|
|
55
75
|
},
|
|
56
76
|
onDoubleClick: (e) => {
|
|
57
|
-
if (
|
|
77
|
+
if (selectionSuppressed())
|
|
58
78
|
return;
|
|
59
79
|
emit('double-click', e);
|
|
60
80
|
},
|
|
61
81
|
onContextMenu: (e) => {
|
|
62
|
-
if (
|
|
82
|
+
if (selectionSuppressed())
|
|
63
83
|
return;
|
|
64
84
|
emit('context-menu', e);
|
|
65
85
|
},
|
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,58 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export type { SurfaceRole } from '@pascal-app/core';
|
|
2
|
+
export { ErrorBoundary } from './components/error-boundary';
|
|
3
|
+
export { NodeRenderer } from './components/renderers/node-renderer';
|
|
4
|
+
export { default as Viewer, type ViewerHandle } from './components/viewer';
|
|
5
|
+
export { type BVHEcctrlApi, default as BVHEcctrl, type MovementInput, } from './components/viewer/bvh-ecctrl';
|
|
6
|
+
export { buildGlbInteractiveItems, GlbInteractive, type GlbInteractiveItem, } from './components/viewer/glb-interactive';
|
|
7
|
+
export { buildGlbReferenceNodes, buildGlbReplaceNodes, } from './components/viewer/glb-reference-nodes';
|
|
8
|
+
export { type GlbHover, type GlbIdentity, type GlbLevel, GlbScene, type GlbWalkthrough, } from './components/viewer/glb-scene';
|
|
9
|
+
export { GlbWalkthroughController } from './components/viewer/glb-walkthrough-controller';
|
|
2
10
|
export type { HoverStyle, HoverStyles } from './components/viewer/post-processing';
|
|
3
11
|
export { DEFAULT_HOVER_STYLES, SSGI_PARAMS, } from './components/viewer/post-processing';
|
|
12
|
+
export { SceneEnvironment } from './components/viewer/scene-environment';
|
|
4
13
|
export { WalkthroughControls } from './components/viewer/walkthrough-controls';
|
|
14
|
+
export { useAssetUrl } from './hooks/use-asset-url';
|
|
15
|
+
export { useGLTFKTX2 } from './hooks/use-gltf-ktx2';
|
|
16
|
+
export { useNodeEvents } from './hooks/use-node-events';
|
|
5
17
|
export { ASSETS_CDN_URL, resolveAssetUrl, resolveCdnUrl } from './lib/asset-url';
|
|
6
|
-
export {
|
|
7
|
-
export {
|
|
18
|
+
export { backdropGradient, deepSkyColor, horizonHazeColor } from './lib/backdrop';
|
|
19
|
+
export { applyWorldScaleBoxUVs } from './lib/box-uv';
|
|
20
|
+
export { ADDITION, Brush, computeGeometryBoundsTree, csgEvaluator, csgGeometry, csgMaterials, INTERSECTION, prepareBrushForCSG, SUBTRACTION, } from './lib/csg-utils';
|
|
21
|
+
export type { EdgeMode } from './lib/edge-style';
|
|
22
|
+
export { applyIsolation, clearIsolation, collectIsolationSubtree, isIsolationActive, } from './lib/isolation';
|
|
23
|
+
export { ensureKtx2Support } from './lib/ktx2-loader';
|
|
24
|
+
export { GRID_LAYER, OVERLAY_LAYER, SCENE_LAYER, ZONE_LAYER } from './lib/layers';
|
|
25
|
+
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';
|
|
8
26
|
export { mergedOutline } from './lib/merged-outline-node';
|
|
9
|
-
export {
|
|
27
|
+
export { unionPolygons } from './lib/polygon-union';
|
|
28
|
+
export { getSceneTheme, SCENE_THEME_IDS, SCENE_THEMES, type SceneTheme, } from './lib/scene-themes';
|
|
29
|
+
export { packNormalToRGB, unpackRGBToNormal } from './lib/tsl-compat';
|
|
30
|
+
export { useItemLightPool } from './store/use-item-light-pool';
|
|
31
|
+
export { applyCountryUnitDefault, default as useViewer } from './store/use-viewer';
|
|
32
|
+
export { CeilingSystem } from './systems/ceiling/ceiling-system';
|
|
33
|
+
export { createColumnBoxGeometry, createColumnCylinderGeometry, createColumnSphereGeometry, createColumnTorusGeometry, } from './systems/column/column-geometry';
|
|
34
|
+
export { DoorAnimationSystem } from './systems/door/door-animation-system';
|
|
35
|
+
export { buildDoorPreviewMesh, DoorSystem, poseDoorMovingParts } from './systems/door/door-system';
|
|
36
|
+
export { ElevatorInteractionSystem } from './systems/elevator/elevator-interaction-system';
|
|
37
|
+
export { FenceSystem, generateFenceGeometry, generateFenceSlotGeometries, } from './systems/fence/fence-system';
|
|
38
|
+
export { FloorElevationSystem } from './systems/floor-elevation/floor-elevation-system';
|
|
39
|
+
export { GuideSystem } from './systems/guide/guide-system';
|
|
10
40
|
export { InteractiveSystem } from './systems/interactive/interactive-system';
|
|
41
|
+
export { ItemSystem } from './systems/item/item-system';
|
|
42
|
+
export { ItemLightSystem } from './systems/item-light/item-light-system';
|
|
43
|
+
export { LevelSystem } from './systems/level/level-system';
|
|
11
44
|
export { snapLevelsToTruePositions } from './systems/level/level-utils';
|
|
12
45
|
export { getRoofMaterialArray } from './systems/roof/roof-materials';
|
|
13
|
-
export {
|
|
46
|
+
export { clipGeometryBySegmentTrim, generateRoofSegmentGeometry, getRoofOuterSurfaceFrameAtPoint, getRoofSegmentBrushes, mapRoofGroupMaterialIndex, ROOF_MATERIAL_SLOT_COUNT, RoofSystem, remapRoofShellFaces, roofCsgDummyMats, type SurfaceFrame, } from './systems/roof/roof-system';
|
|
47
|
+
export { ScanSystem } from './systems/scan/scan-system';
|
|
48
|
+
export { generateSlabGeometry, SlabSystem } from './systems/slab/slab-system';
|
|
49
|
+
export { getStairBodyMaterials, getStairRailingMaterial, getStraightStairSegmentBodyMaterials, type StairBodyMaterials, } from './systems/stair/stair-materials';
|
|
50
|
+
export { StairSystem } from './systems/stair/stair-system';
|
|
51
|
+
export { buildOpeningCutoutGeometry, getOpeningCutoutBottomPadding, hasFlatOpeningCutoutBottom, } from './systems/wall/opening-cutout-geometry';
|
|
52
|
+
export { WallCutout } from './systems/wall/wall-cutout';
|
|
14
53
|
export { getVisibleWallMaterials } from './systems/wall/wall-materials';
|
|
54
|
+
export { WallSystem } from './systems/wall/wall-system';
|
|
55
|
+
export { poseWindowMovingParts, WindowAnimationSystem, } from './systems/window/window-animation-system';
|
|
56
|
+
export { buildWindowPreviewMesh, WindowSystem } from './systems/window/window-system';
|
|
57
|
+
export { ZoneSystem } from './systems/zone/zone-system';
|
|
15
58
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,91 @@
|
|
|
1
|
+
// `NodeRenderer` is the recursive dispatch component used by parent
|
|
2
|
+
// renderers (wall renders doors/windows, slab renders hosted items).
|
|
3
|
+
// Public so registry-driven kinds can compose children without reaching
|
|
4
|
+
// into viewer's internal paths.
|
|
5
|
+
export { ErrorBoundary } from './components/error-boundary';
|
|
6
|
+
// Stage A wrap-exports for the rest of the kinds — `@pascal-app/nodes`
|
|
7
|
+
// registers each via `def.renderer` (and `def.system` when present)
|
|
8
|
+
// Generic dispatch component used by recursive renderers (e.g. level →
|
|
9
|
+
// children, building → children). The per-kind renderers live in
|
|
10
|
+
// `@pascal-app/nodes/<kind>/renderer.tsx` and are loaded by the registry
|
|
11
|
+
// — no per-kind re-exports needed.
|
|
12
|
+
export { NodeRenderer } from './components/renderers/node-renderer';
|
|
1
13
|
export { default as Viewer } from './components/viewer';
|
|
14
|
+
export { default as BVHEcctrl, } from './components/viewer/bvh-ecctrl';
|
|
15
|
+
export { buildGlbInteractiveItems, GlbInteractive, } from './components/viewer/glb-interactive';
|
|
16
|
+
export { buildGlbReferenceNodes, buildGlbReplaceNodes, } from './components/viewer/glb-reference-nodes';
|
|
17
|
+
export { GlbScene, } from './components/viewer/glb-scene';
|
|
18
|
+
export { GlbWalkthroughController } from './components/viewer/glb-walkthrough-controller';
|
|
2
19
|
export { DEFAULT_HOVER_STYLES, SSGI_PARAMS, } from './components/viewer/post-processing';
|
|
20
|
+
export { SceneEnvironment } from './components/viewer/scene-environment';
|
|
3
21
|
export { WalkthroughControls } from './components/viewer/walkthrough-controls';
|
|
22
|
+
export { useAssetUrl } from './hooks/use-asset-url';
|
|
23
|
+
export { useGLTFKTX2 } from './hooks/use-gltf-ktx2';
|
|
24
|
+
export { useNodeEvents } from './hooks/use-node-events';
|
|
4
25
|
export { ASSETS_CDN_URL, resolveAssetUrl, resolveCdnUrl } from './lib/asset-url';
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
26
|
+
export { backdropGradient, deepSkyColor, horizonHazeColor } from './lib/backdrop';
|
|
27
|
+
export { applyWorldScaleBoxUVs } from './lib/box-uv';
|
|
28
|
+
// CSG primitives — used by chimney's roof-trim and other kinds whose
|
|
29
|
+
// geometry subtracts pieces against their host. Lives in viewer
|
|
30
|
+
// because three-bvh-csg / three-mesh-bvh are viewer-only deps.
|
|
31
|
+
export { ADDITION, Brush, computeGeometryBoundsTree, csgEvaluator, csgGeometry, csgMaterials, INTERSECTION, prepareBrushForCSG, SUBTRACTION, } from './lib/csg-utils';
|
|
32
|
+
export { applyIsolation, clearIsolation, collectIsolationSubtree, isIsolationActive, } from './lib/isolation';
|
|
33
|
+
export { ensureKtx2Support } from './lib/ktx2-loader';
|
|
34
|
+
export { GRID_LAYER, OVERLAY_LAYER, SCENE_LAYER, ZONE_LAYER } from './lib/layers';
|
|
35
|
+
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';
|
|
7
36
|
export { mergedOutline } from './lib/merged-outline-node';
|
|
8
|
-
export {
|
|
37
|
+
export { unionPolygons } from './lib/polygon-union';
|
|
38
|
+
export { getSceneTheme, SCENE_THEME_IDS, SCENE_THEMES, } from './lib/scene-themes';
|
|
39
|
+
export { packNormalToRGB, unpackRGBToNormal } from './lib/tsl-compat';
|
|
40
|
+
export { useItemLightPool } from './store/use-item-light-pool';
|
|
41
|
+
export { applyCountryUnitDefault, default as useViewer } from './store/use-viewer';
|
|
42
|
+
export { CeilingSystem } from './systems/ceiling/ceiling-system';
|
|
43
|
+
export { createColumnBoxGeometry, createColumnCylinderGeometry, createColumnSphereGeometry, createColumnTorusGeometry, } from './systems/column/column-geometry';
|
|
44
|
+
export { DoorAnimationSystem } from './systems/door/door-animation-system';
|
|
45
|
+
export { buildDoorPreviewMesh, DoorSystem, poseDoorMovingParts } from './systems/door/door-system';
|
|
46
|
+
export { ElevatorInteractionSystem } from './systems/elevator/elevator-interaction-system';
|
|
47
|
+
// Fence system follows the wall re-export pattern — composed into the
|
|
48
|
+
// registry-driven fence definition's `def.system`. Removed in Phase 6
|
|
49
|
+
// alongside the legacy fence mount point.
|
|
50
|
+
export { FenceSystem, generateFenceGeometry, generateFenceSlotGeometries, } from './systems/fence/fence-system';
|
|
51
|
+
// Generic floor-elevation system. Lifts the rendered mesh of any kind
|
|
52
|
+
// whose definition declares `capabilities.floorPlaced` by the slab
|
|
53
|
+
// elevation under its footprint. Replaces the per-kind elevation block
|
|
54
|
+
// that used to live inside `ItemSystem`.
|
|
55
|
+
export { FloorElevationSystem } from './systems/floor-elevation/floor-elevation-system';
|
|
56
|
+
export { GuideSystem } from './systems/guide/guide-system';
|
|
9
57
|
export { InteractiveSystem } from './systems/interactive/interactive-system';
|
|
58
|
+
// Item systems for the registry-driven item definition. ItemSystem
|
|
59
|
+
// applies attachTo-driven transforms each frame; ItemLightSystem
|
|
60
|
+
// manages item-mounted light sources.
|
|
61
|
+
export { ItemSystem } from './systems/item/item-system';
|
|
62
|
+
export { ItemLightSystem } from './systems/item-light/item-light-system';
|
|
63
|
+
export { LevelSystem } from './systems/level/level-system';
|
|
10
64
|
export { snapLevelsToTruePositions } from './systems/level/level-utils';
|
|
11
65
|
export { getRoofMaterialArray } from './systems/roof/roof-materials';
|
|
12
|
-
|
|
66
|
+
// Generic roof-segment primitives. Kinds that compose CSG against
|
|
67
|
+
// the roof shell (chimney's self-trim, dormer's virtual-segment cut)
|
|
68
|
+
// read these through the public surface. No kind-specific helpers
|
|
69
|
+
// belong here — those live in `@pascal-app/nodes/<kind>/`.
|
|
70
|
+
export { clipGeometryBySegmentTrim, generateRoofSegmentGeometry, getRoofOuterSurfaceFrameAtPoint, getRoofSegmentBrushes, mapRoofGroupMaterialIndex, ROOF_MATERIAL_SLOT_COUNT, RoofSystem, remapRoofShellFaces, roofCsgDummyMats, } from './systems/roof/roof-system';
|
|
71
|
+
export { ScanSystem } from './systems/scan/scan-system';
|
|
72
|
+
// Slab system follows the wall + fence re-export pattern — composed into
|
|
73
|
+
// the registry-driven slab definition's `def.system`. Removed in Phase 6
|
|
74
|
+
// alongside the legacy slab mount point.
|
|
75
|
+
export { generateSlabGeometry, SlabSystem } from './systems/slab/slab-system';
|
|
76
|
+
export { getStairBodyMaterials, getStairRailingMaterial, getStraightStairSegmentBodyMaterials, } from './systems/stair/stair-materials';
|
|
77
|
+
export { StairSystem } from './systems/stair/stair-system';
|
|
78
|
+
// Pure opening-cutout profile math shared by the wall CSG pipeline and
|
|
79
|
+
// roof-wall opening cuts in `@pascal-app/nodes` — keeps shaped holes
|
|
80
|
+
// (arch / rounded / frameless opening) identical across both hosts.
|
|
81
|
+
export { buildOpeningCutoutGeometry, getOpeningCutoutBottomPadding, hasFlatOpeningCutoutBottom, } from './systems/wall/opening-cutout-geometry';
|
|
82
|
+
export { WallCutout } from './systems/wall/wall-cutout';
|
|
13
83
|
export { getVisibleWallMaterials } from './systems/wall/wall-materials';
|
|
84
|
+
// Wall internals re-exported so `@pascal-app/nodes`' registry-driven wall
|
|
85
|
+
// definition can compose them into `def.system` without duplicating the
|
|
86
|
+
// 800+ lines of CSG / mitering logic during Phase 3. These exports are
|
|
87
|
+
// removed in Phase 6 when the legacy mount points are deleted.
|
|
88
|
+
export { WallSystem } from './systems/wall/wall-system';
|
|
89
|
+
export { poseWindowMovingParts, WindowAnimationSystem, } from './systems/window/window-animation-system';
|
|
90
|
+
export { buildWindowPreviewMesh, WindowSystem } from './systems/window/window-system';
|
|
91
|
+
export { ZoneSystem } from './systems/zone/zone-system';
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared backdrop gradient: flat background looking down, a warm haze band
|
|
3
|
+
* hugging the horizon, the theme sky arriving just above it and deepening
|
|
4
|
+
* toward the zenith. One formula serves the post-processing backdrop and the
|
|
5
|
+
* thumbnail pipeline (per-pixel view ray) AND the site horizon disc's
|
|
6
|
+
* far-field dissolve (per-fragment view direction) — the disc converges to
|
|
7
|
+
* exactly this colour, so ground and backdrop meet without a seam from any
|
|
8
|
+
* camera pose.
|
|
9
|
+
*
|
|
10
|
+
* `dirY` is the world-space view direction's Y component (horizon = 0).
|
|
11
|
+
* Colour inputs are TSL nodes (uniforms or literals).
|
|
12
|
+
*/
|
|
13
|
+
export declare function backdropGradient({ dirY, background, haze, sky, skyDeep, }: {
|
|
14
|
+
dirY: any;
|
|
15
|
+
background: any;
|
|
16
|
+
haze: any;
|
|
17
|
+
sky: any;
|
|
18
|
+
skyDeep: any;
|
|
19
|
+
}): any;
|
|
20
|
+
/**
|
|
21
|
+
* Atmospheric haze at the horizon: the theme's *sky* colour pulled toward a
|
|
22
|
+
* warm sun tint — skyish and sunish at once, so the band reads as part of
|
|
23
|
+
* the sky rather than a white stripe. Dark themes keep it faint (a low glow
|
|
24
|
+
* over the night zenith).
|
|
25
|
+
*/
|
|
26
|
+
export declare function horizonHazeColor(sky: string, appearance: 'light' | 'dark'): string;
|
|
27
|
+
/**
|
|
28
|
+
* Zenith colour derived from the theme's sky: saturated and darkened in HSL
|
|
29
|
+
* so the hue stays the theme's own (blue studio, lavender sunset, near-black
|
|
30
|
+
* night) while the top of the frame gets real colour depth.
|
|
31
|
+
*/
|
|
32
|
+
export declare function deepSkyColor(sky: string): string;
|
|
33
|
+
//# sourceMappingURL=backdrop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backdrop.d.ts","sourceRoot":"","sources":["../../src/lib/backdrop.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,UAAU,EACV,IAAI,EACJ,GAAG,EACH,OAAO,GACR,EAAE;IACD,IAAI,EAAE,GAAG,CAAA;IACT,UAAU,EAAE,GAAG,CAAA;IACf,IAAI,EAAE,GAAG,CAAA;IACT,GAAG,EAAE,GAAG,CAAA;IACR,OAAO,EAAE,GAAG,CAAA;CACb,GAAG,GAAG,CAUN;AAMD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAWlF;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAyChD"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { abs, exp, mix, smoothstep } from 'three/tsl';
|
|
2
|
+
/**
|
|
3
|
+
* Shared backdrop gradient: flat background looking down, a warm haze band
|
|
4
|
+
* hugging the horizon, the theme sky arriving just above it and deepening
|
|
5
|
+
* toward the zenith. One formula serves the post-processing backdrop and the
|
|
6
|
+
* thumbnail pipeline (per-pixel view ray) AND the site horizon disc's
|
|
7
|
+
* far-field dissolve (per-fragment view direction) — the disc converges to
|
|
8
|
+
* exactly this colour, so ground and backdrop meet without a seam from any
|
|
9
|
+
* camera pose.
|
|
10
|
+
*
|
|
11
|
+
* `dirY` is the world-space view direction's Y component (horizon = 0).
|
|
12
|
+
* Colour inputs are TSL nodes (uniforms or literals).
|
|
13
|
+
*/
|
|
14
|
+
export function backdropGradient({ dirY, background, haze, sky, skyDeep, }) {
|
|
15
|
+
// The pale sky arrives fast (full by ≈8° elevation) so eye-level frames
|
|
16
|
+
// actually show it, then deepens toward the zenith for a real gradient —
|
|
17
|
+
// a single pale stop reads as a white void with blue "hiding" up top.
|
|
18
|
+
let base = mix(background, sky, smoothstep(-0.02, 0.14, dirY));
|
|
19
|
+
base = mix(base, skyDeep, smoothstep(0.1, 0.55, dirY));
|
|
20
|
+
// Haze as an exponential glow hugging the horizon tightly: C¹-smooth on
|
|
21
|
+
// both sides, so it brightens the junction without ever drawing an edge.
|
|
22
|
+
const hazeWeight = exp(abs(dirY).mul(-11)).mul(0.8);
|
|
23
|
+
return mix(base, haze, hazeWeight);
|
|
24
|
+
}
|
|
25
|
+
// Warm sun tint the haze pulls toward — aerial perspective is sky-coloured
|
|
26
|
+
// light plus a little sun scatter, not white fog.
|
|
27
|
+
const HAZE_SUN_TINT = [255, 244, 222];
|
|
28
|
+
/**
|
|
29
|
+
* Atmospheric haze at the horizon: the theme's *sky* colour pulled toward a
|
|
30
|
+
* warm sun tint — skyish and sunish at once, so the band reads as part of
|
|
31
|
+
* the sky rather than a white stripe. Dark themes keep it faint (a low glow
|
|
32
|
+
* over the night zenith).
|
|
33
|
+
*/
|
|
34
|
+
export function horizonHazeColor(sky, appearance) {
|
|
35
|
+
const amount = appearance === 'dark' ? 0.25 : 0.5;
|
|
36
|
+
const hex = sky.replace('#', '');
|
|
37
|
+
let out = '#';
|
|
38
|
+
for (let i = 0; i < 3; i++) {
|
|
39
|
+
const c = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
|
|
40
|
+
out += Math.round(c + (HAZE_SUN_TINT[i] - c) * amount)
|
|
41
|
+
.toString(16)
|
|
42
|
+
.padStart(2, '0');
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Zenith colour derived from the theme's sky: saturated and darkened in HSL
|
|
48
|
+
* so the hue stays the theme's own (blue studio, lavender sunset, near-black
|
|
49
|
+
* night) while the top of the frame gets real colour depth.
|
|
50
|
+
*/
|
|
51
|
+
export function deepSkyColor(sky) {
|
|
52
|
+
const hex = sky.replace('#', '');
|
|
53
|
+
const r = Number.parseInt(hex.slice(0, 2), 16) / 255;
|
|
54
|
+
const g = Number.parseInt(hex.slice(2, 4), 16) / 255;
|
|
55
|
+
const b = Number.parseInt(hex.slice(4, 6), 16) / 255;
|
|
56
|
+
const max = Math.max(r, g, b);
|
|
57
|
+
const min = Math.min(r, g, b);
|
|
58
|
+
const l = (max + min) / 2;
|
|
59
|
+
const d = max - min;
|
|
60
|
+
let h = 0;
|
|
61
|
+
let s = 0;
|
|
62
|
+
if (d > 0) {
|
|
63
|
+
s = d / (1 - Math.abs(2 * l - 1));
|
|
64
|
+
if (max === r)
|
|
65
|
+
h = ((g - b) / d + (g < b ? 6 : 0)) / 6;
|
|
66
|
+
else if (max === g)
|
|
67
|
+
h = ((b - r) / d + 2) / 6;
|
|
68
|
+
else
|
|
69
|
+
h = ((r - g) / d + 4) / 6;
|
|
70
|
+
}
|
|
71
|
+
const s2 = Math.min(1, s * 1.5 + 0.05);
|
|
72
|
+
const l2 = l * 0.72;
|
|
73
|
+
const c = (1 - Math.abs(2 * l2 - 1)) * s2;
|
|
74
|
+
const x = c * (1 - Math.abs(((h * 6) % 2) - 1));
|
|
75
|
+
const m = l2 - c / 2;
|
|
76
|
+
const sector = Math.floor(h * 6) % 6;
|
|
77
|
+
const rgb = [
|
|
78
|
+
[c, x, 0],
|
|
79
|
+
[x, c, 0],
|
|
80
|
+
[0, c, x],
|
|
81
|
+
[0, x, c],
|
|
82
|
+
[x, 0, c],
|
|
83
|
+
[c, 0, x],
|
|
84
|
+
][sector];
|
|
85
|
+
let out = '#';
|
|
86
|
+
for (const channel of rgb) {
|
|
87
|
+
out += Math.round((channel + m) * 255)
|
|
88
|
+
.toString(16)
|
|
89
|
+
.padStart(2, '0');
|
|
90
|
+
}
|
|
91
|
+
return out;
|
|
92
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BoxGeometry } from 'three';
|
|
2
|
+
/**
|
|
3
|
+
* Rewrite a default `BoxGeometry`'s UVs to world scale — 1 UV unit = 1 metre —
|
|
4
|
+
* so tiled finishes (with `repeat` in tiles-per-metre) render at a consistent
|
|
5
|
+
* real-world scale instead of stretching to fit each face. Matches the
|
|
6
|
+
* world-scale UV convention used by the procedural slab/wall geometry.
|
|
7
|
+
*
|
|
8
|
+
* three.js builds box faces in the fixed order [+X, -X, +Y, -Y, +Z, -Z], four
|
|
9
|
+
* verts each, with UVs spanning 0→1 across the face. Each face's two in-plane
|
|
10
|
+
* dimensions differ, so we scale U/V per face by that face's size in metres.
|
|
11
|
+
*/
|
|
12
|
+
export declare function applyWorldScaleBoxUVs(geometry: BoxGeometry, w: number, h: number, d: number): void;
|
|
13
|
+
//# sourceMappingURL=box-uv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box-uv.d.ts","sourceRoot":"","sources":["../../src/lib/box-uv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAExC;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,WAAW,EACrB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,IAAI,CAsBN"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rewrite a default `BoxGeometry`'s UVs to world scale — 1 UV unit = 1 metre —
|
|
3
|
+
* so tiled finishes (with `repeat` in tiles-per-metre) render at a consistent
|
|
4
|
+
* real-world scale instead of stretching to fit each face. Matches the
|
|
5
|
+
* world-scale UV convention used by the procedural slab/wall geometry.
|
|
6
|
+
*
|
|
7
|
+
* three.js builds box faces in the fixed order [+X, -X, +Y, -Y, +Z, -Z], four
|
|
8
|
+
* verts each, with UVs spanning 0→1 across the face. Each face's two in-plane
|
|
9
|
+
* dimensions differ, so we scale U/V per face by that face's size in metres.
|
|
10
|
+
*/
|
|
11
|
+
export function applyWorldScaleBoxUVs(geometry, w, h, d) {
|
|
12
|
+
const uv = geometry.getAttribute('uv');
|
|
13
|
+
if (!uv || uv.count < 24)
|
|
14
|
+
return; // non-default segmentation — leave as-is
|
|
15
|
+
// [uScaleMetres, vScaleMetres] per face, in three's face order.
|
|
16
|
+
const faceScale = [
|
|
17
|
+
[d, h], // +X
|
|
18
|
+
[d, h], // -X
|
|
19
|
+
[w, d], // +Y
|
|
20
|
+
[w, d], // -Y
|
|
21
|
+
[w, h], // +Z
|
|
22
|
+
[w, h], // -Z
|
|
23
|
+
];
|
|
24
|
+
for (let face = 0; face < 6; face += 1) {
|
|
25
|
+
const [us, vs] = faceScale[face];
|
|
26
|
+
for (let v = 0; v < 4; v += 1) {
|
|
27
|
+
const i = face * 4 + v;
|
|
28
|
+
uv.setXY(i, uv.getX(i) * us, uv.getY(i) * vs);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
uv.needsUpdate = true;
|
|
32
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { type Brush, Evaluator } from 'three-bvh-csg';
|
|
3
|
+
export declare function ensureRenderableGeometryAttributes(geometry: THREE.BufferGeometry): THREE.BufferGeometry;
|
|
4
|
+
export declare function csgGeometry(brush: Brush): THREE.BufferGeometry;
|
|
5
|
+
export declare function csgMaterials(brush: Brush): THREE.Material[];
|
|
6
|
+
export declare const csgEvaluator: Evaluator;
|
|
7
|
+
export declare function computeGeometryBoundsTree(geometry: THREE.BufferGeometry): void;
|
|
8
|
+
export declare function prepareBrushForCSG(brush: Brush): void;
|
|
9
|
+
export { ADDITION, Brush, INTERSECTION, SUBTRACTION } from 'three-bvh-csg';
|
|
10
|
+
//# sourceMappingURL=csg-utils.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { Evaluator } from 'three-bvh-csg';
|
|
3
|
+
import { computeBoundsTree } from 'three-mesh-bvh';
|
|
4
|
+
/**
|
|
5
|
+
* Shared CSG primitives used by kinds whose geometry subtracts pieces
|
|
6
|
+
* against their host (chimney trimmed by the roof shell, skylight
|
|
7
|
+
* frame as a ring cut from a box, etc.). Lives in viewer because
|
|
8
|
+
* three-bvh-csg + three-mesh-bvh are viewer-only deps; kinds living
|
|
9
|
+
* in `@pascal-app/nodes` import these through the public surface.
|
|
10
|
+
*/
|
|
11
|
+
function zeroAttribute(count, itemSize) {
|
|
12
|
+
return new THREE.Float32BufferAttribute(new Float32Array(count * itemSize), itemSize);
|
|
13
|
+
}
|
|
14
|
+
function upNormalAttribute(count) {
|
|
15
|
+
const values = new Float32Array(count * 3);
|
|
16
|
+
for (let index = 0; index < count; index += 1) {
|
|
17
|
+
values[index * 3 + 1] = 1;
|
|
18
|
+
}
|
|
19
|
+
return new THREE.Float32BufferAttribute(values, 3);
|
|
20
|
+
}
|
|
21
|
+
function ensureAttributeCount(geometry, name, itemSize, count) {
|
|
22
|
+
const attribute = geometry.getAttribute(name);
|
|
23
|
+
if (attribute?.count === count && attribute.itemSize === itemSize)
|
|
24
|
+
return;
|
|
25
|
+
geometry.setAttribute(name, zeroAttribute(count, itemSize));
|
|
26
|
+
}
|
|
27
|
+
function copyVec2Attribute(attribute) {
|
|
28
|
+
const values = new Float32Array(attribute.count * 2);
|
|
29
|
+
for (let index = 0; index < attribute.count; index += 1) {
|
|
30
|
+
values[index * 2] = attribute.getX(index);
|
|
31
|
+
values[index * 2 + 1] = attribute.getY(index);
|
|
32
|
+
}
|
|
33
|
+
return new THREE.Float32BufferAttribute(values, 2);
|
|
34
|
+
}
|
|
35
|
+
export function ensureRenderableGeometryAttributes(geometry) {
|
|
36
|
+
const position = geometry.getAttribute('position');
|
|
37
|
+
if (!position || position.count === 0 || position.itemSize !== 3) {
|
|
38
|
+
geometry.setIndex(null);
|
|
39
|
+
geometry.clearGroups();
|
|
40
|
+
geometry.setAttribute('position', zeroAttribute(3, 3));
|
|
41
|
+
geometry.setAttribute('normal', upNormalAttribute(3));
|
|
42
|
+
geometry.setAttribute('uv', zeroAttribute(3, 2));
|
|
43
|
+
geometry.setAttribute('uv2', zeroAttribute(3, 2));
|
|
44
|
+
return geometry;
|
|
45
|
+
}
|
|
46
|
+
const count = position.count;
|
|
47
|
+
const normal = geometry.getAttribute('normal');
|
|
48
|
+
if (normal?.count !== count || normal.itemSize !== 3) {
|
|
49
|
+
geometry.deleteAttribute('normal');
|
|
50
|
+
try {
|
|
51
|
+
geometry.computeVertexNormals();
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
geometry.deleteAttribute('normal');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const computedNormal = geometry.getAttribute('normal');
|
|
58
|
+
if (computedNormal?.count !== count || computedNormal.itemSize !== 3) {
|
|
59
|
+
geometry.setAttribute('normal', upNormalAttribute(count));
|
|
60
|
+
}
|
|
61
|
+
ensureAttributeCount(geometry, 'uv', 2, count);
|
|
62
|
+
const uv = geometry.getAttribute('uv');
|
|
63
|
+
const uv2 = geometry.getAttribute('uv2');
|
|
64
|
+
if (uv2?.count !== count || uv2.itemSize !== 2) {
|
|
65
|
+
geometry.setAttribute('uv2', copyVec2Attribute(uv));
|
|
66
|
+
}
|
|
67
|
+
return geometry;
|
|
68
|
+
}
|
|
69
|
+
export function csgGeometry(brush) {
|
|
70
|
+
return ensureRenderableGeometryAttributes(brush.geometry);
|
|
71
|
+
}
|
|
72
|
+
export function csgMaterials(brush) {
|
|
73
|
+
const mat = brush.material;
|
|
74
|
+
return Array.isArray(mat) ? mat : [mat];
|
|
75
|
+
}
|
|
76
|
+
export const csgEvaluator = new Evaluator();
|
|
77
|
+
csgEvaluator.useGroups = true;
|
|
78
|
+
csgEvaluator.consolidateGroups = false;
|
|
79
|
+
csgEvaluator.attributes = ['position', 'normal', 'uv', 'uv2'];
|
|
80
|
+
export function computeGeometryBoundsTree(geometry) {
|
|
81
|
+
;
|
|
82
|
+
geometry.computeBoundsTree =
|
|
83
|
+
computeBoundsTree;
|
|
84
|
+
geometry.computeBoundsTree({ maxLeafSize: 10 });
|
|
85
|
+
}
|
|
86
|
+
export function prepareBrushForCSG(brush) {
|
|
87
|
+
ensureRenderableGeometryAttributes(brush.geometry);
|
|
88
|
+
computeGeometryBoundsTree(brush.geometry);
|
|
89
|
+
brush.updateMatrixWorld();
|
|
90
|
+
}
|
|
91
|
+
// Re-export Brush + SUBTRACTION + ADDITION + INTERSECTION so kinds don't need a
|
|
92
|
+
// direct `three-bvh-csg` dependency.
|
|
93
|
+
export { ADDITION, Brush, INTERSECTION, SUBTRACTION } from 'three-bvh-csg';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csg-utils.test.d.ts","sourceRoot":"","sources":["../../src/lib/csg-utils.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// @ts-expect-error — bun:test is provided by the Bun runtime; viewer does not
|
|
2
|
+
// depend on @types/bun so the import type is unresolved at compile time.
|
|
3
|
+
import { describe, expect, test } from 'bun:test';
|
|
4
|
+
import * as THREE from 'three';
|
|
5
|
+
import { ensureRenderableGeometryAttributes } from './csg-utils';
|
|
6
|
+
describe('ensureRenderableGeometryAttributes', () => {
|
|
7
|
+
test('fills missing render attributes to match position count', () => {
|
|
8
|
+
const geometry = new THREE.BufferGeometry();
|
|
9
|
+
geometry.setAttribute('position', new THREE.Float32BufferAttribute(new Float32Array([0, 0, 0, 1, 0, 0, 0, 1, 0]), 3));
|
|
10
|
+
ensureRenderableGeometryAttributes(geometry);
|
|
11
|
+
expect(geometry.getAttribute('position')?.count).toBe(3);
|
|
12
|
+
expect(geometry.getAttribute('normal')?.count).toBe(3);
|
|
13
|
+
expect(geometry.getAttribute('uv')?.count).toBe(3);
|
|
14
|
+
expect(geometry.getAttribute('uv2')?.count).toBe(3);
|
|
15
|
+
});
|
|
16
|
+
test('replaces render attributes with the wrong item size', () => {
|
|
17
|
+
const geometry = new THREE.BufferGeometry();
|
|
18
|
+
geometry.setAttribute('position', new THREE.Float32BufferAttribute(new Float32Array([0, 0, 0, 1, 0, 0, 0, 1, 0]), 3));
|
|
19
|
+
geometry.setAttribute('uv', new THREE.Float32BufferAttribute(new Float32Array([0, 0, 0]), 1));
|
|
20
|
+
geometry.setAttribute('uv2', new THREE.Float32BufferAttribute(new Float32Array([0, 0, 0]), 1));
|
|
21
|
+
ensureRenderableGeometryAttributes(geometry);
|
|
22
|
+
expect(geometry.getAttribute('uv')?.itemSize).toBe(2);
|
|
23
|
+
expect(geometry.getAttribute('uv2')?.itemSize).toBe(2);
|
|
24
|
+
expect(geometry.getAttribute('uv')?.count).toBe(3);
|
|
25
|
+
expect(geometry.getAttribute('uv2')?.count).toBe(3);
|
|
26
|
+
});
|
|
27
|
+
test('copies uv into uv2 without depending on backing array layout', () => {
|
|
28
|
+
const geometry = new THREE.BufferGeometry();
|
|
29
|
+
geometry.setAttribute('position', new THREE.Float32BufferAttribute(new Float32Array([0, 0, 0, 1, 0, 0, 0, 1, 0]), 3));
|
|
30
|
+
geometry.setAttribute('uv', new THREE.InterleavedBufferAttribute(new THREE.InterleavedBuffer(new Float32Array([0, 0, 7, 1, 0, 8, 0, 1, 9]), 3), 2, 0));
|
|
31
|
+
ensureRenderableGeometryAttributes(geometry);
|
|
32
|
+
const uv2 = geometry.getAttribute('uv2');
|
|
33
|
+
expect(Array.from(uv2.array)).toEqual([0, 0, 1, 0, 0, 1]);
|
|
34
|
+
});
|
|
35
|
+
test('replaces empty geometries with a degenerate renderable triangle', () => {
|
|
36
|
+
const geometry = new THREE.BufferGeometry();
|
|
37
|
+
ensureRenderableGeometryAttributes(geometry);
|
|
38
|
+
expect(geometry.getIndex()).toBeNull();
|
|
39
|
+
expect(geometry.groups).toHaveLength(0);
|
|
40
|
+
expect(geometry.getAttribute('position')?.count).toBe(3);
|
|
41
|
+
expect(geometry.getAttribute('normal')?.count).toBe(3);
|
|
42
|
+
expect(geometry.getAttribute('uv')?.count).toBe(3);
|
|
43
|
+
expect(geometry.getAttribute('uv2')?.count).toBe(3);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BufferGeometry } from 'three';
|
|
2
|
+
/**
|
|
3
|
+
* True when `geometry` has a bound, non-empty `position` attribute — i.e. it is
|
|
4
|
+
* safe to submit to the WebGPU renderer.
|
|
5
|
+
*
|
|
6
|
+
* A geometry whose `position` attribute has `count === 0` (or no `position` at
|
|
7
|
+
* all) leaves WebGPU **vertex buffer slot 0 unbound**. The validator rejects the
|
|
8
|
+
* draw with "Vertex buffer slot 0 … was not set", and — critically — that single
|
|
9
|
+
* rejected draw **poisons the entire command encoder**: every other draw in the
|
|
10
|
+
* frame (the whole scene + every editor overlay) is discarded on the next queue
|
|
11
|
+
* submit ("Invalid CommandBuffer"). The visible result is the whole canvas
|
|
12
|
+
* flickering/garbling, not just the offending mesh.
|
|
13
|
+
*
|
|
14
|
+
* Individual call-sites guard against *creating* empty geometry (see
|
|
15
|
+
* `createPlaceholderGeometry`, the ceiling/door degenerate fallbacks, etc.), but
|
|
16
|
+
* transient/derived geometries can still slip through. This predicate is the
|
|
17
|
+
* renderer-level safety net: skipping a count-0 draw is a no-op visually (it
|
|
18
|
+
* would draw nothing anyway) while keeping the command encoder healthy.
|
|
19
|
+
*/
|
|
20
|
+
export declare function hasDrawableGeometry(geometry: BufferGeometry | undefined | null): boolean;
|
|
21
|
+
//# sourceMappingURL=drawable-geometry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drawable-geometry.d.ts","sourceRoot":"","sources":["../../src/lib/drawable-geometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAE3C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAGxF"}
|