@ifc-lite/geometry 1.0.0 → 1.1.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.
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Geometry Deduplicator - Groups identical meshes for GPU instancing
3
+ *
4
+ * Reduces draw calls from N individual meshes to M unique geometries with instances.
5
+ * A typical building with 40,000 elements might have only 500-2000 unique geometries.
6
+ */
7
+ import type { MeshData } from './types.js';
8
+ export interface InstancedMeshData {
9
+ /** Unique hash for this geometry */
10
+ geometryHash: string;
11
+ /** Vertex positions (shared by all instances) */
12
+ positions: Float32Array;
13
+ /** Vertex normals (shared by all instances) */
14
+ normals: Float32Array;
15
+ /** Triangle indices (shared by all instances) */
16
+ indices: Uint32Array;
17
+ /** All instances of this geometry */
18
+ instances: Array<{
19
+ expressId: number;
20
+ color: [number, number, number, number];
21
+ }>;
22
+ }
23
+ /**
24
+ * Deduplicate meshes by grouping identical geometries
25
+ * Returns instanced mesh data that can be rendered with GPU instancing
26
+ */
27
+ export declare function deduplicateMeshes(meshes: MeshData[]): InstancedMeshData[];
28
+ /**
29
+ * Stats about deduplication results
30
+ */
31
+ export interface DeduplicationStats {
32
+ inputMeshes: number;
33
+ uniqueGeometries: number;
34
+ deduplicationRatio: number;
35
+ totalInstances: number;
36
+ maxInstancesPerGeometry: number;
37
+ }
38
+ /**
39
+ * Get statistics about deduplication results
40
+ */
41
+ export declare function getDeduplicationStats(instanced: InstancedMeshData[]): DeduplicationStats;
42
+ //# sourceMappingURL=geometry-deduplicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry-deduplicator.d.ts","sourceRoot":"","sources":["../src/geometry-deduplicator.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,SAAS,EAAE,YAAY,CAAC;IACxB,+CAA+C;IAC/C,OAAO,EAAE,YAAY,CAAC;IACtB,iDAAiD;IACjD,OAAO,EAAE,WAAW,CAAC;IACrB,qCAAqC;IACrC,SAAS,EAAE,KAAK,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;KAGzC,CAAC,CAAC;CACJ;AAqCD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,iBAAiB,EAAE,CA6BzE;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,kBAAkB,CAWxF"}
@@ -0,0 +1,80 @@
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
+ * Fast hash for geometry data
6
+ * Uses a subset of vertices for speed while maintaining uniqueness
7
+ */
8
+ function hashGeometry(positions, indices) {
9
+ // Hash based on: vertex count, index count, first few vertices, first few indices
10
+ const parts = [
11
+ positions.length,
12
+ indices.length,
13
+ ];
14
+ // Sample first 12 position values (4 vertices)
15
+ const positionSamples = Math.min(12, positions.length);
16
+ for (let i = 0; i < positionSamples; i++) {
17
+ // Quantize to 3 decimal places for floating point stability
18
+ parts.push(Math.round(positions[i] * 1000));
19
+ }
20
+ // Sample first 6 indices (2 triangles)
21
+ const indexSamples = Math.min(6, indices.length);
22
+ for (let i = 0; i < indexSamples; i++) {
23
+ parts.push(indices[i]);
24
+ }
25
+ // Also sample from middle and end if we have enough data
26
+ if (positions.length > 24) {
27
+ const mid = Math.floor(positions.length / 2);
28
+ for (let i = 0; i < 6; i++) {
29
+ parts.push(Math.round(positions[mid + i] * 1000));
30
+ }
31
+ }
32
+ return parts.join('_');
33
+ }
34
+ /**
35
+ * Deduplicate meshes by grouping identical geometries
36
+ * Returns instanced mesh data that can be rendered with GPU instancing
37
+ */
38
+ export function deduplicateMeshes(meshes) {
39
+ const geometryGroups = new Map();
40
+ for (const mesh of meshes) {
41
+ const hash = hashGeometry(mesh.positions, mesh.indices);
42
+ const existing = geometryGroups.get(hash);
43
+ if (existing) {
44
+ // Add as instance of existing geometry
45
+ existing.instances.push({
46
+ expressId: mesh.expressId,
47
+ color: mesh.color,
48
+ });
49
+ }
50
+ else {
51
+ // First occurrence - create new geometry group
52
+ geometryGroups.set(hash, {
53
+ geometryHash: hash,
54
+ positions: mesh.positions,
55
+ normals: mesh.normals,
56
+ indices: mesh.indices,
57
+ instances: [{
58
+ expressId: mesh.expressId,
59
+ color: mesh.color,
60
+ }],
61
+ });
62
+ }
63
+ }
64
+ return Array.from(geometryGroups.values());
65
+ }
66
+ /**
67
+ * Get statistics about deduplication results
68
+ */
69
+ export function getDeduplicationStats(instanced) {
70
+ const totalInstances = instanced.reduce((sum, g) => sum + g.instances.length, 0);
71
+ const maxInstances = Math.max(...instanced.map(g => g.instances.length));
72
+ return {
73
+ inputMeshes: totalInstances,
74
+ uniqueGeometries: instanced.length,
75
+ deduplicationRatio: totalInstances / instanced.length,
76
+ totalInstances,
77
+ maxInstancesPerGeometry: maxInstances,
78
+ };
79
+ }
80
+ //# sourceMappingURL=geometry-deduplicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry-deduplicator.js","sourceRoot":"","sources":["../src/geometry-deduplicator.ts"],"names":[],"mappings":"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"}
@@ -12,18 +12,16 @@ let ifcApi = null;
12
12
  let ifcApiInitialized = false;
13
13
  /**
14
14
  * Initialize IFC-Lite API in worker context
15
+ * The WASM binary is automatically resolved from the same location as the JS module
15
16
  */
16
- async function initIfcApi(wasmPath = '/') {
17
+ async function initIfcApi() {
17
18
  if (ifcApi && ifcApiInitialized) {
18
19
  return ifcApi;
19
20
  }
20
21
  const initStart = performance.now();
21
22
  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);
23
+ // Initialize WASM module - wasm-bindgen automatically resolves the WASM URL
24
+ await init();
27
25
  ifcApi = new IfcAPI();
28
26
  ifcApiInitialized = true;
29
27
  const initTime = performance.now() - initStart;
@@ -35,10 +33,10 @@ async function initIfcApi(wasmPath = '/') {
35
33
  */
36
34
  async function handleMeshCollection(data) {
37
35
  const taskStart = performance.now();
38
- const { buffer, wasmPath = '/' } = data;
36
+ const { buffer } = data;
39
37
  // Initialize IFC-Lite if needed
40
38
  const apiInitStart = performance.now();
41
- const api = await initIfcApi(wasmPath);
39
+ const api = await initIfcApi();
42
40
  const apiInitTime = performance.now() - apiInitStart;
43
41
  if (apiInitTime > 10) {
44
42
  console.log(`[Worker] IFC-Lite init took ${apiInitTime.toFixed(2)}ms`);
@@ -1 +1 @@
1
- {"version":3,"file":"geometry.worker.js","sourceRoot":"","sources":["../src/geometry.worker.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;GAGG;AAEH,OAAO,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAiBpE,6DAA6D;AAC7D,IAAI,MAAM,GAAkB,IAAI,CAAC;AACjC,IAAI,iBAAiB,GAAY,KAAK,CAAC;AAEvC;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,WAAmB,GAAG;IAC9C,IAAI,MAAM,IAAI,iBAAiB,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IAEjD,yBAAyB;IACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;QACpC,CAAC,CAAC,GAAG,QAAQ,uBAAuB;QACpC,CAAC,CAAC,GAAG,QAAQ,wBAAwB,CAAC;IAExC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;IACtB,iBAAiB,GAAG,IAAI,CAAC;IAEzB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,oCAAoC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEzE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,oBAAoB,CAAC,IAAgD;IAClF,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACpC,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;IAExC,gCAAgC;IAChC,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;IACrD,IAAI,WAAW,GAAG,EAAE,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,+BAA+B,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC;IAED,gDAAgD;IAChD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvD,gCAAgC;IAChC,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;IACrD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAEhD,OAAO,CAAC,GAAG,CAAC,6BAA6B,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAEjI,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,IAAuB;IAChD,IAAI,CAAC;QACH,IAAI,MAAW,CAAC;QAEhB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,iBAAiB;gBACpB,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/C,MAAM;YAER,KAAK,cAAc,CAAC;YACpB,KAAK,WAAW;gBACd,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,uBAAuB,CAAC,CAAC;YAElE;gBACE,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,sDAAsD;QACtD,MAAM,aAAa,GAAmB,EAAE,CAAC;QAEzC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,+CAA+C;YAC/C,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC1B,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;oBAC3B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC5C,CAAC;gBACD,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;oBACzB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC1C,CAAC;gBACD,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;oBACzB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,MAAM,QAAQ,GAA0B;YACtC,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,aAAa;YACnB,MAAM;SACP,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kBAAkB;QAClB,MAAM,QAAQ,GAA0B;YACtC,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,MAAM,YAAY,GAA0B;IAC1C,EAAE,EAAE,EAAE;IACN,IAAI,EAAE,OAAO;CACd,CAAC;AACF,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAE/B,uCAAuC;AACvC,IAAI,CAAC,SAAS,GAAG,KAAK,EAAE,CAAkC,EAAE,EAAE;IAC5D,MAAM,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC,CAAC"}
1
+ {"version":3,"file":"geometry.worker.js","sourceRoot":"","sources":["../src/geometry.worker.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;GAGG;AAEH,OAAO,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAiBpE,6DAA6D;AAC7D,IAAI,MAAM,GAAkB,IAAI,CAAC;AACjC,IAAI,iBAAiB,GAAY,KAAK,CAAC;AAEvC;;;GAGG;AACH,KAAK,UAAU,UAAU;IACvB,IAAI,MAAM,IAAI,iBAAiB,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IAEjD,4EAA4E;IAC5E,MAAM,IAAI,EAAE,CAAC;IACb,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;IACtB,iBAAiB,GAAG,IAAI,CAAC;IAEzB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,oCAAoC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEzE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,oBAAoB,CAAC,IAAgD;IAClF,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACpC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAExB,gCAAgC;IAChC,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;IACrD,IAAI,WAAW,GAAG,EAAE,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,+BAA+B,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC;IAED,gDAAgD;IAChD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvD,gCAAgC;IAChC,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;IACrD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAEhD,OAAO,CAAC,GAAG,CAAC,6BAA6B,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAEjI,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,IAAuB;IAChD,IAAI,CAAC;QACH,IAAI,MAAW,CAAC;QAEhB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,iBAAiB;gBACpB,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/C,MAAM;YAER,KAAK,cAAc,CAAC;YACpB,KAAK,WAAW;gBACd,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,uBAAuB,CAAC,CAAC;YAElE;gBACE,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,sDAAsD;QACtD,MAAM,aAAa,GAAmB,EAAE,CAAC;QAEzC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,+CAA+C;YAC/C,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC1B,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;oBAC3B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC5C,CAAC;gBACD,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;oBACzB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC1C,CAAC;gBACD,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;oBACzB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,MAAM,QAAQ,GAA0B;YACtC,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,aAAa;YACnB,MAAM;SACP,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kBAAkB;QAClB,MAAM,QAAQ,GAA0B;YACtC,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,MAAM,YAAY,GAA0B;IAC1C,EAAE,EAAE,EAAE;IACN,IAAI,EAAE,OAAO;CACd,CAAC;AACF,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAE/B,uCAAuC;AACvC,IAAI,CAAC,SAAS,GAAG,KAAK,EAAE,CAAkC,EAAE,EAAE;IAC5D,MAAM,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC,CAAC"}
@@ -2,20 +2,65 @@
2
2
  * IFC-Lite bridge - initializes and manages IFC-Lite WASM for geometry processing
3
3
  * Replaces web-ifc-bridge.ts with native IFC-Lite implementation (1.9x faster)
4
4
  */
5
- import { IfcAPI, MeshCollection } from '@ifc-lite/wasm';
6
- export type { MeshCollection };
5
+ import { IfcAPI, MeshCollection, MeshDataJs, InstancedMeshCollection, InstancedGeometry, InstanceData } from '@ifc-lite/wasm';
6
+ export type { MeshCollection, MeshDataJs, InstancedMeshCollection, InstancedGeometry, InstanceData };
7
+ export interface StreamingProgress {
8
+ percent: number;
9
+ processed: number;
10
+ total: number;
11
+ phase: 'simple' | 'simple_complete' | 'complex';
12
+ }
13
+ export interface StreamingStats {
14
+ totalMeshes: number;
15
+ totalVertices: number;
16
+ totalTriangles: number;
17
+ }
18
+ export interface InstancedStreamingStats {
19
+ totalGeometries: number;
20
+ totalInstances: number;
21
+ }
22
+ export interface ParseMeshesAsyncOptions {
23
+ batchSize?: number;
24
+ onBatch?: (meshes: MeshDataJs[], progress: StreamingProgress) => void;
25
+ onComplete?: (stats: StreamingStats) => void;
26
+ }
27
+ export interface ParseMeshesInstancedAsyncOptions {
28
+ batchSize?: number;
29
+ onBatch?: (geometries: InstancedGeometry[], progress: StreamingProgress) => void;
30
+ onComplete?: (stats: InstancedStreamingStats) => void;
31
+ }
7
32
  export declare class IfcLiteBridge {
8
33
  private ifcApi;
9
34
  private initialized;
10
35
  /**
11
36
  * Initialize IFC-Lite WASM
37
+ * The WASM binary is automatically resolved from the same location as the JS module
12
38
  */
13
- init(wasmPath?: string): Promise<void>;
39
+ init(_wasmPath?: string): Promise<void>;
14
40
  /**
15
- * Parse IFC content and return mesh collection
41
+ * Parse IFC content and return mesh collection (blocking)
16
42
  * Returns individual meshes with express IDs and colors
17
43
  */
18
44
  parseMeshes(content: string): MeshCollection;
45
+ /**
46
+ * Parse IFC content and return instanced geometry collection (blocking)
47
+ * Groups identical geometries by hash and returns instances with transforms
48
+ * Reduces draw calls significantly for buildings with repeated elements
49
+ */
50
+ parseMeshesInstanced(content: string): InstancedMeshCollection;
51
+ /**
52
+ * Parse IFC content with streaming (non-blocking)
53
+ * Yields batches progressively for fast first frame
54
+ * Simple geometry (walls, slabs, beams) processed first
55
+ */
56
+ parseMeshesAsync(content: string, options?: ParseMeshesAsyncOptions): Promise<void>;
57
+ /**
58
+ * Parse IFC content with streaming instanced geometry (non-blocking)
59
+ * Groups identical geometries and yields batches progressively
60
+ * Simple geometry (walls, slabs, beams) processed first
61
+ * Reduces draw calls significantly for buildings with repeated elements
62
+ */
63
+ parseMeshesInstancedAsync(content: string, options?: ParseMeshesInstancedAsyncOptions): Promise<void>;
19
64
  /**
20
65
  * Get IFC-Lite API instance
21
66
  */
@@ -1 +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"}
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,UAAU,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACpI,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC;AAErG,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,QAAQ,GAAG,iBAAiB,GAAG,SAAS,CAAC;CACjD;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACtE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,gCAAgC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,iBAAiB,EAAE,EAAE,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjF,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;CACvD;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAkB;IAErC;;;OAGG;IACG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7C;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc;IAO5C;;;;OAIG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB;IAO9D;;;;OAIG;IACG,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7F;;;;;OAKG;IACG,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gCAAqC,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/G;;OAEG;IACH,MAAM,IAAI,MAAM;IAOhB;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,UAAU,IAAI,MAAM;CAGrB"}
@@ -11,20 +11,19 @@ export class IfcLiteBridge {
11
11
  initialized = false;
12
12
  /**
13
13
  * Initialize IFC-Lite WASM
14
+ * The WASM binary is automatically resolved from the same location as the JS module
14
15
  */
15
- async init(wasmPath = '/') {
16
+ async init(_wasmPath) {
16
17
  if (this.initialized)
17
18
  return;
18
- // Initialize WASM module
19
- const wasmUrl = wasmPath.endsWith('/')
20
- ? `${wasmPath}ifc_lite_wasm_bg.wasm`
21
- : `${wasmPath}/ifc_lite_wasm_bg.wasm`;
22
- await init(wasmUrl);
19
+ // Initialize WASM module - wasm-bindgen automatically resolves the WASM URL
20
+ // from import.meta.url, no need to manually construct paths
21
+ await init();
23
22
  this.ifcApi = new IfcAPI();
24
23
  this.initialized = true;
25
24
  }
26
25
  /**
27
- * Parse IFC content and return mesh collection
26
+ * Parse IFC content and return mesh collection (blocking)
28
27
  * Returns individual meshes with express IDs and colors
29
28
  */
30
29
  parseMeshes(content) {
@@ -33,6 +32,40 @@ export class IfcLiteBridge {
33
32
  }
34
33
  return this.ifcApi.parseMeshes(content);
35
34
  }
35
+ /**
36
+ * Parse IFC content and return instanced geometry collection (blocking)
37
+ * Groups identical geometries by hash and returns instances with transforms
38
+ * Reduces draw calls significantly for buildings with repeated elements
39
+ */
40
+ parseMeshesInstanced(content) {
41
+ if (!this.ifcApi) {
42
+ throw new Error('IFC-Lite not initialized. Call init() first.');
43
+ }
44
+ return this.ifcApi.parseMeshesInstanced(content);
45
+ }
46
+ /**
47
+ * Parse IFC content with streaming (non-blocking)
48
+ * Yields batches progressively for fast first frame
49
+ * Simple geometry (walls, slabs, beams) processed first
50
+ */
51
+ async parseMeshesAsync(content, options = {}) {
52
+ if (!this.ifcApi) {
53
+ throw new Error('IFC-Lite not initialized. Call init() first.');
54
+ }
55
+ return this.ifcApi.parseMeshesAsync(content, options);
56
+ }
57
+ /**
58
+ * Parse IFC content with streaming instanced geometry (non-blocking)
59
+ * Groups identical geometries and yields batches progressively
60
+ * Simple geometry (walls, slabs, beams) processed first
61
+ * Reduces draw calls significantly for buildings with repeated elements
62
+ */
63
+ async parseMeshesInstancedAsync(content, options = {}) {
64
+ if (!this.ifcApi) {
65
+ throw new Error('IFC-Lite not initialized. Call init() first.');
66
+ }
67
+ return this.ifcApi.parseMeshesInstancedAsync(content, options);
68
+ }
36
69
  /**
37
70
  * Get IFC-Lite API instance
38
71
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ifc-lite-bridge.js","sourceRoot":"","sources":["../src/ifc-lite-bridge.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;GAGG;AAEH,OAAO,IAAI,EAAE,EAAE,MAAM,EAAkB,MAAM,gBAAgB,CAAC;AAG9D,MAAM,OAAO,aAAa;IAChB,MAAM,GAAkB,IAAI,CAAC;IAC7B,WAAW,GAAY,KAAK,CAAC;IAErC;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,WAAmB,GAAG;QAC/B,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAE7B,yBAAyB;QACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;YACpC,CAAC,CAAC,GAAG,QAAQ,uBAAuB;YACpC,CAAC,CAAC,GAAG,QAAQ,wBAAwB,CAAC;QAExC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,OAAe;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,SAAS,CAAC;IAC3C,CAAC;CACF"}
1
+ {"version":3,"file":"ifc-lite-bridge.js","sourceRoot":"","sources":["../src/ifc-lite-bridge.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;GAGG;AAEH,OAAO,IAAI,EAAE,EAAE,MAAM,EAAwF,MAAM,gBAAgB,CAAC;AAiCpI,MAAM,OAAO,aAAa;IAChB,MAAM,GAAkB,IAAI,CAAC;IAC7B,WAAW,GAAY,KAAK,CAAC;IAErC;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,SAAkB;QAC3B,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAE7B,4EAA4E;QAC5E,4DAA4D;QAC5D,MAAM,IAAI,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,OAAe;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACH,oBAAoB,CAAC,OAAe;QAClC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,gBAAgB,CAAC,OAAe,EAAE,UAAmC,EAAE;QAC3E,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,yBAAyB,CAAC,OAAe,EAAE,UAA4C,EAAE;QAC7F,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,SAAS,CAAC;IAC3C,CAAC;CACF"}
@@ -2,8 +2,28 @@
2
2
  * IFC-Lite Mesh Collector - extracts triangle data from IFC-Lite WASM
3
3
  * Replaces mesh-collector.ts - uses native Rust geometry processing (1.9x faster)
4
4
  */
5
- import type { IfcAPI } from '@ifc-lite/wasm';
5
+ import type { IfcAPI, InstancedGeometry } from '@ifc-lite/wasm';
6
6
  import type { MeshData } from './types.js';
7
+ export interface StreamingProgress {
8
+ percent: number;
9
+ processed: number;
10
+ total: number;
11
+ phase: 'simple' | 'simple_complete' | 'complex';
12
+ }
13
+ export interface StreamingBatchEvent {
14
+ type: 'batch';
15
+ meshes: MeshData[];
16
+ progress: StreamingProgress;
17
+ }
18
+ export interface StreamingCompleteEvent {
19
+ type: 'complete';
20
+ stats: {
21
+ totalMeshes: number;
22
+ totalVertices: number;
23
+ totalTriangles: number;
24
+ };
25
+ }
26
+ export type StreamingEvent = StreamingBatchEvent | StreamingCompleteEvent;
7
27
  export declare class IfcLiteMeshCollector {
8
28
  private ifcApi;
9
29
  private content;
@@ -21,8 +41,16 @@ export declare class IfcLiteMeshCollector {
21
41
  collectMeshes(): MeshData[];
22
42
  /**
23
43
  * Collect meshes incrementally, yielding batches for progressive rendering
24
- * @param batchSize Number of meshes per batch (default: 100)
44
+ * Uses fast-first-frame streaming: simple geometry (walls, slabs) first
45
+ * @param batchSize Number of meshes per batch (default: 25 for faster first frame)
25
46
  */
26
47
  collectMeshesStreaming(batchSize?: number): AsyncGenerator<MeshData[]>;
48
+ /**
49
+ * Collect instanced geometry incrementally, yielding batches for progressive rendering
50
+ * Groups identical geometries by hash (before transformation) for GPU instancing
51
+ * Uses fast-first-frame streaming: simple geometry (walls, slabs) first
52
+ * @param batchSize Number of unique geometries per batch (default: 25)
53
+ */
54
+ collectInstancedGeometryStreaming(batchSize?: number): AsyncGenerator<InstancedGeometry[]>;
27
55
  }
28
56
  //# sourceMappingURL=ifc-lite-mesh-collector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ifc-lite-mesh-collector.d.ts","sourceRoot":"","sources":["../src/ifc-lite-mesh-collector.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAK3C;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAUvB;;;OAGG;IACH,aAAa,IAAI,QAAQ,EAAE;IAwD3B;;;OAGG;IACI,sBAAsB,CAAC,SAAS,GAAE,MAAY,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;CA8DnF"}
1
+ {"version":3,"file":"ifc-lite-mesh-collector.d.ts","sourceRoot":"","sources":["../src/ifc-lite-mesh-collector.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAc,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,QAAQ,GAAG,iBAAiB,GAAG,SAAS,CAAC;CACjD;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG,sBAAsB,CAAC;AAE1E,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAK3C;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAUvB;;;OAGG;IACH,aAAa,IAAI,QAAQ,EAAE;IAwD3B;;;;OAIG;IACI,sBAAsB,CAAC,SAAS,GAAE,MAAW,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;IAoFjF;;;;;OAKG;IACI,iCAAiC,CAAC,SAAS,GAAE,MAAW,GAAG,cAAc,CAAC,iBAAiB,EAAE,CAAC;CAsDtG"}
@@ -73,59 +73,133 @@ export class IfcLiteMeshCollector {
73
73
  }
74
74
  /**
75
75
  * Collect meshes incrementally, yielding batches for progressive rendering
76
- * @param batchSize Number of meshes per batch (default: 100)
76
+ * Uses fast-first-frame streaming: simple geometry (walls, slabs) first
77
+ * @param batchSize Number of meshes per batch (default: 25 for faster first frame)
77
78
  */
78
- async *collectMeshesStreaming(batchSize = 100) {
79
- // const totalStart = performance.now();
80
- // const parseStart = performance.now();
81
- const collection = this.ifcApi.parseMeshes(this.content);
82
- // const parseTime = performance.now() - parseStart;
83
- let batch = [];
84
- let processedCount = 0;
85
- // Process meshes in batches
86
- for (let i = 0; i < collection.length; i++) {
87
- const mesh = collection.get(i);
88
- if (!mesh)
89
- continue;
90
- // Get color array [r, g, b, a]
91
- const colorArray = mesh.color;
92
- const color = [
93
- colorArray[0],
94
- colorArray[1],
95
- colorArray[2],
96
- colorArray[3],
97
- ];
98
- // Capture arrays once (WASM creates new copies on each access)
99
- const positions = mesh.positions;
100
- const normals = mesh.normals;
101
- const indices = mesh.indices;
102
- // Convert IFC Z-up to WebGL Y-up (modify captured arrays)
103
- this.convertZUpToYUp(positions);
104
- this.convertZUpToYUp(normals);
105
- batch.push({
106
- expressId: mesh.expressId,
107
- positions,
108
- normals,
109
- indices,
110
- color,
111
- });
112
- // Free the individual mesh
113
- mesh.free();
114
- processedCount++;
115
- // Yield batch when full
116
- if (batch.length >= batchSize) {
117
- yield batch;
118
- batch = [];
119
- // Yield to UI thread
120
- await new Promise(resolve => setTimeout(resolve, 0));
79
+ async *collectMeshesStreaming(batchSize = 25) {
80
+ // Queue to hold batches produced by async callback
81
+ const batchQueue = [];
82
+ let resolveWaiting = null;
83
+ let isComplete = false;
84
+ // Start async processing
85
+ const processingPromise = this.ifcApi.parseMeshesAsync(this.content, {
86
+ batchSize,
87
+ onBatch: (meshes, _progress) => {
88
+ // Convert WASM meshes to MeshData[]
89
+ const convertedBatch = [];
90
+ for (const mesh of meshes) {
91
+ const colorArray = mesh.color;
92
+ const color = [
93
+ colorArray[0],
94
+ colorArray[1],
95
+ colorArray[2],
96
+ colorArray[3],
97
+ ];
98
+ // Capture arrays once
99
+ const positions = mesh.positions;
100
+ const normals = mesh.normals;
101
+ const indices = mesh.indices;
102
+ // Convert IFC Z-up to WebGL Y-up
103
+ this.convertZUpToYUp(positions);
104
+ this.convertZUpToYUp(normals);
105
+ convertedBatch.push({
106
+ expressId: mesh.expressId,
107
+ positions,
108
+ normals,
109
+ indices,
110
+ color,
111
+ });
112
+ // Free the mesh to avoid memory leaks
113
+ mesh.free();
114
+ }
115
+ // Add batch to queue
116
+ batchQueue.push(convertedBatch);
117
+ // Wake up the generator if it's waiting
118
+ if (resolveWaiting) {
119
+ resolveWaiting();
120
+ resolveWaiting = null;
121
+ }
122
+ },
123
+ onComplete: (_stats) => {
124
+ isComplete = true;
125
+ // Wake up the generator if it's waiting
126
+ if (resolveWaiting) {
127
+ resolveWaiting();
128
+ resolveWaiting = null;
129
+ }
130
+ },
131
+ });
132
+ // Yield batches as they become available
133
+ while (true) {
134
+ // Yield any queued batches
135
+ while (batchQueue.length > 0) {
136
+ yield batchQueue.shift();
121
137
  }
138
+ // Check if we're done
139
+ if (isComplete && batchQueue.length === 0) {
140
+ break;
141
+ }
142
+ // Wait for more batches
143
+ await new Promise((resolve) => {
144
+ resolveWaiting = resolve;
145
+ });
122
146
  }
123
- // Yield remaining meshes
124
- if (batch.length > 0) {
125
- yield batch;
147
+ // Ensure processing is complete
148
+ await processingPromise;
149
+ }
150
+ /**
151
+ * Collect instanced geometry incrementally, yielding batches for progressive rendering
152
+ * Groups identical geometries by hash (before transformation) for GPU instancing
153
+ * Uses fast-first-frame streaming: simple geometry (walls, slabs) first
154
+ * @param batchSize Number of unique geometries per batch (default: 25)
155
+ */
156
+ async *collectInstancedGeometryStreaming(batchSize = 25) {
157
+ // Queue to hold batches produced by async callback
158
+ const batchQueue = [];
159
+ let resolveWaiting = null;
160
+ let isComplete = false;
161
+ // Start async processing
162
+ const processingPromise = this.ifcApi.parseMeshesInstancedAsync(this.content, {
163
+ batchSize,
164
+ onBatch: (geometries, _progress) => {
165
+ // NOTE: Do NOT convert Z-up to Y-up here for instanced geometry!
166
+ // Instance transforms position geometry in world space.
167
+ // If we convert local positions but not transforms, geometry breaks.
168
+ // The viewer handles coordinate system in the camera/shader.
169
+ // Add batch directly to queue without modification
170
+ batchQueue.push(geometries);
171
+ // Wake up the generator if it's waiting
172
+ if (resolveWaiting) {
173
+ resolveWaiting();
174
+ resolveWaiting = null;
175
+ }
176
+ },
177
+ onComplete: (_stats) => {
178
+ isComplete = true;
179
+ // Wake up the generator if it's waiting
180
+ if (resolveWaiting) {
181
+ resolveWaiting();
182
+ resolveWaiting = null;
183
+ }
184
+ },
185
+ });
186
+ // Yield batches as they become available
187
+ while (true) {
188
+ // Yield any queued batches
189
+ while (batchQueue.length > 0) {
190
+ yield batchQueue.shift();
191
+ }
192
+ // Check if we're done
193
+ if (isComplete && batchQueue.length === 0) {
194
+ break;
195
+ }
196
+ // Wait for more batches
197
+ await new Promise((resolve) => {
198
+ resolveWaiting = resolve;
199
+ });
126
200
  }
127
- // Free the collection
128
- collection.free();
201
+ // Ensure processing is complete
202
+ await processingPromise;
129
203
  }
130
204
  }
131
205
  //# sourceMappingURL=ifc-lite-mesh-collector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ifc-lite-mesh-collector.js","sourceRoot":"","sources":["../src/ifc-lite-mesh-collector.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAU/D,MAAM,OAAO,oBAAoB;IACvB,MAAM,CAAS;IACf,OAAO,CAAS;IAExB,YAAY,MAAc,EAAE,OAAe;QACzC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACK,eAAe,CAAC,MAAoB;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxB,4BAA4B;YAC5B,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,2BAA2B;YACnD,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAK,sDAAsD;QAChF,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,wCAAwC;QAExC,wCAAwC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzD,oDAAoD;QAEpD,MAAM,MAAM,GAAe,EAAE,CAAC;QAC9B,6CAA6C;QAE7C,uCAAuC;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,+BAA+B;YAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;YAC9B,MAAM,KAAK,GAAqC;gBAC9C,UAAU,CAAC,CAAC,CAAC;gBACb,UAAU,CAAC,CAAC,CAAC;gBACb,UAAU,CAAC,CAAC,CAAC;gBACb,UAAU,CAAC,CAAC,CAAC;aACd,CAAC;YAEF,+DAA+D;YAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAE7B,0DAA0D;YAC1D,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAChC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAE9B,MAAM,CAAC,IAAI,CAAC;gBACV,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS;gBACT,OAAO;gBACP,OAAO;gBACP,KAAK;aACN,CAAC,CAAC;YAEH,iDAAiD;YACjD,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;QAED,6BAA6B;QAC7B,kDAAkD;QAClD,oDAAoD;QAEpD,sBAAsB;QACtB,UAAU,CAAC,IAAI,EAAE,CAAC;QAElB,8DAA8D;QAC9D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,CAAC,sBAAsB,CAAC,YAAoB,GAAG;QACnD,wCAAwC;QAExC,wCAAwC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzD,oDAAoD;QAEpD,IAAI,KAAK,GAAe,EAAE,CAAC;QAC3B,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,4BAA4B;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,+BAA+B;YAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;YAC9B,MAAM,KAAK,GAAqC;gBAC9C,UAAU,CAAC,CAAC,CAAC;gBACb,UAAU,CAAC,CAAC,CAAC;gBACb,UAAU,CAAC,CAAC,CAAC;gBACb,UAAU,CAAC,CAAC,CAAC;aACd,CAAC;YAEF,+DAA+D;YAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAE7B,0DAA0D;YAC1D,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAChC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAE9B,KAAK,CAAC,IAAI,CAAC;gBACT,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS;gBACT,OAAO;gBACP,OAAO;gBACP,KAAK;aACN,CAAC,CAAC;YAEH,2BAA2B;YAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,cAAc,EAAE,CAAC;YAEjB,wBAAwB;YACxB,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;gBAC9B,MAAM,KAAK,CAAC;gBACZ,KAAK,GAAG,EAAE,CAAC;gBACX,qBAAqB;gBACrB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,KAAK,CAAC;QACd,CAAC;QAED,sBAAsB;QACtB,UAAU,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;CACF"}
1
+ {"version":3,"file":"ifc-lite-mesh-collector.js","sourceRoot":"","sources":["../src/ifc-lite-mesh-collector.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -9,6 +9,7 @@ export { CoordinateHandler } from './coordinate-handler.js';
9
9
  export { WorkerPool } from './worker-pool.js';
10
10
  export { GeometryQuality } from './progressive-loader.js';
11
11
  export { LODGenerator, type LODConfig, type LODMesh } from './lod.js';
12
+ export { deduplicateMeshes, getDeduplicationStats, type InstancedMeshData, type DeduplicationStats } from './geometry-deduplicator.js';
12
13
  export * from './types.js';
13
14
  export * from './default-materials.js';
14
15
  export { IfcLiteBridge as WebIfcBridge } from './ifc-lite-bridge.js';
@@ -34,18 +35,35 @@ export type StreamingGeometryEvent = {
34
35
  totalMeshes: number;
35
36
  coordinateInfo: import('./types.js').CoordinateInfo;
36
37
  };
38
+ export type StreamingInstancedGeometryEvent = {
39
+ type: 'start';
40
+ totalEstimate: number;
41
+ } | {
42
+ type: 'model-open';
43
+ modelID: number;
44
+ } | {
45
+ type: 'batch';
46
+ geometries: import('@ifc-lite/wasm').InstancedGeometry[];
47
+ totalSoFar: number;
48
+ coordinateInfo?: import('./types.js').CoordinateInfo;
49
+ } | {
50
+ type: 'complete';
51
+ totalGeometries: number;
52
+ totalInstances: number;
53
+ coordinateInfo: import('./types.js').CoordinateInfo;
54
+ };
37
55
  export declare class GeometryProcessor {
38
56
  private bridge;
39
57
  private bufferBuilder;
40
58
  private coordinateHandler;
41
59
  private workerPool;
42
- private wasmPath;
43
60
  private useWorkers;
44
61
  constructor(options?: GeometryProcessorOptions);
45
62
  /**
46
63
  * Initialize IFC-Lite WASM and worker pool
64
+ * WASM is automatically resolved from the package location - no path needed
47
65
  */
48
- init(wasmPath?: string): Promise<void>;
66
+ init(_wasmPath?: string): Promise<void>;
49
67
  /**
50
68
  * Process IFC file and extract geometry
51
69
  * @param buffer IFC file buffer
@@ -64,6 +82,28 @@ export declare class GeometryProcessor {
64
82
  * @param batchSize Number of meshes per batch (default: 100)
65
83
  */
66
84
  processStreaming(buffer: Uint8Array, _entityIndex?: Map<number, any>, batchSize?: number): AsyncGenerator<StreamingGeometryEvent>;
85
+ /**
86
+ * Process IFC file with streaming instanced geometry output for progressive rendering
87
+ * Groups identical geometries by hash (before transformation) for GPU instancing
88
+ * @param buffer IFC file buffer
89
+ * @param batchSize Number of unique geometries per batch (default: 25)
90
+ */
91
+ processInstancedStreaming(buffer: Uint8Array, batchSize?: number): AsyncGenerator<StreamingInstancedGeometryEvent>;
92
+ /**
93
+ * Adaptive processing: Choose sync or streaming based on file size
94
+ * Small files (< threshold): Load all at once for instant display
95
+ * Large files (>= threshold): Stream for fast first frame
96
+ * @param buffer IFC file buffer
97
+ * @param options Configuration options
98
+ * @param options.sizeThreshold File size threshold in bytes (default: 2MB)
99
+ * @param options.batchSize Number of meshes per batch for streaming (default: 25)
100
+ * @param options.entityIndex Optional entity index for priority-based loading
101
+ */
102
+ processAdaptive(buffer: Uint8Array, options?: {
103
+ sizeThreshold?: number;
104
+ batchSize?: number;
105
+ entityIndex?: Map<number, any>;
106
+ }): AsyncGenerator<StreamingGeometryEvent>;
67
107
  /**
68
108
  * Cleanup resources
69
109
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGpE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AACtE,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AAGvC,OAAO,EAAE,aAAa,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAOrE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,YAAY,EAAE,cAAc,CAAA;CAAE,GAC/G;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,OAAO,YAAY,EAAE,cAAc,CAAA;CAAE,CAAC;AAEnG,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,UAAU,CAAkB;gBAExB,OAAO,GAAE,wBAA6B;IASlD;;OAEG;IACG,IAAI,CAAC,QAAQ,GAAE,MAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjD;;;;OAIG;IACG,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;IAoE1F;;OAEG;YACW,uBAAuB;IAWrC;;;;;;OAMG;IACI,gBAAgB,CACrB,MAAM,EAAE,UAAU,EAClB,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,SAAS,GAAE,MAAY,GACtB,cAAc,CAAC,sBAAsB,CAAC;IAoCzC;;OAEG;IACH,OAAO,IAAI,IAAI;CAMhB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -14,6 +14,7 @@ export { CoordinateHandler } from './coordinate-handler.js';
14
14
  export { WorkerPool } from './worker-pool.js';
15
15
  export { GeometryQuality } from './progressive-loader.js';
16
16
  export { LODGenerator } from './lod.js';
17
+ export { deduplicateMeshes, getDeduplicationStats } from './geometry-deduplicator.js';
17
18
  export * from './types.js';
18
19
  export * from './default-materials.js';
19
20
  // Legacy exports for compatibility (deprecated)
@@ -28,7 +29,6 @@ export class GeometryProcessor {
28
29
  bufferBuilder;
29
30
  coordinateHandler;
30
31
  workerPool = null;
31
- wasmPath = '/';
32
32
  useWorkers = false;
33
33
  constructor(options = {}) {
34
34
  this.bridge = new IfcLiteBridge();
@@ -40,10 +40,10 @@ export class GeometryProcessor {
40
40
  }
41
41
  /**
42
42
  * Initialize IFC-Lite WASM and worker pool
43
+ * WASM is automatically resolved from the package location - no path needed
43
44
  */
44
- async init(wasmPath = '/') {
45
- this.wasmPath = wasmPath;
46
- await this.bridge.init(wasmPath);
45
+ async init(_wasmPath) {
46
+ await this.bridge.init();
47
47
  // Initialize worker pool if available (lazy - only when needed)
48
48
  // Don't initialize workers upfront to avoid overhead
49
49
  // Workers will be initialized on first use if needed
@@ -85,7 +85,6 @@ export class GeometryProcessor {
85
85
  try {
86
86
  meshes = await this.workerPool.submit('mesh-collection', {
87
87
  buffer: buffer.buffer,
88
- wasmPath: this.wasmPath,
89
88
  });
90
89
  }
91
90
  catch (error) {
@@ -134,7 +133,8 @@ export class GeometryProcessor {
134
133
  * @param entityIndex Optional entity index for priority-based loading
135
134
  * @param batchSize Number of meshes per batch (default: 100)
136
135
  */
137
- async *processStreaming(buffer, _entityIndex, batchSize = 100) {
136
+ async *processStreaming(buffer, _entityIndex, batchSize = 25 // Reduced from 100 for faster first frame
137
+ ) {
138
138
  if (!this.bridge.isInitialized()) {
139
139
  await this.init();
140
140
  }
@@ -159,6 +159,114 @@ export class GeometryProcessor {
159
159
  const coordinateInfo = this.coordinateHandler.getFinalCoordinateInfo();
160
160
  yield { type: 'complete', totalMeshes, coordinateInfo };
161
161
  }
162
+ /**
163
+ * Process IFC file with streaming instanced geometry output for progressive rendering
164
+ * Groups identical geometries by hash (before transformation) for GPU instancing
165
+ * @param buffer IFC file buffer
166
+ * @param batchSize Number of unique geometries per batch (default: 25)
167
+ */
168
+ async *processInstancedStreaming(buffer, batchSize = 25) {
169
+ if (!this.bridge.isInitialized()) {
170
+ await this.init();
171
+ }
172
+ // Reset coordinate handler for new file
173
+ this.coordinateHandler.reset();
174
+ yield { type: 'start', totalEstimate: buffer.length / 1000 };
175
+ // Convert buffer to string (IFC files are text)
176
+ const decoder = new TextDecoder();
177
+ const content = decoder.decode(buffer);
178
+ // Use a placeholder model ID (IFC-Lite doesn't use model IDs)
179
+ yield { type: 'model-open', modelID: 0 };
180
+ const collector = new IfcLiteMeshCollector(this.bridge.getApi(), content);
181
+ let totalGeometries = 0;
182
+ let totalInstances = 0;
183
+ for await (const batch of collector.collectInstancedGeometryStreaming(batchSize)) {
184
+ // For instanced geometry, we need to extract mesh data from instances for coordinate handling
185
+ // Convert InstancedGeometry to MeshData[] for coordinate handler
186
+ const meshDataBatch = [];
187
+ for (const geom of batch) {
188
+ const positions = geom.positions;
189
+ const normals = geom.normals;
190
+ const indices = geom.indices;
191
+ // Create a mesh data entry for each instance (for coordinate bounds calculation)
192
+ // We'll use the first instance's color as representative
193
+ if (geom.instance_count > 0) {
194
+ const firstInstance = geom.get_instance(0);
195
+ if (firstInstance) {
196
+ const color = firstInstance.color;
197
+ meshDataBatch.push({
198
+ expressId: firstInstance.expressId,
199
+ positions,
200
+ normals,
201
+ indices,
202
+ color: [color[0], color[1], color[2], color[3]],
203
+ });
204
+ }
205
+ }
206
+ }
207
+ // Process coordinate shifts incrementally
208
+ if (meshDataBatch.length > 0) {
209
+ this.coordinateHandler.processMeshesIncremental(meshDataBatch);
210
+ }
211
+ totalGeometries += batch.length;
212
+ totalInstances += batch.reduce((sum, g) => sum + g.instance_count, 0);
213
+ // Get current coordinate info for this batch
214
+ const coordinateInfo = this.coordinateHandler.getCurrentCoordinateInfo();
215
+ yield {
216
+ type: 'batch',
217
+ geometries: batch,
218
+ totalSoFar: totalGeometries,
219
+ coordinateInfo: coordinateInfo || undefined
220
+ };
221
+ }
222
+ const coordinateInfo = this.coordinateHandler.getFinalCoordinateInfo();
223
+ yield { type: 'complete', totalGeometries, totalInstances, coordinateInfo };
224
+ }
225
+ /**
226
+ * Adaptive processing: Choose sync or streaming based on file size
227
+ * Small files (< threshold): Load all at once for instant display
228
+ * Large files (>= threshold): Stream for fast first frame
229
+ * @param buffer IFC file buffer
230
+ * @param options Configuration options
231
+ * @param options.sizeThreshold File size threshold in bytes (default: 2MB)
232
+ * @param options.batchSize Number of meshes per batch for streaming (default: 25)
233
+ * @param options.entityIndex Optional entity index for priority-based loading
234
+ */
235
+ async *processAdaptive(buffer, options = {}) {
236
+ const sizeThreshold = options.sizeThreshold ?? 2 * 1024 * 1024; // Default 2MB
237
+ const batchSize = options.batchSize ?? 25;
238
+ if (!this.bridge.isInitialized()) {
239
+ await this.init();
240
+ }
241
+ // Reset coordinate handler for new file
242
+ this.coordinateHandler.reset();
243
+ // Small files: Load all at once (sync)
244
+ if (buffer.length < sizeThreshold) {
245
+ yield { type: 'start', totalEstimate: buffer.length / 1000 };
246
+ // Convert buffer to string (IFC files are text)
247
+ const decoder = new TextDecoder();
248
+ const content = decoder.decode(buffer);
249
+ yield { type: 'model-open', modelID: 0 };
250
+ const collector = new IfcLiteMeshCollector(this.bridge.getApi(), content);
251
+ const allMeshes = collector.collectMeshes();
252
+ // Process coordinate shifts
253
+ this.coordinateHandler.processMeshesIncremental(allMeshes);
254
+ const coordinateInfo = this.coordinateHandler.getFinalCoordinateInfo();
255
+ // Emit as single batch for immediate rendering
256
+ yield {
257
+ type: 'batch',
258
+ meshes: allMeshes,
259
+ totalSoFar: allMeshes.length,
260
+ coordinateInfo: coordinateInfo || undefined,
261
+ };
262
+ yield { type: 'complete', totalMeshes: allMeshes.length, coordinateInfo };
263
+ }
264
+ else {
265
+ // Large files: Stream for fast first frame
266
+ // processStreaming will emit its own start and model-open events
267
+ yield* this.processStreaming(buffer, options.entityIndex, batchSize);
268
+ }
269
+ }
162
270
  /**
163
271
  * Cleanup resources
164
272
  */
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -13,6 +13,35 @@ export interface Vec3 {
13
13
  y: number;
14
14
  z: number;
15
15
  }
16
+ /**
17
+ * Instance data for instanced rendering
18
+ */
19
+ export interface InstanceData {
20
+ expressId: number;
21
+ transform: Float32Array;
22
+ color: [number, number, number, number];
23
+ }
24
+ /**
25
+ * Instanced geometry - one geometry definition with multiple instances
26
+ * Reduces draw calls by grouping identical geometries with different transforms
27
+ */
28
+ export interface InstancedGeometry {
29
+ geometryId: number;
30
+ positions: Float32Array;
31
+ normals: Float32Array;
32
+ indices: Uint32Array;
33
+ instance_count: number;
34
+ get_instance(index: number): InstanceData | null;
35
+ }
36
+ /**
37
+ * Collection of instanced geometries
38
+ */
39
+ export interface InstancedMeshCollection {
40
+ length: number;
41
+ totalGeometries: number;
42
+ totalInstances: number;
43
+ get(index: number): InstancedGeometry | null;
44
+ }
16
45
  export interface AABB {
17
46
  min: Vec3;
18
47
  max: Vec3;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,IAAI;IACnB,GAAG,EAAE,IAAI,CAAC;IACV,GAAG,EAAE,IAAI,CAAC;CACX;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,IAAI,CAAC;IAClB,cAAc,EAAE,IAAI,CAAC;IACrB,aAAa,EAAE,IAAI,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,cAAc,CAAC;CAChC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,YAAY,CAAC;IACxB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,WAAW,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAAC;CAClD;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,IAAI;IACnB,GAAG,EAAE,IAAI,CAAC;IACV,GAAG,EAAE,IAAI,CAAC;CACX;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,IAAI,CAAC;IAClB,cAAc,EAAE,IAAI,CAAC;IACrB,aAAa,EAAE,IAAI,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,cAAc,CAAC;CAChC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ifc-lite/geometry",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Geometry processing bridge for IFC-Lite - 1.9x faster than web-ifc",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -12,7 +12,7 @@
12
12
  }
13
13
  },
14
14
  "dependencies": {
15
- "@ifc-lite/wasm": "1.0.0"
15
+ "@ifc-lite/wasm": "1.1.0"
16
16
  },
17
17
  "devDependencies": {
18
18
  "typescript": "^5.3.0"