moveTechniquesToExtension.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import addExtensionsUsed from "./addExtensionsUsed.js";
  2. import addExtensionsRequired from "./addExtensionsRequired.js";
  3. import addToArray from "./addToArray.js";
  4. import ForEach from "./ForEach.js";
  5. import defined from "../../Core/defined.js";
  6. /**
  7. * Move glTF 1.0 material techniques to glTF 2.0 KHR_techniques_webgl extension.
  8. *
  9. * @param {object} gltf A javascript object containing a glTF asset.
  10. * @returns {object} The updated glTF asset.
  11. *
  12. * @private
  13. */
  14. function moveTechniquesToExtension(gltf) {
  15. const techniquesLegacy = gltf.techniques;
  16. const mappedUniforms = {};
  17. const updatedTechniqueIndices = {};
  18. const seenPrograms = {};
  19. if (defined(techniquesLegacy)) {
  20. const extension = {
  21. programs: [],
  22. shaders: [],
  23. techniques: [],
  24. };
  25. // Some 1.1 models have a glExtensionsUsed property that can be transferred to program.glExtensions
  26. const glExtensions = gltf.glExtensionsUsed;
  27. delete gltf.glExtensionsUsed;
  28. ForEach.technique(gltf, function (techniqueLegacy, techniqueId) {
  29. const technique = {
  30. name: techniqueLegacy.name,
  31. program: undefined,
  32. attributes: {},
  33. uniforms: {},
  34. };
  35. let parameterLegacy;
  36. ForEach.techniqueAttribute(
  37. techniqueLegacy,
  38. function (parameterName, attributeName) {
  39. parameterLegacy = techniqueLegacy.parameters[parameterName];
  40. technique.attributes[attributeName] = {
  41. semantic: parameterLegacy.semantic,
  42. };
  43. }
  44. );
  45. ForEach.techniqueUniform(
  46. techniqueLegacy,
  47. function (parameterName, uniformName) {
  48. parameterLegacy = techniqueLegacy.parameters[parameterName];
  49. technique.uniforms[uniformName] = {
  50. count: parameterLegacy.count,
  51. node: parameterLegacy.node,
  52. type: parameterLegacy.type,
  53. semantic: parameterLegacy.semantic,
  54. value: parameterLegacy.value,
  55. };
  56. // Store the name of the uniform to update material values.
  57. if (!defined(mappedUniforms[techniqueId])) {
  58. mappedUniforms[techniqueId] = {};
  59. }
  60. mappedUniforms[techniqueId][parameterName] = uniformName;
  61. }
  62. );
  63. if (!defined(seenPrograms[techniqueLegacy.program])) {
  64. const programLegacy = gltf.programs[techniqueLegacy.program];
  65. const program = {
  66. name: programLegacy.name,
  67. fragmentShader: undefined,
  68. vertexShader: undefined,
  69. glExtensions: glExtensions,
  70. };
  71. const fs = gltf.shaders[programLegacy.fragmentShader];
  72. program.fragmentShader = addToArray(extension.shaders, fs, true);
  73. const vs = gltf.shaders[programLegacy.vertexShader];
  74. program.vertexShader = addToArray(extension.shaders, vs, true);
  75. technique.program = addToArray(extension.programs, program);
  76. seenPrograms[techniqueLegacy.program] = technique.program;
  77. } else {
  78. technique.program = seenPrograms[techniqueLegacy.program];
  79. }
  80. // Store the index of the new technique to reference instead.
  81. updatedTechniqueIndices[techniqueId] = addToArray(
  82. extension.techniques,
  83. technique
  84. );
  85. });
  86. if (extension.techniques.length > 0) {
  87. if (!defined(gltf.extensions)) {
  88. gltf.extensions = {};
  89. }
  90. gltf.extensions.KHR_techniques_webgl = extension;
  91. addExtensionsUsed(gltf, "KHR_techniques_webgl");
  92. addExtensionsRequired(gltf, "KHR_techniques_webgl");
  93. }
  94. }
  95. ForEach.material(gltf, function (material) {
  96. if (defined(material.technique)) {
  97. const materialExtension = {
  98. technique: updatedTechniqueIndices[material.technique],
  99. };
  100. ForEach.objectLegacy(material.values, function (value, parameterName) {
  101. if (!defined(materialExtension.values)) {
  102. materialExtension.values = {};
  103. }
  104. const uniformName = mappedUniforms[material.technique][parameterName];
  105. if (defined(uniformName)) {
  106. materialExtension.values[uniformName] = value;
  107. }
  108. });
  109. if (!defined(material.extensions)) {
  110. material.extensions = {};
  111. }
  112. material.extensions.KHR_techniques_webgl = materialExtension;
  113. }
  114. delete material.technique;
  115. delete material.values;
  116. });
  117. delete gltf.techniques;
  118. delete gltf.programs;
  119. delete gltf.shaders;
  120. return gltf;
  121. }
  122. export default moveTechniquesToExtension;