@pascal-app/viewer 1.1.0 → 1.1.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/README.md +157 -0
- package/dist/components/viewer/drone-controller.d.ts.map +1 -1
- package/dist/components/viewer/drone-controller.js +1 -5
- package/dist/components/viewer/first-person/build-collider-world.d.ts +14 -0
- package/dist/components/viewer/first-person/build-collider-world.d.ts.map +1 -0
- package/dist/components/viewer/first-person/build-collider-world.js +426 -0
- package/dist/components/viewer/first-person/ground-holes.d.ts +22 -0
- package/dist/components/viewer/first-person/ground-holes.d.ts.map +1 -0
- package/dist/components/viewer/first-person/ground-holes.js +116 -0
- package/dist/components/viewer/first-person/mechanism-targets.d.ts +27 -0
- package/dist/components/viewer/first-person/mechanism-targets.d.ts.map +1 -0
- package/dist/components/viewer/first-person/mechanism-targets.js +79 -0
- package/dist/components/viewer/first-person/terrain-collider.d.ts +32 -0
- package/dist/components/viewer/first-person/terrain-collider.d.ts.map +1 -0
- package/dist/components/viewer/first-person/terrain-collider.js +175 -0
- package/dist/components/viewer/glb-walkthrough-controller.d.ts +1 -1
- package/dist/components/viewer/glb-walkthrough-controller.d.ts.map +1 -1
- package/dist/components/viewer/glb-walkthrough-controller.js +3 -4
- package/dist/components/viewer/live-walkthrough-controller.d.ts +17 -0
- package/dist/components/viewer/live-walkthrough-controller.d.ts.map +1 -0
- package/dist/components/viewer/live-walkthrough-controller.js +1449 -0
- package/dist/components/viewer/post-processing.d.ts.map +1 -1
- package/dist/components/viewer/post-processing.js +22 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/lib/daylight/room-map.d.ts +29 -4
- package/dist/lib/daylight/room-map.d.ts.map +1 -1
- package/dist/lib/daylight/room-map.js +219 -36
- package/dist/lib/daylight/room-scene.d.ts.map +1 -1
- package/dist/lib/daylight/room-scene.js +9 -3
- package/dist/lib/daylight/rooms.d.ts +15 -6
- package/dist/lib/daylight/rooms.d.ts.map +1 -1
- package/dist/lib/daylight/rooms.js +49 -9
- package/dist/lib/measurement-presentation.d.ts +2 -0
- package/dist/lib/measurement-presentation.d.ts.map +1 -1
- package/dist/lib/measurement-presentation.js +6 -0
- package/dist/lib/typing-target.d.ts +2 -0
- package/dist/lib/typing-target.d.ts.map +1 -0
- package/dist/lib/typing-target.js +7 -0
- package/dist/lib/viewer-config.d.ts +6 -0
- package/dist/lib/viewer-config.d.ts.map +1 -1
- package/dist/lib/viewer-config.js +2 -0
- package/dist/sfx/audio-settings.d.ts +81 -0
- package/dist/sfx/audio-settings.d.ts.map +1 -0
- package/dist/sfx/audio-settings.js +166 -0
- package/dist/sfx/index.d.ts +6 -0
- package/dist/sfx/index.d.ts.map +1 -0
- package/dist/sfx/index.js +5 -0
- package/dist/sfx/interaction-sounds.d.ts +7 -0
- package/dist/sfx/interaction-sounds.d.ts.map +1 -0
- package/dist/sfx/interaction-sounds.js +39 -0
- package/dist/sfx/player.d.ts +31 -0
- package/dist/sfx/player.d.ts.map +1 -0
- package/dist/sfx/player.js +255 -0
- package/dist/sfx/sounds.d.ts +60 -0
- package/dist/sfx/sounds.d.ts.map +1 -0
- package/dist/sfx/sounds.js +25 -0
- package/dist/sfx/use-viewer-ui-sounds.d.ts +8 -0
- package/dist/sfx/use-viewer-ui-sounds.d.ts.map +1 -0
- package/dist/sfx/use-viewer-ui-sounds.js +42 -0
- package/dist/store/use-first-person-hud.d.ts +13 -0
- package/dist/store/use-first-person-hud.d.ts.map +1 -0
- package/dist/store/use-first-person-hud.js +21 -0
- package/dist/systems/roof/roof-system.d.ts.map +1 -1
- package/dist/systems/roof/roof-system.js +27 -13
- package/dist/ui/components/action-button.d.ts +14 -0
- package/dist/ui/components/action-button.d.ts.map +1 -0
- package/dist/ui/components/action-button.js +21 -0
- package/dist/ui/components/action-menu-placement.d.ts +7 -0
- package/dist/ui/components/action-menu-placement.d.ts.map +1 -0
- package/dist/ui/components/action-menu-placement.js +10 -0
- package/dist/ui/components/floorplan-compass-button.d.ts +10 -0
- package/dist/ui/components/floorplan-compass-button.d.ts.map +1 -0
- package/dist/ui/components/floorplan-compass-button.js +22 -0
- package/dist/ui/components/follow-pascal-toggle.d.ts +6 -0
- package/dist/ui/components/follow-pascal-toggle.d.ts.map +1 -0
- package/dist/ui/components/follow-pascal-toggle.js +21 -0
- package/dist/ui/components/localized-html.d.ts +9 -0
- package/dist/ui/components/localized-html.d.ts.map +1 -0
- package/dist/ui/components/localized-html.js +16 -0
- package/dist/ui/components/render-settings-menu.d.ts +9 -0
- package/dist/ui/components/render-settings-menu.d.ts.map +1 -0
- package/dist/ui/components/render-settings-menu.js +145 -0
- package/dist/ui/components/rooms/room-highlight.d.ts +10 -0
- package/dist/ui/components/rooms/room-highlight.d.ts.map +1 -0
- package/dist/ui/components/rooms/room-highlight.js +56 -0
- package/dist/ui/components/rooms/room-labels.d.ts +278 -0
- package/dist/ui/components/rooms/room-labels.d.ts.map +1 -0
- package/dist/ui/components/rooms/room-labels.js +1295 -0
- package/dist/ui/components/rooms/viewer-rooms.d.ts +14 -0
- package/dist/ui/components/rooms/viewer-rooms.d.ts.map +1 -0
- package/dist/ui/components/rooms/viewer-rooms.js +123 -0
- package/dist/ui/components/scene-loader.d.ts +18 -0
- package/dist/ui/components/scene-loader.d.ts.map +1 -0
- package/dist/ui/components/scene-loader.js +29 -0
- package/dist/ui/components/sky-control.d.ts +37 -0
- package/dist/ui/components/sky-control.d.ts.map +1 -0
- package/dist/ui/components/sky-control.js +382 -0
- package/dist/ui/components/use-viewer-camera-navigation-sync.d.ts +4 -0
- package/dist/ui/components/use-viewer-camera-navigation-sync.d.ts.map +1 -0
- package/dist/ui/components/use-viewer-camera-navigation-sync.js +117 -0
- package/dist/ui/components/viewer-controls-bar.d.ts +20 -0
- package/dist/ui/components/viewer-controls-bar.d.ts.map +1 -0
- package/dist/ui/components/viewer-controls-bar.js +130 -0
- package/dist/ui/components/viewer-hover-label.d.ts +14 -0
- package/dist/ui/components/viewer-hover-label.d.ts.map +1 -0
- package/dist/ui/components/viewer-hover-label.js +28 -0
- package/dist/ui/components/viewer-scene-header.d.ts +34 -0
- package/dist/ui/components/viewer-scene-header.d.ts.map +1 -0
- package/dist/ui/components/viewer-scene-header.js +92 -0
- package/dist/ui/components/viewer-selection-manager.d.ts +7 -0
- package/dist/ui/components/viewer-selection-manager.d.ts.map +1 -0
- package/dist/ui/components/viewer-selection-manager.js +116 -0
- package/dist/ui/components/viewer-stage-modes.d.ts +7 -0
- package/dist/ui/components/viewer-stage-modes.d.ts.map +1 -0
- package/dist/ui/components/viewer-stage-modes.js +42 -0
- package/dist/ui/components/viewer-stage-switcher.d.ts +10 -0
- package/dist/ui/components/viewer-stage-switcher.d.ts.map +1 -0
- package/dist/ui/components/viewer-stage-switcher.js +16 -0
- package/dist/ui/components/viewer-stage.d.ts +25 -0
- package/dist/ui/components/viewer-stage.d.ts.map +1 -0
- package/dist/ui/components/viewer-stage.js +107 -0
- package/dist/ui/components/walkthrough-hud.d.ts +29 -0
- package/dist/ui/components/walkthrough-hud.d.ts.map +1 -0
- package/dist/ui/components/walkthrough-hud.js +55 -0
- package/dist/ui/floorplan/floorplan-camera-sync.d.ts +22 -0
- package/dist/ui/floorplan/floorplan-camera-sync.d.ts.map +1 -0
- package/dist/ui/floorplan/floorplan-camera-sync.js +157 -0
- package/dist/ui/floorplan/floorplan-dimension-renderer.d.ts +61 -0
- package/dist/ui/floorplan/floorplan-dimension-renderer.d.ts.map +1 -0
- package/dist/ui/floorplan/floorplan-dimension-renderer.js +280 -0
- package/dist/ui/floorplan/floorplan-geometry-renderer.d.ts +54 -0
- package/dist/ui/floorplan/floorplan-geometry-renderer.d.ts.map +1 -0
- package/dist/ui/floorplan/floorplan-geometry-renderer.js +317 -0
- package/dist/ui/floorplan/floorplan-label-angle.d.ts +24 -0
- package/dist/ui/floorplan/floorplan-label-angle.d.ts.map +1 -0
- package/dist/ui/floorplan/floorplan-label-angle.js +60 -0
- package/dist/ui/floorplan/floorplan-navigation-sync.d.ts +18 -0
- package/dist/ui/floorplan/floorplan-navigation-sync.d.ts.map +1 -0
- package/dist/ui/floorplan/floorplan-navigation-sync.js +41 -0
- package/dist/ui/floorplan/floorplan-preview-geometry.d.ts +26 -0
- package/dist/ui/floorplan/floorplan-preview-geometry.d.ts.map +1 -0
- package/dist/ui/floorplan/floorplan-preview-geometry.js +173 -0
- package/dist/ui/floorplan/floorplan-preview-navigation.d.ts +22 -0
- package/dist/ui/floorplan/floorplan-preview-navigation.d.ts.map +1 -0
- package/dist/ui/floorplan/floorplan-preview-navigation.js +41 -0
- package/dist/ui/floorplan/floorplan-preview-visibility.d.ts +8 -0
- package/dist/ui/floorplan/floorplan-preview-visibility.d.ts.map +1 -0
- package/dist/ui/floorplan/floorplan-preview-visibility.js +21 -0
- package/dist/ui/floorplan/floorplan-preview.d.ts +19 -0
- package/dist/ui/floorplan/floorplan-preview.d.ts.map +1 -0
- package/dist/ui/floorplan/floorplan-preview.js +700 -0
- package/dist/ui/hooks/use-mobile.d.ts +2 -0
- package/dist/ui/hooks/use-mobile.d.ts.map +1 -0
- package/dist/ui/hooks/use-mobile.js +14 -0
- package/dist/ui/index.d.ts +49 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +48 -0
- package/dist/ui/lib/below-grade.d.ts +38 -0
- package/dist/ui/lib/below-grade.d.ts.map +1 -0
- package/dist/ui/lib/below-grade.js +102 -0
- package/dist/ui/lib/camera-pose.d.ts +19 -0
- package/dist/ui/lib/camera-pose.d.ts.map +1 -0
- package/dist/ui/lib/camera-pose.js +113 -0
- package/dist/ui/lib/cn.d.ts +3 -0
- package/dist/ui/lib/cn.d.ts.map +1 -0
- package/dist/ui/lib/cn.js +5 -0
- package/dist/ui/lib/level-name.d.ts +10 -0
- package/dist/ui/lib/level-name.d.ts.map +1 -0
- package/dist/ui/lib/level-name.js +33 -0
- package/dist/ui/lib/node-display-label.d.ts +8 -0
- package/dist/ui/lib/node-display-label.d.ts.map +1 -0
- package/dist/ui/lib/node-display-label.js +36 -0
- package/dist/ui/lib/room-area.d.ts +3 -0
- package/dist/ui/lib/room-area.d.ts.map +1 -0
- package/dist/ui/lib/room-area.js +8 -0
- package/dist/ui/lib/room-assembly-overlay.d.ts +46 -0
- package/dist/ui/lib/room-assembly-overlay.d.ts.map +1 -0
- package/dist/ui/lib/room-assembly-overlay.js +222 -0
- package/dist/ui/lib/room-name-messages.d.ts +28 -0
- package/dist/ui/lib/room-name-messages.d.ts.map +1 -0
- package/dist/ui/lib/room-name-messages.js +112 -0
- package/dist/ui/lib/room-selection.d.ts +58 -0
- package/dist/ui/lib/room-selection.d.ts.map +1 -0
- package/dist/ui/lib/room-selection.js +297 -0
- package/dist/ui/lib/scene-theme-name.d.ts +4 -0
- package/dist/ui/lib/scene-theme-name.d.ts.map +1 -0
- package/dist/ui/lib/scene-theme-name.js +22 -0
- package/dist/ui/lib/selection-modifiers.d.ts +20 -0
- package/dist/ui/lib/selection-modifiers.d.ts.map +1 -0
- package/dist/ui/lib/selection-modifiers.js +15 -0
- package/dist/ui/lib/viewer-selection.d.ts +132 -0
- package/dist/ui/lib/viewer-selection.d.ts.map +1 -0
- package/dist/ui/lib/viewer-selection.js +462 -0
- package/dist/ui/lib/zone-content.d.ts +6 -0
- package/dist/ui/lib/zone-content.d.ts.map +1 -0
- package/dist/ui/lib/zone-content.js +96 -0
- package/dist/ui/primitives/button.d.ts +11 -0
- package/dist/ui/primitives/button.d.ts.map +1 -0
- package/dist/ui/primitives/button.js +35 -0
- package/dist/ui/primitives/dropdown-menu.d.ts +26 -0
- package/dist/ui/primitives/dropdown-menu.d.ts.map +1 -0
- package/dist/ui/primitives/dropdown-menu.js +53 -0
- package/dist/ui/primitives/popover.d.ts +8 -0
- package/dist/ui/primitives/popover.d.ts.map +1 -0
- package/dist/ui/primitives/popover.js +17 -0
- package/dist/ui/primitives/switch.d.ts +5 -0
- package/dist/ui/primitives/switch.d.ts.map +1 -0
- package/dist/ui/primitives/switch.js +8 -0
- package/dist/ui/primitives/tooltip.d.ts +8 -0
- package/dist/ui/primitives/tooltip.d.ts.map +1 -0
- package/dist/ui/primitives/tooltip.js +17 -0
- package/dist/ui/store/camera-pose-store.d.ts +17 -0
- package/dist/ui/store/camera-pose-store.d.ts.map +1 -0
- package/dist/ui/store/camera-pose-store.js +15 -0
- package/dist/ui/store/navigation-sync-pose-store.d.ts +26 -0
- package/dist/ui/store/navigation-sync-pose-store.d.ts.map +1 -0
- package/dist/ui/store/navigation-sync-pose-store.js +16 -0
- package/dist/ui/store/use-follow-pascal.d.ts +30 -0
- package/dist/ui/store/use-follow-pascal.d.ts.map +1 -0
- package/dist/ui/store/use-follow-pascal.js +28 -0
- package/dist/ui/theme.css +339 -0
- package/package.json +34 -7
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
const IDENTITY = { tx: 0, ty: 0, rotation: 0 };
|
|
2
|
+
const MIN_VIEWBOX_SIZE = 0.25;
|
|
3
|
+
const MAX_VIEWBOX_SIZE = 500;
|
|
4
|
+
function clientToViewBoxFraction(viewBox, viewport, clientX, clientY) {
|
|
5
|
+
const viewportWidth = Math.max(viewport.width, 1);
|
|
6
|
+
const viewportHeight = Math.max(viewport.height, 1);
|
|
7
|
+
const scale = Math.min(viewportWidth / viewBox.width, viewportHeight / viewBox.height);
|
|
8
|
+
const renderedWidth = viewBox.width * scale;
|
|
9
|
+
const renderedHeight = viewBox.height * scale;
|
|
10
|
+
const renderedLeft = viewport.left + (viewportWidth - renderedWidth) / 2;
|
|
11
|
+
const renderedTop = viewport.top + (viewportHeight - renderedHeight) / 2;
|
|
12
|
+
return [(clientX - renderedLeft) / renderedWidth, (clientY - renderedTop) / renderedHeight];
|
|
13
|
+
}
|
|
14
|
+
export function clientToFloorplanPoint(viewBox, viewport, clientX, clientY) {
|
|
15
|
+
const [fractionX, fractionY] = clientToViewBoxFraction(viewBox, viewport, clientX, clientY);
|
|
16
|
+
return [viewBox.x + fractionX * viewBox.width, viewBox.y + fractionY * viewBox.height];
|
|
17
|
+
}
|
|
18
|
+
export function scaleFloorplanViewBox(viewBox, factor, anchorX = 0.5, anchorY = 0.5) {
|
|
19
|
+
const minFactor = Math.max(MIN_VIEWBOX_SIZE / viewBox.width, MIN_VIEWBOX_SIZE / viewBox.height);
|
|
20
|
+
const maxFactor = Math.min(MAX_VIEWBOX_SIZE / viewBox.width, MAX_VIEWBOX_SIZE / viewBox.height);
|
|
21
|
+
const clampedFactor = Math.min(Math.max(factor, minFactor), maxFactor);
|
|
22
|
+
const width = viewBox.width * clampedFactor;
|
|
23
|
+
const height = viewBox.height * clampedFactor;
|
|
24
|
+
return {
|
|
25
|
+
x: viewBox.x + (viewBox.width - width) * anchorX,
|
|
26
|
+
y: viewBox.y + (viewBox.height - height) * anchorY,
|
|
27
|
+
width,
|
|
28
|
+
height,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export function scaleFloorplanViewBoxBetweenClients(viewBox, factor, viewport, sourceClient, targetClient) {
|
|
32
|
+
const sourcePoint = clientToFloorplanPoint(viewBox, viewport, sourceClient[0], sourceClient[1]);
|
|
33
|
+
const [targetX, targetY] = clientToViewBoxFraction(viewBox, viewport, targetClient[0], targetClient[1]);
|
|
34
|
+
const scaled = scaleFloorplanViewBox(viewBox, factor, 0, 0);
|
|
35
|
+
return {
|
|
36
|
+
...scaled,
|
|
37
|
+
x: sourcePoint[0] - targetX * scaled.width,
|
|
38
|
+
y: sourcePoint[1] - targetY * scaled.height,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export function panFloorplanViewBox(viewBox, viewport, sourceClient, targetClient) {
|
|
42
|
+
const sourcePoint = clientToFloorplanPoint(viewBox, viewport, sourceClient[0], sourceClient[1]);
|
|
43
|
+
const targetPoint = clientToFloorplanPoint(viewBox, viewport, targetClient[0], targetClient[1]);
|
|
44
|
+
return {
|
|
45
|
+
...viewBox,
|
|
46
|
+
x: viewBox.x + sourcePoint[0] - targetPoint[0],
|
|
47
|
+
y: viewBox.y + sourcePoint[1] - targetPoint[1],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function applyTransform(point, transform) {
|
|
51
|
+
const cos = Math.cos(transform.rotation);
|
|
52
|
+
const sin = Math.sin(transform.rotation);
|
|
53
|
+
return [
|
|
54
|
+
point[0] * cos - point[1] * sin + transform.tx,
|
|
55
|
+
point[0] * sin + point[1] * cos + transform.ty,
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
function composeTransform(parent, child) {
|
|
59
|
+
const translated = applyTransform(child.translate ?? [0, 0], parent);
|
|
60
|
+
return {
|
|
61
|
+
tx: translated[0],
|
|
62
|
+
ty: translated[1],
|
|
63
|
+
rotation: parent.rotation + (child.rotate ?? 0),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function includePoint(bounds, point) {
|
|
67
|
+
if (!bounds)
|
|
68
|
+
return { minX: point[0], minY: point[1], maxX: point[0], maxY: point[1] };
|
|
69
|
+
return {
|
|
70
|
+
minX: Math.min(bounds.minX, point[0]),
|
|
71
|
+
minY: Math.min(bounds.minY, point[1]),
|
|
72
|
+
maxX: Math.max(bounds.maxX, point[0]),
|
|
73
|
+
maxY: Math.max(bounds.maxY, point[1]),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function includePoints(bounds, points, transform) {
|
|
77
|
+
let next = bounds;
|
|
78
|
+
for (const point of points)
|
|
79
|
+
next = includePoint(next, applyTransform(point, transform));
|
|
80
|
+
return next;
|
|
81
|
+
}
|
|
82
|
+
function geometryBounds(geometry, transform, bounds) {
|
|
83
|
+
switch (geometry.kind) {
|
|
84
|
+
case 'group': {
|
|
85
|
+
const nextTransform = geometry.transform
|
|
86
|
+
? composeTransform(transform, geometry.transform)
|
|
87
|
+
: transform;
|
|
88
|
+
return geometry.children.reduce((next, child) => geometryBounds(child, nextTransform, next), bounds);
|
|
89
|
+
}
|
|
90
|
+
case 'polygon':
|
|
91
|
+
case 'polyline':
|
|
92
|
+
case 'hatch':
|
|
93
|
+
return includePoints(bounds, geometry.points, transform);
|
|
94
|
+
case 'rect':
|
|
95
|
+
return includePoints(bounds, [
|
|
96
|
+
[geometry.x, geometry.y],
|
|
97
|
+
[geometry.x + geometry.width, geometry.y],
|
|
98
|
+
[geometry.x + geometry.width, geometry.y + geometry.height],
|
|
99
|
+
[geometry.x, geometry.y + geometry.height],
|
|
100
|
+
], transform);
|
|
101
|
+
case 'circle': {
|
|
102
|
+
const center = applyTransform([geometry.cx, geometry.cy], transform);
|
|
103
|
+
return includePoints(bounds, [
|
|
104
|
+
[center[0] - geometry.r, center[1] - geometry.r],
|
|
105
|
+
[center[0] + geometry.r, center[1] + geometry.r],
|
|
106
|
+
], IDENTITY);
|
|
107
|
+
}
|
|
108
|
+
case 'line':
|
|
109
|
+
case 'hit-line':
|
|
110
|
+
case 'edge-handle':
|
|
111
|
+
return includePoints(bounds, [
|
|
112
|
+
[geometry.x1, geometry.y1],
|
|
113
|
+
[geometry.x2, geometry.y2],
|
|
114
|
+
], transform);
|
|
115
|
+
case 'text':
|
|
116
|
+
return includePoint(bounds, applyTransform([geometry.x, geometry.y], transform));
|
|
117
|
+
case 'image': {
|
|
118
|
+
const halfWidth = geometry.width / 2;
|
|
119
|
+
const halfHeight = geometry.height / 2;
|
|
120
|
+
const imageTransform = composeTransform(transform, {
|
|
121
|
+
translate: geometry.center,
|
|
122
|
+
rotate: geometry.rotation,
|
|
123
|
+
});
|
|
124
|
+
return includePoints(bounds, [
|
|
125
|
+
[-halfWidth, -halfHeight],
|
|
126
|
+
[halfWidth, -halfHeight],
|
|
127
|
+
[halfWidth, halfHeight],
|
|
128
|
+
[-halfWidth, halfHeight],
|
|
129
|
+
], imageTransform);
|
|
130
|
+
}
|
|
131
|
+
case 'endpoint-handle':
|
|
132
|
+
case 'midpoint-handle':
|
|
133
|
+
case 'move-handle':
|
|
134
|
+
case 'move-arrow':
|
|
135
|
+
case 'rotate-arrow':
|
|
136
|
+
case 'equal-spacing-badge':
|
|
137
|
+
return includePoint(bounds, applyTransform(geometry.point, transform));
|
|
138
|
+
case 'dimension-label':
|
|
139
|
+
return includePoint(bounds, applyTransform([geometry.cx, geometry.cy], transform));
|
|
140
|
+
case 'dimension':
|
|
141
|
+
return includePoints(bounds, [
|
|
142
|
+
geometry.start,
|
|
143
|
+
geometry.end,
|
|
144
|
+
geometry.dimensionStart ?? geometry.start,
|
|
145
|
+
geometry.dimensionEnd ?? geometry.end,
|
|
146
|
+
], transform);
|
|
147
|
+
case 'dimension-string':
|
|
148
|
+
return geometry.segments.reduce((next, segment) => includePoints(next, [
|
|
149
|
+
segment.start,
|
|
150
|
+
segment.end,
|
|
151
|
+
segment.dimensionStart ?? segment.start,
|
|
152
|
+
segment.dimensionEnd ?? segment.end,
|
|
153
|
+
], transform), bounds);
|
|
154
|
+
case 'path':
|
|
155
|
+
return bounds;
|
|
156
|
+
default:
|
|
157
|
+
return bounds;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
export function getFloorplanBounds(geometries) {
|
|
161
|
+
return geometries.reduce((bounds, geometry) => geometryBounds(geometry, IDENTITY, bounds), null);
|
|
162
|
+
}
|
|
163
|
+
export function padFloorplanBounds(bounds, ratio = 0.12) {
|
|
164
|
+
const width = Math.max(bounds.maxX - bounds.minX, 1);
|
|
165
|
+
const height = Math.max(bounds.maxY - bounds.minY, 1);
|
|
166
|
+
const padding = Math.max(Math.max(width, height) * ratio, 0.75);
|
|
167
|
+
return {
|
|
168
|
+
minX: bounds.minX - padding,
|
|
169
|
+
minY: bounds.minY - padding,
|
|
170
|
+
maxX: bounds.maxX + padding,
|
|
171
|
+
maxY: bounds.maxY + padding,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { NavigationSyncPose } from '../store/navigation-sync-pose-store';
|
|
2
|
+
import type { FloorplanViewBox } from './floorplan-preview-geometry';
|
|
3
|
+
export type FloorplanPreviewViewportSize = {
|
|
4
|
+
width: number;
|
|
5
|
+
height: number;
|
|
6
|
+
};
|
|
7
|
+
export declare function nearestEquivalentDegrees(angle: number, reference: number): number;
|
|
8
|
+
export declare function floorplanRotationFromCameraAzimuth(azimuth: number, reference: number): number;
|
|
9
|
+
export declare function cameraAzimuthFromFloorplanRotation(rotationDeg: number): number;
|
|
10
|
+
export declare function rotateFloorplanPoint(point: {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
}, rotationDeg: number): {
|
|
14
|
+
x: number;
|
|
15
|
+
y: number;
|
|
16
|
+
};
|
|
17
|
+
export declare function visibleFloorplanViewWidth(viewBox: FloorplanViewBox, viewport: FloorplanPreviewViewportSize): number;
|
|
18
|
+
export declare function floorplanViewBoxFromNavigationPose(pose: NavigationSyncPose, localCenter: {
|
|
19
|
+
x: number;
|
|
20
|
+
y: number;
|
|
21
|
+
}, sceneRotationDeg: number, viewport: FloorplanPreviewViewportSize): FloorplanViewBox;
|
|
22
|
+
//# sourceMappingURL=floorplan-preview-navigation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"floorplan-preview-navigation.d.ts","sourceRoot":"","sources":["../../../src/ui/floorplan/floorplan-preview-navigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAA;AAC7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAEpE,MAAM,MAAM,4BAA4B,GAAG;IACzC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,UAKxE;AAED,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,UAEpF;AAED,wBAAgB,kCAAkC,CAAC,WAAW,EAAE,MAAM,UAErE;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAC/B,WAAW,EAAE,MAAM,GAClB;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAS1B;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,4BAA4B,UAIvC;AAED,wBAAgB,kCAAkC,CAChD,IAAI,EAAE,kBAAkB,EACxB,WAAW,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EACrC,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,4BAA4B,GACrC,gBAAgB,CAWlB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function nearestEquivalentDegrees(angle, reference) {
|
|
2
|
+
let next = angle;
|
|
3
|
+
while (next - reference > 180)
|
|
4
|
+
next -= 360;
|
|
5
|
+
while (next - reference < -180)
|
|
6
|
+
next += 360;
|
|
7
|
+
return next;
|
|
8
|
+
}
|
|
9
|
+
export function floorplanRotationFromCameraAzimuth(azimuth, reference) {
|
|
10
|
+
return nearestEquivalentDegrees((azimuth * 180) / Math.PI, reference);
|
|
11
|
+
}
|
|
12
|
+
export function cameraAzimuthFromFloorplanRotation(rotationDeg) {
|
|
13
|
+
return (rotationDeg * Math.PI) / 180;
|
|
14
|
+
}
|
|
15
|
+
export function rotateFloorplanPoint(point, rotationDeg) {
|
|
16
|
+
if (rotationDeg === 0)
|
|
17
|
+
return point;
|
|
18
|
+
const radians = (rotationDeg * Math.PI) / 180;
|
|
19
|
+
const cos = Math.cos(radians);
|
|
20
|
+
const sin = Math.sin(radians);
|
|
21
|
+
return {
|
|
22
|
+
x: point.x * cos - point.y * sin,
|
|
23
|
+
y: point.x * sin + point.y * cos,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function visibleFloorplanViewWidth(viewBox, viewport) {
|
|
27
|
+
const aspect = Math.max(viewport.width, 1) / Math.max(viewport.height, 1);
|
|
28
|
+
return Math.max(viewBox.width, viewBox.height * aspect);
|
|
29
|
+
}
|
|
30
|
+
export function floorplanViewBoxFromNavigationPose(pose, localCenter, sceneRotationDeg, viewport) {
|
|
31
|
+
const center = rotateFloorplanPoint(localCenter, sceneRotationDeg);
|
|
32
|
+
const aspect = Math.max(viewport.width, 1) / Math.max(viewport.height, 1);
|
|
33
|
+
const width = Math.max(pose.viewWidth, 0.001);
|
|
34
|
+
const height = width / aspect;
|
|
35
|
+
return {
|
|
36
|
+
x: center.x - width / 2,
|
|
37
|
+
y: center.y - height / 2,
|
|
38
|
+
width,
|
|
39
|
+
height,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type AnyNode } from '@pascal-app/core';
|
|
2
|
+
/**
|
|
3
|
+
* A node draws in the plan unless it, or an ancestor whose flag reaches its
|
|
4
|
+
* descendants, is hidden. A hidden Site keeps its buildings on the plan; see
|
|
5
|
+
* `hidesDescendants`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isVisibleInFloorplan(node: AnyNode, nodes: Record<string, AnyNode>): boolean;
|
|
8
|
+
//# sourceMappingURL=floorplan-preview-visibility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"floorplan-preview-visibility.d.ts","sourceRoot":"","sources":["../../../src/ui/floorplan/floorplan-preview-visibility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAoB,MAAM,kBAAkB,CAAA;AAEjE;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAW3F"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { hidesDescendants } from '@pascal-app/core';
|
|
2
|
+
/**
|
|
3
|
+
* A node draws in the plan unless it, or an ancestor whose flag reaches its
|
|
4
|
+
* descendants, is hidden. A hidden Site keeps its buildings on the plan; see
|
|
5
|
+
* `hidesDescendants`.
|
|
6
|
+
*/
|
|
7
|
+
export function isVisibleInFloorplan(node, nodes) {
|
|
8
|
+
if (node.visible === false)
|
|
9
|
+
return false;
|
|
10
|
+
const seen = new Set([node.id]);
|
|
11
|
+
let current = node.parentId ? nodes[node.parentId] : undefined;
|
|
12
|
+
while (current) {
|
|
13
|
+
if (seen.has(current.id))
|
|
14
|
+
return true;
|
|
15
|
+
seen.add(current.id);
|
|
16
|
+
if (current.visible === false && hidesDescendants(current))
|
|
17
|
+
return false;
|
|
18
|
+
current = current.parentId ? nodes[current.parentId] : undefined;
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type AnyNode } from '@pascal-app/core';
|
|
2
|
+
export type FloorplanPreviewScene = {
|
|
3
|
+
nodes: Record<string, AnyNode>;
|
|
4
|
+
installedPlugins?: readonly string[];
|
|
5
|
+
};
|
|
6
|
+
export type FloorplanPreviewProps = {
|
|
7
|
+
className?: string;
|
|
8
|
+
compassHost?: Element | null;
|
|
9
|
+
levelId?: string | null;
|
|
10
|
+
navigationVisible?: boolean;
|
|
11
|
+
onLevelChange?: (levelId: string) => void;
|
|
12
|
+
scene?: FloorplanPreviewScene | null;
|
|
13
|
+
showCompass?: boolean;
|
|
14
|
+
showLevelSelector?: boolean;
|
|
15
|
+
synchronizeNavigation?: boolean;
|
|
16
|
+
};
|
|
17
|
+
export declare function normalizeFloorplanPreviewNodes(nodes: Record<string, unknown>): Record<string, AnyNode>;
|
|
18
|
+
export declare function FloorplanPreview({ className, compassHost, levelId, navigationVisible, onLevelChange, scene, showCompass, showLevelSelector, synchronizeNavigation, }: FloorplanPreviewProps): import("react").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=floorplan-preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"floorplan-preview.d.ts","sourceRoot":"","sources":["../../../src/ui/floorplan/floorplan-preview.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,OAAO,EAeb,MAAM,kBAAkB,CAAA;AAwEzB,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,KAAK,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAAA;IACpC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC,CAAA;AA4DD,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBzB;AA2GD,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,WAAW,EACX,OAAO,EACP,iBAAwB,EACxB,aAAa,EACb,KAAK,EACL,WAAkB,EAClB,iBAAwB,EACxB,qBAA6B,GAC9B,EAAE,qBAAqB,+BA4uBvB"}
|