@babylonjs/viewer
Version:
The Babylon Viewer aims to simplify a specific but common Babylon.js use case: loading, viewing, and interacting with a 3D model.
156 lines (152 loc) • 5.48 kB
JavaScript
import { GLTFLoader, ArrayItem } from './glTFLoader-VVyk3AwX.esm.js';
import { b as Tools, bJ as unregisterGLTFExtension, bI as registerGLTFExtension } from './index-FzOfPXLV.esm.js';
import './bone--mL3H5cQ.esm.js';
import './skeleton-B7-ffRm_.esm.js';
import './rawTexture-B2DimmQ5.esm.js';
import './assetContainer-8JZnoDWQ.esm.js';
import './objectModelMapping-CJnQ6at_.esm.js';
// eslint-disable-next-line @typescript-eslint/naming-convention
let NumberOfWorkers = 0;
// eslint-disable-next-line @typescript-eslint/naming-convention
let WorkerTimeout = null;
/**
* Meshopt compression (https://github.com/zeux/meshoptimizer)
*
* This class wraps the meshopt library from https://github.com/zeux/meshoptimizer/tree/master/js.
*
* **Encoder**
*
* The encoder is not currently implemented.
*
* **Decoder**
*
* By default, the configuration points to a copy of the meshopt files on the Babylon.js preview CDN (e.g. https://preview.babylonjs.com/meshopt_decoder.js).
*
* To update the configuration, use the following code:
* ```javascript
* MeshoptCompression.Configuration = {
* decoder: {
* url: "<url to the meshopt decoder library>"
* }
* };
* ```
*/
class MeshoptCompression {
/**
* Default instance for the meshoptimizer object.
*/
static get Default() {
if (!MeshoptCompression._Default) {
MeshoptCompression._Default = new MeshoptCompression();
}
return MeshoptCompression._Default;
}
/**
* Constructor
*/
constructor() {
const decoder = MeshoptCompression.Configuration.decoder;
// eslint-disable-next-line github/no-then
this._decoderModulePromise = Tools.LoadBabylonScriptAsync(decoder.url).then(() => {
// Wait for WebAssembly compilation before resolving promise
return MeshoptDecoder.ready;
});
}
/**
* Stop all async operations and release resources.
*/
dispose() {
delete this._decoderModulePromise;
}
/**
* Decode meshopt data.
* @see https://github.com/zeux/meshoptimizer/tree/master/js#decoder
* @param source The input data.
* @param count The number of elements.
* @param stride The stride in bytes.
* @param mode The compression mode.
* @param filter The compression filter.
* @returns a Promise<Uint8Array> that resolves to the decoded data
*/
async decodeGltfBufferAsync(source, count, stride, mode, filter) {
await this._decoderModulePromise;
if (NumberOfWorkers === 0) {
MeshoptDecoder.useWorkers(1);
NumberOfWorkers = 1;
}
const result = await MeshoptDecoder.decodeGltfBufferAsync(count, stride, source, mode, filter);
// a simple debounce to avoid switching back and forth between workers and no workers while decoding
if (WorkerTimeout !== null) {
clearTimeout(WorkerTimeout);
}
WorkerTimeout = setTimeout(() => {
MeshoptDecoder.useWorkers(0);
NumberOfWorkers = 0;
WorkerTimeout = null;
}, 1000);
return result;
}
}
/**
* The configuration. Defaults to the following:
* ```javascript
* decoder: {
* url: "https://cdn.babylonjs.com/meshopt_decoder.js"
* }
* ```
*/
MeshoptCompression.Configuration = {
decoder: {
url: `${Tools._DefaultCdnUrl}/meshopt_decoder.js`,
},
};
MeshoptCompression._Default = null;
const NAME = "EXT_meshopt_compression";
/**
* [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_meshopt_compression/README.md)
*
* This extension uses a WebAssembly decoder module from https://github.com/zeux/meshoptimizer/tree/master/js
* @since 5.0.0
*/
// eslint-disable-next-line @typescript-eslint/naming-convention
class EXT_meshopt_compression {
/**
* @internal
*/
constructor(loader) {
/**
* The name of this extension.
*/
this.name = NAME;
this.enabled = loader.isExtensionUsed(NAME);
this._loader = loader;
}
/** @internal */
dispose() {
this._loader = null;
}
/**
* @internal
*/
// eslint-disable-next-line no-restricted-syntax
loadBufferViewAsync(context, bufferView) {
return GLTFLoader.LoadExtensionAsync(context, bufferView, this.name, async (extensionContext, extension) => {
const bufferViewMeshopt = bufferView;
if (bufferViewMeshopt._meshOptData) {
return await bufferViewMeshopt._meshOptData;
}
const buffer = ArrayItem.Get(`${context}/buffer`, this._loader.gltf.buffers, extension.buffer);
bufferViewMeshopt._meshOptData = this._loader
.loadBufferAsync(`/buffers/${buffer.index}`, buffer, extension.byteOffset || 0, extension.byteLength)
// eslint-disable-next-line github/no-then
.then(async (buffer) => {
return await MeshoptCompression.Default.decodeGltfBufferAsync(buffer, extension.count, extension.byteStride, extension.mode, extension.filter);
});
return await bufferViewMeshopt._meshOptData;
});
}
}
unregisterGLTFExtension(NAME);
registerGLTFExtension(NAME, true, (loader) => new EXT_meshopt_compression(loader));
export { EXT_meshopt_compression };
//# sourceMappingURL=EXT_meshopt_compression-BnuF4PeO.esm.js.map