@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 3.38 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.32/esri/copyright.txt for details.
*/
import e from"../../../../Color.js";import o from"../../../../core/Error.js";import{loadImageAsync as t}from"../../../../support/requestUtils.js";import{EncodedMeshTexture as r}from"../../glTF/internal/resourceUtils.js";import{TextureUsage as a,TextureEncoding as s}from"./enums.js";import{CullFaceOptions as n}from"../../webgl-engine/lib/basicInterfaces.js";import{downsampleImage as l}from"../../webgl-engine/lib/textureUtils.js";import{useSchematicPBR as i,schematicMRRFactors as u}from"../../webgl-engine/materials/pbrUtils.js";import{alphaCutoff as c}from"../../../../webscene/support/AlphaCutoff.js";async function m(o){const t=[],r=[];if(null==o){return{material:{alphaMode:"opaque",alphaCutoff:c,doubleSided:!0,cullFace:0,normalTextureId:-1,emissiveTextureId:-1,occlusionTextureId:-1,emissiveFactor:[0,0,0],metallicRoughness:{baseColorFactor:[1,1,1,1],baseColorTextureId:-1,metallicRoughnessTextureId:-1,metallicFactor:0,roughnessFactor:.6000000238418579},wrapTextures:!1,hasParametersFromSource:!0},requiredTextures:t,textureData:r}}const s=g(o);"auto"===o.alphaMode&&console.warn('alphaMode "auto" not supported by I3S PBRMaterial - defaulting to "blend".');const l=i({normalTexture:o.normalTexture,emissiveTexture:s?o.emissiveTexture:null,emissiveFactor:s?e.toUnitRGB(o.emissiveColor):null,occlusionTexture:s?o.occlusionTexture:null,metallicRoughnessTexture:s?o.metallicRoughnessTexture:null,metallicFactor:s?o.metallic:null,roughnessFactor:s?o.roughness:null}),m=l?u[0]:s?o.metallic:0,p=l?u[1]:s?o.roughness:0;return{material:{alphaMode:"auto"===o.alphaMode?"blend":o.alphaMode,alphaCutoff:o.alphaCutoff,doubleSided:o.doubleSided,cullFace:o.doubleSided?n.None:n.Back,normalTextureId:await d(o.normalTexture,t,r,a.Normal),emissiveTextureId:s?await d(o.emissiveTexture,t,r,a.Emissive):-1,occlusionTextureId:s?await d(o.occlusionTexture,t,r,a.Occlusion):-1,emissiveFactor:s&&null!=o.emissiveColor?e.toUnitRGB(o.emissiveColor):[0,0,0],metallicRoughness:{baseColorFactor:null!=o.color?e.toUnitRGBA(o.color):[1,1,1,1],baseColorTextureId:await d(o.colorTexture,t,r,a.Color),metallicRoughnessTextureId:s?await d(o.metallicRoughnessTexture,t,r,a.MetallicRoughness):-1,metallicFactor:m,roughnessFactor:p},wrapTextures:!0,hasParametersFromSource:l},requiredTextures:t,textureData:r}}async function d(e,a,n,i){if(null==e)return-1;const u=n.length,c=e.data,m=e.url;if(null!=c){if(c instanceof HTMLImageElement||c instanceof HTMLCanvasElement){const e=l(c);return n.push({id:u,usage:i,data:e,encoding:s.PNG,downsampled:!1}),a.push({id:u,usage:i,encodings:[{name:void 0,encoding:s.PNG}]}),u}if(c instanceof HTMLVideoElement)return-1;if(c instanceof ImageData)throw new o("ImageData textures not supported yet for client side I3S nodes");if(c instanceof r)return n.push({id:u,usage:i,data:c.data,encoding:s.KTX2,downsampled:!1}),a.push({id:u,usage:i,encodings:[{name:void 0,encoding:s.KTX2}]}),u}else if(null!=m){const e=new Image;e.src=m;const o=await t(e,e.src,!1,void 0),r=l(o);return n.push({id:u,usage:i,data:r,encoding:s.PNG,downsampled:!1}),a.push({id:u,usage:i,encodings:[{name:void 0,encoding:s.PNG}]}),u}return-1}function g(e){return e.hasOwnProperty("metallicRoughnessTexture")}export{m as convertMeshMaterialToPBRMaterial};