@ifc-lite/export 1.16.0 → 1.17.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/README.md +31 -1
- package/dist/glb.d.ts +17 -0
- package/dist/glb.d.ts.map +1 -0
- package/dist/glb.js +129 -0
- package/dist/glb.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/lod-geometry-types.d.ts +59 -0
- package/dist/lod-geometry-types.d.ts.map +1 -0
- package/dist/lod-geometry-types.js +5 -0
- package/dist/lod-geometry-types.js.map +1 -0
- package/dist/lod-geometry-utils.d.ts +22 -0
- package/dist/lod-geometry-utils.d.ts.map +1 -0
- package/dist/lod-geometry-utils.js +106 -0
- package/dist/lod-geometry-utils.js.map +1 -0
- package/dist/lod0-generator.d.ts +3 -0
- package/dist/lod0-generator.d.ts.map +1 -0
- package/dist/lod0-generator.js +287 -0
- package/dist/lod0-generator.js.map +1 -0
- package/dist/lod1-generator.d.ts +12 -0
- package/dist/lod1-generator.d.ts.map +1 -0
- package/dist/lod1-generator.js +138 -0
- package/dist/lod1-generator.js.map +1 -0
- package/dist/step-exporter.d.ts +10 -0
- package/dist/step-exporter.d.ts.map +1 -1
- package/dist/step-exporter.js +264 -12
- package/dist/step-exporter.js.map +1 -1
- package/package.json +7 -6
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ npm install @ifc-lite/export
|
|
|
11
11
|
## Quick Start
|
|
12
12
|
|
|
13
13
|
```typescript
|
|
14
|
-
import { GLTFExporter, ParquetExporter, exportToStep, Ifc5Exporter } from '@ifc-lite/export';
|
|
14
|
+
import { GLTFExporter, ParquetExporter, exportToStep, Ifc5Exporter, generateLod0, generateLod1 } from '@ifc-lite/export';
|
|
15
15
|
|
|
16
16
|
// Export geometry to GLB
|
|
17
17
|
const gltfExporter = new GLTFExporter();
|
|
@@ -28,6 +28,10 @@ const step = exportToStep(dataStore, { schema: 'IFC4' });
|
|
|
28
28
|
const ifc5 = new Ifc5Exporter(dataStore, geometryResult);
|
|
29
29
|
const result = ifc5.export({ includeGeometry: true });
|
|
30
30
|
// result.content is IFCX JSON, save as .ifcx
|
|
31
|
+
|
|
32
|
+
// Generate lightweight LOD artifacts from IFC bytes
|
|
33
|
+
const lod0 = await generateLod0(ifcBytes);
|
|
34
|
+
const lod1 = await generateLod1(ifcBytes, { quality: 'medium' });
|
|
31
35
|
```
|
|
32
36
|
|
|
33
37
|
## Features
|
|
@@ -37,8 +41,34 @@ const result = ifc5.export({ includeGeometry: true });
|
|
|
37
41
|
- Apache Arrow in-memory format
|
|
38
42
|
- IFC STEP export with mutations applied
|
|
39
43
|
- **IFC5 IFCX export** with USD geometry and full schema conversion
|
|
44
|
+
- Lightweight LOD0/LOD1 generation from IFC bytes
|
|
40
45
|
- Cross-schema conversion (IFC2X3 ↔ IFC4 ↔ IFC4X3 ↔ IFC5)
|
|
41
46
|
|
|
47
|
+
## Lightweight LOD Generation
|
|
48
|
+
|
|
49
|
+
The LOD generators are environment-agnostic. They accept IFC bytes, not file paths,
|
|
50
|
+
so the same API works in Node, browser, and server runtimes.
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
import { generateLod0, generateLod1 } from '@ifc-lite/export';
|
|
54
|
+
|
|
55
|
+
const bytes = await file.arrayBuffer();
|
|
56
|
+
|
|
57
|
+
const lod0 = await generateLod0(bytes);
|
|
58
|
+
// => JSON envelopes, transforms, and world-space bounding boxes
|
|
59
|
+
|
|
60
|
+
const lod1 = await generateLod1(bytes, { quality: 'medium' });
|
|
61
|
+
// => { glb, meta }
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
`generateLod0()` returns cheap geometric envelopes for every placeable element.
|
|
65
|
+
|
|
66
|
+
`generateLod1()` returns:
|
|
67
|
+
- `glb`: binary GLB geometry
|
|
68
|
+
- `meta`: generation status, failed elements, and expressId → node/mesh mapping
|
|
69
|
+
|
|
70
|
+
If meshing fails, LOD1 degrades gracefully to box geometry derived from LOD0.
|
|
71
|
+
|
|
42
72
|
## IFC5 Export
|
|
43
73
|
|
|
44
74
|
The `Ifc5Exporter` converts IFC data from any schema version to the IFC5 IFCX JSON format:
|
package/dist/glb.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { MeshData } from '@ifc-lite/geometry';
|
|
2
|
+
/**
|
|
3
|
+
* Minimal GLB parser for GLBs generated by IFC-Lite's GLTFExporter.
|
|
4
|
+
* This is not a general-purpose glTF loader.
|
|
5
|
+
*/
|
|
6
|
+
type ParsedGlb = {
|
|
7
|
+
json: any;
|
|
8
|
+
bin: Uint8Array;
|
|
9
|
+
};
|
|
10
|
+
export declare function parseGLB(glb: Uint8Array): ParsedGlb;
|
|
11
|
+
export declare function extractGlbMapping(glb: Uint8Array): Record<string, {
|
|
12
|
+
node: number;
|
|
13
|
+
mesh: number;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function parseGLBToMeshData(glb: Uint8Array): MeshData[];
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=glb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glb.d.ts","sourceRoot":"","sources":["../src/glb.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;;GAGG;AAEH,KAAK,SAAS,GAAG;IACf,IAAI,EAAE,GAAG,CAAC;IACV,GAAG,EAAE,UAAU,CAAC;CACjB,CAAC;AAEF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,CA6BnD;AAiBD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAajG;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,GAAG,QAAQ,EAAE,CA4D9D"}
|
package/dist/glb.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
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
|
+
export function parseGLB(glb) {
|
|
5
|
+
const dv = new DataView(glb.buffer, glb.byteOffset, glb.byteLength);
|
|
6
|
+
const magic = dv.getUint32(0, true);
|
|
7
|
+
if (magic !== 0x46546c67)
|
|
8
|
+
throw new Error('Invalid GLB magic');
|
|
9
|
+
const version = dv.getUint32(4, true);
|
|
10
|
+
if (version !== 2)
|
|
11
|
+
throw new Error(`Unsupported GLB version: ${version}`);
|
|
12
|
+
const totalLen = dv.getUint32(8, true);
|
|
13
|
+
if (totalLen > glb.byteLength)
|
|
14
|
+
throw new Error('Invalid GLB length');
|
|
15
|
+
let offset = 12;
|
|
16
|
+
let json = null;
|
|
17
|
+
let bin = null;
|
|
18
|
+
while (offset + 8 <= glb.byteLength) {
|
|
19
|
+
const chunkLen = dv.getUint32(offset, true);
|
|
20
|
+
const chunkType = dv.getUint32(offset + 4, true);
|
|
21
|
+
offset += 8;
|
|
22
|
+
const chunk = glb.subarray(offset, offset + chunkLen);
|
|
23
|
+
offset += chunkLen;
|
|
24
|
+
if (chunkType === 0x4e4f534a) {
|
|
25
|
+
const txt = new TextDecoder().decode(chunk);
|
|
26
|
+
json = JSON.parse(txt);
|
|
27
|
+
}
|
|
28
|
+
else if (chunkType === 0x004e4942) {
|
|
29
|
+
bin = chunk;
|
|
30
|
+
}
|
|
31
|
+
// 4-byte alignment is already baked into chunkLen in GLB; offset is aligned.
|
|
32
|
+
}
|
|
33
|
+
if (!json || !bin)
|
|
34
|
+
throw new Error('Invalid GLB: missing JSON or BIN chunk');
|
|
35
|
+
return { json, bin };
|
|
36
|
+
}
|
|
37
|
+
function componentTypeSize(componentType) {
|
|
38
|
+
// Only types we emit
|
|
39
|
+
if (componentType === 5126)
|
|
40
|
+
return 4; // FLOAT
|
|
41
|
+
if (componentType === 5125)
|
|
42
|
+
return 4; // UNSIGNED_INT
|
|
43
|
+
throw new Error(`Unsupported componentType: ${componentType}`);
|
|
44
|
+
}
|
|
45
|
+
function typeComponents(type) {
|
|
46
|
+
if (type === 'SCALAR')
|
|
47
|
+
return 1;
|
|
48
|
+
if (type === 'VEC2')
|
|
49
|
+
return 2;
|
|
50
|
+
if (type === 'VEC3')
|
|
51
|
+
return 3;
|
|
52
|
+
if (type === 'VEC4')
|
|
53
|
+
return 4;
|
|
54
|
+
throw new Error(`Unsupported accessor type: ${type}`);
|
|
55
|
+
}
|
|
56
|
+
export function extractGlbMapping(glb) {
|
|
57
|
+
const { json } = parseGLB(glb);
|
|
58
|
+
const out = {};
|
|
59
|
+
const nodes = Array.isArray(json?.nodes) ? json.nodes : [];
|
|
60
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
61
|
+
const n = nodes[i];
|
|
62
|
+
const meshIdx = typeof n?.mesh === 'number' ? n.mesh : null;
|
|
63
|
+
const expressId = n?.extras?.expressId;
|
|
64
|
+
if (meshIdx !== null && typeof expressId === 'number') {
|
|
65
|
+
out[String(expressId)] = { node: i, mesh: meshIdx };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
70
|
+
export function parseGLBToMeshData(glb) {
|
|
71
|
+
const { json, bin } = parseGLB(glb);
|
|
72
|
+
const nodes = Array.isArray(json?.nodes) ? json.nodes : [];
|
|
73
|
+
const meshes = Array.isArray(json?.meshes) ? json.meshes : [];
|
|
74
|
+
const accessors = Array.isArray(json?.accessors) ? json.accessors : [];
|
|
75
|
+
const bufferViews = Array.isArray(json?.bufferViews) ? json.bufferViews : [];
|
|
76
|
+
const readAccessor = (accessorIndex) => {
|
|
77
|
+
const acc = accessors[accessorIndex];
|
|
78
|
+
const bv = bufferViews[acc.bufferView];
|
|
79
|
+
const byteOffset = (bv.byteOffset || 0) + (acc.byteOffset || 0);
|
|
80
|
+
const count = Number(acc.count || 0);
|
|
81
|
+
const comps = typeComponents(String(acc.type));
|
|
82
|
+
const cSize = componentTypeSize(Number(acc.componentType));
|
|
83
|
+
const byteLen = count * comps * cSize;
|
|
84
|
+
if (byteOffset + byteLen > bin.byteLength) {
|
|
85
|
+
throw new Error(`GLB accessor out of bounds: offset=${byteOffset} len=${byteLen} bufLen=${bin.byteLength}`);
|
|
86
|
+
}
|
|
87
|
+
const slice = bin.subarray(byteOffset, byteOffset + byteLen);
|
|
88
|
+
// Ensure 4-byte alignment; copy to a new buffer if the slice is unaligned
|
|
89
|
+
const aligned = (slice.byteOffset % 4 === 0)
|
|
90
|
+
? slice
|
|
91
|
+
: new Uint8Array(slice);
|
|
92
|
+
if (Number(acc.componentType) === 5126) {
|
|
93
|
+
return { array: new Float32Array(aligned.buffer, aligned.byteOffset, aligned.byteLength / 4), count, components: comps };
|
|
94
|
+
}
|
|
95
|
+
if (Number(acc.componentType) === 5125) {
|
|
96
|
+
return { array: new Uint32Array(aligned.buffer, aligned.byteOffset, aligned.byteLength / 4), count, components: comps };
|
|
97
|
+
}
|
|
98
|
+
throw new Error('Unsupported accessor component type');
|
|
99
|
+
};
|
|
100
|
+
const out = [];
|
|
101
|
+
for (const node of nodes) {
|
|
102
|
+
const meshIdx = typeof node?.mesh === 'number' ? node.mesh : null;
|
|
103
|
+
if (meshIdx === null)
|
|
104
|
+
continue;
|
|
105
|
+
const mesh = meshes[meshIdx];
|
|
106
|
+
const prim = Array.isArray(mesh?.primitives) ? mesh.primitives[0] : null;
|
|
107
|
+
if (!prim)
|
|
108
|
+
continue;
|
|
109
|
+
const posAcc = prim.attributes?.POSITION;
|
|
110
|
+
const normAcc = prim.attributes?.NORMAL;
|
|
111
|
+
const idxAcc = prim.indices;
|
|
112
|
+
if (typeof posAcc !== 'number' || typeof normAcc !== 'number' || typeof idxAcc !== 'number')
|
|
113
|
+
continue;
|
|
114
|
+
const pos = readAccessor(posAcc).array;
|
|
115
|
+
const nor = readAccessor(normAcc).array;
|
|
116
|
+
const ind = readAccessor(idxAcc).array;
|
|
117
|
+
const expressId = typeof node?.extras?.expressId === 'number' ? node.extras.expressId : 0;
|
|
118
|
+
out.push({
|
|
119
|
+
expressId,
|
|
120
|
+
positions: new Float32Array(pos),
|
|
121
|
+
normals: new Float32Array(nor),
|
|
122
|
+
indices: new Uint32Array(ind),
|
|
123
|
+
color: [0.8, 0.8, 0.8, 1],
|
|
124
|
+
ifcType: 'IfcElement',
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return out;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=glb.js.map
|
package/dist/glb.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glb.js","sourceRoot":"","sources":["../src/glb.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,4 +10,8 @@ export { MergedExporter, type MergeModelInput, type MergeExportOptions, type Mer
|
|
|
10
10
|
export { collectReferencedEntityIds, getVisibleEntityIds, collectStyleEntities } from './reference-collector.js';
|
|
11
11
|
export { convertEntityType, convertStepLine, needsConversion, describeConversion, type IfcSchemaVersion } from './schema-converter.js';
|
|
12
12
|
export { Ifc5Exporter, IFC5_KNOWN_PROP_NAMES, type Ifc5ExportOptions, type Ifc5ExportResult } from './ifc5-exporter.js';
|
|
13
|
+
export type { Vec3, LodInput, Lod0Element, Lod0Json, Lod1MetaJson, GenerateLod1Result } from './lod-geometry-types.js';
|
|
14
|
+
export { generateLod0 } from './lod0-generator.js';
|
|
15
|
+
export { generateLod1, type GenerateLod1Options } from './lod1-generator.js';
|
|
16
|
+
export { parseGLB, extractGlbMapping, parseGLBToMeshData } from './glb.js';
|
|
13
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxI,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAClJ,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACjH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACvI,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxI,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAClJ,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACjH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACvI,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGxH,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACvH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -13,4 +13,7 @@ export { MergedExporter } from './merged-exporter.js';
|
|
|
13
13
|
export { collectReferencedEntityIds, getVisibleEntityIds, collectStyleEntities } from './reference-collector.js';
|
|
14
14
|
export { convertEntityType, convertStepLine, needsConversion, describeConversion } from './schema-converter.js';
|
|
15
15
|
export { Ifc5Exporter, IFC5_KNOWN_PROP_NAMES } from './ifc5-exporter.js';
|
|
16
|
+
export { generateLod0 } from './lod0-generator.js';
|
|
17
|
+
export { generateLod1 } from './lod1-generator.js';
|
|
18
|
+
export { parseGLB, extractGlbMapping, parseGLBToMeshData } from './glb.js';
|
|
16
19
|
//# sourceMappingURL=index.js.map
|
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;;GAEG;AAEH,OAAO,EAAE,YAAY,EAA0B,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAA6B,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAyB,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,cAAc,EAA4B,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,YAAY,EAA0E,MAAM,oBAAoB,CAAC;AACxI,OAAO,EAAE,cAAc,EAA8F,MAAM,sBAAsB,CAAC;AAClJ,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACjH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAyB,MAAM,uBAAuB,CAAC;AACvI,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAiD,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;GAEG;AAEH,OAAO,EAAE,YAAY,EAA0B,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAA6B,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAyB,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,cAAc,EAA4B,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,YAAY,EAA0E,MAAM,oBAAoB,CAAC;AACxI,OAAO,EAAE,cAAc,EAA8F,MAAM,sBAAsB,CAAC;AAClJ,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACjH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAyB,MAAM,uBAAuB,CAAC;AACvI,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAiD,MAAM,oBAAoB,CAAC;AAIxH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAA4B,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export type Vec3 = [number, number, number];
|
|
2
|
+
export type LodInput = ArrayBuffer | Uint8Array;
|
|
3
|
+
export type Lod0Element = {
|
|
4
|
+
expressID: number;
|
|
5
|
+
globalId: string | null;
|
|
6
|
+
ifcClass: string;
|
|
7
|
+
name: string | null;
|
|
8
|
+
/** Row-major 4x4 world matrix */
|
|
9
|
+
transform: [
|
|
10
|
+
number,
|
|
11
|
+
number,
|
|
12
|
+
number,
|
|
13
|
+
number,
|
|
14
|
+
number,
|
|
15
|
+
number,
|
|
16
|
+
number,
|
|
17
|
+
number,
|
|
18
|
+
number,
|
|
19
|
+
number,
|
|
20
|
+
number,
|
|
21
|
+
number,
|
|
22
|
+
number,
|
|
23
|
+
number,
|
|
24
|
+
number,
|
|
25
|
+
number
|
|
26
|
+
];
|
|
27
|
+
/** World-space axis-aligned bounding box */
|
|
28
|
+
bbox: {
|
|
29
|
+
min: Vec3;
|
|
30
|
+
max: Vec3;
|
|
31
|
+
};
|
|
32
|
+
centroid: Vec3;
|
|
33
|
+
/** Where bbox came from (required for fallback) */
|
|
34
|
+
bbox_source: 'shape' | 'fallback';
|
|
35
|
+
};
|
|
36
|
+
export type Lod0Json = {
|
|
37
|
+
schema: 'ifc-lite-geometry';
|
|
38
|
+
lod: 0;
|
|
39
|
+
units: 'm';
|
|
40
|
+
elements: Lod0Element[];
|
|
41
|
+
};
|
|
42
|
+
export type Lod1MetaJson = {
|
|
43
|
+
schema: 'ifc-lite-geometry';
|
|
44
|
+
lod: 1;
|
|
45
|
+
status: 'ok' | 'degraded';
|
|
46
|
+
fallback?: 'boxes_from_lod0';
|
|
47
|
+
failedElements: number[];
|
|
48
|
+
notes: string[];
|
|
49
|
+
/** expressID -> node/mesh mapping */
|
|
50
|
+
mapping: Record<string, {
|
|
51
|
+
node: number;
|
|
52
|
+
mesh: number;
|
|
53
|
+
}>;
|
|
54
|
+
};
|
|
55
|
+
export type GenerateLod1Result = {
|
|
56
|
+
glb: Uint8Array;
|
|
57
|
+
meta: Lod1MetaJson;
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=lod-geometry-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lod-geometry-types.d.ts","sourceRoot":"","sources":["../src/lod-geometry-types.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE5C,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,iCAAiC;IACjC,SAAS,EAAE;QACT,MAAM;QAAE,MAAM;QAAE,MAAM;QAAE,MAAM;QAC9B,MAAM;QAAE,MAAM;QAAE,MAAM;QAAE,MAAM;QAC9B,MAAM;QAAE,MAAM;QAAE,MAAM;QAAE,MAAM;QAC9B,MAAM;QAAE,MAAM;QAAE,MAAM;QAAE,MAAM;KAC/B,CAAC;IACF,4CAA4C;IAC5C,IAAI,EAAE;QAAE,GAAG,EAAE,IAAI,CAAC;QAAC,GAAG,EAAE,IAAI,CAAA;KAAE,CAAC;IAC/B,QAAQ,EAAE,IAAI,CAAC;IACf,mDAAmD;IACnD,WAAW,EAAE,OAAO,GAAG,UAAU,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,GAAG,EAAE,CAAC,CAAC;IACP,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,GAAG,EAAE,CAAC,CAAC;IACP,MAAM,EAAE,IAAI,GAAG,UAAU,CAAC;IAC1B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lod-geometry-types.js","sourceRoot":"","sources":["../src/lod-geometry-types.ts"],"names":[],"mappings":"AAAA;;+DAE+D"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Vec3 } from './lod-geometry-types.js';
|
|
2
|
+
/** Normalize IFC bytes into a tightly-sized ArrayBuffer. */
|
|
3
|
+
export declare function toIfcArrayBuffer(input: ArrayBuffer | Uint8Array): ArrayBuffer;
|
|
4
|
+
/**
|
|
5
|
+
* Normalize IFC type names to canonical PascalCase (e.g. "IFCWALL" → "IfcWall").
|
|
6
|
+
* For multi-word uppercase types (e.g. "IFCWALLSTANDARDCASE") we pass through
|
|
7
|
+
* as-is since we cannot recover PascalCase without a full type registry lookup.
|
|
8
|
+
*/
|
|
9
|
+
export declare function normalizeIfcTypeName(typeName: string): string;
|
|
10
|
+
export declare function vec3(x: number, y: number, z: number): Vec3;
|
|
11
|
+
export declare function vec3Cross(a: Vec3, b: Vec3): Vec3;
|
|
12
|
+
export declare function vec3Normalize(a: Vec3, fallback: Vec3): Vec3;
|
|
13
|
+
export declare function mat4Identity(): Float64Array;
|
|
14
|
+
/** Row-major 4x4 multiply: out = a * b */
|
|
15
|
+
export declare function mat4Mul(a: Float64Array, b: Float64Array): Float64Array;
|
|
16
|
+
export declare function mat4FromBasisTranslation(xAxis: Vec3, yAxis: Vec3, zAxis: Vec3, t: Vec3): Float64Array;
|
|
17
|
+
export declare function mat4TransformPoint(m: Float64Array, p: Vec3): Vec3;
|
|
18
|
+
export declare function aabbFromPoints(points: Vec3[]): {
|
|
19
|
+
min: Vec3;
|
|
20
|
+
max: Vec3;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=lod-geometry-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lod-geometry-utils.d.ts","sourceRoot":"","sources":["../src/lod-geometry-utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEpD,4DAA4D;AAC5D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,WAAW,CAO7E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO7D;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAE1D;AAMD,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAMhD;AAMD,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,CAI3D;AAED,wBAAgB,YAAY,IAAI,YAAY,CAO3C;AAED,0CAA0C;AAC1C,wBAAgB,OAAO,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,YAAY,CAatE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,YAAY,CAQrG;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAOjE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG;IAAE,GAAG,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,CAavE"}
|
|
@@ -0,0 +1,106 @@
|
|
|
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
|
+
/** Normalize IFC bytes into a tightly-sized ArrayBuffer. */
|
|
5
|
+
export function toIfcArrayBuffer(input) {
|
|
6
|
+
if (input instanceof ArrayBuffer)
|
|
7
|
+
return input;
|
|
8
|
+
// Uint8Array view — avoid copy when already covering the entire buffer
|
|
9
|
+
if (input.byteOffset === 0 && input.byteLength === input.buffer.byteLength) {
|
|
10
|
+
return input.buffer;
|
|
11
|
+
}
|
|
12
|
+
return input.buffer.slice(input.byteOffset, input.byteOffset + input.byteLength);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Normalize IFC type names to canonical PascalCase (e.g. "IFCWALL" → "IfcWall").
|
|
16
|
+
* For multi-word uppercase types (e.g. "IFCWALLSTANDARDCASE") we pass through
|
|
17
|
+
* as-is since we cannot recover PascalCase without a full type registry lookup.
|
|
18
|
+
*/
|
|
19
|
+
export function normalizeIfcTypeName(typeName) {
|
|
20
|
+
const s = String(typeName || '').trim();
|
|
21
|
+
if (!s)
|
|
22
|
+
return '';
|
|
23
|
+
// Already in PascalCase (e.g. "IfcWall", "IfcWallStandardCase")
|
|
24
|
+
if (s.startsWith('Ifc') && s.length > 3 && s[3] >= 'A' && s[3] <= 'Z')
|
|
25
|
+
return s;
|
|
26
|
+
// Pass through as-is — uppercase form is valid for matching
|
|
27
|
+
return s;
|
|
28
|
+
}
|
|
29
|
+
export function vec3(x, y, z) {
|
|
30
|
+
return [x, y, z];
|
|
31
|
+
}
|
|
32
|
+
function vec3Dot(a, b) {
|
|
33
|
+
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
|
34
|
+
}
|
|
35
|
+
export function vec3Cross(a, b) {
|
|
36
|
+
return [
|
|
37
|
+
a[1] * b[2] - a[2] * b[1],
|
|
38
|
+
a[2] * b[0] - a[0] * b[2],
|
|
39
|
+
a[0] * b[1] - a[1] * b[0],
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
function vec3Len(a) {
|
|
43
|
+
return Math.sqrt(vec3Dot(a, a));
|
|
44
|
+
}
|
|
45
|
+
export function vec3Normalize(a, fallback) {
|
|
46
|
+
const l = vec3Len(a);
|
|
47
|
+
if (!Number.isFinite(l) || l <= 1e-12)
|
|
48
|
+
return fallback;
|
|
49
|
+
return [a[0] / l, a[1] / l, a[2] / l];
|
|
50
|
+
}
|
|
51
|
+
export function mat4Identity() {
|
|
52
|
+
return new Float64Array([
|
|
53
|
+
1, 0, 0, 0,
|
|
54
|
+
0, 1, 0, 0,
|
|
55
|
+
0, 0, 1, 0,
|
|
56
|
+
0, 0, 0, 1,
|
|
57
|
+
]);
|
|
58
|
+
}
|
|
59
|
+
/** Row-major 4x4 multiply: out = a * b */
|
|
60
|
+
export function mat4Mul(a, b) {
|
|
61
|
+
const o = new Float64Array(16);
|
|
62
|
+
for (let r = 0; r < 4; r++) {
|
|
63
|
+
const r0 = r * 4;
|
|
64
|
+
for (let c = 0; c < 4; c++) {
|
|
65
|
+
o[r0 + c] =
|
|
66
|
+
a[r0 + 0] * b[0 * 4 + c] +
|
|
67
|
+
a[r0 + 1] * b[1 * 4 + c] +
|
|
68
|
+
a[r0 + 2] * b[2 * 4 + c] +
|
|
69
|
+
a[r0 + 3] * b[3 * 4 + c];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return o;
|
|
73
|
+
}
|
|
74
|
+
export function mat4FromBasisTranslation(xAxis, yAxis, zAxis, t) {
|
|
75
|
+
// Row-major, columns are basis vectors (x,y,z), last column is translation.
|
|
76
|
+
return new Float64Array([
|
|
77
|
+
xAxis[0], yAxis[0], zAxis[0], t[0],
|
|
78
|
+
xAxis[1], yAxis[1], zAxis[1], t[1],
|
|
79
|
+
xAxis[2], yAxis[2], zAxis[2], t[2],
|
|
80
|
+
0, 0, 0, 1,
|
|
81
|
+
]);
|
|
82
|
+
}
|
|
83
|
+
export function mat4TransformPoint(m, p) {
|
|
84
|
+
const x = p[0], y = p[1], z = p[2];
|
|
85
|
+
return [
|
|
86
|
+
m[0] * x + m[1] * y + m[2] * z + m[3],
|
|
87
|
+
m[4] * x + m[5] * y + m[6] * z + m[7],
|
|
88
|
+
m[8] * x + m[9] * y + m[10] * z + m[11],
|
|
89
|
+
];
|
|
90
|
+
}
|
|
91
|
+
export function aabbFromPoints(points) {
|
|
92
|
+
let minX = Infinity, minY = Infinity, minZ = Infinity;
|
|
93
|
+
let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
94
|
+
for (const p of points) {
|
|
95
|
+
minX = Math.min(minX, p[0]);
|
|
96
|
+
minY = Math.min(minY, p[1]);
|
|
97
|
+
minZ = Math.min(minZ, p[2]);
|
|
98
|
+
maxX = Math.max(maxX, p[0]);
|
|
99
|
+
maxY = Math.max(maxY, p[1]);
|
|
100
|
+
maxZ = Math.max(maxZ, p[2]);
|
|
101
|
+
}
|
|
102
|
+
if (!Number.isFinite(minX))
|
|
103
|
+
return { min: [0, 0, 0], max: [0, 0, 0] };
|
|
104
|
+
return { min: [minX, minY, minZ], max: [maxX, maxY, maxZ] };
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=lod-geometry-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lod-geometry-utils.js","sourceRoot":"","sources":["../src/lod-geometry-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lod0-generator.d.ts","sourceRoot":"","sources":["../src/lod0-generator.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAe,QAAQ,EAAQ,MAAM,yBAAyB,CAAC;AA6DrF,wBAAsB,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAgPrE"}
|