removeExtension.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import ForEach from "./ForEach.js";
  2. import removeExtensionsUsed from "./removeExtensionsUsed.js";
  3. import defined from "../../Core/defined.js";
  4. /**
  5. * Removes an extension from gltf.extensions, gltf.extensionsUsed, gltf.extensionsRequired, and any other objects in the glTF if it is present.
  6. *
  7. * @param {object} gltf A javascript object containing a glTF asset.
  8. * @param {string} extension The extension to remove.
  9. *
  10. * @returns {*} The extension data removed from gltf.extensions.
  11. */
  12. function removeExtension(gltf, extension) {
  13. removeExtensionsUsed(gltf, extension); // Also removes from extensionsRequired
  14. if (extension === "CESIUM_RTC") {
  15. removeCesiumRTC(gltf);
  16. }
  17. return removeExtensionAndTraverse(gltf, extension);
  18. }
  19. function removeCesiumRTC(gltf) {
  20. ForEach.technique(gltf, function (technique) {
  21. ForEach.techniqueUniform(technique, function (uniform) {
  22. if (uniform.semantic === "CESIUM_RTC_MODELVIEW") {
  23. uniform.semantic = "MODELVIEW";
  24. }
  25. });
  26. });
  27. }
  28. function removeExtensionAndTraverse(object, extension) {
  29. if (Array.isArray(object)) {
  30. const length = object.length;
  31. for (let i = 0; i < length; ++i) {
  32. removeExtensionAndTraverse(object[i], extension);
  33. }
  34. } else if (
  35. object !== null &&
  36. typeof object === "object" &&
  37. object.constructor === Object
  38. ) {
  39. const extensions = object.extensions;
  40. let extensionData;
  41. if (defined(extensions)) {
  42. extensionData = extensions[extension];
  43. if (defined(extensionData)) {
  44. delete extensions[extension];
  45. if (Object.keys(extensions).length === 0) {
  46. delete object.extensions;
  47. }
  48. }
  49. }
  50. for (const key in object) {
  51. if (Object.prototype.hasOwnProperty.call(object, key)) {
  52. removeExtensionAndTraverse(object[key], extension);
  53. }
  54. }
  55. return extensionData;
  56. }
  57. }
  58. export default removeExtension;