babylon-ifc-loader 1.0.2 → 2.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/API.md CHANGED
@@ -55,13 +55,13 @@ const ifcAPI = await initializeWebIFC("./");
55
55
 
56
56
  // Initialize with custom log level
57
57
  import * as WebIFC from "web-ifc";
58
- const ifcAPI = await initializeWebIFC("./", WebIFC.LogLevel.LOG_LEVEL_WARNING);
58
+ const ifcAPI = await initializeWebIFC("./", WebIFC.LogLevel.LOG_LEVEL_WARN);
59
59
  ```
60
60
 
61
61
  #### Console Output
62
62
 
63
63
  ```
64
- Web-IFC initialized in Xms
64
+ Web-IFC initialized in Xms
65
65
  ```
66
66
 
67
67
  ---
@@ -95,7 +95,7 @@ async function loadIfcModel(
95
95
 
96
96
  #### Returns
97
97
 
98
- `Promise<RawIfcModel>` - Raw IFC model data with geometry parts, storey map, and statistics.
98
+ `Promise<RawIfcModel>` - Raw IFC model data with geometry parts and statistics.
99
99
 
100
100
  #### Example
101
101
 
@@ -123,18 +123,17 @@ console.log(model.rawStats); // Statistics
123
123
  #### Console Output (verbose mode)
124
124
 
125
125
  ```
126
- 📥 Fetching IFC from URL: /test.ifc
127
- 📥 Received 2.45 MB
128
- 📥 Opening IFC model (2.45 MB)...
129
- 📥 OpenModel returned modelID: 0
126
+ Fetching IFC from URL: /test.ifc
127
+ Received 2.45 MB
128
+ Opening IFC model (2.45 MB)...
129
+ OpenModel returned (modelID=0)
130
130
 
131
- 📦 Collected 1234 geometry parts
131
+ Collected 1234 geometry parts (modelID=0)
132
132
 
133
- 📊 Raw Model Statistics:
134
- Parts extracted: 1234
135
- Vertices: 156,789
136
- Triangles: 52,263
137
- Storey relationships: 5
133
+ Raw model statistics: (modelID=0)
134
+ Parts extracted: 1234 (modelID=0)
135
+ Vertices: 156,789 (modelID=0)
136
+ Triangles: 52,263 (modelID=0)
138
137
  ```
139
138
 
140
139
  ---
@@ -166,7 +165,7 @@ closeIfcModel(ifcAPI, model.modelID);
166
165
  #### Console Output
167
166
 
168
167
  ```
169
- Model 0 closed and memory freed
168
+ Model closed and memory freed (modelID=0)
170
169
  ```
171
170
 
172
171
  ---
@@ -216,7 +215,6 @@ Complete raw model returned by `loadIfcModel`.
216
215
  interface RawIfcModel {
217
216
  modelID: number; // IFC model identifier
218
217
  parts: RawGeometryPart[]; // Array of geometry parts
219
- storeyMap: Map<number, number>; // Element ID to storey ID mapping
220
218
  rawStats: {
221
219
  partCount: number; // Number of geometry parts
222
220
  vertexCount: number; // Total vertices
@@ -236,7 +234,7 @@ interface RawGeometryPart {
236
234
  positions: Float32Array; // Vertex positions (x, y, z)
237
235
  normals: Float32Array; // Vertex normals (nx, ny, nz)
238
236
  indices: Uint32Array; // Triangle indices
239
- flatTransform: number[]; // 4x4 transformation matrix (16 values)
237
+ flatTransform: ArrayLike<number>; // 4x4 transformation matrix (16 values)
240
238
  color: {
241
239
  // RGBA color (normalized 0-1)
242
240
  x: number; // R
@@ -256,6 +254,7 @@ Configuration for IFC loader.
256
254
  interface IfcInitOptions {
257
255
  coordinateToOrigin?: boolean; // Move to origin (default: true)
258
256
  verbose?: boolean; // Console logging (default: true)
257
+ signal?: AbortSignal; // Cancellation signal
259
258
  }
260
259
  ```
261
260
 
@@ -305,6 +304,8 @@ function buildIfcModel(model: RawIfcModel, scene: Scene, options?: SceneBuildOpt
305
304
  | `generateNormals` | `boolean` | `false` | Generate normals if missing. |
306
305
  | `verbose` | `boolean` | `true` | Enable console logging during building. |
307
306
  | `freezeAfterBuild` | `boolean` | `true` | Freeze meshes and materials for performance. |
307
+ | `usePBRMaterials` | `boolean` | `false` | Use `PBRMaterial` instead of `StandardMaterial`. |
308
+ | `releaseRawPartsAfterBuild` | `boolean` | `true` | Release `model.parts` after scene build. |
308
309
 
309
310
  #### Returns
310
311
 
@@ -331,20 +332,19 @@ console.log(`Build time: ${stats.buildTimeMs}ms`);
331
332
  #### Console Output (verbose mode)
332
333
 
333
334
  ```
334
- 🏗️ Building Babylon.js scene from 1234 raw parts...
335
- Created 1234 initial meshes
336
- Grouped into 567 unique (expressID + material) combinations
335
+ Building Babylon.js scene from 1234 raw parts... (modelID=0)
336
+ Created 1234 initial meshes (modelID=0)
337
+ Grouped into 567 unique (expressID + material) combinations (modelID=0)
338
+ Model auto-centered at origin (offset: 10.50, 0.00, -5.25) (modelID=0)
337
339
 
338
- 📍 Model auto-centered at origin (offset: 10.50, 0.00, -5.25)
339
-
340
- Scene building complete:
341
- Original parts: 1234
342
- Merged groups: 100
343
- Skipped groups: 5
344
- Final meshes: 1129
345
- Materials created: 15
346
- Build time: 234.56ms
347
- IFC meshes and materials frozen for optimal performance
340
+ Model building complete: (modelID=0)
341
+ Original parts: 1234 (modelID=0)
342
+ Merged groups: 100 (modelID=0)
343
+ Skipped groups: 5 (modelID=0)
344
+ Final meshes: 1129 (modelID=0)
345
+ Materials created: 15 (modelID=0)
346
+ Build time: 234.56ms (modelID=0)
347
+ IFC meshes and materials frozen for optimal performance (modelID=0)
348
348
  ```
349
349
 
350
350
  ---
@@ -375,8 +375,8 @@ disposeIfcModel(scene);
375
375
  #### Console Output
376
376
 
377
377
  ```
378
- ifc-root node and all child meshes disposed
379
- 15 IFC materials disposed
378
+ ifc-root node and all child meshes disposed
379
+ 15 IFC materials disposed
380
380
  ```
381
381
 
382
382
  ---
@@ -463,6 +463,8 @@ interface SceneBuildOptions {
463
463
  generateNormals?: boolean; // Generate normals if missing (default: false)
464
464
  verbose?: boolean; // Console logging (default: true)
465
465
  freezeAfterBuild?: boolean; // Freeze for performance (default: true)
466
+ usePBRMaterials?: boolean; // Use PBR materials (default: false)
467
+ releaseRawPartsAfterBuild?: boolean; // Release model.parts after build (default: true)
466
468
  }
467
469
  ```
468
470
 
@@ -590,6 +592,23 @@ scene.onPointerDown = (evt, pickResult) => {
590
592
  };
591
593
  ```
592
594
 
595
+ ## Material Metadata
596
+
597
+ Materials created by `buildIfcModel` include metadata with IFC color information:
598
+
599
+ ```typescript
600
+ material.metadata = {
601
+ color: {
602
+ r: number;
603
+ g: number;
604
+ b: number;
605
+ a: number;
606
+ } | null;
607
+ };
608
+ ```
609
+
610
+ When an IFC part has no explicit color, `material.metadata.color` is `null`.
611
+
593
612
  ---
594
613
 
595
614
  ## Performance Notes
@@ -617,3 +636,4 @@ if (ifcAPI.IsModelOpen(modelID)) {
617
636
  closeIfcModel(ifcAPI, modelID);
618
637
  }
619
638
  ```
639
+
package/CHANGELOG.md ADDED
@@ -0,0 +1,48 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented in this file.
4
+
5
+ ## [Unreleased]
6
+
7
+ ### Exposed API Changes
8
+
9
+ - `RawIfcModel`:
10
+ - Removed `storeyMap: Map<number, number>`.
11
+ - `IfcInitOptions` (used by `loadIfcModel`):
12
+ - Added `signal?: AbortSignal`.
13
+ - `SceneBuildOptions` (used by `buildIfcModel`):
14
+ - Added `usePBRMaterials?: boolean`.
15
+ - Added `releaseRawPartsAfterBuild?: boolean` (default is `true`).
16
+
17
+ ### Behavior Changes With API Impact
18
+
19
+ - `buildIfcModel` now clears `model.parts` by default (`releaseRawPartsAfterBuild=true`) unless explicitly disabled.
20
+ - Storey-based merge restrictions were removed; merge strategy is now element/material-group based.
21
+
22
+ ### Changed
23
+
24
+ - Added PBR rendering support:
25
+ - `usePBRMaterials` scene option.
26
+ - PBR material defaults/handling (`metallic`, `roughness`).
27
+ - Viewer environment texture flow updates for PBR usage.
28
+ - Updated model build behavior:
29
+ - Added `releaseRawPartsAfterBuild` (default `true`).
30
+ - Removed storey-based merge blocking logic.
31
+ - Added stronger raw-part validation before mesh creation.
32
+ - Improved loader robustness:
33
+ - Added `AbortSignal` support in `loadIfcModel`/fetch/streaming paths.
34
+ - Added explicit abort helpers and safer geometry disposal.
35
+ - Removed `storeyMap` from `RawIfcModel`.
36
+ - Improved performance in geometry/build hot paths:
37
+ - Reduced array-copy allocations by using typed arrays directly where supported.
38
+ - Kept `flatTransform` as `ArrayLike<number>` instead of forcing new arrays.
39
+ - Updated tests and docs to align with branch behavior:
40
+ - Expanded/adjusted build and loader test coverage.
41
+ - Updated `readme.md` and `API.md`.
42
+
43
+ ### Branch Commits
44
+
45
+ - `664a468` - `pbr`
46
+ - `cc68bb8` - `envTex`
47
+ - `a9db44c` - `small update`
48
+ - `4b0f0ec` - `types etc`
@@ -6,7 +6,7 @@ export interface RawGeometryPart {
6
6
  positions: Float32Array;
7
7
  normals: Float32Array;
8
8
  indices: Uint32Array;
9
- flatTransform: number[];
9
+ flatTransform: ArrayLike<number>;
10
10
  color: {
11
11
  x: number;
12
12
  y: number;
@@ -19,7 +19,6 @@ export interface RawGeometryPart {
19
19
  export interface RawIfcModel {
20
20
  modelID: number;
21
21
  parts: RawGeometryPart[];
22
- storeyMap: Map<number, number>;
23
22
  rawStats: {
24
23
  partCount: number;
25
24
  vertexCount: number;
@@ -30,6 +29,7 @@ export interface RawIfcModel {
30
29
  export interface IfcInitOptions {
31
30
  coordinateToOrigin?: boolean;
32
31
  verbose?: boolean;
32
+ signal?: AbortSignal;
33
33
  }
34
34
  /** projectInfo extracted from IFC file */
35
35
  export interface ProjectInfoResult {
@@ -1 +1 @@
1
- {"version":3,"file":"ifcInit.d.ts","sourceRoot":"","sources":["../src/ifcInit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAMlC,mDAAmD;AACnD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,WAAW,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,mCAAmC;AACnC,MAAM,WAAW,cAAc;IAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,0CAA0C;AAC1C,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAMD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,GAAE,MAAM,CAAC,QAA0C,GAC1D,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAkBxB;AAMD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EACrB,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,WAAW,CAAC,CA8BtB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAK1E;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,iBAAiB,CA8DxF"}
1
+ {"version":3,"file":"ifcInit.d.ts","sourceRoot":"","sources":["../src/ifcInit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAOlC,mDAAmD;AACnD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,WAAW,CAAC;IACrB,aAAa,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACjC,KAAK,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,mCAAmC;AACnC,MAAM,WAAW,cAAc;IAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,0CAA0C;AAC1C,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAoDD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,GAAE,MAAM,CAAC,QAA0C,GAC1D,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAkBxB;AAMD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EACrB,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,WAAW,CAAC,CAsCtB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAK1E;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,iBAAiB,CA8DxF"}
@@ -1,4 +1,34 @@
1
1
  import * as WebIFC from "web-ifc";
2
+ import { logError, logInfo, logWarn } from "./logging";
3
+ class IfcGeometryProcessingError extends Error {
4
+ context;
5
+ cause;
6
+ constructor(context, cause) {
7
+ super(`Error processing geometry (modelID=${context.modelID}, expressID=${context.expressID}, geometryExpressID=${context.geometryExpressID})`);
8
+ this.name = "IfcGeometryProcessingError";
9
+ this.context = context;
10
+ this.cause = cause;
11
+ }
12
+ }
13
+ function createAbortError() {
14
+ if (typeof DOMException !== "undefined") {
15
+ return new DOMException("Operation was aborted", "AbortError");
16
+ }
17
+ const error = new Error("Operation was aborted");
18
+ error.name = "AbortError";
19
+ return error;
20
+ }
21
+ function throwIfAborted(signal) {
22
+ if (signal?.aborted) {
23
+ throw createAbortError();
24
+ }
25
+ }
26
+ function disposeGeometry(geometry) {
27
+ if (geometry && typeof geometry === "object" && "delete" in geometry) {
28
+ const disposable = geometry;
29
+ disposable.delete?.();
30
+ }
31
+ }
2
32
  // ============================================================================
3
33
  // PUBLIC API - Initialization
4
34
  // ============================================================================
@@ -17,7 +47,7 @@ export async function initializeWebIFC(wasmPath, logLevel = WebIFC.LogLevel.LOG_
17
47
  await ifcAPI.Init();
18
48
  // Set log level
19
49
  ifcAPI.SetLogLevel(logLevel);
20
- console.log(`✓ Web-IFC initialized in ${(performance.now() - startTime).toFixed(2)}ms`);
50
+ logInfo(`Web-IFC initialized in ${(performance.now() - startTime).toFixed(2)}ms`);
21
51
  return ifcAPI;
22
52
  }
23
53
  // ============================================================================
@@ -33,25 +63,32 @@ export async function loadIfcModel(ifcAPI, source, options = {}) {
33
63
  verbose: true,
34
64
  ...options,
35
65
  };
66
+ throwIfAborted(opts.signal);
36
67
  // Step 1: Open the model
37
68
  const modelID = await openModel(ifcAPI, source, opts);
38
- // Step 2: Stream geometry and extract raw data
39
- const { parts, rawStats } = streamGeometry(ifcAPI, modelID, opts);
40
- // Step 3: Build storey map for spatial context
41
- const storeyMap = buildStoreyMap(ifcAPI, modelID);
42
- if (opts.verbose) {
43
- console.log(`\n📊 Raw Model Statistics:`);
44
- console.log(` Parts extracted: ${rawStats.partCount}`);
45
- console.log(` Vertices: ${rawStats.vertexCount.toLocaleString()}`);
46
- console.log(` Triangles: ${rawStats.triangleCount.toLocaleString()}`);
47
- console.log(` Storey relationships: ${storeyMap.size}`);
69
+ try {
70
+ throwIfAborted(opts.signal);
71
+ // Step 2: Stream geometry and extract raw data
72
+ const { parts, rawStats } = streamGeometry(ifcAPI, modelID, opts);
73
+ throwIfAborted(opts.signal);
74
+ if (opts.verbose) {
75
+ logInfo(`\nRaw model statistics:`, { modelID });
76
+ logInfo(` Parts extracted: ${rawStats.partCount}`, { modelID });
77
+ logInfo(` Vertices: ${rawStats.vertexCount.toLocaleString()}`, { modelID });
78
+ logInfo(` Triangles: ${rawStats.triangleCount.toLocaleString()}`, { modelID });
79
+ }
80
+ return {
81
+ modelID,
82
+ parts,
83
+ rawStats,
84
+ };
85
+ }
86
+ catch (error) {
87
+ if (ifcAPI.IsModelOpen(modelID)) {
88
+ ifcAPI.CloseModel(modelID);
89
+ }
90
+ throw error;
48
91
  }
49
- return {
50
- modelID,
51
- parts,
52
- storeyMap,
53
- rawStats,
54
- };
55
92
  }
56
93
  /**
57
94
  * Close IFC model and free memory
@@ -59,7 +96,7 @@ export async function loadIfcModel(ifcAPI, source, options = {}) {
59
96
  export function closeIfcModel(ifcAPI, modelID) {
60
97
  if (ifcAPI.IsModelOpen(modelID)) {
61
98
  ifcAPI.CloseModel(modelID);
62
- console.log(`✓ Model ${modelID} closed and memory freed`);
99
+ logInfo("Model closed and memory freed", { modelID });
63
100
  }
64
101
  }
65
102
  // ============================================================================
@@ -119,7 +156,7 @@ export function getProjectInfo(ifcAPI, modelID) {
119
156
  }
120
157
  }
121
158
  catch (error) {
122
- console.warn("Error extracting IFC projectInfo:", error);
159
+ logWarn("Error extracting IFC projectInfo", { modelID }, error);
123
160
  }
124
161
  return projectInfo;
125
162
  }
@@ -131,20 +168,22 @@ export function getProjectInfo(ifcAPI, modelID) {
131
168
  */
132
169
  async function openModel(ifcAPI, source, options) {
133
170
  let data;
171
+ throwIfAborted(options.signal);
134
172
  if (typeof source === "string") {
135
- console.log(`📥 Fetching IFC from URL: ${source}`);
136
- const response = await fetch(source);
137
- console.log(`📥 Fetch response: status=${response.status}, ok=${response.ok}, type=${response.headers.get("content-type")}`);
173
+ logInfo(`Fetching IFC from URL: ${source}`);
174
+ const response = options.signal ? await fetch(source, { signal: options.signal }) : await fetch(source);
175
+ logInfo(`Fetch response: status=${response.status}, ok=${response.ok}, type=${response.headers.get("content-type")}`);
138
176
  if (!response.ok) {
139
177
  throw new Error(`Failed to fetch IFC file: HTTP ${response.status} ${response.statusText}`);
140
178
  }
141
179
  data = await response.arrayBuffer();
142
- console.log(`📥 Received ${(data.byteLength / 1024 / 1024).toFixed(2)} MB`);
180
+ logInfo(`Received ${(data.byteLength / 1024 / 1024).toFixed(2)} MB`);
143
181
  }
144
182
  else {
145
- console.log(`📥 Loading IFC file: ${source.name} (${(source.size / 1024 / 1024).toFixed(2)} MB)`);
183
+ logInfo(`Loading IFC file: ${source.name} (${(source.size / 1024 / 1024).toFixed(2)} MB)`);
146
184
  data = await source.arrayBuffer();
147
185
  }
186
+ throwIfAborted(options.signal);
148
187
  // Configure loader settings
149
188
  const settings = {
150
189
  COORDINATE_TO_ORIGIN: options.coordinateToOrigin ?? true,
@@ -152,9 +191,9 @@ async function openModel(ifcAPI, source, options) {
152
191
  MEMORY_LIMIT: 2147483648,
153
192
  TAPE_SIZE: 67108864,
154
193
  };
155
- console.log(`📥 Opening IFC model (${(data.byteLength / 1024 / 1024).toFixed(2)} MB)...`);
194
+ logInfo(`Opening IFC model (${(data.byteLength / 1024 / 1024).toFixed(2)} MB)...`);
156
195
  const modelID = ifcAPI.OpenModel(new Uint8Array(data), settings);
157
- console.log(`📥 OpenModel returned modelID: ${modelID}`);
196
+ logInfo("OpenModel returned", { modelID });
158
197
  if (modelID === -1) {
159
198
  throw new Error("Failed to open IFC model");
160
199
  }
@@ -164,6 +203,7 @@ async function openModel(ifcAPI, source, options) {
164
203
  * Stream geometry and extract raw data (no Babylon.js dependencies)
165
204
  */
166
205
  function streamGeometry(ifcAPI, modelID, options) {
206
+ throwIfAborted(options.signal);
167
207
  const parts = [];
168
208
  let totalVertices = 0;
169
209
  let totalTriangles = 0;
@@ -171,6 +211,7 @@ function streamGeometry(ifcAPI, modelID, options) {
171
211
  ifcAPI.StreamAllMeshes(modelID, (flatMesh) => {
172
212
  const placedGeometries = flatMesh.geometries;
173
213
  for (let i = 0; i < placedGeometries.size(); i++) {
214
+ throwIfAborted(options.signal);
174
215
  const placedGeometry = placedGeometries.get(i);
175
216
  // Skip invalid geometries
176
217
  if (!placedGeometry || placedGeometry.geometryExpressID === undefined)
@@ -183,7 +224,7 @@ function streamGeometry(ifcAPI, modelID, options) {
183
224
  const verts = ifcAPI.GetVertexArray(geometry.GetVertexData(), geometry.GetVertexDataSize());
184
225
  const indices = ifcAPI.GetIndexArray(geometry.GetIndexData(), geometry.GetIndexDataSize());
185
226
  if (verts.length === 0 || indices.length === 0) {
186
- geometry?.delete?.();
227
+ disposeGeometry(geometry);
187
228
  continue;
188
229
  }
189
230
  // Extract positions and normals
@@ -218,7 +259,7 @@ function streamGeometry(ifcAPI, modelID, options) {
218
259
  positions,
219
260
  normals,
220
261
  indices: new Uint32Array(indices),
221
- flatTransform: Array.from(placedGeometry.flatTransformation),
262
+ flatTransform: placedGeometry.flatTransformation,
222
263
  color,
223
264
  colorId,
224
265
  });
@@ -226,16 +267,21 @@ function streamGeometry(ifcAPI, modelID, options) {
226
267
  totalVertices += numVertices;
227
268
  totalTriangles += indices.length / 3;
228
269
  // Clean up WASM memory
229
- geometry?.delete?.();
270
+ disposeGeometry(geometry);
230
271
  }
231
272
  catch (error) {
232
- console.error(`Error processing geometry:`, error);
233
- geometry?.delete?.();
273
+ const context = {
274
+ modelID,
275
+ expressID: flatMesh.expressID,
276
+ geometryExpressID: placedGeometry.geometryExpressID,
277
+ };
278
+ logError("Error processing geometry", context, new IfcGeometryProcessingError(context, error));
279
+ disposeGeometry(geometry);
234
280
  }
235
281
  }
236
282
  });
237
283
  if (options.verbose) {
238
- console.log(`\n📦 Collected ${parts.length} geometry parts`);
284
+ logInfo(`\nCollected ${parts.length} geometry parts`, { modelID });
239
285
  }
240
286
  return {
241
287
  parts,
@@ -246,56 +292,4 @@ function streamGeometry(ifcAPI, modelID, options) {
246
292
  },
247
293
  };
248
294
  }
249
- /**
250
- * Build storey map for spatial context checking
251
- */
252
- function buildStoreyMap(ifcAPI, modelID) {
253
- const elementToStorey = new Map();
254
- try {
255
- // Get all building storeys
256
- const storeys = ifcAPI.GetLineIDsWithType(modelID, WebIFC.IFCBUILDINGSTOREY);
257
- for (let i = 0; i < storeys.size(); i++) {
258
- const storeyID = storeys.get(i);
259
- try {
260
- // Get all elements in this storey via spatial structure
261
- const relAggregates = ifcAPI.GetLineIDsWithType(modelID, WebIFC.IFCRELAGGREGATES);
262
- for (let j = 0; j < relAggregates.size(); j++) {
263
- const relID = relAggregates.get(j);
264
- const rel = ifcAPI.GetLine(modelID, relID);
265
- if (rel.RelatingObject && rel.RelatingObject.value === storeyID) {
266
- if (rel.RelatedObjects) {
267
- rel.RelatedObjects.forEach((obj) => {
268
- if (obj && obj.value) {
269
- elementToStorey.set(obj.value, storeyID);
270
- }
271
- });
272
- }
273
- }
274
- }
275
- // Also check spatial containment
276
- const relContained = ifcAPI.GetLineIDsWithType(modelID, WebIFC.IFCRELCONTAINEDINSPATIALSTRUCTURE);
277
- for (let j = 0; j < relContained.size(); j++) {
278
- const relID = relContained.get(j);
279
- const rel = ifcAPI.GetLine(modelID, relID);
280
- if (rel.RelatingStructure && rel.RelatingStructure.value === storeyID) {
281
- if (rel.RelatedElements) {
282
- rel.RelatedElements.forEach((elem) => {
283
- if (elem && elem.value) {
284
- elementToStorey.set(elem.value, storeyID);
285
- }
286
- });
287
- }
288
- }
289
- }
290
- }
291
- catch (error) {
292
- // Skip errors for individual storeys
293
- }
294
- }
295
- }
296
- catch (error) {
297
- console.warn("Could not build storey map:", error);
298
- }
299
- return elementToStorey;
300
- }
301
295
  //# sourceMappingURL=ifcInit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ifcInit.js","sourceRoot":"","sources":["../src/ifcInit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ifcInit.js","sourceRoot":"","sources":["../src/ifcInit.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,14 @@ export interface SceneBuildOptions {
8
8
  generateNormals?: boolean;
9
9
  verbose?: boolean;
10
10
  freezeAfterBuild?: boolean;
11
+ usePBRMaterials?: boolean;
12
+ releaseRawPartsAfterBuild?: boolean;
11
13
  }
14
+ export declare const MATERIAL_Z_OFFSET_STEP = 0.05;
15
+ export declare const MATERIAL_Z_OFFSET_WRAP = 1;
16
+ export declare const DEFAULT_IFC_MATERIAL_GRAY = 0.8;
17
+ export declare const DEFAULT_PBR_METALLIC = 0;
18
+ export declare const DEFAULT_PBR_ROUGHNESS = 0.7;
12
19
  /** Result of building a scene */
13
20
  export interface SceneBuildResult {
14
21
  meshes: AbstractMesh[];
@@ -1 +1 @@
1
- {"version":3,"file":"ifcModel.d.ts","sourceRoot":"","sources":["../src/ifcModel.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EAIL,YAAY,EACZ,aAAa,EACb,OAAO,EAGR,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,WAAW,CAAC;AAM9D,uCAAuC;AACvC,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,iCAAiC;AACjC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,qCAAqC;AACrC,MAAM,WAAW,UAAU;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,yBAAyB;AACzB,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAaD;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,iBAAsB,GAAG,gBAAgB,CAuLjH;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAoBlD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,UAAU,GAAG,IAAI,CA6CxE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,OAAO,CAqB7F"}
1
+ {"version":3,"file":"ifcModel.d.ts","sourceRoot":"","sources":["../src/ifcModel.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EAIL,YAAY,EACZ,aAAa,EACb,OAAO,EAIR,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,WAAW,CAAC;AAO9D,uCAAuC;AACvC,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,sBAAsB,IAAM,CAAC;AAC1C,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,iCAAiC;AACjC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,qCAAqC;AACrC,MAAM,WAAW,UAAU;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,yBAAyB;AACzB,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAiBD;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,iBAAsB,GAAG,gBAAgB,CAyMjH;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAoBlD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,UAAU,GAAG,IAAI,CA6CxE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,OAAO,CAmB7F"}
@@ -1,4 +1,10 @@
1
- import { Scene, Mesh, VertexData, Matrix, AbstractMesh, TransformNode, Vector3, Color3, StandardMaterial, } from "@babylonjs/core";
1
+ import { Scene, Mesh, VertexData, Matrix, AbstractMesh, TransformNode, Vector3, Color3, StandardMaterial, PBRMaterial, } from "@babylonjs/core";
2
+ import { logInfo, logWarn } from "./logging";
3
+ export const MATERIAL_Z_OFFSET_STEP = 0.05;
4
+ export const MATERIAL_Z_OFFSET_WRAP = 1.0;
5
+ export const DEFAULT_IFC_MATERIAL_GRAY = 0.8;
6
+ export const DEFAULT_PBR_METALLIC = 0;
7
+ export const DEFAULT_PBR_ROUGHNESS = 0.7;
2
8
  // ============================================================================
3
9
  // PUBLIC API - Scene Building
4
10
  // ============================================================================
@@ -14,24 +20,55 @@ export function buildIfcModel(model, scene, options = {}) {
14
20
  generateNormals: false,
15
21
  verbose: true,
16
22
  freezeAfterBuild: true,
23
+ usePBRMaterials: false,
24
+ releaseRawPartsAfterBuild: true,
17
25
  ...options,
18
26
  };
19
27
  if (opts.verbose) {
20
- console.log(`\n🏗️ Building Babylon.js scene from ${model.parts.length} raw parts...`);
28
+ logInfo(`\nBuilding Babylon.js scene from ${model.parts.length} raw parts...`, { modelID: model.modelID });
21
29
  }
30
+ /*
31
+ const skybox = MeshBuilder.CreateBox("skyBox", { size: 10000 }, scene);
32
+ const skyboxMaterial = new PBRMaterial("skyBoxMaterial", scene);
33
+ skyboxMaterial.backFaceCulling = false;
34
+ skyboxMaterial.reflectionTexture = scene.environmentTexture;
35
+ skyboxMaterial.reflectionTexture!.coordinatesMode = Texture.SKYBOX_MODE;
36
+ skyboxMaterial.disableLighting = true;
37
+ skyboxMaterial.microSurface = 0.3;
38
+ // skybox.material = skyboxMaterial;
39
+ */
22
40
  // Create root transform node (without scaling yet)
23
41
  const rootNode = new TransformNode("ifc-root", scene);
24
- // Create meshes from raw parts
25
- const meshesWithColor = model.parts.map((part) => {
42
+ // Validate and create meshes from raw parts
43
+ let invalidPartCount = 0;
44
+ const validParts = model.parts.filter((part) => {
45
+ const error = validateRawPart(part);
46
+ if (error) {
47
+ invalidPartCount++;
48
+ if (opts.verbose) {
49
+ logWarn(`Skipping invalid part: ${error}`, {
50
+ modelID: model.modelID,
51
+ expressID: part.expressID,
52
+ geometryExpressID: part.geometryExpressID,
53
+ });
54
+ }
55
+ return false;
56
+ }
57
+ return true;
58
+ });
59
+ const meshesWithColor = validParts.map((part) => {
26
60
  return createMeshFromPart(part, model.modelID, scene, rootNode, opts);
27
61
  });
28
62
  if (opts.verbose) {
29
- console.log(` Created ${meshesWithColor.length} initial meshes`);
63
+ logInfo(` Created ${meshesWithColor.length} initial meshes`, { modelID: model.modelID });
64
+ if (invalidPartCount > 0) {
65
+ logInfo(` Skipped ${invalidPartCount} invalid geometry part(s)`, { modelID: model.modelID });
66
+ }
30
67
  }
31
68
  // Group by (expressID + colorId)
32
69
  const meshGroups = groupMeshesByKey(meshesWithColor);
33
70
  if (opts.verbose) {
34
- console.log(` Grouped into ${meshGroups.size} unique (expressID + material) combinations`);
71
+ logInfo(` Grouped into ${meshGroups.size} unique (expressID + material) combinations`, { modelID: model.modelID });
35
72
  }
36
73
  // Create materials and merge groups
37
74
  const materialCache = new Map();
@@ -47,7 +84,7 @@ export function buildIfcModel(model, scene, options = {}) {
47
84
  // Get or create material
48
85
  const material = getMaterial(colorId, color, scene, materialCache, materialZOffset, opts);
49
86
  // Increment z-offset with modulo to prevent infinite growth
50
- materialZOffset = (materialZOffset + 0.05) % 1.0;
87
+ materialZOffset = (materialZOffset + MATERIAL_Z_OFFSET_STEP) % MATERIAL_Z_OFFSET_WRAP;
51
88
  if (meshes.length === 1) {
52
89
  // Single mesh - no merging needed
53
90
  const mesh = meshes[0];
@@ -56,48 +93,32 @@ export function buildIfcModel(model, scene, options = {}) {
56
93
  finalMeshes.push(mesh);
57
94
  }
58
95
  else if (opts.mergeMeshes) {
59
- // Multiple meshes - check if we can merge
60
- const canMerge = canMergeMeshes(meshes, model.storeyMap);
61
- if (canMerge) {
62
- // Safe to merge
63
- const mergedMesh = Mesh.MergeMeshes(meshes, true, // disposeSource
64
- true, // allow32BitsIndices
65
- undefined, // meshSubclass
66
- false, // subdivideWithSubMeshes
67
- false);
68
- if (mergedMesh) {
69
- mergedMesh.name = `ifc-${expressID}`;
70
- mergedMesh.parent = rootNode;
71
- mergedMesh.material = material;
72
- mergedMesh.metadata = {
73
- expressID: expressID,
74
- modelID: model.modelID,
75
- };
76
- mergedMesh.isVisible = true;
77
- finalMeshes.push(mergedMesh);
78
- mergedCount++;
79
- }
80
- else {
81
- // Merge failed - keep original meshes
82
- meshes.forEach((mesh) => {
83
- mesh.name = `ifc-${expressID}`;
84
- mesh.material = material;
85
- finalMeshes.push(mesh);
86
- });
87
- skippedCount++;
88
- }
96
+ // Multiple meshes - merge parts belonging to the same element/material group.
97
+ const mergedMesh = Mesh.MergeMeshes(meshes, true, // disposeSource
98
+ true, // allow32BitsIndices
99
+ undefined, // meshSubclass
100
+ false, // subdivideWithSubMeshes
101
+ false);
102
+ if (mergedMesh) {
103
+ mergedMesh.name = `ifc-${expressID}`;
104
+ mergedMesh.parent = rootNode;
105
+ mergedMesh.material = material;
106
+ mergedMesh.metadata = {
107
+ expressID: expressID,
108
+ modelID: model.modelID,
109
+ };
110
+ mergedMesh.isVisible = true;
111
+ finalMeshes.push(mergedMesh);
112
+ mergedCount++;
89
113
  }
90
114
  else {
91
- // Cannot merge - different storeys
115
+ // Merge failed - keep original meshes
92
116
  meshes.forEach((mesh) => {
93
117
  mesh.name = `ifc-${expressID}`;
94
118
  mesh.material = material;
95
119
  finalMeshes.push(mesh);
96
120
  });
97
121
  skippedCount++;
98
- if (opts.verbose) {
99
- console.log(` ⚠ Skipped merging ${meshes.length} parts for expressID ${expressID} (different storeys)`);
100
- }
101
122
  }
102
123
  }
103
124
  else {
@@ -121,7 +142,7 @@ export function buildIfcModel(model, scene, options = {}) {
121
142
  const centerOffset = bounds.center;
122
143
  rootNode.position.subtractInPlace(centerOffset);
123
144
  if (opts.verbose) {
124
- console.log(` 📍 Model auto-centered at origin (offset: ${centerOffset.x.toFixed(2)}, ${centerOffset.y.toFixed(2)}, ${centerOffset.z.toFixed(2)})`);
145
+ logInfo(` Model auto-centered at origin (offset: ${centerOffset.x.toFixed(2)}, ${centerOffset.y.toFixed(2)}, ${centerOffset.z.toFixed(2)})`, { modelID: model.modelID });
125
146
  }
126
147
  }
127
148
  }
@@ -135,22 +156,19 @@ export function buildIfcModel(model, scene, options = {}) {
135
156
  buildTimeMs,
136
157
  };
137
158
  if (opts.verbose) {
138
- console.log(`\n✅ Model building complete:`);
139
- console.log(` Original parts: ${stats.originalPartCount}`);
140
- console.log(` Merged groups: ${stats.mergedGroupCount}`);
141
- console.log(` Skipped groups: ${stats.skippedGroupCount}`);
142
- console.log(` Final meshes: ${stats.finalMeshCount}`);
143
- console.log(` Materials created: ${stats.materialCount}`);
144
- console.log(` Build time: ${stats.buildTimeMs.toFixed(2)}ms`);
159
+ logInfo(`\nModel building complete:`, { modelID: model.modelID });
160
+ logInfo(` Original parts: ${stats.originalPartCount}`, { modelID: model.modelID });
161
+ logInfo(` Merged groups: ${stats.mergedGroupCount}`, { modelID: model.modelID });
162
+ logInfo(` Skipped groups: ${stats.skippedGroupCount}`, { modelID: model.modelID });
163
+ logInfo(` Final meshes: ${stats.finalMeshCount}`, { modelID: model.modelID });
164
+ logInfo(` Materials created: ${stats.materialCount}`, { modelID: model.modelID });
165
+ logInfo(` Build time: ${stats.buildTimeMs.toFixed(2)}ms`, { modelID: model.modelID });
145
166
  }
146
167
  if (opts.freezeAfterBuild) {
147
168
  // Freeze only IFC meshes that are children of ifc-root
148
- const rootNode = scene.getTransformNodeByName("ifc-root");
149
- if (rootNode) {
150
- rootNode.getChildMeshes().forEach((mesh) => {
151
- mesh.freezeWorldMatrix();
152
- });
153
- }
169
+ rootNode.getChildMeshes().forEach((mesh) => {
170
+ mesh.freezeWorldMatrix();
171
+ });
154
172
  // Freeze IFC materials only
155
173
  scene.materials.forEach((material) => {
156
174
  if (material.name.startsWith("ifc-material-")) {
@@ -158,9 +176,12 @@ export function buildIfcModel(model, scene, options = {}) {
158
176
  }
159
177
  });
160
178
  if (opts.verbose) {
161
- console.log(` IFC meshes and materials frozen for optimal performance`);
179
+ logInfo(` IFC meshes and materials frozen for optimal performance`, { modelID: model.modelID });
162
180
  }
163
181
  }
182
+ if (opts.releaseRawPartsAfterBuild) {
183
+ model.parts = [];
184
+ }
164
185
  return {
165
186
  meshes: finalMeshes,
166
187
  rootNode,
@@ -183,10 +204,10 @@ export function disposeIfcModel(scene) {
183
204
  const rootNode = scene.getTransformNodeByName("ifc-root");
184
205
  if (rootNode) {
185
206
  rootNode.dispose();
186
- console.log(`✓ ifc-root node and all child meshes disposed`);
207
+ logInfo(`ifc-root node and all child meshes disposed`);
187
208
  }
188
209
  if (materialCount > 0) {
189
- console.log(`✓ ${materialCount} IFC materials disposed`);
210
+ logInfo(`${materialCount} IFC materials disposed`);
190
211
  }
191
212
  }
192
213
  /**
@@ -245,7 +266,7 @@ export function centerModelAtOrigin(meshes, rootNode) {
245
266
  mesh.position.subtractInPlace(offset);
246
267
  });
247
268
  }
248
- console.log(`📍 Model centered at origin, offset: (${offset.x.toFixed(2)}, ${offset.y.toFixed(2)}, ${offset.z.toFixed(2)})`);
269
+ logInfo(`Model centered at origin, offset: (${offset.x.toFixed(2)}, ${offset.y.toFixed(2)}, ${offset.z.toFixed(2)})`);
249
270
  return offset;
250
271
  }
251
272
  // ============================================================================
@@ -265,16 +286,18 @@ function createMeshFromPart(part, modelID, scene, rootNode, options) {
265
286
  };
266
287
  // Check if normals need to be generated
267
288
  let normals = part.normals;
268
- if (options.generateNormals && normals.every((v) => v === 0)) {
289
+ const hasInvalidNormalLength = normals.length !== part.positions.length;
290
+ const shouldGenerateNormals = (options.generateNormals && areAllNormalsZero(normals)) || hasInvalidNormalLength;
291
+ if (shouldGenerateNormals) {
269
292
  const tempNormals = [];
270
- VertexData.ComputeNormals(Array.from(part.positions), Array.from(part.indices), tempNormals);
293
+ VertexData.ComputeNormals(part.positions, part.indices, tempNormals);
271
294
  normals = new Float32Array(tempNormals);
272
295
  }
273
296
  // Apply vertex data
274
297
  const vertexData = new VertexData();
275
- vertexData.positions = Array.from(part.positions);
276
- vertexData.normals = Array.from(normals);
277
- vertexData.indices = Array.from(part.indices);
298
+ vertexData.positions = part.positions;
299
+ vertexData.normals = normals;
300
+ vertexData.indices = part.indices;
278
301
  vertexData.applyToMesh(mesh);
279
302
  // Apply transformation
280
303
  if (part.flatTransform && part.flatTransform.length === 16) {
@@ -288,6 +311,39 @@ function createMeshFromPart(part, modelID, scene, rootNode, options) {
288
311
  color: part.color,
289
312
  };
290
313
  }
314
+ function areAllNormalsZero(normals) {
315
+ for (let i = 0; i < normals.length; i++) {
316
+ if (normals[i] !== 0) {
317
+ return false;
318
+ }
319
+ }
320
+ return true;
321
+ }
322
+ function validateRawPart(part) {
323
+ const vertexCount = part.positions.length / 3;
324
+ if (part.positions.length === 0 || part.positions.length % 3 !== 0) {
325
+ return "positions must be a non-empty Float32Array with length divisible by 3";
326
+ }
327
+ if (part.indices.length === 0 || part.indices.length % 3 !== 0) {
328
+ return "indices must be a non-empty Uint32Array with length divisible by 3";
329
+ }
330
+ for (let i = 0; i < part.positions.length; i++) {
331
+ if (!Number.isFinite(part.positions[i])) {
332
+ return `positions contains non-finite value at index ${i}`;
333
+ }
334
+ }
335
+ for (let i = 0; i < part.normals.length; i++) {
336
+ if (!Number.isFinite(part.normals[i])) {
337
+ return `normals contains non-finite value at index ${i}`;
338
+ }
339
+ }
340
+ for (let i = 0; i < part.indices.length; i++) {
341
+ if (part.indices[i] >= vertexCount) {
342
+ return `indices contains out-of-range vertex index ${part.indices[i]} (vertexCount=${vertexCount})`;
343
+ }
344
+ }
345
+ return null;
346
+ }
291
347
  /**
292
348
  * Group meshes by (expressID + colorId)
293
349
  */
@@ -311,37 +367,48 @@ function getMaterial(colorId, color, scene, materialCache, materialZOffset, opti
311
367
  if (materialCache.has(colorId)) {
312
368
  return materialCache.get(colorId);
313
369
  }
314
- const material = new StandardMaterial(`ifc-material-${colorId}`, scene);
315
- if (color) {
316
- material.diffuseColor = new Color3(color.x, color.y, color.z);
317
- material.alpha = color.w;
370
+ let material;
371
+ if (options.usePBRMaterials) {
372
+ // Create PBR material
373
+ const pbrMaterial = new PBRMaterial(`ifc-material-${colorId}`, scene);
374
+ if (color) {
375
+ pbrMaterial.albedoColor = new Color3(color.x, color.y, color.z);
376
+ pbrMaterial.alpha = color.w;
377
+ }
378
+ else {
379
+ // Default gray color
380
+ pbrMaterial.albedoColor = new Color3(DEFAULT_IFC_MATERIAL_GRAY, DEFAULT_IFC_MATERIAL_GRAY, DEFAULT_IFC_MATERIAL_GRAY);
381
+ }
382
+ // Set PBR-specific properties for non-metallic surfaces (typical for building materials)
383
+ pbrMaterial.metallic = DEFAULT_PBR_METALLIC;
384
+ pbrMaterial.roughness = DEFAULT_PBR_ROUGHNESS;
385
+ // Add z-offset to prevent z-fighting
386
+ pbrMaterial.zOffset = materialZOffset;
387
+ // Set backface culling based on options
388
+ pbrMaterial.backFaceCulling = !options.doubleSided;
389
+ material = pbrMaterial;
318
390
  }
319
391
  else {
320
- // Default gray color
321
- material.diffuseColor = new Color3(0.8, 0.8, 0.8);
392
+ // Create Standard material (default)
393
+ const standardMaterial = new StandardMaterial(`ifc-material-${colorId}`, scene);
394
+ if (color) {
395
+ standardMaterial.diffuseColor = new Color3(color.x, color.y, color.z);
396
+ standardMaterial.alpha = color.w;
397
+ }
398
+ else {
399
+ // Default gray color
400
+ standardMaterial.diffuseColor = new Color3(DEFAULT_IFC_MATERIAL_GRAY, DEFAULT_IFC_MATERIAL_GRAY, DEFAULT_IFC_MATERIAL_GRAY);
401
+ }
402
+ // Add z-offset to prevent z-fighting
403
+ standardMaterial.zOffset = materialZOffset;
404
+ // Set backface culling based on options
405
+ standardMaterial.backFaceCulling = !options.doubleSided;
406
+ material = standardMaterial;
322
407
  }
323
- // Add z-offset to prevent z-fighting
324
- material.zOffset = materialZOffset;
325
- // Set backface culling based on options
326
- material.backFaceCulling = !options.doubleSided;
408
+ material.metadata = {
409
+ color: color ? { r: color.x, g: color.y, b: color.z, a: color.w } : null,
410
+ };
327
411
  materialCache.set(colorId, material);
328
412
  return material;
329
413
  }
330
- /**
331
- * Check if meshes can be safely merged based on spatial context
332
- */
333
- function canMergeMeshes(meshes, storeyMap) {
334
- const storeyIDs = new Set();
335
- meshes.forEach((mesh) => {
336
- const expressID = mesh.metadata?.expressID;
337
- if (expressID !== undefined) {
338
- const storeyID = storeyMap.get(expressID);
339
- if (storeyID) {
340
- storeyIDs.add(storeyID);
341
- }
342
- }
343
- });
344
- // Allow merge ONLY if all parts belong to same storey OR no storey assignment
345
- return storeyIDs.size <= 1;
346
- }
347
414
  //# sourceMappingURL=ifcModel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ifcModel.js","sourceRoot":"","sources":["../src/ifcModel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ifcModel.js","sourceRoot":"","sources":["../src/ifcModel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface LogContext {
2
+ modelID?: number;
3
+ expressID?: number;
4
+ geometryExpressID?: number;
5
+ }
6
+ export declare function logInfo(message: string, context?: LogContext): void;
7
+ export declare function logWarn(message: string, context?: LogContext, detail?: unknown): void;
8
+ export declare function logError(message: string, context?: LogContext, detail?: unknown): void;
9
+ //# sourceMappingURL=logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAyBD,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAEnE;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAOrF;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAOtF"}
@@ -0,0 +1,39 @@
1
+ function formatContext(context) {
2
+ if (!context) {
3
+ return "";
4
+ }
5
+ const contextParts = [];
6
+ if (context.modelID !== undefined) {
7
+ contextParts.push(`modelID=${context.modelID}`);
8
+ }
9
+ if (context.expressID !== undefined) {
10
+ contextParts.push(`expressID=${context.expressID}`);
11
+ }
12
+ if (context.geometryExpressID !== undefined) {
13
+ contextParts.push(`geometryExpressID=${context.geometryExpressID}`);
14
+ }
15
+ return contextParts.length > 0 ? ` (${contextParts.join(", ")})` : "";
16
+ }
17
+ function withContext(message, context) {
18
+ return `${message}${formatContext(context)}`;
19
+ }
20
+ export function logInfo(message, context) {
21
+ console.log(withContext(message, context));
22
+ }
23
+ export function logWarn(message, context, detail) {
24
+ const text = withContext(message, context);
25
+ if (detail !== undefined) {
26
+ console.warn(text, detail);
27
+ return;
28
+ }
29
+ console.warn(text);
30
+ }
31
+ export function logError(message, context, detail) {
32
+ const text = withContext(message, context);
33
+ if (detail !== undefined) {
34
+ console.error(text, detail);
35
+ return;
36
+ }
37
+ console.error(text);
38
+ }
39
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAMA,SAAS,aAAa,CAAC,OAAoB;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAClC,YAAY,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACpC,YAAY,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,OAAO,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;QAC5C,YAAY,CAAC,IAAI,CAAC,qBAAqB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACxE,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,OAAoB;IACxD,OAAO,GAAG,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,OAAoB;IAC3D,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,OAAoB,EAAE,MAAgB;IAC7E,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,OAAoB,EAAE,MAAgB;IAC9E,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "babylon-ifc-loader",
3
- "version": "1.0.2",
4
- "description": "Babylon.js SceneLoader plugin for IFC files using web-ifc",
3
+ "version": "2.0.0",
4
+ "description": "Babylon.js Loader for IFC files using web-ifc",
5
5
  "type": "module",
6
6
  "main": "dist-npm/index.js",
7
7
  "module": "dist-npm/index.js",
@@ -15,6 +15,7 @@
15
15
  "files": [
16
16
  "dist-npm",
17
17
  "LICENSE",
18
+ "CHANGELOG.md",
18
19
  "readme.md",
19
20
  "API.md"
20
21
  ],
package/readme.md CHANGED
@@ -46,6 +46,7 @@ After running `npm run dev`, open:
46
46
  - **Drag & Drop:** Drop `.ifc` files onto the canvas to load them
47
47
  - **Element Picking:** Click on elements to view metadata and highlight them
48
48
  - **Intelligent Merging:** Automatically merges meshes with same material while preserving metadata
49
+ - **Structured Logging:** Typed logging helpers with optional IFC context (`modelID`, `expressID`, `geometryExpressID`)
49
50
  - **Camera Framing:** Automatically positions camera to view the entire model
50
51
  - **Inspector:** Built-in Babylon.js Inspector for debugging
51
52
  - **Keyboard Shortcuts:** Ctrl+I (or Cmd+I on Mac) toggles the inspector, works across all keyboard layouts
@@ -59,23 +60,31 @@ The codebase follows a strict layered architecture with clear separation of conc
59
60
 
60
61
  All web-ifc interaction. **Zero Babylon.js dependencies.**
61
62
 
62
- - `initializeWebIFC(wasmPath?, logLevel?)` initialize web-ifc API
63
- - `loadIfcModel(ifcAPI, source, options?)` load and extract raw geometry data
64
- - `closeIfcModel(ifcAPI, modelID)` free IFC model memory
65
- - `getProjectInfo(ifcAPI, modelID)` extract project metadata
63
+ - `initializeWebIFC(wasmPath?, logLevel?)` - initialize web-ifc API
64
+ - `loadIfcModel(ifcAPI, source, options?)` - load and extract raw geometry data
65
+ - `closeIfcModel(ifcAPI, modelID)` - free IFC model memory
66
+ - `getProjectInfo(ifcAPI, modelID)` - extract project metadata
66
67
 
67
68
  ### Rendering Layer (`src/ifcModel.ts`)
68
69
 
69
70
  All Babylon.js scene construction. **Zero web-ifc dependencies.**
70
71
 
71
- - `buildIfcModel(model, scene, options?)` create meshes, materials, merge, center
72
- - `disposeIfcModel(scene)` dispose all IFC meshes and materials
73
- - `getModelBounds(meshes)` calculate bounding box
74
- - `centerModelAtOrigin(meshes, rootNode?)` center model at origin
72
+ - `buildIfcModel(model, scene, options?)` - create meshes, materials, merge, center
73
+ - `disposeIfcModel(scene)` - dispose all IFC meshes and materials
74
+ - `getModelBounds(meshes)` - calculate bounding box
75
+ - `centerModelAtOrigin(meshes, rootNode?)` - center model at origin
75
76
 
76
77
  ### Application Layer
77
78
 
78
- - `src/main.ts` uses low-level two-step API (ifcInit + ifcModel)
79
+ - `src/main.ts` - uses low-level two-step API (ifcInit + ifcModel)
80
+
81
+ ### Shared Utilities (`src/logging.ts`)
82
+
83
+ Structured logging helpers used across IFC loading and rendering:
84
+
85
+ - `logInfo(message, context?)`
86
+ - `logWarn(message, context?, detail?)`
87
+ - `logError(message, context?, detail?)`
79
88
 
80
89
  ## Usage
81
90
 
@@ -185,6 +194,8 @@ The project uses [Vitest](https://vitest.dev/) for unit testing with the followi
185
194
  | `getProjectInfo.test.ts` | Tests for project metadata extraction |
186
195
  | `buildIfcModel.test.ts` | Tests for Babylon.js scene building |
187
196
  | `zOffset.test.ts` | Tests for z-offset material handling |
197
+ | `buildIfcModel.perf.test.ts` | Perf regression tests for synthetic large models |
198
+ | `logging.test.ts` | Unit tests for structured logging helpers |
188
199
 
189
200
  ### Running Tests
190
201
 
@@ -222,22 +233,22 @@ describe("myFunction", () => {
222
233
 
223
234
  ```
224
235
  src/
225
- ├── main.ts app entry (two-step API: ifcInit + ifcModel)
226
- ├── ifcInit.ts IFC data layer (web-ifc only)
227
- ├── ifcModel.ts rendering layer (Babylon.js only)
228
- ├── style.css basic styling
229
- └── __tests__/ unit tests
236
+ |-- main.ts - app entry (two-step API: ifcInit + ifcModel)
237
+ |-- ifcInit.ts - IFC data layer (web-ifc only)
238
+ |-- ifcModel.ts - rendering layer (Babylon.js only)
239
+ |-- style.css - basic styling
240
+ `-- __tests__/ - unit tests
230
241
 
231
242
  public/
232
- ├── test.ifc sample IFC file loaded at startup
233
- ├── example.ifc additional sample
234
- └── bplogo.svg asset
243
+ |-- test.ifc - sample IFC file loaded at startup
244
+ |-- example.ifc - additional sample
245
+ `-- bplogo.svg - asset
235
246
 
236
247
  Root
237
- ├── index.html HTML entry
238
- ├── vite.config.ts copies web-ifc.wasm to dist/, sets WASM handling
239
- ├── tsconfig.json TypeScript config
240
- └── package.json scripts and deps
248
+ |-- index.html - HTML entry
249
+ |-- vite.config.ts - copies web-ifc.wasm to dist/, sets WASM handling
250
+ |-- tsconfig.json - TypeScript config
251
+ `-- package.json - scripts and deps
241
252
  ```
242
253
 
243
254
  ## Picking and Highlighting
@@ -249,8 +260,9 @@ Root
249
260
  ## Materials, Merging, and Performance
250
261
 
251
262
  - Materials are `StandardMaterial` per unique RGBA color, configurable `backFaceCulling`, incremental `zOffset` to mitigate z-fighting
252
- - Meshes are merged per (expressID + color) when safe; safety check prevents merging across different storeys using spatial relations
263
+ - Meshes are merged per (expressID + color)
253
264
  - Metadata (`expressID`, `modelID`) preserved on merged meshes
265
+ - Material metadata includes source color as `material.metadata.color` with `{ r, g, b, a }` (or `null`)
254
266
  - Stats for counts, triangles, materials, and build time are computed
255
267
 
256
268
  ### Custom Merging Strategy
@@ -308,3 +320,9 @@ for (const mesh of meshes) {
308
320
  ## License
309
321
 
310
322
  Apache-2.0 - See [LICENSE](./LICENSE) for details.
323
+
324
+ ## Changelog
325
+
326
+ See [CHANGELOG.md](./CHANGELOG.md) for release notes and recent changes.
327
+
328
+