@ifc-lite/geometry 1.0.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/buffer-builder.d.ts +21 -0
- package/dist/buffer-builder.d.ts.map +1 -0
- package/dist/buffer-builder.js +44 -0
- package/dist/buffer-builder.js.map +1 -0
- package/dist/coordinate-handler.d.ts +91 -0
- package/dist/coordinate-handler.d.ts.map +1 -0
- package/dist/coordinate-handler.js +324 -0
- package/dist/coordinate-handler.js.map +1 -0
- package/dist/default-materials.d.ts +22 -0
- package/dist/default-materials.d.ts.map +1 -0
- package/dist/default-materials.js +113 -0
- package/dist/default-materials.js.map +1 -0
- package/dist/geometry.worker.d.ts +2 -0
- package/dist/geometry.worker.d.ts.map +1 -0
- package/dist/geometry.worker.js +118 -0
- package/dist/geometry.worker.js.map +1 -0
- package/dist/ifc-lite-bridge.d.ts +32 -0
- package/dist/ifc-lite-bridge.d.ts.map +1 -0
- package/dist/ifc-lite-bridge.js +58 -0
- package/dist/ifc-lite-bridge.js.map +1 -0
- package/dist/ifc-lite-mesh-collector.d.ts +28 -0
- package/dist/ifc-lite-mesh-collector.d.ts.map +1 -0
- package/dist/ifc-lite-mesh-collector.js +131 -0
- package/dist/ifc-lite-mesh-collector.js.map +1 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +172 -0
- package/dist/index.js.map +1 -0
- package/dist/lod.d.ts +60 -0
- package/dist/lod.d.ts.map +1 -0
- package/dist/lod.js +113 -0
- package/dist/lod.js.map +1 -0
- package/dist/progressive-loader.d.ts +48 -0
- package/dist/progressive-loader.d.ts.map +1 -0
- package/dist/progressive-loader.js +143 -0
- package/dist/progressive-loader.js.map +1 -0
- package/dist/style-cache.d.ts +36 -0
- package/dist/style-cache.d.ts.map +1 -0
- package/dist/style-cache.js +127 -0
- package/dist/style-cache.js.map +1 -0
- package/dist/types.d.ts +32 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/worker-pool.d.ts +56 -0
- package/dist/worker-pool.d.ts.map +1 -0
- package/dist/worker-pool.js +160 -0
- package/dist/worker-pool.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,324 @@
|
|
|
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 CoordinateHandler {
|
|
5
|
+
originShift = { x: 0, y: 0, z: 0 };
|
|
6
|
+
THRESHOLD = 10000; // 10km - threshold for large coordinates
|
|
7
|
+
// Maximum reasonable coordinate - 10,000 km covers any georeferenced building on Earth
|
|
8
|
+
// Values beyond this are garbage/corrupted data (safety net)
|
|
9
|
+
MAX_REASONABLE_COORD = 1e7;
|
|
10
|
+
// For incremental processing
|
|
11
|
+
accumulatedBounds = null;
|
|
12
|
+
shiftCalculated = false;
|
|
13
|
+
/**
|
|
14
|
+
* Check if a coordinate value is reasonable (not corrupted garbage)
|
|
15
|
+
*/
|
|
16
|
+
isReasonableValue(value) {
|
|
17
|
+
return Number.isFinite(value) && Math.abs(value) < this.MAX_REASONABLE_COORD;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Calculate bounding box from all meshes (filtering out corrupted values)
|
|
21
|
+
*/
|
|
22
|
+
calculateBounds(meshes) {
|
|
23
|
+
const bounds = {
|
|
24
|
+
min: { x: Infinity, y: Infinity, z: Infinity },
|
|
25
|
+
max: { x: -Infinity, y: -Infinity, z: -Infinity },
|
|
26
|
+
};
|
|
27
|
+
let validVertexCount = 0;
|
|
28
|
+
let corruptedVertexCount = 0;
|
|
29
|
+
for (const mesh of meshes) {
|
|
30
|
+
const positions = mesh.positions;
|
|
31
|
+
for (let i = 0; i < positions.length; i += 3) {
|
|
32
|
+
const x = positions[i];
|
|
33
|
+
const y = positions[i + 1];
|
|
34
|
+
const z = positions[i + 2];
|
|
35
|
+
// Only include reasonable values (filter out corrupted garbage)
|
|
36
|
+
if (this.isReasonableValue(x) && this.isReasonableValue(y) && this.isReasonableValue(z)) {
|
|
37
|
+
bounds.min.x = Math.min(bounds.min.x, x);
|
|
38
|
+
bounds.min.y = Math.min(bounds.min.y, y);
|
|
39
|
+
bounds.min.z = Math.min(bounds.min.z, z);
|
|
40
|
+
bounds.max.x = Math.max(bounds.max.x, x);
|
|
41
|
+
bounds.max.y = Math.max(bounds.max.y, y);
|
|
42
|
+
bounds.max.z = Math.max(bounds.max.z, z);
|
|
43
|
+
validVertexCount++;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
corruptedVertexCount++;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (corruptedVertexCount > 0) {
|
|
51
|
+
console.log(`[CoordinateHandler] Filtered ${corruptedVertexCount} corrupted vertices, kept ${validVertexCount} valid`);
|
|
52
|
+
}
|
|
53
|
+
return bounds;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Check if coordinate shift is needed
|
|
57
|
+
*/
|
|
58
|
+
needsShift(bounds) {
|
|
59
|
+
const maxCoord = Math.max(Math.abs(bounds.min.x), Math.abs(bounds.max.x), Math.abs(bounds.min.y), Math.abs(bounds.max.y), Math.abs(bounds.min.z), Math.abs(bounds.max.z));
|
|
60
|
+
return maxCoord > this.THRESHOLD;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Calculate centroid (center point) from bounds
|
|
64
|
+
*/
|
|
65
|
+
calculateCentroid(bounds) {
|
|
66
|
+
return {
|
|
67
|
+
x: (bounds.min.x + bounds.max.x) / 2,
|
|
68
|
+
y: (bounds.min.y + bounds.max.y) / 2,
|
|
69
|
+
z: (bounds.min.z + bounds.max.z) / 2,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Shift positions in-place by subtracting origin shift
|
|
74
|
+
* Corrupted values are set to 0 (center of shifted coordinate system)
|
|
75
|
+
*/
|
|
76
|
+
shiftPositions(positions, shift) {
|
|
77
|
+
for (let i = 0; i < positions.length; i += 3) {
|
|
78
|
+
const x = positions[i];
|
|
79
|
+
const y = positions[i + 1];
|
|
80
|
+
const z = positions[i + 2];
|
|
81
|
+
// For corrupted values, set to center (0) in shifted space
|
|
82
|
+
if (this.isReasonableValue(x) && this.isReasonableValue(y) && this.isReasonableValue(z)) {
|
|
83
|
+
positions[i] = x - shift.x;
|
|
84
|
+
positions[i + 1] = y - shift.y;
|
|
85
|
+
positions[i + 2] = z - shift.z;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// Corrupted vertex - set to origin to avoid visual artifacts
|
|
89
|
+
positions[i] = 0;
|
|
90
|
+
positions[i + 1] = 0;
|
|
91
|
+
positions[i + 2] = 0;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Shift bounds by subtracting origin shift
|
|
97
|
+
*/
|
|
98
|
+
shiftBounds(bounds, shift) {
|
|
99
|
+
return {
|
|
100
|
+
min: {
|
|
101
|
+
x: bounds.min.x - shift.x,
|
|
102
|
+
y: bounds.min.y - shift.y,
|
|
103
|
+
z: bounds.min.z - shift.z,
|
|
104
|
+
},
|
|
105
|
+
max: {
|
|
106
|
+
x: bounds.max.x - shift.x,
|
|
107
|
+
y: bounds.max.y - shift.y,
|
|
108
|
+
z: bounds.max.z - shift.z,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Process meshes: detect large coordinates and shift if needed
|
|
114
|
+
*/
|
|
115
|
+
processMeshes(meshes) {
|
|
116
|
+
const emptyResult = {
|
|
117
|
+
originShift: { x: 0, y: 0, z: 0 },
|
|
118
|
+
originalBounds: {
|
|
119
|
+
min: { x: 0, y: 0, z: 0 },
|
|
120
|
+
max: { x: 0, y: 0, z: 0 },
|
|
121
|
+
},
|
|
122
|
+
shiftedBounds: {
|
|
123
|
+
min: { x: 0, y: 0, z: 0 },
|
|
124
|
+
max: { x: 0, y: 0, z: 0 },
|
|
125
|
+
},
|
|
126
|
+
isGeoReferenced: false,
|
|
127
|
+
};
|
|
128
|
+
if (meshes.length === 0) {
|
|
129
|
+
return emptyResult;
|
|
130
|
+
}
|
|
131
|
+
// Calculate original bounds (filtering corrupted values)
|
|
132
|
+
const originalBounds = this.calculateBounds(meshes);
|
|
133
|
+
// Check if we got valid bounds
|
|
134
|
+
const hasValidBounds = originalBounds.min.x !== Infinity && originalBounds.max.x !== -Infinity;
|
|
135
|
+
if (!hasValidBounds) {
|
|
136
|
+
console.warn('[CoordinateHandler] No valid coordinates found in geometry');
|
|
137
|
+
return emptyResult;
|
|
138
|
+
}
|
|
139
|
+
const size = {
|
|
140
|
+
x: originalBounds.max.x - originalBounds.min.x,
|
|
141
|
+
y: originalBounds.max.y - originalBounds.min.y,
|
|
142
|
+
z: originalBounds.max.z - originalBounds.min.z,
|
|
143
|
+
};
|
|
144
|
+
const maxSize = Math.max(size.x, size.y, size.z);
|
|
145
|
+
console.log('[CoordinateHandler] Original bounds:', {
|
|
146
|
+
min: originalBounds.min,
|
|
147
|
+
max: originalBounds.max,
|
|
148
|
+
size,
|
|
149
|
+
maxSize: maxSize.toFixed(2) + 'm',
|
|
150
|
+
});
|
|
151
|
+
// Check if shift is needed (>10km from origin)
|
|
152
|
+
const needsShift = this.needsShift(originalBounds);
|
|
153
|
+
if (!needsShift) {
|
|
154
|
+
// No shift needed - just clean up corrupted values in-place
|
|
155
|
+
console.log('[CoordinateHandler] Coordinates within normal range, no shift needed');
|
|
156
|
+
// Still shift by 0 to clean up corrupted vertices
|
|
157
|
+
const zeroShift = { x: 0, y: 0, z: 0 };
|
|
158
|
+
for (const mesh of meshes) {
|
|
159
|
+
this.shiftPositions(mesh.positions, zeroShift);
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
originShift: zeroShift,
|
|
163
|
+
originalBounds,
|
|
164
|
+
shiftedBounds: originalBounds,
|
|
165
|
+
isGeoReferenced: false,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
// Calculate centroid as origin shift
|
|
169
|
+
const centroid = this.calculateCentroid(originalBounds);
|
|
170
|
+
this.originShift = centroid;
|
|
171
|
+
console.log('[CoordinateHandler] Large coordinates detected, shifting to origin:', {
|
|
172
|
+
centroid,
|
|
173
|
+
maxCoord: Math.max(Math.abs(originalBounds.min.x), Math.abs(originalBounds.max.x), Math.abs(originalBounds.min.y), Math.abs(originalBounds.max.y), Math.abs(originalBounds.min.z), Math.abs(originalBounds.max.z)).toFixed(2) + 'm',
|
|
174
|
+
});
|
|
175
|
+
// Shift all mesh positions
|
|
176
|
+
for (const mesh of meshes) {
|
|
177
|
+
this.shiftPositions(mesh.positions, centroid);
|
|
178
|
+
}
|
|
179
|
+
// Calculate shifted bounds
|
|
180
|
+
const shiftedBounds = this.shiftBounds(originalBounds, centroid);
|
|
181
|
+
console.log('[CoordinateHandler] Shifted bounds:', {
|
|
182
|
+
min: shiftedBounds.min,
|
|
183
|
+
max: shiftedBounds.max,
|
|
184
|
+
maxSize: maxSize.toFixed(2) + 'm',
|
|
185
|
+
});
|
|
186
|
+
return {
|
|
187
|
+
originShift: centroid,
|
|
188
|
+
originalBounds,
|
|
189
|
+
shiftedBounds,
|
|
190
|
+
isGeoReferenced: true,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Convert local (shifted) coordinates back to world coordinates
|
|
195
|
+
*/
|
|
196
|
+
toWorldCoordinates(localPos) {
|
|
197
|
+
return {
|
|
198
|
+
x: localPos.x + this.originShift.x,
|
|
199
|
+
y: localPos.y + this.originShift.y,
|
|
200
|
+
z: localPos.z + this.originShift.z,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Convert world coordinates to local (shifted) coordinates
|
|
205
|
+
*/
|
|
206
|
+
toLocalCoordinates(worldPos) {
|
|
207
|
+
return {
|
|
208
|
+
x: worldPos.x - this.originShift.x,
|
|
209
|
+
y: worldPos.y - this.originShift.y,
|
|
210
|
+
z: worldPos.z - this.originShift.z,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Get current origin shift
|
|
215
|
+
*/
|
|
216
|
+
getOriginShift() {
|
|
217
|
+
return { ...this.originShift };
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Process meshes incrementally for streaming
|
|
221
|
+
* Accumulates bounds and applies shift once calculated
|
|
222
|
+
*/
|
|
223
|
+
processMeshesIncremental(batch) {
|
|
224
|
+
// Accumulate bounds from this batch
|
|
225
|
+
const batchBounds = this.calculateBounds(batch);
|
|
226
|
+
if (this.accumulatedBounds === null) {
|
|
227
|
+
this.accumulatedBounds = batchBounds;
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
// Expand accumulated bounds
|
|
231
|
+
this.accumulatedBounds.min.x = Math.min(this.accumulatedBounds.min.x, batchBounds.min.x);
|
|
232
|
+
this.accumulatedBounds.min.y = Math.min(this.accumulatedBounds.min.y, batchBounds.min.y);
|
|
233
|
+
this.accumulatedBounds.min.z = Math.min(this.accumulatedBounds.min.z, batchBounds.min.z);
|
|
234
|
+
this.accumulatedBounds.max.x = Math.max(this.accumulatedBounds.max.x, batchBounds.max.x);
|
|
235
|
+
this.accumulatedBounds.max.y = Math.max(this.accumulatedBounds.max.y, batchBounds.max.y);
|
|
236
|
+
this.accumulatedBounds.max.z = Math.max(this.accumulatedBounds.max.z, batchBounds.max.z);
|
|
237
|
+
}
|
|
238
|
+
// Calculate shift on first batch if needed
|
|
239
|
+
if (!this.shiftCalculated && this.accumulatedBounds) {
|
|
240
|
+
const hasValidBounds = this.accumulatedBounds.min.x !== Infinity &&
|
|
241
|
+
this.accumulatedBounds.max.x !== -Infinity;
|
|
242
|
+
if (hasValidBounds) {
|
|
243
|
+
const size = {
|
|
244
|
+
x: this.accumulatedBounds.max.x - this.accumulatedBounds.min.x,
|
|
245
|
+
y: this.accumulatedBounds.max.y - this.accumulatedBounds.min.y,
|
|
246
|
+
z: this.accumulatedBounds.max.z - this.accumulatedBounds.min.z,
|
|
247
|
+
};
|
|
248
|
+
const maxSize = Math.max(size.x, size.y, size.z);
|
|
249
|
+
const centroid = this.calculateCentroid(this.accumulatedBounds);
|
|
250
|
+
const distanceFromOrigin = Math.sqrt(centroid.x ** 2 + centroid.y ** 2 + centroid.z ** 2);
|
|
251
|
+
// Check if shift is needed (>10km from origin)
|
|
252
|
+
if (distanceFromOrigin > this.THRESHOLD || maxSize > this.THRESHOLD) {
|
|
253
|
+
this.originShift = centroid;
|
|
254
|
+
console.log('[CoordinateHandler] Large coordinates detected, shifting to origin:', {
|
|
255
|
+
distanceFromOrigin: distanceFromOrigin.toFixed(2) + 'm',
|
|
256
|
+
maxSize: maxSize.toFixed(2) + 'm',
|
|
257
|
+
shift: this.originShift,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
this.shiftCalculated = true;
|
|
262
|
+
}
|
|
263
|
+
// Apply shift to this batch
|
|
264
|
+
if (this.originShift.x !== 0 || this.originShift.y !== 0 || this.originShift.z !== 0) {
|
|
265
|
+
for (const mesh of batch) {
|
|
266
|
+
this.shiftPositions(mesh.positions, this.originShift);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Get current coordinate info (for incremental updates)
|
|
272
|
+
*/
|
|
273
|
+
getCurrentCoordinateInfo() {
|
|
274
|
+
if (!this.accumulatedBounds) {
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
const hasValidBounds = this.accumulatedBounds.min.x !== Infinity &&
|
|
278
|
+
this.accumulatedBounds.max.x !== -Infinity;
|
|
279
|
+
if (!hasValidBounds) {
|
|
280
|
+
return null;
|
|
281
|
+
}
|
|
282
|
+
const shiftedBounds = this.shiftBounds(this.accumulatedBounds, this.originShift);
|
|
283
|
+
const isGeoReferenced = this.originShift.x !== 0 ||
|
|
284
|
+
this.originShift.y !== 0 ||
|
|
285
|
+
this.originShift.z !== 0;
|
|
286
|
+
return {
|
|
287
|
+
originShift: { ...this.originShift },
|
|
288
|
+
originalBounds: { ...this.accumulatedBounds },
|
|
289
|
+
shiftedBounds,
|
|
290
|
+
isGeoReferenced,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Get final coordinate info after incremental processing
|
|
295
|
+
*/
|
|
296
|
+
getFinalCoordinateInfo() {
|
|
297
|
+
const current = this.getCurrentCoordinateInfo();
|
|
298
|
+
if (current) {
|
|
299
|
+
return current;
|
|
300
|
+
}
|
|
301
|
+
// Fallback to zero bounds if no valid bounds found
|
|
302
|
+
return {
|
|
303
|
+
originShift: { x: 0, y: 0, z: 0 },
|
|
304
|
+
originalBounds: {
|
|
305
|
+
min: { x: 0, y: 0, z: 0 },
|
|
306
|
+
max: { x: 0, y: 0, z: 0 },
|
|
307
|
+
},
|
|
308
|
+
shiftedBounds: {
|
|
309
|
+
min: { x: 0, y: 0, z: 0 },
|
|
310
|
+
max: { x: 0, y: 0, z: 0 },
|
|
311
|
+
},
|
|
312
|
+
isGeoReferenced: false,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Reset incremental state (for new file)
|
|
317
|
+
*/
|
|
318
|
+
reset() {
|
|
319
|
+
this.accumulatedBounds = null;
|
|
320
|
+
this.shiftCalculated = false;
|
|
321
|
+
this.originShift = { x: 0, y: 0, z: 0 };
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=coordinate-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinate-handler.js","sourceRoot":"","sources":["../src/coordinate-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default material colors for IFC entity types
|
|
3
|
+
* Provides beautiful architectural colors when IFC surface styles are not available
|
|
4
|
+
*/
|
|
5
|
+
export interface MaterialColor {
|
|
6
|
+
baseColor: [number, number, number, number];
|
|
7
|
+
metallic: number;
|
|
8
|
+
roughness: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Default material palette inspired by architectural visualization
|
|
12
|
+
*/
|
|
13
|
+
export declare const DEFAULT_MATERIALS: Record<string, MaterialColor>;
|
|
14
|
+
/**
|
|
15
|
+
* Get default material color for an IFC entity type
|
|
16
|
+
*/
|
|
17
|
+
export declare function getDefaultMaterialColor(entityType: string | null | undefined): MaterialColor;
|
|
18
|
+
/**
|
|
19
|
+
* Get default color array for an IFC entity type (for backward compatibility)
|
|
20
|
+
*/
|
|
21
|
+
export declare function getDefaultColor(entityType: string | null | undefined): [number, number, number, number];
|
|
22
|
+
//# sourceMappingURL=default-materials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-materials.d.ts","sourceRoot":"","sources":["../src/default-materials.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CA4F3D,CAAC;AAEF;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,aAAa,CAU5F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAEvG"}
|
|
@@ -0,0 +1,113 @@
|
|
|
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
|
+
/**
|
|
5
|
+
* Default material palette inspired by architectural visualization
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_MATERIALS = {
|
|
8
|
+
// Structural elements
|
|
9
|
+
'IfcWall': {
|
|
10
|
+
baseColor: [0.95, 0.93, 0.88, 1.0], // Warm white (matte plaster)
|
|
11
|
+
metallic: 0.0,
|
|
12
|
+
roughness: 0.8,
|
|
13
|
+
},
|
|
14
|
+
'IfcSlab': {
|
|
15
|
+
baseColor: [0.75, 0.75, 0.78, 1.0], // Cool gray (concrete)
|
|
16
|
+
metallic: 0.0,
|
|
17
|
+
roughness: 0.9,
|
|
18
|
+
},
|
|
19
|
+
'IfcColumn': {
|
|
20
|
+
baseColor: [0.7, 0.7, 0.7, 1.0], // Light gray (concrete/steel)
|
|
21
|
+
metallic: 0.0,
|
|
22
|
+
roughness: 0.5,
|
|
23
|
+
},
|
|
24
|
+
'IfcBeam': {
|
|
25
|
+
baseColor: [0.55, 0.55, 0.6, 1.0], // Steel blue
|
|
26
|
+
metallic: 0.8,
|
|
27
|
+
roughness: 0.4,
|
|
28
|
+
},
|
|
29
|
+
// Openings
|
|
30
|
+
'IfcWindow': {
|
|
31
|
+
baseColor: [0.6, 0.8, 0.95, 0.3], // Sky blue (glass, transparent)
|
|
32
|
+
metallic: 0.0,
|
|
33
|
+
roughness: 0.1,
|
|
34
|
+
},
|
|
35
|
+
'IfcDoor': {
|
|
36
|
+
baseColor: [0.6, 0.45, 0.3, 1.0], // Warm wood
|
|
37
|
+
metallic: 0.0,
|
|
38
|
+
roughness: 0.6,
|
|
39
|
+
},
|
|
40
|
+
'IfcOpeningElement': {
|
|
41
|
+
baseColor: [0.5, 0.5, 0.5, 0.5], // Gray (generic opening)
|
|
42
|
+
metallic: 0.0,
|
|
43
|
+
roughness: 0.5,
|
|
44
|
+
},
|
|
45
|
+
// Roof and stairs
|
|
46
|
+
'IfcRoof': {
|
|
47
|
+
baseColor: [0.7, 0.5, 0.4, 1.0], // Terra cotta (tiles)
|
|
48
|
+
metallic: 0.0,
|
|
49
|
+
roughness: 0.7,
|
|
50
|
+
},
|
|
51
|
+
'IfcStair': {
|
|
52
|
+
baseColor: [0.8, 0.75, 0.65, 1.0], // Sandstone
|
|
53
|
+
metallic: 0.0,
|
|
54
|
+
roughness: 0.6,
|
|
55
|
+
},
|
|
56
|
+
'IfcRailing': {
|
|
57
|
+
baseColor: [0.3, 0.3, 0.35, 1.0], // Dark metal
|
|
58
|
+
metallic: 0.9,
|
|
59
|
+
roughness: 0.3,
|
|
60
|
+
},
|
|
61
|
+
// Furniture and fixtures
|
|
62
|
+
'IfcFurniture': {
|
|
63
|
+
baseColor: [0.7, 0.6, 0.5, 1.0], // Natural wood
|
|
64
|
+
metallic: 0.0,
|
|
65
|
+
roughness: 0.5,
|
|
66
|
+
},
|
|
67
|
+
'IfcSanitaryTerminal': {
|
|
68
|
+
baseColor: [0.9, 0.9, 0.95, 1.0], // White porcelain
|
|
69
|
+
metallic: 0.0,
|
|
70
|
+
roughness: 0.3,
|
|
71
|
+
},
|
|
72
|
+
// MEP elements
|
|
73
|
+
'IfcPipeSegment': {
|
|
74
|
+
baseColor: [0.4, 0.5, 0.6, 1.0], // Blue-gray (pipe)
|
|
75
|
+
metallic: 0.7,
|
|
76
|
+
roughness: 0.4,
|
|
77
|
+
},
|
|
78
|
+
'IfcDuctSegment': {
|
|
79
|
+
baseColor: [0.6, 0.6, 0.65, 1.0], // Light gray (duct)
|
|
80
|
+
metallic: 0.3,
|
|
81
|
+
roughness: 0.5,
|
|
82
|
+
},
|
|
83
|
+
'IfcCableSegment': {
|
|
84
|
+
baseColor: [0.3, 0.3, 0.3, 1.0], // Dark gray (cable)
|
|
85
|
+
metallic: 0.0,
|
|
86
|
+
roughness: 0.8,
|
|
87
|
+
},
|
|
88
|
+
// Default fallback
|
|
89
|
+
'default': {
|
|
90
|
+
baseColor: [0.8, 0.8, 0.8, 1.0], // Neutral gray
|
|
91
|
+
metallic: 0.0,
|
|
92
|
+
roughness: 0.6,
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Get default material color for an IFC entity type
|
|
97
|
+
*/
|
|
98
|
+
export function getDefaultMaterialColor(entityType) {
|
|
99
|
+
if (!entityType) {
|
|
100
|
+
return DEFAULT_MATERIALS['default'];
|
|
101
|
+
}
|
|
102
|
+
// Normalize type name (remove 'IFC' prefix, handle case)
|
|
103
|
+
const normalizedType = entityType.replace(/^IFC/, '').replace(/^Ifc/, '');
|
|
104
|
+
const ifcType = `Ifc${normalizedType}`;
|
|
105
|
+
return DEFAULT_MATERIALS[ifcType] || DEFAULT_MATERIALS[entityType] || DEFAULT_MATERIALS['default'];
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get default color array for an IFC entity type (for backward compatibility)
|
|
109
|
+
*/
|
|
110
|
+
export function getDefaultColor(entityType) {
|
|
111
|
+
return getDefaultMaterialColor(entityType).baseColor;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=default-materials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-materials.js","sourceRoot":"","sources":["../src/default-materials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.worker.d.ts","sourceRoot":"","sources":["../src/geometry.worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,118 @@
|
|
|
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
|
+
/**
|
|
5
|
+
* Geometry Worker - Handles mesh collection in a Web Worker
|
|
6
|
+
* Uses IFC-Lite for native Rust geometry processing (1.9x faster than web-ifc)
|
|
7
|
+
*/
|
|
8
|
+
import init, { IfcAPI } from '@ifc-lite/wasm';
|
|
9
|
+
import { IfcLiteMeshCollector } from './ifc-lite-mesh-collector.js';
|
|
10
|
+
// Global IFC-Lite API instance (initialized once per worker)
|
|
11
|
+
let ifcApi = null;
|
|
12
|
+
let ifcApiInitialized = false;
|
|
13
|
+
/**
|
|
14
|
+
* Initialize IFC-Lite API in worker context
|
|
15
|
+
*/
|
|
16
|
+
async function initIfcApi(wasmPath = '/') {
|
|
17
|
+
if (ifcApi && ifcApiInitialized) {
|
|
18
|
+
return ifcApi;
|
|
19
|
+
}
|
|
20
|
+
const initStart = performance.now();
|
|
21
|
+
console.log('[Worker] Initializing IFC-Lite...');
|
|
22
|
+
// Initialize WASM module
|
|
23
|
+
const wasmUrl = wasmPath.endsWith('/')
|
|
24
|
+
? `${wasmPath}ifc_lite_wasm_bg.wasm`
|
|
25
|
+
: `${wasmPath}/ifc_lite_wasm_bg.wasm`;
|
|
26
|
+
await init(wasmUrl);
|
|
27
|
+
ifcApi = new IfcAPI();
|
|
28
|
+
ifcApiInitialized = true;
|
|
29
|
+
const initTime = performance.now() - initStart;
|
|
30
|
+
console.log(`[Worker] IFC-Lite initialized in ${initTime.toFixed(2)}ms`);
|
|
31
|
+
return ifcApi;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Handle mesh collection task
|
|
35
|
+
*/
|
|
36
|
+
async function handleMeshCollection(data) {
|
|
37
|
+
const taskStart = performance.now();
|
|
38
|
+
const { buffer, wasmPath = '/' } = data;
|
|
39
|
+
// Initialize IFC-Lite if needed
|
|
40
|
+
const apiInitStart = performance.now();
|
|
41
|
+
const api = await initIfcApi(wasmPath);
|
|
42
|
+
const apiInitTime = performance.now() - apiInitStart;
|
|
43
|
+
if (apiInitTime > 10) {
|
|
44
|
+
console.log(`[Worker] IFC-Lite init took ${apiInitTime.toFixed(2)}ms`);
|
|
45
|
+
}
|
|
46
|
+
// Convert buffer to string (IFC files are text)
|
|
47
|
+
const decoder = new TextDecoder();
|
|
48
|
+
const content = decoder.decode(new Uint8Array(buffer));
|
|
49
|
+
// Collect meshes using IFC-Lite
|
|
50
|
+
const collectStart = performance.now();
|
|
51
|
+
const collector = new IfcLiteMeshCollector(api, content);
|
|
52
|
+
const meshes = collector.collectMeshes();
|
|
53
|
+
const collectTime = performance.now() - collectStart;
|
|
54
|
+
const totalTime = performance.now() - taskStart;
|
|
55
|
+
console.log(`[Worker] Mesh collection: ${collectTime.toFixed(2)}ms, total: ${totalTime.toFixed(2)}ms, meshes: ${meshes.length}`);
|
|
56
|
+
return meshes;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Process task and send result back to main thread
|
|
60
|
+
*/
|
|
61
|
+
async function processTask(task) {
|
|
62
|
+
try {
|
|
63
|
+
let result;
|
|
64
|
+
switch (task.type) {
|
|
65
|
+
case 'mesh-collection':
|
|
66
|
+
result = await handleMeshCollection(task.data);
|
|
67
|
+
break;
|
|
68
|
+
case 'generate-lod':
|
|
69
|
+
case 'build-bvh':
|
|
70
|
+
throw new Error(`Task type '${task.type}' not yet implemented`);
|
|
71
|
+
default:
|
|
72
|
+
throw new Error(`Unknown task type: ${task.type}`);
|
|
73
|
+
}
|
|
74
|
+
// Extract transferable buffers for zero-copy transfer
|
|
75
|
+
const transferables = [];
|
|
76
|
+
if (Array.isArray(result)) {
|
|
77
|
+
// MeshData[] - extract all typed array buffers
|
|
78
|
+
for (const mesh of result) {
|
|
79
|
+
if (mesh.positions?.buffer) {
|
|
80
|
+
transferables.push(mesh.positions.buffer);
|
|
81
|
+
}
|
|
82
|
+
if (mesh.normals?.buffer) {
|
|
83
|
+
transferables.push(mesh.normals.buffer);
|
|
84
|
+
}
|
|
85
|
+
if (mesh.indices?.buffer) {
|
|
86
|
+
transferables.push(mesh.indices.buffer);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Send result with transferables
|
|
91
|
+
const response = {
|
|
92
|
+
id: task.id,
|
|
93
|
+
type: 'task-result',
|
|
94
|
+
result,
|
|
95
|
+
};
|
|
96
|
+
self.postMessage(response, { transfer: transferables });
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
// Send error back
|
|
100
|
+
const response = {
|
|
101
|
+
id: task.id,
|
|
102
|
+
type: 'task-error',
|
|
103
|
+
error: error instanceof Error ? error.message : String(error),
|
|
104
|
+
};
|
|
105
|
+
self.postMessage(response);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Signal that worker is ready (send immediately on load)
|
|
109
|
+
const readyMessage = {
|
|
110
|
+
id: '',
|
|
111
|
+
type: 'ready',
|
|
112
|
+
};
|
|
113
|
+
self.postMessage(readyMessage);
|
|
114
|
+
// Listen for messages from main thread
|
|
115
|
+
self.onmessage = async (e) => {
|
|
116
|
+
await processTask(e.data);
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=geometry.worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.worker.js","sourceRoot":"","sources":["../src/geometry.worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IFC-Lite bridge - initializes and manages IFC-Lite WASM for geometry processing
|
|
3
|
+
* Replaces web-ifc-bridge.ts with native IFC-Lite implementation (1.9x faster)
|
|
4
|
+
*/
|
|
5
|
+
import { IfcAPI, MeshCollection } from '@ifc-lite/wasm';
|
|
6
|
+
export type { MeshCollection };
|
|
7
|
+
export declare class IfcLiteBridge {
|
|
8
|
+
private ifcApi;
|
|
9
|
+
private initialized;
|
|
10
|
+
/**
|
|
11
|
+
* Initialize IFC-Lite WASM
|
|
12
|
+
*/
|
|
13
|
+
init(wasmPath?: string): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Parse IFC content and return mesh collection
|
|
16
|
+
* Returns individual meshes with express IDs and colors
|
|
17
|
+
*/
|
|
18
|
+
parseMeshes(content: string): MeshCollection;
|
|
19
|
+
/**
|
|
20
|
+
* Get IFC-Lite API instance
|
|
21
|
+
*/
|
|
22
|
+
getApi(): IfcAPI;
|
|
23
|
+
/**
|
|
24
|
+
* Check if initialized
|
|
25
|
+
*/
|
|
26
|
+
isInitialized(): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Get version
|
|
29
|
+
*/
|
|
30
|
+
getVersion(): string;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=ifc-lite-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ifc-lite-bridge.d.ts","sourceRoot":"","sources":["../src/ifc-lite-bridge.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC9D,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAkB;IAErC;;OAEG;IACG,IAAI,CAAC,QAAQ,GAAE,MAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAajD;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc;IAO5C;;OAEG;IACH,MAAM,IAAI,MAAM;IAOhB;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,UAAU,IAAI,MAAM;CAGrB"}
|