@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.
- package/LICENSE +373 -0
- package/dist/buffer-builder.d.ts +21 -0
- package/dist/buffer-builder.d.ts.map +1 -0
- package/dist/buffer-builder.js +44 -0
- package/dist/buffer-builder.js.map +1 -0
- package/dist/coordinate-handler.d.ts +91 -0
- package/dist/coordinate-handler.d.ts.map +1 -0
- package/dist/coordinate-handler.js +324 -0
- package/dist/coordinate-handler.js.map +1 -0
- package/dist/default-materials.d.ts +22 -0
- package/dist/default-materials.d.ts.map +1 -0
- package/dist/default-materials.js +113 -0
- package/dist/default-materials.js.map +1 -0
- package/dist/geometry.worker.d.ts +2 -0
- package/dist/geometry.worker.d.ts.map +1 -0
- package/dist/geometry.worker.js +118 -0
- package/dist/geometry.worker.js.map +1 -0
- package/dist/ifc-lite-bridge.d.ts +32 -0
- package/dist/ifc-lite-bridge.d.ts.map +1 -0
- package/dist/ifc-lite-bridge.js +58 -0
- package/dist/ifc-lite-bridge.js.map +1 -0
- package/dist/ifc-lite-mesh-collector.d.ts +28 -0
- package/dist/ifc-lite-mesh-collector.d.ts.map +1 -0
- package/dist/ifc-lite-mesh-collector.js +131 -0
- package/dist/ifc-lite-mesh-collector.js.map +1 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +172 -0
- package/dist/index.js.map +1 -0
- package/dist/lod.d.ts +60 -0
- package/dist/lod.d.ts.map +1 -0
- package/dist/lod.js +113 -0
- package/dist/lod.js.map +1 -0
- package/dist/progressive-loader.d.ts +48 -0
- package/dist/progressive-loader.d.ts.map +1 -0
- package/dist/progressive-loader.js +143 -0
- package/dist/progressive-loader.js.map +1 -0
- package/dist/style-cache.d.ts +36 -0
- package/dist/style-cache.d.ts.map +1 -0
- package/dist/style-cache.js +127 -0
- package/dist/style-cache.js.map +1 -0
- package/dist/types.d.ts +32 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/worker-pool.d.ts +56 -0
- package/dist/worker-pool.d.ts.map +1 -0
- package/dist/worker-pool.js +160 -0
- package/dist/worker-pool.js.map +1 -0
- 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
|
package/dist/lod.js.map
ADDED
|
@@ -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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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|