@ifc-lite/renderer 1.16.0 → 1.18.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.
Files changed (47) hide show
  1. package/README.md +73 -15
  2. package/dist/edl-pass.d.ts +52 -0
  3. package/dist/edl-pass.d.ts.map +1 -0
  4. package/dist/edl-pass.js +204 -0
  5. package/dist/edl-pass.js.map +1 -0
  6. package/dist/index.d.ts +77 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +348 -19
  9. package/dist/index.js.map +1 -1
  10. package/dist/picker.d.ts +22 -3
  11. package/dist/picker.d.ts.map +1 -1
  12. package/dist/picker.js +48 -8
  13. package/dist/picker.js.map +1 -1
  14. package/dist/picking-manager.d.ts +14 -1
  15. package/dist/picking-manager.d.ts.map +1 -1
  16. package/dist/picking-manager.js +13 -1
  17. package/dist/picking-manager.js.map +1 -1
  18. package/dist/pipeline.d.ts.map +1 -1
  19. package/dist/pipeline.js +16 -1
  20. package/dist/pipeline.js.map +1 -1
  21. package/dist/point-picker.d.ts +61 -0
  22. package/dist/point-picker.d.ts.map +1 -0
  23. package/dist/point-picker.js +223 -0
  24. package/dist/point-picker.js.map +1 -0
  25. package/dist/pointcloud/point-cloud-node.d.ts +56 -0
  26. package/dist/pointcloud/point-cloud-node.d.ts.map +1 -0
  27. package/dist/pointcloud/point-cloud-node.js +112 -0
  28. package/dist/pointcloud/point-cloud-node.js.map +1 -0
  29. package/dist/pointcloud/point-cloud-renderer.d.ts +135 -0
  30. package/dist/pointcloud/point-cloud-renderer.d.ts.map +1 -0
  31. package/dist/pointcloud/point-cloud-renderer.js +296 -0
  32. package/dist/pointcloud/point-cloud-renderer.js.map +1 -0
  33. package/dist/pointcloud/point-pipeline.d.ts +25 -0
  34. package/dist/pointcloud/point-pipeline.d.ts.map +1 -0
  35. package/dist/pointcloud/point-pipeline.js +111 -0
  36. package/dist/pointcloud/point-pipeline.js.map +1 -0
  37. package/dist/pointcloud/point-shader.wgsl.d.ts +22 -0
  38. package/dist/pointcloud/point-shader.wgsl.d.ts.map +1 -0
  39. package/dist/pointcloud/point-shader.wgsl.js +212 -0
  40. package/dist/pointcloud/point-shader.wgsl.js.map +1 -0
  41. package/dist/shaders/main.wgsl.d.ts +1 -1
  42. package/dist/shaders/main.wgsl.d.ts.map +1 -1
  43. package/dist/shaders/main.wgsl.js +15 -3
  44. package/dist/shaders/main.wgsl.js.map +1 -1
  45. package/dist/types.d.ts +20 -0
  46. package/dist/types.d.ts.map +1 -1
  47. package/package.json +3 -3
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @ifc-lite/renderer
2
2
 
3
- WebGPU-based 3D rendering engine for IFClite. Provides GPU-accelerated rendering with depth testing, frustum culling, and zero-copy WASM-to-GPU data transfer.
3
+ WebGPU-based 3D renderer for IFClite. Zero-copy from WASM linear memory to GPU buffers, hardware frustum culling, GPU-accelerated picking, section planes, multi-model federation.
4
4
 
5
5
  ## Installation
6
6
 
@@ -8,32 +8,90 @@ WebGPU-based 3D rendering engine for IFClite. Provides GPU-accelerated rendering
8
8
  npm install @ifc-lite/renderer
9
9
  ```
10
10
 
11
- ## Quick Start
11
+ ## Render an IFC model
12
12
 
13
13
  ```typescript
14
14
  import { Renderer } from '@ifc-lite/renderer';
15
+ import { GeometryProcessor } from '@ifc-lite/geometry';
15
16
 
16
17
  const renderer = new Renderer(canvas);
17
- await renderer.init();
18
+ const geometry = new GeometryProcessor();
19
+ await Promise.all([renderer.init(), geometry.init()]);
18
20
 
19
- renderer.loadGeometry(geometryData);
20
- renderer.fitToView();
21
- renderer.render();
21
+ const meshes = await geometry.process(new Uint8Array(buffer));
22
+ renderer.loadGeometry(meshes);
23
+ renderer.requestRender();
22
24
  ```
23
25
 
24
- ## Features
26
+ `loadGeometry()` accepts a `GeometryResult` from `@ifc-lite/geometry` or a raw `MeshData[]`. The renderer keeps geometry in GPU buffers; subsequent `requestRender()` calls coalesce into a single frame.
25
27
 
26
- - WebGPU rendering with depth testing and frustum culling
27
- - Zero-copy transfer from WASM linear memory to GPU buffers
28
- - Section planes for cross-section views
29
- - 3D measurements with snap-to-edge
30
- - Entity picking via GPU ray casting
31
- - Multi-model federation support (FederationRegistry)
32
- - Per-entity visibility and color override
28
+ ## Pick an entity
29
+
30
+ ```typescript
31
+ canvas.addEventListener('click', async (e) => {
32
+ const rect = canvas.getBoundingClientRect();
33
+ const hit = await renderer.pick(e.clientX - rect.left, e.clientY - rect.top);
34
+
35
+ if (hit) {
36
+ console.log(`Clicked expressId ${hit.expressId} at`, hit.point);
37
+ renderer.setSelection([hit.expressId]);
38
+ renderer.requestRender();
39
+ }
40
+ });
41
+ ```
42
+
43
+ For exact world-space hits with surface normals, use `raycastScene(x, y)` — slower but returns the precise intersection point + normal.
44
+
45
+ ## Section planes
46
+
47
+ ```typescript
48
+ // Cut the model with an axis-aligned section plane
49
+ renderer.setSectionPlane({
50
+ axis: 'down', // 'side' | 'down' | 'front' (X / Y / Z)
51
+ position: 3.0, // metres along axis
52
+ enabled: true,
53
+ flipped: false,
54
+ });
55
+ renderer.requestRender();
56
+
57
+ // Disable
58
+ renderer.setSectionPlane(null);
59
+ ```
60
+
61
+ ## Visibility + colour overrides
62
+
63
+ ```typescript
64
+ // Hide a list of entities
65
+ renderer.setHiddenEntities(new Set([12345, 12346, 12347]));
66
+
67
+ // Solo a subset (everything else gets the ghost treatment)
68
+ renderer.setIsolatedEntities(new Set([42]));
69
+
70
+ // Tint specific entities
71
+ renderer.setColorOverrides(new Map([
72
+ [42, [1, 0, 0, 1]], // RGBA — bright red
73
+ [99, [0, 1, 0, 0.4]], // semi-transparent green
74
+ ]));
75
+ renderer.requestRender();
76
+ ```
77
+
78
+ ## Multi-model federation
79
+
80
+ ```typescript
81
+ import { federationRegistry } from '@ifc-lite/renderer';
82
+
83
+ // Register each model with a unique ID offset
84
+ federationRegistry.registerModel('arch', maxArchExpressId);
85
+ federationRegistry.registerModel('struct', maxStructExpressId);
86
+
87
+ // Now picks return globalIds; resolve back to (modelId, expressId)
88
+ const hit = await renderer.pick(x, y);
89
+ const { modelId, expressId } = federationRegistry.fromGlobalId(hit.expressId);
90
+ ```
33
91
 
34
92
  ## API
35
93
 
36
- See the [Rendering Guide](../../docs/guide/rendering.md) and [API Reference](../../docs/api/typescript.md#ifc-literenderer).
94
+ See the [Rendering Guide](https://louistrue.github.io/ifc-lite/guide/rendering/) and [API Reference](https://louistrue.github.io/ifc-lite/api/typescript/#ifc-literenderer).
37
95
 
38
96
  ## License
39
97
 
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Eye-Dome Lighting (EDL) post-pass.
3
+ *
4
+ * Standard Potree-style screen-space depth shading: for each pixel, sample
5
+ * a few neighbouring depths at radius R, compute the mean log-depth-diff,
6
+ * and darken proportionally. The result is a soft black halo at silhouettes
7
+ * and gives un-normaled point clouds (and triangle meshes) a strong sense
8
+ * of depth without needing geometric normals.
9
+ *
10
+ * Costs ~9 texture taps per pixel (1 centre + 8 neighbours) at the high
11
+ * quality setting, ~5 at low. Cheap on any modern GPU.
12
+ *
13
+ * Render order: this should run AFTER the existing PostProcessor (which
14
+ * does contact / separation shading) so EDL also darkens those overlays.
15
+ *
16
+ * Reverse-Z note: the main pipeline uses depthCompare 'greater' with
17
+ * clearValue 0.0. So depth=1 → near plane, depth=0 → far plane. A bigger
18
+ * neighbour depth means the neighbour is closer; a smaller neighbour depth
19
+ * means it's further. We darken pixels whose neighbours are further away —
20
+ * i.e. silhouette edges — by clamping `max(0, log(centre) - log(neighbour))`.
21
+ */
22
+ import { WebGPUDevice } from './device.js';
23
+ export interface EdlPassOptions {
24
+ /** Multiplier on the final darken alpha. 0..3, default 1. */
25
+ strength?: number;
26
+ /** Sample radius in pixels. 1..4, default 1. */
27
+ radiusPx?: number;
28
+ /** When true, sample 8 neighbours; when false, just 4 cardinal. */
29
+ highQuality?: boolean;
30
+ }
31
+ export interface EdlPassApplyOptions {
32
+ /** Output target — typically the swap chain texture view. */
33
+ targetView: GPUTextureView;
34
+ /** Depth texture view (must be `aspect: 'depth-only'` for stencil formats). */
35
+ depthView: GPUTextureView;
36
+ }
37
+ export declare class EdlPass {
38
+ private device;
39
+ private colorFormat;
40
+ private isMultisampled;
41
+ private uniformBuffer;
42
+ private uniformStaging;
43
+ private bindGroupLayout;
44
+ private pipeline;
45
+ private cachedBindGroup;
46
+ private cachedDepthView;
47
+ private destroyed;
48
+ constructor(device: WebGPUDevice, sampleCount: number);
49
+ apply(encoder: GPUCommandEncoder, opts: EdlPassApplyOptions, params: Required<EdlPassOptions>): void;
50
+ destroy(): void;
51
+ }
52
+ //# sourceMappingURL=edl-pass.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edl-pass.d.ts","sourceRoot":"","sources":["../src/edl-pass.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,6DAA6D;IAC7D,UAAU,EAAE,cAAc,CAAC;IAC3B,+EAA+E;IAC/E,SAAS,EAAE,cAAc,CAAC;CAC3B;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM;IA4JrD,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,IAAI;IA+BpG,OAAO,IAAI,IAAI;CAOhB"}
@@ -0,0 +1,204 @@
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 class EdlPass {
5
+ device;
6
+ colorFormat;
7
+ isMultisampled;
8
+ uniformBuffer;
9
+ uniformStaging = new Float32Array(4);
10
+ bindGroupLayout;
11
+ pipeline;
12
+ cachedBindGroup = null;
13
+ cachedDepthView = null;
14
+ destroyed = false;
15
+ constructor(device, sampleCount) {
16
+ this.device = device.getDevice();
17
+ this.colorFormat = device.getFormat();
18
+ this.isMultisampled = sampleCount > 1;
19
+ this.uniformBuffer = this.device.createBuffer({
20
+ // strength, radiusPx, highQuality(u32-as-f32 placeholder), pad
21
+ size: 16,
22
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
23
+ });
24
+ this.bindGroupLayout = this.device.createBindGroupLayout({
25
+ entries: [
26
+ {
27
+ binding: 0,
28
+ visibility: GPUShaderStage.FRAGMENT,
29
+ texture: {
30
+ sampleType: 'depth',
31
+ viewDimension: '2d',
32
+ multisampled: this.isMultisampled,
33
+ },
34
+ },
35
+ {
36
+ binding: 1,
37
+ visibility: GPUShaderStage.FRAGMENT,
38
+ buffer: { type: 'uniform' },
39
+ },
40
+ ],
41
+ });
42
+ const depthTexDecl = this.isMultisampled
43
+ ? '@group(0) @binding(0) var depthTex: texture_depth_multisampled_2d;'
44
+ : '@group(0) @binding(0) var depthTex: texture_depth_2d;';
45
+ const depthLoadExpr = this.isMultisampled
46
+ // sample_index for texture_depth_multisampled_2d must be i32 per
47
+ // the WGSL spec; some browsers accept the unsigned form, but
48
+ // strict validators (Naga) reject it.
49
+ ? 'textureLoad(depthTex, c, 0)'
50
+ : 'textureLoad(depthTex, c, 0)';
51
+ const shader = this.device.createShaderModule({
52
+ code: `
53
+ struct Params {
54
+ strength: f32,
55
+ radiusPx: f32,
56
+ highQuality: f32,
57
+ _pad: f32,
58
+ }
59
+
60
+ ${depthTexDecl}
61
+ @group(0) @binding(1) var<uniform> params: Params;
62
+
63
+ struct VsOut {
64
+ @builtin(position) pos: vec4<f32>,
65
+ }
66
+
67
+ @vertex
68
+ fn vs_main(@builtin(vertex_index) v: u32) -> VsOut {
69
+ // Standard fullscreen triangle (covers viewport, no UVs needed since
70
+ // the fragment shader reads from textureLoad with @builtin(position)).
71
+ var p = array<vec2<f32>, 3>(
72
+ vec2<f32>(-1.0, -3.0),
73
+ vec2<f32>(-1.0, 1.0),
74
+ vec2<f32>( 3.0, 1.0)
75
+ );
76
+ var o: VsOut;
77
+ o.pos = vec4<f32>(p[v], 0.0, 1.0);
78
+ return o;
79
+ }
80
+
81
+ fn sampleDepthClamped(ip: vec2<i32>, dims: vec2<i32>) -> f32 {
82
+ let c = vec2<i32>(clamp(ip.x, 0, dims.x - 1), clamp(ip.y, 0, dims.y - 1));
83
+ return ${depthLoadExpr};
84
+ }
85
+
86
+ @fragment
87
+ fn fs_main(@builtin(position) fragPos: vec4<f32>) -> @location(0) vec4<f32> {
88
+ let dimsU = textureDimensions(depthTex);
89
+ let dims = vec2<i32>(i32(dimsU.x), i32(dimsU.y));
90
+ let p = vec2<i32>(i32(fragPos.x), i32(fragPos.y));
91
+
92
+ let center = sampleDepthClamped(p, dims);
93
+ // Reverse-Z: 0 = far plane (no geometry written here), so skip.
94
+ if (center <= 1e-5) {
95
+ return vec4<f32>(0.0, 0.0, 0.0, 0.0);
96
+ }
97
+
98
+ let r = max(1, i32(params.radiusPx));
99
+ let logCenter = log(center);
100
+
101
+ var accum = 0.0;
102
+ var count = 0.0;
103
+
104
+ // Cardinal taps
105
+ let neighbourOffsets4 = array<vec2<i32>, 4>(
106
+ vec2<i32>( r, 0),
107
+ vec2<i32>(-r, 0),
108
+ vec2<i32>( 0, r),
109
+ vec2<i32>( 0, -r),
110
+ );
111
+ for (var i = 0; i < 4; i = i + 1) {
112
+ let dn = sampleDepthClamped(p + neighbourOffsets4[i], dims);
113
+ if (dn > 1e-5) {
114
+ // log(centre) - log(dn) > 0 when neighbour is further (smaller depth)
115
+ // → darken silhouette edges.
116
+ accum = accum + max(0.0, logCenter - log(dn));
117
+ count = count + 1.0;
118
+ }
119
+ }
120
+
121
+ if (params.highQuality > 0.5) {
122
+ let neighbourOffsets8 = array<vec2<i32>, 4>(
123
+ vec2<i32>( r, r),
124
+ vec2<i32>(-r, r),
125
+ vec2<i32>( r, -r),
126
+ vec2<i32>(-r, -r),
127
+ );
128
+ for (var i = 0; i < 4; i = i + 1) {
129
+ let dn = sampleDepthClamped(p + neighbourOffsets8[i], dims);
130
+ if (dn > 1e-5) {
131
+ accum = accum + max(0.0, logCenter - log(dn));
132
+ count = count + 1.0;
133
+ }
134
+ }
135
+ }
136
+
137
+ let meanLog = accum / max(count, 1.0);
138
+ // exp(-300 * meanLog * strength) — 300 matches Potree's default sensitivity.
139
+ // Output (1 - shade) as alpha; the blend mode multiplies dst by (1 - alpha).
140
+ let shade = exp(-300.0 * meanLog * params.strength);
141
+ let darken = clamp(1.0 - shade, 0.0, 0.85);
142
+ return vec4<f32>(0.0, 0.0, 0.0, darken);
143
+ }
144
+ `,
145
+ });
146
+ this.pipeline = this.device.createRenderPipeline({
147
+ layout: this.device.createPipelineLayout({ bindGroupLayouts: [this.bindGroupLayout] }),
148
+ vertex: { module: shader, entryPoint: 'vs_main' },
149
+ fragment: {
150
+ module: shader,
151
+ entryPoint: 'fs_main',
152
+ targets: [{
153
+ format: this.colorFormat,
154
+ // Same darken-overlay blend as the existing PostProcessor:
155
+ // dst' = dst * (1 - srcAlpha), src colour discarded.
156
+ blend: {
157
+ color: { srcFactor: 'zero', dstFactor: 'one-minus-src-alpha' },
158
+ alpha: { srcFactor: 'zero', dstFactor: 'one' },
159
+ },
160
+ }],
161
+ },
162
+ primitive: { topology: 'triangle-list' },
163
+ });
164
+ }
165
+ apply(encoder, opts, params) {
166
+ if (this.destroyed)
167
+ return;
168
+ if (this.cachedBindGroup === null || this.cachedDepthView !== opts.depthView) {
169
+ this.cachedBindGroup = this.device.createBindGroup({
170
+ layout: this.bindGroupLayout,
171
+ entries: [
172
+ { binding: 0, resource: opts.depthView },
173
+ { binding: 1, resource: { buffer: this.uniformBuffer } },
174
+ ],
175
+ });
176
+ this.cachedDepthView = opts.depthView;
177
+ }
178
+ this.uniformStaging[0] = params.strength;
179
+ this.uniformStaging[1] = params.radiusPx;
180
+ this.uniformStaging[2] = params.highQuality ? 1 : 0;
181
+ this.uniformStaging[3] = 0;
182
+ this.device.queue.writeBuffer(this.uniformBuffer, 0, this.uniformStaging);
183
+ const pass = encoder.beginRenderPass({
184
+ colorAttachments: [{
185
+ view: opts.targetView,
186
+ loadOp: 'load',
187
+ storeOp: 'store',
188
+ }],
189
+ });
190
+ pass.setPipeline(this.pipeline);
191
+ pass.setBindGroup(0, this.cachedBindGroup);
192
+ pass.draw(3, 1, 0, 0);
193
+ pass.end();
194
+ }
195
+ destroy() {
196
+ if (this.destroyed)
197
+ return;
198
+ this.destroyed = true;
199
+ this.uniformBuffer.destroy();
200
+ this.cachedBindGroup = null;
201
+ this.cachedDepthView = null;
202
+ }
203
+ }
204
+ //# sourceMappingURL=edl-pass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edl-pass.js","sourceRoot":"","sources":["../src/edl-pass.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -23,7 +23,15 @@ export type { Ray, Vec3, Intersection } from './raycaster.js';
23
23
  export type { SnapTarget, SnapOptions, EdgeLockInput, MagneticSnapResult } from './snap-detector.js';
24
24
  export { ZeroCopyGpuUploader, createZeroCopyUploader, type WasmMemoryHandle, type GpuGeometryData, type GpuInstancedGeometryData, type ZeroCopyMeshMetadata, type ZeroCopyUploadResult, type ZeroCopyInstancedUploadResult, } from './zero-copy-uploader.js';
25
25
  export { PickingManager } from './picking-manager.js';
26
+ export type { PointPickProvider } from './picking-manager.js';
26
27
  export { RaycastEngine } from './raycast-engine.js';
28
+ export { PointPicker, decodePickSample } from './point-picker.js';
29
+ export type { PointPickNode, DecodedPickSample } from './point-picker.js';
30
+ export type { PointPickSizing } from './picker.js';
31
+ export { PointCloudRenderer } from './pointcloud/point-cloud-renderer.js';
32
+ export type { PointCloudAssetHandle, PointCloudRenderOptions, PointColorMode, PointSizeMode, ResolvedSectionPlane as PointResolvedSectionPlane, } from './pointcloud/point-cloud-renderer.js';
33
+ export { PointRenderPipeline } from './pointcloud/point-pipeline.js';
34
+ export type { PointCloudChunkInput, PointCloudNode, PointCloudNodeMeta, } from './pointcloud/point-cloud-node.js';
27
35
  import { RenderPipeline } from './pipeline.js';
28
36
  import { Camera } from './camera.js';
29
37
  import { Scene } from './scene.js';
@@ -33,6 +41,7 @@ import { type CutPolygon2D, type DrawingLine2D } from './section-2d-overlay.js';
33
41
  import type { InstancedGeometry } from '@ifc-lite/wasm';
34
42
  import { Raycaster, type Intersection } from './raycaster.js';
35
43
  import { SnapDetector, type SnapTarget, type SnapOptions, type EdgeLockInput, type MagneticSnapResult } from './snap-detector.js';
44
+ import type { PointCloudAsset } from '@ifc-lite/geometry';
36
45
  /**
37
46
  * Main renderer class
38
47
  */
@@ -47,6 +56,9 @@ export declare class Renderer {
47
56
  private sectionPlaneRenderer;
48
57
  private section2DOverlayRenderer;
49
58
  private postProcessor;
59
+ private edlPass;
60
+ private edlOptions;
61
+ private pointCloudRenderer;
50
62
  private visualEnhancementState;
51
63
  private modelBounds;
52
64
  private pickingManager;
@@ -62,6 +74,71 @@ export declare class Renderer {
62
74
  * Initialize renderer
63
75
  */
64
76
  init(): Promise<void>;
77
+ /**
78
+ * Replace all loaded point clouds with `assets`.
79
+ *
80
+ * Phase 0 entry point — single-chunk inline assets from IFCx
81
+ * (`pcd::base64`, `points::array`, `points::base64`). Future phases
82
+ * accept streaming sources via a different overload.
83
+ */
84
+ setPointClouds(assets: ReadonlyArray<PointCloudAsset>): void;
85
+ /** Append additional point clouds without clearing existing ones. */
86
+ addPointClouds(assets: ReadonlyArray<PointCloudAsset>): void;
87
+ /** Total number of point cloud assets currently uploaded. */
88
+ getPointCloudAssetCount(): number;
89
+ /** Total number of points across all point cloud assets. */
90
+ getPointCloudPointCount(): number;
91
+ /** Drop all point cloud GPU resources. */
92
+ clearPointClouds(): void;
93
+ /**
94
+ * Streaming entry: open an empty asset that will receive chunks via
95
+ * `appendPointCloudChunk`. Call `endPointCloudStream` when no more
96
+ * chunks will arrive (currently a no-op but kept for symmetry).
97
+ */
98
+ beginPointCloudStream(meta: {
99
+ expressId: number;
100
+ ifcType?: string;
101
+ modelIndex?: number;
102
+ }): import('./pointcloud/point-cloud-renderer.js').PointCloudAssetHandle;
103
+ appendPointCloudChunk(handle: import('./pointcloud/point-cloud-renderer.js').PointCloudAssetHandle, chunk: import('./pointcloud/point-cloud-node.js').PointCloudChunkInput): void;
104
+ endPointCloudStream(handle: import('./pointcloud/point-cloud-renderer.js').PointCloudAssetHandle): void;
105
+ removePointCloudAsset(handle: import('./pointcloud/point-cloud-renderer.js').PointCloudAssetHandle): void;
106
+ /**
107
+ * Reassign a streamed point-cloud's expressId after upload. Use
108
+ * this when the federation registry assigns a new model offset and
109
+ * the renderer needs to emit the post-offset globalId in picking
110
+ * outputs. The change takes effect on the next render — no GPU
111
+ * buffer rewrite needed.
112
+ */
113
+ relabelPointCloudAsset(handle: import('./pointcloud/point-cloud-renderer.js').PointCloudAssetHandle, newExpressId: number): void;
114
+ /**
115
+ * Compute model bounds from triangle meshes + remaining point clouds.
116
+ * Called from removeAsset / clear paths so bounds shrink correctly.
117
+ * Triangle meshes still drive the bounds when present (existing
118
+ * Scene-driven path), so this only re-folds in the point cloud
119
+ * extents over whatever the mesh path left.
120
+ */
121
+ private recomputeModelBounds;
122
+ /** Aggregate bounds across all batched + individual meshes. Returns
123
+ * null if the scene has no mesh geometry. */
124
+ private computeMeshBounds;
125
+ /** Apply rendering options (color mode, fixed override, point size). */
126
+ setPointCloudOptions(opts: import('./pointcloud/point-cloud-renderer.js').PointCloudRenderOptions): void;
127
+ /**
128
+ * Toggle Eye-Dome Lighting and tune its strength.
129
+ *
130
+ * EDL adds depth perception to point clouds (and meshes) via screen-
131
+ * space depth gradient — silhouette pixels get a soft black halo.
132
+ * Cheap: ~9 texture taps per pixel. Only runs when point clouds are
133
+ * loaded.
134
+ */
135
+ setEdlOptions(opts: {
136
+ enabled?: boolean;
137
+ strength?: number;
138
+ radiusPx?: number;
139
+ highQuality?: boolean;
140
+ }): void;
141
+ private expandModelBoundsForPointClouds;
65
142
  /**
66
143
  * Load geometry from GeometryResult or MeshData array
67
144
  * This is the main entry point for loading IFC geometry into the renderer
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}