@ifc-lite/geometry 1.0.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.
Files changed (50) hide show
  1. package/LICENSE +373 -0
  2. package/dist/buffer-builder.d.ts +21 -0
  3. package/dist/buffer-builder.d.ts.map +1 -0
  4. package/dist/buffer-builder.js +44 -0
  5. package/dist/buffer-builder.js.map +1 -0
  6. package/dist/coordinate-handler.d.ts +91 -0
  7. package/dist/coordinate-handler.d.ts.map +1 -0
  8. package/dist/coordinate-handler.js +324 -0
  9. package/dist/coordinate-handler.js.map +1 -0
  10. package/dist/default-materials.d.ts +22 -0
  11. package/dist/default-materials.d.ts.map +1 -0
  12. package/dist/default-materials.js +113 -0
  13. package/dist/default-materials.js.map +1 -0
  14. package/dist/geometry.worker.d.ts +2 -0
  15. package/dist/geometry.worker.d.ts.map +1 -0
  16. package/dist/geometry.worker.js +118 -0
  17. package/dist/geometry.worker.js.map +1 -0
  18. package/dist/ifc-lite-bridge.d.ts +32 -0
  19. package/dist/ifc-lite-bridge.d.ts.map +1 -0
  20. package/dist/ifc-lite-bridge.js +58 -0
  21. package/dist/ifc-lite-bridge.js.map +1 -0
  22. package/dist/ifc-lite-mesh-collector.d.ts +28 -0
  23. package/dist/ifc-lite-mesh-collector.d.ts.map +1 -0
  24. package/dist/ifc-lite-mesh-collector.js +131 -0
  25. package/dist/ifc-lite-mesh-collector.js.map +1 -0
  26. package/dist/index.d.ts +72 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +172 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/lod.d.ts +60 -0
  31. package/dist/lod.d.ts.map +1 -0
  32. package/dist/lod.js +113 -0
  33. package/dist/lod.js.map +1 -0
  34. package/dist/progressive-loader.d.ts +48 -0
  35. package/dist/progressive-loader.d.ts.map +1 -0
  36. package/dist/progressive-loader.js +143 -0
  37. package/dist/progressive-loader.js.map +1 -0
  38. package/dist/style-cache.d.ts +36 -0
  39. package/dist/style-cache.d.ts.map +1 -0
  40. package/dist/style-cache.js +127 -0
  41. package/dist/style-cache.js.map +1 -0
  42. package/dist/types.d.ts +32 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +5 -0
  45. package/dist/types.js.map +1 -0
  46. package/dist/worker-pool.d.ts +56 -0
  47. package/dist/worker-pool.d.ts.map +1 -0
  48. package/dist/worker-pool.js +160 -0
  49. package/dist/worker-pool.js.map +1 -0
  50. package/package.json +47 -0
package/dist/lod.js ADDED
@@ -0,0 +1,113 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ export class LODGenerator {
5
+ config;
6
+ constructor(config = {}) {
7
+ this.config = {
8
+ minScreenSize: config.minScreenSize ?? 2.0, // 2 pixels minimum
9
+ distanceThresholds: config.distanceThresholds ?? [50, 200, 1000], // near, mid, far
10
+ };
11
+ }
12
+ /**
13
+ * Calculate screen-space size of a mesh from camera position
14
+ */
15
+ calculateScreenSize(meshBounds, cameraPosition, _viewProjMatrix, _viewportWidth, viewportHeight) {
16
+ // Calculate center of bounds
17
+ const center = {
18
+ x: (meshBounds.min.x + meshBounds.max.x) / 2,
19
+ y: (meshBounds.min.y + meshBounds.max.y) / 2,
20
+ z: (meshBounds.min.z + meshBounds.max.z) / 2,
21
+ };
22
+ // Calculate size of bounds
23
+ const size = {
24
+ x: meshBounds.max.x - meshBounds.min.x,
25
+ y: meshBounds.max.y - meshBounds.min.y,
26
+ z: meshBounds.max.z - meshBounds.min.z,
27
+ };
28
+ // Approximate radius (half diagonal)
29
+ const radius = Math.sqrt(size.x ** 2 + size.y ** 2 + size.z ** 2) / 2;
30
+ // Distance from camera to center
31
+ const dx = center.x - cameraPosition.x;
32
+ const dy = center.y - cameraPosition.y;
33
+ const dz = center.z - cameraPosition.z;
34
+ const distance = Math.sqrt(dx ** 2 + dy ** 2 + dz ** 2);
35
+ if (distance === 0)
36
+ return Infinity;
37
+ // Project radius to screen space
38
+ // Simplified: assume FOV of 45 degrees (tan(22.5) ≈ 0.414)
39
+ const fovFactor = 0.414;
40
+ const screenSize = (radius / distance) * viewportHeight * fovFactor;
41
+ return screenSize;
42
+ }
43
+ /**
44
+ * Determine if mesh should be rendered based on screen size
45
+ */
46
+ shouldRender(meshBounds, cameraPosition, viewProjMatrix, viewportWidth, viewportHeight) {
47
+ const screenSize = this.calculateScreenSize(meshBounds, cameraPosition, viewProjMatrix, viewportWidth, viewportHeight);
48
+ return screenSize >= this.config.minScreenSize;
49
+ }
50
+ /**
51
+ * Get LOD level based on distance (0 = full detail, 1 = medium, 2 = low, -1 = cull)
52
+ */
53
+ getLODLevel(meshBounds, cameraPosition) {
54
+ // Calculate center of bounds
55
+ const center = {
56
+ x: (meshBounds.min.x + meshBounds.max.x) / 2,
57
+ y: (meshBounds.min.y + meshBounds.max.y) / 2,
58
+ z: (meshBounds.min.z + meshBounds.max.z) / 2,
59
+ };
60
+ // Distance from camera to center
61
+ const dx = center.x - cameraPosition.x;
62
+ const dy = center.y - cameraPosition.y;
63
+ const dz = center.z - cameraPosition.z;
64
+ const distance = Math.sqrt(dx ** 2 + dy ** 2 + dz ** 2);
65
+ const [near, mid, far] = this.config.distanceThresholds;
66
+ if (distance < near) {
67
+ return 0; // Full detail
68
+ }
69
+ else if (distance < mid) {
70
+ return 1; // Medium detail
71
+ }
72
+ else if (distance < far) {
73
+ return 2; // Low detail
74
+ }
75
+ else {
76
+ return -1; // Cull
77
+ }
78
+ }
79
+ /**
80
+ * Compute bounds from mesh data
81
+ */
82
+ static computeBounds(mesh) {
83
+ const positions = mesh.positions;
84
+ if (positions.length === 0) {
85
+ return {
86
+ min: { x: 0, y: 0, z: 0 },
87
+ max: { x: 0, y: 0, z: 0 },
88
+ };
89
+ }
90
+ let minX = positions[0];
91
+ let minY = positions[1];
92
+ let minZ = positions[2];
93
+ let maxX = positions[0];
94
+ let maxY = positions[1];
95
+ let maxZ = positions[2];
96
+ for (let i = 3; i < positions.length; i += 3) {
97
+ const x = positions[i];
98
+ const y = positions[i + 1];
99
+ const z = positions[i + 2];
100
+ minX = Math.min(minX, x);
101
+ minY = Math.min(minY, y);
102
+ minZ = Math.min(minZ, z);
103
+ maxX = Math.max(maxX, x);
104
+ maxY = Math.max(maxY, y);
105
+ maxZ = Math.max(maxZ, z);
106
+ }
107
+ return {
108
+ min: { x: minX, y: minY, z: minZ },
109
+ max: { x: maxX, y: maxY, z: maxZ },
110
+ };
111
+ }
112
+ }
113
+ //# sourceMappingURL=lod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lod.js","sourceRoot":"","sources":["../src/lod.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Progressive Geometry Loader - Priority-based batch loading
3
+ * Processes LoadAllGeometry results in priority order to show geometry faster
4
+ */
5
+ import type { MeshData } from './types.js';
6
+ export declare enum GeometryQuality {
7
+ Fast = "fast",// Skip small objects, simplified geometry
8
+ Balanced = "balanced",// Default - all geometry
9
+ High = "high"
10
+ }
11
+ export interface PriorityMesh {
12
+ index: number;
13
+ expressId: number;
14
+ priority: number;
15
+ flatMesh: any;
16
+ }
17
+ /**
18
+ * Calculate priority score for a mesh
19
+ * Higher score = load sooner
20
+ */
21
+ export declare function calculateMeshPriority(flatMesh: any, expressId: number, entityIndex?: Map<number, any>): number;
22
+ /**
23
+ * Progressive mesh loader - processes meshes in priority batches
24
+ */
25
+ export declare class ProgressiveMeshLoader {
26
+ private quality;
27
+ private batchSize;
28
+ private yieldInterval;
29
+ constructor(quality?: GeometryQuality, batchSize?: number, yieldInterval?: number);
30
+ /**
31
+ * Sort meshes by priority and return sorted array
32
+ */
33
+ prioritizeMeshes(geometries: any, // web-ifc LoadAllGeometry result
34
+ entityIndex?: Map<number, any>): PriorityMesh[];
35
+ /**
36
+ * Check if mesh should be skipped based on quality mode
37
+ */
38
+ shouldSkipMesh(priorityMesh: PriorityMesh, flatMesh: any): boolean;
39
+ /**
40
+ * Yield control to main thread
41
+ */
42
+ private yieldToMainThread;
43
+ /**
44
+ * Process meshes in batches with yielding
45
+ */
46
+ processBatches(priorityMeshes: PriorityMesh[], processMesh: (priorityMesh: PriorityMesh) => MeshData | null): AsyncGenerator<MeshData[], void, unknown>;
47
+ }
48
+ //# sourceMappingURL=progressive-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progressive-loader.d.ts","sourceRoot":"","sources":["../src/progressive-loader.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,oBAAY,eAAe;IACzB,IAAI,SAAS,CAAQ,0CAA0C;IAC/D,QAAQ,aAAa,CAAE,yBAAyB;IAChD,IAAI,SAAS;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,GAAG,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,GAAG,EACb,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,MAAM,CAwBR;AAED;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;gBAG5B,OAAO,GAAE,eAA0C,EACnD,SAAS,GAAE,MAAW,EACtB,aAAa,GAAE,MAAW;IAO5B;;OAEG;IACH,gBAAgB,CACd,UAAU,EAAE,GAAG,EAAE,iCAAiC;IAClD,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,YAAY,EAAE;IAuBjB;;OAEG;IACH,cAAc,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO;IAmBlE;;OAEG;YACW,iBAAiB;IAU/B;;OAEG;IACI,cAAc,CACnB,cAAc,EAAE,YAAY,EAAE,EAC9B,WAAW,EAAE,CAAC,YAAY,EAAE,YAAY,KAAK,QAAQ,GAAG,IAAI,GAC3D,cAAc,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC;CAmC7C"}
@@ -0,0 +1,143 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ export var GeometryQuality;
5
+ (function (GeometryQuality) {
6
+ GeometryQuality["Fast"] = "fast";
7
+ GeometryQuality["Balanced"] = "balanced";
8
+ GeometryQuality["High"] = "high"; // Full quality + mesh repair
9
+ })(GeometryQuality || (GeometryQuality = {}));
10
+ /**
11
+ * Calculate priority score for a mesh
12
+ * Higher score = load sooner
13
+ */
14
+ export function calculateMeshPriority(flatMesh, expressId, entityIndex) {
15
+ let priority = 0;
16
+ // Priority based on geometry count (more geometry = more important)
17
+ const geomCount = flatMesh.geometries ? flatMesh.geometries.size() : 0;
18
+ priority += geomCount * 10;
19
+ // Priority based on entity type (structural elements first)
20
+ if (entityIndex) {
21
+ const entity = entityIndex.get(expressId);
22
+ if (entity) {
23
+ const type = entity.type?.toUpperCase() || '';
24
+ if (type.includes('WALL'))
25
+ priority += 100;
26
+ if (type.includes('SLAB'))
27
+ priority += 90;
28
+ if (type.includes('BEAM'))
29
+ priority += 80;
30
+ if (type.includes('COLUMN'))
31
+ priority += 85;
32
+ if (type.includes('DOOR'))
33
+ priority += 40;
34
+ if (type.includes('WINDOW'))
35
+ priority += 40;
36
+ if (type.includes('FURNITURE'))
37
+ priority += 20;
38
+ if (type.includes('FASTENER'))
39
+ priority += 5;
40
+ }
41
+ }
42
+ return priority;
43
+ }
44
+ /**
45
+ * Progressive mesh loader - processes meshes in priority batches
46
+ */
47
+ export class ProgressiveMeshLoader {
48
+ quality;
49
+ batchSize;
50
+ yieldInterval; // ms between yields
51
+ constructor(quality = GeometryQuality.Balanced, batchSize = 50, yieldInterval = 16 // ~60fps
52
+ ) {
53
+ this.quality = quality;
54
+ this.batchSize = batchSize;
55
+ this.yieldInterval = yieldInterval;
56
+ }
57
+ /**
58
+ * Sort meshes by priority and return sorted array
59
+ */
60
+ prioritizeMeshes(geometries, // web-ifc LoadAllGeometry result
61
+ entityIndex) {
62
+ const geomCount = geometries.size();
63
+ const priorityMeshes = [];
64
+ for (let i = 0; i < geomCount; i++) {
65
+ const flatMesh = geometries.get(i);
66
+ const expressId = flatMesh.expressID;
67
+ const priority = calculateMeshPriority(flatMesh, expressId, entityIndex);
68
+ priorityMeshes.push({
69
+ index: i,
70
+ expressId,
71
+ priority,
72
+ flatMesh,
73
+ });
74
+ }
75
+ // Sort by priority (highest first)
76
+ priorityMeshes.sort((a, b) => b.priority - a.priority);
77
+ return priorityMeshes;
78
+ }
79
+ /**
80
+ * Check if mesh should be skipped based on quality mode
81
+ */
82
+ shouldSkipMesh(priorityMesh, flatMesh) {
83
+ if (this.quality === GeometryQuality.Balanced || this.quality === GeometryQuality.High) {
84
+ return false; // Don't skip anything
85
+ }
86
+ // Fast mode: skip low-priority meshes
87
+ if (priorityMesh.priority < 10) {
88
+ return true;
89
+ }
90
+ // Fast mode: skip meshes with very few geometries
91
+ const geomCount = flatMesh.geometries ? flatMesh.geometries.size() : 0;
92
+ if (geomCount === 0) {
93
+ return true;
94
+ }
95
+ return false;
96
+ }
97
+ /**
98
+ * Yield control to main thread
99
+ */
100
+ async yieldToMainThread() {
101
+ return new Promise((resolve) => {
102
+ if (typeof requestIdleCallback !== 'undefined') {
103
+ requestIdleCallback(() => resolve(), { timeout: this.yieldInterval });
104
+ }
105
+ else {
106
+ setTimeout(() => resolve(), this.yieldInterval);
107
+ }
108
+ });
109
+ }
110
+ /**
111
+ * Process meshes in batches with yielding
112
+ */
113
+ async *processBatches(priorityMeshes, processMesh) {
114
+ let batch = [];
115
+ let lastYieldTime = performance.now();
116
+ for (const priorityMesh of priorityMeshes) {
117
+ // Skip mesh if quality mode requires it
118
+ if (this.shouldSkipMesh(priorityMesh, priorityMesh.flatMesh)) {
119
+ continue;
120
+ }
121
+ const mesh = processMesh(priorityMesh);
122
+ if (mesh) {
123
+ batch.push(mesh);
124
+ }
125
+ // Yield batch if full or time elapsed
126
+ const now = performance.now();
127
+ if (batch.length >= this.batchSize ||
128
+ (now - lastYieldTime) >= this.yieldInterval) {
129
+ if (batch.length > 0) {
130
+ yield batch;
131
+ batch = [];
132
+ }
133
+ lastYieldTime = now;
134
+ await this.yieldToMainThread();
135
+ }
136
+ }
137
+ // Yield remaining batch
138
+ if (batch.length > 0) {
139
+ yield batch;
140
+ }
141
+ }
142
+ }
143
+ //# sourceMappingURL=progressive-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progressive-loader.js","sourceRoot":"","sources":["../src/progressive-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Style Index Cache - Caches style index to IndexedDB for faster subsequent loads
3
+ */
4
+ export interface StyleIndexData {
5
+ [geometryExpressID: number]: [number, number, number, number];
6
+ }
7
+ /**
8
+ * Style index cache using IndexedDB
9
+ */
10
+ export declare class StyleIndexCache {
11
+ private dbName;
12
+ private dbVersion;
13
+ private db;
14
+ /**
15
+ * Initialize IndexedDB
16
+ */
17
+ init(): Promise<void>;
18
+ /**
19
+ * Get cached style index for file hash
20
+ */
21
+ get(fileHash: string): Promise<StyleIndexData | null>;
22
+ /**
23
+ * Cache style index for file hash
24
+ */
25
+ set(fileHash: string, index: StyleIndexData): Promise<void>;
26
+ /**
27
+ * Calculate file hash and get/set cache
28
+ */
29
+ getCached(buffer: ArrayBuffer): Promise<StyleIndexData | null>;
30
+ setCached(buffer: ArrayBuffer, index: StyleIndexData): Promise<void>;
31
+ /**
32
+ * Clear old cache entries (older than maxAgeDays)
33
+ */
34
+ cleanup(maxAgeDays?: number): Promise<void>;
35
+ }
36
+ //# sourceMappingURL=style-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-cache.d.ts","sourceRoot":"","sources":["../src/style-cache.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC7B,CAAC,iBAAiB,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/D;AAYD;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,EAAE,CAA4B;IAEtC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB3B;;OAEG;IACG,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAuB3D;;OAEG;IACG,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBjE;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAK9D,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1E;;OAEG;IACG,OAAO,CAAC,UAAU,GAAE,MAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CA8BtD"}
@@ -0,0 +1,127 @@
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
+ /**
5
+ * Calculate simple hash of buffer for cache key
6
+ */
7
+ async function calculateFileHash(buffer) {
8
+ // Use Web Crypto API for fast hashing
9
+ const hashBuffer = await crypto.subtle.digest('SHA-256', buffer);
10
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
11
+ return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
12
+ }
13
+ /**
14
+ * Style index cache using IndexedDB
15
+ */
16
+ export class StyleIndexCache {
17
+ dbName = 'ifc-lite-style-cache';
18
+ dbVersion = 1;
19
+ db = null;
20
+ /**
21
+ * Initialize IndexedDB
22
+ */
23
+ async init() {
24
+ return new Promise((resolve, reject) => {
25
+ const request = indexedDB.open(this.dbName, this.dbVersion);
26
+ request.onerror = () => reject(request.error);
27
+ request.onsuccess = () => {
28
+ this.db = request.result;
29
+ resolve();
30
+ };
31
+ request.onupgradeneeded = (event) => {
32
+ const db = event.target.result;
33
+ if (!db.objectStoreNames.contains('styles')) {
34
+ db.createObjectStore('styles', { keyPath: 'hash' });
35
+ }
36
+ };
37
+ });
38
+ }
39
+ /**
40
+ * Get cached style index for file hash
41
+ */
42
+ async get(fileHash) {
43
+ if (!this.db) {
44
+ await this.init();
45
+ }
46
+ return new Promise((resolve, reject) => {
47
+ if (!this.db) {
48
+ resolve(null);
49
+ return;
50
+ }
51
+ const transaction = this.db.transaction(['styles'], 'readonly');
52
+ const store = transaction.objectStore('styles');
53
+ const request = store.get(fileHash);
54
+ request.onerror = () => reject(request.error);
55
+ request.onsuccess = () => {
56
+ const result = request.result;
57
+ resolve(result ? result.index : null);
58
+ };
59
+ });
60
+ }
61
+ /**
62
+ * Cache style index for file hash
63
+ */
64
+ async set(fileHash, index) {
65
+ if (!this.db) {
66
+ await this.init();
67
+ }
68
+ return new Promise((resolve, reject) => {
69
+ if (!this.db) {
70
+ resolve();
71
+ return;
72
+ }
73
+ const transaction = this.db.transaction(['styles'], 'readwrite');
74
+ const store = transaction.objectStore('styles');
75
+ const request = store.put({
76
+ hash: fileHash,
77
+ index,
78
+ timestamp: Date.now(),
79
+ });
80
+ request.onerror = () => reject(request.error);
81
+ request.onsuccess = () => resolve();
82
+ });
83
+ }
84
+ /**
85
+ * Calculate file hash and get/set cache
86
+ */
87
+ async getCached(buffer) {
88
+ const hash = await calculateFileHash(buffer);
89
+ return this.get(hash);
90
+ }
91
+ async setCached(buffer, index) {
92
+ const hash = await calculateFileHash(buffer);
93
+ await this.set(hash, index);
94
+ }
95
+ /**
96
+ * Clear old cache entries (older than maxAgeDays)
97
+ */
98
+ async cleanup(maxAgeDays = 30) {
99
+ if (!this.db) {
100
+ await this.init();
101
+ }
102
+ return new Promise((resolve, reject) => {
103
+ if (!this.db) {
104
+ resolve();
105
+ return;
106
+ }
107
+ const transaction = this.db.transaction(['styles'], 'readwrite');
108
+ const store = transaction.objectStore('styles');
109
+ const request = store.openCursor();
110
+ const cutoffTime = Date.now() - maxAgeDays * 24 * 60 * 60 * 1000;
111
+ request.onerror = () => reject(request.error);
112
+ request.onsuccess = (event) => {
113
+ const cursor = event.target.result;
114
+ if (cursor) {
115
+ if (cursor.value.timestamp < cutoffTime) {
116
+ cursor.delete();
117
+ }
118
+ cursor.continue();
119
+ }
120
+ else {
121
+ resolve();
122
+ }
123
+ };
124
+ });
125
+ }
126
+ }
127
+ //# sourceMappingURL=style-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-cache.js","sourceRoot":"","sources":["../src/style-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Geometry types for IFC-Lite
3
+ */
4
+ export interface MeshData {
5
+ expressId: number;
6
+ positions: Float32Array;
7
+ normals: Float32Array;
8
+ indices: Uint32Array;
9
+ color: [number, number, number, number];
10
+ }
11
+ export interface Vec3 {
12
+ x: number;
13
+ y: number;
14
+ z: number;
15
+ }
16
+ export interface AABB {
17
+ min: Vec3;
18
+ max: Vec3;
19
+ }
20
+ export interface CoordinateInfo {
21
+ originShift: Vec3;
22
+ originalBounds: AABB;
23
+ shiftedBounds: AABB;
24
+ isGeoReferenced: boolean;
25
+ }
26
+ export interface GeometryResult {
27
+ meshes: MeshData[];
28
+ totalTriangles: number;
29
+ totalVertices: number;
30
+ coordinateInfo: CoordinateInfo;
31
+ }
32
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,IAAI;IACnB,GAAG,EAAE,IAAI,CAAC;IACV,GAAG,EAAE,IAAI,CAAC;CACX;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,IAAI,CAAC;IAClB,cAAc,EAAE,IAAI,CAAC;IACrB,aAAa,EAAE,IAAI,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,cAAc,CAAC;CAChC"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;+DAE+D"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Worker Pool - Generic worker pool with task queue
3
+ * Supports multiple task types and zero-copy transferable objects
4
+ */
5
+ export type TaskType = 'mesh-collection' | 'generate-lod' | 'build-bvh';
6
+ export interface Task<T = any> {
7
+ id: string;
8
+ type: TaskType;
9
+ data: any;
10
+ resolve: (value: T) => void;
11
+ reject: (error: Error) => void;
12
+ }
13
+ export interface WorkerMessage {
14
+ id: string;
15
+ type: 'task-result' | 'task-error' | 'ready';
16
+ result?: any;
17
+ error?: string;
18
+ }
19
+ /**
20
+ * Worker Pool for geometry processing tasks
21
+ */
22
+ export declare class WorkerPool {
23
+ private workers;
24
+ private taskQueue;
25
+ private activeTasks;
26
+ private availableWorkers;
27
+ private workerCount;
28
+ private workerUrl;
29
+ private initialized;
30
+ constructor(workerUrl: URL | string, workerCount?: number);
31
+ /**
32
+ * Initialize worker pool
33
+ */
34
+ init(): Promise<void>;
35
+ /**
36
+ * Check if workers are available
37
+ */
38
+ isAvailable(): boolean;
39
+ /**
40
+ * Submit a task to the worker pool
41
+ */
42
+ submit<T>(type: TaskType, data: any): Promise<T>;
43
+ /**
44
+ * Process queued tasks
45
+ */
46
+ private processQueue;
47
+ /**
48
+ * Handle message from worker
49
+ */
50
+ private handleMessage;
51
+ /**
52
+ * Terminate all workers
53
+ */
54
+ terminate(): void;
55
+ }
56
+ //# sourceMappingURL=worker-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-pool.d.ts","sourceRoot":"","sources":["../src/worker-pool.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,iBAAiB,GAAG,cAAc,GAAG,WAAW,CAAC;AAExE,MAAM,WAAW,IAAI,CAAC,CAAC,GAAG,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,GAAG,YAAY,GAAG,OAAO,CAAC;IAC7C,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,WAAW,CAAkB;gBAEzB,SAAS,EAAE,GAAG,GAAG,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IAKzD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoD3B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACG,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAmBtD;;OAEG;IACH,OAAO,CAAC,YAAY;IAyBpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAgCrB;;OAEG;IACH,SAAS,IAAI,IAAI;CAUlB"}