Files
engine/packages/loader/src/TextureCubeLoader.ts
ChenMo 21d0031469 Optimization texture structure (#715)
* feat: opt texture struct
2022-03-31 11:18:26 +08:00

50 lines
1.2 KiB
TypeScript

import {
AssetPromise,
AssetType,
Loader,
LoadItem,
resourceLoader,
ResourceManager,
TextureCubeFace,
TextureCube
} from "@oasis-engine/core";
@resourceLoader(AssetType.TextureCube, [""])
class TextureCubeLoader extends Loader<TextureCube> {
load(item: LoadItem, resourceManager: ResourceManager): AssetPromise<TextureCube> {
return new AssetPromise((resolve, reject) => {
Promise.all(
item.urls.map((url) =>
this.request<HTMLImageElement>(url, {
...item,
type: "image"
})
)
)
.then((images) => {
const { width, height } = images[0];
if (width !== height) {
console.error("The cube texture must have the same width and height");
return;
}
const tex = new TextureCube(resourceManager.engine, width);
/** @ts-ignore */
if (!tex._platformTexture) return;
for (let faceIndex = 0; faceIndex < 6; faceIndex++) {
tex.setImageSource(TextureCubeFace.PositiveX + faceIndex, images[faceIndex], 0);
}
tex.generateMipmaps();
resolve(tex);
})
.catch((e) => {
reject(e);
});
});
}
}