import { DisplayAssetMetaData, DisplayAssetType, GameConfig, GameObjectData, GameResource, } from '@gedit/render-engine'; import { ContextStore } from '../common'; import { Plugin } from '../plugin'; import { AssetsMetaData } from '@gedit/assets-2d/lib/common/assets-service'; export interface ResourceOptions { getMetaData(uri: string): Promise; metaCache: Map; allScenes: GameObjectData[]; allComponents: GameObjectData[]; toBrowserUrl?: (meta: DisplayAssetMetaData, fileName?: string) => string; clearResourceKeyCache?: boolean; getResourceRegister: ( type: DisplayAssetType ) => GameResource.Register | undefined; config?: GameConfig; } export interface ResourceOuput { resources: GameResource[]; sceneResourceIndexs: { [key: string]: number[] }; } export function resourcePlugin( options: ResourceOptions ): Plugin { const { allScenes, allComponents } = options; function mergeResources( resources: GameResource[], result: GameResource[] ): void { for (const resource of resources) { if (result.find(r => r.id === resource.id && r.engineName === resource.engineName)) { continue; } result.push(resource); } } return { async onCompile(): Promise { const resources: GameResource[] = []; const sceneResourceIndexs: { [key: string]: number[] } = {}; if (options.clearResourceKeyCache) { GameResource.clearResourceKeyCache(); } const opts = { toBrowserUrl: options.toBrowserUrl, getMetaData: options.getMetaData, getResourceRegister: options.getResourceRegister, components: allComponents, metaCache: options.metaCache, }; for (const scene of allScenes) { const currentResources = await GameResource.getResourceListByNodeData( scene, opts, [], options.config?.symbols, options.config?.engine ); mergeResources(currentResources, resources); // 计算出每个场景包含的resource id sceneResourceIndexs[scene.id] = currentResources.map(r => resources.findIndex(r2 => r2.id === r.id && r2.engineName === r.engineName) ); } this.setValue(ContextStore.resource, { resources, sceneResourceIndexs }); }, }; }