diff --git a/src/utils/lazy-loader.ts b/src/utils/lazy-loader.ts new file mode 100644 index 00000000..b8311f28 --- /dev/null +++ b/src/utils/lazy-loader.ts @@ -0,0 +1,29 @@ + +export class LazyLoader { + private cache = new Map(); + private loading = new Map>(); + + async load(url: string): Promise { + if (this.cache.has(url)) return this.cache.get(url); + if (this.loading.has(url)) return this.loading.get(url); + + const promise = fetch(url) + .then(r => r.arrayBuffer()) + .then(data => { + this.cache.set(url, data); + this.loading.delete(url); + return data; + }); + + this.loading.set(url, promise); + return promise; + } + + dispose(url: string) { + this.cache.delete(url); + } + + disposeAll() { + this.cache.clear(); + } +} diff --git a/src/utils/lod-manager.ts b/src/utils/lod-manager.ts new file mode 100644 index 00000000..321141a4 --- /dev/null +++ b/src/utils/lod-manager.ts @@ -0,0 +1,25 @@ + +export interface LODConfig { + distances: number[]; + geometries: any[]; +} + +export class LODManager { + private configs = new Map(); + + register(id: string, config: LODConfig) { + this.configs.set(id, config); + } + + getGeometry(id: string, distance: number): any { + const config = this.configs.get(id); + if (!config) return null; + + for (let i = 0; i < config.distances.length; i++) { + if (distance <= config.distances[i]) { + return config.geometries[i]; + } + } + return config.geometries[config.geometries.length - 1]; + } +}