@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 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
@@ -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
@@ -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,5 @@
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 {};
5
+ //# sourceMappingURL=lod-geometry-types.js.map
@@ -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":"AAAA;;+DAE+D;AAI/D,4DAA4D;AAC5D,MAAM,UAAU,gBAAgB,CAAC,KAA+B;IAC9D,IAAI,KAAK,YAAY,WAAW;QAAE,OAAO,KAAK,CAAC;IAC/C,uEAAuE;IACvE,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC3E,OAAO,KAAK,CAAC,MAAqB,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAgB,CAAC;AAClG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,gEAAgE;IAChE,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC;IAChF,4DAA4D;IAC5D,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IAClD,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,OAAO,CAAC,CAAO,EAAE,CAAO;IAC/B,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,CAAO,EAAE,CAAO;IACxC,OAAO;QACL,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,CAAO;IACtB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAO,EAAE,QAAc;IACnD,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK;QAAE,OAAO,QAAQ,CAAC;IACvD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,YAAY,CAAC;QACtB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACV,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACV,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACV,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;KACX,CAAC,CAAC;AACL,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,OAAO,CAAC,CAAe,EAAE,CAAe;IACtD,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACP,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACxB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACxB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACxB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAW,EAAE,KAAW,EAAE,KAAW,EAAE,CAAO;IACrF,4EAA4E;IAC5E,OAAO,IAAI,YAAY,CAAC;QACtB,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,CAAe,EAAE,CAAO;IACzD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO;QACL,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,IAAI,IAAI,GAAG,QAAQ,EAAE,IAAI,GAAG,QAAQ,EAAE,IAAI,GAAG,QAAQ,CAAC;IACtD,IAAI,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC;IACzD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACtE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Lod0Json, LodInput } from './lod-geometry-types.js';
2
+ export declare function generateLod0(input: LodInput): Promise<Lod0Json>;
3
+ //# sourceMappingURL=lod0-generator.d.ts.map
@@ -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"}