65 lines
1.9 KiB
JavaScript
65 lines
1.9 KiB
JavaScript
import ForEach from "./ForEach.js";
|
|
import removeExtensionsUsed from "./removeExtensionsUsed.js";
|
|
import defined from "../../Core/defined.js";
|
|
|
|
/**
|
|
* Removes an extension from gltf.extensions, gltf.extensionsUsed, gltf.extensionsRequired, and any other objects in the glTF if it is present.
|
|
*
|
|
* @param {object} gltf A javascript object containing a glTF asset.
|
|
* @param {string} extension The extension to remove.
|
|
*
|
|
* @returns {*} The extension data removed from gltf.extensions.
|
|
*/
|
|
function removeExtension(gltf, extension) {
|
|
removeExtensionsUsed(gltf, extension); // Also removes from extensionsRequired
|
|
|
|
if (extension === "CESIUM_RTC") {
|
|
removeCesiumRTC(gltf);
|
|
}
|
|
|
|
return removeExtensionAndTraverse(gltf, extension);
|
|
}
|
|
|
|
function removeCesiumRTC(gltf) {
|
|
ForEach.technique(gltf, function (technique) {
|
|
ForEach.techniqueUniform(technique, function (uniform) {
|
|
if (uniform.semantic === "CESIUM_RTC_MODELVIEW") {
|
|
uniform.semantic = "MODELVIEW";
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
function removeExtensionAndTraverse(object, extension) {
|
|
if (Array.isArray(object)) {
|
|
const length = object.length;
|
|
for (let i = 0; i < length; ++i) {
|
|
removeExtensionAndTraverse(object[i], extension);
|
|
}
|
|
} else if (
|
|
object !== null &&
|
|
typeof object === "object" &&
|
|
object.constructor === Object
|
|
) {
|
|
const extensions = object.extensions;
|
|
let extensionData;
|
|
if (defined(extensions)) {
|
|
extensionData = extensions[extension];
|
|
if (defined(extensionData)) {
|
|
delete extensions[extension];
|
|
if (Object.keys(extensions).length === 0) {
|
|
delete object.extensions;
|
|
}
|
|
}
|
|
}
|
|
for (const key in object) {
|
|
if (Object.prototype.hasOwnProperty.call(object, key)) {
|
|
removeExtensionAndTraverse(object[key], extension);
|
|
}
|
|
}
|
|
return extensionData;
|
|
}
|
|
}
|
|
|
|
export default removeExtension;
|