123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- 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;
|