@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
72 lines (71 loc) • 2.54 kB
JavaScript
;
import { LIBRARY_INSTALL_HINT } from "./../common";
import { ASSETS_ROOT } from "./../AssetsUtils";
import { BaseCoreImageLoader } from "./_BaseImageLoader";
import { KTX2Loader } from "three/examples/jsm/loaders/KTX2Loader";
import { Poly } from "../../../engine/Poly";
import { CoreBaseLoader } from "../_Base";
import { sanitizeUrl } from "../../UrlHelper";
import { WebGLRenderer } from "three";
const _KTX2TextureLoader = class extends BaseCoreImageLoader {
constructor(_url, _node) {
super(_url, _node);
}
async _getLoader(options) {
return await _KTX2TextureLoader.getLoader({ node: this._node });
}
static async getLoader(options) {
return this._loader = this._loader || await this._createLoaderOrQueue(options);
}
static async _createLoaderOrQueue(options) {
if (this._loadStarted) {
return new Promise((resolve) => {
this._resolves.push(resolve);
});
} else {
this._loadStarted = true;
return this.__createLoader(options);
}
}
static async __createLoader(options) {
const loader = new KTX2Loader(this.loadingManager);
const root = Poly.libs.root();
const KTX2Path = Poly.libs.KTX2Path();
if (root || KTX2Path) {
const decoderPath = sanitizeUrl(`${root || ""}${KTX2Path || ""}/`);
if (options.node) {
const files = ["basis_transcoder.js", "basis_transcoder.wasm"];
await CoreBaseLoader._loadMultipleUrlsGlobal({
files: files.map((file) => {
return {
fullUrl: `${decoderPath}${file}`
};
}),
node: options.node,
error: `failed to load basis libraries. Make sure to install them to load .basis files (${LIBRARY_INSTALL_HINT})`
});
}
loader.setTranscoderPath(decoderPath);
} else {
loader.setTranscoderPath(void 0);
}
const renderer = await options.node.scene().renderersRegister.waitForRenderer();
if (renderer) {
if (renderer instanceof WebGLRenderer) {
loader.detectSupport(renderer);
} else {
Poly.warn("renderer found is not a WebGLRenderer");
}
} else {
Poly.warn("texture loader found no renderer for KTX2Loader");
}
for (const resolve of this._resolves) {
resolve(loader);
}
return loader;
}
};
export let KTX2TextureLoader = _KTX2TextureLoader;
KTX2TextureLoader.PARAM_ENV_DEFAULT = `${ASSETS_ROOT}/textures/sample_uastc_zstd.ktx2`;
KTX2TextureLoader._loadStarted = false;
KTX2TextureLoader._resolves = [];