@ifc-lite/cache 2.1.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/reader.d.ts +6 -1
- package/dist/reader.d.ts.map +1 -1
- package/dist/reader.js +17 -4
- package/dist/reader.js.map +1 -1
- package/dist/sections/geometry-chunks.d.ts +73 -0
- package/dist/sections/geometry-chunks.d.ts.map +1 -0
- package/dist/sections/geometry-chunks.js +246 -0
- package/dist/sections/geometry-chunks.js.map +1 -0
- package/dist/sections/geometry.d.ts +17 -23
- package/dist/sections/geometry.d.ts.map +1 -1
- package/dist/sections/geometry.js +97 -128
- package/dist/sections/geometry.js.map +1 -1
- package/dist/types.d.ts +49 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +30 -1
- package/dist/types.js.map +1 -1
- package/dist/writer.d.ts.map +1 -1
- package/dist/writer.js +5 -6
- package/dist/writer.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -91,7 +91,7 @@ This is backward compatible: entries written before the flag existed have it uns
|
|
|
91
91
|
|
|
92
92
|
## API
|
|
93
93
|
|
|
94
|
-
See the [API Reference](https://
|
|
94
|
+
See the [API Reference](https://ifclite.dev/docs/api/typescript/#ifc-litecache).
|
|
95
95
|
|
|
96
96
|
## License
|
|
97
97
|
|
package/dist/index.d.ts
CHANGED
|
@@ -20,7 +20,11 @@
|
|
|
20
20
|
export { BinaryCacheWriter } from './writer.js';
|
|
21
21
|
export type { GeometryData } from './writer.js';
|
|
22
22
|
export { BinaryCacheReader } from './reader.js';
|
|
23
|
-
export { MAGIC, FORMAT_VERSION, HEADER_SIZE, SECTION_ENTRY_SIZE, SectionType, SchemaVersion, HeaderFlags, SectionFlags, } from './types.js';
|
|
23
|
+
export { MAGIC, FORMAT_VERSION, HEADER_SIZE, SECTION_ENTRY_SIZE, SectionType, SchemaVersion, HeaderFlags, SectionFlags, GeometryChunkFlags, GEOMETRY_CHUNK_CELL_SIZE, GEOMETRY_CHUNK_SOFT_BYTES, GEOMETRY_CHUNK_COMPRESS_MIN_BYTES, } from './types.js';
|
|
24
|
+
export { openGeometryChunksV13, readGeometryHeadV13, decodeGeometryChunk, groupMeshesIntoChunks, buildGeometrySectionV13, } from './sections/geometry-chunks.js';
|
|
25
|
+
export { readInstancedShards } from './sections/instanced-shards.js';
|
|
26
|
+
export type { GeometryHead } from './sections/geometry-chunks.js';
|
|
27
|
+
export type { GeometryChunkInfo } from './types.js';
|
|
24
28
|
export type { CacheHeader, SectionEntry, CacheWriteOptions, CacheReadOptions, CacheHeaderInfo, CacheReadResult, CachedEntityIndexColumns, CacheEntityIndex, CacheEntityRef, CacheDataStore, } from './types.js';
|
|
25
29
|
export { xxhash64, xxhash64Hex } from './utils/hash.js';
|
|
26
30
|
export { BufferWriter, BufferReader } from './utils/buffer-utils.js';
|
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,
|
|
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,EACZ,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,iCAAiC,GAClC,MAAM,YAAY,CAAC;AAKpB,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,YAAY,EACV,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,wBAAwB,EACxB,gBAAgB,EAChB,cAAc,EACd,cAAc,GACf,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
|
@@ -22,7 +22,12 @@
|
|
|
22
22
|
*/
|
|
23
23
|
export { BinaryCacheWriter } from './writer.js';
|
|
24
24
|
export { BinaryCacheReader } from './reader.js';
|
|
25
|
-
export { MAGIC, FORMAT_VERSION, HEADER_SIZE, SECTION_ENTRY_SIZE, SectionType, SchemaVersion, HeaderFlags, SectionFlags, } from './types.js';
|
|
25
|
+
export { MAGIC, FORMAT_VERSION, HEADER_SIZE, SECTION_ENTRY_SIZE, SectionType, SchemaVersion, HeaderFlags, SectionFlags, GeometryChunkFlags, GEOMETRY_CHUNK_CELL_SIZE, GEOMETRY_CHUNK_SOFT_BYTES, GEOMETRY_CHUNK_COMPRESS_MIN_BYTES, } from './types.js';
|
|
26
|
+
// v13 chunked geometry: incremental access for streamed cache-hit loads
|
|
27
|
+
// (issue #1682 phase 4). openGeometryChunksV13 wants the Geometry section's
|
|
28
|
+
// absolute offset from the header's section table.
|
|
29
|
+
export { openGeometryChunksV13, readGeometryHeadV13, decodeGeometryChunk, groupMeshesIntoChunks, buildGeometrySectionV13, } from './sections/geometry-chunks.js';
|
|
30
|
+
export { readInstancedShards } from './sections/instanced-shards.js';
|
|
26
31
|
// Utilities
|
|
27
32
|
export { xxhash64, xxhash64Hex } from './utils/hash.js';
|
|
28
33
|
export { BufferWriter, BufferReader } from './utils/buffer-utils.js';
|
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,
|
|
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,EACZ,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,iCAAiC,GAClC,MAAM,YAAY,CAAC;AAEpB,wEAAwE;AACxE,4EAA4E;AAC5E,mDAAmD;AACnD,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAiBrE,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"}
|
package/dist/reader.d.ts
CHANGED
|
@@ -14,7 +14,12 @@ export declare class BinaryCacheReader {
|
|
|
14
14
|
*/
|
|
15
15
|
validate(cacheBuffer: ArrayBuffer, sourceBuffer: ArrayBuffer): boolean;
|
|
16
16
|
/**
|
|
17
|
-
* Read complete cache file
|
|
17
|
+
* Read complete cache file.
|
|
18
|
+
*
|
|
19
|
+
* Geometry requires format v13+ (the chunked section): pre-v13 geometry is
|
|
20
|
+
* no longer readable and read() THROWS for it — the writer stopped
|
|
21
|
+
* producing it and version-suffixed cache keys never hit old entries, so
|
|
22
|
+
* callers should treat the throw as "discard and rebuild the entry".
|
|
18
23
|
*/
|
|
19
24
|
read(buffer: ArrayBuffer, options?: CacheReadOptions): Promise<CacheReadResult>;
|
|
20
25
|
}
|
package/dist/reader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"AASA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAErB,MAAM,YAAY,CAAC;AAapB,qBAAa,iBAAiB;IAC5B;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe;IAKhD;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,GAAG,OAAO;IAWtE
|
|
1
|
+
{"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"AASA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAErB,MAAM,YAAY,CAAC;AAapB,qBAAa,iBAAiB;IAC5B;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe;IAKhD;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,GAAG,OAAO;IAWtE;;;;;;;OAOG;IACG,IAAI,CACR,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC;CA0G5B"}
|
package/dist/reader.js
CHANGED
|
@@ -10,7 +10,7 @@ import { readEntities } from './sections/entities.js';
|
|
|
10
10
|
import { readProperties } from './sections/properties.js';
|
|
11
11
|
import { readQuantities } from './sections/quantities.js';
|
|
12
12
|
import { readRelationships } from './sections/relationships.js';
|
|
13
|
-
import {
|
|
13
|
+
import { readGeometryV13 } from './sections/geometry-chunks.js';
|
|
14
14
|
import { readInstancedShards } from './sections/instanced-shards.js';
|
|
15
15
|
import { readEntityIndex } from './sections/entity-index.js';
|
|
16
16
|
export class BinaryCacheReader {
|
|
@@ -38,7 +38,12 @@ export class BinaryCacheReader {
|
|
|
38
38
|
return header.sourceHash === sourceHash;
|
|
39
39
|
}
|
|
40
40
|
/**
|
|
41
|
-
* Read complete cache file
|
|
41
|
+
* Read complete cache file.
|
|
42
|
+
*
|
|
43
|
+
* Geometry requires format v13+ (the chunked section): pre-v13 geometry is
|
|
44
|
+
* no longer readable and read() THROWS for it — the writer stopped
|
|
45
|
+
* producing it and version-suffixed cache keys never hit old entries, so
|
|
46
|
+
* callers should treat the throw as "discard and rebuild the entry".
|
|
42
47
|
*/
|
|
43
48
|
async read(buffer, options = {}) {
|
|
44
49
|
const { skipGeometry = false, sourceBuffer } = options;
|
|
@@ -110,8 +115,16 @@ export class BinaryCacheReader {
|
|
|
110
115
|
if (!skipGeometry && header.hasGeometry) {
|
|
111
116
|
const geometrySection = sectionMap.get(SectionType.Geometry);
|
|
112
117
|
if (geometrySection) {
|
|
113
|
-
|
|
114
|
-
|
|
118
|
+
if (header.version < 13) {
|
|
119
|
+
// Pre-v13 geometry cannot be produced anymore and the app's
|
|
120
|
+
// version-suffixed cache keys never hit old entries; the legacy
|
|
121
|
+
// sequential reader was removed. Fail loudly so callers discard
|
|
122
|
+
// the entry and rebuild it (the viewer's catch path does).
|
|
123
|
+
throw new Error(`Cache format v${header.version} geometry is no longer readable (v13+ only); discard and rebuild the entry.`);
|
|
124
|
+
}
|
|
125
|
+
// v13: chunked section — decode every chunk sequentially. Streamed
|
|
126
|
+
// consumers use openGeometryChunksV13 instead of this full read.
|
|
127
|
+
result.geometry = await readGeometryV13(buffer, geometrySection.offset, header.version);
|
|
115
128
|
}
|
|
116
129
|
// GPU-instancing shards (cache v10+): opaque repeated occurrences that were
|
|
117
130
|
// partitioned off the flat geometry section. Restored via the instanced path.
|
package/dist/reader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAO/D,OAAO,EACL,WAAW,GAKZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v13 chunked geometry section (issue #1682, phase 4).
|
|
3
|
+
*
|
|
4
|
+
* Layout (all offsets little-endian, relative to the geometry SECTION start):
|
|
5
|
+
* headLength: u32 // byte length of everything below
|
|
6
|
+
* // up to (not incl.) the first chunk
|
|
7
|
+
* meshCount: u32
|
|
8
|
+
* totalVertices: u32
|
|
9
|
+
* totalTriangles: u32
|
|
10
|
+
* coordinateInfo // unchanged, variable length
|
|
11
|
+
* chunkCount: u32
|
|
12
|
+
* directory: chunkCount × 44 bytes {
|
|
13
|
+
* aabbMin f32×3, aabbMax f32×3, // world AABB of the chunk
|
|
14
|
+
* byteOffset u32, // chunk record, rel. section start
|
|
15
|
+
* byteLength u32, // STORED length (compressed if so)
|
|
16
|
+
* uncompressedLength u32,
|
|
17
|
+
* meshCount u32,
|
|
18
|
+
* flags u32 // GeometryChunkFlags
|
|
19
|
+
* }
|
|
20
|
+
* ...chunk records at their byteOffsets
|
|
21
|
+
*
|
|
22
|
+
* A chunk record is a plain concatenation of per-mesh records (identical
|
|
23
|
+
* layout to v12 — see geometry.ts writeMeshRecord), optionally deflate-raw
|
|
24
|
+
* compressed. Chunks are spatially coherent (grid cell of origin + first
|
|
25
|
+
* vertex, soft byte cap; a mesh never splits), so a streamed reader paints
|
|
26
|
+
* coherent regions and a future evict-to-disk residency layer can re-read
|
|
27
|
+
* one chunk without touching the rest.
|
|
28
|
+
*/
|
|
29
|
+
import type { MeshData, CoordinateInfo } from '@ifc-lite/geometry';
|
|
30
|
+
import { BufferReader } from '../utils/buffer-utils.js';
|
|
31
|
+
import { type GeometryChunkInfo } from '../types.js';
|
|
32
|
+
/** Parsed head of a v13 geometry section. */
|
|
33
|
+
export interface GeometryHead {
|
|
34
|
+
meshCount: number;
|
|
35
|
+
totalVertices: number;
|
|
36
|
+
totalTriangles: number;
|
|
37
|
+
coordinateInfo: CoordinateInfo;
|
|
38
|
+
chunks: GeometryChunkInfo[];
|
|
39
|
+
}
|
|
40
|
+
export declare const deflateRaw: (data: Uint8Array) => Promise<Uint8Array>;
|
|
41
|
+
export declare const inflateRaw: (data: Uint8Array) => Promise<Uint8Array>;
|
|
42
|
+
/** Group meshes into spatially coherent, byte-capped chunks (order-stable). */
|
|
43
|
+
export declare function groupMeshesIntoChunks(meshes: MeshData[], softBytes?: number): MeshData[][];
|
|
44
|
+
/**
|
|
45
|
+
* Build the complete v13 geometry section buffer. Async because per-chunk
|
|
46
|
+
* compression uses the (browser/Node-native) CompressionStream.
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildGeometrySectionV13(meshes: MeshData[], coordinateInfo: CoordinateInfo, options?: {
|
|
49
|
+
compress?: boolean;
|
|
50
|
+
}): Promise<ArrayBuffer>;
|
|
51
|
+
/** Parse the v13 geometry head; `reader` must be positioned at the geometry
|
|
52
|
+
* section start. Cheap: never touches chunk records. */
|
|
53
|
+
export declare function readGeometryHeadV13(reader: BufferReader): GeometryHead;
|
|
54
|
+
/** Decode one chunk record's stored bytes into meshes. */
|
|
55
|
+
export declare function decodeGeometryChunk(stored: Uint8Array, info: GeometryChunkInfo, version: number): Promise<MeshData[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Incremental access to a v13 geometry section inside a fully loaded cache
|
|
58
|
+
* buffer. `sectionOffset` is the Geometry section's absolute offset (from
|
|
59
|
+
* the section table). A future evict-to-disk layer swaps the buffer for a
|
|
60
|
+
* Blob and turns the subarray into a slice() read — the head/chunk contract
|
|
61
|
+
* is already shaped for that.
|
|
62
|
+
*/
|
|
63
|
+
export declare function openGeometryChunksV13(buffer: ArrayBuffer, sectionOffset: number, version: number): GeometryHead & {
|
|
64
|
+
readChunk(index: number): Promise<MeshData[]>;
|
|
65
|
+
};
|
|
66
|
+
/** Full sequential decode of a v13 geometry section (the legacy-shaped result). */
|
|
67
|
+
export declare function readGeometryV13(buffer: ArrayBuffer, sectionOffset: number, version: number): Promise<{
|
|
68
|
+
meshes: MeshData[];
|
|
69
|
+
totalVertices: number;
|
|
70
|
+
totalTriangles: number;
|
|
71
|
+
coordinateInfo: CoordinateInfo;
|
|
72
|
+
}>;
|
|
73
|
+
//# sourceMappingURL=geometry-chunks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry-chunks.d.ts","sourceRoot":"","sources":["../../src/sections/geometry-chunks.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAgB,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AAarB,6CAA6C;AAC7C,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAYD,eAAO,MAAM,UAAU,GAAI,MAAM,UAAU,KAAG,OAAO,CAAC,UAAU,CACP,CAAC;AAE1D,eAAO,MAAM,UAAU,GAAI,MAAM,UAAU,KAAG,OAAO,CAAC,UAAU,CACL,CAAC;AAwB5D,+EAA+E;AAC/E,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,QAAQ,EAAE,EAClB,SAAS,GAAE,MAAkC,GAC5C,QAAQ,EAAE,EAAE,CAsBd;AAqBD;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,QAAQ,EAAE,EAClB,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GACnC,OAAO,CAAC,WAAW,CAAC,CAgFtB;AAID;yDACyD;AACzD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAqBtE;AAED,0DAA0D;AAC1D,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,QAAQ,EAAE,CAAC,CAerB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,YAAY,GAAG;IAAE,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;CAAE,CAclE;AAED,mFAAmF;AACnF,wBAAsB,eAAe,CACnC,MAAM,EAAE,WAAW,EACnB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,cAAc,CAAA;CAAE,CAAC,CAYhH"}
|
|
@@ -0,0 +1,246 @@
|
|
|
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
|
+
import { BufferWriter, BufferReader } from '../utils/buffer-utils.js';
|
|
5
|
+
import { GEOMETRY_CHUNK_CELL_SIZE, GEOMETRY_CHUNK_SOFT_BYTES, GEOMETRY_CHUNK_COMPRESS_MIN_BYTES, GeometryChunkFlags, } from '../types.js';
|
|
6
|
+
import { validateMeshes, writeMeshRecord, readMeshRecord, meshRecordByteLength, writeCoordinateInfo, readCoordinateInfo, } from './geometry.js';
|
|
7
|
+
// 6×f32 AABB (24) + 5×u32 (offset, length, uncompressed, meshCount, flags).
|
|
8
|
+
const DIRECTORY_ENTRY_BYTES = 44;
|
|
9
|
+
// ─── codec ────────────────────────────────────────────────────────────────
|
|
10
|
+
async function pipeThrough(data, stream) {
|
|
11
|
+
// Copy into a fresh standalone buffer: `data` may be a subarray view, and
|
|
12
|
+
// Response/Blob would otherwise serialize the WHOLE backing buffer.
|
|
13
|
+
const standalone = new Uint8Array(data);
|
|
14
|
+
const out = await new Response(new Blob([standalone]).stream().pipeThrough(stream)).arrayBuffer();
|
|
15
|
+
return new Uint8Array(out);
|
|
16
|
+
}
|
|
17
|
+
export const deflateRaw = (data) => pipeThrough(data, new CompressionStream('deflate-raw'));
|
|
18
|
+
export const inflateRaw = (data) => pipeThrough(data, new DecompressionStream('deflate-raw'));
|
|
19
|
+
// ─── write ────────────────────────────────────────────────────────────────
|
|
20
|
+
/** Grid cell of a mesh's world anchor (origin + first vertex) — a spatial
|
|
21
|
+
* grouping heuristic only; readers trust the directory, never this. */
|
|
22
|
+
function cellKeyOf(mesh) {
|
|
23
|
+
const o = mesh.origin;
|
|
24
|
+
const hasVertex = mesh.positions.length >= 3;
|
|
25
|
+
const x = (o ? o[0] : 0) + (hasVertex ? mesh.positions[0] : 0);
|
|
26
|
+
const y = (o ? o[1] : 0) + (hasVertex ? mesh.positions[1] : 0);
|
|
27
|
+
const z = (o ? o[2] : 0) + (hasVertex ? mesh.positions[2] : 0);
|
|
28
|
+
const cx = Math.floor(x / GEOMETRY_CHUNK_CELL_SIZE);
|
|
29
|
+
const cy = Math.floor(y / GEOMETRY_CHUNK_CELL_SIZE);
|
|
30
|
+
const cz = Math.floor(z / GEOMETRY_CHUNK_CELL_SIZE);
|
|
31
|
+
if (!Number.isFinite(cx) || !Number.isFinite(cy) || !Number.isFinite(cz))
|
|
32
|
+
return 'nan';
|
|
33
|
+
return `${cx},${cy},${cz}`;
|
|
34
|
+
}
|
|
35
|
+
/** Group meshes into spatially coherent, byte-capped chunks (order-stable). */
|
|
36
|
+
export function groupMeshesIntoChunks(meshes, softBytes = GEOMETRY_CHUNK_SOFT_BYTES) {
|
|
37
|
+
const open = new Map();
|
|
38
|
+
const closed = [];
|
|
39
|
+
for (const mesh of meshes) {
|
|
40
|
+
const key = cellKeyOf(mesh);
|
|
41
|
+
let chunk = open.get(key);
|
|
42
|
+
const bytes = meshRecordByteLength(mesh);
|
|
43
|
+
if (chunk && chunk.bytes > 0 && chunk.bytes + bytes > softBytes) {
|
|
44
|
+
closed.push(chunk.meshes);
|
|
45
|
+
chunk = undefined;
|
|
46
|
+
}
|
|
47
|
+
if (!chunk) {
|
|
48
|
+
chunk = { meshes: [], bytes: 0 };
|
|
49
|
+
open.set(key, chunk);
|
|
50
|
+
}
|
|
51
|
+
chunk.meshes.push(mesh);
|
|
52
|
+
chunk.bytes += bytes;
|
|
53
|
+
}
|
|
54
|
+
for (const chunk of open.values()) {
|
|
55
|
+
if (chunk.meshes.length > 0)
|
|
56
|
+
closed.push(chunk.meshes);
|
|
57
|
+
}
|
|
58
|
+
return closed;
|
|
59
|
+
}
|
|
60
|
+
function chunkAabb(meshes) {
|
|
61
|
+
let minX = Infinity, minY = Infinity, minZ = Infinity;
|
|
62
|
+
let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
63
|
+
for (const mesh of meshes) {
|
|
64
|
+
const ox = mesh.origin ? mesh.origin[0] : 0;
|
|
65
|
+
const oy = mesh.origin ? mesh.origin[1] : 0;
|
|
66
|
+
const oz = mesh.origin ? mesh.origin[2] : 0;
|
|
67
|
+
const pos = mesh.positions;
|
|
68
|
+
for (let i = 0; i < pos.length; i += 3) {
|
|
69
|
+
const x = ox + pos[i], y = oy + pos[i + 1], z = oz + pos[i + 2];
|
|
70
|
+
if (x < minX)
|
|
71
|
+
minX = x;
|
|
72
|
+
if (x > maxX)
|
|
73
|
+
maxX = x;
|
|
74
|
+
if (y < minY)
|
|
75
|
+
minY = y;
|
|
76
|
+
if (y > maxY)
|
|
77
|
+
maxY = y;
|
|
78
|
+
if (z < minZ)
|
|
79
|
+
minZ = z;
|
|
80
|
+
if (z > maxZ)
|
|
81
|
+
maxZ = z;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (minX === Infinity) {
|
|
85
|
+
minX = minY = minZ = 0;
|
|
86
|
+
maxX = maxY = maxZ = 0;
|
|
87
|
+
}
|
|
88
|
+
return { min: [minX, minY, minZ], max: [maxX, maxY, maxZ] };
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Build the complete v13 geometry section buffer. Async because per-chunk
|
|
92
|
+
* compression uses the (browser/Node-native) CompressionStream.
|
|
93
|
+
*/
|
|
94
|
+
export async function buildGeometrySectionV13(meshes, coordinateInfo, options = {}) {
|
|
95
|
+
const compress = options.compress ?? true;
|
|
96
|
+
const { validMeshes, actualTotalVertices, actualTotalTriangles } = validateMeshes(meshes);
|
|
97
|
+
const groups = groupMeshesIntoChunks(validMeshes);
|
|
98
|
+
// Serialize (and optionally compress) every chunk record. Concurrency is
|
|
99
|
+
// BOUNDED: a large model produces hundreds of chunks, and an unbounded
|
|
100
|
+
// Promise.all would hold every raw + compressed buffer plus a
|
|
101
|
+
// CompressionStream alive simultaneously — a needless memory spike during
|
|
102
|
+
// the (background) cache write.
|
|
103
|
+
const CHUNK_BUILD_CONCURRENCY = 4;
|
|
104
|
+
const buildRecord = async (group) => {
|
|
105
|
+
const w = new BufferWriter(64 * 1024);
|
|
106
|
+
for (const mesh of group)
|
|
107
|
+
writeMeshRecord(w, mesh);
|
|
108
|
+
const raw = new Uint8Array(w.build());
|
|
109
|
+
let bytes = raw;
|
|
110
|
+
let flags = GeometryChunkFlags.None;
|
|
111
|
+
if (compress && raw.byteLength >= GEOMETRY_CHUNK_COMPRESS_MIN_BYTES) {
|
|
112
|
+
const deflated = await deflateRaw(raw);
|
|
113
|
+
// Keep the raw record when compression doesn't pay (already-dense data).
|
|
114
|
+
if (deflated.byteLength < raw.byteLength) {
|
|
115
|
+
bytes = deflated;
|
|
116
|
+
flags = GeometryChunkFlags.DeflateRaw;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
bytes,
|
|
121
|
+
uncompressedLength: raw.byteLength,
|
|
122
|
+
meshCount: group.length,
|
|
123
|
+
flags,
|
|
124
|
+
aabb: chunkAabb(group),
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
const records = new Array(groups.length);
|
|
128
|
+
for (let i = 0; i < groups.length; i += CHUNK_BUILD_CONCURRENCY) {
|
|
129
|
+
const slice = groups.slice(i, i + CHUNK_BUILD_CONCURRENCY);
|
|
130
|
+
const built = await Promise.all(slice.map(buildRecord));
|
|
131
|
+
for (let j = 0; j < built.length; j++)
|
|
132
|
+
records[i + j] = built[j];
|
|
133
|
+
}
|
|
134
|
+
// Head: counts + coordinateInfo + directory. Directory offsets need the
|
|
135
|
+
// head length, which needs the coordinateInfo length — write the variable
|
|
136
|
+
// part once to measure it.
|
|
137
|
+
const headBody = new BufferWriter(16 * 1024);
|
|
138
|
+
headBody.writeUint32(validMeshes.length);
|
|
139
|
+
headBody.writeUint32(actualTotalVertices);
|
|
140
|
+
headBody.writeUint32(actualTotalTriangles);
|
|
141
|
+
writeCoordinateInfo(headBody, coordinateInfo);
|
|
142
|
+
headBody.writeUint32(records.length);
|
|
143
|
+
const headLength = headBody.position + records.length * DIRECTORY_ENTRY_BYTES;
|
|
144
|
+
let offset = 4 + headLength; // headLength field itself + head
|
|
145
|
+
const finalWriter = new BufferWriter(offset + records.reduce((s, r) => s + r.bytes.byteLength, 0));
|
|
146
|
+
finalWriter.writeUint32(headLength);
|
|
147
|
+
finalWriter.writeBytes(new Uint8Array(headBody.build()));
|
|
148
|
+
for (const r of records) {
|
|
149
|
+
finalWriter.writeFloat32(r.aabb.min[0]);
|
|
150
|
+
finalWriter.writeFloat32(r.aabb.min[1]);
|
|
151
|
+
finalWriter.writeFloat32(r.aabb.min[2]);
|
|
152
|
+
finalWriter.writeFloat32(r.aabb.max[0]);
|
|
153
|
+
finalWriter.writeFloat32(r.aabb.max[1]);
|
|
154
|
+
finalWriter.writeFloat32(r.aabb.max[2]);
|
|
155
|
+
finalWriter.writeUint32(offset);
|
|
156
|
+
finalWriter.writeUint32(r.bytes.byteLength);
|
|
157
|
+
finalWriter.writeUint32(r.uncompressedLength);
|
|
158
|
+
finalWriter.writeUint32(r.meshCount);
|
|
159
|
+
finalWriter.writeUint32(r.flags);
|
|
160
|
+
offset += r.bytes.byteLength;
|
|
161
|
+
}
|
|
162
|
+
for (const r of records) {
|
|
163
|
+
finalWriter.writeBytes(r.bytes);
|
|
164
|
+
}
|
|
165
|
+
return finalWriter.build();
|
|
166
|
+
}
|
|
167
|
+
// ─── read ─────────────────────────────────────────────────────────────────
|
|
168
|
+
/** Parse the v13 geometry head; `reader` must be positioned at the geometry
|
|
169
|
+
* section start. Cheap: never touches chunk records. */
|
|
170
|
+
export function readGeometryHeadV13(reader) {
|
|
171
|
+
const headLength = reader.readUint32();
|
|
172
|
+
void headLength; // total head size — used by range readers to bound the head fetch
|
|
173
|
+
const meshCount = reader.readUint32();
|
|
174
|
+
const totalVertices = reader.readUint32();
|
|
175
|
+
const totalTriangles = reader.readUint32();
|
|
176
|
+
const coordinateInfo = readCoordinateInfo(reader, 13);
|
|
177
|
+
const chunkCount = reader.readUint32();
|
|
178
|
+
const chunks = [];
|
|
179
|
+
for (let i = 0; i < chunkCount; i++) {
|
|
180
|
+
chunks.push({
|
|
181
|
+
aabbMin: [reader.readFloat32(), reader.readFloat32(), reader.readFloat32()],
|
|
182
|
+
aabbMax: [reader.readFloat32(), reader.readFloat32(), reader.readFloat32()],
|
|
183
|
+
byteOffset: reader.readUint32(),
|
|
184
|
+
byteLength: reader.readUint32(),
|
|
185
|
+
uncompressedLength: reader.readUint32(),
|
|
186
|
+
meshCount: reader.readUint32(),
|
|
187
|
+
flags: reader.readUint32(),
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
return { meshCount, totalVertices, totalTriangles, coordinateInfo, chunks };
|
|
191
|
+
}
|
|
192
|
+
/** Decode one chunk record's stored bytes into meshes. */
|
|
193
|
+
export async function decodeGeometryChunk(stored, info, version) {
|
|
194
|
+
const raw = (info.flags & GeometryChunkFlags.DeflateRaw) ? await inflateRaw(stored) : stored;
|
|
195
|
+
if (raw.byteLength !== info.uncompressedLength) {
|
|
196
|
+
throw new Error(`Invalid cache: chunk decoded to ${raw.byteLength} bytes, directory says ${info.uncompressedLength}`);
|
|
197
|
+
}
|
|
198
|
+
// BufferReader wants an exact ArrayBuffer; raw may be a view.
|
|
199
|
+
const buffer = raw.byteOffset === 0 && raw.byteLength === raw.buffer.byteLength
|
|
200
|
+
? raw.buffer
|
|
201
|
+
: raw.slice().buffer;
|
|
202
|
+
const reader = new BufferReader(buffer);
|
|
203
|
+
const meshes = [];
|
|
204
|
+
for (let i = 0; i < info.meshCount; i++) {
|
|
205
|
+
meshes.push(readMeshRecord(reader, version, i));
|
|
206
|
+
}
|
|
207
|
+
return meshes;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Incremental access to a v13 geometry section inside a fully loaded cache
|
|
211
|
+
* buffer. `sectionOffset` is the Geometry section's absolute offset (from
|
|
212
|
+
* the section table). A future evict-to-disk layer swaps the buffer for a
|
|
213
|
+
* Blob and turns the subarray into a slice() read — the head/chunk contract
|
|
214
|
+
* is already shaped for that.
|
|
215
|
+
*/
|
|
216
|
+
export function openGeometryChunksV13(buffer, sectionOffset, version) {
|
|
217
|
+
const reader = new BufferReader(buffer);
|
|
218
|
+
reader.position = sectionOffset;
|
|
219
|
+
const head = readGeometryHeadV13(reader);
|
|
220
|
+
const bytes = new Uint8Array(buffer);
|
|
221
|
+
return {
|
|
222
|
+
...head,
|
|
223
|
+
readChunk(index) {
|
|
224
|
+
const info = head.chunks[index];
|
|
225
|
+
if (!info)
|
|
226
|
+
return Promise.reject(new Error(`chunk index ${index} out of range (${head.chunks.length})`));
|
|
227
|
+
const start = sectionOffset + info.byteOffset;
|
|
228
|
+
return decodeGeometryChunk(bytes.subarray(start, start + info.byteLength), info, version);
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
/** Full sequential decode of a v13 geometry section (the legacy-shaped result). */
|
|
233
|
+
export async function readGeometryV13(buffer, sectionOffset, version) {
|
|
234
|
+
const open = openGeometryChunksV13(buffer, sectionOffset, version);
|
|
235
|
+
const meshes = [];
|
|
236
|
+
for (let i = 0; i < open.chunks.length; i++) {
|
|
237
|
+
meshes.push(...await open.readChunk(i));
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
meshes,
|
|
241
|
+
totalVertices: open.totalVertices,
|
|
242
|
+
totalTriangles: open.totalTriangles,
|
|
243
|
+
coordinateInfo: open.coordinateInfo,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=geometry-chunks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry-chunks.js","sourceRoot":"","sources":["../../src/sections/geometry-chunks.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,29 +4,23 @@
|
|
|
4
4
|
import type { MeshData, CoordinateInfo } from '@ifc-lite/geometry';
|
|
5
5
|
import { BufferWriter, BufferReader } from '../utils/buffer-utils.js';
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* - meshCount: uint32
|
|
10
|
-
* - totalVertices: uint32
|
|
11
|
-
* - totalTriangles: uint32
|
|
12
|
-
* - coordinateInfo (see below)
|
|
13
|
-
* - per mesh:
|
|
14
|
-
* - expressId: uint32
|
|
15
|
-
* - vertexCount: uint32
|
|
16
|
-
* - indexCount: uint32
|
|
17
|
-
* - color: float32[4]
|
|
18
|
-
* - ifcType: string (version >= 2)
|
|
19
|
-
* - geometryClass: uint8 (version >= 5) — 0 occurrence, 1 orphan
|
|
20
|
-
* type, 2 instanced type (Model/Types switch)
|
|
21
|
-
* - positions: Float32Array[vertexCount * 3]
|
|
22
|
-
* - normals: Float32Array[vertexCount * 3]
|
|
23
|
-
* - indices: Uint32Array[indexCount]
|
|
7
|
+
* Validate + filter meshes (detached buffers / size mismatches / absurd
|
|
8
|
+
* counts) and recompute the real totals. Used by the v13 chunked writer.
|
|
24
9
|
*/
|
|
25
|
-
export declare function
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
totalTriangles: number;
|
|
30
|
-
coordinateInfo: CoordinateInfo;
|
|
10
|
+
export declare function validateMeshes(meshes: MeshData[]): {
|
|
11
|
+
validMeshes: MeshData[];
|
|
12
|
+
actualTotalVertices: number;
|
|
13
|
+
actualTotalTriangles: number;
|
|
31
14
|
};
|
|
15
|
+
/**
|
|
16
|
+
* One per-mesh record inside a v13 chunk (layout unchanged since the
|
|
17
|
+
* pre-v13 sequential format — v13 only changed how records are GROUPED).
|
|
18
|
+
*/
|
|
19
|
+
export declare function writeMeshRecord(writer: BufferWriter, mesh: MeshData): void;
|
|
20
|
+
/** Exact serialized size of one per-mesh record, for chunk byte budgeting. */
|
|
21
|
+
export declare function meshRecordByteLength(mesh: MeshData): number;
|
|
22
|
+
export declare function writeCoordinateInfo(writer: BufferWriter, info: CoordinateInfo): void;
|
|
23
|
+
/** Read one per-mesh record (see writeMeshRecord for the layout). */
|
|
24
|
+
export declare function readMeshRecord(reader: BufferReader, version: number, meshIndex?: number): MeshData;
|
|
25
|
+
export declare function readCoordinateInfo(reader: BufferReader, version?: number): CoordinateInfo;
|
|
32
26
|
//# sourceMappingURL=geometry.d.ts.map
|
|
@@ -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
|
|
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;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG;IAClD,WAAW,EAAE,QAAQ,EAAE,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;CAC9B,CA6BA;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAoC1E;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAU3D;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI,CA0BpF;AAiBD,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,GAAG,QAAQ,CAsDrG;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,MAAU,GAAG,cAAc,CA2B5F"}
|
|
@@ -2,26 +2,10 @@
|
|
|
2
2
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* - meshCount: uint32
|
|
8
|
-
* - totalVertices: uint32
|
|
9
|
-
* - totalTriangles: uint32
|
|
10
|
-
* - coordinateInfo (see below)
|
|
11
|
-
* - per mesh:
|
|
12
|
-
* - expressId: uint32
|
|
13
|
-
* - vertexCount: uint32
|
|
14
|
-
* - indexCount: uint32
|
|
15
|
-
* - color: float32[4]
|
|
16
|
-
* - ifcType: string (version >= 2)
|
|
17
|
-
* - geometryClass: uint8 (version >= 5) — 0 occurrence, 1 orphan
|
|
18
|
-
* type, 2 instanced type (Model/Types switch)
|
|
19
|
-
* - positions: Float32Array[vertexCount * 3]
|
|
20
|
-
* - normals: Float32Array[vertexCount * 3]
|
|
21
|
-
* - indices: Uint32Array[indexCount]
|
|
5
|
+
* Validate + filter meshes (detached buffers / size mismatches / absurd
|
|
6
|
+
* counts) and recompute the real totals. Used by the v13 chunked writer.
|
|
22
7
|
*/
|
|
23
|
-
export function
|
|
24
|
-
// First pass: validate and filter meshes, recalculate totals
|
|
8
|
+
export function validateMeshes(meshes) {
|
|
25
9
|
const validMeshes = [];
|
|
26
10
|
let actualTotalVertices = 0;
|
|
27
11
|
let actualTotalTriangles = 0;
|
|
@@ -31,61 +15,66 @@ export function writeGeometry(writer, meshes, totalVertices, totalTriangles, coo
|
|
|
31
15
|
const indexCount = mesh.indices.length;
|
|
32
16
|
// Sanity check: vertex/index counts should be reasonable
|
|
33
17
|
if (vertexCount > MAX_VERTEX_COUNT || indexCount > MAX_INDEX_COUNT) {
|
|
34
|
-
console.warn(`[
|
|
18
|
+
console.warn(`[cache:geometry] Skipping mesh ${i} (expressId=${mesh.expressId}): unreasonable counts`);
|
|
35
19
|
continue;
|
|
36
20
|
}
|
|
37
21
|
// Verify array integrity (check for detached buffers or size mismatches)
|
|
38
22
|
// Note: Some WASM-generated meshes may have mismatched array sizes - skip them
|
|
39
23
|
if (mesh.normals.length !== mesh.positions.length) {
|
|
40
|
-
console.warn(`[
|
|
24
|
+
console.warn(`[cache:geometry] Skipping mesh ${i} (expressId=${mesh.expressId}): normals/positions size mismatch (${mesh.normals.length} vs ${mesh.positions.length})`);
|
|
41
25
|
continue;
|
|
42
26
|
}
|
|
43
27
|
validMeshes.push(mesh);
|
|
44
28
|
actualTotalVertices += vertexCount;
|
|
45
29
|
actualTotalTriangles += indexCount / 3;
|
|
46
30
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
31
|
+
return { validMeshes, actualTotalVertices, actualTotalTriangles };
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* One per-mesh record inside a v13 chunk (layout unchanged since the
|
|
35
|
+
* pre-v13 sequential format — v13 only changed how records are GROUPED).
|
|
36
|
+
*/
|
|
37
|
+
export function writeMeshRecord(writer, mesh) {
|
|
38
|
+
writer.writeUint32(mesh.expressId);
|
|
39
|
+
const vertexCount = mesh.positions.length / 3;
|
|
40
|
+
const indexCount = mesh.indices.length;
|
|
41
|
+
writer.writeUint32(vertexCount);
|
|
42
|
+
writer.writeUint32(indexCount);
|
|
43
|
+
// Write color (RGBA)
|
|
44
|
+
writer.writeFloat32(mesh.color[0]);
|
|
45
|
+
writer.writeFloat32(mesh.color[1]);
|
|
46
|
+
writer.writeFloat32(mesh.color[2]);
|
|
47
|
+
writer.writeFloat32(mesh.color[3]);
|
|
48
|
+
// Write ifcType (as string length + UTF-8 bytes)
|
|
49
|
+
const ifcType = mesh.ifcType || '';
|
|
50
|
+
writer.writeString(ifcType);
|
|
51
|
+
// Write geometryClass (#957 Model/Types switch). Without this the viewer's
|
|
52
|
+
// view-mode filter sees every cache-restored mesh as class 0: instanced
|
|
53
|
+
// type-library geometry reappears in Model mode and the switch disappears.
|
|
54
|
+
writer.writeUint8(mesh.geometryClass ?? 0);
|
|
55
|
+
// Write per-element local-frame origin (v6+, 3×f64): world = origin +
|
|
56
|
+
// position. [0,0,0] for absolute meshes. Without it a cache from a
|
|
57
|
+
// local-frame load restores small local positions with no origin → every
|
|
58
|
+
// element renders scattered near scene origin.
|
|
59
|
+
writer.writeFloat64(mesh.origin ? mesh.origin[0] : 0);
|
|
60
|
+
writer.writeFloat64(mesh.origin ? mesh.origin[1] : 0);
|
|
61
|
+
writer.writeFloat64(mesh.origin ? mesh.origin[2] : 0);
|
|
62
|
+
// Write geometry arrays
|
|
63
|
+
writer.writeTypedArray(mesh.positions);
|
|
64
|
+
writer.writeTypedArray(mesh.normals);
|
|
65
|
+
writer.writeTypedArray(mesh.indices);
|
|
66
|
+
}
|
|
67
|
+
/** Exact serialized size of one per-mesh record, for chunk byte budgeting. */
|
|
68
|
+
export function meshRecordByteLength(mesh) {
|
|
69
|
+
const ifcTypeBytes = mesh.ifcType ? new TextEncoder().encode(mesh.ifcType).length : 0;
|
|
70
|
+
return (4 + 4 + 4 + // expressId, vertexCount, indexCount
|
|
71
|
+
16 + // color f32x4
|
|
72
|
+
4 + ifcTypeBytes + // ifcType string
|
|
73
|
+
1 + // geometryClass
|
|
74
|
+
24 + // origin f64x3
|
|
75
|
+
mesh.positions.byteLength + mesh.normals.byteLength + mesh.indices.byteLength);
|
|
87
76
|
}
|
|
88
|
-
function writeCoordinateInfo(writer, info) {
|
|
77
|
+
export function writeCoordinateInfo(writer, info) {
|
|
89
78
|
// Origin shift
|
|
90
79
|
writeVec3(writer, info.originShift);
|
|
91
80
|
// Original bounds
|
|
@@ -116,80 +105,60 @@ function writeAABB(writer, aabb) {
|
|
|
116
105
|
writeVec3(writer, aabb.min);
|
|
117
106
|
writeVec3(writer, aabb.max);
|
|
118
107
|
}
|
|
119
|
-
/**
|
|
120
|
-
* Read geometry data from buffer
|
|
121
|
-
*/
|
|
122
108
|
// Maximum reasonable values for sanity checking
|
|
123
|
-
const MAX_MESH_COUNT = 10_000_000; // 10M meshes max
|
|
124
109
|
const MAX_VERTEX_COUNT = 100_000_000; // 100M vertices max per mesh
|
|
125
110
|
const MAX_INDEX_COUNT = 300_000_000; // 300M indices max per mesh
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
const
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
111
|
+
/** Read one per-mesh record (see writeMeshRecord for the layout). */
|
|
112
|
+
export function readMeshRecord(reader, version, meshIndex = 0) {
|
|
113
|
+
const expressId = reader.readUint32();
|
|
114
|
+
const vertexCount = reader.readUint32();
|
|
115
|
+
const indexCount = reader.readUint32();
|
|
116
|
+
// Sanity check vertex/index counts
|
|
117
|
+
if (vertexCount > MAX_VERTEX_COUNT) {
|
|
118
|
+
throw new Error(`Invalid cache: vertexCount ${vertexCount} exceeds maximum ${MAX_VERTEX_COUNT} at mesh ${meshIndex}. Cache may be corrupted or from incompatible version.`);
|
|
133
119
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
// viewer's bumped cache key, so they re-mesh fresh rather than load here.
|
|
161
|
-
const geometryClass = version >= 5 ? reader.readUint8() : 0;
|
|
162
|
-
// Read per-element local-frame origin (version 6+); world = origin + position.
|
|
163
|
-
let origin;
|
|
164
|
-
if (version >= 6) {
|
|
165
|
-
const ox = reader.readFloat64();
|
|
166
|
-
const oy = reader.readFloat64();
|
|
167
|
-
const oz = reader.readFloat64();
|
|
168
|
-
if (ox || oy || oz)
|
|
169
|
-
origin = [ox, oy, oz];
|
|
170
|
-
}
|
|
171
|
-
const positions = reader.readFloat32Array(vertexCount * 3);
|
|
172
|
-
const normals = reader.readFloat32Array(vertexCount * 3);
|
|
173
|
-
const indices = reader.readUint32Array(indexCount);
|
|
174
|
-
meshes.push({
|
|
175
|
-
expressId,
|
|
176
|
-
positions,
|
|
177
|
-
normals,
|
|
178
|
-
indices,
|
|
179
|
-
color,
|
|
180
|
-
ifcType,
|
|
181
|
-
geometryClass,
|
|
182
|
-
...(origin ? { origin } : {}),
|
|
183
|
-
});
|
|
120
|
+
if (indexCount > MAX_INDEX_COUNT) {
|
|
121
|
+
throw new Error(`Invalid cache: indexCount ${indexCount} exceeds maximum ${MAX_INDEX_COUNT} at mesh ${meshIndex}. Cache may be corrupted or from incompatible version.`);
|
|
122
|
+
}
|
|
123
|
+
const color = [
|
|
124
|
+
reader.readFloat32(),
|
|
125
|
+
reader.readFloat32(),
|
|
126
|
+
reader.readFloat32(),
|
|
127
|
+
reader.readFloat32(),
|
|
128
|
+
];
|
|
129
|
+
// Read ifcType (only in version 2+)
|
|
130
|
+
let ifcType = undefined;
|
|
131
|
+
if (version >= 2) {
|
|
132
|
+
ifcType = reader.readString() || undefined;
|
|
133
|
+
}
|
|
134
|
+
// Read geometryClass (version 5+) — the Model/Types view-switch tag.
|
|
135
|
+
// Older caches default to 0 (occurrence); v4 entries are bypassed by the
|
|
136
|
+
// viewer's bumped cache key, so they re-mesh fresh rather than load here.
|
|
137
|
+
const geometryClass = version >= 5 ? reader.readUint8() : 0;
|
|
138
|
+
// Read per-element local-frame origin (version 6+); world = origin + position.
|
|
139
|
+
let origin;
|
|
140
|
+
if (version >= 6) {
|
|
141
|
+
const ox = reader.readFloat64();
|
|
142
|
+
const oy = reader.readFloat64();
|
|
143
|
+
const oz = reader.readFloat64();
|
|
144
|
+
if (ox || oy || oz)
|
|
145
|
+
origin = [ox, oy, oz];
|
|
184
146
|
}
|
|
147
|
+
const positions = reader.readFloat32Array(vertexCount * 3);
|
|
148
|
+
const normals = reader.readFloat32Array(vertexCount * 3);
|
|
149
|
+
const indices = reader.readUint32Array(indexCount);
|
|
185
150
|
return {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
151
|
+
expressId,
|
|
152
|
+
positions,
|
|
153
|
+
normals,
|
|
154
|
+
indices,
|
|
155
|
+
color,
|
|
156
|
+
ifcType,
|
|
157
|
+
geometryClass,
|
|
158
|
+
...(origin ? { origin } : {}),
|
|
190
159
|
};
|
|
191
160
|
}
|
|
192
|
-
function readCoordinateInfo(reader, version = 2) {
|
|
161
|
+
export function readCoordinateInfo(reader, version = 2) {
|
|
193
162
|
const originShift = readVec3(reader);
|
|
194
163
|
const originalBounds = readAABB(reader);
|
|
195
164
|
const shiftedBounds = readAABB(reader);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../src/sections/geometry.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAS/D
|
|
1
|
+
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../src/sections/geometry.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -65,7 +65,49 @@ export declare const MAGIC = 1279477321;
|
|
|
65
65
|
* is unchanged, but the vertex/index buffers differ, so the bump invalidates
|
|
66
66
|
* pre-weld caches to re-mesh (welded).
|
|
67
67
|
*/
|
|
68
|
-
|
|
68
|
+
/**
|
|
69
|
+
* v12→v13: chunked geometry section (issue #1682, phase 4 of the
|
|
70
|
+
* chunked-residency plan). The geometry section becomes:
|
|
71
|
+
* headLength u32, then head = {meshCount/totalVertices/totalTriangles,
|
|
72
|
+
* coordinateInfo, chunkCount u32, directory[chunkCount]}, then chunk
|
|
73
|
+
* records at their directory offsets. Meshes are grouped into spatially
|
|
74
|
+
* coherent chunks (grid cell of origin + first vertex, soft byte cap) and
|
|
75
|
+
* each chunk record is independently decodable + optionally deflate-raw
|
|
76
|
+
* compressed (browser/Node-native CompressionStream). Enables the streamed
|
|
77
|
+
* cache-hit load (first paint after the FIRST chunk instead of a full
|
|
78
|
+
* deserialize) and is the on-disk foundation for evict-to-disk residency.
|
|
79
|
+
* Per-mesh record layout inside a chunk is UNCHANGED from v12.
|
|
80
|
+
*/
|
|
81
|
+
export declare const FORMAT_VERSION = 13;
|
|
82
|
+
/** Geometry chunking parameters (v13+). Grouping is a WRITE-side layout
|
|
83
|
+
* policy: readers only trust the directory, so these can change without a
|
|
84
|
+
* format bump. Cell size mirrors the renderer's spatial bucketing default
|
|
85
|
+
* but is deliberately independent — the renderer re-buckets on load. */
|
|
86
|
+
export declare const GEOMETRY_CHUNK_CELL_SIZE = 32;
|
|
87
|
+
/** Soft cap on uncompressed bytes per chunk (mesh records never split). */
|
|
88
|
+
export declare const GEOMETRY_CHUNK_SOFT_BYTES: number;
|
|
89
|
+
/** Chunks smaller than this skip compression (not worth the codec cost). */
|
|
90
|
+
export declare const GEOMETRY_CHUNK_COMPRESS_MIN_BYTES: number;
|
|
91
|
+
/** Per-chunk flags in the v13 geometry directory. */
|
|
92
|
+
export declare enum GeometryChunkFlags {
|
|
93
|
+
None = 0,
|
|
94
|
+
/** Chunk record bytes are deflate-raw compressed. */
|
|
95
|
+
DeflateRaw = 1
|
|
96
|
+
}
|
|
97
|
+
/** One entry of the v13 geometry chunk directory. */
|
|
98
|
+
export interface GeometryChunkInfo {
|
|
99
|
+
/** World AABB of the chunk's meshes (f32, for future priority/culling). */
|
|
100
|
+
aabbMin: [number, number, number];
|
|
101
|
+
aabbMax: [number, number, number];
|
|
102
|
+
/** Byte offset of the chunk record, relative to the geometry SECTION start. */
|
|
103
|
+
byteOffset: number;
|
|
104
|
+
/** Stored byte length of the chunk record (compressed length when compressed). */
|
|
105
|
+
byteLength: number;
|
|
106
|
+
/** Uncompressed byte length of the chunk record. */
|
|
107
|
+
uncompressedLength: number;
|
|
108
|
+
meshCount: number;
|
|
109
|
+
flags: GeometryChunkFlags;
|
|
110
|
+
}
|
|
69
111
|
/** Section types in the binary format */
|
|
70
112
|
export declare enum SectionType {
|
|
71
113
|
Strings = 1,
|
|
@@ -138,8 +180,6 @@ export interface CacheWriteOptions {
|
|
|
138
180
|
includeGeometry?: boolean;
|
|
139
181
|
/** Include spatial hierarchy (default: true) */
|
|
140
182
|
includeSpatialHierarchy?: boolean;
|
|
141
|
-
/** Compress sections (default: false, future feature) */
|
|
142
|
-
compress?: boolean;
|
|
143
183
|
/**
|
|
144
184
|
* Skip the header's full-file `xxhash64(sourceBuffer)`: store `sourceHash = 0n`
|
|
145
185
|
* and set {@link HeaderFlags.SourceHashUnset}. Use when the caller validates
|
|
@@ -151,6 +191,12 @@ export interface CacheWriteOptions {
|
|
|
151
191
|
* `false` (the writer hashes the whole `sourceBuffer`, unchanged).
|
|
152
192
|
*/
|
|
153
193
|
omitSourceHash?: boolean;
|
|
194
|
+
/**
|
|
195
|
+
* v13+: deflate-raw compress geometry chunk records above the size floor
|
|
196
|
+
* (default true). Disable for byte-inspection/debugging or when write
|
|
197
|
+
* latency matters more than entry size.
|
|
198
|
+
*/
|
|
199
|
+
compressGeometryChunks?: boolean;
|
|
154
200
|
}
|
|
155
201
|
/**
|
|
156
202
|
* Options for reading cache
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClI,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEnE,0BAA0B;AAC1B,eAAO,MAAM,KAAK,aAAa,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH;;;;;;GAMG;AACH;;;;;;;;;;GAUG;AACH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,yCAAyC;AACzC,oBAAY,WAAW;IACrB,OAAO,IAAI;IACX,QAAQ,IAAI;IACZ,UAAU,IAAI;IACd,UAAU,IAAI;IACd,aAAa,IAAI;IACjB,QAAQ,IAAI;IACZ,OAAO,IAAI;IACX,MAAM,IAAI;IACV,WAAW,IAAI;IACf,eAAe,KAAK;CACrB;AAED,yBAAyB;AACzB,oBAAY,aAAa;IACvB,MAAM,IAAI;IACV,IAAI,IAAI;IACR,MAAM,IAAI;CACX;AAED,mBAAmB;AACnB,oBAAY,WAAW;IACrB,IAAI,IAAI;IACR,UAAU,IAAS;IACnB,WAAW,IAAS;IACpB,UAAU,IAAS;IACnB;;;;;;;OAOG;IACH,eAAe,IAAS;CACzB;AAED,oBAAoB;AACpB,oBAAY,YAAY;IACtB,IAAI,IAAI;IACR,UAAU,IAAS;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CAEtB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,4CAA4C;IAC5C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gDAAgD;IAChD,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -63,7 +63,36 @@ export const MAGIC = 0x4C434649; // "IFCL" in little-endian
|
|
|
63
63
|
* is unchanged, but the vertex/index buffers differ, so the bump invalidates
|
|
64
64
|
* pre-weld caches to re-mesh (welded).
|
|
65
65
|
*/
|
|
66
|
-
|
|
66
|
+
/**
|
|
67
|
+
* v12→v13: chunked geometry section (issue #1682, phase 4 of the
|
|
68
|
+
* chunked-residency plan). The geometry section becomes:
|
|
69
|
+
* headLength u32, then head = {meshCount/totalVertices/totalTriangles,
|
|
70
|
+
* coordinateInfo, chunkCount u32, directory[chunkCount]}, then chunk
|
|
71
|
+
* records at their directory offsets. Meshes are grouped into spatially
|
|
72
|
+
* coherent chunks (grid cell of origin + first vertex, soft byte cap) and
|
|
73
|
+
* each chunk record is independently decodable + optionally deflate-raw
|
|
74
|
+
* compressed (browser/Node-native CompressionStream). Enables the streamed
|
|
75
|
+
* cache-hit load (first paint after the FIRST chunk instead of a full
|
|
76
|
+
* deserialize) and is the on-disk foundation for evict-to-disk residency.
|
|
77
|
+
* Per-mesh record layout inside a chunk is UNCHANGED from v12.
|
|
78
|
+
*/
|
|
79
|
+
export const FORMAT_VERSION = 13;
|
|
80
|
+
/** Geometry chunking parameters (v13+). Grouping is a WRITE-side layout
|
|
81
|
+
* policy: readers only trust the directory, so these can change without a
|
|
82
|
+
* format bump. Cell size mirrors the renderer's spatial bucketing default
|
|
83
|
+
* but is deliberately independent — the renderer re-buckets on load. */
|
|
84
|
+
export const GEOMETRY_CHUNK_CELL_SIZE = 32;
|
|
85
|
+
/** Soft cap on uncompressed bytes per chunk (mesh records never split). */
|
|
86
|
+
export const GEOMETRY_CHUNK_SOFT_BYTES = 8 * 1024 * 1024;
|
|
87
|
+
/** Chunks smaller than this skip compression (not worth the codec cost). */
|
|
88
|
+
export const GEOMETRY_CHUNK_COMPRESS_MIN_BYTES = 64 * 1024;
|
|
89
|
+
/** Per-chunk flags in the v13 geometry directory. */
|
|
90
|
+
export var GeometryChunkFlags;
|
|
91
|
+
(function (GeometryChunkFlags) {
|
|
92
|
+
GeometryChunkFlags[GeometryChunkFlags["None"] = 0] = "None";
|
|
93
|
+
/** Chunk record bytes are deflate-raw compressed. */
|
|
94
|
+
GeometryChunkFlags[GeometryChunkFlags["DeflateRaw"] = 1] = "DeflateRaw";
|
|
95
|
+
})(GeometryChunkFlags || (GeometryChunkFlags = {}));
|
|
67
96
|
/** Section types in the binary format */
|
|
68
97
|
export var SectionType;
|
|
69
98
|
(function (SectionType) {
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAS/D,0BAA0B;AAC1B,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,0BAA0B;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH;;;;;;GAMG;AACH;;;;;;;;;;GAUG;AACH;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AAEjC,yCAAyC;AACzC,MAAM,CAAN,IAAY,WAWX;AAXD,WAAY,WAAW;IACrB,mDAAW,CAAA;IACX,qDAAY,CAAA;IACZ,yDAAc,CAAA;IACd,yDAAc,CAAA;IACd,+DAAiB,CAAA;IACjB,qDAAY,CAAA;IACZ,mDAAW,CAAA;IACX,iDAAU,CAAA;IACV,2DAAe,CAAA;IACf,oEAAoB,CAAA;AACtB,CAAC,EAXW,WAAW,KAAX,WAAW,QAWtB;AAED,yBAAyB;AACzB,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,qDAAU,CAAA;IACV,iDAAQ,CAAA;IACR,qDAAU,CAAA;AACZ,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB;AAED,mBAAmB;AACnB,MAAM,CAAN,IAAY,WAcX;AAdD,WAAY,WAAW;IACrB,6CAAQ,CAAA;IACR,yDAAmB,CAAA;IACnB,2DAAoB,CAAA;IACpB,yDAAmB,CAAA;IACnB;;;;;;;OAOG;IACH,mEAAwB,CAAA;AAC1B,CAAC,EAdW,WAAW,KAAX,WAAW,QActB;AAED,oBAAoB;AACpB,MAAM,CAAN,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,+CAAQ,CAAA;IACR,2DAAmB,CAAA;AACrB,CAAC,EAHW,YAAY,KAAZ,YAAY,QAGvB;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAS/D,0BAA0B;AAC1B,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,0BAA0B;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH;;;;;;GAMG;AACH;;;;;;;;;;GAUG;AACH;;;;;;;;;;GAUG;AACH;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AAEjC;;;yEAGyE;AACzE,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAC3C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AACzD,4EAA4E;AAC5E,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,GAAG,IAAI,CAAC;AAE3D,qDAAqD;AACrD,MAAM,CAAN,IAAY,kBAIX;AAJD,WAAY,kBAAkB;IAC5B,2DAAQ,CAAA;IACR,qDAAqD;IACrD,uEAAmB,CAAA;AACrB,CAAC,EAJW,kBAAkB,KAAlB,kBAAkB,QAI7B;AAiBD,yCAAyC;AACzC,MAAM,CAAN,IAAY,WAWX;AAXD,WAAY,WAAW;IACrB,mDAAW,CAAA;IACX,qDAAY,CAAA;IACZ,yDAAc,CAAA;IACd,yDAAc,CAAA;IACd,+DAAiB,CAAA;IACjB,qDAAY,CAAA;IACZ,mDAAW,CAAA;IACX,iDAAU,CAAA;IACV,2DAAe,CAAA;IACf,oEAAoB,CAAA;AACtB,CAAC,EAXW,WAAW,KAAX,WAAW,QAWtB;AAED,yBAAyB;AACzB,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,qDAAU,CAAA;IACV,iDAAQ,CAAA;IACR,qDAAU,CAAA;AACZ,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB;AAED,mBAAmB;AACnB,MAAM,CAAN,IAAY,WAcX;AAdD,WAAY,WAAW;IACrB,6CAAQ,CAAA;IACR,yDAAmB,CAAA;IACnB,2DAAoB,CAAA;IACpB,yDAAmB,CAAA;IACnB;;;;;;;OAOG;IACH,mEAAwB,CAAA;AAC1B,CAAC,EAdW,WAAW,KAAX,WAAW,QActB;AAED,oBAAoB;AACpB,MAAM,CAAN,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,+CAAQ,CAAA;IACR,2DAAmB,CAAA;AACrB,CAAC,EAHW,YAAY,KAAZ,YAAY,QAGvB;AA+ID,2BAA2B;AAC3B,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAE9B,kCAAkC;AAClC,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC"}
|
package/dist/writer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../src/writer.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EASL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAapB,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B;;0FAEsF;IACtF,eAAe,CAAC,EAAE,WAAW,EAAE,CAAC;CACjC;AAED,qBAAa,iBAAiB;IAC5B;;;;;;;OAOG;IACG,KAAK,CACT,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,YAAY,GAAG,SAAS,EAClC,YAAY,EAAE,WAAW,EACzB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../src/writer.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EASL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAapB,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B;;0FAEsF;IACtF,eAAe,CAAC,EAAE,WAAW,EAAE,CAAC;CACjC;AAED,qBAAa,iBAAiB;IAC5B;;;;;;;OAOG;IACG,KAAK,CACT,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,YAAY,GAAG,SAAS,EAClC,YAAY,EAAE,WAAW,EACzB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,WAAW,CAAC;IAoJvB,OAAO,CAAC,YAAY;CAGrB"}
|
package/dist/writer.js
CHANGED
|
@@ -10,7 +10,7 @@ import { writeEntities } from './sections/entities.js';
|
|
|
10
10
|
import { writeProperties } from './sections/properties.js';
|
|
11
11
|
import { writeQuantities } from './sections/quantities.js';
|
|
12
12
|
import { writeRelationships } from './sections/relationships.js';
|
|
13
|
-
import {
|
|
13
|
+
import { buildGeometrySectionV13 } from './sections/geometry-chunks.js';
|
|
14
14
|
import { writeInstancedShards } from './sections/instanced-shards.js';
|
|
15
15
|
import { writeEntityIndex } from './sections/entity-index.js';
|
|
16
16
|
export class BinaryCacheWriter {
|
|
@@ -77,11 +77,10 @@ export class BinaryCacheWriter {
|
|
|
77
77
|
let totalVertices = 0;
|
|
78
78
|
let totalTriangles = 0;
|
|
79
79
|
if (includeGeometry && geometry) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
});
|
|
80
|
+
// v13: chunked geometry section (spatially coherent, per-chunk
|
|
81
|
+
// deflate-raw). The pre-v13 sequential writer was removed — this is
|
|
82
|
+
// the only geometry serializer.
|
|
83
|
+
const geometryBuffer = await buildGeometrySectionV13(geometry.meshes, geometry.coordinateInfo, { compress: options.compressGeometryChunks ?? true });
|
|
85
84
|
sectionBuffers.push({ type: SectionType.Geometry, buffer: geometryBuffer });
|
|
86
85
|
totalVertices = geometry.totalVertices;
|
|
87
86
|
totalTriangles = geometry.totalTriangles;
|
package/dist/writer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../src/writer.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAO/D,OAAO,EACL,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,WAAW,EACX,YAAY,GAKb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../src/writer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ifc-lite/cache",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "Binary cache format for IFC-Lite - fast model loading",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
}
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@ifc-lite/
|
|
17
|
-
"@ifc-lite/
|
|
16
|
+
"@ifc-lite/geometry": "^3.1.5",
|
|
17
|
+
"@ifc-lite/data": "^2.5.3"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"typescript": "^6.0.3",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"url": "https://github.com/LTplus-AG/ifc-lite.git",
|
|
28
28
|
"directory": "packages/cache"
|
|
29
29
|
},
|
|
30
|
-
"homepage": "https://
|
|
30
|
+
"homepage": "https://ifclite.dev/docs/",
|
|
31
31
|
"bugs": "https://github.com/LTplus-AG/ifc-lite/issues",
|
|
32
32
|
"keywords": [
|
|
33
33
|
"ifc",
|