@ifc-lite/renderer 1.2.1 → 1.4.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/dist/camera.d.ts +4 -0
- package/dist/camera.d.ts.map +1 -1
- package/dist/camera.js +6 -0
- package/dist/camera.js.map +1 -1
- package/dist/constants.d.ts +125 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +124 -0
- package/dist/constants.js.map +1 -0
- package/dist/device.d.ts.map +1 -1
- package/dist/device.js +2 -1
- package/dist/device.js.map +1 -1
- package/dist/federation-registry.d.ts +98 -0
- package/dist/federation-registry.d.ts.map +1 -0
- package/dist/federation-registry.js +197 -0
- package/dist/federation-registry.js.map +1 -0
- package/dist/index.d.ts +62 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +271 -98
- package/dist/index.js.map +1 -1
- package/dist/picker.d.ts +3 -2
- package/dist/picker.d.ts.map +1 -1
- package/dist/picker.js +19 -10
- package/dist/picker.js.map +1 -1
- package/dist/scene.d.ts +32 -8
- package/dist/scene.d.ts.map +1 -1
- package/dist/scene.js +167 -16
- package/dist/scene.js.map +1 -1
- package/dist/section-2d-overlay.d.ts +104 -0
- package/dist/section-2d-overlay.d.ts.map +1 -0
- package/dist/section-2d-overlay.js +437 -0
- package/dist/section-2d-overlay.js.map +1 -0
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,197 @@
|
|
|
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
|
+
// Safety limit - warn before approaching 32-bit limit
|
|
5
|
+
// WebGPU picking uses r32uint (max 4,294,967,295)
|
|
6
|
+
const MAX_SAFE_OFFSET = 2_000_000_000;
|
|
7
|
+
/**
|
|
8
|
+
* Central registry for multi-model federation
|
|
9
|
+
* Manages ID offsets and provides O(1) to-global / O(log N) from-global transformations
|
|
10
|
+
*/
|
|
11
|
+
export class FederationRegistry {
|
|
12
|
+
modelRanges = new Map();
|
|
13
|
+
sortedRanges = []; // Sorted by offset for binary search
|
|
14
|
+
nextOffset = 0;
|
|
15
|
+
/**
|
|
16
|
+
* Register a new model and get its ID offset
|
|
17
|
+
* Call this BEFORE adding meshes to the scene
|
|
18
|
+
*
|
|
19
|
+
* @param modelId Unique identifier for this model
|
|
20
|
+
* @param maxExpressId Highest expressId in this model (scan meshes first)
|
|
21
|
+
* @returns The offset to add to all expressIds for this model
|
|
22
|
+
*/
|
|
23
|
+
registerModel(modelId, maxExpressId) {
|
|
24
|
+
// Validate inputs
|
|
25
|
+
if (!modelId || typeof modelId !== 'string') {
|
|
26
|
+
throw new Error(`[FederationRegistry] Invalid modelId: ${modelId}`);
|
|
27
|
+
}
|
|
28
|
+
if (typeof maxExpressId !== 'number' || !Number.isFinite(maxExpressId) || maxExpressId < 0) {
|
|
29
|
+
throw new Error(`[FederationRegistry] Invalid maxExpressId: ${maxExpressId} for model ${modelId}`);
|
|
30
|
+
}
|
|
31
|
+
// Check for duplicate registration
|
|
32
|
+
if (this.modelRanges.has(modelId)) {
|
|
33
|
+
const existing = this.modelRanges.get(modelId);
|
|
34
|
+
console.warn(`[FederationRegistry] Model ${modelId} already registered with offset ${existing.offset}`);
|
|
35
|
+
return existing.offset;
|
|
36
|
+
}
|
|
37
|
+
// Check for overflow
|
|
38
|
+
if (this.nextOffset + maxExpressId > MAX_SAFE_OFFSET) {
|
|
39
|
+
throw new Error(`[FederationRegistry] Cannot register model: would exceed safe ID limit. ` +
|
|
40
|
+
`Current offset: ${this.nextOffset}, model max ID: ${maxExpressId}. ` +
|
|
41
|
+
`Please unload some models first.`);
|
|
42
|
+
}
|
|
43
|
+
const offset = this.nextOffset;
|
|
44
|
+
const range = { modelId, offset, maxExpressId };
|
|
45
|
+
this.modelRanges.set(modelId, range);
|
|
46
|
+
this.sortedRanges.push(range);
|
|
47
|
+
// Keep sorted by offset for binary search
|
|
48
|
+
this.sortedRanges.sort((a, b) => a.offset - b.offset);
|
|
49
|
+
// Next model starts after this model's range (+1 gap for safety)
|
|
50
|
+
this.nextOffset = offset + maxExpressId + 1;
|
|
51
|
+
return offset;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Unregister a model (when removed from viewer)
|
|
55
|
+
* Note: The offset space is NOT reclaimed to avoid invalidating any
|
|
56
|
+
* existing references (selections, undo stack, etc.)
|
|
57
|
+
*/
|
|
58
|
+
unregisterModel(modelId) {
|
|
59
|
+
const range = this.modelRanges.get(modelId);
|
|
60
|
+
if (!range) {
|
|
61
|
+
console.warn(`[FederationRegistry] Cannot unregister unknown model: ${modelId}`);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
this.modelRanges.delete(modelId);
|
|
65
|
+
this.sortedRanges = this.sortedRanges.filter(r => r.modelId !== modelId);
|
|
66
|
+
// Note: nextOffset is NOT reduced - offset space is burned
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Transform a local expressId to a globally unique ID
|
|
70
|
+
* O(1) - direct map lookup + addition
|
|
71
|
+
*/
|
|
72
|
+
toGlobalId(modelId, expressId) {
|
|
73
|
+
const range = this.modelRanges.get(modelId);
|
|
74
|
+
if (!range) {
|
|
75
|
+
console.warn(`[FederationRegistry] Unknown model: ${modelId}, returning expressId unchanged`);
|
|
76
|
+
return expressId;
|
|
77
|
+
}
|
|
78
|
+
return expressId + range.offset;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Transform a global ID back to model + local expressId
|
|
82
|
+
* O(log N) - binary search on sorted ranges
|
|
83
|
+
*/
|
|
84
|
+
fromGlobalId(globalId) {
|
|
85
|
+
if (this.sortedRanges.length === 0) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
// Binary search to find which range contains this globalId
|
|
89
|
+
const range = this.binarySearchRange(globalId);
|
|
90
|
+
if (!range) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
// Verify the globalId is actually within this model's range
|
|
94
|
+
const localId = globalId - range.offset;
|
|
95
|
+
if (localId < 0 || localId > range.maxExpressId) {
|
|
96
|
+
// globalId is in the gap between models
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
modelId: range.modelId,
|
|
101
|
+
expressId: localId,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get the model ID that owns a global ID (without computing expressId)
|
|
106
|
+
* O(log N)
|
|
107
|
+
*/
|
|
108
|
+
getModelForGlobalId(globalId) {
|
|
109
|
+
const result = this.fromGlobalId(globalId);
|
|
110
|
+
return result?.modelId ?? null;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get the offset for a model (useful for batch transformations)
|
|
114
|
+
*/
|
|
115
|
+
getOffset(modelId) {
|
|
116
|
+
return this.modelRanges.get(modelId)?.offset ?? null;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Check if a model is registered
|
|
120
|
+
*/
|
|
121
|
+
hasModel(modelId) {
|
|
122
|
+
return this.modelRanges.has(modelId);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get all registered model IDs
|
|
126
|
+
*/
|
|
127
|
+
getModelIds() {
|
|
128
|
+
return Array.from(this.modelRanges.keys());
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get the number of registered models
|
|
132
|
+
*/
|
|
133
|
+
getModelCount() {
|
|
134
|
+
return this.modelRanges.size;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get all global IDs for a model (as a range)
|
|
138
|
+
* Useful for bulk operations like "hide all entities in model X"
|
|
139
|
+
*/
|
|
140
|
+
getGlobalIdRange(modelId) {
|
|
141
|
+
const range = this.modelRanges.get(modelId);
|
|
142
|
+
if (!range)
|
|
143
|
+
return null;
|
|
144
|
+
return {
|
|
145
|
+
start: range.offset,
|
|
146
|
+
end: range.offset + range.maxExpressId,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Check if a global ID belongs to a specific model
|
|
151
|
+
* O(1) when we know the model
|
|
152
|
+
*/
|
|
153
|
+
isInModel(globalId, modelId) {
|
|
154
|
+
const range = this.modelRanges.get(modelId);
|
|
155
|
+
if (!range)
|
|
156
|
+
return false;
|
|
157
|
+
const localId = globalId - range.offset;
|
|
158
|
+
return localId >= 0 && localId <= range.maxExpressId;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Clear all registrations (for full reset)
|
|
162
|
+
*/
|
|
163
|
+
clear() {
|
|
164
|
+
this.modelRanges.clear();
|
|
165
|
+
this.sortedRanges = [];
|
|
166
|
+
this.nextOffset = 0;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Binary search to find the range that could contain a globalId
|
|
170
|
+
* Returns the range with the largest offset that is <= globalId
|
|
171
|
+
*/
|
|
172
|
+
binarySearchRange(globalId) {
|
|
173
|
+
const ranges = this.sortedRanges;
|
|
174
|
+
if (ranges.length === 0)
|
|
175
|
+
return null;
|
|
176
|
+
// If globalId is before first range, no match
|
|
177
|
+
if (globalId < ranges[0].offset)
|
|
178
|
+
return null;
|
|
179
|
+
let lo = 0;
|
|
180
|
+
let hi = ranges.length - 1;
|
|
181
|
+
// Find the rightmost range where offset <= globalId
|
|
182
|
+
while (lo < hi) {
|
|
183
|
+
const mid = Math.floor((lo + hi + 1) / 2);
|
|
184
|
+
if (ranges[mid].offset <= globalId) {
|
|
185
|
+
lo = mid;
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
hi = mid - 1;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return ranges[lo];
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Singleton instance for the application
|
|
195
|
+
// Export both the class (for testing) and a singleton instance
|
|
196
|
+
export const federationRegistry = new FederationRegistry();
|
|
197
|
+
//# sourceMappingURL=federation-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"federation-registry.js","sourceRoot":"","sources":["../src/federation-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,9 +8,13 @@ export { Scene } from './scene.js';
|
|
|
8
8
|
export { Picker } from './picker.js';
|
|
9
9
|
export { MathUtils } from './math.js';
|
|
10
10
|
export { SectionPlaneRenderer } from './section-plane.js';
|
|
11
|
+
export { Section2DOverlayRenderer } from './section-2d-overlay.js';
|
|
12
|
+
export type { Section2DOverlayOptions, CutPolygon2D, DrawingLine2D } from './section-2d-overlay.js';
|
|
11
13
|
export { Raycaster } from './raycaster.js';
|
|
12
14
|
export { SnapDetector, SnapType } from './snap-detector.js';
|
|
13
15
|
export { BVH } from './bvh.js';
|
|
16
|
+
export { FederationRegistry, federationRegistry } from './federation-registry.js';
|
|
17
|
+
export type { ModelRange, GlobalIdLookup } from './federation-registry.js';
|
|
14
18
|
export * from './types.js';
|
|
15
19
|
export type { Ray, Vec3, Intersection } from './raycaster.js';
|
|
16
20
|
export type { SnapTarget, SnapOptions, EdgeLockInput, MagneticSnapResult } from './snap-detector.js';
|
|
@@ -18,7 +22,8 @@ export { ZeroCopyGpuUploader, createZeroCopyUploader, type WasmMemoryHandle, typ
|
|
|
18
22
|
import { RenderPipeline } from './pipeline.js';
|
|
19
23
|
import { Camera } from './camera.js';
|
|
20
24
|
import { Scene } from './scene.js';
|
|
21
|
-
import type { RenderOptions, PickOptions, Mesh } from './types.js';
|
|
25
|
+
import type { RenderOptions, PickOptions, PickResult, Mesh } from './types.js';
|
|
26
|
+
import { type CutPolygon2D, type DrawingLine2D } from './section-2d-overlay.js';
|
|
22
27
|
import type { InstancedGeometry } from '@ifc-lite/wasm';
|
|
23
28
|
import { Raycaster, type Intersection } from './raycaster.js';
|
|
24
29
|
import { SnapDetector, type SnapTarget, type SnapOptions, type EdgeLockInput, type MagneticSnapResult } from './snap-detector.js';
|
|
@@ -34,17 +39,42 @@ export declare class Renderer {
|
|
|
34
39
|
private picker;
|
|
35
40
|
private canvas;
|
|
36
41
|
private sectionPlaneRenderer;
|
|
42
|
+
private section2DOverlayRenderer;
|
|
37
43
|
private modelBounds;
|
|
38
44
|
private raycaster;
|
|
39
45
|
private snapDetector;
|
|
40
46
|
private bvh;
|
|
41
47
|
private bvhCache;
|
|
42
48
|
private readonly BVH_THRESHOLD;
|
|
49
|
+
private lastRenderErrorTime;
|
|
50
|
+
private readonly RENDER_ERROR_THROTTLE_MS;
|
|
43
51
|
constructor(canvas: HTMLCanvasElement);
|
|
44
52
|
/**
|
|
45
53
|
* Initialize renderer
|
|
46
54
|
*/
|
|
47
55
|
init(): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Load geometry from GeometryResult or MeshData array
|
|
58
|
+
* This is the main entry point for loading IFC geometry into the renderer
|
|
59
|
+
*
|
|
60
|
+
* @param geometry - Either a GeometryResult from geometry.process() or an array of MeshData
|
|
61
|
+
*/
|
|
62
|
+
loadGeometry(geometry: import('@ifc-lite/geometry').GeometryResult | import('@ifc-lite/geometry').MeshData[]): void;
|
|
63
|
+
/**
|
|
64
|
+
* Add multiple meshes to the scene (convenience method for streaming)
|
|
65
|
+
*
|
|
66
|
+
* @param meshes - Array of MeshData to add
|
|
67
|
+
* @param isStreaming - If true, throttles batch rebuilding for better streaming performance
|
|
68
|
+
*/
|
|
69
|
+
addMeshes(meshes: import('@ifc-lite/geometry').MeshData[], isStreaming?: boolean): void;
|
|
70
|
+
/**
|
|
71
|
+
* Update model bounds from mesh data
|
|
72
|
+
*/
|
|
73
|
+
private updateModelBounds;
|
|
74
|
+
/**
|
|
75
|
+
* Fit camera to view all loaded geometry
|
|
76
|
+
*/
|
|
77
|
+
fitToView(): void;
|
|
48
78
|
/**
|
|
49
79
|
* Add mesh to scene with per-mesh GPU resources for unique colors
|
|
50
80
|
*/
|
|
@@ -80,8 +110,9 @@ export declare class Renderer {
|
|
|
80
110
|
/**
|
|
81
111
|
* Pick object at screen coordinates
|
|
82
112
|
* Respects visibility filtering so users can only select visible elements
|
|
113
|
+
* Returns PickResult with expressId and modelIndex for multi-model support
|
|
83
114
|
*/
|
|
84
|
-
pick(x: number, y: number, options?: PickOptions): Promise<
|
|
115
|
+
pick(x: number, y: number, options?: PickOptions): Promise<PickResult | null>;
|
|
85
116
|
/**
|
|
86
117
|
* Raycast into the scene to get precise 3D intersection point
|
|
87
118
|
* This is more accurate than pick() as it returns the exact surface point
|
|
@@ -123,6 +154,25 @@ export declare class Renderer {
|
|
|
123
154
|
resize(width: number, height: number): void;
|
|
124
155
|
getCamera(): Camera;
|
|
125
156
|
getScene(): Scene;
|
|
157
|
+
/**
|
|
158
|
+
* Upload 2D section drawing data for 3D overlay rendering
|
|
159
|
+
* Call this when a 2D drawing is generated to display it on the section plane
|
|
160
|
+
* Uses same position calculation as section plane: sectionRange min/max if provided, else modelBounds
|
|
161
|
+
*/
|
|
162
|
+
uploadSection2DOverlay(polygons: CutPolygon2D[], lines: DrawingLine2D[], axis: 'down' | 'front' | 'side', position: number, // 0-100 percentage
|
|
163
|
+
sectionRange?: {
|
|
164
|
+
min?: number;
|
|
165
|
+
max?: number;
|
|
166
|
+
}, // Same storey-based range as section plane
|
|
167
|
+
flipped?: boolean): void;
|
|
168
|
+
/**
|
|
169
|
+
* Clear the 2D section overlay
|
|
170
|
+
*/
|
|
171
|
+
clearSection2DOverlay(): void;
|
|
172
|
+
/**
|
|
173
|
+
* Check if 2D section overlay has geometry to render
|
|
174
|
+
*/
|
|
175
|
+
hasSection2DOverlay(): boolean;
|
|
126
176
|
/**
|
|
127
177
|
* Get render pipeline (for batching)
|
|
128
178
|
*/
|
|
@@ -135,5 +185,15 @@ export declare class Renderer {
|
|
|
135
185
|
* Get the GPU device (returns null if not initialized)
|
|
136
186
|
*/
|
|
137
187
|
getGPUDevice(): GPUDevice | null;
|
|
188
|
+
/**
|
|
189
|
+
* Capture a screenshot of the current view
|
|
190
|
+
* Waits for GPU work to complete and captures exactly what's displayed
|
|
191
|
+
* @returns PNG data URL or null if capture failed
|
|
192
|
+
*/
|
|
193
|
+
captureScreenshot(): Promise<string | null>;
|
|
194
|
+
/**
|
|
195
|
+
* Get the canvas element
|
|
196
|
+
*/
|
|
197
|
+
getCanvas(): HTMLCanvasElement;
|
|
138
198
|
}
|
|
139
199
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,YAAY,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9D,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGrG,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,6BAA6B,GACnC,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,cAAc,EAA2B,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAmC,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|