15832144755
2022-01-06 7b4c8991dca9cf2a809a95e239d144697d3afb56
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import ForEach from "./ForEach.js";
import Check from "../../Core/Check.js";
import defined from "../../Core/defined.js";
 
/**
 * Calls the provider handler function on each texture used by the material.
 * Mimics the behavior of functions in gltf-pipeline ForEach.
 * @param {Object} material The glTF material.
 * @param {forEachTextureInMaterial~handler} handler Function that is called for each texture in the material.
 *
 * @private
 */
function forEachTextureInMaterial(material, handler) {
  Check.typeOf.object("material", material);
  Check.defined("handler", handler);
 
  // Metallic roughness
  const pbrMetallicRoughness = material.pbrMetallicRoughness;
  if (defined(pbrMetallicRoughness)) {
    if (defined(pbrMetallicRoughness.baseColorTexture)) {
      const textureInfo = pbrMetallicRoughness.baseColorTexture;
      const value = handler(textureInfo.index, textureInfo);
      if (defined(value)) {
        return value;
      }
    }
    if (defined(pbrMetallicRoughness.metallicRoughnessTexture)) {
      const textureInfo = pbrMetallicRoughness.metallicRoughnessTexture;
      const value = handler(textureInfo.index, textureInfo);
      if (defined(value)) {
        return value;
      }
    }
  }
 
  if (defined(material.extensions)) {
    // Spec gloss extension
    const pbrSpecularGlossiness =
      material.extensions.KHR_materials_pbrSpecularGlossiness;
    if (defined(pbrSpecularGlossiness)) {
      if (defined(pbrSpecularGlossiness.diffuseTexture)) {
        const textureInfo = pbrSpecularGlossiness.diffuseTexture;
        const value = handler(textureInfo.index, textureInfo);
        if (defined(value)) {
          return value;
        }
      }
      if (defined(pbrSpecularGlossiness.specularGlossinessTexture)) {
        const textureInfo = pbrSpecularGlossiness.specularGlossinessTexture;
        const value = handler(textureInfo.index, textureInfo);
        if (defined(value)) {
          return value;
        }
      }
    }
 
    // Materials common extension (may be present in models converted from glTF 1.0)
    const materialsCommon = material.extensions.KHR_materials_common;
    if (defined(materialsCommon)) {
      const diffuse = materialsCommon.values.diffuse;
      const ambient = materialsCommon.values.ambient;
      const emission = materialsCommon.values.emission;
      const specular = materialsCommon.values.specular;
      if (defined(diffuse) && defined(diffuse.index)) {
        const value = handler(diffuse.index, diffuse);
        if (defined(value)) {
          return value;
        }
      }
      if (defined(ambient) && defined(ambient.index)) {
        const value = handler(ambient.index, ambient);
        if (defined(value)) {
          return value;
        }
      }
      if (defined(emission) && defined(emission.index)) {
        const value = handler(emission.index, emission);
        if (defined(value)) {
          return value;
        }
      }
      if (defined(specular) && defined(specular.index)) {
        const value = handler(specular.index, specular);
        if (defined(value)) {
          return value;
        }
      }
    }
  }
 
  // KHR_techniques_webgl extension
  const value = ForEach.materialValue(material, function (materialValue) {
    if (defined(materialValue.index)) {
      const value = handler(materialValue.index, materialValue);
      if (defined(value)) {
        return value;
      }
    }
  });
  if (defined(value)) {
    return value;
  }
 
  // Top level textures
  if (defined(material.emissiveTexture)) {
    const textureInfo = material.emissiveTexture;
    const value = handler(textureInfo.index, textureInfo);
    if (defined(value)) {
      return value;
    }
  }
 
  if (defined(material.normalTexture)) {
    const textureInfo = material.normalTexture;
    const value = handler(textureInfo.index, textureInfo);
    if (defined(value)) {
      return value;
    }
  }
 
  if (defined(material.occlusionTexture)) {
    const textureInfo = material.occlusionTexture;
    const value = handler(textureInfo.index, textureInfo);
    if (defined(value)) {
      return value;
    }
  }
}
 
/**
 * Function that is called for each texture in the material. If this function returns a value the for each stops and returns that value.
 * @callback forEachTextureInMaterial~handler
 * @param {Number} The texture index.
 * @param {Object} The texture info object.
 *
 * @private
 */
 
export default forEachTextureInMaterial;