@ifc-lite/geometry 1.1.7 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +373 -0
- package/dist/default-materials.d.ts.map +1 -1
- package/dist/default-materials.js +12 -1
- package/dist/default-materials.js.map +1 -1
- package/dist/ifc-lite-bridge.d.ts +1 -0
- package/dist/ifc-lite-bridge.d.ts.map +1 -1
- package/dist/ifc-lite-bridge.js.map +1 -1
- package/dist/ifc-lite-mesh-collector.d.ts +12 -2
- package/dist/ifc-lite-mesh-collector.d.ts.map +1 -1
- package/dist/ifc-lite-mesh-collector.js +63 -7
- package/dist/ifc-lite-mesh-collector.js.map +1 -1
- package/dist/index.d.ts +31 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +58 -64
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/wasm-memory-manager.d.ts +178 -0
- package/dist/wasm-memory-manager.d.ts.map +1 -0
- package/dist/wasm-memory-manager.js +86 -0
- package/dist/wasm-memory-manager.js.map +1 -0
- package/dist/zero-copy-collector.d.ts +158 -0
- package/dist/zero-copy-collector.d.ts.map +1 -0
- package/dist/zero-copy-collector.js +224 -0
- package/dist/zero-copy-collector.js.map +1 -0
- package/package.json +8 -8
- package/dist/geometry.worker.d.ts +0 -2
- package/dist/geometry.worker.d.ts.map +0 -1
- package/dist/geometry.worker.js +0 -116
- package/dist/geometry.worker.js.map +0 -1
- package/dist/worker-pool.d.ts +0 -56
- package/dist/worker-pool.d.ts.map +0 -1
- package/dist/worker-pool.js +0 -160
- package/dist/worker-pool.js.map +0 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zero-Copy Mesh Collector - streams GPU-ready geometry with zero-copy access
|
|
3
|
+
*
|
|
4
|
+
* This collector uses the new GPU geometry API that:
|
|
5
|
+
* - Pre-interleaves vertex data (position + normal)
|
|
6
|
+
* - Pre-converts coordinates (Z-up to Y-up)
|
|
7
|
+
* - Exposes pointers for direct WASM memory access
|
|
8
|
+
*
|
|
9
|
+
* The collector provides TypedArray views into WASM memory. The caller
|
|
10
|
+
* is responsible for uploading to GPU (use @ifc-lite/renderer's ZeroCopyGpuUploader).
|
|
11
|
+
*
|
|
12
|
+
* IMPORTANT: Views become INVALID when WASM memory grows!
|
|
13
|
+
* Use the "immediate upload" pattern - create view, upload, discard.
|
|
14
|
+
*/
|
|
15
|
+
import type { IfcAPI } from '@ifc-lite/wasm';
|
|
16
|
+
import { WasmMemoryManager } from './wasm-memory-manager.js';
|
|
17
|
+
export interface ZeroCopyStreamingProgress {
|
|
18
|
+
percent: number;
|
|
19
|
+
processed: number;
|
|
20
|
+
total?: number;
|
|
21
|
+
phase: 'simple' | 'simple_complete' | 'complex' | 'complete';
|
|
22
|
+
}
|
|
23
|
+
export interface ZeroCopyBatchResult {
|
|
24
|
+
/** Number of meshes in this batch */
|
|
25
|
+
meshCount: number;
|
|
26
|
+
/** Total vertices in this batch */
|
|
27
|
+
vertexCount: number;
|
|
28
|
+
/** Total triangles in this batch */
|
|
29
|
+
triangleCount: number;
|
|
30
|
+
}
|
|
31
|
+
export interface ZeroCopyCompleteStats {
|
|
32
|
+
totalMeshes: number;
|
|
33
|
+
totalVertices: number;
|
|
34
|
+
totalTriangles: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Mesh metadata for draw calls and selection
|
|
38
|
+
*/
|
|
39
|
+
export interface ZeroCopyMeshMetadata {
|
|
40
|
+
expressId: number;
|
|
41
|
+
vertexOffset: number;
|
|
42
|
+
vertexCount: number;
|
|
43
|
+
indexOffset: number;
|
|
44
|
+
indexCount: number;
|
|
45
|
+
color: [number, number, number, number];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Batch of geometry data with zero-copy views
|
|
49
|
+
*/
|
|
50
|
+
export interface ZeroCopyBatch {
|
|
51
|
+
/** View into WASM memory for vertex data (interleaved pos+normal) */
|
|
52
|
+
vertexView: Float32Array;
|
|
53
|
+
/** View into WASM memory for index data */
|
|
54
|
+
indexView: Uint32Array;
|
|
55
|
+
/** Byte length of vertex data (for GPU buffer creation) */
|
|
56
|
+
vertexByteLength: number;
|
|
57
|
+
/** Byte length of index data */
|
|
58
|
+
indexByteLength: number;
|
|
59
|
+
/** Mesh metadata for draw calls */
|
|
60
|
+
meshMetadata: ZeroCopyMeshMetadata[];
|
|
61
|
+
/** Batch statistics */
|
|
62
|
+
stats: ZeroCopyBatchResult;
|
|
63
|
+
/** Free WASM memory (call after uploading to GPU!) */
|
|
64
|
+
free: () => void;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Zero-copy mesh collector that streams GPU-ready geometry batches
|
|
68
|
+
*
|
|
69
|
+
* Usage:
|
|
70
|
+
* ```typescript
|
|
71
|
+
* const collector = new ZeroCopyMeshCollector(ifcApi, content);
|
|
72
|
+
*
|
|
73
|
+
* for await (const batch of collector.streamBatches()) {
|
|
74
|
+
* // Create GPU buffers
|
|
75
|
+
* const vertexBuffer = device.createBuffer({
|
|
76
|
+
* size: batch.vertexByteLength,
|
|
77
|
+
* usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
|
|
78
|
+
* });
|
|
79
|
+
*
|
|
80
|
+
* // Upload directly from WASM memory (single copy!)
|
|
81
|
+
* device.queue.writeBuffer(vertexBuffer, 0, batch.vertexView);
|
|
82
|
+
*
|
|
83
|
+
* // IMPORTANT: Free after upload!
|
|
84
|
+
* batch.free();
|
|
85
|
+
* }
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export declare class ZeroCopyMeshCollector {
|
|
89
|
+
private ifcApi;
|
|
90
|
+
private content;
|
|
91
|
+
private memoryManager;
|
|
92
|
+
constructor(ifcApi: IfcAPI, content: string);
|
|
93
|
+
/**
|
|
94
|
+
* Stream geometry batches with zero-copy views into WASM memory
|
|
95
|
+
*
|
|
96
|
+
* @param batchSize Number of meshes per batch (default: 25)
|
|
97
|
+
* @yields Batches with views into WASM memory
|
|
98
|
+
*/
|
|
99
|
+
streamBatches(batchSize?: number): AsyncGenerator<ZeroCopyBatch>;
|
|
100
|
+
/**
|
|
101
|
+
* Parse all geometry at once (for smaller files)
|
|
102
|
+
*
|
|
103
|
+
* @returns Batch with views into WASM memory
|
|
104
|
+
*/
|
|
105
|
+
parseAll(): ZeroCopyBatch;
|
|
106
|
+
/**
|
|
107
|
+
* Get WASM memory manager for advanced use cases
|
|
108
|
+
*/
|
|
109
|
+
getMemoryManager(): WasmMemoryManager;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Instanced geometry batch with zero-copy views
|
|
113
|
+
*/
|
|
114
|
+
export interface ZeroCopyInstancedBatch {
|
|
115
|
+
geometryId: bigint;
|
|
116
|
+
/** View into WASM memory for vertex data */
|
|
117
|
+
vertexView: Float32Array;
|
|
118
|
+
/** View into WASM memory for index data */
|
|
119
|
+
indexView: Uint32Array;
|
|
120
|
+
/** View into WASM memory for instance data [transform(16) + color(4)] */
|
|
121
|
+
instanceView: Float32Array;
|
|
122
|
+
/** Express IDs for each instance */
|
|
123
|
+
expressIds: number[];
|
|
124
|
+
/** Byte lengths for GPU buffer creation */
|
|
125
|
+
vertexByteLength: number;
|
|
126
|
+
indexByteLength: number;
|
|
127
|
+
instanceByteLength: number;
|
|
128
|
+
/** Statistics */
|
|
129
|
+
indexCount: number;
|
|
130
|
+
instanceCount: number;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Zero-copy instanced geometry collector
|
|
134
|
+
*/
|
|
135
|
+
export declare class ZeroCopyInstancedCollector {
|
|
136
|
+
private ifcApi;
|
|
137
|
+
private content;
|
|
138
|
+
private memoryManager;
|
|
139
|
+
constructor(ifcApi: IfcAPI, content: string);
|
|
140
|
+
/**
|
|
141
|
+
* Parse instanced geometry with zero-copy views
|
|
142
|
+
*
|
|
143
|
+
* @returns Array of instanced geometry batches
|
|
144
|
+
*/
|
|
145
|
+
parseAll(): {
|
|
146
|
+
batches: ZeroCopyInstancedBatch[];
|
|
147
|
+
stats: {
|
|
148
|
+
geometryCount: number;
|
|
149
|
+
totalInstances: number;
|
|
150
|
+
};
|
|
151
|
+
free: () => void;
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* Get WASM memory manager for advanced use cases
|
|
155
|
+
*/
|
|
156
|
+
getMemoryManager(): WasmMemoryManager;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=zero-copy-collector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zero-copy-collector.d.ts","sourceRoot":"","sources":["../src/zero-copy-collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,224 @@
|
|
|
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
|
+
import { WasmMemoryManager } from './wasm-memory-manager.js';
|
|
5
|
+
/**
|
|
6
|
+
* Zero-copy mesh collector that streams GPU-ready geometry batches
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const collector = new ZeroCopyMeshCollector(ifcApi, content);
|
|
11
|
+
*
|
|
12
|
+
* for await (const batch of collector.streamBatches()) {
|
|
13
|
+
* // Create GPU buffers
|
|
14
|
+
* const vertexBuffer = device.createBuffer({
|
|
15
|
+
* size: batch.vertexByteLength,
|
|
16
|
+
* usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* // Upload directly from WASM memory (single copy!)
|
|
20
|
+
* device.queue.writeBuffer(vertexBuffer, 0, batch.vertexView);
|
|
21
|
+
*
|
|
22
|
+
* // IMPORTANT: Free after upload!
|
|
23
|
+
* batch.free();
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export class ZeroCopyMeshCollector {
|
|
28
|
+
ifcApi;
|
|
29
|
+
content;
|
|
30
|
+
memoryManager;
|
|
31
|
+
constructor(ifcApi, content) {
|
|
32
|
+
this.ifcApi = ifcApi;
|
|
33
|
+
this.content = content;
|
|
34
|
+
// Get WASM memory for zero-copy access
|
|
35
|
+
const wasmMemory = ifcApi.getMemory();
|
|
36
|
+
this.memoryManager = new WasmMemoryManager(wasmMemory);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Stream geometry batches with zero-copy views into WASM memory
|
|
40
|
+
*
|
|
41
|
+
* @param batchSize Number of meshes per batch (default: 25)
|
|
42
|
+
* @yields Batches with views into WASM memory
|
|
43
|
+
*/
|
|
44
|
+
async *streamBatches(batchSize = 25) {
|
|
45
|
+
// Queue to hold batches from async callback
|
|
46
|
+
const batchQueue = [];
|
|
47
|
+
let resolveWaiting = null;
|
|
48
|
+
let isComplete = false;
|
|
49
|
+
// Start async processing
|
|
50
|
+
const processingPromise = this.ifcApi.parseToGpuGeometryAsync(this.content, {
|
|
51
|
+
batchSize,
|
|
52
|
+
onBatch: (gpuGeom, _progress) => {
|
|
53
|
+
batchQueue.push(gpuGeom);
|
|
54
|
+
if (resolveWaiting) {
|
|
55
|
+
resolveWaiting();
|
|
56
|
+
resolveWaiting = null;
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
onComplete: (_stats) => {
|
|
60
|
+
isComplete = true;
|
|
61
|
+
if (resolveWaiting) {
|
|
62
|
+
resolveWaiting();
|
|
63
|
+
resolveWaiting = null;
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
// Process batches as they arrive
|
|
68
|
+
while (true) {
|
|
69
|
+
while (batchQueue.length > 0) {
|
|
70
|
+
const gpuGeom = batchQueue.shift();
|
|
71
|
+
// Create zero-copy views into WASM memory
|
|
72
|
+
const vertexView = this.memoryManager.createFloat32View(gpuGeom.vertexDataPtr, gpuGeom.vertexDataLen);
|
|
73
|
+
const indexView = this.memoryManager.createUint32View(gpuGeom.indicesPtr, gpuGeom.indicesLen);
|
|
74
|
+
// Extract mesh metadata
|
|
75
|
+
const meshMetadata = [];
|
|
76
|
+
for (let i = 0; i < gpuGeom.meshCount; i++) {
|
|
77
|
+
const meta = gpuGeom.getMeshMetadata(i);
|
|
78
|
+
if (meta) {
|
|
79
|
+
meshMetadata.push({
|
|
80
|
+
expressId: meta.expressId,
|
|
81
|
+
vertexOffset: meta.vertexOffset,
|
|
82
|
+
vertexCount: meta.vertexCount,
|
|
83
|
+
indexOffset: meta.indexOffset,
|
|
84
|
+
indexCount: meta.indexCount,
|
|
85
|
+
color: meta.color,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
yield {
|
|
90
|
+
vertexView,
|
|
91
|
+
indexView,
|
|
92
|
+
vertexByteLength: gpuGeom.vertexDataByteLength,
|
|
93
|
+
indexByteLength: gpuGeom.indicesByteLength,
|
|
94
|
+
meshMetadata,
|
|
95
|
+
stats: {
|
|
96
|
+
meshCount: gpuGeom.meshCount,
|
|
97
|
+
vertexCount: gpuGeom.totalVertexCount,
|
|
98
|
+
triangleCount: gpuGeom.totalTriangleCount,
|
|
99
|
+
},
|
|
100
|
+
free: () => gpuGeom.free(),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (isComplete && batchQueue.length === 0)
|
|
104
|
+
break;
|
|
105
|
+
// Wait for more batches
|
|
106
|
+
await new Promise((resolve) => {
|
|
107
|
+
resolveWaiting = resolve;
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
await processingPromise;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Parse all geometry at once (for smaller files)
|
|
114
|
+
*
|
|
115
|
+
* @returns Batch with views into WASM memory
|
|
116
|
+
*/
|
|
117
|
+
parseAll() {
|
|
118
|
+
// Get GPU-ready geometry from WASM
|
|
119
|
+
const gpuGeom = this.ifcApi.parseToGpuGeometry(this.content);
|
|
120
|
+
// Create zero-copy views
|
|
121
|
+
const vertexView = this.memoryManager.createFloat32View(gpuGeom.vertexDataPtr, gpuGeom.vertexDataLen);
|
|
122
|
+
const indexView = this.memoryManager.createUint32View(gpuGeom.indicesPtr, gpuGeom.indicesLen);
|
|
123
|
+
// Extract mesh metadata
|
|
124
|
+
const meshMetadata = [];
|
|
125
|
+
for (let i = 0; i < gpuGeom.meshCount; i++) {
|
|
126
|
+
const meta = gpuGeom.getMeshMetadata(i);
|
|
127
|
+
if (meta) {
|
|
128
|
+
meshMetadata.push({
|
|
129
|
+
expressId: meta.expressId,
|
|
130
|
+
vertexOffset: meta.vertexOffset,
|
|
131
|
+
vertexCount: meta.vertexCount,
|
|
132
|
+
indexOffset: meta.indexOffset,
|
|
133
|
+
indexCount: meta.indexCount,
|
|
134
|
+
color: meta.color,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
vertexView,
|
|
140
|
+
indexView,
|
|
141
|
+
vertexByteLength: gpuGeom.vertexDataByteLength,
|
|
142
|
+
indexByteLength: gpuGeom.indicesByteLength,
|
|
143
|
+
meshMetadata,
|
|
144
|
+
stats: {
|
|
145
|
+
meshCount: gpuGeom.meshCount,
|
|
146
|
+
vertexCount: gpuGeom.totalVertexCount,
|
|
147
|
+
triangleCount: gpuGeom.totalTriangleCount,
|
|
148
|
+
},
|
|
149
|
+
free: () => gpuGeom.free(),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get WASM memory manager for advanced use cases
|
|
154
|
+
*/
|
|
155
|
+
getMemoryManager() {
|
|
156
|
+
return this.memoryManager;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Zero-copy instanced geometry collector
|
|
161
|
+
*/
|
|
162
|
+
export class ZeroCopyInstancedCollector {
|
|
163
|
+
ifcApi;
|
|
164
|
+
content;
|
|
165
|
+
memoryManager;
|
|
166
|
+
constructor(ifcApi, content) {
|
|
167
|
+
this.ifcApi = ifcApi;
|
|
168
|
+
this.content = content;
|
|
169
|
+
const wasmMemory = ifcApi.getMemory();
|
|
170
|
+
this.memoryManager = new WasmMemoryManager(wasmMemory);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Parse instanced geometry with zero-copy views
|
|
174
|
+
*
|
|
175
|
+
* @returns Array of instanced geometry batches
|
|
176
|
+
*/
|
|
177
|
+
parseAll() {
|
|
178
|
+
const collection = this.ifcApi.parseToGpuInstancedGeometry(this.content);
|
|
179
|
+
const batches = [];
|
|
180
|
+
let totalInstances = 0;
|
|
181
|
+
for (let i = 0; i < collection.length; i++) {
|
|
182
|
+
const geomRef = collection.getRef(i);
|
|
183
|
+
if (!geomRef)
|
|
184
|
+
continue;
|
|
185
|
+
// Create zero-copy views
|
|
186
|
+
const vertexView = this.memoryManager.createFloat32View(geomRef.vertexDataPtr, geomRef.vertexDataLen);
|
|
187
|
+
const indexView = this.memoryManager.createUint32View(geomRef.indicesPtr, geomRef.indicesLen);
|
|
188
|
+
const instanceView = this.memoryManager.createFloat32View(geomRef.instanceDataPtr, geomRef.instanceDataLen);
|
|
189
|
+
const expressIdsView = this.memoryManager.createUint32View(geomRef.instanceExpressIdsPtr, geomRef.instanceCount);
|
|
190
|
+
batches.push({
|
|
191
|
+
geometryId: geomRef.geometryId,
|
|
192
|
+
vertexView,
|
|
193
|
+
indexView,
|
|
194
|
+
instanceView,
|
|
195
|
+
expressIds: Array.from(expressIdsView),
|
|
196
|
+
vertexByteLength: geomRef.vertexDataByteLength,
|
|
197
|
+
indexByteLength: geomRef.indicesByteLength,
|
|
198
|
+
instanceByteLength: geomRef.instanceDataByteLength,
|
|
199
|
+
indexCount: geomRef.indicesLen,
|
|
200
|
+
instanceCount: geomRef.instanceCount,
|
|
201
|
+
});
|
|
202
|
+
totalInstances += geomRef.instanceCount;
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
batches,
|
|
206
|
+
stats: {
|
|
207
|
+
geometryCount: collection.length,
|
|
208
|
+
totalInstances,
|
|
209
|
+
},
|
|
210
|
+
free: () => {
|
|
211
|
+
if (typeof collection.free === 'function') {
|
|
212
|
+
collection.free();
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get WASM memory manager for advanced use cases
|
|
219
|
+
*/
|
|
220
|
+
getMemoryManager() {
|
|
221
|
+
return this.memoryManager;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=zero-copy-collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zero-copy-collector.js","sourceRoot":"","sources":["../src/zero-copy-collector.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ifc-lite/geometry",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.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",
|
|
@@ -11,12 +11,8 @@
|
|
|
11
11
|
"types": "./dist/index.d.ts"
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
|
-
"scripts": {
|
|
15
|
-
"build": "tsc || true",
|
|
16
|
-
"dev": "tsc --watch"
|
|
17
|
-
},
|
|
18
14
|
"dependencies": {
|
|
19
|
-
"@ifc-lite/wasm": "
|
|
15
|
+
"@ifc-lite/wasm": "^1.2.0"
|
|
20
16
|
},
|
|
21
17
|
"devDependencies": {
|
|
22
18
|
"typescript": "^5.3.0"
|
|
@@ -43,5 +39,9 @@
|
|
|
43
39
|
"files": [
|
|
44
40
|
"dist",
|
|
45
41
|
"README.md"
|
|
46
|
-
]
|
|
47
|
-
|
|
42
|
+
],
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsc || true",
|
|
45
|
+
"dev": "tsc --watch"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"geometry.worker.d.ts","sourceRoot":"","sources":["../src/geometry.worker.ts"],"names":[],"mappings":""}
|
package/dist/geometry.worker.js
DELETED
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
-
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
-
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
-
/**
|
|
5
|
-
* Geometry Worker - Handles mesh collection in a Web Worker
|
|
6
|
-
* Uses IFC-Lite for native Rust geometry processing (1.9x faster than web-ifc)
|
|
7
|
-
*/
|
|
8
|
-
import init, { IfcAPI } from '@ifc-lite/wasm';
|
|
9
|
-
import { IfcLiteMeshCollector } from './ifc-lite-mesh-collector.js';
|
|
10
|
-
// Global IFC-Lite API instance (initialized once per worker)
|
|
11
|
-
let ifcApi = null;
|
|
12
|
-
let ifcApiInitialized = false;
|
|
13
|
-
/**
|
|
14
|
-
* Initialize IFC-Lite API in worker context
|
|
15
|
-
* The WASM binary is automatically resolved from the same location as the JS module
|
|
16
|
-
*/
|
|
17
|
-
async function initIfcApi() {
|
|
18
|
-
if (ifcApi && ifcApiInitialized) {
|
|
19
|
-
return ifcApi;
|
|
20
|
-
}
|
|
21
|
-
const initStart = performance.now();
|
|
22
|
-
console.log('[Worker] Initializing IFC-Lite...');
|
|
23
|
-
// Initialize WASM module - wasm-bindgen automatically resolves the WASM URL
|
|
24
|
-
await init();
|
|
25
|
-
ifcApi = new IfcAPI();
|
|
26
|
-
ifcApiInitialized = true;
|
|
27
|
-
const initTime = performance.now() - initStart;
|
|
28
|
-
console.log(`[Worker] IFC-Lite initialized in ${initTime.toFixed(2)}ms`);
|
|
29
|
-
return ifcApi;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Handle mesh collection task
|
|
33
|
-
*/
|
|
34
|
-
async function handleMeshCollection(data) {
|
|
35
|
-
const taskStart = performance.now();
|
|
36
|
-
const { buffer } = data;
|
|
37
|
-
// Initialize IFC-Lite if needed
|
|
38
|
-
const apiInitStart = performance.now();
|
|
39
|
-
const api = await initIfcApi();
|
|
40
|
-
const apiInitTime = performance.now() - apiInitStart;
|
|
41
|
-
if (apiInitTime > 10) {
|
|
42
|
-
console.log(`[Worker] IFC-Lite init took ${apiInitTime.toFixed(2)}ms`);
|
|
43
|
-
}
|
|
44
|
-
// Convert buffer to string (IFC files are text)
|
|
45
|
-
const decoder = new TextDecoder();
|
|
46
|
-
const content = decoder.decode(new Uint8Array(buffer));
|
|
47
|
-
// Collect meshes using IFC-Lite
|
|
48
|
-
const collectStart = performance.now();
|
|
49
|
-
const collector = new IfcLiteMeshCollector(api, content);
|
|
50
|
-
const meshes = collector.collectMeshes();
|
|
51
|
-
const collectTime = performance.now() - collectStart;
|
|
52
|
-
const totalTime = performance.now() - taskStart;
|
|
53
|
-
console.log(`[Worker] Mesh collection: ${collectTime.toFixed(2)}ms, total: ${totalTime.toFixed(2)}ms, meshes: ${meshes.length}`);
|
|
54
|
-
return meshes;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Process task and send result back to main thread
|
|
58
|
-
*/
|
|
59
|
-
async function processTask(task) {
|
|
60
|
-
try {
|
|
61
|
-
let result;
|
|
62
|
-
switch (task.type) {
|
|
63
|
-
case 'mesh-collection':
|
|
64
|
-
result = await handleMeshCollection(task.data);
|
|
65
|
-
break;
|
|
66
|
-
case 'generate-lod':
|
|
67
|
-
case 'build-bvh':
|
|
68
|
-
throw new Error(`Task type '${task.type}' not yet implemented`);
|
|
69
|
-
default:
|
|
70
|
-
throw new Error(`Unknown task type: ${task.type}`);
|
|
71
|
-
}
|
|
72
|
-
// Extract transferable buffers for zero-copy transfer
|
|
73
|
-
const transferables = [];
|
|
74
|
-
if (Array.isArray(result)) {
|
|
75
|
-
// MeshData[] - extract all typed array buffers
|
|
76
|
-
for (const mesh of result) {
|
|
77
|
-
if (mesh.positions?.buffer) {
|
|
78
|
-
transferables.push(mesh.positions.buffer);
|
|
79
|
-
}
|
|
80
|
-
if (mesh.normals?.buffer) {
|
|
81
|
-
transferables.push(mesh.normals.buffer);
|
|
82
|
-
}
|
|
83
|
-
if (mesh.indices?.buffer) {
|
|
84
|
-
transferables.push(mesh.indices.buffer);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
// Send result with transferables
|
|
89
|
-
const response = {
|
|
90
|
-
id: task.id,
|
|
91
|
-
type: 'task-result',
|
|
92
|
-
result,
|
|
93
|
-
};
|
|
94
|
-
self.postMessage(response, { transfer: transferables });
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
// Send error back
|
|
98
|
-
const response = {
|
|
99
|
-
id: task.id,
|
|
100
|
-
type: 'task-error',
|
|
101
|
-
error: error instanceof Error ? error.message : String(error),
|
|
102
|
-
};
|
|
103
|
-
self.postMessage(response);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
// Signal that worker is ready (send immediately on load)
|
|
107
|
-
const readyMessage = {
|
|
108
|
-
id: '',
|
|
109
|
-
type: 'ready',
|
|
110
|
-
};
|
|
111
|
-
self.postMessage(readyMessage);
|
|
112
|
-
// Listen for messages from main thread
|
|
113
|
-
self.onmessage = async (e) => {
|
|
114
|
-
await processTask(e.data);
|
|
115
|
-
};
|
|
116
|
-
//# sourceMappingURL=geometry.worker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"geometry.worker.js","sourceRoot":"","sources":["../src/geometry.worker.ts"],"names":[],"mappings":"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"}
|
package/dist/worker-pool.d.ts
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Worker Pool - Generic worker pool with task queue
|
|
3
|
-
* Supports multiple task types and zero-copy transferable objects
|
|
4
|
-
*/
|
|
5
|
-
export type TaskType = 'mesh-collection' | 'generate-lod' | 'build-bvh';
|
|
6
|
-
export interface Task<T = any> {
|
|
7
|
-
id: string;
|
|
8
|
-
type: TaskType;
|
|
9
|
-
data: any;
|
|
10
|
-
resolve: (value: T) => void;
|
|
11
|
-
reject: (error: Error) => void;
|
|
12
|
-
}
|
|
13
|
-
export interface WorkerMessage {
|
|
14
|
-
id: string;
|
|
15
|
-
type: 'task-result' | 'task-error' | 'ready';
|
|
16
|
-
result?: any;
|
|
17
|
-
error?: string;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Worker Pool for geometry processing tasks
|
|
21
|
-
*/
|
|
22
|
-
export declare class WorkerPool {
|
|
23
|
-
private workers;
|
|
24
|
-
private taskQueue;
|
|
25
|
-
private activeTasks;
|
|
26
|
-
private availableWorkers;
|
|
27
|
-
private workerCount;
|
|
28
|
-
private workerUrl;
|
|
29
|
-
private initialized;
|
|
30
|
-
constructor(workerUrl: URL | string, workerCount?: number);
|
|
31
|
-
/**
|
|
32
|
-
* Initialize worker pool
|
|
33
|
-
*/
|
|
34
|
-
init(): Promise<void>;
|
|
35
|
-
/**
|
|
36
|
-
* Check if workers are available
|
|
37
|
-
*/
|
|
38
|
-
isAvailable(): boolean;
|
|
39
|
-
/**
|
|
40
|
-
* Submit a task to the worker pool
|
|
41
|
-
*/
|
|
42
|
-
submit<T>(type: TaskType, data: any): Promise<T>;
|
|
43
|
-
/**
|
|
44
|
-
* Process queued tasks
|
|
45
|
-
*/
|
|
46
|
-
private processQueue;
|
|
47
|
-
/**
|
|
48
|
-
* Handle message from worker
|
|
49
|
-
*/
|
|
50
|
-
private handleMessage;
|
|
51
|
-
/**
|
|
52
|
-
* Terminate all workers
|
|
53
|
-
*/
|
|
54
|
-
terminate(): void;
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=worker-pool.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker-pool.d.ts","sourceRoot":"","sources":["../src/worker-pool.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,iBAAiB,GAAG,cAAc,GAAG,WAAW,CAAC;AAExE,MAAM,WAAW,IAAI,CAAC,CAAC,GAAG,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,GAAG,YAAY,GAAG,OAAO,CAAC;IAC7C,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,WAAW,CAAkB;gBAEzB,SAAS,EAAE,GAAG,GAAG,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IAKzD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoD3B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACG,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAmBtD;;OAEG;IACH,OAAO,CAAC,YAAY;IAyBpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAgCrB;;OAEG;IACH,SAAS,IAAI,IAAI;CAUlB"}
|