@ifc-lite/renderer 1.1.6 → 1.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/LICENSE +373 -0
- package/dist/bvh.d.ts +50 -0
- package/dist/bvh.d.ts.map +1 -0
- package/dist/bvh.js +177 -0
- package/dist/bvh.js.map +1 -0
- package/dist/camera.d.ts +17 -0
- package/dist/camera.d.ts.map +1 -1
- package/dist/camera.js +72 -6
- package/dist/camera.js.map +1 -1
- package/dist/index.d.ts +42 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +429 -87
- package/dist/index.js.map +1 -1
- package/dist/math.d.ts +30 -0
- package/dist/math.d.ts.map +1 -1
- package/dist/math.js +103 -0
- package/dist/math.js.map +1 -1
- package/dist/picker.js +2 -2
- package/dist/picker.js.map +1 -1
- package/dist/pipeline.d.ts +17 -0
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +347 -47
- package/dist/pipeline.js.map +1 -1
- package/dist/raycaster.d.ts +67 -0
- package/dist/raycaster.d.ts.map +1 -0
- package/dist/raycaster.js +192 -0
- package/dist/raycaster.js.map +1 -0
- package/dist/scene.d.ts +56 -2
- package/dist/scene.d.ts.map +1 -1
- package/dist/scene.js +362 -26
- package/dist/scene.js.map +1 -1
- package/dist/snap-detector.d.ts +73 -0
- package/dist/snap-detector.d.ts.map +1 -0
- package/dist/snap-detector.js +291 -0
- package/dist/snap-detector.js.map +1 -0
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/zero-copy-uploader.d.ts +145 -0
- package/dist/zero-copy-uploader.d.ts.map +1 -0
- package/dist/zero-copy-uploader.js +146 -0
- package/dist/zero-copy-uploader.js.map +1 -0
- package/package.json +11 -10
package/dist/scene.js
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { MathUtils } from './math.js';
|
|
4
5
|
export class Scene {
|
|
5
6
|
meshes = [];
|
|
6
7
|
instancedMeshes = [];
|
|
7
8
|
batchedMeshes = [];
|
|
8
9
|
batchedMeshMap = new Map(); // Map colorKey -> BatchedMesh
|
|
9
10
|
batchedMeshData = new Map(); // Map colorKey -> accumulated MeshData[]
|
|
10
|
-
meshDataMap = new Map(); // Map expressId -> MeshData (for lazy buffer creation)
|
|
11
|
+
meshDataMap = new Map(); // Map expressId -> MeshData[] (for lazy buffer creation, accumulates multiple pieces)
|
|
12
|
+
boundingBoxes = new Map(); // Map expressId -> bounding box (computed lazily)
|
|
13
|
+
// Streaming optimization: track pending batch rebuilds
|
|
14
|
+
pendingBatchKeys = new Set();
|
|
15
|
+
lastBatchRebuildTime = 0;
|
|
16
|
+
batchRebuildThrottleMs = 100; // Rebuild batches at most every 100ms during streaming
|
|
11
17
|
/**
|
|
12
18
|
* Add mesh to scene
|
|
13
19
|
*/
|
|
@@ -41,15 +47,63 @@ export class Scene {
|
|
|
41
47
|
/**
|
|
42
48
|
* Store MeshData for lazy GPU buffer creation (used for selection highlighting)
|
|
43
49
|
* This avoids creating 2x GPU buffers during streaming
|
|
50
|
+
* Accumulates multiple mesh pieces per expressId (elements can have multiple geometry pieces)
|
|
44
51
|
*/
|
|
45
52
|
addMeshData(meshData) {
|
|
46
|
-
this.meshDataMap.
|
|
53
|
+
const existing = this.meshDataMap.get(meshData.expressId);
|
|
54
|
+
if (existing) {
|
|
55
|
+
existing.push(meshData);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
this.meshDataMap.set(meshData.expressId, [meshData]);
|
|
59
|
+
}
|
|
47
60
|
}
|
|
48
61
|
/**
|
|
49
62
|
* Get MeshData by expressId (for lazy buffer creation)
|
|
63
|
+
* Returns merged MeshData if element has multiple pieces
|
|
50
64
|
*/
|
|
51
65
|
getMeshData(expressId) {
|
|
52
|
-
|
|
66
|
+
const pieces = this.meshDataMap.get(expressId);
|
|
67
|
+
if (!pieces || pieces.length === 0)
|
|
68
|
+
return undefined;
|
|
69
|
+
if (pieces.length === 1)
|
|
70
|
+
return pieces[0];
|
|
71
|
+
// Merge multiple pieces into one MeshData
|
|
72
|
+
// Calculate total sizes
|
|
73
|
+
let totalPositions = 0;
|
|
74
|
+
let totalIndices = 0;
|
|
75
|
+
for (const piece of pieces) {
|
|
76
|
+
totalPositions += piece.positions.length;
|
|
77
|
+
totalIndices += piece.indices.length;
|
|
78
|
+
}
|
|
79
|
+
// Create merged arrays
|
|
80
|
+
const mergedPositions = new Float32Array(totalPositions);
|
|
81
|
+
const mergedNormals = new Float32Array(totalPositions);
|
|
82
|
+
const mergedIndices = new Uint32Array(totalIndices);
|
|
83
|
+
let posOffset = 0;
|
|
84
|
+
let idxOffset = 0;
|
|
85
|
+
let vertexOffset = 0;
|
|
86
|
+
for (const piece of pieces) {
|
|
87
|
+
// Copy positions and normals
|
|
88
|
+
mergedPositions.set(piece.positions, posOffset);
|
|
89
|
+
mergedNormals.set(piece.normals, posOffset);
|
|
90
|
+
// Copy indices with offset
|
|
91
|
+
for (let i = 0; i < piece.indices.length; i++) {
|
|
92
|
+
mergedIndices[idxOffset + i] = piece.indices[i] + vertexOffset;
|
|
93
|
+
}
|
|
94
|
+
posOffset += piece.positions.length;
|
|
95
|
+
idxOffset += piece.indices.length;
|
|
96
|
+
vertexOffset += piece.positions.length / 3;
|
|
97
|
+
}
|
|
98
|
+
// Return merged MeshData (use first piece's metadata)
|
|
99
|
+
return {
|
|
100
|
+
expressId,
|
|
101
|
+
positions: mergedPositions,
|
|
102
|
+
normals: mergedNormals,
|
|
103
|
+
indices: mergedIndices,
|
|
104
|
+
color: pieces[0].color,
|
|
105
|
+
ifcType: pieces[0].ifcType,
|
|
106
|
+
};
|
|
53
107
|
}
|
|
54
108
|
/**
|
|
55
109
|
* Check if MeshData exists for an expressId
|
|
@@ -57,6 +111,12 @@ export class Scene {
|
|
|
57
111
|
hasMeshData(expressId) {
|
|
58
112
|
return this.meshDataMap.has(expressId);
|
|
59
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* Get all MeshData pieces for an expressId (without merging)
|
|
116
|
+
*/
|
|
117
|
+
getMeshDataPieces(expressId) {
|
|
118
|
+
return this.meshDataMap.get(expressId);
|
|
119
|
+
}
|
|
60
120
|
/**
|
|
61
121
|
* Generate color key for grouping meshes
|
|
62
122
|
*/
|
|
@@ -71,8 +131,13 @@ export class Scene {
|
|
|
71
131
|
/**
|
|
72
132
|
* Append meshes to color batches incrementally
|
|
73
133
|
* Merges new meshes into existing color groups or creates new ones
|
|
134
|
+
*
|
|
135
|
+
* OPTIMIZATION: Throttles batch rebuilding during streaming to avoid O(N²) cost
|
|
136
|
+
* - Mesh data is accumulated immediately (fast)
|
|
137
|
+
* - GPU buffers are rebuilt at most every batchRebuildThrottleMs (expensive)
|
|
74
138
|
*/
|
|
75
|
-
appendToBatches(meshDataArray, device, pipeline) {
|
|
139
|
+
appendToBatches(meshDataArray, device, pipeline, isStreaming = false) {
|
|
140
|
+
// Track which color keys received new data in THIS call
|
|
76
141
|
for (const meshData of meshDataArray) {
|
|
77
142
|
const key = this.colorKey(meshData.color);
|
|
78
143
|
// Accumulate mesh data for this color
|
|
@@ -80,10 +145,32 @@ export class Scene {
|
|
|
80
145
|
this.batchedMeshData.set(key, []);
|
|
81
146
|
}
|
|
82
147
|
this.batchedMeshData.get(key).push(meshData);
|
|
148
|
+
this.pendingBatchKeys.add(key);
|
|
149
|
+
// Also store individual mesh data for visibility filtering
|
|
150
|
+
// This allows individual meshes to be created lazily when needed
|
|
151
|
+
this.addMeshData(meshData);
|
|
83
152
|
}
|
|
84
|
-
//
|
|
85
|
-
// This
|
|
86
|
-
|
|
153
|
+
// During streaming, throttle batch rebuilding to reduce O(N²) cost
|
|
154
|
+
// This allows mesh data to accumulate before expensive buffer recreation
|
|
155
|
+
const now = performance.now();
|
|
156
|
+
const timeSinceLastRebuild = now - this.lastBatchRebuildTime;
|
|
157
|
+
if (isStreaming && timeSinceLastRebuild < this.batchRebuildThrottleMs) {
|
|
158
|
+
// Skip rebuild - data is accumulated, will be rebuilt later
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
// Rebuild pending batches
|
|
162
|
+
this.rebuildPendingBatches(device, pipeline);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Rebuild all pending batches (call this after streaming completes)
|
|
166
|
+
*/
|
|
167
|
+
rebuildPendingBatches(device, pipeline) {
|
|
168
|
+
if (this.pendingBatchKeys.size === 0)
|
|
169
|
+
return;
|
|
170
|
+
for (const key of this.pendingBatchKeys) {
|
|
171
|
+
const meshDataForKey = this.batchedMeshData.get(key);
|
|
172
|
+
if (!meshDataForKey || meshDataForKey.length === 0)
|
|
173
|
+
continue;
|
|
87
174
|
const existingBatch = this.batchedMeshMap.get(key);
|
|
88
175
|
if (existingBatch) {
|
|
89
176
|
// Destroy old batch buffers
|
|
@@ -93,9 +180,9 @@ export class Scene {
|
|
|
93
180
|
existingBatch.uniformBuffer.destroy();
|
|
94
181
|
}
|
|
95
182
|
}
|
|
96
|
-
// Create new batch with all accumulated meshes
|
|
97
|
-
const color =
|
|
98
|
-
const batchedMesh = this.createBatchedMesh(
|
|
183
|
+
// Create new batch with all accumulated meshes for this color
|
|
184
|
+
const color = meshDataForKey[0].color;
|
|
185
|
+
const batchedMesh = this.createBatchedMesh(meshDataForKey, color, device, pipeline);
|
|
99
186
|
this.batchedMeshMap.set(key, batchedMesh);
|
|
100
187
|
// Update array if batch already exists, otherwise add new
|
|
101
188
|
const index = this.batchedMeshes.findIndex(b => b.colorKey === key);
|
|
@@ -106,6 +193,87 @@ export class Scene {
|
|
|
106
193
|
this.batchedMeshes.push(batchedMesh);
|
|
107
194
|
}
|
|
108
195
|
}
|
|
196
|
+
this.pendingBatchKeys.clear();
|
|
197
|
+
this.lastBatchRebuildTime = performance.now();
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Check if there are pending batch rebuilds
|
|
201
|
+
*/
|
|
202
|
+
hasPendingBatches() {
|
|
203
|
+
return this.pendingBatchKeys.size > 0;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Update colors for existing meshes and rebuild affected batches
|
|
207
|
+
* Call this when deferred color parsing completes
|
|
208
|
+
*/
|
|
209
|
+
updateMeshColors(updates, device, pipeline) {
|
|
210
|
+
if (updates.size === 0)
|
|
211
|
+
return;
|
|
212
|
+
const affectedOldKeys = new Set();
|
|
213
|
+
const affectedNewKeys = new Set();
|
|
214
|
+
// Update colors in meshDataMap and track affected batches
|
|
215
|
+
for (const [expressId, newColor] of updates) {
|
|
216
|
+
const meshDataList = this.meshDataMap.get(expressId);
|
|
217
|
+
if (!meshDataList)
|
|
218
|
+
continue;
|
|
219
|
+
for (const meshData of meshDataList) {
|
|
220
|
+
const oldKey = this.colorKey(meshData.color);
|
|
221
|
+
const newKey = this.colorKey(newColor);
|
|
222
|
+
if (oldKey !== newKey) {
|
|
223
|
+
affectedOldKeys.add(oldKey);
|
|
224
|
+
affectedNewKeys.add(newKey);
|
|
225
|
+
// Remove from old color batch data
|
|
226
|
+
const oldBatchData = this.batchedMeshData.get(oldKey);
|
|
227
|
+
if (oldBatchData) {
|
|
228
|
+
const idx = oldBatchData.indexOf(meshData);
|
|
229
|
+
if (idx >= 0) {
|
|
230
|
+
oldBatchData.splice(idx, 1);
|
|
231
|
+
}
|
|
232
|
+
// Clean up empty batch data
|
|
233
|
+
if (oldBatchData.length === 0) {
|
|
234
|
+
this.batchedMeshData.delete(oldKey);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// Update mesh color
|
|
238
|
+
meshData.color = newColor;
|
|
239
|
+
// Add to new color batch data
|
|
240
|
+
if (!this.batchedMeshData.has(newKey)) {
|
|
241
|
+
this.batchedMeshData.set(newKey, []);
|
|
242
|
+
}
|
|
243
|
+
this.batchedMeshData.get(newKey).push(meshData);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// Mark affected batches for rebuild
|
|
248
|
+
for (const key of affectedOldKeys) {
|
|
249
|
+
this.pendingBatchKeys.add(key);
|
|
250
|
+
}
|
|
251
|
+
for (const key of affectedNewKeys) {
|
|
252
|
+
this.pendingBatchKeys.add(key);
|
|
253
|
+
}
|
|
254
|
+
// Rebuild affected batches
|
|
255
|
+
if (this.pendingBatchKeys.size > 0) {
|
|
256
|
+
this.rebuildPendingBatches(device, pipeline);
|
|
257
|
+
// Remove empty batches
|
|
258
|
+
for (const key of affectedOldKeys) {
|
|
259
|
+
const batchData = this.batchedMeshData.get(key);
|
|
260
|
+
if (!batchData || batchData.length === 0) {
|
|
261
|
+
const batch = this.batchedMeshMap.get(key);
|
|
262
|
+
if (batch) {
|
|
263
|
+
batch.vertexBuffer.destroy();
|
|
264
|
+
batch.indexBuffer.destroy();
|
|
265
|
+
if (batch.uniformBuffer) {
|
|
266
|
+
batch.uniformBuffer.destroy();
|
|
267
|
+
}
|
|
268
|
+
this.batchedMeshMap.delete(key);
|
|
269
|
+
const idx = this.batchedMeshes.findIndex(b => b.colorKey === key);
|
|
270
|
+
if (idx >= 0) {
|
|
271
|
+
this.batchedMeshes.splice(idx, 1);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
109
277
|
}
|
|
110
278
|
/**
|
|
111
279
|
* Create a new batched mesh from mesh data array
|
|
@@ -153,6 +321,8 @@ export class Scene {
|
|
|
153
321
|
}
|
|
154
322
|
/**
|
|
155
323
|
* Merge multiple mesh geometries into single vertex/index buffers
|
|
324
|
+
*
|
|
325
|
+
* OPTIMIZATION: Uses efficient loops and bulk index adjustment
|
|
156
326
|
*/
|
|
157
327
|
mergeGeometry(meshDataArray) {
|
|
158
328
|
let totalVertices = 0;
|
|
@@ -165,29 +335,33 @@ export class Scene {
|
|
|
165
335
|
// Create merged buffers
|
|
166
336
|
const vertexData = new Float32Array(totalVertices * 6); // 6 floats per vertex (pos + normal)
|
|
167
337
|
const indices = new Uint32Array(totalIndices);
|
|
168
|
-
let vertexOffset = 0;
|
|
169
338
|
let indexOffset = 0;
|
|
170
339
|
let vertexBase = 0;
|
|
171
340
|
for (const mesh of meshDataArray) {
|
|
172
|
-
const
|
|
173
|
-
|
|
341
|
+
const positions = mesh.positions;
|
|
342
|
+
const normals = mesh.normals;
|
|
343
|
+
const vertexCount = positions.length / 3;
|
|
344
|
+
// Interleave vertex data (position + normal)
|
|
345
|
+
// This loop is O(n) per mesh and unavoidable for interleaving
|
|
346
|
+
let outIdx = vertexBase * 6;
|
|
174
347
|
for (let i = 0; i < vertexCount; i++) {
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
vertexData[
|
|
179
|
-
vertexData[
|
|
180
|
-
vertexData[
|
|
181
|
-
vertexData[
|
|
182
|
-
vertexData[base + 4] = mesh.normals[normBase + 1];
|
|
183
|
-
vertexData[base + 5] = mesh.normals[normBase + 2];
|
|
348
|
+
const srcIdx = i * 3;
|
|
349
|
+
vertexData[outIdx++] = positions[srcIdx];
|
|
350
|
+
vertexData[outIdx++] = positions[srcIdx + 1];
|
|
351
|
+
vertexData[outIdx++] = positions[srcIdx + 2];
|
|
352
|
+
vertexData[outIdx++] = normals[srcIdx];
|
|
353
|
+
vertexData[outIdx++] = normals[srcIdx + 1];
|
|
354
|
+
vertexData[outIdx++] = normals[srcIdx + 2];
|
|
184
355
|
}
|
|
185
|
-
// Copy indices with offset
|
|
186
|
-
|
|
187
|
-
|
|
356
|
+
// Copy indices with vertex base offset
|
|
357
|
+
// Use subarray for slightly better cache locality
|
|
358
|
+
const meshIndices = mesh.indices;
|
|
359
|
+
const indexCount = meshIndices.length;
|
|
360
|
+
for (let i = 0; i < indexCount; i++) {
|
|
361
|
+
indices[indexOffset + i] = meshIndices[i] + vertexBase;
|
|
188
362
|
}
|
|
189
363
|
vertexBase += vertexCount;
|
|
190
|
-
indexOffset +=
|
|
364
|
+
indexOffset += indexCount;
|
|
191
365
|
}
|
|
192
366
|
return { vertexData, indices };
|
|
193
367
|
}
|
|
@@ -235,6 +409,9 @@ export class Scene {
|
|
|
235
409
|
this.batchedMeshMap.clear();
|
|
236
410
|
this.batchedMeshData.clear();
|
|
237
411
|
this.meshDataMap.clear();
|
|
412
|
+
this.boundingBoxes.clear();
|
|
413
|
+
this.pendingBatchKeys.clear();
|
|
414
|
+
this.lastBatchRebuildTime = 0;
|
|
238
415
|
}
|
|
239
416
|
/**
|
|
240
417
|
* Calculate bounding box
|
|
@@ -249,5 +426,164 @@ export class Scene {
|
|
|
249
426
|
max: { x: 10, y: 10, z: 10 },
|
|
250
427
|
};
|
|
251
428
|
}
|
|
429
|
+
/**
|
|
430
|
+
* Get all expressIds that have mesh data (for CPU raycasting)
|
|
431
|
+
*/
|
|
432
|
+
getAllMeshDataExpressIds() {
|
|
433
|
+
return Array.from(this.meshDataMap.keys());
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Get or compute bounding box for a mesh
|
|
437
|
+
*/
|
|
438
|
+
getBoundingBox(expressId) {
|
|
439
|
+
// Check cache first
|
|
440
|
+
const cached = this.boundingBoxes.get(expressId);
|
|
441
|
+
if (cached)
|
|
442
|
+
return cached;
|
|
443
|
+
// Compute from mesh data
|
|
444
|
+
const pieces = this.meshDataMap.get(expressId);
|
|
445
|
+
if (!pieces || pieces.length === 0)
|
|
446
|
+
return null;
|
|
447
|
+
let minX = Infinity, minY = Infinity, minZ = Infinity;
|
|
448
|
+
let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
449
|
+
for (const piece of pieces) {
|
|
450
|
+
const positions = piece.positions;
|
|
451
|
+
for (let i = 0; i < positions.length; i += 3) {
|
|
452
|
+
const x = positions[i];
|
|
453
|
+
const y = positions[i + 1];
|
|
454
|
+
const z = positions[i + 2];
|
|
455
|
+
if (x < minX)
|
|
456
|
+
minX = x;
|
|
457
|
+
if (y < minY)
|
|
458
|
+
minY = y;
|
|
459
|
+
if (z < minZ)
|
|
460
|
+
minZ = z;
|
|
461
|
+
if (x > maxX)
|
|
462
|
+
maxX = x;
|
|
463
|
+
if (y > maxY)
|
|
464
|
+
maxY = y;
|
|
465
|
+
if (z > maxZ)
|
|
466
|
+
maxZ = z;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
const bbox = {
|
|
470
|
+
min: { x: minX, y: minY, z: minZ },
|
|
471
|
+
max: { x: maxX, y: maxY, z: maxZ },
|
|
472
|
+
};
|
|
473
|
+
this.boundingBoxes.set(expressId, bbox);
|
|
474
|
+
return bbox;
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Ray-box intersection test (slab method)
|
|
478
|
+
*/
|
|
479
|
+
rayIntersectsBox(rayOrigin, rayDirInv, // 1/rayDir for efficiency
|
|
480
|
+
rayDirSign, box) {
|
|
481
|
+
const bounds = [box.min, box.max];
|
|
482
|
+
let tmin = (bounds[rayDirSign[0]].x - rayOrigin.x) * rayDirInv.x;
|
|
483
|
+
let tmax = (bounds[1 - rayDirSign[0]].x - rayOrigin.x) * rayDirInv.x;
|
|
484
|
+
const tymin = (bounds[rayDirSign[1]].y - rayOrigin.y) * rayDirInv.y;
|
|
485
|
+
const tymax = (bounds[1 - rayDirSign[1]].y - rayOrigin.y) * rayDirInv.y;
|
|
486
|
+
if (tmin > tymax || tymin > tmax)
|
|
487
|
+
return false;
|
|
488
|
+
if (tymin > tmin)
|
|
489
|
+
tmin = tymin;
|
|
490
|
+
if (tymax < tmax)
|
|
491
|
+
tmax = tymax;
|
|
492
|
+
const tzmin = (bounds[rayDirSign[2]].z - rayOrigin.z) * rayDirInv.z;
|
|
493
|
+
const tzmax = (bounds[1 - rayDirSign[2]].z - rayOrigin.z) * rayDirInv.z;
|
|
494
|
+
if (tmin > tzmax || tzmin > tmax)
|
|
495
|
+
return false;
|
|
496
|
+
if (tzmin > tmin)
|
|
497
|
+
tmin = tzmin;
|
|
498
|
+
if (tzmax < tmax)
|
|
499
|
+
tmax = tzmax;
|
|
500
|
+
return tmax >= 0;
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Möller–Trumbore ray-triangle intersection
|
|
504
|
+
* Returns distance to intersection or null if no hit
|
|
505
|
+
*/
|
|
506
|
+
rayTriangleIntersect(rayOrigin, rayDir, v0, v1, v2) {
|
|
507
|
+
const EPSILON = 1e-7;
|
|
508
|
+
const edge1 = MathUtils.subtract(v1, v0);
|
|
509
|
+
const edge2 = MathUtils.subtract(v2, v0);
|
|
510
|
+
const h = MathUtils.cross(rayDir, edge2);
|
|
511
|
+
const a = MathUtils.dot(edge1, h);
|
|
512
|
+
if (a > -EPSILON && a < EPSILON)
|
|
513
|
+
return null; // Ray parallel to triangle
|
|
514
|
+
const f = 1.0 / a;
|
|
515
|
+
const s = MathUtils.subtract(rayOrigin, v0);
|
|
516
|
+
const u = f * MathUtils.dot(s, h);
|
|
517
|
+
if (u < 0.0 || u > 1.0)
|
|
518
|
+
return null;
|
|
519
|
+
const q = MathUtils.cross(s, edge1);
|
|
520
|
+
const v = f * MathUtils.dot(rayDir, q);
|
|
521
|
+
if (v < 0.0 || u + v > 1.0)
|
|
522
|
+
return null;
|
|
523
|
+
const t = f * MathUtils.dot(edge2, q);
|
|
524
|
+
if (t > EPSILON)
|
|
525
|
+
return t; // Ray intersection
|
|
526
|
+
return null;
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* CPU raycast against all mesh data
|
|
530
|
+
* Returns expressId of closest hit or null
|
|
531
|
+
*/
|
|
532
|
+
raycast(rayOrigin, rayDir, hiddenIds, isolatedIds) {
|
|
533
|
+
// Precompute ray direction inverse and signs for box tests
|
|
534
|
+
const rayDirInv = {
|
|
535
|
+
x: rayDir.x !== 0 ? 1.0 / rayDir.x : Infinity,
|
|
536
|
+
y: rayDir.y !== 0 ? 1.0 / rayDir.y : Infinity,
|
|
537
|
+
z: rayDir.z !== 0 ? 1.0 / rayDir.z : Infinity,
|
|
538
|
+
};
|
|
539
|
+
const rayDirSign = [
|
|
540
|
+
rayDirInv.x < 0 ? 1 : 0,
|
|
541
|
+
rayDirInv.y < 0 ? 1 : 0,
|
|
542
|
+
rayDirInv.z < 0 ? 1 : 0,
|
|
543
|
+
];
|
|
544
|
+
let closestHit = null;
|
|
545
|
+
let closestDistance = Infinity;
|
|
546
|
+
// First pass: filter by bounding box (fast)
|
|
547
|
+
const candidates = [];
|
|
548
|
+
for (const expressId of this.meshDataMap.keys()) {
|
|
549
|
+
// Skip hidden elements
|
|
550
|
+
if (hiddenIds?.has(expressId))
|
|
551
|
+
continue;
|
|
552
|
+
// Skip non-isolated elements if isolation is active
|
|
553
|
+
if (isolatedIds !== null && isolatedIds !== undefined && !isolatedIds.has(expressId))
|
|
554
|
+
continue;
|
|
555
|
+
const bbox = this.getBoundingBox(expressId);
|
|
556
|
+
if (!bbox)
|
|
557
|
+
continue;
|
|
558
|
+
if (this.rayIntersectsBox(rayOrigin, rayDirInv, rayDirSign, bbox)) {
|
|
559
|
+
candidates.push(expressId);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
// Second pass: test triangles for candidates (accurate)
|
|
563
|
+
for (const expressId of candidates) {
|
|
564
|
+
const pieces = this.meshDataMap.get(expressId);
|
|
565
|
+
if (!pieces)
|
|
566
|
+
continue;
|
|
567
|
+
for (const piece of pieces) {
|
|
568
|
+
const positions = piece.positions;
|
|
569
|
+
const indices = piece.indices;
|
|
570
|
+
// Test each triangle
|
|
571
|
+
for (let i = 0; i < indices.length; i += 3) {
|
|
572
|
+
const i0 = indices[i] * 3;
|
|
573
|
+
const i1 = indices[i + 1] * 3;
|
|
574
|
+
const i2 = indices[i + 2] * 3;
|
|
575
|
+
const v0 = { x: positions[i0], y: positions[i0 + 1], z: positions[i0 + 2] };
|
|
576
|
+
const v1 = { x: positions[i1], y: positions[i1 + 1], z: positions[i1 + 2] };
|
|
577
|
+
const v2 = { x: positions[i2], y: positions[i2 + 1], z: positions[i2 + 2] };
|
|
578
|
+
const t = this.rayTriangleIntersect(rayOrigin, rayDir, v0, v1, v2);
|
|
579
|
+
if (t !== null && t < closestDistance) {
|
|
580
|
+
closestDistance = t;
|
|
581
|
+
closestHit = { expressId, distance: t };
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
return closestHit;
|
|
587
|
+
}
|
|
252
588
|
}
|
|
253
589
|
//# sourceMappingURL=scene.js.map
|
package/dist/scene.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene.js","sourceRoot":"","sources":["../src/scene.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scene.js","sourceRoot":"","sources":["../src/scene.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { MeshData } from '@ifc-lite/geometry';
|
|
2
|
+
import type { Ray, Vec3, Intersection } from './raycaster';
|
|
3
|
+
export declare enum SnapType {
|
|
4
|
+
VERTEX = "vertex",
|
|
5
|
+
EDGE = "edge",
|
|
6
|
+
EDGE_MIDPOINT = "edge_midpoint",
|
|
7
|
+
FACE = "face",
|
|
8
|
+
FACE_CENTER = "face_center"
|
|
9
|
+
}
|
|
10
|
+
export interface SnapTarget {
|
|
11
|
+
type: SnapType;
|
|
12
|
+
position: Vec3;
|
|
13
|
+
normal?: Vec3;
|
|
14
|
+
expressId: number;
|
|
15
|
+
confidence: number;
|
|
16
|
+
metadata?: {
|
|
17
|
+
vertices?: Vec3[];
|
|
18
|
+
edgeIndex?: number;
|
|
19
|
+
faceIndex?: number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export interface SnapOptions {
|
|
23
|
+
snapToVertices: boolean;
|
|
24
|
+
snapToEdges: boolean;
|
|
25
|
+
snapToFaces: boolean;
|
|
26
|
+
snapRadius: number;
|
|
27
|
+
screenSnapRadius: number;
|
|
28
|
+
}
|
|
29
|
+
export declare class SnapDetector {
|
|
30
|
+
private raycaster;
|
|
31
|
+
private defaultOptions;
|
|
32
|
+
private geometryCache;
|
|
33
|
+
/**
|
|
34
|
+
* Detect best snap target near cursor
|
|
35
|
+
*/
|
|
36
|
+
detectSnapTarget(ray: Ray, meshes: MeshData[], intersection: Intersection | null, camera: {
|
|
37
|
+
position: Vec3;
|
|
38
|
+
fov: number;
|
|
39
|
+
}, screenHeight: number, options?: Partial<SnapOptions>): SnapTarget | null;
|
|
40
|
+
/**
|
|
41
|
+
* Get or compute geometry cache for a mesh
|
|
42
|
+
*/
|
|
43
|
+
private getGeometryCache;
|
|
44
|
+
/**
|
|
45
|
+
* Find vertices near point
|
|
46
|
+
*/
|
|
47
|
+
private findVertices;
|
|
48
|
+
/**
|
|
49
|
+
* Find edges near point
|
|
50
|
+
*/
|
|
51
|
+
private findEdges;
|
|
52
|
+
/**
|
|
53
|
+
* Clear geometry cache (call when meshes change)
|
|
54
|
+
*/
|
|
55
|
+
clearCache(): void;
|
|
56
|
+
/**
|
|
57
|
+
* Find faces/planes near intersection
|
|
58
|
+
*/
|
|
59
|
+
private findFaces;
|
|
60
|
+
/**
|
|
61
|
+
* Select best snap target based on confidence and priority
|
|
62
|
+
*/
|
|
63
|
+
private getBestSnapTarget;
|
|
64
|
+
/**
|
|
65
|
+
* Convert screen-space radius to world-space radius
|
|
66
|
+
*/
|
|
67
|
+
private screenToWorldRadius;
|
|
68
|
+
/**
|
|
69
|
+
* Vector utilities
|
|
70
|
+
*/
|
|
71
|
+
private distance;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=snap-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snap-detector.d.ts","sourceRoot":"","sources":["../src/snap-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3D,oBAAY,QAAQ;IAClB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,aAAa,kBAAkB;IAC/B,IAAI,SAAS;IACb,WAAW,gBAAgB;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,IAAI,CAAC;IACf,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAOD,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,cAAc,CAMpB;IAGF,OAAO,CAAC,aAAa,CAAwC;IAE7D;;OAEG;IACH,gBAAgB,CACd,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,QAAQ,EAAE,EAClB,YAAY,EAAE,YAAY,GAAG,IAAI,EACjC,MAAM,EAAE;QAAE,QAAQ,EAAE,IAAI,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EACvC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,OAAO,CAAC,WAAW,CAAM,GACjC,UAAU,GAAG,IAAI;IA0CpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoFxB;;OAEG;IACH,OAAO,CAAC,YAAY;IAqBpB;;OAEG;IACH,OAAO,CAAC,SAAS;IA+CjB;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,OAAO,CAAC,SAAS;IA6DjB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsBzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAc3B;;OAEG;IACH,OAAO,CAAC,QAAQ;CAMjB"}
|