moveTechniquesToExtension.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. var techniquesLegacy = gltf.techniques;
  16. var mappedUniforms = {};
  17. var updatedTechniqueIndices = {};
  18. if (defined(techniquesLegacy)) {
  19. var extension = {
  20. programs: [],
  21. shaders: [],
  22. techniques: []
  23. };
  24. // Some 1.1 models have a glExtensionsUsed property that can be transferred to program.glExtensions
  25. var glExtensions = gltf.glExtensionsUsed;
  26. delete gltf.glExtensionsUsed;
  27. ForEach.technique(gltf, function (techniqueLegacy, techniqueIndex) {
  28. var technique = {
  29. name: techniqueLegacy.name,
  30. program: undefined,
  31. attributes: {},
  32. uniforms: {}
  33. };
  34. var parameterLegacy;
  35. ForEach.techniqueAttribute(techniqueLegacy, function (parameterName, attributeName) {
  36. parameterLegacy = techniqueLegacy.parameters[parameterName];
  37. technique.attributes[attributeName] = {
  38. semantic: parameterLegacy.semantic
  39. };
  40. });
  41. ForEach.techniqueUniform(techniqueLegacy, function (parameterName, uniformName) {
  42. parameterLegacy = techniqueLegacy.parameters[parameterName];
  43. technique.uniforms[uniformName] = {
  44. count: parameterLegacy.count,
  45. node: parameterLegacy.node,
  46. type: parameterLegacy.type,
  47. semantic: parameterLegacy.semantic,
  48. value: parameterLegacy.value
  49. };
  50. // Store the name of the uniform to update material values.
  51. mappedUniforms[parameterName] = uniformName;
  52. });
  53. var programLegacy = gltf.programs[techniqueLegacy.program];
  54. var program = {
  55. name: programLegacy.name,
  56. fragmentShader: undefined,
  57. vertexShader: undefined,
  58. glExtensions: glExtensions
  59. };
  60. var fs = gltf.shaders[programLegacy.fragmentShader];
  61. program.fragmentShader = addToArray(extension.shaders, fs, true);
  62. var vs = gltf.shaders[programLegacy.vertexShader];
  63. program.vertexShader = addToArray(extension.shaders, vs, true);
  64. technique.program = addToArray(extension.programs, program);
  65. // Store the index of the new technique to reference instead.
  66. updatedTechniqueIndices[techniqueIndex] = addToArray(extension.techniques, technique);
  67. });
  68. if (extension.techniques.length > 0) {
  69. if (!defined(gltf.extensions)) {
  70. gltf.extensions = {};
  71. }
  72. gltf.extensions.KHR_techniques_webgl = extension;
  73. addExtensionsUsed(gltf, 'KHR_techniques_webgl');
  74. addExtensionsRequired(gltf, 'KHR_techniques_webgl');
  75. }
  76. }
  77. ForEach.material(gltf, function (material) {
  78. if (defined(material.technique)) {
  79. var materialExtension = {
  80. technique: updatedTechniqueIndices[material.technique]
  81. };
  82. ForEach.objectLegacy(material.values, function (value, parameterName) {
  83. if (!defined(materialExtension.values)) {
  84. materialExtension.values = {};
  85. }
  86. var uniformName = mappedUniforms[parameterName];
  87. materialExtension.values[uniformName] = value;
  88. });
  89. if (!defined(material.extensions)) {
  90. material.extensions = {};
  91. }
  92. material.extensions.KHR_techniques_webgl = materialExtension;
  93. }
  94. delete material.technique;
  95. delete material.values;
  96. });
  97. delete gltf.techniques;
  98. delete gltf.programs;
  99. delete gltf.shaders;
  100. return gltf;
  101. }
  102. export default moveTechniquesToExtension;