@pascal-app/editor 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +9 -5
- package/src/components/editor/bottom-sheet.tsx +149 -0
- package/src/components/editor/custom-camera-controls.tsx +75 -7
- package/src/components/editor/editor-layout-mobile.tsx +264 -0
- package/src/components/editor/editor-layout-v2.tsx +20 -0
- package/src/components/editor/first-person/build-collider-world.ts +365 -0
- package/src/components/editor/first-person/bvh-ecctrl.tsx +795 -0
- package/src/components/editor/first-person-controls.tsx +496 -143
- package/src/components/editor/floating-action-menu.tsx +32 -55
- package/src/components/editor/floorplan-background-selection.ts +113 -0
- package/src/components/editor/floorplan-panel.tsx +9855 -3298
- package/src/components/editor/index.tsx +269 -21
- package/src/components/editor/selection-manager.tsx +575 -13
- package/src/components/editor/thumbnail-generator.tsx +38 -7
- package/src/components/editor/use-floorplan-background-placement.ts +257 -0
- package/src/components/editor/use-floorplan-hit-testing.ts +171 -0
- package/src/components/editor/use-floorplan-scene-data.ts +189 -0
- package/src/components/editor/wall-measurement-label.tsx +267 -36
- package/src/components/editor-2d/floorplan-action-menu-layer.tsx +95 -0
- package/src/components/editor-2d/floorplan-cursor-indicator-overlay.tsx +160 -0
- package/src/components/editor-2d/floorplan-hotkey-handlers.tsx +92 -0
- package/src/components/editor-2d/renderers/floorplan-draft-layer.tsx +119 -0
- package/src/components/editor-2d/renderers/floorplan-marquee-layer.tsx +58 -0
- package/src/components/editor-2d/renderers/floorplan-measurements-layer.tsx +197 -0
- package/src/components/editor-2d/renderers/floorplan-roof-layer.tsx +113 -0
- package/src/components/editor-2d/renderers/floorplan-stair-layer.tsx +474 -0
- package/src/components/editor-2d/svg-paths.ts +119 -0
- package/src/components/tools/ceiling/ceiling-boundary-editor.tsx +1 -0
- package/src/components/tools/ceiling/ceiling-hole-editor.tsx +1 -0
- package/src/components/tools/ceiling/ceiling-tool.tsx +5 -5
- package/src/components/tools/column/column-tool.tsx +97 -0
- package/src/components/tools/column/move-column-tool.tsx +105 -0
- package/src/components/tools/door/door-tool.tsx +7 -0
- package/src/components/tools/door/move-door-tool.tsx +28 -8
- package/src/components/tools/fence/fence-drafting.ts +10 -3
- package/src/components/tools/fence/fence-tool.tsx +159 -3
- package/src/components/tools/fence/move-fence-endpoint-tool.tsx +129 -18
- package/src/components/tools/fence/move-fence-tool.tsx +101 -34
- package/src/components/tools/item/move-tool.tsx +10 -1
- package/src/components/tools/item/placement-math.ts +30 -1
- package/src/components/tools/item/placement-strategies.ts +109 -31
- package/src/components/tools/item/placement-types.ts +7 -0
- package/src/components/tools/item/use-draft-node.ts +2 -0
- package/src/components/tools/item/use-placement-coordinator.tsx +660 -52
- package/src/components/tools/roof/move-roof-tool.tsx +22 -15
- package/src/components/tools/shared/polygon-editor.tsx +153 -28
- package/src/components/tools/shared/segment-angle.ts +156 -0
- package/src/components/tools/slab/slab-boundary-editor.tsx +1 -0
- package/src/components/tools/slab/slab-hole-editor.tsx +1 -0
- package/src/components/tools/spawn/move-spawn-tool.tsx +101 -0
- package/src/components/tools/spawn/spawn-tool.tsx +130 -0
- package/src/components/tools/tool-manager.tsx +18 -3
- package/src/components/tools/wall/move-wall-endpoint-tool.tsx +121 -20
- package/src/components/tools/wall/wall-drafting.ts +18 -9
- package/src/components/tools/wall/wall-tool.tsx +134 -2
- package/src/components/tools/window/move-window-tool.tsx +18 -0
- package/src/components/tools/window/window-tool.tsx +5 -0
- package/src/components/ui/action-menu/camera-actions.tsx +37 -33
- package/src/components/ui/action-menu/control-modes.tsx +28 -1
- package/src/components/ui/action-menu/index.tsx +91 -1
- package/src/components/ui/action-menu/structure-tools.tsx +2 -0
- package/src/components/ui/action-menu/view-toggles.tsx +424 -35
- package/src/components/ui/command-palette/editor-commands.tsx +18 -1
- package/src/components/ui/controls/material-picker.tsx +152 -165
- package/src/components/ui/controls/slider-control.tsx +66 -18
- package/src/components/ui/floating-level-selector.tsx +286 -55
- package/src/components/ui/helpers/helper-manager.tsx +5 -0
- package/src/components/ui/item-catalog/catalog-items.tsx +1116 -1219
- package/src/components/ui/item-catalog/item-catalog.tsx +42 -175
- package/src/components/ui/level-duplicate-dialog.tsx +115 -0
- package/src/components/ui/panels/ceiling-panel.tsx +1 -25
- package/src/components/ui/panels/column-panel.tsx +715 -0
- package/src/components/ui/panels/door-panel.tsx +981 -289
- package/src/components/ui/panels/fence-panel.tsx +3 -45
- package/src/components/ui/panels/mobile-panel-sheet.tsx +108 -0
- package/src/components/ui/panels/mobile-selection-bar.tsx +100 -0
- package/src/components/ui/panels/node-display.ts +39 -0
- package/src/components/ui/panels/paint-panel.tsx +138 -0
- package/src/components/ui/panels/panel-manager.tsx +210 -1
- package/src/components/ui/panels/panel-wrapper.tsx +48 -39
- package/src/components/ui/panels/reference-panel.tsx +238 -5
- package/src/components/ui/panels/roof-panel.tsx +4 -105
- package/src/components/ui/panels/roof-segment-panel.tsx +0 -25
- package/src/components/ui/panels/slab-panel.tsx +4 -30
- package/src/components/ui/panels/spawn-panel.tsx +155 -0
- package/src/components/ui/panels/stair-panel.tsx +11 -117
- package/src/components/ui/panels/stair-segment-panel.tsx +0 -25
- package/src/components/ui/panels/wall-panel.tsx +1 -95
- package/src/components/ui/panels/window-panel.tsx +660 -139
- package/src/components/ui/sidebar/mobile-tab-bar.tsx +46 -0
- package/src/components/ui/sidebar/panels/settings-panel/keyboard-shortcuts-dialog.tsx +2 -2
- package/src/components/ui/sidebar/panels/site-panel/building-tree-node.tsx +2 -2
- package/src/components/ui/sidebar/panels/site-panel/column-tree-node.tsx +77 -0
- package/src/components/ui/sidebar/panels/site-panel/index.tsx +109 -24
- package/src/components/ui/sidebar/panels/site-panel/level-tree-node.tsx +2 -2
- package/src/components/ui/sidebar/panels/site-panel/spawn-tree-node.tsx +82 -0
- package/src/components/ui/sidebar/panels/site-panel/tree-node.tsx +9 -3
- package/src/components/ui/sidebar/panels/site-panel/zone-tree-node.tsx +8 -5
- package/src/components/ui/sidebar/tab-bar.tsx +3 -0
- package/src/components/ui/viewer-toolbar.tsx +42 -1
- package/src/hooks/use-auto-frame.ts +45 -0
- package/src/hooks/use-keyboard.ts +64 -7
- package/src/hooks/use-mobile.ts +12 -12
- package/src/lib/door-interaction.ts +88 -0
- package/src/lib/floorplan/geometry.ts +263 -0
- package/src/lib/floorplan/index.ts +38 -0
- package/src/lib/floorplan/items.ts +179 -0
- package/src/lib/floorplan/selection-tool.ts +231 -0
- package/src/lib/floorplan/stairs.ts +478 -0
- package/src/lib/floorplan/types.ts +57 -0
- package/src/lib/floorplan/walls.ts +23 -0
- package/src/lib/guide-events.ts +10 -0
- package/src/lib/level-duplication.test.ts +72 -0
- package/src/lib/level-duplication.ts +153 -0
- package/src/lib/local-guide-image.ts +42 -0
- package/src/lib/material-paint.ts +284 -0
- package/src/lib/roof-duplication.ts +214 -0
- package/src/lib/scene-bounds.test.ts +183 -0
- package/src/lib/scene-bounds.ts +169 -0
- package/src/lib/stair-duplication.ts +126 -0
- package/src/lib/window-interaction.ts +86 -0
- package/src/store/use-editor.tsx +164 -8
package/src/store/use-editor.tsx
CHANGED
|
@@ -5,18 +5,20 @@ import {
|
|
|
5
5
|
type AssetInput,
|
|
6
6
|
type BuildingNode,
|
|
7
7
|
type CeilingNode,
|
|
8
|
+
type ColumnNode,
|
|
8
9
|
type DoorNode,
|
|
9
10
|
type FenceNode,
|
|
10
11
|
type ItemNode,
|
|
11
12
|
type LevelNode,
|
|
12
|
-
type RoofSurfaceMaterialRole,
|
|
13
13
|
type RoofNode,
|
|
14
14
|
type RoofSegmentNode,
|
|
15
|
+
type RoofSurfaceMaterialRole,
|
|
15
16
|
type SlabNode,
|
|
16
17
|
type Space,
|
|
17
|
-
type
|
|
18
|
+
type SpawnNode,
|
|
18
19
|
type StairNode,
|
|
19
20
|
type StairSegmentNode,
|
|
21
|
+
type StairSurfaceMaterialRole,
|
|
20
22
|
useScene,
|
|
21
23
|
type WallNode,
|
|
22
24
|
type WallSurfaceSide,
|
|
@@ -26,6 +28,13 @@ import { useViewer } from '@pascal-app/viewer'
|
|
|
26
28
|
import { create } from 'zustand'
|
|
27
29
|
import { persist } from 'zustand/middleware'
|
|
28
30
|
import { getDefaultCatalogItem } from '../components/ui/item-catalog/catalog-items'
|
|
31
|
+
import {
|
|
32
|
+
type ActivePaintMaterial,
|
|
33
|
+
type PaintableMaterialTarget,
|
|
34
|
+
resolveActivePaintMaterialFromSelection,
|
|
35
|
+
resolvePaintTargetFromSelection,
|
|
36
|
+
type SingleSurfaceMaterialRole,
|
|
37
|
+
} from '../lib/material-paint'
|
|
29
38
|
|
|
30
39
|
const DEFAULT_ACTIVE_SIDEBAR_PANEL = 'site'
|
|
31
40
|
const DEFAULT_FLOORPLAN_PANE_RATIO = 0.5
|
|
@@ -37,7 +46,7 @@ export type SplitOrientation = 'horizontal' | 'vertical'
|
|
|
37
46
|
|
|
38
47
|
export type Phase = 'site' | 'structure' | 'furnish'
|
|
39
48
|
|
|
40
|
-
export type Mode = 'select' | 'edit' | 'delete' | 'build'
|
|
49
|
+
export type Mode = 'select' | 'edit' | 'delete' | 'build' | 'material-paint'
|
|
41
50
|
|
|
42
51
|
// Structure mode tools (building elements)
|
|
43
52
|
export type StructureTool =
|
|
@@ -52,6 +61,7 @@ export type StructureTool =
|
|
|
52
61
|
| 'stair'
|
|
53
62
|
| 'item'
|
|
54
63
|
| 'zone'
|
|
64
|
+
| 'spawn'
|
|
55
65
|
| 'window'
|
|
56
66
|
| 'door'
|
|
57
67
|
|
|
@@ -89,13 +99,28 @@ export type MovingFenceEndpoint = {
|
|
|
89
99
|
endpoint: 'start' | 'end'
|
|
90
100
|
}
|
|
91
101
|
|
|
92
|
-
export type MaterialTargetRole =
|
|
102
|
+
export type MaterialTargetRole =
|
|
103
|
+
| WallSurfaceSide
|
|
104
|
+
| StairSurfaceMaterialRole
|
|
105
|
+
| RoofSurfaceMaterialRole
|
|
106
|
+
| SingleSurfaceMaterialRole
|
|
93
107
|
|
|
94
108
|
export type SelectedMaterialTarget = {
|
|
95
109
|
nodeId: AnyNodeId
|
|
96
110
|
role: MaterialTargetRole
|
|
97
111
|
}
|
|
98
112
|
|
|
113
|
+
type MaterialPaintSelectionSnapshot = {
|
|
114
|
+
selectedId: string | null
|
|
115
|
+
activePaintTarget: PaintableMaterialTarget
|
|
116
|
+
activePaintMaterial: ActivePaintMaterial | null
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export type GuideUiState = {
|
|
120
|
+
locked?: boolean
|
|
121
|
+
scaleReferenceVisible?: boolean
|
|
122
|
+
}
|
|
123
|
+
|
|
99
124
|
type EditorState = {
|
|
100
125
|
phase: Phase
|
|
101
126
|
setPhase: (phase: Phase) => void
|
|
@@ -115,10 +140,12 @@ type EditorState = {
|
|
|
115
140
|
| DoorNode
|
|
116
141
|
| FenceNode
|
|
117
142
|
| CeilingNode
|
|
143
|
+
| ColumnNode
|
|
118
144
|
| SlabNode
|
|
119
145
|
| WallNode
|
|
120
146
|
| RoofNode
|
|
121
147
|
| RoofSegmentNode
|
|
148
|
+
| SpawnNode
|
|
122
149
|
| StairNode
|
|
123
150
|
| StairSegmentNode
|
|
124
151
|
| BuildingNode
|
|
@@ -130,10 +157,12 @@ type EditorState = {
|
|
|
130
157
|
| DoorNode
|
|
131
158
|
| FenceNode
|
|
132
159
|
| CeilingNode
|
|
160
|
+
| ColumnNode
|
|
133
161
|
| SlabNode
|
|
134
162
|
| WallNode
|
|
135
163
|
| RoofNode
|
|
136
164
|
| RoofSegmentNode
|
|
165
|
+
| SpawnNode
|
|
137
166
|
| StairNode
|
|
138
167
|
| StairSegmentNode
|
|
139
168
|
| BuildingNode
|
|
@@ -149,8 +178,21 @@ type EditorState = {
|
|
|
149
178
|
setCurvingFence: (fence: FenceNode | null) => void
|
|
150
179
|
selectedMaterialTarget: SelectedMaterialTarget | null
|
|
151
180
|
setSelectedMaterialTarget: (target: SelectedMaterialTarget | null) => void
|
|
181
|
+
activePaintMaterial: ActivePaintMaterial | null
|
|
182
|
+
setActivePaintMaterial: (material: ActivePaintMaterial | null) => void
|
|
183
|
+
activePaintTarget: PaintableMaterialTarget
|
|
184
|
+
setActivePaintTarget: (target: PaintableMaterialTarget) => void
|
|
185
|
+
primeMaterialPaintFromSelection: () => MaterialPaintSelectionSnapshot
|
|
186
|
+
hoveredPaintTarget: PaintableMaterialTarget | null
|
|
187
|
+
setHoveredPaintTarget: (target: PaintableMaterialTarget | null) => void
|
|
188
|
+
isPaintPanelOpen: boolean
|
|
189
|
+
setPaintPanelOpen: (open: boolean) => void
|
|
152
190
|
selectedReferenceId: string | null
|
|
153
191
|
setSelectedReferenceId: (id: string | null) => void
|
|
192
|
+
guideUi: Record<string, GuideUiState>
|
|
193
|
+
setGuideLocked: (guideId: string, locked: boolean) => void
|
|
194
|
+
setGuideScaleReferenceVisible: (guideId: string, visible: boolean) => void
|
|
195
|
+
clearGuideUi: (guideId: string) => void
|
|
154
196
|
// Space detection for cutaway mode
|
|
155
197
|
spaces: Record<string, Space>
|
|
156
198
|
setSpaces: (spaces: Record<string, Space>) => void
|
|
@@ -175,6 +217,13 @@ type EditorState = {
|
|
|
175
217
|
setFloorplanSelectionTool: (tool: FloorplanSelectionTool) => void
|
|
176
218
|
gridSnapStep: GridSnapStep
|
|
177
219
|
setGridSnapStep: (step: GridSnapStep) => void
|
|
220
|
+
showReferenceFloor: boolean
|
|
221
|
+
toggleReferenceFloor: () => void
|
|
222
|
+
setShowReferenceFloor: (show: boolean) => void
|
|
223
|
+
referenceFloorOffset: number
|
|
224
|
+
setReferenceFloorOffset: (offset: number) => void
|
|
225
|
+
referenceFloorOpacity: number
|
|
226
|
+
setReferenceFloorOpacity: (opacity: number) => void
|
|
178
227
|
// First-person walkthrough mode (street view)
|
|
179
228
|
isFirstPersonMode: boolean
|
|
180
229
|
_viewModeBeforeFirstPerson: ViewMode | null
|
|
@@ -184,6 +233,10 @@ type EditorState = {
|
|
|
184
233
|
setAllowUndergroundCamera: (enabled: boolean) => void
|
|
185
234
|
activeSidebarPanel: string
|
|
186
235
|
setActiveSidebarPanel: (id: string) => void
|
|
236
|
+
mobilePanelSheetHeight: number
|
|
237
|
+
setMobilePanelSheetHeight: (height: number) => void
|
|
238
|
+
isCaptureMode: boolean
|
|
239
|
+
setIsCaptureMode: (enabled: boolean) => void
|
|
187
240
|
floorplanPaneRatio: number
|
|
188
241
|
setFloorplanPaneRatio: (ratio: number) => void
|
|
189
242
|
}
|
|
@@ -200,6 +253,9 @@ type PersistedEditorLayoutState = Pick<
|
|
|
200
253
|
| 'splitOrientation'
|
|
201
254
|
| 'floorplanSelectionTool'
|
|
202
255
|
| 'gridSnapStep'
|
|
256
|
+
| 'showReferenceFloor'
|
|
257
|
+
| 'referenceFloorOffset'
|
|
258
|
+
| 'referenceFloorOpacity'
|
|
203
259
|
>
|
|
204
260
|
type PersistedEditorState = PersistedEditorUiState & PersistedEditorLayoutState
|
|
205
261
|
|
|
@@ -219,6 +275,9 @@ export const DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE: PersistedEditorLayoutState =
|
|
|
219
275
|
splitOrientation: 'horizontal',
|
|
220
276
|
floorplanSelectionTool: 'click',
|
|
221
277
|
gridSnapStep: 0.5,
|
|
278
|
+
showReferenceFloor: false,
|
|
279
|
+
referenceFloorOffset: 1,
|
|
280
|
+
referenceFloorOpacity: 0.35,
|
|
222
281
|
}
|
|
223
282
|
|
|
224
283
|
const GRID_SNAP_STEPS: GridSnapStep[] = [0.5, 0.25, 0.1, 0.05]
|
|
@@ -228,7 +287,7 @@ function normalizeModeForPhase(phase: Phase, mode: Mode | undefined): Mode {
|
|
|
228
287
|
return 'select'
|
|
229
288
|
}
|
|
230
289
|
|
|
231
|
-
return mode === 'build' || mode === 'delete' ? mode : 'select'
|
|
290
|
+
return mode === 'build' || mode === 'delete' || mode === 'material-paint' ? mode : 'select'
|
|
232
291
|
}
|
|
233
292
|
|
|
234
293
|
function normalizeFloorplanPaneRatio(value: unknown): number {
|
|
@@ -328,6 +387,16 @@ function normalizePersistedEditorLayoutState(
|
|
|
328
387
|
gridSnapStep: GRID_SNAP_STEPS.includes(state?.gridSnapStep as GridSnapStep)
|
|
329
388
|
? (state?.gridSnapStep as GridSnapStep)
|
|
330
389
|
: DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE.gridSnapStep,
|
|
390
|
+
showReferenceFloor: state?.showReferenceFloor === true,
|
|
391
|
+
referenceFloorOffset:
|
|
392
|
+
typeof state?.referenceFloorOffset === 'number' && state.referenceFloorOffset >= 1
|
|
393
|
+
? Math.floor(state.referenceFloorOffset)
|
|
394
|
+
: DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE.referenceFloorOffset,
|
|
395
|
+
referenceFloorOpacity:
|
|
396
|
+
typeof state?.referenceFloorOpacity === 'number' &&
|
|
397
|
+
Number.isFinite(state.referenceFloorOpacity)
|
|
398
|
+
? Math.min(0.8, Math.max(0.1, state.referenceFloorOpacity))
|
|
399
|
+
: DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE.referenceFloorOpacity,
|
|
331
400
|
}
|
|
332
401
|
}
|
|
333
402
|
|
|
@@ -466,6 +535,8 @@ const useEditor = create<EditorState>()(
|
|
|
466
535
|
const category = get().catalogCategory ?? 'furniture'
|
|
467
536
|
set({ selectedItem: getDefaultSelectedItemForCategory(category) })
|
|
468
537
|
}
|
|
538
|
+
} else if (mode === 'material-paint') {
|
|
539
|
+
get().primeMaterialPaintFromSelection()
|
|
469
540
|
}
|
|
470
541
|
// When leaving build mode, clear tool
|
|
471
542
|
else if (tool) {
|
|
@@ -530,8 +601,79 @@ const useEditor = create<EditorState>()(
|
|
|
530
601
|
setCurvingFence: (fence) => set({ curvingFence: fence }),
|
|
531
602
|
selectedMaterialTarget: null,
|
|
532
603
|
setSelectedMaterialTarget: (target) => set({ selectedMaterialTarget: target }),
|
|
604
|
+
activePaintMaterial: null,
|
|
605
|
+
setActivePaintMaterial: (material) => set({ activePaintMaterial: material }),
|
|
606
|
+
activePaintTarget: 'wall',
|
|
607
|
+
setActivePaintTarget: (target) =>
|
|
608
|
+
set((state) =>
|
|
609
|
+
state.activePaintTarget === target ? state : { activePaintTarget: target },
|
|
610
|
+
),
|
|
611
|
+
primeMaterialPaintFromSelection: () => {
|
|
612
|
+
const selectedId =
|
|
613
|
+
useViewer.getState().selection.selectedIds.length === 1
|
|
614
|
+
? (useViewer.getState().selection.selectedIds[0] ?? null)
|
|
615
|
+
: null
|
|
616
|
+
const activePaintTarget =
|
|
617
|
+
resolvePaintTargetFromSelection({
|
|
618
|
+
nodes: useScene.getState().nodes,
|
|
619
|
+
selectedId,
|
|
620
|
+
}) ?? get().activePaintTarget
|
|
621
|
+
const activePaintMaterial = resolveActivePaintMaterialFromSelection({
|
|
622
|
+
nodes: useScene.getState().nodes,
|
|
623
|
+
selectedId,
|
|
624
|
+
selectedMaterialTarget: get().selectedMaterialTarget,
|
|
625
|
+
})
|
|
626
|
+
|
|
627
|
+
set({
|
|
628
|
+
activePaintTarget,
|
|
629
|
+
...(activePaintMaterial ? { activePaintMaterial } : {}),
|
|
630
|
+
})
|
|
631
|
+
|
|
632
|
+
return {
|
|
633
|
+
selectedId,
|
|
634
|
+
activePaintTarget,
|
|
635
|
+
activePaintMaterial: activePaintMaterial ?? get().activePaintMaterial,
|
|
636
|
+
}
|
|
637
|
+
},
|
|
638
|
+
hoveredPaintTarget: null,
|
|
639
|
+
setHoveredPaintTarget: (target) =>
|
|
640
|
+
set((state) =>
|
|
641
|
+
state.hoveredPaintTarget === target ? state : { hoveredPaintTarget: target },
|
|
642
|
+
),
|
|
643
|
+
isPaintPanelOpen: false,
|
|
644
|
+
setPaintPanelOpen: (open) => set({ isPaintPanelOpen: open }),
|
|
533
645
|
selectedReferenceId: null,
|
|
534
646
|
setSelectedReferenceId: (id) => set({ selectedReferenceId: id }),
|
|
647
|
+
guideUi: {},
|
|
648
|
+
setGuideLocked: (guideId, locked) =>
|
|
649
|
+
set((state) => ({
|
|
650
|
+
guideUi: {
|
|
651
|
+
...state.guideUi,
|
|
652
|
+
[guideId]: {
|
|
653
|
+
...state.guideUi[guideId],
|
|
654
|
+
locked,
|
|
655
|
+
},
|
|
656
|
+
},
|
|
657
|
+
})),
|
|
658
|
+
setGuideScaleReferenceVisible: (guideId, visible) =>
|
|
659
|
+
set((state) => ({
|
|
660
|
+
guideUi: {
|
|
661
|
+
...state.guideUi,
|
|
662
|
+
[guideId]: {
|
|
663
|
+
...state.guideUi[guideId],
|
|
664
|
+
scaleReferenceVisible: visible,
|
|
665
|
+
},
|
|
666
|
+
},
|
|
667
|
+
})),
|
|
668
|
+
clearGuideUi: (guideId) =>
|
|
669
|
+
set((state) => {
|
|
670
|
+
if (!state.guideUi[guideId]) {
|
|
671
|
+
return state
|
|
672
|
+
}
|
|
673
|
+
const guideUi = { ...state.guideUi }
|
|
674
|
+
delete guideUi[guideId]
|
|
675
|
+
return { guideUi }
|
|
676
|
+
}),
|
|
535
677
|
spaces: {},
|
|
536
678
|
setSpaces: (spaces) => set({ spaces }),
|
|
537
679
|
editingHole: null,
|
|
@@ -563,6 +705,16 @@ const useEditor = create<EditorState>()(
|
|
|
563
705
|
setFloorplanSelectionTool: (tool) => set({ floorplanSelectionTool: tool }),
|
|
564
706
|
gridSnapStep: DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE.gridSnapStep,
|
|
565
707
|
setGridSnapStep: (step) => set({ gridSnapStep: step }),
|
|
708
|
+
showReferenceFloor: DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE.showReferenceFloor,
|
|
709
|
+
toggleReferenceFloor: () =>
|
|
710
|
+
set((state) => ({ showReferenceFloor: !state.showReferenceFloor })),
|
|
711
|
+
setShowReferenceFloor: (show) => set({ showReferenceFloor: show }),
|
|
712
|
+
referenceFloorOffset: DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE.referenceFloorOffset,
|
|
713
|
+
setReferenceFloorOffset: (offset) =>
|
|
714
|
+
set({ referenceFloorOffset: Math.max(1, Math.floor(offset)) }),
|
|
715
|
+
referenceFloorOpacity: DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE.referenceFloorOpacity,
|
|
716
|
+
setReferenceFloorOpacity: (opacity) =>
|
|
717
|
+
set({ referenceFloorOpacity: Math.min(0.8, Math.max(0.1, opacity)) }),
|
|
566
718
|
allowUndergroundCamera: false,
|
|
567
719
|
setAllowUndergroundCamera: (enabled) => set({ allowUndergroundCamera: enabled }),
|
|
568
720
|
isFirstPersonMode: false,
|
|
@@ -570,8 +722,6 @@ const useEditor = create<EditorState>()(
|
|
|
570
722
|
setFirstPersonMode: (enabled) => {
|
|
571
723
|
if (enabled) {
|
|
572
724
|
const currentViewMode = get().viewMode
|
|
573
|
-
useViewer.getState().setCameraMode('perspective')
|
|
574
|
-
useViewer.getState().setWallMode('up')
|
|
575
725
|
set({
|
|
576
726
|
isFirstPersonMode: true,
|
|
577
727
|
_viewModeBeforeFirstPerson: currentViewMode,
|
|
@@ -581,7 +731,6 @@ const useEditor = create<EditorState>()(
|
|
|
581
731
|
tool: null,
|
|
582
732
|
catalogCategory: null,
|
|
583
733
|
})
|
|
584
|
-
useViewer.getState().setSelection({ selectedIds: [], zoneId: null })
|
|
585
734
|
} else {
|
|
586
735
|
const prevMode = get()._viewModeBeforeFirstPerson
|
|
587
736
|
set({
|
|
@@ -593,6 +742,10 @@ const useEditor = create<EditorState>()(
|
|
|
593
742
|
},
|
|
594
743
|
activeSidebarPanel: DEFAULT_ACTIVE_SIDEBAR_PANEL,
|
|
595
744
|
setActiveSidebarPanel: (id) => set({ activeSidebarPanel: id }),
|
|
745
|
+
mobilePanelSheetHeight: 0,
|
|
746
|
+
setMobilePanelSheetHeight: (height) => set({ mobilePanelSheetHeight: height }),
|
|
747
|
+
isCaptureMode: false,
|
|
748
|
+
setIsCaptureMode: (enabled) => set({ isCaptureMode: enabled }),
|
|
596
749
|
floorplanPaneRatio: DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE.floorplanPaneRatio,
|
|
597
750
|
setFloorplanPaneRatio: (ratio) =>
|
|
598
751
|
set({ floorplanPaneRatio: normalizeFloorplanPaneRatio(ratio) }),
|
|
@@ -629,6 +782,9 @@ const useEditor = create<EditorState>()(
|
|
|
629
782
|
splitOrientation: state.splitOrientation,
|
|
630
783
|
floorplanSelectionTool: state.floorplanSelectionTool,
|
|
631
784
|
gridSnapStep: state.gridSnapStep,
|
|
785
|
+
showReferenceFloor: state.showReferenceFloor,
|
|
786
|
+
referenceFloorOffset: state.referenceFloorOffset,
|
|
787
|
+
referenceFloorOpacity: state.referenceFloorOpacity,
|
|
632
788
|
}),
|
|
633
789
|
},
|
|
634
790
|
),
|