@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.
- package/LICENSE +373 -0
- package/dist/client.d.ts +250 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +761 -0
- package/dist/client.js.map +1 -0
- package/dist/data-model-decoder.d.ts +72 -0
- package/dist/data-model-decoder.d.ts.map +1 -0
- package/dist/data-model-decoder.js +264 -0
- package/dist/data-model-decoder.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/parquet-decoder.d.ts +52 -0
- package/dist/parquet-decoder.d.ts.map +1 -0
- package/dist/parquet-decoder.js +420 -0
- package/dist/parquet-decoder.js.map +1 -0
- package/dist/types.d.ts +338 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
|
@@ -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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"}
|