@ifc-lite/geometry 1.0.0 → 1.1.1
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/dist/geometry-deduplicator.d.ts +42 -0
- package/dist/geometry-deduplicator.d.ts.map +1 -0
- package/dist/geometry-deduplicator.js +80 -0
- package/dist/geometry-deduplicator.js.map +1 -0
- package/dist/geometry.worker.js +6 -8
- package/dist/geometry.worker.js.map +1 -1
- package/dist/ifc-lite-bridge.d.ts +49 -4
- package/dist/ifc-lite-bridge.d.ts.map +1 -1
- package/dist/ifc-lite-bridge.js +40 -7
- package/dist/ifc-lite-bridge.js.map +1 -1
- package/dist/ifc-lite-mesh-collector.d.ts +30 -2
- package/dist/ifc-lite-mesh-collector.d.ts.map +1 -1
- package/dist/ifc-lite-mesh-collector.js +123 -49
- package/dist/ifc-lite-mesh-collector.js.map +1 -1
- package/dist/index.d.ts +42 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +114 -6
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +29 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -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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"}
|
package/dist/geometry.worker.js
CHANGED
|
@@ -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(
|
|
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
|
-
|
|
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
|
|
36
|
+
const { buffer } = data;
|
|
39
37
|
// Initialize IFC-Lite if needed
|
|
40
38
|
const apiInitStart = performance.now();
|
|
41
|
-
const api = await initIfcApi(
|
|
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
|
|
1
|
+
{"version":3,"file":"geometry.worker.js","sourceRoot":"","sources":["../src/geometry.worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -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(
|
|
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;
|
|
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"}
|
package/dist/ifc-lite-bridge.js
CHANGED
|
@@ -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(
|
|
16
|
+
async init(_wasmPath) {
|
|
16
17
|
if (this.initialized)
|
|
17
18
|
return;
|
|
18
|
-
// Initialize WASM module
|
|
19
|
-
|
|
20
|
-
|
|
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,
|
|
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
|
-
*
|
|
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;
|
|
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
|
-
*
|
|
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 =
|
|
79
|
-
//
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
//
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
//
|
|
128
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"ifc-lite-mesh-collector.js","sourceRoot":"","sources":["../src/ifc-lite-mesh-collector.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAkC/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;;;;OAIG;IACH,KAAK,CAAC,CAAC,sBAAsB,CAAC,YAAoB,EAAE;QAClD,mDAAmD;QACnD,MAAM,UAAU,GAAiB,EAAE,CAAC;QACpC,IAAI,cAAc,GAAwB,IAAI,CAAC;QAC/C,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,yBAAyB;QACzB,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE;YACnE,SAAS;YACT,OAAO,EAAE,CAAC,MAAoB,EAAE,SAA4B,EAAE,EAAE;gBAC9D,oCAAoC;gBACpC,MAAM,cAAc,GAAe,EAAE,CAAC;gBAEtC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;oBAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;oBAC9B,MAAM,KAAK,GAAqC;wBAC9C,UAAU,CAAC,CAAC,CAAC;wBACb,UAAU,CAAC,CAAC,CAAC;wBACb,UAAU,CAAC,CAAC,CAAC;wBACb,UAAU,CAAC,CAAC,CAAC;qBACd,CAAC;oBAEF,sBAAsB;oBACtB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;oBACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;oBAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;oBAE7B,iCAAiC;oBACjC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;oBAChC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;oBAE9B,cAAc,CAAC,IAAI,CAAC;wBAClB,SAAS,EAAE,IAAI,CAAC,SAAS;wBACzB,SAAS;wBACT,OAAO;wBACP,OAAO;wBACP,KAAK;qBACN,CAAC,CAAC;oBAEH,sCAAsC;oBACtC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,CAAC;gBAED,qBAAqB;gBACrB,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAEhC,wCAAwC;gBACxC,IAAI,cAAc,EAAE,CAAC;oBACnB,cAAc,EAAE,CAAC;oBACjB,cAAc,GAAG,IAAI,CAAC;gBACxB,CAAC;YACH,CAAC;YACD,UAAU,EAAE,CAAC,MAA8E,EAAE,EAAE;gBAC7F,UAAU,GAAG,IAAI,CAAC;gBAClB,wCAAwC;gBACxC,IAAI,cAAc,EAAE,CAAC;oBACnB,cAAc,EAAE,CAAC;oBACjB,cAAc,GAAG,IAAI,CAAC;gBACxB,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QAEH,yCAAyC;QACzC,OAAO,IAAI,EAAE,CAAC;YACZ,2BAA2B;YAC3B,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,UAAU,CAAC,KAAK,EAAG,CAAC;YAC5B,CAAC;YAED,sBAAsB;YACtB,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1C,MAAM;YACR,CAAC;YAED,wBAAwB;YACxB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,cAAc,GAAG,OAAO,CAAC;YAC3B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,gCAAgC;QAChC,MAAM,iBAAiB,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,CAAC,iCAAiC,CAAC,YAAoB,EAAE;QAC7D,mDAAmD;QACnD,MAAM,UAAU,GAA0B,EAAE,CAAC;QAC7C,IAAI,cAAc,GAAwB,IAAI,CAAC;QAC/C,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,yBAAyB;QACzB,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC,IAAI,CAAC,OAAO,EAAE;YAC5E,SAAS;YACT,OAAO,EAAE,CAAC,UAA+B,EAAE,SAA4B,EAAE,EAAE;gBACzE,iEAAiE;gBACjE,wDAAwD;gBACxD,qEAAqE;gBACrE,6DAA6D;gBAC7D,mDAAmD;gBACnD,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAE5B,wCAAwC;gBACxC,IAAI,cAAc,EAAE,CAAC;oBACnB,cAAc,EAAE,CAAC;oBACjB,cAAc,GAAG,IAAI,CAAC;gBACxB,CAAC;YACH,CAAC;YACD,UAAU,EAAE,CAAC,MAA2D,EAAE,EAAE;gBAC1E,UAAU,GAAG,IAAI,CAAC;gBAClB,wCAAwC;gBACxC,IAAI,cAAc,EAAE,CAAC;oBACnB,cAAc,EAAE,CAAC;oBACjB,cAAc,GAAG,IAAI,CAAC;gBACxB,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QAEH,yCAAyC;QACzC,OAAO,IAAI,EAAE,CAAC;YACZ,2BAA2B;YAC3B,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,UAAU,CAAC,KAAK,EAAG,CAAC;YAC5B,CAAC;YAED,sBAAsB;YACtB,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1C,MAAM;YACR,CAAC;YAED,wBAAwB;YACxB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,cAAc,GAAG,OAAO,CAAC;YAC3B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,gCAAgC;QAChC,MAAM,iBAAiB,CAAC;IAC1B,CAAC;CACF"}
|
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(
|
|
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
|
*/
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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(
|
|
45
|
-
this.
|
|
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":"AAAA;;+DAE+D;AAE/D;;;GAGG;AAEH,6CAA6C;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,qBAAqB;AACrB,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,EAAgC,MAAM,UAAU,CAAC;AACtE,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AAEvC,gDAAgD;AAChD,OAAO,EAAE,aAAa,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;GAGG;AAEH,6CAA6C;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,qBAAqB;AACrB,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,EAAgC,MAAM,UAAU,CAAC;AACtE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EAGtB,MAAM,4BAA4B,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AAEvC,gDAAgD;AAChD,OAAO,EAAE,aAAa,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAqB9C,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAgB;IACtB,aAAa,CAAgB;IAC7B,iBAAiB,CAAoB;IACrC,UAAU,GAAsB,IAAI,CAAC;IACrC,UAAU,GAAY,KAAK,CAAC;IAEpC,YAAY,UAAoC,EAAE;QAChD,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;QACzC,IAAI,CAAC,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACjD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC;QAC9C,uGAAuG;QACvG,KAAK,OAAO,CAAC,OAAO,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,SAAkB;QAC3B,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAEzB,gEAAgE;QAChE,qDAAqD;QACrD,qDAAqD;IACvD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,MAAkB,EAAE,WAA8B;QAC9D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;QAED,4EAA4E;QAC5E,KAAK,WAAW,CAAC;QAEjB,IAAI,MAAkB,CAAC;QACvB,iDAAiD;QAEjD,6DAA6D;QAC7D,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,kDAAkD;YAClD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrB,IAAI,CAAC;oBACH,IAAI,SAAuB,CAAC;oBAC5B,IAAI,CAAC;wBACH,SAAS,GAAG,IAAI,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC/D,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,SAAS,GAAG,sBAAsB,CAAC;oBACrC,CAAC;oBACD,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,4BAA4B;oBAC5E,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;gBAC/B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CAAC,8EAA8E,EAAE,KAAK,CAAC,CAAC;oBACpG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACzB,CAAC;YACH,CAAC;YAED,IAAI,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACH,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAa,iBAAiB,EAAE;wBACnE,MAAM,EAAE,MAAM,CAAC,MAAM;qBACtB,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CAAC,6DAA6D,EAAE,KAAK,CAAC,CAAC;oBACnF,MAAM,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,0BAA0B;gBAC1B,MAAM,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,yDAAyD;YACzD,MAAM,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;QACtD,CAAC;QAED,sEAAsE;QAEtE,iDAAiD;QACjD,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAEpE,0BAA0B;QAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAE9D,kBAAkB;QAClB,MAAM,MAAM,GAAmB;YAC7B,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,cAAc,EAAE,YAAY,CAAC,cAAc;YAC3C,aAAa,EAAE,YAAY,CAAC,aAAa;YACzC,cAAc;SACf,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,uBAAuB,CAAC,MAAkB,EAAE,YAA+B;QACvF,gDAAgD;QAChD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEvC,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;QAEzC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,CAAC,gBAAgB,CACrB,MAAkB,EAClB,YAA+B,EAC/B,YAAoB,EAAE,CAAE,0CAA0C;;QAElE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAE/B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QAE7D,gDAAgD;QAChD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEvC,8DAA8D;QAC9D,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAEzC,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1E,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,SAAS,CAAC,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAAC;YACtE,mEAAmE;YACnE,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;YACvD,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC;YAE5B,mFAAmF;YACnF,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,EAAE,CAAC;YAEzE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,IAAI,SAAS,EAAE,CAAC;QAC/G,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,CAAC;QAEvE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;IAC1D,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,CAAC,yBAAyB,CAC9B,MAAkB,EAClB,YAAoB,EAAE;QAEtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAE/B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QAE7D,gDAAgD;QAChD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEvC,8DAA8D;QAC9D,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAEzC,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1E,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,SAAS,CAAC,iCAAiC,CAAC,SAAS,CAAC,EAAE,CAAC;YACjF,8FAA8F;YAC9F,iEAAiE;YACjE,MAAM,aAAa,GAAe,EAAE,CAAC;YACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;gBACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;gBAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;gBAE7B,iFAAiF;gBACjF,yDAAyD;gBACzD,IAAI,IAAI,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;oBAC5B,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;oBAC3C,IAAI,aAAa,EAAE,CAAC;wBAClB,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC;wBAClC,aAAa,CAAC,IAAI,CAAC;4BACjB,SAAS,EAAE,aAAa,CAAC,SAAS;4BAClC,SAAS;4BACT,OAAO;4BACP,OAAO;4BACP,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;yBAChD,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAED,0CAA0C;YAC1C,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAC;YACjE,CAAC;YAED,eAAe,IAAI,KAAK,CAAC,MAAM,CAAC;YAChC,cAAc,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YAEtE,6CAA6C;YAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,EAAE,CAAC;YAEzE,MAAM;gBACJ,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE,KAAK;gBACjB,UAAU,EAAE,eAAe;gBAC3B,cAAc,EAAE,cAAc,IAAI,SAAS;aAC5C,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,CAAC;QAEvE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;IAC9E,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,CAAC,eAAe,CACpB,MAAkB,EAClB,UAII,EAAE;QAEN,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,cAAc;QAC9E,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;QAE1C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAE/B,uCAAuC;QACvC,IAAI,MAAM,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;YAClC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YAE7D,gDAAgD;YAChD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAEvC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;YAC1E,MAAM,SAAS,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;YAE5C,4BAA4B;YAC5B,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;YAC3D,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,CAAC;YAEvE,+CAA+C;YAC/C,MAAM;gBACJ,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,SAAS,CAAC,MAAM;gBAC5B,cAAc,EAAE,cAAc,IAAI,SAAS;aAC5C,CAAC;YAEF,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,2CAA2C;YAC3C,iEAAiE;YACjE,KAAK,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;CACF"}
|
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;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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.
|
|
3
|
+
"version": "1.1.1",
|
|
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.
|
|
15
|
+
"@ifc-lite/wasm": "1.1.1"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
18
|
"typescript": "^5.3.0"
|