@ifc-lite/cache 1.2.1 → 1.6.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/dist/glb.d.ts +107 -0
- package/dist/glb.d.ts.map +1 -0
- package/dist/glb.js +300 -0
- package/dist/glb.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/sections/entities.d.ts.map +1 -1
- package/dist/sections/entities.js +14 -0
- package/dist/sections/entities.js.map +1 -1
- package/dist/sections/geometry.d.ts +0 -3
- package/dist/sections/geometry.d.ts.map +1 -1
- package/dist/sections/geometry.js +78 -11
- package/dist/sections/geometry.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/package.json +6 -5
package/dist/glb.d.ts
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GLB (binary glTF) parser for loading pre-cached geometry
|
|
3
|
+
*
|
|
4
|
+
* Complements the GLTFExporter by enabling round-trip workflows:
|
|
5
|
+
* IFC -> GLB (export) -> GLB -> MeshData (import)
|
|
6
|
+
*/
|
|
7
|
+
import type { MeshData } from '@ifc-lite/geometry';
|
|
8
|
+
/** Parsed GLB structure */
|
|
9
|
+
export interface ParsedGLB {
|
|
10
|
+
json: GLTFDocument;
|
|
11
|
+
bin: Uint8Array | null;
|
|
12
|
+
}
|
|
13
|
+
/** Mapping from IFC express ID to GLB node/mesh indices */
|
|
14
|
+
export interface GLBMapping {
|
|
15
|
+
expressIdToNode: Map<number, number>;
|
|
16
|
+
expressIdToMesh: Map<number, number>;
|
|
17
|
+
nodeToExpressId: Map<number, number>;
|
|
18
|
+
}
|
|
19
|
+
interface GLTFDocument {
|
|
20
|
+
asset: {
|
|
21
|
+
version: string;
|
|
22
|
+
generator?: string;
|
|
23
|
+
};
|
|
24
|
+
scene?: number;
|
|
25
|
+
scenes?: Array<{
|
|
26
|
+
nodes?: number[];
|
|
27
|
+
}>;
|
|
28
|
+
nodes?: GLTFNode[];
|
|
29
|
+
meshes?: GLTFMesh[];
|
|
30
|
+
accessors?: GLTFAccessor[];
|
|
31
|
+
bufferViews?: GLTFBufferView[];
|
|
32
|
+
buffers?: GLTFBuffer[];
|
|
33
|
+
}
|
|
34
|
+
interface GLTFNode {
|
|
35
|
+
mesh?: number;
|
|
36
|
+
name?: string;
|
|
37
|
+
extras?: {
|
|
38
|
+
expressId?: number;
|
|
39
|
+
};
|
|
40
|
+
children?: number[];
|
|
41
|
+
}
|
|
42
|
+
interface GLTFMesh {
|
|
43
|
+
primitives: GLTFPrimitive[];
|
|
44
|
+
name?: string;
|
|
45
|
+
}
|
|
46
|
+
interface GLTFPrimitive {
|
|
47
|
+
attributes: {
|
|
48
|
+
POSITION: number;
|
|
49
|
+
NORMAL?: number;
|
|
50
|
+
};
|
|
51
|
+
indices?: number;
|
|
52
|
+
mode?: number;
|
|
53
|
+
}
|
|
54
|
+
interface GLTFAccessor {
|
|
55
|
+
bufferView: number;
|
|
56
|
+
byteOffset?: number;
|
|
57
|
+
componentType: number;
|
|
58
|
+
count: number;
|
|
59
|
+
type: 'SCALAR' | 'VEC2' | 'VEC3' | 'VEC4' | 'MAT2' | 'MAT3' | 'MAT4';
|
|
60
|
+
min?: number[];
|
|
61
|
+
max?: number[];
|
|
62
|
+
}
|
|
63
|
+
interface GLTFBufferView {
|
|
64
|
+
buffer: number;
|
|
65
|
+
byteOffset?: number;
|
|
66
|
+
byteLength: number;
|
|
67
|
+
byteStride?: number;
|
|
68
|
+
target?: number;
|
|
69
|
+
}
|
|
70
|
+
interface GLTFBuffer {
|
|
71
|
+
byteLength: number;
|
|
72
|
+
uri?: string;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Parse a GLB (binary glTF) file
|
|
76
|
+
*
|
|
77
|
+
* @param data - The GLB file as a Uint8Array
|
|
78
|
+
* @returns Parsed GLB with JSON document and binary buffer
|
|
79
|
+
* @throws Error if the GLB format is invalid
|
|
80
|
+
*/
|
|
81
|
+
export declare function parseGLB(data: Uint8Array): ParsedGLB;
|
|
82
|
+
/**
|
|
83
|
+
* Extract mapping between IFC express IDs and GLB node/mesh indices
|
|
84
|
+
*
|
|
85
|
+
* This relies on the extras.expressId property set during export.
|
|
86
|
+
*
|
|
87
|
+
* @param gltf - Parsed glTF document
|
|
88
|
+
* @returns Mapping between express IDs and node/mesh indices
|
|
89
|
+
*/
|
|
90
|
+
export declare function extractGLBMapping(gltf: GLTFDocument): GLBMapping;
|
|
91
|
+
/**
|
|
92
|
+
* Parse GLB geometry into MeshData format
|
|
93
|
+
*
|
|
94
|
+
* @param gltf - Parsed glTF document
|
|
95
|
+
* @param bin - Binary buffer from GLB
|
|
96
|
+
* @returns Array of MeshData objects
|
|
97
|
+
*/
|
|
98
|
+
export declare function parseGLBToMeshData(gltf: GLTFDocument, bin: Uint8Array): MeshData[];
|
|
99
|
+
/**
|
|
100
|
+
* Convenience function to parse GLB directly to MeshData
|
|
101
|
+
*
|
|
102
|
+
* @param data - GLB file as Uint8Array
|
|
103
|
+
* @returns Array of MeshData objects
|
|
104
|
+
*/
|
|
105
|
+
export declare function loadGLBToMeshData(data: Uint8Array): MeshData[];
|
|
106
|
+
export {};
|
|
107
|
+
//# sourceMappingURL=glb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glb.d.ts","sourceRoot":"","sources":["../src/glb.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAgBnD,2BAA2B;AAC3B,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,YAAY,CAAC;IACnB,GAAG,EAAE,UAAU,GAAG,IAAI,CAAC;CACxB;AAED,2DAA2D;AAC3D,MAAM,WAAW,UAAU;IACzB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAGD,UAAU,YAAY;IACpB,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACrC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,UAAU,QAAQ;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,UAAU,QAAQ;IAChB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,aAAa;IACrB,UAAU,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,YAAY;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACrE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,UAAU;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,CAyDpD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,UAAU,CAwBhE;AAmID;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,GAAG,QAAQ,EAAE,CA8ElF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,QAAQ,EAAE,CAM9D"}
|
package/dist/glb.js
ADDED
|
@@ -0,0 +1,300 @@
|
|
|
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
|
+
// glTF 2.0 constants
|
|
5
|
+
const GLB_MAGIC = 0x46546c67; // 'glTF'
|
|
6
|
+
const GLB_VERSION = 2;
|
|
7
|
+
const CHUNK_TYPE_JSON = 0x4e4f534a; // 'JSON'
|
|
8
|
+
const CHUNK_TYPE_BIN = 0x004e4942; // 'BIN\0'
|
|
9
|
+
// Component types
|
|
10
|
+
const COMPONENT_BYTE = 5120;
|
|
11
|
+
const COMPONENT_UNSIGNED_BYTE = 5121;
|
|
12
|
+
const COMPONENT_SHORT = 5122;
|
|
13
|
+
const COMPONENT_UNSIGNED_SHORT = 5123;
|
|
14
|
+
const COMPONENT_UNSIGNED_INT = 5125;
|
|
15
|
+
const COMPONENT_FLOAT = 5126;
|
|
16
|
+
/**
|
|
17
|
+
* Parse a GLB (binary glTF) file
|
|
18
|
+
*
|
|
19
|
+
* @param data - The GLB file as a Uint8Array
|
|
20
|
+
* @returns Parsed GLB with JSON document and binary buffer
|
|
21
|
+
* @throws Error if the GLB format is invalid
|
|
22
|
+
*/
|
|
23
|
+
export function parseGLB(data) {
|
|
24
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
25
|
+
// Validate header (12 bytes)
|
|
26
|
+
if (data.byteLength < 12) {
|
|
27
|
+
throw new Error('GLB file too small for header');
|
|
28
|
+
}
|
|
29
|
+
const magic = view.getUint32(0, true);
|
|
30
|
+
if (magic !== GLB_MAGIC) {
|
|
31
|
+
throw new Error(`Invalid GLB magic: expected 0x${GLB_MAGIC.toString(16)}, got 0x${magic.toString(16)}`);
|
|
32
|
+
}
|
|
33
|
+
const version = view.getUint32(4, true);
|
|
34
|
+
if (version !== GLB_VERSION) {
|
|
35
|
+
throw new Error(`Unsupported GLB version: ${version}`);
|
|
36
|
+
}
|
|
37
|
+
const totalLength = view.getUint32(8, true);
|
|
38
|
+
if (totalLength > data.byteLength) {
|
|
39
|
+
throw new Error(`GLB declared length ${totalLength} exceeds data length ${data.byteLength}`);
|
|
40
|
+
}
|
|
41
|
+
// Parse chunks
|
|
42
|
+
let offset = 12;
|
|
43
|
+
let json = null;
|
|
44
|
+
let bin = null;
|
|
45
|
+
while (offset < totalLength) {
|
|
46
|
+
if (offset + 8 > totalLength) {
|
|
47
|
+
throw new Error('Incomplete chunk header');
|
|
48
|
+
}
|
|
49
|
+
const chunkLength = view.getUint32(offset, true);
|
|
50
|
+
const chunkType = view.getUint32(offset + 4, true);
|
|
51
|
+
offset += 8;
|
|
52
|
+
if (offset + chunkLength > totalLength) {
|
|
53
|
+
throw new Error('Chunk extends beyond file');
|
|
54
|
+
}
|
|
55
|
+
if (chunkType === CHUNK_TYPE_JSON) {
|
|
56
|
+
const jsonBytes = data.subarray(offset, offset + chunkLength);
|
|
57
|
+
const jsonString = new TextDecoder().decode(jsonBytes);
|
|
58
|
+
json = JSON.parse(jsonString);
|
|
59
|
+
}
|
|
60
|
+
else if (chunkType === CHUNK_TYPE_BIN) {
|
|
61
|
+
bin = data.slice(offset, offset + chunkLength);
|
|
62
|
+
}
|
|
63
|
+
offset += chunkLength;
|
|
64
|
+
}
|
|
65
|
+
if (!json) {
|
|
66
|
+
throw new Error('GLB missing JSON chunk');
|
|
67
|
+
}
|
|
68
|
+
return { json, bin };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Extract mapping between IFC express IDs and GLB node/mesh indices
|
|
72
|
+
*
|
|
73
|
+
* This relies on the extras.expressId property set during export.
|
|
74
|
+
*
|
|
75
|
+
* @param gltf - Parsed glTF document
|
|
76
|
+
* @returns Mapping between express IDs and node/mesh indices
|
|
77
|
+
*/
|
|
78
|
+
export function extractGLBMapping(gltf) {
|
|
79
|
+
const expressIdToNode = new Map();
|
|
80
|
+
const expressIdToMesh = new Map();
|
|
81
|
+
const nodeToExpressId = new Map();
|
|
82
|
+
if (!gltf.nodes) {
|
|
83
|
+
return { expressIdToNode, expressIdToMesh, nodeToExpressId };
|
|
84
|
+
}
|
|
85
|
+
for (let nodeIdx = 0; nodeIdx < gltf.nodes.length; nodeIdx++) {
|
|
86
|
+
const node = gltf.nodes[nodeIdx];
|
|
87
|
+
const expressId = node.extras?.expressId;
|
|
88
|
+
if (expressId !== undefined) {
|
|
89
|
+
expressIdToNode.set(expressId, nodeIdx);
|
|
90
|
+
nodeToExpressId.set(nodeIdx, expressId);
|
|
91
|
+
if (node.mesh !== undefined) {
|
|
92
|
+
expressIdToMesh.set(expressId, node.mesh);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return { expressIdToNode, expressIdToMesh, nodeToExpressId };
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get the byte size for a glTF component type
|
|
100
|
+
*/
|
|
101
|
+
function getComponentSize(componentType) {
|
|
102
|
+
switch (componentType) {
|
|
103
|
+
case COMPONENT_BYTE:
|
|
104
|
+
case COMPONENT_UNSIGNED_BYTE:
|
|
105
|
+
return 1;
|
|
106
|
+
case COMPONENT_SHORT:
|
|
107
|
+
case COMPONENT_UNSIGNED_SHORT:
|
|
108
|
+
return 2;
|
|
109
|
+
case COMPONENT_UNSIGNED_INT:
|
|
110
|
+
case COMPONENT_FLOAT:
|
|
111
|
+
return 4;
|
|
112
|
+
default:
|
|
113
|
+
throw new Error(`Unknown component type: ${componentType}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get the number of components for an accessor type
|
|
118
|
+
*/
|
|
119
|
+
function getComponentCount(type) {
|
|
120
|
+
switch (type) {
|
|
121
|
+
case 'SCALAR':
|
|
122
|
+
return 1;
|
|
123
|
+
case 'VEC2':
|
|
124
|
+
return 2;
|
|
125
|
+
case 'VEC3':
|
|
126
|
+
return 3;
|
|
127
|
+
case 'VEC4':
|
|
128
|
+
return 4;
|
|
129
|
+
case 'MAT2':
|
|
130
|
+
return 4;
|
|
131
|
+
case 'MAT3':
|
|
132
|
+
return 9;
|
|
133
|
+
case 'MAT4':
|
|
134
|
+
return 16;
|
|
135
|
+
default:
|
|
136
|
+
throw new Error(`Unknown accessor type: ${type}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Read accessor data as a typed array
|
|
141
|
+
*/
|
|
142
|
+
function readAccessorData(gltf, bin, accessorIdx) {
|
|
143
|
+
const accessor = gltf.accessors?.[accessorIdx];
|
|
144
|
+
if (!accessor) {
|
|
145
|
+
throw new Error(`Accessor ${accessorIdx} not found`);
|
|
146
|
+
}
|
|
147
|
+
const bufferView = gltf.bufferViews?.[accessor.bufferView];
|
|
148
|
+
if (!bufferView) {
|
|
149
|
+
throw new Error(`BufferView ${accessor.bufferView} not found`);
|
|
150
|
+
}
|
|
151
|
+
const componentSize = getComponentSize(accessor.componentType);
|
|
152
|
+
const componentCount = getComponentCount(accessor.type);
|
|
153
|
+
const elementSize = componentSize * componentCount;
|
|
154
|
+
const byteStride = bufferView.byteStride ?? elementSize;
|
|
155
|
+
const bufferOffset = (bufferView.byteOffset ?? 0) + (accessor.byteOffset ?? 0);
|
|
156
|
+
// If data is tightly packed, we can use a view directly
|
|
157
|
+
if (byteStride === elementSize) {
|
|
158
|
+
const byteLength = accessor.count * elementSize;
|
|
159
|
+
const slice = bin.slice(bufferOffset, bufferOffset + byteLength);
|
|
160
|
+
switch (accessor.componentType) {
|
|
161
|
+
case COMPONENT_FLOAT:
|
|
162
|
+
return new Float32Array(slice.buffer, slice.byteOffset, accessor.count * componentCount);
|
|
163
|
+
case COMPONENT_UNSIGNED_INT:
|
|
164
|
+
return new Uint32Array(slice.buffer, slice.byteOffset, accessor.count * componentCount);
|
|
165
|
+
case COMPONENT_UNSIGNED_SHORT:
|
|
166
|
+
return new Uint16Array(slice.buffer, slice.byteOffset, accessor.count * componentCount);
|
|
167
|
+
case COMPONENT_UNSIGNED_BYTE:
|
|
168
|
+
return slice;
|
|
169
|
+
default:
|
|
170
|
+
throw new Error(`Unsupported component type for reading: ${accessor.componentType}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Handle strided data
|
|
174
|
+
const result = accessor.componentType === COMPONENT_FLOAT
|
|
175
|
+
? new Float32Array(accessor.count * componentCount)
|
|
176
|
+
: accessor.componentType === COMPONENT_UNSIGNED_INT
|
|
177
|
+
? new Uint32Array(accessor.count * componentCount)
|
|
178
|
+
: accessor.componentType === COMPONENT_UNSIGNED_SHORT
|
|
179
|
+
? new Uint16Array(accessor.count * componentCount)
|
|
180
|
+
: new Uint8Array(accessor.count * componentCount);
|
|
181
|
+
const dataView = new DataView(bin.buffer, bin.byteOffset, bin.byteLength);
|
|
182
|
+
for (let i = 0; i < accessor.count; i++) {
|
|
183
|
+
const elementOffset = bufferOffset + i * byteStride;
|
|
184
|
+
for (let c = 0; c < componentCount; c++) {
|
|
185
|
+
const byteOffset = elementOffset + c * componentSize;
|
|
186
|
+
let value;
|
|
187
|
+
switch (accessor.componentType) {
|
|
188
|
+
case COMPONENT_FLOAT:
|
|
189
|
+
value = dataView.getFloat32(byteOffset, true);
|
|
190
|
+
break;
|
|
191
|
+
case COMPONENT_UNSIGNED_INT:
|
|
192
|
+
value = dataView.getUint32(byteOffset, true);
|
|
193
|
+
break;
|
|
194
|
+
case COMPONENT_UNSIGNED_SHORT:
|
|
195
|
+
value = dataView.getUint16(byteOffset, true);
|
|
196
|
+
break;
|
|
197
|
+
case COMPONENT_UNSIGNED_BYTE:
|
|
198
|
+
value = dataView.getUint8(byteOffset);
|
|
199
|
+
break;
|
|
200
|
+
default:
|
|
201
|
+
throw new Error(`Unsupported component type: ${accessor.componentType}`);
|
|
202
|
+
}
|
|
203
|
+
result[i * componentCount + c] = value;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Parse GLB geometry into MeshData format
|
|
210
|
+
*
|
|
211
|
+
* @param gltf - Parsed glTF document
|
|
212
|
+
* @param bin - Binary buffer from GLB
|
|
213
|
+
* @returns Array of MeshData objects
|
|
214
|
+
*/
|
|
215
|
+
export function parseGLBToMeshData(gltf, bin) {
|
|
216
|
+
const meshes = [];
|
|
217
|
+
const mapping = extractGLBMapping(gltf);
|
|
218
|
+
if (!gltf.nodes || !gltf.meshes) {
|
|
219
|
+
return meshes;
|
|
220
|
+
}
|
|
221
|
+
for (let nodeIdx = 0; nodeIdx < gltf.nodes.length; nodeIdx++) {
|
|
222
|
+
const node = gltf.nodes[nodeIdx];
|
|
223
|
+
if (node.mesh === undefined)
|
|
224
|
+
continue;
|
|
225
|
+
const mesh = gltf.meshes[node.mesh];
|
|
226
|
+
if (!mesh || !mesh.primitives.length)
|
|
227
|
+
continue;
|
|
228
|
+
const expressId = mapping.nodeToExpressId.get(nodeIdx) ?? nodeIdx;
|
|
229
|
+
// Process each primitive (typically one per mesh from our exporter)
|
|
230
|
+
for (const primitive of mesh.primitives) {
|
|
231
|
+
// Skip non-triangle primitives (mode 4 = TRIANGLES, undefined defaults to TRIANGULAR)
|
|
232
|
+
if (primitive.mode !== undefined && primitive.mode !== 4) {
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
const posAccessorIdx = primitive.attributes.POSITION;
|
|
236
|
+
const normAccessorIdx = primitive.attributes.NORMAL;
|
|
237
|
+
const idxAccessorIdx = primitive.indices;
|
|
238
|
+
if (posAccessorIdx === undefined)
|
|
239
|
+
continue;
|
|
240
|
+
// Read position data
|
|
241
|
+
const positions = readAccessorData(gltf, bin, posAccessorIdx);
|
|
242
|
+
if (!(positions instanceof Float32Array)) {
|
|
243
|
+
throw new Error('Position data must be Float32');
|
|
244
|
+
}
|
|
245
|
+
// Read normal data (optional, generate if missing)
|
|
246
|
+
let normals;
|
|
247
|
+
if (normAccessorIdx !== undefined) {
|
|
248
|
+
const normData = readAccessorData(gltf, bin, normAccessorIdx);
|
|
249
|
+
if (!(normData instanceof Float32Array)) {
|
|
250
|
+
throw new Error('Normal data must be Float32');
|
|
251
|
+
}
|
|
252
|
+
normals = normData;
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
// Generate flat normals if none provided
|
|
256
|
+
normals = new Float32Array(positions.length);
|
|
257
|
+
}
|
|
258
|
+
// Read index data (optional for non-indexed geometry)
|
|
259
|
+
let indices;
|
|
260
|
+
if (idxAccessorIdx !== undefined) {
|
|
261
|
+
const idxData = readAccessorData(gltf, bin, idxAccessorIdx);
|
|
262
|
+
if (idxData instanceof Float32Array) {
|
|
263
|
+
throw new Error('Index data cannot be Float32');
|
|
264
|
+
}
|
|
265
|
+
// Convert to Uint32Array if needed
|
|
266
|
+
indices =
|
|
267
|
+
idxData instanceof Uint32Array ? idxData : new Uint32Array(idxData);
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
// Non-indexed: generate sequential indices
|
|
271
|
+
indices = new Uint32Array(positions.length / 3);
|
|
272
|
+
for (let i = 0; i < indices.length; i++) {
|
|
273
|
+
indices[i] = i;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
meshes.push({
|
|
277
|
+
expressId,
|
|
278
|
+
positions,
|
|
279
|
+
normals,
|
|
280
|
+
indices,
|
|
281
|
+
color: [0.8, 0.8, 0.8, 1.0], // Default grey, can be overridden
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return meshes;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Convenience function to parse GLB directly to MeshData
|
|
289
|
+
*
|
|
290
|
+
* @param data - GLB file as Uint8Array
|
|
291
|
+
* @returns Array of MeshData objects
|
|
292
|
+
*/
|
|
293
|
+
export function loadGLBToMeshData(data) {
|
|
294
|
+
const { json, bin } = parseGLB(data);
|
|
295
|
+
if (!bin) {
|
|
296
|
+
throw new Error('GLB has no binary buffer');
|
|
297
|
+
}
|
|
298
|
+
return parseGLBToMeshData(json, bin);
|
|
299
|
+
}
|
|
300
|
+
//# 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":"AAAA;;+DAE+D;AAW/D,qBAAqB;AACrB,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,SAAS;AACvC,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,SAAS;AAC7C,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,UAAU;AAE7C,kBAAkB;AAClB,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,MAAM,uBAAuB,GAAG,IAAI,CAAC;AACrC,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,wBAAwB,GAAG,IAAI,CAAC;AACtC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AACpC,MAAM,eAAe,GAAG,IAAI,CAAC;AAuE7B;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAgB;IACvC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAEzE,6BAA6B;IAC7B,IAAI,IAAI,CAAC,UAAU,GAAG,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACtC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,iCAAiC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1G,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACxC,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5C,IAAI,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,uBAAuB,WAAW,wBAAwB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,eAAe;IACf,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,IAAI,GAAwB,IAAI,CAAC;IACrC,IAAI,GAAG,GAAsB,IAAI,CAAC;IAElC,OAAO,MAAM,GAAG,WAAW,EAAE,CAAC;QAC5B,IAAI,MAAM,GAAG,CAAC,GAAG,WAAW,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,IAAI,CAAC,CAAC;QAEZ,IAAI,MAAM,GAAG,WAAW,GAAG,WAAW,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACvD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAiB,CAAC;QAChD,CAAC;aAAM,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;YACxC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,IAAI,WAAW,CAAC;IACxB,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACvB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAkB;IAClD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAElD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC;IAC/D,CAAC;IAED,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;QAEzC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACxC,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAExC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC5B,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,aAAqB;IAC7C,QAAQ,aAAa,EAAE,CAAC;QACtB,KAAK,cAAc,CAAC;QACpB,KAAK,uBAAuB;YAC1B,OAAO,CAAC,CAAC;QACX,KAAK,eAAe,CAAC;QACrB,KAAK,wBAAwB;YAC3B,OAAO,CAAC,CAAC;QACX,KAAK,sBAAsB,CAAC;QAC5B,KAAK,eAAe;YAClB,OAAO,CAAC,CAAC;QACX;YACE,MAAM,IAAI,KAAK,CAAC,2BAA2B,aAAa,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAY;IACrC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;YACT,OAAO,EAAE,CAAC;QACZ;YACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,IAAkB,EAClB,GAAe,EACf,WAAmB;IAEnB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,YAAY,WAAW,YAAY,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC3D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,UAAU,YAAY,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,aAAa,GAAG,cAAc,CAAC;IACnD,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,WAAW,CAAC;IAExD,MAAM,YAAY,GAAG,CAAC,UAAU,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;IAE/E,wDAAwD;IACxD,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,GAAG,WAAW,CAAC;QAChD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,YAAY,GAAG,UAAU,CAAC,CAAC;QAEjE,QAAQ,QAAQ,CAAC,aAAa,EAAE,CAAC;YAC/B,KAAK,eAAe;gBAClB,OAAO,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,GAAG,cAAc,CAAC,CAAC;YAC3F,KAAK,sBAAsB;gBACzB,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,GAAG,cAAc,CAAC,CAAC;YAC1F,KAAK,wBAAwB;gBAC3B,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,GAAG,cAAc,CAAC,CAAC;YAC1F,KAAK,uBAAuB;gBAC1B,OAAO,KAAK,CAAC;YACf;gBACE,MAAM,IAAI,KAAK,CAAC,2CAA2C,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,MAAM,GACV,QAAQ,CAAC,aAAa,KAAK,eAAe;QACxC,CAAC,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,GAAG,cAAc,CAAC;QACnD,CAAC,CAAC,QAAQ,CAAC,aAAa,KAAK,sBAAsB;YACjD,CAAC,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,GAAG,cAAc,CAAC;YAClD,CAAC,CAAC,QAAQ,CAAC,aAAa,KAAK,wBAAwB;gBACnD,CAAC,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,GAAG,cAAc,CAAC;gBAClD,CAAC,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,GAAG,cAAc,CAAC,CAAC;IAE1D,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IAE1E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,aAAa,GAAG,YAAY,GAAG,CAAC,GAAG,UAAU,CAAC;QACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,UAAU,GAAG,aAAa,GAAG,CAAC,GAAG,aAAa,CAAC;YACrD,IAAI,KAAa,CAAC;YAElB,QAAQ,QAAQ,CAAC,aAAa,EAAE,CAAC;gBAC/B,KAAK,eAAe;oBAClB,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBAC9C,MAAM;gBACR,KAAK,sBAAsB;oBACzB,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBAC7C,MAAM;gBACR,KAAK,wBAAwB;oBAC3B,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBAC7C,MAAM;gBACR,KAAK,uBAAuB;oBAC1B,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;oBACtC,MAAM;gBACR;oBACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;YAC7E,CAAC;YAED,MAAM,CAAC,CAAC,GAAG,cAAc,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QACzC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAkB,EAAE,GAAe;IACpE,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAExC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,SAAS;QAEtC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM;YAAE,SAAS;QAE/C,MAAM,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;QAElE,oEAAoE;QACpE,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,sFAAsF;YACtF,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACzD,SAAS;YACX,CAAC;YAED,MAAM,cAAc,GAAG,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC;YACrD,MAAM,eAAe,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;YACpD,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC;YAEzC,IAAI,cAAc,KAAK,SAAS;gBAAE,SAAS;YAE3C,qBAAqB;YACrB,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;YAC9D,IAAI,CAAC,CAAC,SAAS,YAAY,YAAY,CAAC,EAAE,CAAC;gBACzC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YAED,mDAAmD;YACnD,IAAI,OAAqB,CAAC;YAC1B,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;gBAClC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC;gBAC9D,IAAI,CAAC,CAAC,QAAQ,YAAY,YAAY,CAAC,EAAE,CAAC;oBACxC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBACjD,CAAC;gBACD,OAAO,GAAG,QAAQ,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,yCAAyC;gBACzC,OAAO,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC/C,CAAC;YAED,sDAAsD;YACtD,IAAI,OAAoB,CAAC;YACzB,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;gBAC5D,IAAI,OAAO,YAAY,YAAY,EAAE,CAAC;oBACpC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;gBAClD,CAAC;gBACD,mCAAmC;gBACnC,OAAO;oBACL,OAAO,YAAY,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;YACxE,CAAC;iBAAM,CAAC;gBACN,2CAA2C;gBAC3C,OAAO,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACxC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;YAED,MAAM,CAAC,IAAI,CAAC;gBACV,SAAS;gBACT,SAAS;gBACT,OAAO;gBACP,OAAO;gBACP,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,kCAAkC;aAChE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAgB;IAChD,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -24,4 +24,6 @@ export { MAGIC, FORMAT_VERSION, HEADER_SIZE, SECTION_ENTRY_SIZE, SectionType, Sc
|
|
|
24
24
|
export type { CacheHeader, SectionEntry, CacheWriteOptions, CacheReadOptions, CacheHeaderInfo, CacheReadResult, IfcDataStore, } from './types.js';
|
|
25
25
|
export { xxhash64, xxhash64Hex } from './utils/hash.js';
|
|
26
26
|
export { BufferWriter, BufferReader } from './utils/buffer-utils.js';
|
|
27
|
+
export { parseGLB, extractGLBMapping, parseGLBToMeshData, loadGLBToMeshData, } from './glb.js';
|
|
28
|
+
export type { ParsedGLB, GLBMapping } from './glb.js';
|
|
27
29
|
//# 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;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EACL,KAAK,EACL,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,WAAW,EACX,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EACL,KAAK,EACL,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,WAAW,EACX,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGrE,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAElB,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -26,4 +26,6 @@ export { MAGIC, FORMAT_VERSION, HEADER_SIZE, SECTION_ENTRY_SIZE, SectionType, Sc
|
|
|
26
26
|
// Utilities
|
|
27
27
|
export { xxhash64, xxhash64Hex } from './utils/hash.js';
|
|
28
28
|
export { BufferWriter, BufferReader } from './utils/buffer-utils.js';
|
|
29
|
+
// GLB parser
|
|
30
|
+
export { parseGLB, extractGLBMapping, parseGLBToMeshData, loadGLBToMeshData, } from './glb.js';
|
|
29
31
|
//# 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;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EACL,KAAK,EACL,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,WAAW,EACX,YAAY,GACb,MAAM,YAAY,CAAC;AAYpB,YAAY;AACZ,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EACL,KAAK,EACL,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,WAAW,EACX,YAAY,GACb,MAAM,YAAY,CAAC;AAYpB,YAAY;AACZ,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAErE,aAAa;AACb,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,UAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../src/sections/entities.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEtE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI,CA2B/E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../src/sections/entities.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEtE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI,CA2B/E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,GAAG,WAAW,CAuGpF"}
|
|
@@ -79,6 +79,14 @@ export function readEntities(reader, strings) {
|
|
|
79
79
|
const indexOfId = (id) => {
|
|
80
80
|
return idToIndex.get(id) ?? -1;
|
|
81
81
|
};
|
|
82
|
+
// Build GlobalId → expressId map for BCF integration
|
|
83
|
+
const globalIdToExpressId = new Map();
|
|
84
|
+
for (let i = 0; i < count; i++) {
|
|
85
|
+
const gidString = strings.get(globalId[i]);
|
|
86
|
+
if (gidString) {
|
|
87
|
+
globalIdToExpressId.set(gidString, expressId[i]);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
82
90
|
return {
|
|
83
91
|
count,
|
|
84
92
|
expressId,
|
|
@@ -126,6 +134,12 @@ export function readEntities(reader, strings) {
|
|
|
126
134
|
}
|
|
127
135
|
return ids;
|
|
128
136
|
},
|
|
137
|
+
getExpressIdByGlobalId: (gid) => {
|
|
138
|
+
return globalIdToExpressId.get(gid) ?? -1;
|
|
139
|
+
},
|
|
140
|
+
getGlobalIdMap: () => {
|
|
141
|
+
return new Map(globalIdToExpressId); // Defensive copy
|
|
142
|
+
},
|
|
129
143
|
};
|
|
130
144
|
}
|
|
131
145
|
//# sourceMappingURL=entities.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entities.js","sourceRoot":"","sources":["../../src/sections/entities.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"entities.js","sourceRoot":"","sources":["../../src/sections/entities.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,9 +20,6 @@ import { BufferWriter, BufferReader } from '../utils/buffer-utils.js';
|
|
|
20
20
|
* - indices: Uint32Array[indexCount]
|
|
21
21
|
*/
|
|
22
22
|
export declare function writeGeometry(writer: BufferWriter, meshes: MeshData[], totalVertices: number, totalTriangles: number, coordinateInfo: CoordinateInfo): void;
|
|
23
|
-
/**
|
|
24
|
-
* Read geometry data from buffer
|
|
25
|
-
*/
|
|
26
23
|
export declare function readGeometry(reader: BufferReader, version?: number): {
|
|
27
24
|
meshes: MeshData[];
|
|
28
25
|
totalVertices: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/sections/geometry.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAc,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEtE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,QAAQ,EAAE,EAClB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,cAAc,GAC7B,IAAI,
|
|
1
|
+
{"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/sections/geometry.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAc,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEtE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,QAAQ,EAAE,EAClB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,cAAc,GAC7B,IAAI,CAkEN;AAiDD,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,MAAU,GAAG;IACvE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;CAChC,CA4DA"}
|
|
@@ -18,13 +18,37 @@
|
|
|
18
18
|
* - indices: Uint32Array[indexCount]
|
|
19
19
|
*/
|
|
20
20
|
export function writeGeometry(writer, meshes, totalVertices, totalTriangles, coordinateInfo) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
// First pass: validate and filter meshes, recalculate totals
|
|
22
|
+
const validMeshes = [];
|
|
23
|
+
let actualTotalVertices = 0;
|
|
24
|
+
let actualTotalTriangles = 0;
|
|
25
|
+
for (let i = 0; i < meshes.length; i++) {
|
|
26
|
+
const mesh = meshes[i];
|
|
27
|
+
const vertexCount = mesh.positions.length / 3;
|
|
28
|
+
const indexCount = mesh.indices.length;
|
|
29
|
+
// Sanity check: vertex/index counts should be reasonable
|
|
30
|
+
if (vertexCount > MAX_VERTEX_COUNT || indexCount > MAX_INDEX_COUNT) {
|
|
31
|
+
console.warn(`[writeGeometry] Skipping mesh ${i} (expressId=${mesh.expressId}): unreasonable counts`);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
// Verify array integrity (check for detached buffers or size mismatches)
|
|
35
|
+
// Note: Some WASM-generated meshes may have mismatched array sizes - skip them
|
|
36
|
+
if (mesh.normals.length !== mesh.positions.length) {
|
|
37
|
+
console.warn(`[writeGeometry] Skipping mesh ${i} (expressId=${mesh.expressId}): normals/positions size mismatch (${mesh.normals.length} vs ${mesh.positions.length})`);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
validMeshes.push(mesh);
|
|
41
|
+
actualTotalVertices += vertexCount;
|
|
42
|
+
actualTotalTriangles += indexCount / 3;
|
|
43
|
+
}
|
|
44
|
+
// Write header with actual counts
|
|
45
|
+
writer.writeUint32(validMeshes.length);
|
|
46
|
+
writer.writeUint32(actualTotalVertices);
|
|
47
|
+
writer.writeUint32(actualTotalTriangles);
|
|
24
48
|
// Write coordinate info
|
|
25
49
|
writeCoordinateInfo(writer, coordinateInfo);
|
|
26
|
-
// Write each mesh
|
|
27
|
-
for (const mesh of
|
|
50
|
+
// Write each valid mesh
|
|
51
|
+
for (const mesh of validMeshes) {
|
|
28
52
|
writer.writeUint32(mesh.expressId);
|
|
29
53
|
const vertexCount = mesh.positions.length / 3;
|
|
30
54
|
const indexCount = mesh.indices.length;
|
|
@@ -43,6 +67,9 @@ export function writeGeometry(writer, meshes, totalVertices, totalTriangles, coo
|
|
|
43
67
|
writer.writeTypedArray(mesh.normals);
|
|
44
68
|
writer.writeTypedArray(mesh.indices);
|
|
45
69
|
}
|
|
70
|
+
if (validMeshes.length < meshes.length) {
|
|
71
|
+
console.warn(`[writeGeometry] Wrote ${validMeshes.length}/${meshes.length} meshes (${meshes.length - validMeshes.length} skipped due to data issues)`);
|
|
72
|
+
}
|
|
46
73
|
}
|
|
47
74
|
function writeCoordinateInfo(writer, info) {
|
|
48
75
|
// Origin shift
|
|
@@ -51,8 +78,20 @@ function writeCoordinateInfo(writer, info) {
|
|
|
51
78
|
writeAABB(writer, info.originalBounds);
|
|
52
79
|
// Shifted bounds
|
|
53
80
|
writeAABB(writer, info.shiftedBounds);
|
|
54
|
-
//
|
|
55
|
-
writer.writeUint8(info.
|
|
81
|
+
// Has large coordinates flag (was misnamed isGeoReferenced)
|
|
82
|
+
writer.writeUint8(info.hasLargeCoordinates ? 1 : 0);
|
|
83
|
+
// Write wasmRtcOffset (optional)
|
|
84
|
+
const hasWasmRtc = info.wasmRtcOffset !== undefined;
|
|
85
|
+
writer.writeUint8(hasWasmRtc ? 1 : 0);
|
|
86
|
+
if (hasWasmRtc) {
|
|
87
|
+
writeVec3(writer, info.wasmRtcOffset);
|
|
88
|
+
}
|
|
89
|
+
// Write buildingRotation (optional)
|
|
90
|
+
const hasBuildingRotation = info.buildingRotation !== undefined;
|
|
91
|
+
writer.writeUint8(hasBuildingRotation ? 1 : 0);
|
|
92
|
+
if (hasBuildingRotation) {
|
|
93
|
+
writer.writeFloat64(info.buildingRotation);
|
|
94
|
+
}
|
|
56
95
|
}
|
|
57
96
|
function writeVec3(writer, v) {
|
|
58
97
|
writer.writeFloat64(v.x);
|
|
@@ -66,16 +105,31 @@ function writeAABB(writer, aabb) {
|
|
|
66
105
|
/**
|
|
67
106
|
* Read geometry data from buffer
|
|
68
107
|
*/
|
|
108
|
+
// Maximum reasonable values for sanity checking
|
|
109
|
+
const MAX_MESH_COUNT = 10_000_000; // 10M meshes max
|
|
110
|
+
const MAX_VERTEX_COUNT = 100_000_000; // 100M vertices max per mesh
|
|
111
|
+
const MAX_INDEX_COUNT = 300_000_000; // 300M indices max per mesh
|
|
69
112
|
export function readGeometry(reader, version = 2) {
|
|
70
113
|
const meshCount = reader.readUint32();
|
|
71
114
|
const totalVertices = reader.readUint32();
|
|
72
115
|
const totalTriangles = reader.readUint32();
|
|
73
|
-
|
|
116
|
+
// Sanity check mesh count
|
|
117
|
+
if (meshCount > MAX_MESH_COUNT) {
|
|
118
|
+
throw new Error(`Invalid cache: meshCount ${meshCount} exceeds maximum ${MAX_MESH_COUNT}. Cache may be corrupted or from incompatible version.`);
|
|
119
|
+
}
|
|
120
|
+
const coordinateInfo = readCoordinateInfo(reader, version);
|
|
74
121
|
const meshes = [];
|
|
75
122
|
for (let i = 0; i < meshCount; i++) {
|
|
76
123
|
const expressId = reader.readUint32();
|
|
77
124
|
const vertexCount = reader.readUint32();
|
|
78
125
|
const indexCount = reader.readUint32();
|
|
126
|
+
// Sanity check vertex/index counts
|
|
127
|
+
if (vertexCount > MAX_VERTEX_COUNT) {
|
|
128
|
+
throw new Error(`Invalid cache: vertexCount ${vertexCount} exceeds maximum ${MAX_VERTEX_COUNT} at mesh ${i}. Cache may be corrupted or from incompatible version.`);
|
|
129
|
+
}
|
|
130
|
+
if (indexCount > MAX_INDEX_COUNT) {
|
|
131
|
+
throw new Error(`Invalid cache: indexCount ${indexCount} exceeds maximum ${MAX_INDEX_COUNT} at mesh ${i}. Cache may be corrupted or from incompatible version.`);
|
|
132
|
+
}
|
|
79
133
|
const color = [
|
|
80
134
|
reader.readFloat32(),
|
|
81
135
|
reader.readFloat32(),
|
|
@@ -106,16 +160,29 @@ export function readGeometry(reader, version = 2) {
|
|
|
106
160
|
coordinateInfo,
|
|
107
161
|
};
|
|
108
162
|
}
|
|
109
|
-
function readCoordinateInfo(reader) {
|
|
163
|
+
function readCoordinateInfo(reader, version = 2) {
|
|
110
164
|
const originShift = readVec3(reader);
|
|
111
165
|
const originalBounds = readAABB(reader);
|
|
112
166
|
const shiftedBounds = readAABB(reader);
|
|
113
|
-
const
|
|
167
|
+
const hasLargeCoordinates = reader.readUint8() === 1;
|
|
168
|
+
// Version 3+: read optional fields
|
|
169
|
+
let wasmRtcOffset;
|
|
170
|
+
let buildingRotation;
|
|
171
|
+
if (version >= 3) {
|
|
172
|
+
if (reader.readUint8() === 1) {
|
|
173
|
+
wasmRtcOffset = readVec3(reader);
|
|
174
|
+
}
|
|
175
|
+
if (reader.readUint8() === 1) {
|
|
176
|
+
buildingRotation = reader.readFloat64();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
114
179
|
return {
|
|
115
180
|
originShift,
|
|
116
181
|
originalBounds,
|
|
117
182
|
shiftedBounds,
|
|
118
|
-
|
|
183
|
+
hasLargeCoordinates,
|
|
184
|
+
wasmRtcOffset,
|
|
185
|
+
buildingRotation,
|
|
119
186
|
};
|
|
120
187
|
}
|
|
121
188
|
function readVec3(reader) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../src/sections/geometry.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAS/D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAoB,EACpB,MAAkB,EAClB,aAAqB,EACrB,cAAsB,EACtB,cAA8B;IAE9B,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../src/sections/geometry.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import type { MeshData, CoordinateInfo } from '@ifc-lite/geometry';
|
|
|
6
6
|
/** Magic bytes: "IFCL" */
|
|
7
7
|
export declare const MAGIC = 1279477321;
|
|
8
8
|
/** Current format version */
|
|
9
|
-
export declare const FORMAT_VERSION =
|
|
9
|
+
export declare const FORMAT_VERSION = 3;
|
|
10
10
|
/** Section types in the binary format */
|
|
11
11
|
export declare enum SectionType {
|
|
12
12
|
Strings = 1,
|
package/dist/types.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
/** Magic bytes: "IFCL" */
|
|
5
5
|
export const MAGIC = 0x4C434649; // "IFCL" in little-endian
|
|
6
6
|
/** Current format version */
|
|
7
|
-
export const FORMAT_VERSION =
|
|
7
|
+
export const FORMAT_VERSION = 3;
|
|
8
8
|
/** Section types in the binary format */
|
|
9
9
|
export var SectionType;
|
|
10
10
|
(function (SectionType) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ifc-lite/cache",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "Binary cache format for IFC-Lite - fast model loading",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -12,11 +12,12 @@
|
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@ifc-lite/data": "^1.
|
|
16
|
-
"@ifc-lite/geometry": "^1.
|
|
15
|
+
"@ifc-lite/data": "^1.3.0",
|
|
16
|
+
"@ifc-lite/geometry": "^1.5.0"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
|
-
"typescript": "^5.3.0"
|
|
19
|
+
"typescript": "^5.3.0",
|
|
20
|
+
"vitest": "^1.6.0"
|
|
20
21
|
},
|
|
21
22
|
"license": "MPL-2.0",
|
|
22
23
|
"author": "Louis True",
|
|
@@ -44,6 +45,6 @@
|
|
|
44
45
|
"scripts": {
|
|
45
46
|
"build": "tsc",
|
|
46
47
|
"dev": "tsc --watch",
|
|
47
|
-
"test": "
|
|
48
|
+
"test": "vitest run"
|
|
48
49
|
}
|
|
49
50
|
}
|