UNPKG

@arcgis/core

Version:

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

3 lines (2 loc) 6.4 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */ import{validateColorAndOpacity as e,validateColor as r}from"../../../../core/colorUtils.js";import has from"../../../../core/has.js";import{clamp as a}from"../../../../core/mathUtils.js";import{clone as o}from"../../../../core/libs/gl-matrix-2/factories/vec4f64.js";import{uncompressedFormats as t,compressibleUsages as s}from"./enums.js";import{RenderTexture as n}from"../../webgl-engine/core/material/RenderTexture.js";import{getEllipsoidMode as l}from"../../webgl-engine/core/shaderLibrary/util/EllipsoidMode.js";import{ManagedTexture as i}from"../../webgl-engine/lib/ManagedTexture.js";import{useSchematicPBR as u,schematicMRRFactors as c,advancedMRRFactors as m}from"../../webgl-engine/materials/pbrUtils.js";import{alphaCutoff as d}from"../../../../webscene/support/AlphaCutoff.js";function p(r,a,o){const t=new Map,s=(e,r)=>{if(null==e)return-1;const a=t.get(e.id);if(a)return a.usage|=r,a.id;const o=t.size;return t.set(e.id,{id:o,usage:r}),o},n=a.pbrMetallicRoughness,l=n?.baseColorFactor?e(n.baseColorFactor):null,i=a.emissiveFactor,d=o&&0===n?.metallicFactor||u({normalTexture:a.normalTexture,emissiveTexture:a.emissiveTexture,emissiveFactor:a.emissiveFactor,occlusionTexture:a.occlusionTexture,metallicRoughnessTexture:n?.metallicRoughnessTexture,metallicFactor:n?.metallicFactor,roughnessFactor:n?.roughnessFactor}),p=d?c[0]:n?.metallicFactor??m[0],h=d?c[1]:n?.roughnessFactor??m[1],x="mask"===a.alphaMode?33:1,b={baseColorFactor:l?[l[0],l[1],l[2],l[3]]:[1,1,1,1],baseColorTextureId:s(n?.baseColorTexture,x),metallicRoughnessTextureId:s(n?.metallicRoughnessTexture,2),metallicFactor:p,roughnessFactor:h},F={alphaMode:a.alphaMode,alphaCutoff:a.alphaCutoff,doubleSided:a.doubleSided,cullFace:"none"===a.cullFace?0:"back"===a.cullFace?2:"front"===a.cullFace?1:0,normalTextureId:s(a.normalTexture,4),emissiveTextureId:s(a.emissiveTexture,16),occlusionTextureId:s(a.occlusionTexture,8),emissiveFactor:i?[i[0],i[1],i[2]]:[0,0,0],metallicRoughness:b,wrapTextures:!1,hasParametersFromSource:d},T=[];return t.forEach(({usage:e},a)=>{const o=null!=r&&r[a]&&r[a].formats,t=o?g(o.map(({name:e,format:r})=>({name:e,encoding:f[r]}))):[];T.push({id:a,usage:e,encodings:t})}),{material:F,textures:T}}function g(e){return e.sort((e,r)=>e.encoding-r.encoding)}const f={ktx2:1,basis:2,dds:4,png:8,jpg:16,"ktx-etc2":32},h={"image/ktx2":2,"image/x.basis":2,"image/vnd-ms.dds":4,"image/png":8,"image/jpg":16,"image/jpeg":16,"image/ktx":32};function x(e){const o=e?.materialDefinitions?Object.keys(e.materialDefinitions)[0]:null,t=e?.textureDefinitions?Object.keys(e.textureDefinitions)[0]:null,s=o?e.materialDefinitions?.[o]:null,n=t?e.textureDefinitions?.[t]:null,l=b();if(null!=s){const e=s.params;e.diffuse&&(r(e.diffuse),l.metallicRoughness.baseColorFactor=[e.diffuse[0],e.diffuse[1],e.diffuse[2],1]),null!=e.doubleSided&&(l.doubleSided=e.doubleSided,l.cullFace=e.doubleSided?0:2),"none"!==e.cullFace&&"front"!==e.cullFace&&"back"!==e.cullFace||(l.cullFace="none"===e.cullFace?0:"back"===e.cullFace?2:1),e.transparency&&(l.metallicRoughness.baseColorFactor[3]=a(1-e.transparency,0,1)),(e.useVertexColorAlpha||l.metallicRoughness.baseColorFactor[3]<1)&&(l.alphaMode="blend")}const i=[];if(null!=n){const e=0;!n.wrap||"repeat"!==n.wrap[0]&&"repeat"!==n.wrap[1]||(l.wrapTextures=!0);let r=1;"rgba"===n.channels&&(l.alphaMode="blend",r|=32);const a=n.images.length-1,o=n.images[a],t=e=>e?.split("/").pop(),s=Array.isArray(n.encoding)?g(n.encoding.map((e,r)=>({name:t(o.href[r]),encoding:h[e]||0}))):[{name:t(o.href),encoding:h[n.encoding]||0}];i.push({id:e,usage:r,encodings:s}),l.metallicRoughness.baseColorTextureId=e}return{material:l,textures:i}}const b=()=>({alphaMode:"opaque",alphaCutoff:d,doubleSided:!0,cullFace:0,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 F(e,r,a,o,t,s){if(null==e?.data)return null;const n=e.data,l=o.renderingContext.parameters.maxMaxAnisotropy,u=l>1,c=a||!r.wrapTextures?T:C,m=v(e.encoding),d=1&e.usage?"opaque"===r.alphaMode?6407:6408:6407,p=k(e.encoding,e.usage)?{compressionTracker:t,compressionCallback:s}:void 0;return new i(n,{mipmap:u,maxAnisotropy:l,encoding:m,wrap:c,pixelFormat:d,compressionOptions:p,noUnpackFlip:!0})}const T={s:33071,t:33071},C={s:10497,t:10497};function M(r,a,t,s,i){const u=i.rendererTextureUsage,p=e=>w(t,a,e&u),g=[],f=e=>{const r=p(e);if(null==r)return null;const a=new n(s,r);return g.push(a.loadPromise),a},h=f(33),x=f(2),b=f(16),F=f(8),T=f(4),C={baseColor:o(e(r.metallicRoughness.baseColorFactor)),hasParametersFromSource:!!r.hasParametersFromSource,usePBR:i.usePBR,mrrFactors:[r.metallicRoughness.metallicFactor,r.metallicRoughness.roughnessFactor,r.hasParametersFromSource?c[2]:m[2]],emissiveBaseColor:r.emissiveFactor,isIntegratedMesh:i.isIntegratedMesh,textureAlphaCutoff:"mask"===r.alphaMode?r.alphaCutoff:d,alphaDiscardMode:"opaque"===r.alphaMode?1:"mask"===r.alphaMode?2:3,baseColorTexture:h,metallicRoughnessTexture:x,emissionTexture:b,occlusionTexture:F,normalTexture:T,slicePlaneEnabled:i.slicePlaneEnabled,doubleSided:r.doubleSided,cullFace:r.cullFace,ellipsoidMode:l(i.viewSpatialReference),sphereDepthInterpolate:!1,isGround:!1,opacity:1,polygonOffsetEnabled:!1,applySSAO:i.applySSAO};return{texturePromise:Promise.all(g),materialParameters:C}}function R(e){const r=!!e.compressedTextureS3TC,a=!!e.compressedTextureETC,o=has("disable-feature:i3s-basis")?0:3;return 24|(r?4|o:0)|(a?o:0)}function S(e,r){if(null!=r)return e.find(e=>0!==(e.encoding&r))}function w(e,r,a){if(null==e||0===a)return null;for(let o=0;o<e.length;o++){const t=e[o];if(null!=t&&0!==(t.usage&a)){const e=r[o];return null!=e?e.id:null}}return null}function k(e,r){return!!has("enable-feature:esri-compress-IM-textures")&&(0!==(e&t)&&!(r&~s))}function v(e){switch(e){case 1:return"image/ktx2";case 2:return"image/x.basis";case 4:return"image/vnd-ms.dds";case 8:return"image/png";case 16:return"image/jpeg";case 32:return"image/ktx";default:return""}}export{M as configureMaterial,F as createTexture,b as defaultMaterial,p as getMaterialAndTextures,x as getMaterialAndTexturesFromShared,R as getSupportedEncodings,w as getTextureIdByUsage,S as selectEncoding};