@ifc-lite/renderer 2.0.1 → 2.2.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 +10 -0
- 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-preview.d.ts +93 -0
- package/dist/appearance-preview.d.ts.map +1 -0
- package/dist/appearance-preview.js +246 -0
- package/dist/appearance-preview.js.map +1 -0
- package/dist/appearance-uvs.d.ts +10 -0
- package/dist/appearance-uvs.d.ts.map +1 -0
- package/dist/appearance-uvs.js +112 -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 +184 -232
- 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 +9 -11
- package/dist/raycast-engine.d.ts.map +1 -1
- package/dist/raycast-engine.js +6 -11
- package/dist/raycast-engine.js.map +1 -1
- package/dist/raycaster.d.ts.map +1 -1
- package/dist/raycaster.js +3 -0
- 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 +17 -0
- package/dist/scene-instance-materialization.d.ts.map +1 -0
- package/dist/scene-instance-materialization.js +52 -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 +55 -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 +445 -581
- 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.map +1 -1
- package/dist/snap-detector.js +3 -0
- 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
|
@@ -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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** Room recipients share decoded pixel arrays across surfaces (#4228, #4232).
|
|
2
|
+
* Keep that sharing on the GPU too; sampler settings belong to each draw. */
|
|
3
|
+
export class RgbaTexturePool {
|
|
4
|
+
// GPU ownership must not keep released CPU pixel arrays alive.
|
|
5
|
+
entries = new WeakMap();
|
|
6
|
+
owners = new Map();
|
|
7
|
+
acquire(source, device) {
|
|
8
|
+
const { rgba, width, height } = source;
|
|
9
|
+
const entries = this.entries.get(rgba) ?? [];
|
|
10
|
+
let entry = entries.find(value => value.width === width && value.height === height);
|
|
11
|
+
if (!entry) {
|
|
12
|
+
const texture = device.createTexture({
|
|
13
|
+
size: { width, height }, format: 'rgba8unorm',
|
|
14
|
+
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,
|
|
15
|
+
});
|
|
16
|
+
try {
|
|
17
|
+
device.queue.writeTexture({ texture }, rgba, { bytesPerRow: width * 4, rowsPerImage: height }, { width, height });
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
texture.destroy();
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
entry = { texture, width, height, refs: 0 };
|
|
24
|
+
entries.push(entry);
|
|
25
|
+
this.entries.set(rgba, entries);
|
|
26
|
+
this.owners.set(texture, { siblings: entries, entry });
|
|
27
|
+
}
|
|
28
|
+
entry.refs++;
|
|
29
|
+
return entry.texture;
|
|
30
|
+
}
|
|
31
|
+
/** Return false only for textures owned by another allocation path. */
|
|
32
|
+
release(texture) {
|
|
33
|
+
const owner = this.owners.get(texture);
|
|
34
|
+
if (!owner)
|
|
35
|
+
return false;
|
|
36
|
+
if (--owner.entry.refs === 0) {
|
|
37
|
+
const siblings = owner.siblings;
|
|
38
|
+
siblings.splice(siblings.indexOf(owner.entry), 1);
|
|
39
|
+
this.owners.delete(texture);
|
|
40
|
+
texture.destroy();
|
|
41
|
+
}
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
clear() {
|
|
45
|
+
for (const texture of this.owners.keys())
|
|
46
|
+
texture.destroy();
|
|
47
|
+
this.owners.clear();
|
|
48
|
+
this.entries = new WeakMap();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=rgba-texture-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rgba-texture-pool.js","sourceRoot":"","sources":["../src/rgba-texture-pool.ts"],"names":[],"mappings":"AAOA;6EAC6E;AAC7E,MAAM,OAAO,eAAe;IAC1B,+DAA+D;IACvD,OAAO,GAAG,IAAI,OAAO,EAAuB,CAAC;IAC7C,MAAM,GAAG,IAAI,GAAG,EAAmD,CAAC;IAE5E,OAAO,CAAC,MAAmB,EAAE,MAAiB;QAC5C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7C,IAAI,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACpF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC;gBACnC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,YAAY;gBAC7C,KAAK,EAAE,eAAe,CAAC,eAAe,GAAG,eAAe,CAAC,QAAQ;aAClE,CAAC,CAAC;YACH,IAAI,CAAC;gBACH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EACzC,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACzE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,KAAK,CAAC;YACd,CAAC;YACD,KAAK,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,uEAAuE;IACvE,OAAO,CAAC,OAAmB;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YAChC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { AppearanceOwner } from './appearance-preview.js';
|
|
2
|
+
import type { MeshData } from '@ifc-lite/geometry';
|
|
3
|
+
import type { BatchedMesh } from './types.js';
|
|
4
|
+
export interface AppearanceBucket {
|
|
5
|
+
key: string;
|
|
6
|
+
meshData: MeshData[];
|
|
7
|
+
batchedMesh: BatchedMesh | null;
|
|
8
|
+
vertexBytes: number;
|
|
9
|
+
}
|
|
10
|
+
export interface AppearanceBucketAccess {
|
|
11
|
+
buckets: Map<string, AppearanceBucket>;
|
|
12
|
+
reverse(): Map<MeshData, AppearanceBucket>;
|
|
13
|
+
create(parts: MeshData[], key: string): BatchedMesh;
|
|
14
|
+
release(batch: BatchedMesh): void;
|
|
15
|
+
changed(key: string): void;
|
|
16
|
+
refresh(): void;
|
|
17
|
+
}
|
|
18
|
+
export interface FlatAppearanceResource {
|
|
19
|
+
bucket: AppearanceBucket;
|
|
20
|
+
partIndices: number[];
|
|
21
|
+
}
|
|
22
|
+
/** Partition shared batches before a draft owns GPU resources. Detached originals
|
|
23
|
+
* then contain exactly one owner, so another draft can cancel in any order. */
|
|
24
|
+
export declare class AppearanceBuckets {
|
|
25
|
+
private readonly access;
|
|
26
|
+
private sequence;
|
|
27
|
+
private readonly cohorts;
|
|
28
|
+
constructor(access: AppearanceBucketAccess, parts: (id: number) => readonly MeshData[] | undefined);
|
|
29
|
+
private create;
|
|
30
|
+
capture(parts: readonly MeshData[]): FlatAppearanceResource[];
|
|
31
|
+
stage(parts: readonly MeshData[], indices: number[]): FlatAppearanceResource[];
|
|
32
|
+
detach(owner: number): void;
|
|
33
|
+
attach(resource: FlatAppearanceResource, parts: MeshData[]): void;
|
|
34
|
+
refresh(): void;
|
|
35
|
+
begin(owner: AppearanceOwner): void;
|
|
36
|
+
finish(owner: AppearanceOwner): void;
|
|
37
|
+
forget(expressId?: number): void;
|
|
38
|
+
private dispose;
|
|
39
|
+
release(resource: FlatAppearanceResource): void;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=scene-appearance-buckets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-appearance-buckets.d.ts","sourceRoot":"","sources":["../src/scene-appearance-buckets.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;CACrB;AACD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACvC,OAAO,IAAI,GAAG,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAC3C,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC;IACpD,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAClC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,IAAI,IAAI,CAAC;CACjB;AACD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,gBAAgB,CAAC;IACzB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;+EAC+E;AAC/E,qBAAa,iBAAiB;IAI1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHzB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAE9B,MAAM,EAAE,sBAAsB,EAC/C,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,SAAS,QAAQ,EAAE,GAAG,SAAS;IAIxD,OAAO,CAAC,MAAM;IAqBd,OAAO,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,sBAAsB,EAAE;IAqD7D,KAAK,CACH,KAAK,EAAE,SAAS,QAAQ,EAAE,EAC1B,OAAO,EAAE,MAAM,EAAE,GAChB,sBAAsB,EAAE;IA4B3B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAW3B,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI;IAOjE,OAAO,IAAI,IAAI;IAGf,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAGnC,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAepC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAGhC,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;CAGhD"}
|