UNPKG

playcanvas

Version:

PlayCanvas WebGL game engine

81 lines (78 loc) 2.98 kB
import { Debug } from '../../../core/debug.js'; import { Asset } from '../../asset/asset.js'; import { GSplatAssetLoaderBase } from '../../../scene/gsplat-unified/gsplat-asset-loader-base.js'; /** * @import { AssetRegistry } from '../../asset/asset-registry.js' */ /** * A utility class for programmatically loading and unloading gsplat resources. This class provides * a simple interface for loading gsplat assets dynamically and manages their lifecycle, including * keeping track of loaded assets for efficient unloading. * * @category Asset * @ignore */ class GSplatAssetLoader extends GSplatAssetLoaderBase { /** * Create a new GSplatAssetLoader. * * @param {AssetRegistry} registry - The asset registry to use for loading assets. */ constructor(registry){ super(), /** * Map of URL to Asset instances that this loader has created. * * @type {Map<string, Asset>} * @private */ this._urlToAsset = new Map(); this._registry = registry; } /** * Initiates loading of a gsplat asset. This is a fire-and-forget operation that starts * the loading process. Use getResource() later to check if the asset has finished loading. * * @param {string} url - The URL of the gsplat file to load. */ load(url) { Debug.assert(url); // Check if we already have this asset tracked let asset = this._urlToAsset.get(url); if (!asset) { // Check if the asset registry already has this asset asset = this._registry.getByUrl(url); if (!asset) { // Create a new gsplat asset asset = new Asset(url, 'gsplat', { url }); this._registry.add(asset); } // Track this asset in our map this._urlToAsset.set(url, asset); } // Start loading the asset if it's not already loaded or loading if (!asset.loaded && !asset.loading) { this._registry.load(asset); } } /** * Unloads an asset that was previously loaded by this loader. The asset resource will be * destroyed and freed from memory. * * @param {string} url - The URL of the asset to unload. */ unload(url) { const asset = this._urlToAsset.get(url); if (asset) { this._registry.remove(asset); asset.unload(); this._urlToAsset.delete(url); } } /** * Gets the resource for a given URL if it has been loaded by this loader. * Use this when you just need the loaded resource data. * * @param {string} url - The URL of the asset to retrieve the resource from. * @returns {object|undefined} The loaded resource if found and loaded, undefined otherwise. */ getResource(url) { const asset = this._urlToAsset.get(url); return asset?.resource; } } export { GSplatAssetLoader };