@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
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import type { AnyNode, BaseNode, BuildingNode, LevelNode, ZoneNode } from '@pascal-app/core';
|
|
2
2
|
import type { Object3D } from 'three';
|
|
3
|
+
import type { EdgeMode } from '../lib/edge-style';
|
|
4
|
+
import type { ColorPreset, RenderShading } from '../lib/materials';
|
|
5
|
+
export type RenderContext = 'editor' | 'viewer';
|
|
3
6
|
type SelectionPath = {
|
|
4
7
|
buildingId: BuildingNode['id'] | null;
|
|
5
8
|
levelId: LevelNode['id'] | null;
|
|
@@ -20,8 +23,21 @@ type ViewerState = {
|
|
|
20
23
|
setHoveredId: (id: AnyNode['id'] | ZoneNode['id'] | null) => void;
|
|
21
24
|
cameraMode: 'perspective' | 'orthographic';
|
|
22
25
|
setCameraMode: (mode: 'perspective' | 'orthographic') => void;
|
|
23
|
-
|
|
24
|
-
|
|
26
|
+
sceneTheme: string;
|
|
27
|
+
setSceneTheme: (id: string) => void;
|
|
28
|
+
renderContext: RenderContext;
|
|
29
|
+
setRenderContext: (context: RenderContext) => void;
|
|
30
|
+
shading: RenderShading;
|
|
31
|
+
shadingByContext: Partial<Record<RenderContext, RenderShading>>;
|
|
32
|
+
setShading: (shading: RenderShading) => void;
|
|
33
|
+
textures: boolean;
|
|
34
|
+
setTextures: (textures: boolean) => void;
|
|
35
|
+
colorPreset: ColorPreset;
|
|
36
|
+
setColorPreset: (preset: ColorPreset) => void;
|
|
37
|
+
edges: EdgeMode;
|
|
38
|
+
setEdges: (edges: EdgeMode) => void;
|
|
39
|
+
shadows: boolean;
|
|
40
|
+
setShadows: (shadows: boolean) => void;
|
|
25
41
|
unit: 'metric' | 'imperial';
|
|
26
42
|
setUnit: (unit: 'metric' | 'imperial') => void;
|
|
27
43
|
levelMode: 'stacked' | 'exploded' | 'solo' | 'manual';
|
|
@@ -52,6 +68,18 @@ type ViewerState = {
|
|
|
52
68
|
setWalkthroughMode: (mode: boolean) => void;
|
|
53
69
|
cameraDragging: boolean;
|
|
54
70
|
setCameraDragging: (dragging: boolean) => void;
|
|
71
|
+
/**
|
|
72
|
+
* True while a host-driven drag is in progress (editor handles —
|
|
73
|
+
* height arrow, width arrow, etc.). Suppresses node pointer event
|
|
74
|
+
* routing so the synthetic click on pointerup doesn't reroute
|
|
75
|
+
* selection to whatever mesh the cursor lands on at release.
|
|
76
|
+
* Conceptually a sibling of `cameraDragging` — both mean "user is
|
|
77
|
+
* dragging; don't treat the next pointerup as a click on the
|
|
78
|
+
* scene." Set by the host (e.g. `NodeArrowHandles` in the editor);
|
|
79
|
+
* the viewer only reads it.
|
|
80
|
+
*/
|
|
81
|
+
inputDragging: boolean;
|
|
82
|
+
setInputDragging: (dragging: boolean) => void;
|
|
55
83
|
};
|
|
56
84
|
declare const useViewer: import("zustand").UseBoundStore<Omit<import("zustand").StoreApi<ViewerState>, "setState" | "persist"> & {
|
|
57
85
|
setState(partial: ViewerState | Partial<ViewerState> | ((state: ViewerState) => ViewerState | Partial<ViewerState>), replace?: false | undefined): unknown;
|
|
@@ -59,7 +87,12 @@ declare const useViewer: import("zustand").UseBoundStore<Omit<import("zustand").
|
|
|
59
87
|
persist: {
|
|
60
88
|
setOptions: (options: Partial<import("zustand/middleware").PersistOptions<ViewerState, {
|
|
61
89
|
cameraMode: "perspective" | "orthographic";
|
|
62
|
-
|
|
90
|
+
sceneTheme: string;
|
|
91
|
+
shadingByContext: Partial<Record<RenderContext, RenderShading>>;
|
|
92
|
+
textures: boolean;
|
|
93
|
+
colorPreset: ColorPreset;
|
|
94
|
+
edges: EdgeMode;
|
|
95
|
+
shadows: boolean;
|
|
63
96
|
unit: "metric" | "imperial";
|
|
64
97
|
levelMode: "manual" | "stacked" | "exploded" | "solo";
|
|
65
98
|
wallMode: "up" | "down" | "cutaway";
|
|
@@ -76,7 +109,12 @@ declare const useViewer: import("zustand").UseBoundStore<Omit<import("zustand").
|
|
|
76
109
|
onFinishHydration: (fn: (state: ViewerState) => void) => () => void;
|
|
77
110
|
getOptions: () => Partial<import("zustand/middleware").PersistOptions<ViewerState, {
|
|
78
111
|
cameraMode: "perspective" | "orthographic";
|
|
79
|
-
|
|
112
|
+
sceneTheme: string;
|
|
113
|
+
shadingByContext: Partial<Record<RenderContext, RenderShading>>;
|
|
114
|
+
textures: boolean;
|
|
115
|
+
colorPreset: ColorPreset;
|
|
116
|
+
edges: EdgeMode;
|
|
117
|
+
shadows: boolean;
|
|
80
118
|
unit: "metric" | "imperial";
|
|
81
119
|
levelMode: "manual" | "stacked" | "exploded" | "solo";
|
|
82
120
|
wallMode: "up" | "down" | "cutaway";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-viewer.d.ts","sourceRoot":"","sources":["../../src/store/use-viewer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"use-viewer.d.ts","sourceRoot":"","sources":["../../src/store/use-viewer.ts"],"names":[],"mappings":"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"}
|
package/dist/store/use-viewer.js
CHANGED
|
@@ -11,8 +11,24 @@ const useViewer = create()(persist((set) => ({
|
|
|
11
11
|
setHoveredId: (id) => set((state) => (state.hoveredId === id ? state : { hoveredId: id })),
|
|
12
12
|
cameraMode: 'perspective',
|
|
13
13
|
setCameraMode: (mode) => set({ cameraMode: mode }),
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
sceneTheme: 'studio',
|
|
15
|
+
setSceneTheme: (id) => set({ sceneTheme: id }),
|
|
16
|
+
renderContext: 'editor',
|
|
17
|
+
setRenderContext: (context) => set({ renderContext: context }),
|
|
18
|
+
shading: 'rendered',
|
|
19
|
+
shadingByContext: {},
|
|
20
|
+
setShading: (shading) => set((state) => ({
|
|
21
|
+
shading,
|
|
22
|
+
shadingByContext: { ...state.shadingByContext, [state.renderContext]: shading },
|
|
23
|
+
})),
|
|
24
|
+
textures: true,
|
|
25
|
+
setTextures: (textures) => set({ textures }),
|
|
26
|
+
colorPreset: 'clay',
|
|
27
|
+
setColorPreset: (preset) => set({ colorPreset: preset }),
|
|
28
|
+
edges: 'soft',
|
|
29
|
+
setEdges: (edges) => set({ edges }),
|
|
30
|
+
shadows: true,
|
|
31
|
+
setShadows: (shadows) => set({ shadows }),
|
|
16
32
|
unit: 'metric',
|
|
17
33
|
setUnit: (unit) => set({ unit }),
|
|
18
34
|
levelMode: 'stacked',
|
|
@@ -106,11 +122,18 @@ const useViewer = create()(persist((set) => ({
|
|
|
106
122
|
setWalkthroughMode: (mode) => set({ walkthroughMode: mode }),
|
|
107
123
|
cameraDragging: false,
|
|
108
124
|
setCameraDragging: (dragging) => set({ cameraDragging: dragging }),
|
|
125
|
+
inputDragging: false,
|
|
126
|
+
setInputDragging: (dragging) => set({ inputDragging: dragging }),
|
|
109
127
|
}), {
|
|
110
128
|
name: 'viewer-preferences',
|
|
111
129
|
partialize: (state) => ({
|
|
112
130
|
cameraMode: state.cameraMode,
|
|
113
|
-
|
|
131
|
+
sceneTheme: state.sceneTheme,
|
|
132
|
+
shadingByContext: state.shadingByContext,
|
|
133
|
+
textures: state.textures,
|
|
134
|
+
colorPreset: state.colorPreset,
|
|
135
|
+
edges: state.edges,
|
|
136
|
+
shadows: state.shadows,
|
|
114
137
|
unit: state.unit,
|
|
115
138
|
levelMode: state.levelMode,
|
|
116
139
|
wallMode: state.wallMode,
|
|
@@ -2,7 +2,11 @@ import { type CeilingNode } from '@pascal-app/core';
|
|
|
2
2
|
import * as THREE from 'three';
|
|
3
3
|
export declare const CeilingSystem: () => null;
|
|
4
4
|
/**
|
|
5
|
-
* Generates flat ceiling geometry from polygon (no extrusion)
|
|
5
|
+
* Generates flat ceiling geometry from polygon (no extrusion).
|
|
6
|
+
*
|
|
7
|
+
* `extraHoles` are transient, derived cutouts (e.g. recessed-fixture
|
|
8
|
+
* footprints) that are cut alongside the node's persisted `holes` but never
|
|
9
|
+
* stored on the node — they are recomputed on every rebuild.
|
|
6
10
|
*/
|
|
7
|
-
export declare function generateCeilingGeometry(ceilingNode: CeilingNode): THREE.BufferGeometry;
|
|
11
|
+
export declare function generateCeilingGeometry(ceilingNode: CeilingNode, extraHoles?: Array<Array<[number, number]>>): THREE.BufferGeometry;
|
|
8
12
|
//# sourceMappingURL=ceiling-system.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ceiling-system.d.ts","sourceRoot":"","sources":["../../../src/systems/ceiling/ceiling-system.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ceiling-system.d.ts","sourceRoot":"","sources":["../../../src/systems/ceiling/ceiling-system.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EAMjB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAgB9B,eAAO,MAAM,aAAa,YA4BzB,CAAA;AA2DD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,WAAW,EACxB,UAAU,GAAE,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAM,GAC9C,KAAK,CAAC,cAAc,CA0DtB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { sceneRegistry, useScene } from '@pascal-app/core';
|
|
1
|
+
import { getEffectiveNode, nodeRegistry, sceneRegistry, useLiveTransforms, useScene, } from '@pascal-app/core';
|
|
2
2
|
import { useFrame } from '@react-three/fiber';
|
|
3
3
|
import * as THREE from 'three';
|
|
4
|
+
import { mergeSurfaceHolePolygons } from '../surface-hole-geometry';
|
|
4
5
|
function ensureUv2Attribute(geometry) {
|
|
5
6
|
const uv = geometry.getAttribute('uv');
|
|
6
7
|
if (!uv)
|
|
@@ -24,7 +25,12 @@ export const CeilingSystem = () => {
|
|
|
24
25
|
return;
|
|
25
26
|
const mesh = sceneRegistry.nodes.get(id);
|
|
26
27
|
if (mesh) {
|
|
27
|
-
|
|
28
|
+
// Merge any live drag override so the polygon / height resize
|
|
29
|
+
// arrow rebuilds the mesh at pointer rate — zustand only learns
|
|
30
|
+
// the final value on commit. Mirrors WallSystem / GeometrySystem.
|
|
31
|
+
const effective = getEffectiveNode(node);
|
|
32
|
+
const itemHoles = collectCeilingHoles(effective, nodes);
|
|
33
|
+
updateCeilingGeometry(effective, mesh, itemHoles);
|
|
28
34
|
clearDirty(id);
|
|
29
35
|
}
|
|
30
36
|
// If mesh not found, keep it dirty for next frame
|
|
@@ -32,28 +38,70 @@ export const CeilingSystem = () => {
|
|
|
32
38
|
});
|
|
33
39
|
return null;
|
|
34
40
|
};
|
|
41
|
+
/**
|
|
42
|
+
* Collects ceiling-hole polygons from child nodes that declare the `ceilingCut`
|
|
43
|
+
* capability. Each child's `buildCeilingHole` returns a rotated-rectangle
|
|
44
|
+
* footprint in ceiling-local [x, z] space (or `null` to opt out), which is
|
|
45
|
+
* merged as an extra hole before triangulation.
|
|
46
|
+
*
|
|
47
|
+
* The viewer never branches on `child.type` — the dispatch goes through
|
|
48
|
+
* `nodeRegistry`, so any future kind (a heat lamp, a skylight panel, …) can
|
|
49
|
+
* participate just by declaring `capabilities.ceilingCut` on its definition.
|
|
50
|
+
*/
|
|
51
|
+
function collectCeilingHoles(ceiling, nodes) {
|
|
52
|
+
const holes = [];
|
|
53
|
+
for (const childId of ceiling.children ?? []) {
|
|
54
|
+
const child = nodes[childId];
|
|
55
|
+
if (!child)
|
|
56
|
+
continue;
|
|
57
|
+
const def = nodeRegistry.get(child.type);
|
|
58
|
+
const hole = def?.capabilities?.ceilingCut?.buildCeilingHole(child);
|
|
59
|
+
if (hole)
|
|
60
|
+
holes.push(hole);
|
|
61
|
+
}
|
|
62
|
+
return holes;
|
|
63
|
+
}
|
|
35
64
|
/**
|
|
36
65
|
* Updates the geometry for a single ceiling
|
|
37
66
|
*/
|
|
38
|
-
function updateCeilingGeometry(node, mesh) {
|
|
39
|
-
const newGeo = generateCeilingGeometry(node);
|
|
67
|
+
function updateCeilingGeometry(node, mesh, extraHoles = []) {
|
|
68
|
+
const newGeo = generateCeilingGeometry(node, extraHoles);
|
|
40
69
|
mesh.geometry.dispose();
|
|
41
70
|
mesh.geometry = newGeo;
|
|
42
71
|
const gridMesh = mesh.getObjectByName('ceiling-grid');
|
|
43
72
|
if (gridMesh) {
|
|
44
73
|
gridMesh.geometry.dispose();
|
|
45
|
-
gridMesh.geometry = newGeo;
|
|
74
|
+
gridMesh.geometry = newGeo.clone();
|
|
46
75
|
}
|
|
47
|
-
// Position at the ceiling height
|
|
48
|
-
|
|
76
|
+
// Position at the ceiling height and reset X/Z so live-drag mesh
|
|
77
|
+
// offsets (set by move tools during the drag) don't leak into the
|
|
78
|
+
// canonical position after the rebuild. Matches the pattern used by
|
|
79
|
+
// FenceSystem.updateFenceGeometry / GeometrySystem (both fully reset
|
|
80
|
+
// position+rotation after rebuild).
|
|
81
|
+
const liveTransform = useLiveTransforms.getState().get(node.id);
|
|
82
|
+
mesh.position.x = liveTransform?.position[0] ?? 0;
|
|
83
|
+
mesh.position.z = liveTransform?.position[2] ?? 0;
|
|
84
|
+
mesh.position.y = (node.height ?? 2.5) - 0.01 + (liveTransform?.position[1] ?? 0); // Slight offset to avoid z-fighting with upper-level slabs
|
|
49
85
|
}
|
|
50
86
|
/**
|
|
51
|
-
* Generates flat ceiling geometry from polygon (no extrusion)
|
|
87
|
+
* Generates flat ceiling geometry from polygon (no extrusion).
|
|
88
|
+
*
|
|
89
|
+
* `extraHoles` are transient, derived cutouts (e.g. recessed-fixture
|
|
90
|
+
* footprints) that are cut alongside the node's persisted `holes` but never
|
|
91
|
+
* stored on the node — they are recomputed on every rebuild.
|
|
52
92
|
*/
|
|
53
|
-
export function generateCeilingGeometry(ceilingNode) {
|
|
93
|
+
export function generateCeilingGeometry(ceilingNode, extraHoles = []) {
|
|
54
94
|
const polygon = ceilingNode.polygon;
|
|
55
95
|
if (polygon.length < 3) {
|
|
56
|
-
|
|
96
|
+
// A degenerate ceiling (fewer than 3 points, e.g. mid-edit) still gets a
|
|
97
|
+
// non-empty position buffer — three zero-vertices forming one invisible
|
|
98
|
+
// triangle. An empty attribute (count 0) would leave WebGPU vertex buffer
|
|
99
|
+
// slot 0 unbound when this mesh (and its cloned grid overlay) is drawn,
|
|
100
|
+
// which the validator rejects ("slot 0 … was not set") and which poisons
|
|
101
|
+
// the whole command encoder.
|
|
102
|
+
const degenerate = new THREE.BufferGeometry();
|
|
103
|
+
degenerate.setAttribute('position', new THREE.Float32BufferAttribute(new Float32Array(9), 3));
|
|
104
|
+
return degenerate;
|
|
57
105
|
}
|
|
58
106
|
// Create shape from polygon
|
|
59
107
|
// Shape is in X-Y plane, we'll rotate to X-Z plane
|
|
@@ -66,8 +114,10 @@ export function generateCeilingGeometry(ceilingNode) {
|
|
|
66
114
|
shape.lineTo(pt[0], -pt[1]);
|
|
67
115
|
}
|
|
68
116
|
shape.closePath();
|
|
69
|
-
// Add holes to the shape
|
|
70
|
-
|
|
117
|
+
// Add holes to the shape: persisted structural openings (stair/elevator/
|
|
118
|
+
// manual, merged to dissolve overlaps) plus transient recessed-fixture
|
|
119
|
+
// cutouts. Both are in the same ceiling-local [x, z] space.
|
|
120
|
+
const holes = [...mergeSurfaceHolePolygons(ceilingNode.holes || []), ...extraHoles];
|
|
71
121
|
for (const holePolygon of holes) {
|
|
72
122
|
if (holePolygon.length < 3)
|
|
73
123
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"door-system.d.ts","sourceRoot":"","sources":["../../../src/systems/door/door-system.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"door-system.d.ts","sourceRoot":"","sources":["../../../src/systems/door/door-system.tsx"],"names":[],"mappings":"AA8CA,eAAO,MAAM,UAAU,YAwFtB,CAAA"}
|