addDefaults.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import addToArray from './addToArray.js'
  2. import ForEach from './ForEach.js'
  3. import getAccessorByteStride from './getAccessorByteStride.js'
  4. import defaultValue from '../../Core/defaultValue.js'
  5. import defined from '../../Core/defined.js'
  6. import WebGLConstants from '../../Core/WebGLConstants.js'
  7. /**
  8. * Adds default glTF values if they don't exist.
  9. *
  10. * @param {Object} gltf A javascript object containing a glTF asset.
  11. * @returns {Object} The modified glTF.
  12. *
  13. * @private
  14. */
  15. function addDefaults(gltf) {
  16. ForEach.accessor(gltf, function(accessor) {
  17. if (defined(accessor.bufferView)) {
  18. accessor.byteOffset = defaultValue(accessor.byteOffset, 0);
  19. }
  20. });
  21. ForEach.bufferView(gltf, function(bufferView) {
  22. if (defined(bufferView.buffer)) {
  23. bufferView.byteOffset = defaultValue(bufferView.byteOffset, 0);
  24. }
  25. });
  26. ForEach.mesh(gltf, function(mesh) {
  27. ForEach.meshPrimitive(mesh, function(primitive) {
  28. primitive.mode = defaultValue(primitive.mode, WebGLConstants.TRIANGLES);
  29. if (!defined(primitive.material)) {
  30. if (!defined(gltf.materials)) {
  31. gltf.materials = [];
  32. }
  33. var defaultMaterial = {
  34. name: 'default'
  35. };
  36. primitive.material = addToArray(gltf.materials, defaultMaterial);
  37. }
  38. });
  39. });
  40. ForEach.accessorContainingVertexAttributeData(gltf, function(accessorId) {
  41. var accessor = gltf.accessors[accessorId];
  42. var bufferViewId = accessor.bufferView;
  43. accessor.normalized = defaultValue(accessor.normalized, false);
  44. if (defined(bufferViewId)) {
  45. var bufferView = gltf.bufferViews[bufferViewId];
  46. bufferView.byteStride = getAccessorByteStride(gltf, accessor);
  47. bufferView.target = WebGLConstants.ARRAY_BUFFER;
  48. }
  49. });
  50. ForEach.accessorContainingIndexData(gltf, function(accessorId) {
  51. var accessor = gltf.accessors[accessorId];
  52. var bufferViewId = accessor.bufferView;
  53. if (defined(bufferViewId)) {
  54. var bufferView = gltf.bufferViews[bufferViewId];
  55. bufferView.target = WebGLConstants.ELEMENT_ARRAY_BUFFER;
  56. }
  57. });
  58. ForEach.material(gltf, function(material) {
  59. var extensions = defaultValue(material.extensions, defaultValue.EMPTY_OBJECT);
  60. var materialsCommon = extensions.KHR_materials_common;
  61. if (defined(materialsCommon)) {
  62. var technique = materialsCommon.technique;
  63. var values = defined(materialsCommon.values) ? materialsCommon.values : {};
  64. materialsCommon.values = values;
  65. values.ambient = defined(values.ambient) ? values.ambient : [0.0, 0.0, 0.0, 1.0];
  66. values.emission = defined(values.emission) ? values.emission : [0.0, 0.0, 0.0, 1.0];
  67. values.transparency = defaultValue(values.transparency, 1.0);
  68. values.transparent = defaultValue(values.transparent, false);
  69. values.doubleSided = defaultValue(values.doubleSided, false);
  70. if (technique !== 'CONSTANT') {
  71. values.diffuse = defined(values.diffuse) ? values.diffuse : [0.0, 0.0, 0.0, 1.0];
  72. if (technique !== 'LAMBERT') {
  73. values.specular = defined(values.specular) ? values.specular : [0.0, 0.0, 0.0, 1.0];
  74. values.shininess = defaultValue(values.shininess, 0.0);
  75. }
  76. }
  77. return;
  78. }
  79. material.emissiveFactor = defaultValue(material.emissiveFactor, [0.0, 0.0, 0.0]);
  80. material.alphaMode = defaultValue(material.alphaMode, 'OPAQUE');
  81. material.doubleSided = defaultValue(material.doubleSided, false);
  82. if (material.alphaMode === 'MASK') {
  83. material.alphaCutoff = defaultValue(material.alphaCutoff, 0.5);
  84. }
  85. var techniquesExtension = extensions.KHR_techniques_webgl;
  86. if (defined(techniquesExtension)) {
  87. ForEach.materialValue(material, function (materialValue) {
  88. // Check if material value is a TextureInfo object
  89. if (defined(materialValue.index)) {
  90. addTextureDefaults(materialValue);
  91. }
  92. });
  93. }
  94. addTextureDefaults(material.emissiveTexture);
  95. addTextureDefaults(material.normalTexture);
  96. addTextureDefaults(material.occlusionTexture);
  97. var pbrMetallicRoughness = material.pbrMetallicRoughness;
  98. if (defined(pbrMetallicRoughness)) {
  99. pbrMetallicRoughness.baseColorFactor = defaultValue(pbrMetallicRoughness.baseColorFactor, [1.0, 1.0, 1.0, 1.0]);
  100. pbrMetallicRoughness.metallicFactor = defaultValue(pbrMetallicRoughness.metallicFactor, 1.0);
  101. pbrMetallicRoughness.roughnessFactor = defaultValue(pbrMetallicRoughness.roughnessFactor, 1.0);
  102. addTextureDefaults(pbrMetallicRoughness.baseColorTexture);
  103. addTextureDefaults(pbrMetallicRoughness.metallicRoughnessTexture);
  104. }
  105. var pbrSpecularGlossiness = extensions.pbrSpecularGlossiness;
  106. if (defined(pbrSpecularGlossiness)) {
  107. pbrSpecularGlossiness.diffuseFactor = defaultValue(pbrSpecularGlossiness.diffuseFactor, [1.0, 1.0, 1.0, 1.0]);
  108. pbrSpecularGlossiness.specularFactor = defaultValue(pbrSpecularGlossiness.specularFactor, [1.0, 1.0, 1.0]);
  109. pbrSpecularGlossiness.glossinessFactor = defaultValue(pbrSpecularGlossiness.glossinessFactor, 1.0);
  110. addTextureDefaults(pbrSpecularGlossiness.specularGlossinessTexture);
  111. }
  112. });
  113. ForEach.animation(gltf, function(animation) {
  114. ForEach.animationSampler(animation, function(sampler) {
  115. sampler.interpolation = defaultValue(sampler.interpolation, 'LINEAR');
  116. });
  117. });
  118. var animatedNodes = getAnimatedNodes(gltf);
  119. ForEach.node(gltf, function(node, id) {
  120. var animated = defined(animatedNodes[id]);
  121. if (animated || defined(node.translation) || defined(node.rotation) || defined(node.scale)) {
  122. node.translation = defaultValue(node.translation, [0.0, 0.0, 0.0]);
  123. node.rotation = defaultValue(node.rotation, [0.0, 0.0, 0.0, 1.0]);
  124. node.scale = defaultValue(node.scale, [1.0, 1.0, 1.0]);
  125. } else {
  126. node.matrix = defaultValue(node.matrix, [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0]);
  127. }
  128. });
  129. ForEach.sampler(gltf, function(sampler) {
  130. sampler.wrapS = defaultValue(sampler.wrapS, WebGLConstants.REPEAT);
  131. sampler.wrapT = defaultValue(sampler.wrapT, WebGLConstants.REPEAT);
  132. });
  133. if (defined(gltf.scenes) && !defined(gltf.scene)) {
  134. gltf.scene = 0;
  135. }
  136. return gltf;
  137. }
  138. function getAnimatedNodes(gltf) {
  139. var nodes = {};
  140. ForEach.animation(gltf, function(animation) {
  141. ForEach.animationChannel(animation, function(channel) {
  142. var target = channel.target;
  143. var nodeId = target.node;
  144. var path = target.path;
  145. // Ignore animations that target 'weights'
  146. if (path === 'translation' || path === 'rotation' || path === 'scale') {
  147. nodes[nodeId] = true;
  148. }
  149. });
  150. });
  151. return nodes;
  152. }
  153. function addTextureDefaults(texture) {
  154. if (defined(texture)) {
  155. texture.texCoord = defaultValue(texture.texCoord, 0);
  156. }
  157. }
  158. export default addDefaults;