81 lines
2.3 KiB
JavaScript
81 lines
2.3 KiB
JavaScript
import DeveloperError from "../Core/DeveloperError.js";
|
|
import defaultValue from "../Core/defaultValue.js";
|
|
import defined from "../Core/defined.js";
|
|
import PrimitivePipeline from "../Scene/PrimitivePipeline.js";
|
|
import createTaskProcessorWorker from "./createTaskProcessorWorker.js";
|
|
/* global require */
|
|
|
|
const moduleCache = {};
|
|
|
|
async function getModule(moduleName, modulePath) {
|
|
let module = defaultValue(moduleCache[modulePath], moduleCache[moduleName]);
|
|
|
|
if (defined(module)) {
|
|
return module;
|
|
}
|
|
|
|
if (defined(modulePath)) {
|
|
// ignore moduleName and use the path to import
|
|
if (typeof exports === "object") {
|
|
// Use CommonJS-style require.
|
|
module = require(modulePath);
|
|
} else {
|
|
// Use ESM-style dynamic import
|
|
const result = await import(modulePath);
|
|
module = result.default;
|
|
}
|
|
|
|
moduleCache[modulePath] = module;
|
|
return module;
|
|
}
|
|
|
|
if (typeof exports === "object") {
|
|
// Use CommonJS-style require.
|
|
module = require(`Workers/${moduleName}`);
|
|
} else {
|
|
// Use ESM-style dynamic import
|
|
const result = defined(modulePath)
|
|
? await import(modulePath)
|
|
: await import(`./${moduleName}.js`);
|
|
module = result.default;
|
|
}
|
|
|
|
moduleCache[moduleName] = module;
|
|
return module;
|
|
}
|
|
|
|
async function createGeometry(parameters, transferableObjects) {
|
|
const subTasks = parameters.subTasks;
|
|
const length = subTasks.length;
|
|
const resultsOrPromises = new Array(length);
|
|
|
|
for (let i = 0; i < length; i++) {
|
|
const task = subTasks[i];
|
|
const geometry = task.geometry;
|
|
const moduleName = task.moduleName;
|
|
const modulePath = task.modulePath;
|
|
|
|
if (defined(moduleName) && defined(modulePath)) {
|
|
throw new DeveloperError("Must only set moduleName or modulePath");
|
|
}
|
|
|
|
if (defined(moduleName) || defined(modulePath)) {
|
|
resultsOrPromises[i] = getModule(
|
|
moduleName,
|
|
modulePath
|
|
).then((createFunction) => createFunction(geometry, task.offset));
|
|
} else {
|
|
// Already created geometry
|
|
resultsOrPromises[i] = geometry;
|
|
}
|
|
}
|
|
|
|
return Promise.all(resultsOrPromises).then(function (results) {
|
|
return PrimitivePipeline.packCreateGeometryResults(
|
|
results,
|
|
transferableObjects
|
|
);
|
|
});
|
|
}
|
|
export default createTaskProcessorWorker(createGeometry);
|