UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

6 lines (5 loc) 7.64 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.33/esri/copyright.txt for details. */ import{validateColorAndOpacity as e,validateColor as o}from"../../../../core/colorUtils.js";import has from"../../../../core/has.js";import{clamp as r}from"../../../../core/mathUtils.js";import{EmissiveSourceMode as s}from"../../../../symbols/support/materialUtils.js";import{TextureUsage as a,TextureEncoding as t,uncompressedFormats as l,compressibleUsages as n}from"./enums.js";import{RenderTexture as i}from"../../webgl-engine/core/material/RenderTexture.js";import{getEllipsoidMode as u}from"../../webgl-engine/core/shaderLibrary/util/EllipsoidMode.js";import{CullFaceOptions as c,AlphaDiscardMode as m,TextureEncodingMimeType as d}from"../../webgl-engine/lib/basicInterfaces.js";import{Texture as p}from"../../webgl-engine/lib/Texture.js";import{useSchematicPBRI3S as g,useSchematicPBR as f,schematicMRRFactors as h,advancedMRRFactors as T}from"../../webgl-engine/materials/pbrUtils.js";import{TextureWrapMode as x}from"../../../webgl/enums.js";import{alphaCutoff as F}from"../../../../webscene/support/AlphaCutoff.js";function b(o,r,s){const t=new Map,l=(e,o)=>{if(null==e)return-1;const r=t.get(e.id);if(r)return r.usage|=o,r.id;const s=t.size;return t.set(e.id,{id:s,usage:o}),s},n=r.pbrMetallicRoughness,i=n?.baseColorFactor?e(n.baseColorFactor):null,u=r.emissiveFactor,m=has("disable-feature:diffuse-rendering-i3s")||s?g({normalTexture:r.normalTexture,emissiveTexture:r.emissiveTexture,emissiveFactor:r.emissiveFactor,occlusionTexture:r.occlusionTexture,metallicRoughnessTexture:n?.metallicRoughnessTexture,metallicFactor:n?.metallicFactor,roughnessFactor:n?.roughnessFactor}):f({normalTexture:r.normalTexture,emissiveTexture:r.emissiveTexture,emissiveFactor:r.emissiveFactor,occlusionTexture:r.occlusionTexture,metallicRoughnessTexture:n?.metallicRoughnessTexture,metallicFactor:n?.metallicFactor,roughnessFactor:n?.roughnessFactor}),d=m?h[0]:n?.metallicFactor??T[0],p=m?h[1]:n?.roughnessFactor??T[1],x="mask"===r.alphaMode?a.Color|a.AlphaMask:a.Color,F={baseColorFactor:i?[i[0],i[1],i[2],i[3]]:[1,1,1,1],baseColorTextureId:l(n?.baseColorTexture,x),metallicRoughnessTextureId:l(n?.metallicRoughnessTexture,a.MetallicRoughness),metallicFactor:d,roughnessFactor:p},b={alphaMode:r.alphaMode,alphaCutoff:r.alphaCutoff,doubleSided:r.doubleSided,cullFace:"none"===r.cullFace?c.None:"back"===r.cullFace?c.Back:"front"===r.cullFace?c.Front:c.None,normalTextureId:l(r.normalTexture,a.Normal),emissiveTextureId:l(r.emissiveTexture,a.Emissive),occlusionTextureId:l(r.occlusionTexture,a.Occlusion),emissiveFactor:u?[u[0],u[1],u[2]]:[0,0,0],metallicRoughness:F,wrapTextures:!1,hasParametersFromSource:m},M=[];return t.forEach((({usage:e},r)=>{const s=null!=o&&o[r]&&o[r].formats,a=s?C(s.map((({name:e,format:o})=>({name:e,encoding:S[o]})))):[];M.push({id:r,usage:e,encodings:a})})),{material:b,textures:M}}function C(e){return e.sort(((e,o)=>e.encoding-o.encoding))}const S={ktx2:t.KTX2,basis:t.Basis,dds:t.DDS_S3TC,png:t.PNG,jpg:t.JPG,"ktx-etc2":t.KTX_ETC2},M={[d.KTX2_ENCODING]:t.Basis,[d.BASIS_ENCODING]:t.Basis,[d.DDS_ENCODING]:t.DDS_S3TC,"image/png":t.PNG,"image/jpg":t.JPG,"image/jpeg":t.JPG,"image/ktx":t.KTX_ETC2};function P(e){const s=e?.materialDefinitions?Object.keys(e.materialDefinitions)[0]:null,t=e?.textureDefinitions?Object.keys(e.textureDefinitions)[0]:null,l=s?e.materialDefinitions?.[s]:null,n=t?e.textureDefinitions?.[t]:null,i=D();if(null!=l){const e=l.params;e.diffuse&&(o(e.diffuse),i.metallicRoughness.baseColorFactor=[e.diffuse[0],e.diffuse[1],e.diffuse[2],1]),null!=e.doubleSided&&(i.doubleSided=e.doubleSided,i.cullFace=e.doubleSided?c.None:c.Back),"none"!==e.cullFace&&"front"!==e.cullFace&&"back"!==e.cullFace||(i.cullFace="none"===e.cullFace?c.None:"back"===e.cullFace?c.Back:c.Front),e.transparency&&(i.metallicRoughness.baseColorFactor[3]=r(1-e.transparency,0,1)),(e.useVertexColorAlpha||i.metallicRoughness.baseColorFactor[3]<1)&&(i.alphaMode="blend")}const u=[];if(null!=n){const e=0;!n.wrap||"repeat"!==n.wrap[0]&&"repeat"!==n.wrap[1]||(i.wrapTextures=!0);let o=a.Color;"rgba"===n.channels&&(i.alphaMode="blend",o|=a.AlphaMask);const r=n.images.length-1,s=n.images[r],t=e=>e?.split("/").pop(),l=Array.isArray(n.encoding)?C(n.encoding.map(((e,o)=>({name:t(s.href[o]),encoding:M[e]||0})))):[{name:t(s.href),encoding:M[n.encoding]||0}];u.push({id:e,usage:o,encodings:l}),i.metallicRoughness.baseColorTextureId=e}return{material:i,textures:u}}const D=()=>({alphaMode:"opaque",alphaCutoff:F,doubleSided:!0,cullFace:c.None,normalTextureId:-1,emissiveTextureId:-1,occlusionTextureId:-1,emissiveFactor:[0,0,0],metallicRoughness:{baseColorFactor:[.8,.8,.8,1],baseColorTextureId:-1,metallicRoughnessTextureId:-1,metallicFactor:0,roughnessFactor:.6},wrapTextures:!1,hasParametersFromSource:!0});function R(e,o,r,s,t,l){if(null==e?.data)return null;const n=e.data,i=s.renderingContext.parameters.maxMaxAnisotropy,u=i>1,c=r||!o.wrapTextures?w:E,m=G(e.encoding),d=e.usage&a.Color?"opaque"===o.alphaMode?3:4:3,g=j(e.encoding,e.usage)?{compressionTracker:t,compressionCallback:l}:void 0;return new p(n,{mipmap:u,maxAnisotropy:i,encoding:m,wrap:c,components:d,compressionOptions:g,noUnpackFlip:!0})}const w={s:x.CLAMP_TO_EDGE,t:x.CLAMP_TO_EDGE},E={s:x.REPEAT,t:x.REPEAT};function N(o,r,t,l,n,c){const d=c.rendererTextureUsage,p=e=>v(l,t,e&d),g=e(r.metallicRoughness.baseColorFactor);o.baseColor=[g[0],g[1],g[2],g[3]],o.hasParametersFromSource=!!r.hasParametersFromSource,o.usePBR=c.usePBR,o.mrrFactors=[r.metallicRoughness.metallicFactor,r.metallicRoughness.roughnessFactor,r.hasParametersFromSource?h[2]:T[2]],o.emissiveBaseColor=r.emissiveFactor,o.emissiveSource=s.Emissive,o.isIntegratedMesh=c.isIntegratedMesh,o.textureAlphaCutoff="mask"===r.alphaMode?r.alphaCutoff:F,o.alphaDiscardMode="opaque"===r.alphaMode?m.Opaque:"mask"===r.alphaMode?m.Mask:m.MaskBlend;const f=[],x=p(a.Color|a.AlphaMask);null!=x&&(o.baseColorTexture=new i(n,x),f.push(o.baseColorTexture.loadPromise));const b=p(a.MetallicRoughness);null!=b&&(o.metallicRoughnessTexture=new i(n,b),f.push(o.metallicRoughnessTexture.loadPromise));const C=p(a.Emissive);null!=C&&(o.emissionTexture=new i(n,C),f.push(o.emissionTexture.loadPromise));const S=p(a.Occlusion);null!=S&&(o.occlusionTexture=new i(n,S),f.push(o.occlusionTexture.loadPromise));const M=p(a.Normal);return null!=M&&(o.normalTexture=new i(n,M),f.push(o.normalTexture.loadPromise)),o.commonMaterialParameters.hasSlicePlane=c.slicePlaneEnabled,o.commonMaterialParameters.doubleSided=r.doubleSided,o.commonMaterialParameters.cullFace=r.cullFace,o.ellipsoidMode=u(c.viewSpatialReference),Promise.all(f)}function k(e){const o=!!e.compressedTextureS3TC,r=!!e.compressedTextureETC,s=has("disable-feature:i3s-basis")?0:t.Basis|t.KTX2,a=t.JPG|t.PNG,l=s|t.DDS_S3TC;return a|(o?l:0)|(r?s:0)}function I(e,o){if(null!=o)return e.find((e=>0!==(e.encoding&o)))}function v(e,o,r){if(null==e||r===a.None)return null;for(let s=0;s<e.length;s++){const a=e[s];if(null!=a&&0!==(a.usage&r)){const e=o[s];return null!=e?e.id:null}}return null}function j(e,o){return!!has("enable-feature:esri-compress-IM-textures")&&(0!==(e&l)&&!(o&~n))}function G(e){switch(e){case t.KTX2:return d.KTX2_ENCODING;case t.Basis:return d.BASIS_ENCODING;case t.DDS_S3TC:return d.DDS_ENCODING;case t.PNG:return"image/png";case t.JPG:return"image/jpeg";case t.KTX_ETC2:return"image/ktx";default:return""}}export{N as configureMaterial,R as createTexture,D as defaultMaterial,b as getMaterialAndTextures,P as getMaterialAndTexturesFromShared,k as getSupportedEncodings,I as selectEncoding};