@ifc-lite/renderer 2.0.1 → 3.0.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 +11 -1
- package/dist/appearance-batch-cohorts.d.ts +33 -0
- package/dist/appearance-batch-cohorts.d.ts.map +1 -0
- package/dist/appearance-batch-cohorts.js +126 -0
- package/dist/appearance-batch-cohorts.js.map +1 -0
- package/dist/appearance-companions.d.ts +30 -0
- package/dist/appearance-companions.d.ts.map +1 -0
- package/dist/appearance-companions.js +138 -0
- package/dist/appearance-companions.js.map +1 -0
- package/dist/appearance-partition.d.ts +32 -0
- package/dist/appearance-partition.d.ts.map +1 -0
- package/dist/appearance-partition.js +122 -0
- package/dist/appearance-partition.js.map +1 -0
- package/dist/appearance-preview.d.ts +97 -0
- package/dist/appearance-preview.d.ts.map +1 -0
- package/dist/appearance-preview.js +276 -0
- package/dist/appearance-preview.js.map +1 -0
- package/dist/appearance-uvs.d.ts +13 -0
- package/dist/appearance-uvs.d.ts.map +1 -0
- package/dist/appearance-uvs.js +136 -0
- package/dist/appearance-uvs.js.map +1 -0
- package/dist/bvh.d.ts.map +1 -1
- package/dist/bvh.js +3 -0
- package/dist/bvh.js.map +1 -1
- package/dist/deviation/deviation-computer.js +1 -1
- package/dist/deviation/deviation-computer.js.map +1 -1
- package/dist/index.d.ts +60 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +186 -233
- package/dist/index.js.map +1 -1
- package/dist/merged-mesh-extract.d.ts +18 -0
- package/dist/merged-mesh-extract.d.ts.map +1 -0
- package/dist/merged-mesh-extract.js +73 -0
- package/dist/merged-mesh-extract.js.map +1 -0
- package/dist/model-bounds-tracker.d.ts +1 -1
- package/dist/model-bounds-tracker.d.ts.map +1 -1
- package/dist/model-bounds-tracker.js +3 -2
- package/dist/model-bounds-tracker.js.map +1 -1
- package/dist/model-placement-bounds.d.ts +29 -0
- package/dist/model-placement-bounds.d.ts.map +1 -0
- package/dist/model-placement-bounds.js +55 -0
- package/dist/model-placement-bounds.js.map +1 -0
- package/dist/model-translation.d.ts +57 -0
- package/dist/model-translation.d.ts.map +1 -0
- package/dist/model-translation.js +223 -0
- package/dist/model-translation.js.map +1 -0
- package/dist/partial-batch-cache.d.ts +65 -0
- package/dist/partial-batch-cache.d.ts.map +1 -0
- package/dist/partial-batch-cache.js +88 -0
- package/dist/partial-batch-cache.js.map +1 -0
- package/dist/partial-batch-requests.d.ts +77 -0
- package/dist/partial-batch-requests.d.ts.map +1 -0
- package/dist/partial-batch-requests.js +97 -0
- package/dist/partial-batch-requests.js.map +1 -0
- package/dist/picking-manager.js +2 -2
- package/dist/picking-manager.js.map +1 -1
- package/dist/point-picker.d.ts +2 -2
- package/dist/point-picker.d.ts.map +1 -1
- package/dist/point-picker.js +27 -21
- package/dist/point-picker.js.map +1 -1
- package/dist/pointcloud/point-cloud-node.d.ts +2 -0
- package/dist/pointcloud/point-cloud-node.d.ts.map +1 -1
- package/dist/pointcloud/point-cloud-node.js +12 -0
- package/dist/pointcloud/point-cloud-node.js.map +1 -1
- package/dist/pointcloud/point-cloud-placement.d.ts +20 -0
- package/dist/pointcloud/point-cloud-placement.d.ts.map +1 -0
- package/dist/pointcloud/point-cloud-placement.js +69 -0
- package/dist/pointcloud/point-cloud-placement.js.map +1 -0
- package/dist/pointcloud/point-cloud-renderer.d.ts +14 -14
- package/dist/pointcloud/point-cloud-renderer.d.ts.map +1 -1
- package/dist/pointcloud/point-cloud-renderer.js +47 -63
- package/dist/pointcloud/point-cloud-renderer.js.map +1 -1
- package/dist/raycast-engine.d.ts +11 -13
- package/dist/raycast-engine.d.ts.map +1 -1
- package/dist/raycast-engine.js +28 -56
- package/dist/raycast-engine.js.map +1 -1
- package/dist/raycaster.d.ts +7 -1
- package/dist/raycaster.d.ts.map +1 -1
- package/dist/raycaster.js +20 -5
- package/dist/raycaster.js.map +1 -1
- package/dist/reference-image-hit.d.ts +5 -0
- package/dist/reference-image-hit.d.ts.map +1 -0
- package/dist/reference-image-hit.js +28 -0
- package/dist/reference-image-hit.js.map +1 -0
- package/dist/reference-image-host.d.ts +5 -0
- package/dist/reference-image-host.d.ts.map +1 -0
- package/dist/reference-image-host.js +26 -0
- package/dist/reference-image-host.js.map +1 -0
- package/dist/reference-image-pipeline.d.ts +15 -0
- package/dist/reference-image-pipeline.d.ts.map +1 -0
- package/dist/reference-image-pipeline.js +104 -0
- package/dist/reference-image-pipeline.js.map +1 -0
- package/dist/reference-image-types.d.ts +27 -0
- package/dist/reference-image-types.d.ts.map +1 -0
- package/dist/reference-image-types.js +5 -0
- package/dist/reference-image-types.js.map +1 -0
- package/dist/reference-images.d.ts +27 -0
- package/dist/reference-images.d.ts.map +1 -0
- package/dist/reference-images.js +134 -0
- package/dist/reference-images.js.map +1 -0
- package/dist/renderer-viewport.d.ts +3 -0
- package/dist/renderer-viewport.d.ts.map +1 -0
- package/dist/renderer-viewport.js +20 -0
- package/dist/renderer-viewport.js.map +1 -0
- package/dist/rgba-texture-pool.d.ts +12 -0
- package/dist/rgba-texture-pool.d.ts.map +1 -0
- package/dist/rgba-texture-pool.js +51 -0
- package/dist/rgba-texture-pool.js.map +1 -0
- package/dist/scene-appearance-buckets.d.ts +41 -0
- package/dist/scene-appearance-buckets.d.ts.map +1 -0
- package/dist/scene-appearance-buckets.js +164 -0
- package/dist/scene-appearance-buckets.js.map +1 -0
- package/dist/scene-appearance-instances.d.ts +42 -0
- package/dist/scene-appearance-instances.d.ts.map +1 -0
- package/dist/scene-appearance-instances.js +143 -0
- package/dist/scene-appearance-instances.js.map +1 -0
- package/dist/scene-appearance-preview.d.ts +30 -0
- package/dist/scene-appearance-preview.d.ts.map +1 -0
- package/dist/scene-appearance-preview.js +149 -0
- package/dist/scene-appearance-preview.js.map +1 -0
- package/dist/scene-appearance-resources.d.ts +16 -0
- package/dist/scene-appearance-resources.d.ts.map +1 -0
- package/dist/scene-appearance-resources.js +41 -0
- package/dist/scene-appearance-resources.js.map +1 -0
- package/dist/scene-authored-owner.d.ts +9 -0
- package/dist/scene-authored-owner.d.ts.map +1 -0
- package/dist/scene-authored-owner.js +73 -0
- package/dist/scene-authored-owner.js.map +1 -0
- package/dist/scene-batch-upload.d.ts +12 -0
- package/dist/scene-batch-upload.d.ts.map +1 -0
- package/dist/scene-batch-upload.js +147 -0
- package/dist/scene-batch-upload.js.map +1 -0
- package/dist/scene-contents.d.ts +41 -0
- package/dist/scene-contents.d.ts.map +1 -1
- package/dist/scene-geometry.d.ts +16 -0
- package/dist/scene-geometry.d.ts.map +1 -1
- package/dist/scene-geometry.js +26 -0
- package/dist/scene-geometry.js.map +1 -1
- package/dist/scene-instance-materialization.d.ts +18 -0
- package/dist/scene-instance-materialization.d.ts.map +1 -0
- package/dist/scene-instance-materialization.js +57 -0
- package/dist/scene-instance-materialization.js.map +1 -0
- package/dist/scene-instance-suppression.d.ts +22 -0
- package/dist/scene-instance-suppression.d.ts.map +1 -0
- package/dist/scene-instance-suppression.js +100 -0
- package/dist/scene-instance-suppression.js.map +1 -0
- package/dist/scene-instance-types.d.ts +57 -0
- package/dist/scene-instance-types.d.ts.map +1 -0
- package/dist/scene-instance-types.js +2 -0
- package/dist/scene-instance-types.js.map +1 -0
- package/dist/scene-model-translation.d.ts +49 -0
- package/dist/scene-model-translation.d.ts.map +1 -0
- package/dist/scene-model-translation.js +100 -0
- package/dist/scene-model-translation.js.map +1 -0
- package/dist/scene-stream-split.d.ts +4 -0
- package/dist/scene-stream-split.d.ts.map +1 -0
- package/dist/scene-stream-split.js +54 -0
- package/dist/scene-stream-split.js.map +1 -0
- package/dist/scene.d.ts +105 -85
- package/dist/scene.d.ts.map +1 -1
- package/dist/scene.js +447 -583
- package/dist/scene.js.map +1 -1
- package/dist/shadow-occluders.d.ts.map +1 -1
- package/dist/shadow-occluders.js +13 -9
- package/dist/shadow-occluders.js.map +1 -1
- package/dist/snap-detector.d.ts +1 -1
- package/dist/snap-detector.d.ts.map +1 -1
- package/dist/snap-detector.js +5 -2
- package/dist/snap-detector.js.map +1 -1
- package/dist/textured-vertices.d.ts +9 -0
- package/dist/textured-vertices.d.ts.map +1 -0
- package/dist/textured-vertices.js +40 -0
- package/dist/textured-vertices.js.map +1 -0
- package/dist/types.d.ts +11 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/xray-alpha.d.ts +131 -0
- package/dist/xray-alpha.d.ts.map +1 -0
- package/dist/xray-alpha.js +266 -0
- package/dist/xray-alpha.js.map +1 -0
- package/package.json +3 -3
package/dist/raycaster.js
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { appearanceSourceTriangle } from './appearance-uvs.js';
|
|
5
|
+
import { reportableItemId } from './pick-resolve.js';
|
|
1
6
|
export class Raycaster {
|
|
2
7
|
epsilon = 0.0000001;
|
|
3
8
|
/**
|
|
4
9
|
* Cast a ray through all meshes and return the closest intersection
|
|
5
10
|
*/
|
|
6
|
-
raycast(ray, meshes) {
|
|
11
|
+
raycast(ray, meshes, accept) {
|
|
7
12
|
let closestIntersection = null;
|
|
8
13
|
let closestDistance = Infinity;
|
|
9
14
|
for (let meshIndex = 0; meshIndex < meshes.length; meshIndex++) {
|
|
10
15
|
const mesh = meshes[meshIndex];
|
|
11
|
-
const intersection = this.raycastMesh(ray, mesh, meshIndex);
|
|
16
|
+
const intersection = this.raycastMesh(ray, mesh, meshIndex, accept);
|
|
12
17
|
if (intersection && intersection.distance < closestDistance) {
|
|
13
18
|
closestDistance = intersection.distance;
|
|
14
19
|
closestIntersection = intersection;
|
|
@@ -19,7 +24,7 @@ export class Raycaster {
|
|
|
19
24
|
/**
|
|
20
25
|
* Cast ray through a single mesh
|
|
21
26
|
*/
|
|
22
|
-
raycastMesh(ray, mesh, meshIndex) {
|
|
27
|
+
raycastMesh(ray, mesh, meshIndex, accept) {
|
|
23
28
|
const positions = mesh.positions;
|
|
24
29
|
const indices = mesh.indices;
|
|
25
30
|
// Validate input
|
|
@@ -81,7 +86,6 @@ export class Raycaster {
|
|
|
81
86
|
}
|
|
82
87
|
const intersection = this.intersectTriangle(localRay, v0, v1, v2);
|
|
83
88
|
if (intersection && intersection.distance < closestDistance) {
|
|
84
|
-
closestDistance = intersection.distance;
|
|
85
89
|
// Calculate normal from triangle
|
|
86
90
|
const normal = this.calculateTriangleNormal(v0, v1, v2);
|
|
87
91
|
// intersection.point is in the local frame (computed from localRay);
|
|
@@ -89,15 +93,26 @@ export class Raycaster {
|
|
|
89
93
|
const worldPoint = o
|
|
90
94
|
? { x: intersection.point.x + o[0], y: intersection.point.y + o[1], z: intersection.point.z + o[2] }
|
|
91
95
|
: intersection.point;
|
|
92
|
-
|
|
96
|
+
const geometryItemId = reportableItemId(mesh, mesh.expressId);
|
|
97
|
+
// A canonical ordinal is only actionable together with the exact IFC
|
|
98
|
+
// representation item whose evaluated surface owns it.
|
|
99
|
+
const sourceTriangleIndex = geometryItemId === undefined ? undefined : appearanceSourceTriangle(mesh, i / 3);
|
|
100
|
+
const exact = {
|
|
93
101
|
point: worldPoint,
|
|
94
102
|
normal,
|
|
95
103
|
distance: intersection.distance,
|
|
96
104
|
meshIndex,
|
|
97
105
|
triangleIndex: i / 3,
|
|
98
106
|
expressId: mesh.expressId,
|
|
107
|
+
modelIndex: mesh.modelIndex ?? 0,
|
|
108
|
+
...(geometryItemId === undefined ? {} : { geometryItemId }),
|
|
109
|
+
...(sourceTriangleIndex === undefined ? {} : { sourceTriangleIndex }),
|
|
99
110
|
barycentricCoord: intersection.barycentricCoord,
|
|
100
111
|
};
|
|
112
|
+
if (!accept || accept(exact, mesh)) {
|
|
113
|
+
closestDistance = intersection.distance;
|
|
114
|
+
closestIntersection = exact;
|
|
115
|
+
}
|
|
101
116
|
}
|
|
102
117
|
}
|
|
103
118
|
return closestIntersection;
|
package/dist/raycaster.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raycaster.js","sourceRoot":"","sources":["../src/raycaster.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"raycaster.js","sourceRoot":"","sources":["../src/raycaster.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Ray } from './raycaster.js';
|
|
2
|
+
import type { ReferenceCorners, ReferenceImageHit } from './reference-image-types.js';
|
|
3
|
+
/** Quad interaction only; does not generate, transform or classify IFC geometry. */
|
|
4
|
+
export declare function referenceImageHit(id: string, corners: ReferenceCorners, ray: Ray, maxDistance: number): ReferenceImageHit | null;
|
|
5
|
+
//# sourceMappingURL=reference-image-hit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-image-hit.d.ts","sourceRoot":"","sources":["../src/reference-image-hit.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAkB,MAAM,4BAA4B,CAAC;AAMtG,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAkBhI"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const subtract = (a, b) => [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
|
|
2
|
+
const cross = (a, b) => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
|
|
3
|
+
const dot = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
|
4
|
+
/** Quad interaction only; does not generate, transform or classify IFC geometry. */
|
|
5
|
+
export function referenceImageHit(id, corners, ray, maxDistance) {
|
|
6
|
+
const origin = [ray.origin.x, ray.origin.y, ray.origin.z];
|
|
7
|
+
const direction = [ray.direction.x, ray.direction.y, ray.direction.z];
|
|
8
|
+
let closest = null;
|
|
9
|
+
for (const indices of [[0, 1, 2], [0, 2, 3]]) {
|
|
10
|
+
const a = corners[indices[0]], edge1 = subtract(corners[indices[1]], a), edge2 = subtract(corners[indices[2]], a);
|
|
11
|
+
const p = cross(direction, edge2), determinant = dot(edge1, p);
|
|
12
|
+
if (!Number.isFinite(determinant) || Math.abs(determinant) <= Number.EPSILON * Math.hypot(...edge1) * Math.hypot(...edge2))
|
|
13
|
+
continue;
|
|
14
|
+
const t = subtract(origin, a), u = dot(t, p) / determinant;
|
|
15
|
+
if (u < 0 || u > 1)
|
|
16
|
+
continue;
|
|
17
|
+
const q = cross(t, edge1), v = dot(direction, q) / determinant;
|
|
18
|
+
if (v < 0 || u + v > 1)
|
|
19
|
+
continue;
|
|
20
|
+
const distance = dot(edge2, q) / determinant;
|
|
21
|
+
if (!Number.isFinite(distance) || distance < 0 || distance >= maxDistance)
|
|
22
|
+
continue;
|
|
23
|
+
maxDistance = distance;
|
|
24
|
+
closest = { referenceId: id, distance, point: [origin[0] + direction[0] * distance, origin[1] + direction[1] * distance, origin[2] + direction[2] * distance] };
|
|
25
|
+
}
|
|
26
|
+
return closest;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=reference-image-hit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-image-hit.js","sourceRoot":"","sources":["../src/reference-image-hit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Renderer } from './index.js';
|
|
2
|
+
import { ReferenceImageManager } from './reference-images.js';
|
|
3
|
+
/** Reuse the renderer camera and scene raycast, including occurrence placement. */
|
|
4
|
+
export declare function createReferenceImageManager(renderer: Renderer): ReferenceImageManager;
|
|
5
|
+
//# sourceMappingURL=reference-image-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-image-host.d.ts","sourceRoot":"","sources":["../src/reference-image-host.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,mFAAmF;AACnF,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,GAAG,qBAAqB,CAkBrF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ReferenceImageManager } from './reference-images.js';
|
|
2
|
+
/** Reuse the renderer camera and scene raycast, including occurrence placement. */
|
|
3
|
+
export function createReferenceImageManager(renderer) {
|
|
4
|
+
return new ReferenceImageManager({
|
|
5
|
+
requestRender: () => renderer.requestRender(),
|
|
6
|
+
ray: (x, y) => {
|
|
7
|
+
if (renderer.isDeviceLost())
|
|
8
|
+
return null;
|
|
9
|
+
const canvas = renderer.getCanvas(), rect = canvas.getBoundingClientRect();
|
|
10
|
+
if (rect.width <= 0 || rect.height <= 0 || x < 0 || y < 0 || x > rect.width || y > rect.height)
|
|
11
|
+
return null;
|
|
12
|
+
return renderer.getCamera().unprojectToRay(x * canvas.width / rect.width, y * canvas.height / rect.height, canvas.width, canvas.height);
|
|
13
|
+
},
|
|
14
|
+
sceneDistance: async (x, y, ray, options) => {
|
|
15
|
+
const picked = await renderer.pick(x, y, options);
|
|
16
|
+
if (!picked)
|
|
17
|
+
return Infinity;
|
|
18
|
+
if (picked.worldXYZ)
|
|
19
|
+
return Math.hypot(picked.worldXYZ.x - ray.origin.x, picked.worldXYZ.y - ray.origin.y, picked.worldXYZ.z - ray.origin.z);
|
|
20
|
+
// Existing large-model CPU fallback can omit depth. Restrict its precise
|
|
21
|
+
// raycast to the canonical selected owner, never hidden unrelated geometry.
|
|
22
|
+
return renderer.raycastScene(x, y, { ...options, isolatedIds: new Set([picked.expressId]) })?.intersection.distance ?? 0;
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=reference-image-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-image-host.js","sourceRoot":"","sources":["../src/reference-image-host.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,mFAAmF;AACnF,MAAM,UAAU,2BAA2B,CAAC,QAAkB;IAC5D,OAAO,IAAI,qBAAqB,CAAC;QAC/B,aAAa,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE;QAC7C,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACZ,IAAI,QAAQ,CAAC,YAAY,EAAE;gBAAE,OAAO,IAAI,CAAC;YACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;YAC3E,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YAC5G,OAAO,QAAQ,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1I,CAAC;QACD,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;YAClD,IAAI,CAAC,MAAM;gBAAE,OAAO,QAAQ,CAAC;YAC7B,IAAI,MAAM,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvI,yEAAyE;YACzE,4EAA4E;YAC5E,OAAO,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,QAAQ,IAAI,CAAC,CAAC;QAC3H,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ReferenceImageInput } from './reference-image-types.js';
|
|
2
|
+
export interface ReferenceGpuImage {
|
|
3
|
+
input: ReferenceImageInput;
|
|
4
|
+
draw(pass: GPURenderPassEncoder, viewProj: Float32Array): void;
|
|
5
|
+
destroy(): void;
|
|
6
|
+
}
|
|
7
|
+
/** Owns only uploaded pixels and quad buffers; source bitmaps belong to the inventory. */
|
|
8
|
+
export declare class ReferenceImagePipeline {
|
|
9
|
+
private device;
|
|
10
|
+
private pipeline;
|
|
11
|
+
private sampler;
|
|
12
|
+
constructor(device: GPUDevice, format: GPUTextureFormat, sampleCount: number);
|
|
13
|
+
upload(input: ReferenceImageInput): ReferenceGpuImage;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=reference-image-pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-image-pipeline.d.ts","sourceRoot":"","sources":["../src/reference-image-pipeline.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAoBtE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC/D,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,0FAA0F;AAC1F,qBAAa,sBAAsB;IAGrB,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,OAAO,CAAa;gBACR,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM;IAiBpF,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,iBAAiB;CA+CtD"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { PIPELINE_CONSTANTS } from './constants.js';
|
|
5
|
+
const SHADER = `
|
|
6
|
+
struct Uniforms { viewProj: mat4x4<f32>, clipOrigin: vec4<f32>, settings: vec4<f32> }
|
|
7
|
+
@group(0) @binding(0) var<uniform> u: Uniforms;
|
|
8
|
+
@group(0) @binding(1) var raster: texture_2d<f32>;
|
|
9
|
+
@group(0) @binding(2) var rasterSampler: sampler;
|
|
10
|
+
struct Vertex { @builtin(position) position: vec4<f32>, @location(0) uv: vec2<f32> }
|
|
11
|
+
@vertex fn vs(@location(0) position: vec3<f32>, @location(1) uv: vec2<f32>) -> Vertex {
|
|
12
|
+
var out: Vertex;
|
|
13
|
+
out.position = u.viewProj * vec4<f32>(position, 0.0) + u.clipOrigin;
|
|
14
|
+
out.uv = uv; return out;
|
|
15
|
+
}
|
|
16
|
+
@fragment fn fs(v: Vertex) -> @location(0) vec4<f32> {
|
|
17
|
+
let pixel = textureSample(raster, rasterSampler, v.uv);
|
|
18
|
+
let alpha = pixel.a * u.settings.x;
|
|
19
|
+
if (alpha < 0.001) { discard; }
|
|
20
|
+
return vec4<f32>(pixel.rgb * alpha, alpha);
|
|
21
|
+
}`;
|
|
22
|
+
/** Owns only uploaded pixels and quad buffers; source bitmaps belong to the inventory. */
|
|
23
|
+
export class ReferenceImagePipeline {
|
|
24
|
+
device;
|
|
25
|
+
pipeline;
|
|
26
|
+
sampler;
|
|
27
|
+
constructor(device, format, sampleCount) {
|
|
28
|
+
this.device = device;
|
|
29
|
+
const module = device.createShaderModule({ label: 'reference-image', code: SHADER });
|
|
30
|
+
this.pipeline = device.createRenderPipeline({ label: 'reference-image', layout: 'auto',
|
|
31
|
+
vertex: { module, entryPoint: 'vs', buffers: [{ arrayStride: 20, attributes: [
|
|
32
|
+
{ shaderLocation: 0, offset: 0, format: 'float32x3' }, { shaderLocation: 1, offset: 12, format: 'float32x2' },
|
|
33
|
+
] }] },
|
|
34
|
+
fragment: { module, entryPoint: 'fs', targets: [{ format, blend: {
|
|
35
|
+
color: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },
|
|
36
|
+
alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },
|
|
37
|
+
} }, { format: 'rgba8unorm', writeMask: 0 }] },
|
|
38
|
+
primitive: { topology: 'triangle-list', cullMode: 'none' },
|
|
39
|
+
depthStencil: { format: PIPELINE_CONSTANTS.DEPTH_FORMAT, depthWriteEnabled: false, depthCompare: 'greater-equal' },
|
|
40
|
+
multisample: { count: sampleCount },
|
|
41
|
+
});
|
|
42
|
+
this.sampler = device.createSampler({ minFilter: 'linear', magFilter: 'linear', addressModeU: 'clamp-to-edge', addressModeV: 'clamp-to-edge' });
|
|
43
|
+
}
|
|
44
|
+
upload(input) {
|
|
45
|
+
const { device } = this;
|
|
46
|
+
if (!input.id || !Number.isFinite(input.opacity) || input.opacity < 0 || input.opacity > 1 ||
|
|
47
|
+
input.corners.length !== 4 || input.corners.some(p => p.length !== 3 || p.some(n => !Number.isFinite(n)))) {
|
|
48
|
+
throw new Error('Reference image requires a stable ID, four finite corners and opacity between zero and one.');
|
|
49
|
+
}
|
|
50
|
+
if (input.bitmap.width < 1 || input.bitmap.height < 1 || Math.max(input.bitmap.width, input.bitmap.height) > device.limits.maxTextureDimension2D) {
|
|
51
|
+
throw new Error('Reference image exceeds this GPU’s image dimensions. Choose a lower raster resolution.');
|
|
52
|
+
}
|
|
53
|
+
const origin = input.corners[0];
|
|
54
|
+
const uv = [[0, 0], [1, 0], [1, 1], [0, 1]];
|
|
55
|
+
const vertices = new Float32Array([0, 1, 2, 0, 2, 3].flatMap(i => [
|
|
56
|
+
input.corners[i][0] - origin[0], input.corners[i][1] - origin[1], input.corners[i][2] - origin[2], ...uv[i],
|
|
57
|
+
]));
|
|
58
|
+
if (vertices.some(n => !Number.isFinite(n)))
|
|
59
|
+
throw new Error('Reference dimensions exceed the renderable coordinate range.');
|
|
60
|
+
const resources = [];
|
|
61
|
+
try {
|
|
62
|
+
const texture = device.createTexture({ label: 'reference-image', size: [input.bitmap.width, input.bitmap.height], format: 'rgba8unorm',
|
|
63
|
+
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT });
|
|
64
|
+
resources.push(texture);
|
|
65
|
+
device.queue.copyExternalImageToTexture({ source: input.bitmap }, { texture }, [input.bitmap.width, input.bitmap.height]);
|
|
66
|
+
const buffer = device.createBuffer({ size: vertices.byteLength, usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST });
|
|
67
|
+
resources.push(buffer);
|
|
68
|
+
device.queue.writeBuffer(buffer, 0, vertices);
|
|
69
|
+
const uniform = device.createBuffer({ size: 96, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });
|
|
70
|
+
resources.push(uniform);
|
|
71
|
+
const bind = device.createBindGroup({ layout: this.pipeline.getBindGroupLayout(0), entries: [
|
|
72
|
+
{ binding: 0, resource: { buffer: uniform } }, { binding: 1, resource: texture.createView() }, { binding: 2, resource: this.sampler },
|
|
73
|
+
] });
|
|
74
|
+
const data = new Float32Array(24);
|
|
75
|
+
let destroyed = false;
|
|
76
|
+
return { input,
|
|
77
|
+
draw: (pass, viewProj) => {
|
|
78
|
+
if (destroyed || !input.visible || input.opacity === 0)
|
|
79
|
+
return;
|
|
80
|
+
data.set(viewProj, 0);
|
|
81
|
+
for (let row = 0; row < 4; row++)
|
|
82
|
+
data[16 + row] = viewProj[row] * origin[0] + viewProj[4 + row] * origin[1] + viewProj[8 + row] * origin[2] + viewProj[12 + row];
|
|
83
|
+
data[20] = input.opacity;
|
|
84
|
+
device.queue.writeBuffer(uniform, 0, data);
|
|
85
|
+
pass.setPipeline(this.pipeline);
|
|
86
|
+
pass.setBindGroup(0, bind);
|
|
87
|
+
pass.setVertexBuffer(0, buffer);
|
|
88
|
+
pass.draw(6);
|
|
89
|
+
},
|
|
90
|
+
destroy: () => { if (!destroyed) {
|
|
91
|
+
destroyed = true;
|
|
92
|
+
for (const resource of resources)
|
|
93
|
+
resource.destroy();
|
|
94
|
+
} },
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
for (const resource of resources)
|
|
99
|
+
resource.destroy();
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=reference-image-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-image-pipeline.js","sourceRoot":"","sources":["../src/reference-image-pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { PickOptions } from './types.js';
|
|
2
|
+
export type ReferencePoint = readonly [number, number, number];
|
|
3
|
+
/** Renderer Y-up coordinates, ordered top-left, top-right, bottom-right, bottom-left. */
|
|
4
|
+
export type ReferenceCorners = readonly [ReferencePoint, ReferencePoint, ReferencePoint, ReferencePoint];
|
|
5
|
+
export interface ReferenceImageInput {
|
|
6
|
+
/** Separate namespace: never an IFC Express ID or federation global ID. */
|
|
7
|
+
id: string;
|
|
8
|
+
bitmap: ImageBitmap;
|
|
9
|
+
corners: ReferenceCorners;
|
|
10
|
+
visible: boolean;
|
|
11
|
+
locked: boolean;
|
|
12
|
+
opacity: number;
|
|
13
|
+
}
|
|
14
|
+
export interface ReferenceImageHit {
|
|
15
|
+
referenceId: string;
|
|
16
|
+
point: ReferencePoint;
|
|
17
|
+
distance: number;
|
|
18
|
+
}
|
|
19
|
+
export interface ReferenceImages {
|
|
20
|
+
/** Borrows the bitmap for upload; the caller retains ownership of the source. */
|
|
21
|
+
set(input: ReferenceImageInput, signal?: AbortSignal): Promise<void>;
|
|
22
|
+
remove(id: string): void;
|
|
23
|
+
clear(): void;
|
|
24
|
+
/** CSS canvas coordinates; hidden, locked and scene-occluded references do not hit. */
|
|
25
|
+
pick(x: number, y: number, options?: PickOptions): Promise<ReferenceImageHit | null>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=reference-image-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-image-types.d.ts","sourceRoot":"","sources":["../src/reference-image-types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC/D,yFAAyF;AACzF,MAAM,MAAM,gBAAgB,GAAG,SAAS,CAAC,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;AACzG,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,cAAc,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,MAAM,WAAW,eAAe;IAC9B,iFAAiF;IACjF,GAAG,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,IAAI,IAAI,CAAC;IACd,uFAAuF;IACvF,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;CACtF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=reference-image-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-image-types.js","sourceRoot":"","sources":["../src/reference-image-types.ts"],"names":[],"mappings":"AAAA;;+DAE+D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Ray } from './raycaster.js';
|
|
2
|
+
import type { PickOptions } from './types.js';
|
|
3
|
+
import type { ReferenceImages, ReferenceImageInput, ReferenceImageHit } from './reference-image-types.js';
|
|
4
|
+
export interface ReferenceImageHost {
|
|
5
|
+
requestRender(): void;
|
|
6
|
+
ray(x: number, y: number): Ray | null;
|
|
7
|
+
sceneDistance(x: number, y: number, ray: Ray, options?: PickOptions): Promise<number>;
|
|
8
|
+
}
|
|
9
|
+
/** String-identity resources separate from all IFC geometry and selection buckets. */
|
|
10
|
+
export declare class ReferenceImageManager implements ReferenceImages {
|
|
11
|
+
private host;
|
|
12
|
+
private images;
|
|
13
|
+
private jobs;
|
|
14
|
+
private pipeline;
|
|
15
|
+
private device;
|
|
16
|
+
private format;
|
|
17
|
+
private sampleCount;
|
|
18
|
+
constructor(host: ReferenceImageHost);
|
|
19
|
+
init(device: GPUDevice, format: GPUTextureFormat, sampleCount: number): void;
|
|
20
|
+
set(input: ReferenceImageInput, signal?: AbortSignal): Promise<void>;
|
|
21
|
+
remove(id: string): void;
|
|
22
|
+
clear(): void;
|
|
23
|
+
destroy(): void;
|
|
24
|
+
draw(pass: GPURenderPassEncoder, viewProj: Float32Array): void;
|
|
25
|
+
pick(x: number, y: number, options?: PickOptions): Promise<ReferenceImageHit | null>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=reference-images.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-images.d.ts","sourceRoot":"","sources":["../src/reference-images.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAI1G,MAAM,WAAW,kBAAkB;IACjC,aAAa,IAAI,IAAI,CAAC;IACtB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACvF;AAED,sFAAsF;AACtF,qBAAa,qBAAsB,YAAW,eAAe;IAO/C,OAAO,CAAC,IAAI;IANxB,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,WAAW,CAAK;gBACJ,IAAI,EAAE,kBAAkB;IAE5C,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAMtE,GAAG,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA+C1E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMxB,KAAK,IAAI,IAAI;IAMb,OAAO,IAAI,IAAI;IACf,IAAI,CAAC,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAYxD,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;CAiB3F"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { ReferenceImagePipeline } from './reference-image-pipeline.js';
|
|
2
|
+
import { referenceImageHit } from './reference-image-hit.js';
|
|
3
|
+
/** String-identity resources separate from all IFC geometry and selection buckets. */
|
|
4
|
+
export class ReferenceImageManager {
|
|
5
|
+
host;
|
|
6
|
+
images = new Map();
|
|
7
|
+
jobs = new Map();
|
|
8
|
+
pipeline = null;
|
|
9
|
+
device = null;
|
|
10
|
+
format = 'bgra8unorm';
|
|
11
|
+
sampleCount = 1;
|
|
12
|
+
constructor(host) {
|
|
13
|
+
this.host = host;
|
|
14
|
+
}
|
|
15
|
+
init(device, format, sampleCount) {
|
|
16
|
+
this.destroy();
|
|
17
|
+
this.device = device;
|
|
18
|
+
this.format = format;
|
|
19
|
+
this.sampleCount = sampleCount;
|
|
20
|
+
}
|
|
21
|
+
async set(input, signal) {
|
|
22
|
+
const device = this.device;
|
|
23
|
+
if (!device)
|
|
24
|
+
throw new Error('The renderer is not ready for reference images.');
|
|
25
|
+
if (signal?.aborted)
|
|
26
|
+
return;
|
|
27
|
+
const current = this.images.get(input.id)?.input;
|
|
28
|
+
if (current?.bitmap === input.bitmap && current.visible === input.visible && current.locked === input.locked && current.opacity === input.opacity &&
|
|
29
|
+
current.corners.every((point, i) => point.every((n, axis) => n === input.corners[i][axis]))) {
|
|
30
|
+
// Also invalidate an older in-flight replacement of this unchanged image.
|
|
31
|
+
this.jobs.delete(input.id);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// Snapshot caller geometry: changing a draft must never mutate an in-flight upload.
|
|
35
|
+
const captured = { ...input, corners: [
|
|
36
|
+
[...input.corners[0]], [...input.corners[1]], [...input.corners[2]], [...input.corners[3]],
|
|
37
|
+
] };
|
|
38
|
+
const job = Symbol(input.id);
|
|
39
|
+
this.jobs.set(input.id, job);
|
|
40
|
+
device.pushErrorScope('out-of-memory');
|
|
41
|
+
device.pushErrorScope('validation');
|
|
42
|
+
let candidate;
|
|
43
|
+
let failure;
|
|
44
|
+
try {
|
|
45
|
+
// Ordinary IFC viewing creates no reference shader/pipeline or texture.
|
|
46
|
+
this.pipeline ??= new ReferenceImagePipeline(device, this.format, this.sampleCount);
|
|
47
|
+
candidate = this.pipeline.upload(captured);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
failure = error;
|
|
51
|
+
}
|
|
52
|
+
// Pop both scopes before awaiting: concurrent set calls must never consume
|
|
53
|
+
// one another's device-global scope stack.
|
|
54
|
+
const validationResult = device.popErrorScope(), memoryResult = device.popErrorScope();
|
|
55
|
+
try {
|
|
56
|
+
const [validation, memory] = await Promise.all([validationResult, memoryResult]);
|
|
57
|
+
if (validation || memory)
|
|
58
|
+
failure ??= new Error(`Reference image upload failed: ${(validation ?? memory).message}`);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
failure ??= error;
|
|
62
|
+
}
|
|
63
|
+
if (failure || signal?.aborted || this.jobs.get(input.id) !== job || this.device !== device) {
|
|
64
|
+
candidate?.destroy();
|
|
65
|
+
if (failure && this.device === device)
|
|
66
|
+
this.pipeline = null;
|
|
67
|
+
if (this.jobs.get(input.id) === job)
|
|
68
|
+
this.jobs.delete(input.id);
|
|
69
|
+
if (failure)
|
|
70
|
+
throw failure;
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
this.jobs.delete(input.id);
|
|
74
|
+
if (!candidate)
|
|
75
|
+
throw new Error('Reference image upload produced no resource.');
|
|
76
|
+
this.images.get(input.id)?.destroy();
|
|
77
|
+
this.images.set(input.id, candidate);
|
|
78
|
+
this.host.requestRender();
|
|
79
|
+
}
|
|
80
|
+
remove(id) {
|
|
81
|
+
this.jobs.delete(id);
|
|
82
|
+
this.images.get(id)?.destroy();
|
|
83
|
+
this.images.delete(id);
|
|
84
|
+
this.host.requestRender();
|
|
85
|
+
}
|
|
86
|
+
clear() {
|
|
87
|
+
this.jobs.clear();
|
|
88
|
+
for (const image of this.images.values())
|
|
89
|
+
image.destroy();
|
|
90
|
+
this.images.clear();
|
|
91
|
+
this.host.requestRender();
|
|
92
|
+
}
|
|
93
|
+
destroy() { this.clear(); this.pipeline = null; this.device = null; }
|
|
94
|
+
draw(pass, viewProj) {
|
|
95
|
+
if (!this.images.size)
|
|
96
|
+
return;
|
|
97
|
+
const depth = (image) => {
|
|
98
|
+
const c = image.input.corners;
|
|
99
|
+
const x = (c[0][0] + c[2][0]) / 2, y = (c[0][1] + c[2][1]) / 2, z = (c[0][2] + c[2][2]) / 2;
|
|
100
|
+
return (viewProj[2] * x + viewProj[6] * y + viewProj[10] * z + viewProj[14]) /
|
|
101
|
+
(viewProj[3] * x + viewProj[7] * y + viewProj[11] * z + viewProj[15]);
|
|
102
|
+
};
|
|
103
|
+
// Reverse-Z, far to near for translucent references; BIM depth still tests
|
|
104
|
+
// each fragment. Intersecting transparent planes have ordinary alpha-sort limits.
|
|
105
|
+
for (const image of [...this.images.values()].sort((a, b) => depth(a) - depth(b)))
|
|
106
|
+
image.draw(pass, viewProj);
|
|
107
|
+
}
|
|
108
|
+
async pick(x, y, options) {
|
|
109
|
+
if (!this.images.size)
|
|
110
|
+
return null;
|
|
111
|
+
const ray = this.host.ray(x, y);
|
|
112
|
+
if (!ray)
|
|
113
|
+
return null;
|
|
114
|
+
const snapshot = new Map([...this.images].filter(([, image]) => image.input.visible && !image.input.locked && image.input.opacity > 0 &&
|
|
115
|
+
referenceImageHit(image.input.id, image.input.corners, ray, Infinity) !== null));
|
|
116
|
+
if (!snapshot.size)
|
|
117
|
+
return null;
|
|
118
|
+
let distance = await this.host.sceneDistance(x, y, ray, options), nearest = null;
|
|
119
|
+
for (const image of snapshot.values()) {
|
|
120
|
+
const { input } = image;
|
|
121
|
+
if (this.images.get(input.id) !== image)
|
|
122
|
+
continue;
|
|
123
|
+
if (!input.visible || input.locked || input.opacity === 0)
|
|
124
|
+
continue;
|
|
125
|
+
const hit = referenceImageHit(input.id, input.corners, ray, distance);
|
|
126
|
+
if (hit) {
|
|
127
|
+
nearest = hit;
|
|
128
|
+
distance = hit.distance;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return nearest;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=reference-images.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-images.js","sourceRoot":"","sources":["../src/reference-images.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer-viewport.d.ts","sourceRoot":"","sources":["../src/renderer-viewport.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,IAAI,CAoBN"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function resizeRendererViewport(canvas, camera, width, height) {
|
|
2
|
+
// `canvas.width` is an IDL `unsigned long`, so it silently coerces a
|
|
3
|
+
// non-finite or negative argument to **0** — a zero drawing buffer
|
|
4
|
+
// that every pick guard in this package misses, because they all
|
|
5
|
+
// check the bounding rect rather than the buffer. `unprojectToRay`
|
|
6
|
+
// then divides by it. This is documented public API of a published
|
|
7
|
+
// package (`docs/api/typescript.md`), so an external caller wiring a
|
|
8
|
+
// ResizeObserver to it is the reachable route; both in-repo callers
|
|
9
|
+
// already floor their own values. Keep the last usable size, the same
|
|
10
|
+
// policy `setAspect` uses for the ratio it derives (#2473).
|
|
11
|
+
if (!Number.isFinite(width) ||
|
|
12
|
+
!Number.isFinite(height) ||
|
|
13
|
+
width <= 0 ||
|
|
14
|
+
height <= 0)
|
|
15
|
+
return;
|
|
16
|
+
canvas.width = width;
|
|
17
|
+
canvas.height = height;
|
|
18
|
+
camera.setAspect(width / height);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=renderer-viewport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer-viewport.js","sourceRoot":"","sources":["../src/renderer-viewport.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,sBAAsB,CACpC,MAAyB,EACzB,MAAc,EACd,KAAa,EACb,MAAc;IAEd,qEAAqE;IACrE,mEAAmE;IACnE,iEAAiE;IACjE,mEAAmE;IACnE,mEAAmE;IACnE,qEAAqE;IACrE,oEAAoE;IACpE,sEAAsE;IACtE,4DAA4D;IAC5D,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvB,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QACxB,KAAK,IAAI,CAAC;QACV,MAAM,IAAI,CAAC;QAEX,OAAO;IACT,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MeshTexture } from '@ifc-lite/geometry';
|
|
2
|
+
/** Room recipients share decoded pixel arrays across surfaces (#4228, #4232).
|
|
3
|
+
* Keep that sharing on the GPU too; sampler settings belong to each draw. */
|
|
4
|
+
export declare class RgbaTexturePool {
|
|
5
|
+
private entries;
|
|
6
|
+
private owners;
|
|
7
|
+
acquire(source: MeshTexture, device: GPUDevice): GPUTexture;
|
|
8
|
+
/** Return false only for textures owned by another allocation path. */
|
|
9
|
+
release(texture: GPUTexture): boolean;
|
|
10
|
+
clear(): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=rgba-texture-pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rgba-texture-pool.d.ts","sourceRoot":"","sources":["../src/rgba-texture-pool.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD;6EAC6E;AAC7E,qBAAa,eAAe;IAE1B,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,MAAM,CAA8D;IAE5E,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,GAAG,UAAU;IAyB3D,uEAAuE;IACvE,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO;IAYrC,KAAK,IAAI,IAAI;CAKd"}
|