@pascal-app/viewer 1.0.7 → 1.1.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/README.md +54 -21
- package/dist/components/viewer/glb-replace-instances.d.ts +6 -3
- package/dist/components/viewer/glb-replace-instances.d.ts.map +1 -1
- package/dist/components/viewer/glb-replace-instances.js +5 -4
- package/dist/components/viewer/glb-scene.d.ts +3 -1
- package/dist/components/viewer/glb-scene.d.ts.map +1 -1
- package/dist/components/viewer/glb-scene.js +2 -1
- package/dist/components/viewer/index.d.ts.map +1 -1
- package/dist/components/viewer/index.js +8 -4
- package/dist/components/viewer/registered-systems.d.ts.map +1 -1
- package/dist/components/viewer/registered-systems.js +2 -2
- package/dist/components/viewer/unsupported-gpu-fallback.d.ts.map +1 -1
- package/dist/components/viewer/unsupported-gpu-fallback.js +21 -1
- package/dist/components/viewer/use-daylight-rooms.d.ts.map +1 -1
- package/dist/components/viewer/use-daylight-rooms.js +75 -33
- package/dist/hooks/use-gltf-ktx2.d.ts.map +1 -1
- package/dist/hooks/use-gltf-ktx2.js +2 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/lib/asset-url.d.ts +0 -1
- package/dist/lib/asset-url.d.ts.map +1 -1
- package/dist/lib/asset-url.js +3 -3
- package/dist/lib/daylight/room-context.d.ts.map +1 -1
- package/dist/lib/daylight/room-context.js +3 -2
- package/dist/lib/daylight/room-map.d.ts +124 -0
- package/dist/lib/daylight/room-map.d.ts.map +1 -0
- package/dist/lib/daylight/room-map.js +630 -0
- package/dist/lib/daylight/room-scene.d.ts +4 -2
- package/dist/lib/daylight/room-scene.d.ts.map +1 -1
- package/dist/lib/daylight/room-scene.js +72 -37
- package/dist/lib/daylight/rooms.d.ts +60 -30
- package/dist/lib/daylight/rooms.d.ts.map +1 -1
- package/dist/lib/daylight/rooms.js +331 -286
- package/dist/lib/ktx2-loader.d.ts.map +1 -1
- package/dist/lib/ktx2-loader.js +2 -1
- package/dist/lib/measurement-label.d.ts +4 -0
- package/dist/lib/measurement-label.d.ts.map +1 -0
- package/dist/lib/measurement-label.js +54 -0
- package/dist/lib/measurement-presentation.d.ts +5 -0
- package/dist/lib/measurement-presentation.d.ts.map +1 -0
- package/dist/lib/measurement-presentation.js +8 -0
- package/dist/lib/pointer-events.d.ts.map +1 -1
- package/dist/lib/pointer-events.js +3 -3
- package/dist/lib/texture-reference.d.ts.map +1 -1
- package/dist/lib/texture-reference.js +4 -3
- package/dist/lib/viewer-config.d.ts +21 -0
- package/dist/lib/viewer-config.d.ts.map +1 -0
- package/dist/lib/viewer-config.js +21 -0
- package/dist/lib/viewer-preference-storage.d.ts +7 -0
- package/dist/lib/viewer-preference-storage.d.ts.map +1 -0
- package/dist/lib/viewer-preference-storage.js +23 -0
- package/dist/store/use-viewer.d.ts +2 -56
- package/dist/store/use-viewer.d.ts.map +1 -1
- package/dist/store/use-viewer.js +3 -1
- package/dist/systems/elevator/elevator-interaction-system.d.ts +16 -2
- package/dist/systems/elevator/elevator-interaction-system.d.ts.map +1 -1
- package/dist/systems/elevator/elevator-interaction-system.js +41 -8
- package/dist/systems/geometry/geometry-status.d.ts +8 -0
- package/dist/systems/geometry/geometry-status.d.ts.map +1 -0
- package/dist/systems/geometry/geometry-status.js +24 -0
- package/dist/systems/roof/roof-system.d.ts.map +1 -1
- package/dist/systems/roof/roof-system.js +107 -65
- package/dist/systems/wall/wall-system.d.ts +11 -0
- package/dist/systems/wall/wall-system.d.ts.map +1 -1
- package/dist/systems/wall/wall-system.js +56 -10
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ktx2-loader.d.ts","sourceRoot":"","sources":["../../src/lib/ktx2-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EAMvB,MAAM,OAAO,CAAA;AAId,OAAO,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAA;
|
|
1
|
+
{"version":3,"file":"ktx2-loader.d.ts","sourceRoot":"","sources":["../../src/lib/ktx2-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EAMvB,MAAM,OAAO,CAAA;AAId,OAAO,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAA;AA4BrE,oFAAoF;AACpF,wBAAgB,oBAAoB,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAE1E;AAED;;;;;;;;;;GAUG;AACH,cAAM,uBAAwB,SAAQ,UAAU;IAC9C,OAAO,CAAC,YAAY,CAA0B;IAErC,IAAI,CACX,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,EAC5C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,EAC3C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GACjC,IAAI,CA8BN;IAED,OAAO,CAAC,cAAc;IAkBtB;kEAC8D;IACxD,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAiC5F;IAED,OAAO,IAAI,IAAI,CAKd;CACF;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,yBAAgC,CAAA;AAUvD;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7C;AAED,yFAAyF;AACzF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAmB5D;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,MAAM,EAAE;IAAE,aAAa,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAA;CAAE,EAC/C,QAAQ,EAAE,OAAO,GAChB,OAAO,CAIT;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9C"}
|
package/dist/lib/ktx2-loader.js
CHANGED
|
@@ -3,6 +3,7 @@ import { DataTexture, LinearFilter, LinearMipmapLinearFilter, RGBAFormat, Unsign
|
|
|
3
3
|
// LottieLoader/TTFLoader, whose CDN URL imports (`lottie-web`, `opentype.js`)
|
|
4
4
|
// crash bun's test runtime for every consumer of the viewer barrel.
|
|
5
5
|
import { KTX2Loader } from 'three/examples/jsm/loaders/KTX2Loader.js';
|
|
6
|
+
import { getViewerConfig } from './viewer-config';
|
|
6
7
|
/** Base width/height of a Basis-supercompressed KTX2 payload needing transcode
|
|
7
8
|
* (vkFormat 0 = ETC1S/UASTC) whose dimensions aren't block-aligned, or null
|
|
8
9
|
* for anything safe. Little-endian u32s: vkFormat at byte 12, pixelWidth at
|
|
@@ -125,7 +126,6 @@ class AlignmentSafeKTX2Loader extends KTX2Loader {
|
|
|
125
126
|
* the scene, so catalog `.ktx2` finishes still load).
|
|
126
127
|
*/
|
|
127
128
|
export const ktx2Loader = new AlignmentSafeKTX2Loader();
|
|
128
|
-
ktx2Loader.setTranscoderPath('https://cdn.jsdelivr.net/gh/pmndrs/drei-assets@master/basis/');
|
|
129
129
|
const configuredRenderers = new WeakSet();
|
|
130
130
|
const warnedRenderers = new WeakSet();
|
|
131
131
|
let resolveKtx2Ready;
|
|
@@ -144,6 +144,7 @@ export function whenKtx2Ready() {
|
|
|
144
144
|
}
|
|
145
145
|
/** Returns true once support has been detected for this renderer (KTX2 safe to load). */
|
|
146
146
|
export function ensureKtx2Support(renderer) {
|
|
147
|
+
ktx2Loader.setTranscoderPath(getViewerConfig().decoders.basisPath);
|
|
147
148
|
const key = renderer;
|
|
148
149
|
if (!key)
|
|
149
150
|
return false;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type MeasurementPoint } from '@pascal-app/core';
|
|
2
|
+
export declare function triangulateMeasurementPolygon(points: readonly MeasurementPoint[]): number[][];
|
|
3
|
+
export declare function measurementPolygonLabelAnchor(points: readonly MeasurementPoint[]): MeasurementPoint | null;
|
|
4
|
+
//# sourceMappingURL=measurement-label.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measurement-label.d.ts","sourceRoot":"","sources":["../../src/lib/measurement-label.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAA0C,MAAM,kBAAkB,CAAA;AA4BhG,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,GAAG,MAAM,EAAE,EAAE,CAE7F;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,SAAS,gBAAgB,EAAE,GAClC,gBAAgB,GAAG,IAAI,CAiCzB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { measurementCentroid, measurementNormal } from '@pascal-app/core';
|
|
2
|
+
import { ShapeUtils, Vector2, Vector3 } from 'three';
|
|
3
|
+
function projectMeasurementPolygon(points) {
|
|
4
|
+
const normalValue = measurementNormal(points);
|
|
5
|
+
const originValue = points[0];
|
|
6
|
+
if (!(normalValue && originValue))
|
|
7
|
+
return null;
|
|
8
|
+
const normal = new Vector3(...normalValue);
|
|
9
|
+
const reference = Math.abs(normal.y) < 0.9 ? new Vector3(0, 1, 0) : new Vector3(1, 0, 0);
|
|
10
|
+
const tangent = new Vector3().crossVectors(reference, normal).normalize();
|
|
11
|
+
const bitangent = new Vector3().crossVectors(normal, tangent).normalize();
|
|
12
|
+
const origin = new Vector3(...originValue);
|
|
13
|
+
const contour = points.map((point) => {
|
|
14
|
+
const relative = new Vector3(...point).sub(origin);
|
|
15
|
+
return new Vector2(relative.dot(tangent), relative.dot(bitangent));
|
|
16
|
+
});
|
|
17
|
+
return { contour, triangles: ShapeUtils.triangulateShape(contour, []) };
|
|
18
|
+
}
|
|
19
|
+
export function triangulateMeasurementPolygon(points) {
|
|
20
|
+
return projectMeasurementPolygon(points)?.triangles ?? [];
|
|
21
|
+
}
|
|
22
|
+
export function measurementPolygonLabelAnchor(points) {
|
|
23
|
+
const projection = projectMeasurementPolygon(points);
|
|
24
|
+
if (!projection || projection.triangles.length === 0)
|
|
25
|
+
return measurementCentroid(points);
|
|
26
|
+
let largestTriangle = null;
|
|
27
|
+
let largestArea = Number.NEGATIVE_INFINITY;
|
|
28
|
+
for (const triangle of projection.triangles) {
|
|
29
|
+
const [firstIndex, secondIndex, thirdIndex] = triangle;
|
|
30
|
+
const first = firstIndex === undefined ? null : projection.contour[firstIndex];
|
|
31
|
+
const second = secondIndex === undefined ? null : projection.contour[secondIndex];
|
|
32
|
+
const third = thirdIndex === undefined ? null : projection.contour[thirdIndex];
|
|
33
|
+
if (!(first && second && third))
|
|
34
|
+
continue;
|
|
35
|
+
const area = Math.abs((second.x - first.x) * (third.y - first.y) - (second.y - first.y) * (third.x - first.x));
|
|
36
|
+
if (area > largestArea) {
|
|
37
|
+
largestArea = area;
|
|
38
|
+
largestTriangle = triangle;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (!largestTriangle)
|
|
42
|
+
return measurementCentroid(points);
|
|
43
|
+
const [firstIndex, secondIndex, thirdIndex] = largestTriangle;
|
|
44
|
+
const first = firstIndex === undefined ? null : points[firstIndex];
|
|
45
|
+
const second = secondIndex === undefined ? null : points[secondIndex];
|
|
46
|
+
const third = thirdIndex === undefined ? null : points[thirdIndex];
|
|
47
|
+
if (!(first && second && third))
|
|
48
|
+
return measurementCentroid(points);
|
|
49
|
+
return [
|
|
50
|
+
(first[0] + second[0] + third[0]) / 3,
|
|
51
|
+
(first[1] + second[1] + third[1]) / 3,
|
|
52
|
+
(first[2] + second[2] + third[2]) / 3,
|
|
53
|
+
];
|
|
54
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const MEASUREMENT_ACTIVE_COLOR = "#6366f1";
|
|
2
|
+
export declare const MEASUREMENT_DANGLING_COLOR = "#dc2626";
|
|
3
|
+
export declare const MEASUREMENT_PERSISTENT_COLOR = "#111827";
|
|
4
|
+
export declare function measurementPresentationColor(dangling: boolean, active: boolean): string;
|
|
5
|
+
//# sourceMappingURL=measurement-presentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measurement-presentation.d.ts","sourceRoot":"","sources":["../../src/lib/measurement-presentation.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,YAAY,CAAA;AACjD,eAAO,MAAM,0BAA0B,YAAY,CAAA;AAEnD,eAAO,MAAM,4BAA4B,YAAY,CAAA;AAErD,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAGvF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const MEASUREMENT_ACTIVE_COLOR = '#6366f1';
|
|
2
|
+
export const MEASUREMENT_DANGLING_COLOR = '#dc2626';
|
|
3
|
+
export const MEASUREMENT_PERSISTENT_COLOR = '#111827';
|
|
4
|
+
export function measurementPresentationColor(dangling, active) {
|
|
5
|
+
if (dangling)
|
|
6
|
+
return MEASUREMENT_DANGLING_COLOR;
|
|
7
|
+
return active ? MEASUREMENT_ACTIVE_COLOR : MEASUREMENT_PERSISTENT_COLOR;
|
|
8
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pointer-events.d.ts","sourceRoot":"","sources":["../../src/lib/pointer-events.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pointer-events.d.ts","sourceRoot":"","sources":["../../src/lib/pointer-events.ts"],"names":[],"mappings":"AAmCA,OAAO,EACL,MAAM,IAAI,eAAe,EAGzB,KAAK,YAAY,EAMjB,KAAK,SAAS,EAEf,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,+FAA+F;AAC/F,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI,CAAA;AAmC5E,0GAA0G;AAC1G,wBAAgB,eAAe,CAAC,CAAC,SAAS,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAGlF;AAYD,wBAAgB,mBAAmB,CACjC,MAAM,SAA8D,EACpE,YAAY,CAAC,EAAE,uBAAuB,GACrC,OAAO,eAAe,CAIxB;AAiED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,QAAQ,GAAE,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,SAA2C,GACxF,OAAO,CAST;AAMD,KAAK,mBAAmB,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAA;AAmC3D;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,IAAI,EAAE,mBAAmB,GACxB,KAAK,CAAC,YAAY,EAAE,CAiBtB;AA+GD,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,SAAS,EAChB,YAAY,CAAC,EAAE,uBAAuB,GACrC,YAAY,CAAC,WAAW,CAAC,CAmB3B"}
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
* Ray collection is cached; camera-drag moves are throttled before stock dispatch.
|
|
27
27
|
* The throttle is a vendored-manager policy; dev ?stockEvents uses untouched R3F.
|
|
28
28
|
*/
|
|
29
|
-
import { sceneRegistry, useScene } from '@pascal-app/core';
|
|
29
|
+
import { isDevelopmentBuild, isDevelopmentOutsideTests, sceneRegistry, useScene, } from '@pascal-app/core';
|
|
30
30
|
import { events as createWebEvents, getRootState, } from '@react-three/fiber';
|
|
31
31
|
import * as THREE from 'three';
|
|
32
32
|
import { acceleratedRaycast } from 'three-mesh-bvh';
|
|
@@ -63,7 +63,7 @@ function isSupportedRaycast(raycast) {
|
|
|
63
63
|
raycast[pureRaycast] === true);
|
|
64
64
|
}
|
|
65
65
|
export function choosePointerEvents(search = typeof window !== 'undefined' ? window.location.search : '', onBreadcrumb) {
|
|
66
|
-
return
|
|
66
|
+
return isDevelopmentBuild() && new URLSearchParams(search).has('stockEvents')
|
|
67
67
|
? createWebEvents
|
|
68
68
|
: (store) => createPascalPointerEvents(store, onBreadcrumb);
|
|
69
69
|
}
|
|
@@ -443,7 +443,7 @@ function createEvents(store, onBreadcrumb) {
|
|
|
443
443
|
stats.fallbackEvents++;
|
|
444
444
|
stats.lastFallbackReason = reason;
|
|
445
445
|
if (unsupported &&
|
|
446
|
-
|
|
446
|
+
isDevelopmentOutsideTests() &&
|
|
447
447
|
!warnedRaycastNames.has(reason.fnName)) {
|
|
448
448
|
warnedRaycastNames.add(reason.fnName);
|
|
449
449
|
console.warn(`[pointer-events] Stock fallback for raycast "${reason.fnName}" on ${reason.objectType} "${reason.objectName}". Use markPureRaycast only after verifying it appends hits without reading prior hits or mutating scene/query state.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"texture-reference.d.ts","sourceRoot":"","sources":["../../src/lib/texture-reference.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAGnC,MAAM,MAAM,gBAAgB,GACxB,WAAW,GACX,QAAQ,GACR,WAAW,GACX,WAAW,GACX,QAAQ,GACR,OAAO,CAAA;AAEX,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,QAAQ,CAAA;AAEvD,KAAK,oBAAoB,GAAG;IAC1B,CAAC,EAAE,CAAC,CAAA;IACJ,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,gBAAgB,CAAA;IACrB,UAAU,EAAE,uBAAuB,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,gBAAgB,GACxB,CAAC,oBAAoB,GAAG;IACtB,IAAI,EAAE,kBAAkB,GAAG,cAAc,GAAG,eAAe,CAAA;CAC5D,CAAC,GACF,CAAC,oBAAoB,GAAG;IACtB,IAAI,EAAE,UAAU,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"texture-reference.d.ts","sourceRoot":"","sources":["../../src/lib/texture-reference.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAGnC,MAAM,MAAM,gBAAgB,GACxB,WAAW,GACX,QAAQ,GACR,WAAW,GACX,WAAW,GACX,QAAQ,GACR,OAAO,CAAA;AAEX,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,QAAQ,CAAA;AAEvD,KAAK,oBAAoB,GAAG;IAC1B,CAAC,EAAE,CAAC,CAAA;IACJ,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,gBAAgB,CAAA;IACrB,UAAU,EAAE,uBAAuB,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,gBAAgB,GACxB,CAAC,oBAAoB,GAAG;IACtB,IAAI,EAAE,kBAAkB,GAAG,cAAc,GAAG,eAAe,CAAA;CAC5D,CAAC,GACF,CAAC,oBAAoB,GAAG;IACtB,IAAI,EAAE,UAAU,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAC,CAAA;AA0DN,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAgBhE;AAMD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,KAAK,EACD;IACE;wEACoE;IACpE,IAAI,EAAE,UAAU,GAAG,eAAe,CAAA;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACb,GACD;IACE,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACnB,GACJ,gBAAgB,GAAG,IAAI,CA6BzB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAmCnF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getViewerConfig } from './viewer-config';
|
|
2
2
|
const STORAGE_BUCKET_BY_KIND = {
|
|
3
3
|
'library-material': 'materials',
|
|
4
4
|
'item-glb': 'items',
|
|
@@ -8,7 +8,7 @@ const STORAGE_BUCKET_BY_KIND = {
|
|
|
8
8
|
// null origin for the rest of the process.
|
|
9
9
|
let cachedStorageOrigin;
|
|
10
10
|
function pascalStorageOrigin() {
|
|
11
|
-
const url =
|
|
11
|
+
const url = getViewerConfig().storageUrl;
|
|
12
12
|
if (cachedStorageOrigin && cachedStorageOrigin.url === url)
|
|
13
13
|
return cachedStorageOrigin.origin;
|
|
14
14
|
let origin = null;
|
|
@@ -25,7 +25,8 @@ function pascalStorageOrigin() {
|
|
|
25
25
|
function isAppMaterialUrl(src) {
|
|
26
26
|
try {
|
|
27
27
|
const url = new URL(src);
|
|
28
|
-
return url.origin === new URL(
|
|
28
|
+
return (url.origin === new URL(getViewerConfig().assetsBaseUrl).origin &&
|
|
29
|
+
url.pathname.startsWith('/material/'));
|
|
29
30
|
}
|
|
30
31
|
catch {
|
|
31
32
|
return false;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type ViewerConfig = {
|
|
2
|
+
assetsBaseUrl?: string;
|
|
3
|
+
storageUrl?: string;
|
|
4
|
+
decoders?: {
|
|
5
|
+
dracoPath?: string;
|
|
6
|
+
basisPath?: string;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
export declare const ASSETS_CDN_URL = "https://editor.pascal.app";
|
|
10
|
+
/** Configure the page's viewer runtime before hydrating or loading assets. */
|
|
11
|
+
export declare function configureViewer(options: ViewerConfig): void;
|
|
12
|
+
/** Resolve at use time so browser hosts need neither Next nor a process polyfill. */
|
|
13
|
+
export declare function getViewerConfig(): {
|
|
14
|
+
assetsBaseUrl: string;
|
|
15
|
+
storageUrl: string | undefined;
|
|
16
|
+
decoders: {
|
|
17
|
+
dracoPath: string;
|
|
18
|
+
basisPath: string;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=viewer-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewer-config.d.ts","sourceRoot":"","sources":["../../src/lib/viewer-config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE;QACT,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;CACF,CAAA;AAED,eAAO,MAAM,cAAc,8BAA8B,CAAA;AAIzD,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAE3D;AAED,qFAAqF;AACrF,wBAAgB,eAAe;IAE3B,aAAa;IAIb,UAAU;IAGV,QAAQ;QACN,SAAS;QAET,SAAS;;EAKd"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const ASSETS_CDN_URL = 'https://editor.pascal.app';
|
|
2
|
+
let config = {};
|
|
3
|
+
/** Configure the page's viewer runtime before hydrating or loading assets. */
|
|
4
|
+
export function configureViewer(options) {
|
|
5
|
+
config = { ...options, decoders: { ...options.decoders } };
|
|
6
|
+
}
|
|
7
|
+
/** Resolve at use time so browser hosts need neither Next nor a process polyfill. */
|
|
8
|
+
export function getViewerConfig() {
|
|
9
|
+
return {
|
|
10
|
+
assetsBaseUrl: config.assetsBaseUrl ??
|
|
11
|
+
((typeof process !== 'undefined' ? process.env.NEXT_PUBLIC_ASSETS_CDN_URL : undefined) ||
|
|
12
|
+
ASSETS_CDN_URL),
|
|
13
|
+
storageUrl: config.storageUrl ??
|
|
14
|
+
(typeof process !== 'undefined' ? process.env.NEXT_PUBLIC_SUPABASE_URL : undefined),
|
|
15
|
+
decoders: {
|
|
16
|
+
dracoPath: config.decoders?.dracoPath ?? 'https://www.gstatic.com/draco/versioned/decoders/1.5.5/',
|
|
17
|
+
basisPath: config.decoders?.basisPath ??
|
|
18
|
+
'https://cdn.jsdelivr.net/npm/three@0.187.0/examples/jsm/libs/basis/',
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Browser privacy settings can deny even access to the localStorage property. */
|
|
2
|
+
export declare const viewerPreferenceStorage: {
|
|
3
|
+
getItem(name: string): string | null;
|
|
4
|
+
setItem(name: string, value: string): void;
|
|
5
|
+
removeItem(name: string): void;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=viewer-preference-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewer-preference-storage.d.ts","sourceRoot":"","sources":["../../src/lib/viewer-preference-storage.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,eAAO,MAAM,uBAAuB;;;;CAkBZ,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Browser privacy settings can deny even access to the localStorage property. */
|
|
2
|
+
export const viewerPreferenceStorage = {
|
|
3
|
+
getItem(name) {
|
|
4
|
+
try {
|
|
5
|
+
return window.localStorage.getItem(name);
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
setItem(name, value) {
|
|
12
|
+
try {
|
|
13
|
+
window.localStorage.setItem(name, value);
|
|
14
|
+
}
|
|
15
|
+
catch { }
|
|
16
|
+
},
|
|
17
|
+
removeItem(name) {
|
|
18
|
+
try {
|
|
19
|
+
window.localStorage.removeItem(name);
|
|
20
|
+
}
|
|
21
|
+
catch { }
|
|
22
|
+
},
|
|
23
|
+
};
|
|
@@ -296,67 +296,13 @@ declare const useViewer: import("zustand").UseBoundStore<Omit<import("zustand").
|
|
|
296
296
|
setState(partial: Partial<ViewerState> | ViewerState | ((state: ViewerState) => Partial<ViewerState> | ViewerState), replace?: false | undefined): unknown;
|
|
297
297
|
setState(state: ViewerState | ((state: ViewerState) => ViewerState), replace: true): unknown;
|
|
298
298
|
persist: {
|
|
299
|
-
setOptions: (options: Partial<import("zustand/middleware").PersistOptions<ViewerState,
|
|
300
|
-
cameraMode: "orthographic" | "perspective";
|
|
301
|
-
sceneTheme: string;
|
|
302
|
-
shadingByContext: Partial<Record<RenderContext, RenderShading>>;
|
|
303
|
-
textures: boolean;
|
|
304
|
-
colorPreset: ColorPreset;
|
|
305
|
-
edges: EdgeMode;
|
|
306
|
-
shadows: boolean;
|
|
307
|
-
unit?: "imperial" | "metric" | undefined;
|
|
308
|
-
metricNotation: MetricNotation;
|
|
309
|
-
levelMode: "exploded" | "manual" | "solo" | "stacked";
|
|
310
|
-
wallMode: WallMode;
|
|
311
|
-
projectPreferences: {
|
|
312
|
-
[k: string]: {
|
|
313
|
-
look?: LocalLook;
|
|
314
|
-
showScans?: boolean;
|
|
315
|
-
showGuides?: boolean;
|
|
316
|
-
showGrid?: boolean;
|
|
317
|
-
showMeasurements?: boolean;
|
|
318
|
-
};
|
|
319
|
-
};
|
|
320
|
-
timeOfDay: "blue" | "golden" | "midday" | "night";
|
|
321
|
-
timeOfDayMinutes: number | null;
|
|
322
|
-
skyLive: boolean;
|
|
323
|
-
weather: "clear" | "cloudy" | "fair" | "overcast";
|
|
324
|
-
deviceLocation: LatLng | null;
|
|
325
|
-
renderQuality: RenderQualityChoice;
|
|
326
|
-
}, unknown>>) => void;
|
|
299
|
+
setOptions: (options: Partial<import("zustand/middleware").PersistOptions<ViewerState, unknown, unknown>>) => void;
|
|
327
300
|
clearStorage: () => void;
|
|
328
301
|
rehydrate: () => Promise<void> | void;
|
|
329
302
|
hasHydrated: () => boolean;
|
|
330
303
|
onHydrate: (fn: (state: ViewerState) => void) => () => void;
|
|
331
304
|
onFinishHydration: (fn: (state: ViewerState) => void) => () => void;
|
|
332
|
-
getOptions: () => Partial<import("zustand/middleware").PersistOptions<ViewerState,
|
|
333
|
-
cameraMode: "orthographic" | "perspective";
|
|
334
|
-
sceneTheme: string;
|
|
335
|
-
shadingByContext: Partial<Record<RenderContext, RenderShading>>;
|
|
336
|
-
textures: boolean;
|
|
337
|
-
colorPreset: ColorPreset;
|
|
338
|
-
edges: EdgeMode;
|
|
339
|
-
shadows: boolean;
|
|
340
|
-
unit?: "imperial" | "metric" | undefined;
|
|
341
|
-
metricNotation: MetricNotation;
|
|
342
|
-
levelMode: "exploded" | "manual" | "solo" | "stacked";
|
|
343
|
-
wallMode: WallMode;
|
|
344
|
-
projectPreferences: {
|
|
345
|
-
[k: string]: {
|
|
346
|
-
look?: LocalLook;
|
|
347
|
-
showScans?: boolean;
|
|
348
|
-
showGuides?: boolean;
|
|
349
|
-
showGrid?: boolean;
|
|
350
|
-
showMeasurements?: boolean;
|
|
351
|
-
};
|
|
352
|
-
};
|
|
353
|
-
timeOfDay: "blue" | "golden" | "midday" | "night";
|
|
354
|
-
timeOfDayMinutes: number | null;
|
|
355
|
-
skyLive: boolean;
|
|
356
|
-
weather: "clear" | "cloudy" | "fair" | "overcast";
|
|
357
|
-
deviceLocation: LatLng | null;
|
|
358
|
-
renderQuality: RenderQualityChoice;
|
|
359
|
-
}, unknown>>;
|
|
305
|
+
getOptions: () => Partial<import("zustand/middleware").PersistOptions<ViewerState, unknown, unknown>>;
|
|
360
306
|
};
|
|
361
307
|
}>;
|
|
362
308
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-viewer.d.ts","sourceRoot":"","sources":["../../src/store/use-viewer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,kBAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,QAAQ,EACR,QAAQ,EACT,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAIrC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,qBAAqB,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
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { create } from 'zustand';
|
|
3
|
-
import { persist } from 'zustand/middleware';
|
|
3
|
+
import { createJSONStorage, persist } from 'zustand/middleware';
|
|
4
4
|
import { getSceneTheme, projectSceneTheme, SCENE_THEME_IDS, } from '../lib/scene-themes';
|
|
5
|
+
import { viewerPreferenceStorage } from '../lib/viewer-preference-storage';
|
|
5
6
|
const TIMES_OF_DAY = ['golden', 'midday', 'blue', 'night'];
|
|
6
7
|
const WEATHERS = ['clear', 'fair', 'cloudy', 'overcast'];
|
|
7
8
|
const RENDER_QUALITY_CHOICES = ['auto', 'low', 'medium', 'high'];
|
|
@@ -481,6 +482,7 @@ const useViewer = create()(persist((set) => ({
|
|
|
481
482
|
setInputDragging: (dragging) => set({ inputDragging: dragging }),
|
|
482
483
|
}), {
|
|
483
484
|
name: 'viewer-preferences',
|
|
485
|
+
storage: createJSONStorage(() => viewerPreferenceStorage),
|
|
484
486
|
merge: (persistedState, currentState) => {
|
|
485
487
|
const persisted = normalizePersistedViewerState(persistedState);
|
|
486
488
|
const renderQualityChoice = persisted.renderQualityChoice ?? currentState.renderQualityChoice;
|
|
@@ -1,9 +1,23 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type AnyNodeId } from '@pascal-app/core';
|
|
2
|
+
import { type Object3D, Raycaster } from 'three';
|
|
3
|
+
type ElevatorButtonAction = 'open-door' | 'request-level';
|
|
4
|
+
type ElevatorButtonUserData = {
|
|
5
|
+
action: ElevatorButtonAction;
|
|
6
|
+
disabled: boolean;
|
|
7
|
+
elevatorId: AnyNodeId;
|
|
8
|
+
kind: 'cab' | 'landing';
|
|
9
|
+
levelId?: AnyNodeId;
|
|
10
|
+
};
|
|
2
11
|
/**
|
|
3
12
|
* The roots of every elevator button under `object`. Any button along the ray
|
|
4
13
|
* takes the click, so only they are raycast — never the rest of the scene,
|
|
5
14
|
* whose meshes this capture-phase listener must not trip over.
|
|
6
15
|
*/
|
|
7
16
|
export declare function collectElevatorButtons(object: Object3D, into?: Object3D[]): Object3D[];
|
|
8
|
-
|
|
17
|
+
/** Ignore malformed material groups during transient paint updates, rather than raycasting invalid faces. */
|
|
18
|
+
export declare function pickElevatorButton(scene: Object3D, raycaster: Raycaster): ElevatorButtonUserData | null;
|
|
19
|
+
export declare function ElevatorInteractionSystem({ enabled }: {
|
|
20
|
+
enabled?: boolean;
|
|
21
|
+
}): null;
|
|
22
|
+
export {};
|
|
9
23
|
//# sourceMappingURL=elevator-interaction-system.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elevator-interaction-system.d.ts","sourceRoot":"","sources":["../../../src/systems/elevator/elevator-interaction-system.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"elevator-interaction-system.d.ts","sourceRoot":"","sources":["../../../src/systems/elevator/elevator-interaction-system.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAMf,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAQ,KAAK,QAAQ,EAAE,SAAS,EAAW,MAAM,OAAO,CAAA;AAE/D,KAAK,oBAAoB,GAAG,WAAW,GAAG,eAAe,CAAA;AAEzD,KAAK,sBAAsB,GAAG;IAC5B,MAAM,EAAE,oBAAoB,CAAA;IAC5B,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,SAAS,CAAA;IACrB,IAAI,EAAE,KAAK,GAAG,SAAS,CAAA;IACvB,OAAO,CAAC,EAAE,SAAS,CAAA;CACpB,CAAA;AAcD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAE,QAAQ,EAAO,GAAG,QAAQ,EAAE,CAQ1F;AAED,6GAA6G;AAC7G,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,SAAS,GACnB,sBAAsB,GAAG,IAAI,CAoC/B;AAED,wBAAgB,yBAAyB,CAAC,EAAE,OAAc,EAAE,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,QA0DlF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { openElevatorDoor, requestElevatorLevel, resolveElevatorDispatchTarget, useInteractive, useScene, } from '@pascal-app/core';
|
|
2
2
|
import { useThree } from '@react-three/fiber';
|
|
3
3
|
import { useEffect, useRef } from 'react';
|
|
4
|
-
import { Raycaster, Vector2 } from 'three';
|
|
4
|
+
import { Mesh, Raycaster, Vector2 } from 'three';
|
|
5
5
|
function getElevatorButtonData(object) {
|
|
6
6
|
let current = object;
|
|
7
7
|
while (current) {
|
|
@@ -18,6 +18,8 @@ function getElevatorButtonData(object) {
|
|
|
18
18
|
* whose meshes this capture-phase listener must not trip over.
|
|
19
19
|
*/
|
|
20
20
|
export function collectElevatorButtons(object, into = []) {
|
|
21
|
+
if (!object.visible)
|
|
22
|
+
return into;
|
|
21
23
|
if (object.userData.elevatorButton) {
|
|
22
24
|
into.push(object);
|
|
23
25
|
return into;
|
|
@@ -26,7 +28,41 @@ export function collectElevatorButtons(object, into = []) {
|
|
|
26
28
|
collectElevatorButtons(child, into);
|
|
27
29
|
return into;
|
|
28
30
|
}
|
|
29
|
-
|
|
31
|
+
/** Ignore malformed material groups during transient paint updates, rather than raycasting invalid faces. */
|
|
32
|
+
export function pickElevatorButton(scene, raycaster) {
|
|
33
|
+
const buttons = collectElevatorButtons(scene);
|
|
34
|
+
const faces = [];
|
|
35
|
+
for (const button of buttons)
|
|
36
|
+
button.traverseVisible((object) => {
|
|
37
|
+
if (object instanceof Mesh)
|
|
38
|
+
faces.push(object);
|
|
39
|
+
});
|
|
40
|
+
const hit = raycaster.intersectObjects(faces, false)[0];
|
|
41
|
+
if (!hit)
|
|
42
|
+
return null;
|
|
43
|
+
const blockers = [];
|
|
44
|
+
scene.traverseVisible((object) => {
|
|
45
|
+
if (!(object instanceof Mesh) ||
|
|
46
|
+
getElevatorButtonData(object) ||
|
|
47
|
+
object.userData.pascalExport === 'strip')
|
|
48
|
+
return;
|
|
49
|
+
if (Array.isArray(object.material) &&
|
|
50
|
+
object.geometry.groups.some((group) => !object.material[group.materialIndex ?? 0] || !Number.isFinite(group.count)))
|
|
51
|
+
return;
|
|
52
|
+
blockers.push(object);
|
|
53
|
+
});
|
|
54
|
+
const occluded = raycaster.intersectObjects(blockers, false).some((intersection) => {
|
|
55
|
+
if (intersection.distance >= hit.distance - 0.001)
|
|
56
|
+
return false;
|
|
57
|
+
const mesh = intersection.object;
|
|
58
|
+
const material = Array.isArray(mesh.material)
|
|
59
|
+
? mesh.material[intersection.face?.materialIndex ?? 0]
|
|
60
|
+
: mesh.material;
|
|
61
|
+
return material?.visible && (!material.transparent || material.opacity >= 0.95);
|
|
62
|
+
});
|
|
63
|
+
return occluded ? null : getElevatorButtonData(hit.object);
|
|
64
|
+
}
|
|
65
|
+
export function ElevatorInteractionSystem({ enabled = true }) {
|
|
30
66
|
const camera = useThree((state) => state.camera);
|
|
31
67
|
const gl = useThree((state) => state.gl);
|
|
32
68
|
const scene = useThree((state) => state.scene);
|
|
@@ -35,7 +71,7 @@ export function ElevatorInteractionSystem() {
|
|
|
35
71
|
useEffect(() => {
|
|
36
72
|
const canvas = gl.domElement;
|
|
37
73
|
const handlePointerDown = (event) => {
|
|
38
|
-
if (event.button !== 0)
|
|
74
|
+
if (event.button !== 0 || !enabled)
|
|
39
75
|
return;
|
|
40
76
|
const buttons = collectElevatorButtons(scene);
|
|
41
77
|
if (buttons.length === 0)
|
|
@@ -46,10 +82,7 @@ export function ElevatorInteractionSystem() {
|
|
|
46
82
|
pointer.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;
|
|
47
83
|
const raycaster = raycasterRef.current;
|
|
48
84
|
raycaster.setFromCamera(pointer, camera);
|
|
49
|
-
const button = raycaster
|
|
50
|
-
.intersectObjects(buttons, true)
|
|
51
|
-
.map((intersection) => getElevatorButtonData(intersection.object))
|
|
52
|
-
.find((data) => data !== null);
|
|
85
|
+
const button = pickElevatorButton(scene, raycaster);
|
|
53
86
|
if (!button || button.disabled)
|
|
54
87
|
return;
|
|
55
88
|
event.preventDefault();
|
|
@@ -74,6 +107,6 @@ export function ElevatorInteractionSystem() {
|
|
|
74
107
|
return () => {
|
|
75
108
|
canvas.removeEventListener('pointerdown', handlePointerDown, true);
|
|
76
109
|
};
|
|
77
|
-
}, [camera, gl, scene]);
|
|
110
|
+
}, [camera, gl, scene, enabled]);
|
|
78
111
|
return null;
|
|
79
112
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type AnyNodeId } from '@pascal-app/core';
|
|
2
|
+
export type GeometryFailure = 'build-failed' | 'invalid-geometry';
|
|
3
|
+
/** Geometry failures describe the current rendering, never saved building data. */
|
|
4
|
+
export declare const useGeometryStatus: import("zustand").UseBoundStore<import("zustand").StoreApi<{
|
|
5
|
+
failures: ReadonlyMap<AnyNodeId, GeometryFailure>;
|
|
6
|
+
}>>;
|
|
7
|
+
export declare function setGeometryFailure(id: AnyNodeId, message: GeometryFailure | null): void;
|
|
8
|
+
//# sourceMappingURL=geometry-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry-status.d.ts","sourceRoot":"","sources":["../../../src/systems/geometry/geometry-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,kBAAkB,CAAA;AAG3D,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,kBAAkB,CAAA;AAEjE,mFAAmF;AACnF,eAAO,MAAM,iBAAiB;cAAsB,WAAW,CAAC,SAAS,EAAE,eAAe,CAAC;GAI1F,CAAA;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,QAOhF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { useScene } from '@pascal-app/core';
|
|
2
|
+
import { create } from 'zustand';
|
|
3
|
+
/** Geometry failures describe the current rendering, never saved building data. */
|
|
4
|
+
export const useGeometryStatus = create(() => ({
|
|
5
|
+
failures: new Map(),
|
|
6
|
+
}));
|
|
7
|
+
export function setGeometryFailure(id, message) {
|
|
8
|
+
const current = useGeometryStatus.getState().failures;
|
|
9
|
+
if ((current.get(id) ?? null) === message)
|
|
10
|
+
return;
|
|
11
|
+
const failures = new Map(current);
|
|
12
|
+
if (message)
|
|
13
|
+
failures.set(id, message);
|
|
14
|
+
else
|
|
15
|
+
failures.delete(id);
|
|
16
|
+
useGeometryStatus.setState({ failures });
|
|
17
|
+
}
|
|
18
|
+
useScene.subscribe((scene, previous) => {
|
|
19
|
+
const failures = useGeometryStatus.getState().failures;
|
|
20
|
+
for (const id of failures.keys()) {
|
|
21
|
+
if (scene.hydrationId !== previous.hydrationId || !scene.nodes[id])
|
|
22
|
+
setGeometryFailure(id, null);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roof-system.d.ts","sourceRoot":"","sources":["../../../src/systems/roof/roof-system.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAgCZ,KAAK,eAAe,EAUrB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAY,KAAK,EAA0B,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"roof-system.d.ts","sourceRoot":"","sources":["../../../src/systems/roof/roof-system.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAgCZ,KAAK,eAAe,EAUrB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAY,KAAK,EAA0B,MAAM,eAAe,CAAA;AAmKvE;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAIjD;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EACzB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,KAAK,CAAC,QAAQ,GAAG,SAAS,GAClD,MAAM,CAIR;AAiFD,0EAA0E;AAC1E,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,IAAI,CAAA;CAChE,CAAA;AAED,eAAO,MAAM,UAAU,yBAAyB;IAAE,eAAe,CAAC,EAAE,mBAAmB,CAAA;CAAE,SA6KxF,CAAA;AAmeD;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,EAAE;IAC7B,KAAK,CAAC,iBAAiB;IACvB,KAAK,CAAC,iBAAiB;IACvB,KAAK,CAAC,iBAAiB;IACvB,KAAK,CAAC,iBAAiB;CAMxB,CAAA;AAID,eAAO,MAAM,wBAAwB,IAAI,CAAA;AAEzC,KAAK,mBAAmB,GAAG;IACzB,QAAQ,EAAE,KAAK,CAAA;IACf,QAAQ,EAAE,KAAK,CAAA;IACf,SAAS,EAAE,KAAK,CAAA;IAChB,UAAU,EAAE,KAAK,CAAA;IACjB,UAAU,EAAE,KAAK,CAAC,cAAc,GAAG,IAAI,CAAA;CACxC,CAAA;AA8FD,wBAAgB,yBAAyB,CACvC,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,YAAY,EAAE,KAAK,CAAC,QAAQ,EAAE,EAC9B,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,GACtC,MAAM,CAuBR;AA4XD;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,KAAK,CAAC,cAAc,GAAG,IAAI,EACrC,OAAO,EAAE,eAAe,GACvB,KAAK,CAAC,cAAc,GAAG,IAAI,CAgC7B;AAiUD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAO9D;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,eAAe,EACrB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACnD,mBAAmB,GAAG,IAAI,CA8b5B;AAkFD;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,eAAe,EACrB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,KAAK,CAAC,cAAc,CA0HtB;AAED,wBAAgB,qCAAqC,CACnD,QAAQ,EAAE,KAAK,CAAC,cAAc,EAC9B,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,KAAK,CAAC,cAAc,CAiCtB;AAkwCD,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE,eAAe,CAAA;IACrB,0EAA0E;IAC1E,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAA;CAC9B,CAAA;AA+CD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,KAAK,CAAC,cAAc,EAC9B,QAAQ,EAAE,SAAS,eAAe,EAAE,EACpC,MAAM,EAAE,OAAO,QA8DhB;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,EAAE,IAAI,EAAE,eAAe,QA0ExF;AAirBD,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAA;IACpB,MAAM,EAAE,KAAK,CAAC,OAAO,CAAA;CACtB,CAAA;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,eAAe,EACxB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,YAAY,CA+Ld"}
|