@ifc-lite/renderer 1.14.4 → 1.14.6

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.
@@ -1,400 +0,0 @@
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 { MathUtils } from './math.js';
5
- import { deduplicateMeshes } from '@ifc-lite/geometry';
6
- const MAX_ENCODED_ENTITY_ID = 0xFFFFFF;
7
- let warnedEntityIdRange = false;
8
- export class GeometryManager {
9
- device;
10
- scene;
11
- modelBounds = null;
12
- constructor(device, scene) {
13
- this.device = device;
14
- this.scene = scene;
15
- }
16
- /**
17
- * Get model bounds (used by Renderer for section planes, fitToView, etc.)
18
- */
19
- getModelBounds() {
20
- return this.modelBounds;
21
- }
22
- /**
23
- * Set model bounds (used by Renderer when computing bounds from batches)
24
- */
25
- setModelBounds(bounds) {
26
- this.modelBounds = bounds;
27
- }
28
- /**
29
- * Load geometry from GeometryResult or MeshData array
30
- * This is the main entry point for loading IFC geometry into the renderer
31
- *
32
- * @param geometry - Either a GeometryResult from geometry.process() or an array of MeshData
33
- * @param pipeline - The render pipeline (must be initialized)
34
- */
35
- loadGeometry(geometry, pipeline) {
36
- if (!this.device.isInitialized() || !pipeline) {
37
- throw new Error('Renderer not initialized. Call init() first.');
38
- }
39
- const meshes = Array.isArray(geometry) ? geometry : geometry.meshes;
40
- if (meshes.length === 0) {
41
- console.warn('[Renderer] loadGeometry called with empty mesh array');
42
- return;
43
- }
44
- // Use batched rendering for optimal performance
45
- const device = this.device.getDevice();
46
- this.scene.appendToBatches(meshes, device, pipeline, false);
47
- // Calculate and store model bounds for fitToView
48
- this.updateModelBounds(meshes);
49
- console.log(`[Renderer] Loaded ${meshes.length} meshes`);
50
- }
51
- /**
52
- * Add multiple meshes to the scene (convenience method for streaming)
53
- *
54
- * @param meshes - Array of MeshData to add
55
- * @param pipeline - The render pipeline (must be initialized)
56
- * @param isStreaming - If true, throttles batch rebuilding for better streaming performance
57
- */
58
- addMeshes(meshes, pipeline, isStreaming = false) {
59
- if (!this.device.isInitialized() || !pipeline) {
60
- throw new Error('Renderer not initialized. Call init() first.');
61
- }
62
- if (meshes.length === 0)
63
- return;
64
- const device = this.device.getDevice();
65
- this.scene.appendToBatches(meshes, device, pipeline, isStreaming);
66
- // Update model bounds incrementally
67
- this.updateModelBounds(meshes);
68
- }
69
- /**
70
- * Update model bounds from mesh data
71
- */
72
- updateModelBounds(meshes) {
73
- if (!this.modelBounds) {
74
- this.modelBounds = {
75
- min: { x: Infinity, y: Infinity, z: Infinity },
76
- max: { x: -Infinity, y: -Infinity, z: -Infinity }
77
- };
78
- }
79
- for (const mesh of meshes) {
80
- const positions = mesh.positions;
81
- for (let i = 0; i < positions.length; i += 3) {
82
- const x = positions[i];
83
- const y = positions[i + 1];
84
- const z = positions[i + 2];
85
- if (Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z)) {
86
- this.modelBounds.min.x = Math.min(this.modelBounds.min.x, x);
87
- this.modelBounds.min.y = Math.min(this.modelBounds.min.y, y);
88
- this.modelBounds.min.z = Math.min(this.modelBounds.min.z, z);
89
- this.modelBounds.max.x = Math.max(this.modelBounds.max.x, x);
90
- this.modelBounds.max.y = Math.max(this.modelBounds.max.y, y);
91
- this.modelBounds.max.z = Math.max(this.modelBounds.max.z, z);
92
- }
93
- }
94
- }
95
- }
96
- /**
97
- * Add mesh to scene with per-mesh GPU resources for unique colors
98
- */
99
- addMesh(mesh, pipeline) {
100
- // Create per-mesh uniform buffer and bind group if not already created
101
- if (!mesh.uniformBuffer && pipeline && this.device.isInitialized()) {
102
- const device = this.device.getDevice();
103
- // Create uniform buffer for this mesh
104
- mesh.uniformBuffer = device.createBuffer({
105
- size: pipeline.getUniformBufferSize(),
106
- usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
107
- });
108
- // Create bind group for this mesh
109
- mesh.bindGroup = device.createBindGroup({
110
- layout: pipeline.getBindGroupLayout(),
111
- entries: [
112
- {
113
- binding: 0,
114
- resource: { buffer: mesh.uniformBuffer },
115
- },
116
- ],
117
- });
118
- }
119
- this.scene.addMesh(mesh);
120
- }
121
- /**
122
- * Add instanced geometry to scene
123
- * Converts InstancedGeometry from geometry package to InstancedMesh for rendering
124
- */
125
- addInstancedGeometry(geometry, instancedPipeline) {
126
- if (!instancedPipeline || !this.device.isInitialized()) {
127
- throw new Error('Renderer not initialized. Call init() first.');
128
- }
129
- const device = this.device.getDevice();
130
- // Upload positions and normals interleaved
131
- const vertexCount = geometry.positions.length / 3;
132
- const vertexData = new Float32Array(vertexCount * 6);
133
- for (let i = 0; i < vertexCount; i++) {
134
- vertexData[i * 6 + 0] = geometry.positions[i * 3 + 0];
135
- vertexData[i * 6 + 1] = geometry.positions[i * 3 + 1];
136
- vertexData[i * 6 + 2] = geometry.positions[i * 3 + 2];
137
- vertexData[i * 6 + 3] = geometry.normals[i * 3 + 0];
138
- vertexData[i * 6 + 4] = geometry.normals[i * 3 + 1];
139
- vertexData[i * 6 + 5] = geometry.normals[i * 3 + 2];
140
- }
141
- // Create vertex buffer with exact size needed (ensure it matches data size)
142
- const vertexBufferSize = vertexData.byteLength;
143
- const vertexBuffer = device.createBuffer({
144
- size: vertexBufferSize,
145
- usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
146
- });
147
- device.queue.writeBuffer(vertexBuffer, 0, vertexData);
148
- // Create index buffer
149
- const indexBuffer = device.createBuffer({
150
- size: geometry.indices.byteLength,
151
- usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST,
152
- });
153
- device.queue.writeBuffer(indexBuffer, 0, geometry.indices);
154
- // Create instance buffer: each instance is 80 bytes (20 floats: 16 for transform + 4 for color)
155
- const instanceCount = geometry.instance_count;
156
- const instanceData = new Float32Array(instanceCount * 20);
157
- const expressIdToInstanceIndex = new Map();
158
- for (let i = 0; i < instanceCount; i++) {
159
- const instance = geometry.get_instance(i);
160
- if (!instance)
161
- continue;
162
- const baseIdx = i * 20;
163
- // Copy transform (16 floats)
164
- instanceData.set(instance.transform, baseIdx);
165
- // Copy color (4 floats)
166
- instanceData[baseIdx + 16] = instance.color[0];
167
- instanceData[baseIdx + 17] = instance.color[1];
168
- instanceData[baseIdx + 18] = instance.color[2];
169
- instanceData[baseIdx + 19] = instance.color[3];
170
- expressIdToInstanceIndex.set(instance.expressId, i);
171
- }
172
- const instanceBuffer = device.createBuffer({
173
- size: instanceData.byteLength,
174
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
175
- });
176
- device.queue.writeBuffer(instanceBuffer, 0, instanceData);
177
- // Create and cache bind group to avoid per-frame allocation
178
- const bindGroup = instancedPipeline.createInstanceBindGroup(instanceBuffer);
179
- const instancedMesh = {
180
- geometryId: Number(geometry.geometryId),
181
- vertexBuffer,
182
- indexBuffer,
183
- indexCount: geometry.indices.length,
184
- instanceBuffer,
185
- instanceCount: instanceCount,
186
- expressIdToInstanceIndex,
187
- bindGroup,
188
- };
189
- this.scene.addInstancedMesh(instancedMesh);
190
- }
191
- /**
192
- * Convert MeshData array to instanced meshes for optimized rendering
193
- * Groups identical geometries and creates GPU instanced draw calls
194
- * Call this in background after initial streaming completes
195
- */
196
- convertToInstanced(meshDataArray, instancedPipeline) {
197
- if (!instancedPipeline || !this.device.isInitialized()) {
198
- console.warn('[Renderer] Cannot convert to instanced: renderer not initialized');
199
- return;
200
- }
201
- // Use deduplication function to group identical geometries
202
- const instancedData = deduplicateMeshes(meshDataArray);
203
- const device = this.device.getDevice();
204
- let totalInstances = 0;
205
- for (const group of instancedData) {
206
- // Create vertex buffer (interleaved positions + normals)
207
- const vertexCount = group.positions.length / 3;
208
- const vertexData = new Float32Array(vertexCount * 6);
209
- for (let i = 0; i < vertexCount; i++) {
210
- vertexData[i * 6 + 0] = group.positions[i * 3 + 0];
211
- vertexData[i * 6 + 1] = group.positions[i * 3 + 1];
212
- vertexData[i * 6 + 2] = group.positions[i * 3 + 2];
213
- vertexData[i * 6 + 3] = group.normals[i * 3 + 0];
214
- vertexData[i * 6 + 4] = group.normals[i * 3 + 1];
215
- vertexData[i * 6 + 5] = group.normals[i * 3 + 2];
216
- }
217
- const vertexBuffer = device.createBuffer({
218
- size: vertexData.byteLength,
219
- usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
220
- });
221
- device.queue.writeBuffer(vertexBuffer, 0, vertexData);
222
- // Create index buffer
223
- const indexBuffer = device.createBuffer({
224
- size: group.indices.byteLength,
225
- usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST,
226
- });
227
- device.queue.writeBuffer(indexBuffer, 0, group.indices);
228
- // Create instance buffer: each instance is 80 bytes (20 floats: 16 for transform + 4 for color)
229
- const instanceCount = group.instances.length;
230
- const instanceData = new Float32Array(instanceCount * 20);
231
- const expressIdToInstanceIndex = new Map();
232
- // Identity matrix for now (instances use same geometry, different colors)
233
- const identityTransform = new Float32Array([
234
- 1, 0, 0, 0,
235
- 0, 1, 0, 0,
236
- 0, 0, 1, 0,
237
- 0, 0, 0, 1,
238
- ]);
239
- for (let i = 0; i < instanceCount; i++) {
240
- const instance = group.instances[i];
241
- const baseIdx = i * 20;
242
- // Copy identity transform (16 floats)
243
- instanceData.set(identityTransform, baseIdx);
244
- // Copy color (4 floats)
245
- instanceData[baseIdx + 16] = instance.color[0];
246
- instanceData[baseIdx + 17] = instance.color[1];
247
- instanceData[baseIdx + 18] = instance.color[2];
248
- instanceData[baseIdx + 19] = instance.color[3];
249
- expressIdToInstanceIndex.set(instance.expressId, i);
250
- }
251
- const instanceBuffer = device.createBuffer({
252
- size: instanceData.byteLength,
253
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
254
- });
255
- device.queue.writeBuffer(instanceBuffer, 0, instanceData);
256
- // Create and cache bind group to avoid per-frame allocation
257
- const bindGroup = instancedPipeline.createInstanceBindGroup(instanceBuffer);
258
- // Convert hash string to number for geometryId
259
- const geometryId = this.hashStringToNumber(group.geometryHash);
260
- const instancedMesh = {
261
- geometryId,
262
- vertexBuffer,
263
- indexBuffer,
264
- indexCount: group.indices.length,
265
- instanceBuffer,
266
- instanceCount: instanceCount,
267
- expressIdToInstanceIndex,
268
- bindGroup,
269
- };
270
- this.scene.addInstancedMesh(instancedMesh);
271
- totalInstances += instanceCount;
272
- }
273
- // Clear regular meshes after conversion to avoid double rendering
274
- const regularMeshCount = this.scene.getMeshes().length;
275
- this.scene.clearRegularMeshes();
276
- console.log(`[Renderer] Converted ${meshDataArray.length} meshes to ${instancedData.length} instanced geometries ` +
277
- `(${totalInstances} total instances, ${(totalInstances / instancedData.length).toFixed(1)}x deduplication). ` +
278
- `Cleared ${regularMeshCount} regular meshes.`);
279
- }
280
- /**
281
- * Hash string to number for geometryId
282
- */
283
- hashStringToNumber(str) {
284
- let hash = 0;
285
- for (let i = 0; i < str.length; i++) {
286
- const char = str.charCodeAt(i);
287
- hash = ((hash << 5) - hash) + char;
288
- hash = hash & hash; // Convert to 32-bit integer
289
- }
290
- return Math.abs(hash);
291
- }
292
- /**
293
- * Create a GPU Mesh from MeshData (lazy creation for selection highlighting)
294
- * This is called on-demand when a mesh is selected, avoiding 2x buffer creation during streaming
295
- */
296
- createMeshFromData(meshData) {
297
- if (!this.device.isInitialized())
298
- return;
299
- const device = this.device.getDevice();
300
- const vertexCount = meshData.positions.length / 3;
301
- const interleavedRaw = new ArrayBuffer(vertexCount * 7 * 4);
302
- const interleaved = new Float32Array(interleavedRaw);
303
- const interleavedU32 = new Uint32Array(interleavedRaw);
304
- for (let i = 0; i < vertexCount; i++) {
305
- const base = i * 7;
306
- const posBase = i * 3;
307
- interleaved[base] = meshData.positions[posBase];
308
- interleaved[base + 1] = meshData.positions[posBase + 1];
309
- interleaved[base + 2] = meshData.positions[posBase + 2];
310
- interleaved[base + 3] = meshData.normals[posBase];
311
- interleaved[base + 4] = meshData.normals[posBase + 1];
312
- interleaved[base + 5] = meshData.normals[posBase + 2];
313
- let encodedId = meshData.expressId >>> 0;
314
- if (encodedId > MAX_ENCODED_ENTITY_ID) {
315
- if (!warnedEntityIdRange) {
316
- warnedEntityIdRange = true;
317
- console.warn('[Renderer] expressId exceeds 24-bit seam-ID encoding range; seam lines may collide.');
318
- }
319
- encodedId = encodedId & MAX_ENCODED_ENTITY_ID;
320
- }
321
- interleavedU32[base + 6] = encodedId;
322
- }
323
- const vertexBuffer = device.createBuffer({
324
- size: interleaved.byteLength,
325
- usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
326
- });
327
- device.queue.writeBuffer(vertexBuffer, 0, interleaved);
328
- const indexBuffer = device.createBuffer({
329
- size: meshData.indices.byteLength,
330
- usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST,
331
- });
332
- device.queue.writeBuffer(indexBuffer, 0, meshData.indices);
333
- // Add to scene with identity transform (positions already in world space)
334
- this.scene.addMesh({
335
- expressId: meshData.expressId,
336
- modelIndex: meshData.modelIndex, // Preserve modelIndex for multi-model selection
337
- vertexBuffer,
338
- indexBuffer,
339
- indexCount: meshData.indices.length,
340
- transform: MathUtils.identity(),
341
- color: meshData.color,
342
- });
343
- }
344
- /**
345
- * Ensure all meshes have GPU resources (call after adding meshes if pipeline wasn't ready)
346
- */
347
- ensureMeshResources(pipeline) {
348
- if (!pipeline || !this.device.isInitialized())
349
- return;
350
- const device = this.device.getDevice();
351
- let created = 0;
352
- for (const mesh of this.scene.getMeshes()) {
353
- if (!mesh.uniformBuffer) {
354
- mesh.uniformBuffer = device.createBuffer({
355
- size: pipeline.getUniformBufferSize(),
356
- usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
357
- });
358
- mesh.bindGroup = device.createBindGroup({
359
- layout: pipeline.getBindGroupLayout(),
360
- entries: [
361
- {
362
- binding: 0,
363
- resource: { buffer: mesh.uniformBuffer },
364
- },
365
- ],
366
- });
367
- created++;
368
- }
369
- }
370
- if (created > 0) {
371
- const totalMeshCount = this.scene.getMeshes().length;
372
- // Only log every 250 meshes or when creating many at once to reduce noise
373
- if (totalMeshCount % 250 === 0 || created > 100) {
374
- console.log(`[Renderer] Created GPU resources for ${created} new meshes (${totalMeshCount} total)`);
375
- }
376
- }
377
- }
378
- /**
379
- * Fit camera to view all loaded geometry
380
- */
381
- fitToView(camera) {
382
- if (!this.modelBounds) {
383
- console.warn('[Renderer] fitToView called but no geometry loaded');
384
- return;
385
- }
386
- const { min, max } = this.modelBounds;
387
- // Calculate center and size
388
- const center = {
389
- x: (min.x + max.x) / 2,
390
- y: (min.y + max.y) / 2,
391
- z: (min.z + max.z) / 2
392
- };
393
- const size = Math.max(max.x - min.x, max.y - min.y, max.z - min.z);
394
- // Position camera to see entire model
395
- const distance = size * 1.5;
396
- camera.setPosition(center.x + distance * 0.5, center.y + distance * 0.5, center.z + distance);
397
- camera.setTarget(center.x, center.y, center.z);
398
- }
399
- }
400
- //# sourceMappingURL=geometry-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"geometry-manager.js","sourceRoot":"","sources":["../src/geometry-manager.ts"],"names":[],"mappings":"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"}