| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- import defined from "../Core/defined.js";
- import FeatureDetection from "../Core/FeatureDetection.js";
- import RuntimeError from "../Core/RuntimeError.js";
- import TaskProcessor from "../Core/TaskProcessor.js";
-
- /**
- * @private
- */
- class DracoLoader {
- static _getDecoderTaskProcessor() {
- if (!defined(DracoLoader._decoderTaskProcessor)) {
- const processor = new TaskProcessor(
- "decodeDraco",
- DracoLoader._maxDecodingConcurrency,
- );
- processor
- .initWebAssemblyModule({
- wasmBinaryFile: "ThirdParty/draco_decoder.wasm",
- })
- .then(function (result) {
- if (result) {
- DracoLoader._taskProcessorReady = true;
- } else {
- DracoLoader._error = new RuntimeError(
- "Draco decoder could not be initialized.",
- );
- }
- })
- .catch((error) => {
- DracoLoader._error = error;
- });
- DracoLoader._decoderTaskProcessor = processor;
- }
-
- return DracoLoader._decoderTaskProcessor;
- }
-
- /**
- * Decodes a compressed point cloud. Returns undefined if the task cannot be scheduled.
- * @private
- *
- * @exception {RuntimeError} Draco decoder could not be initialized.
- */
- static decodePointCloud(parameters) {
- const decoderTaskProcessor = DracoLoader._getDecoderTaskProcessor();
- if (defined(DracoLoader._error)) {
- throw DracoLoader._error;
- }
-
- if (!DracoLoader._taskProcessorReady) {
- // The task processor is not ready to schedule tasks
- return;
- }
- return decoderTaskProcessor.scheduleTask(parameters, [
- parameters.buffer.buffer,
- ]);
- }
-
- /**
- * Decodes a buffer view. Returns undefined if the task cannot be scheduled.
- *
- * @param {object} options Object with the following properties:
- * @param {Uint8Array} options.array The typed array containing the buffer view data.
- * @param {object} options.bufferView The glTF buffer view object.
- * @param {Object<string, number>} options.compressedAttributes The compressed attributes.
- * @param {boolean} options.dequantizeInShader Whether POSITION and NORMAL attributes should be dequantized on the GPU.
- *
- * @returns {Promise} A promise that resolves to the decoded indices and attributes.
- * @private
- *
- * @exception {RuntimeError} Draco decoder could not be initialized.
- */
- static decodeBufferView(options) {
- const decoderTaskProcessor = DracoLoader._getDecoderTaskProcessor();
-
- if (defined(DracoLoader._error)) {
- throw DracoLoader._error;
- }
-
- if (!DracoLoader._taskProcessorReady) {
- // The task processor is not ready to schedule tasks
- return;
- }
-
- return decoderTaskProcessor.scheduleTask(options, [options.array.buffer]);
- }
- }
-
- // Maximum concurrency to use when decoding draco models
- DracoLoader._maxDecodingConcurrency = Math.max(
- FeatureDetection.hardwareConcurrency - 1,
- 1,
- );
-
- // Exposed for testing purposes
- DracoLoader._decoderTaskProcessor = undefined;
- DracoLoader._taskProcessorReady = false;
- DracoLoader._error = undefined;
-
- export default DracoLoader;
|