All files / engine/Source/Scene/GltfPipeline removeExtension.js

80% Statements 20/25
73.68% Branches 14/19
40% Functions 2/5
79.16% Lines 19/24

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65                          27x   27x       27x                           1293x 228x 228x 405x   1065x         328x   328x 13x 13x 11x 11x 11x       328x 861x 861x     328x          
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
 
  Iif (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];
        Eif (Object.keys(extensions).length === 0) {
          delete object.extensions;
        }
      }
    }
    for (const key in object) {
      Eif (Object.prototype.hasOwnProperty.call(object, key)) {
        removeExtensionAndTraverse(object[key], extension);
      }
    }
    return extensionData;
  }
}
 
export default removeExtension;