@ifc-lite/server-client 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.
@@ -0,0 +1,420 @@
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
+ // WASM initialization state
5
+ let parquetInitialized = false;
6
+ let parquetModule = null;
7
+ /**
8
+ * Ensure parquet-wasm WASM module is initialized.
9
+ * This MUST be called before using any parquet functions.
10
+ *
11
+ * @returns Initialized parquet-wasm module
12
+ */
13
+ export async function ensureParquetInit() {
14
+ if (parquetInitialized && parquetModule) {
15
+ return parquetModule;
16
+ }
17
+ console.log('[parquet-decoder] Starting WASM initialization...');
18
+ let parquet;
19
+ // Strategy 1: Try ESM build with explicit WASM URL (works with Vite)
20
+ try {
21
+ // @ts-ignore - Import the ESM module
22
+ parquet = await import('parquet-wasm/esm/arrow2.js');
23
+ console.log('[parquet-decoder] Imported ESM build');
24
+ // ESM build requires calling init (default export) to load WASM
25
+ if (typeof parquet.default === 'function') {
26
+ console.log('[parquet-decoder] Calling ESM init to load WASM...');
27
+ // Get the WASM file URL - Vite handles this with ?url suffix
28
+ // @ts-ignore
29
+ const wasmModule = await import('parquet-wasm/esm/arrow2_bg.wasm?url');
30
+ const wasmUrl = wasmModule.default;
31
+ console.log('[parquet-decoder] Loading WASM from:', wasmUrl);
32
+ // Pass the URL to init so it can fetch the WASM correctly
33
+ await parquet.default(wasmUrl);
34
+ console.log('[parquet-decoder] ESM WASM initialized');
35
+ }
36
+ if (typeof parquet.readParquet === 'function') {
37
+ parquetModule = parquet;
38
+ parquetInitialized = true;
39
+ console.log('[parquet-decoder] ESM build ready with readParquet');
40
+ return parquet;
41
+ }
42
+ else {
43
+ console.warn('[parquet-decoder] ESM build initialized but readParquet not found');
44
+ }
45
+ }
46
+ catch (e) {
47
+ console.warn('[parquet-decoder] ESM import failed:', e);
48
+ }
49
+ // Strategy 2: Try web build with fetch (alternative for browsers)
50
+ try {
51
+ // @ts-ignore
52
+ parquet = await import('parquet-wasm/esm/arrow2.js');
53
+ if (typeof parquet.default === 'function') {
54
+ console.log('[parquet-decoder] Trying web init with node_modules path...');
55
+ // Try common paths where WASM might be served
56
+ const wasmPaths = [
57
+ '/node_modules/parquet-wasm/esm/arrow2_bg.wasm',
58
+ './node_modules/parquet-wasm/esm/arrow2_bg.wasm',
59
+ ];
60
+ for (const wasmPath of wasmPaths) {
61
+ try {
62
+ const response = await fetch(wasmPath);
63
+ if (response.ok) {
64
+ console.log('[parquet-decoder] Found WASM at:', wasmPath);
65
+ await parquet.default(response);
66
+ if (typeof parquet.readParquet === 'function') {
67
+ parquetModule = parquet;
68
+ parquetInitialized = true;
69
+ console.log('[parquet-decoder] Web init successful');
70
+ return parquet;
71
+ }
72
+ }
73
+ }
74
+ catch {
75
+ // Try next path
76
+ }
77
+ }
78
+ }
79
+ }
80
+ catch (e2) {
81
+ console.warn('[parquet-decoder] Web init failed:', e2);
82
+ }
83
+ throw new Error('parquet-wasm: Could not load WASM module. Ensure parquet-wasm is installed and WASM files are accessible.');
84
+ }
85
+ /**
86
+ * Decode a Parquet geometry response from the server.
87
+ *
88
+ * Binary format:
89
+ * - [mesh_parquet_len:u32][mesh_parquet_data]
90
+ * - [vertex_parquet_len:u32][vertex_parquet_data]
91
+ * - [index_parquet_len:u32][index_parquet_data]
92
+ *
93
+ * @param data - Binary Parquet response from server
94
+ * @returns Decoded MeshData array
95
+ */
96
+ export async function decodeParquetGeometry(data) {
97
+ // Initialize WASM module (only runs once)
98
+ const parquet = await ensureParquetInit();
99
+ const view = new DataView(data);
100
+ let offset = 0;
101
+ // Read mesh Parquet section
102
+ const meshParquetLen = view.getUint32(offset, true);
103
+ offset += 4;
104
+ const meshParquetData = new Uint8Array(data, offset, meshParquetLen);
105
+ offset += meshParquetLen;
106
+ // Read vertex Parquet section
107
+ const vertexParquetLen = view.getUint32(offset, true);
108
+ offset += 4;
109
+ const vertexParquetData = new Uint8Array(data, offset, vertexParquetLen);
110
+ offset += vertexParquetLen;
111
+ // Read index Parquet section
112
+ const indexParquetLen = view.getUint32(offset, true);
113
+ offset += 4;
114
+ const indexParquetData = new Uint8Array(data, offset, indexParquetLen);
115
+ // Parse Parquet tables
116
+ // @ts-ignore - parquet-wasm API
117
+ const meshTable = parquet.readParquet(meshParquetData);
118
+ // @ts-ignore - parquet-wasm API
119
+ const vertexTable = parquet.readParquet(vertexParquetData);
120
+ // @ts-ignore - parquet-wasm API
121
+ const indexTable = parquet.readParquet(indexParquetData);
122
+ // Convert to Arrow tables for easier access
123
+ // @ts-ignore - Apache Arrow types
124
+ const arrow = await import('apache-arrow');
125
+ // @ts-ignore - parquet-wasm returns Arrow IPC stream
126
+ const meshArrow = arrow.tableFromIPC(meshTable.intoIPCStream());
127
+ // @ts-ignore
128
+ const vertexArrow = arrow.tableFromIPC(vertexTable.intoIPCStream());
129
+ // @ts-ignore
130
+ const indexArrow = arrow.tableFromIPC(indexTable.intoIPCStream());
131
+ // Extract columns from mesh table
132
+ const expressIds = meshArrow.getChild('express_id')?.toArray();
133
+ const ifcTypes = meshArrow.getChild('ifc_type');
134
+ const vertexStarts = meshArrow.getChild('vertex_start')?.toArray();
135
+ const vertexCounts = meshArrow.getChild('vertex_count')?.toArray();
136
+ const indexStarts = meshArrow.getChild('index_start')?.toArray();
137
+ const indexCounts = meshArrow.getChild('index_count')?.toArray();
138
+ const colorR = meshArrow.getChild('color_r')?.toArray();
139
+ const colorG = meshArrow.getChild('color_g')?.toArray();
140
+ const colorB = meshArrow.getChild('color_b')?.toArray();
141
+ const colorA = meshArrow.getChild('color_a')?.toArray();
142
+ // Extract columns from vertex table
143
+ const posX = vertexArrow.getChild('x')?.toArray();
144
+ const posY = vertexArrow.getChild('y')?.toArray();
145
+ const posZ = vertexArrow.getChild('z')?.toArray();
146
+ const normX = vertexArrow.getChild('nx')?.toArray();
147
+ const normY = vertexArrow.getChild('ny')?.toArray();
148
+ const normZ = vertexArrow.getChild('nz')?.toArray();
149
+ // Extract columns from index table
150
+ const idx0 = indexArrow.getChild('i0')?.toArray();
151
+ const idx1 = indexArrow.getChild('i1')?.toArray();
152
+ const idx2 = indexArrow.getChild('i2')?.toArray();
153
+ // Reconstruct MeshData array
154
+ const meshCount = expressIds.length;
155
+ const meshes = new Array(meshCount);
156
+ for (let i = 0; i < meshCount; i++) {
157
+ const vertexStart = vertexStarts[i];
158
+ const vertexCount = vertexCounts[i];
159
+ const indexStart = indexStarts[i];
160
+ const indexCount = indexCounts[i];
161
+ // Reconstruct interleaved positions from columnar format
162
+ // OPTIMIZATION: Z-up to Y-up transform is now done server-side
163
+ // Server already transforms: X stays same, new Y = old Z, new Z = -old Y
164
+ // So we just copy directly without per-vertex transformation
165
+ const positions = new Float32Array(vertexCount * 3);
166
+ for (let v = 0; v < vertexCount; v++) {
167
+ const srcIdx = vertexStart + v;
168
+ positions[v * 3] = posX[srcIdx];
169
+ positions[v * 3 + 1] = posY[srcIdx];
170
+ positions[v * 3 + 2] = posZ[srcIdx];
171
+ }
172
+ // Reconstruct interleaved normals (also pre-transformed server-side)
173
+ const normals = new Float32Array(vertexCount * 3);
174
+ for (let v = 0; v < vertexCount; v++) {
175
+ const srcIdx = vertexStart + v;
176
+ normals[v * 3] = normX[srcIdx];
177
+ normals[v * 3 + 1] = normY[srcIdx];
178
+ normals[v * 3 + 2] = normZ[srcIdx];
179
+ }
180
+ // Reconstruct triangle indices from columnar format
181
+ const triangleCount = indexCount / 3;
182
+ const triangleStart = indexStart / 3;
183
+ const indices = new Uint32Array(indexCount);
184
+ for (let t = 0; t < triangleCount; t++) {
185
+ const srcIdx = triangleStart + t;
186
+ indices[t * 3] = idx0[srcIdx];
187
+ indices[t * 3 + 1] = idx1[srcIdx];
188
+ indices[t * 3 + 2] = idx2[srcIdx];
189
+ }
190
+ meshes[i] = {
191
+ express_id: expressIds[i],
192
+ ifc_type: ifcTypes?.get(i) ?? 'Unknown',
193
+ positions: positions,
194
+ normals: normals,
195
+ indices: indices,
196
+ color: [colorR[i], colorG[i], colorB[i], colorA[i]],
197
+ };
198
+ }
199
+ return meshes;
200
+ }
201
+ /**
202
+ * Check if parquet-wasm is available and can be initialized.
203
+ *
204
+ * @returns true if parquet-wasm can be imported and initialized
205
+ */
206
+ export async function isParquetAvailable() {
207
+ try {
208
+ // Try to initialize WASM - this is the real test
209
+ await ensureParquetInit();
210
+ return true;
211
+ }
212
+ catch (err) {
213
+ console.warn('[parquet-decoder] Parquet WASM initialization failed:', err);
214
+ return false;
215
+ }
216
+ }
217
+ // ============================================================================
218
+ // OPTIMIZED FORMAT (ara3d BOS-compatible)
219
+ // ============================================================================
220
+ /**
221
+ * Decode an optimized Parquet geometry response (ara3d BOS format).
222
+ *
223
+ * Binary format:
224
+ * - [version:u8][flags:u8]
225
+ * - [instance_len:u32][mesh_len:u32][material_len:u32][vertex_len:u32][index_len:u32]
226
+ * - [instance_parquet][mesh_parquet][material_parquet][vertex_parquet][index_parquet]
227
+ *
228
+ * Key features:
229
+ * - Integer quantized vertices (multiply by vertex_multiplier to get meters)
230
+ * - Mesh instancing (deduplicated geometry)
231
+ * - Byte colors (0-255)
232
+ * - Optional normals (compute on client if not present)
233
+ *
234
+ * @param data - Binary optimized Parquet response from server
235
+ * @param vertexMultiplier - Multiplier for vertex dequantization (default: 10000)
236
+ * @returns Decoded MeshData array
237
+ */
238
+ export async function decodeOptimizedParquetGeometry(data, vertexMultiplier = 10000) {
239
+ // Initialize WASM module (only runs once)
240
+ const parquet = await ensureParquetInit();
241
+ // @ts-ignore - Apache Arrow types
242
+ const arrow = await import('apache-arrow');
243
+ const view = new DataView(data);
244
+ let offset = 0;
245
+ // Read header
246
+ const version = view.getUint8(offset);
247
+ offset += 1;
248
+ if (version !== 2) {
249
+ throw new Error(`Unsupported optimized Parquet version: ${version}`);
250
+ }
251
+ const flags = view.getUint8(offset);
252
+ offset += 1;
253
+ const hasNormals = (flags & 1) !== 0;
254
+ // Read table lengths
255
+ const instanceLen = view.getUint32(offset, true);
256
+ offset += 4;
257
+ const meshLen = view.getUint32(offset, true);
258
+ offset += 4;
259
+ const materialLen = view.getUint32(offset, true);
260
+ offset += 4;
261
+ const vertexLen = view.getUint32(offset, true);
262
+ offset += 4;
263
+ const indexLen = view.getUint32(offset, true);
264
+ offset += 4;
265
+ // Read Parquet tables
266
+ const instanceData = new Uint8Array(data, offset, instanceLen);
267
+ offset += instanceLen;
268
+ const meshData = new Uint8Array(data, offset, meshLen);
269
+ offset += meshLen;
270
+ const materialData = new Uint8Array(data, offset, materialLen);
271
+ offset += materialLen;
272
+ const vertexData = new Uint8Array(data, offset, vertexLen);
273
+ offset += vertexLen;
274
+ const indexData = new Uint8Array(data, offset, indexLen);
275
+ // Parse Parquet tables
276
+ // @ts-ignore
277
+ const instanceTable = parquet.readParquet(instanceData);
278
+ // @ts-ignore
279
+ const meshTable = parquet.readParquet(meshData);
280
+ // @ts-ignore
281
+ const materialTable = parquet.readParquet(materialData);
282
+ // @ts-ignore
283
+ const vertexTable = parquet.readParquet(vertexData);
284
+ // @ts-ignore
285
+ const indexTable = parquet.readParquet(indexData);
286
+ // Convert to Arrow
287
+ // @ts-ignore
288
+ const instanceArrow = arrow.tableFromIPC(instanceTable.intoIPCStream());
289
+ // @ts-ignore
290
+ const meshArrow = arrow.tableFromIPC(meshTable.intoIPCStream());
291
+ // @ts-ignore
292
+ const materialArrow = arrow.tableFromIPC(materialTable.intoIPCStream());
293
+ // @ts-ignore
294
+ const vertexArrow = arrow.tableFromIPC(vertexTable.intoIPCStream());
295
+ // @ts-ignore
296
+ const indexArrow = arrow.tableFromIPC(indexTable.intoIPCStream());
297
+ // Extract instance columns
298
+ const entityIds = instanceArrow.getChild('entity_id')?.toArray();
299
+ const ifcTypes = instanceArrow.getChild('ifc_type');
300
+ const meshIndices = instanceArrow.getChild('mesh_index')?.toArray();
301
+ const materialIndices = instanceArrow.getChild('material_index')?.toArray();
302
+ // Extract mesh columns
303
+ const meshVertexOffsets = meshArrow.getChild('vertex_offset')?.toArray();
304
+ const meshVertexCounts = meshArrow.getChild('vertex_count')?.toArray();
305
+ const meshIndexOffsets = meshArrow.getChild('index_offset')?.toArray();
306
+ const meshIndexCounts = meshArrow.getChild('index_count')?.toArray();
307
+ // Extract material columns (bytes 0-255)
308
+ const matR = materialArrow.getChild('r')?.toArray();
309
+ const matG = materialArrow.getChild('g')?.toArray();
310
+ const matB = materialArrow.getChild('b')?.toArray();
311
+ const matA = materialArrow.getChild('a')?.toArray();
312
+ // Extract vertex columns (quantized integers)
313
+ const vertexX = vertexArrow.getChild('x')?.toArray();
314
+ const vertexY = vertexArrow.getChild('y')?.toArray();
315
+ const vertexZ = vertexArrow.getChild('z')?.toArray();
316
+ const normalX = hasNormals ? vertexArrow.getChild('nx')?.toArray() : null;
317
+ const normalY = hasNormals ? vertexArrow.getChild('ny')?.toArray() : null;
318
+ const normalZ = hasNormals ? vertexArrow.getChild('nz')?.toArray() : null;
319
+ // Extract index column
320
+ const indices = indexArrow.getChild('i')?.toArray();
321
+ // Reconstruct MeshData array from instances
322
+ const instanceCount = entityIds.length;
323
+ const meshes = new Array(instanceCount);
324
+ const dequantMultiplier = 1.0 / vertexMultiplier;
325
+ for (let i = 0; i < instanceCount; i++) {
326
+ const meshIdx = meshIndices[i];
327
+ const materialIdx = materialIndices[i];
328
+ const vertexOffset = meshVertexOffsets[meshIdx];
329
+ const vertexCount = meshVertexCounts[meshIdx];
330
+ const indexOffset = meshIndexOffsets[meshIdx];
331
+ const indexCount = meshIndexCounts[meshIdx];
332
+ // Dequantize and reconstruct positions
333
+ // OPTIMIZATION: Z-up to Y-up transform is now done server-side for optimized format too
334
+ // Server already transforms before quantization, so we just dequantize directly
335
+ const positions = new Float32Array(vertexCount * 3);
336
+ for (let v = 0; v < vertexCount; v++) {
337
+ const srcIdx = vertexOffset + v;
338
+ positions[v * 3] = vertexX[srcIdx] * dequantMultiplier;
339
+ positions[v * 3 + 1] = vertexY[srcIdx] * dequantMultiplier;
340
+ positions[v * 3 + 2] = vertexZ[srcIdx] * dequantMultiplier;
341
+ }
342
+ // Reconstruct normals (pre-transformed server-side, or compute if not present)
343
+ let normals;
344
+ if (hasNormals && normalX && normalY && normalZ) {
345
+ normals = new Float32Array(vertexCount * 3);
346
+ for (let v = 0; v < vertexCount; v++) {
347
+ const srcIdx = vertexOffset + v;
348
+ normals[v * 3] = normalX[srcIdx];
349
+ normals[v * 3 + 1] = normalY[srcIdx];
350
+ normals[v * 3 + 2] = normalZ[srcIdx];
351
+ }
352
+ }
353
+ else {
354
+ // Compute flat normals from triangle faces
355
+ normals = computeFlatNormals(positions, indices.slice(indexOffset, indexOffset + indexCount));
356
+ }
357
+ // Reconstruct indices (relative to this mesh's vertices)
358
+ const meshIndicesArray = new Uint32Array(indexCount);
359
+ for (let j = 0; j < indexCount; j++) {
360
+ meshIndicesArray[j] = indices[indexOffset + j];
361
+ }
362
+ // Convert byte colors to float [0-1]
363
+ meshes[i] = {
364
+ express_id: entityIds[i],
365
+ ifc_type: ifcTypes?.get(i) ?? 'Unknown',
366
+ positions: positions,
367
+ normals: normals,
368
+ indices: meshIndicesArray,
369
+ color: [matR[materialIdx] / 255, matG[materialIdx] / 255, matB[materialIdx] / 255, matA[materialIdx] / 255],
370
+ };
371
+ }
372
+ return meshes;
373
+ }
374
+ /**
375
+ * Compute flat normals for a mesh from positions and indices.
376
+ * Each triangle face gets a uniform normal.
377
+ */
378
+ function computeFlatNormals(positions, indices) {
379
+ const vertexCount = positions.length / 3;
380
+ const normals = new Float32Array(vertexCount * 3).fill(0);
381
+ const triangleCount = indices.length / 3;
382
+ for (let t = 0; t < triangleCount; t++) {
383
+ const i0 = indices[t * 3];
384
+ const i1 = indices[t * 3 + 1];
385
+ const i2 = indices[t * 3 + 2];
386
+ // Get triangle vertices
387
+ const ax = positions[i0 * 3], ay = positions[i0 * 3 + 1], az = positions[i0 * 3 + 2];
388
+ const bx = positions[i1 * 3], by = positions[i1 * 3 + 1], bz = positions[i1 * 3 + 2];
389
+ const cx = positions[i2 * 3], cy = positions[i2 * 3 + 1], cz = positions[i2 * 3 + 2];
390
+ // Compute edge vectors
391
+ const e1x = bx - ax, e1y = by - ay, e1z = bz - az;
392
+ const e2x = cx - ax, e2y = cy - ay, e2z = cz - az;
393
+ // Cross product
394
+ const nx = e1y * e2z - e1z * e2y;
395
+ const ny = e1z * e2x - e1x * e2z;
396
+ const nz = e1x * e2y - e1y * e2x;
397
+ // Accumulate normals (will normalize later)
398
+ normals[i0 * 3] += nx;
399
+ normals[i0 * 3 + 1] += ny;
400
+ normals[i0 * 3 + 2] += nz;
401
+ normals[i1 * 3] += nx;
402
+ normals[i1 * 3 + 1] += ny;
403
+ normals[i1 * 3 + 2] += nz;
404
+ normals[i2 * 3] += nx;
405
+ normals[i2 * 3 + 1] += ny;
406
+ normals[i2 * 3 + 2] += nz;
407
+ }
408
+ // Normalize
409
+ for (let v = 0; v < vertexCount; v++) {
410
+ const x = normals[v * 3], y = normals[v * 3 + 1], z = normals[v * 3 + 2];
411
+ const len = Math.sqrt(x * x + y * y + z * z);
412
+ if (len > 0) {
413
+ normals[v * 3] /= len;
414
+ normals[v * 3 + 1] /= len;
415
+ normals[v * 3 + 2] /= len;
416
+ }
417
+ }
418
+ return normals;
419
+ }
420
+ //# sourceMappingURL=parquet-decoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parquet-decoder.js","sourceRoot":"","sources":["../src/parquet-decoder.ts"],"names":[],"mappings":"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"}