Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
151 changes: 85 additions & 66 deletions packages/core/src/asset/ResourceManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -349,73 +349,85 @@ export class ResourceManager {
return assetInfo;
}

private _loadSingleItem<T>(itemOrURL: LoadItem | string): AssetPromise<T> {
const item = this._assignDefaultOptions(typeof itemOrURL === "string" ? { url: itemOrURL } : itemOrURL);
let { url } = item;

// Not absolute and base url is set
if (!Utils.isAbsoluteUrl(url) && this.baseUrl) url = Utils.resolveAbsoluteUrl(this.baseUrl, url);

// Parse url
const { assetBaseURL, queryPath } = this._parseURL(url);
const paths = queryPath ? this._parseQueryPath(queryPath) : [];

// Get remote asset base url
const remoteAssetBaseURL = this._virtualPathResourceMap[assetBaseURL]?.path ?? assetBaseURL;

// Check cache
const cacheObject = this._assetUrlPool[remoteAssetBaseURL];
if (cacheObject) {
return new AssetPromise((resolve) => {
resolve(this._getResolveResource(cacheObject, paths) as T);
});
}

// Get asset url
let remoteAssetURL = remoteAssetBaseURL;
if (queryPath) {
remoteAssetURL += "?q=" + paths.shift();
let index: string;
while ((index = paths.shift())) {
remoteAssetURL += `[${index}]`;
}
}

// Check is loading
const loadingPromises = this._loadingPromises;
const loadingPromise = loadingPromises[remoteAssetURL];
if (loadingPromise) {
return new AssetPromise((resolve, reject, setTaskCompleteProgress, setTaskDetailProgress) => {
loadingPromise
.onProgress(setTaskCompleteProgress, setTaskDetailProgress)
.then((resource: EngineObject) => {
resolve(resource as T);
})
.catch((error: Error) => {
reject(error);
});
});
}

// Check loader
const loader = <Loader<T>>ResourceManager._loaders[item.type];
if (!loader) {
throw `loader not found: ${item.type}`;
}

// Check sub asset
if (queryPath) {
// Check whether load main asset
const mainPromise =
loadingPromises[remoteAssetBaseURL] || this._loadMainAsset(loader, item, remoteAssetBaseURL, assetBaseURL);
mainPromise.catch((e) => {
this._onSubAssetFail(remoteAssetBaseURL, queryPath, e);
});

return this._createSubAssetPromiseCallback<T>(remoteAssetBaseURL, remoteAssetURL, queryPath);
}
private _loadSubpackage(itemOrURL: LoadItem | string): AssetPromise<void> {
return new AssetPromise((resolve) => resolve());
}

return this._loadMainAsset(loader, item, remoteAssetBaseURL, assetBaseURL);
private _loadSingleItem<T>(itemOrURL: LoadItem | string): AssetPromise<T> {
return new AssetPromise((resolve, reject, setTaskCompleteProgress, setTaskDetailProgress) => {
this._loadSubpackage(itemOrURL)
.then(() => {
const item = this._assignDefaultOptions(typeof itemOrURL === "string" ? { url: itemOrURL } : itemOrURL);
let { url } = item;

// Not absolute and base url is set
if (!Utils.isAbsoluteUrl(url) && this.baseUrl) url = Utils.resolveAbsoluteUrl(this.baseUrl, url);

// Parse url
const { assetBaseURL, queryPath } = this._parseURL(url);
const paths = queryPath ? this._parseQueryPath(queryPath) : [];

// Get remote asset base url
const remoteAssetBaseURL = this._virtualPathResourceMap[assetBaseURL]?.path ?? assetBaseURL;

// Check cache
const cacheObject = this._assetUrlPool[remoteAssetBaseURL];
if (cacheObject) {
resolve(this._getResolveResource(cacheObject, paths) as T);
return;
}

// Get asset url
let remoteAssetURL = remoteAssetBaseURL;
if (queryPath) {
remoteAssetURL += "?q=" + paths.shift();
let index: string;
while ((index = paths.shift())) {
remoteAssetURL += `[${index}]`;
}
}

// Check is loading
const loadingPromises = this._loadingPromises;
const loadingPromise = loadingPromises[remoteAssetURL];
if (loadingPromise) {
loadingPromise
.onProgress(setTaskCompleteProgress, setTaskDetailProgress)
.then((resource: EngineObject) => {
resolve(resource as T);
})
.catch((error: Error) => {
reject(error);
});
return;
}

// Check loader
const loader = <Loader<T>>ResourceManager._loaders[item.type];
if (!loader) {
reject(new Error("loader not found: " + item.type));
}

// Check sub asset
if (queryPath) {
// Check whether load main asset
const mainPromise =
loadingPromises[remoteAssetBaseURL] ||
this._loadMainAsset(loader, item, remoteAssetBaseURL, assetBaseURL);
mainPromise.catch((e) => {
this._onSubAssetFail(remoteAssetBaseURL, queryPath, e);
});

resolve(this._createSubAssetPromiseCallback<T>(remoteAssetBaseURL, remoteAssetURL, queryPath));
return;
}

resolve(this._loadMainAsset(loader, item, remoteAssetBaseURL, assetBaseURL));
})
.catch((error) => {
reject(error);
});
});
}

private _loadMainAsset<T>(
Expand Down Expand Up @@ -599,6 +611,13 @@ export class ResourceManager {
}
});
}

/**
* @internal
* @beta Just for internal editor, not recommended for developers.
*/
initSubpackages(data: any): void {}

//-----------------Editor temp solution-----------------
}

Expand Down
2 changes: 2 additions & 0 deletions packages/loader/src/ProjectLoader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ class ProjectLoader extends Loader<void> {
// @ts-ignore
._request<IProject>(item.url, { ...item, type: "json" })
.then((data) => {
// @ts-ignore
engine.resourceManager.initSubpackages(data);
// @ts-ignore
engine.resourceManager.initVirtualResources(data.files);
return resourceManager.load<Scene>({ type: AssetType.Scene, url: data.scene }).then((scene) => {
Expand Down
Loading