UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 6.84 kB
import has from"../../../../core/has.js";import{clamp as e,isPowerOfTwo as a}from"../../../../core/mathUtils.js";import{isSome as o,isNone as r}from"../../../../core/maybe.js";import{TextureEncoding as s,TextureUsage as t}from"./enums.js";import{RenderTexture as n}from"../../webgl-engine/core/material/RenderTexture.js";import{PBRSchematicMRRValues as l}from"../../webgl-engine/core/shaderLibrary/shading/PhysicallyBasedRenderingParameters.glsl.js";import{defaultMaskAlphaCutoff as i}from"../../webgl-engine/core/shaderLibrary/util/AlphaCutoff.js";import{getEllipsoidMode as u}from"../../webgl-engine/core/shaderLibrary/util/EllipsoidMode.js";import{TextureEncodingMimeType as c,CullFaceOptions as m,AlphaDiscardMode as d}from"../../webgl-engine/lib/basicInterfaces.js";import{Texture as g}from"../../webgl-engine/lib/Texture.js";import{TextureWrapMode as p}from"../../../webgl/enums.js";function h(e,a){const s=new Map,n=(e,a)=>{if(r(e))return-1;const o=s.get(e.id);if(o)return o.usage|=a,o.id;const t=s.size;return s.set(e.id,{id:t,usage:a}),t},i=a.pbrMetallicRoughness,u=i&&i.baseColorFactor,c=a.emissiveFactor,d=null==a.normalTexture&&null==a.emissiveTexture&&null==a.occlusionTexture&&(!i||null==i.metallicRoughnessTexture&&1===i.roughnessFactor&&(1===i.metallicFactor||0===i.metallicFactor)),g=d?l[0]:i?i.metallicFactor:1,p=d?l[1]:i?i.roughnessFactor:1,h="mask"===a.alphaMode?t.Color|t.AlphaMask:t.Color,x={baseColorFactor:u?[u[0],u[1],u[2],u[3]]:[1,1,1,1],baseColorTextureId:n(i&&i.baseColorTexture,h),metallicRoughnessTextureId:n(i&&i.metallicRoughnessTexture,t.MetallicRoughness),metallicFactor:g,roughnessFactor:p},b={alphaMode:a.alphaMode,alphaCutoff:a.alphaCutoff,doubleSided:a.doubleSided,cullFace:"none"===a.cullFace?m.None:"back"===a.cullFace?m.Back:"front"===a.cullFace?m.Front:m.None,normalTextureId:n(a.normalTexture,t.Normal),emissiveTextureId:n(a.emissiveTexture,t.Emissive),occlusionTextureId:n(a.occlusionTexture,t.Occlusion),emissiveFactor:c?[c[0],c[1],c[2]]:[0,0,0],metallicRoughness:x,wrapTextures:!1,hasParametersFromSource:d},F=[];return s.forEach((({usage:a},r)=>{const s=o(e)&&e[r]&&e[r].formats,t=s?f(s.map((({name:e,format:a})=>({name:e,encoding:T[a]})))):[];F.push({id:r,usage:a,encodings:t})})),{material:b,textures:F}}function f(e){return e.sort(((e,a)=>e.encoding-a.encoding))}const T={ktx2:s.KTX2,basis:s.Basis,dds:s.DDS_S3TC,png:s.PNG,jpg:s.JPG,"ktx-etc2":s.KTX_ETC2},x={[c.KTX2_ENCODING]:s.Basis,[c.BASIS_ENCODING]:s.Basis,[c.DDS_ENCODING]:s.DDS_S3TC,"image/png":s.PNG,"image/jpg":s.JPG,"image/jpeg":s.JPG,"image/ktx":s.KTX_ETC2};function b(a){const o=a&&a.materialDefinitions?Object.keys(a.materialDefinitions)[0]:null,r=a&&a.textureDefinitions?Object.keys(a.textureDefinitions)[0]:null,s=o?a.materialDefinitions?.[o]:null,n=r?a.textureDefinitions?.[r]:null,l=F();if(null!=s){const a=s.params;a.diffuse&&(l.metallicRoughness.baseColorFactor=[a.diffuse[0],a.diffuse[1],a.diffuse[2],1]),null!=a.doubleSided&&(l.doubleSided=a.doubleSided,l.cullFace=a.doubleSided?m.None:m.Back),"none"!==a.cullFace&&"front"!==a.cullFace&&"back"!==a.cullFace||(l.cullFace="none"===a.cullFace?m.None:"back"===a.cullFace?m.Back:m.Front),a.transparency&&(l.metallicRoughness.baseColorFactor[3]=e(1-a.transparency,0,1)),(a.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 a=t.Color;"rgba"===n.channels&&(l.alphaMode="blend",a|=t.AlphaMask);const o=n.images.length-1,r=n.images[o],s=e=>e&&e.split("/").pop(),u=Array.isArray(n.encoding)?f(n.encoding.map(((e,a)=>({name:s(r.href[a]),encoding:x[e]||0})))):[{name:s(r.href),encoding:x[n.encoding]||0}];i.push({id:e,usage:a,encodings:u}),l.metallicRoughness.baseColorTextureId=e}return{material:l,textures:i}}const F=()=>({alphaMode:"opaque",alphaCutoff:i,doubleSided:!0,cullFace:m.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 C(e,o,s,n){if(r(e)||null==e.data)return null;const l=e.data,i=!(l instanceof HTMLImageElement)||a(l.width)&&a(l.height),u=n.renderingContext.parameters.maxMaxAnisotropy,c=s&&!n.capabilities.shaderTextureLOD?1:u,m=i&&!e.downsampled&&c>1,d=s||!o.wrapTextures?P:M,p=E(e.encoding),h=e.usage&t.Color?"opaque"===o.alphaMode?3:4:3;return new g(l,{mipmap:m,maxAnisotropy:c,encoding:p,wrap:d,components:h,noUnpackFlip:!0})}const P={s:p.CLAMP_TO_EDGE,t:p.CLAMP_TO_EDGE},M={s:p.REPEAT,t:p.REPEAT};function S(a,r,s,l,c,m){const g=m.rendererTextureUsage,p=e=>R(l,s,e&g),h=r.metallicRoughness.baseColorFactor,f=e(r.metallicRoughness.baseColorFactor[3],0,1);a.baseColor=[h[0],h[1],h[2],f],a.hasParametersFromSource=!!r.hasParametersFromSource,a.usePBR=m.usePBR,a.mrrFactors=[r.metallicRoughness.metallicFactor,r.metallicRoughness.roughnessFactor,r.hasParametersFromSource?.2:.5],a.emissiveFactor=r.emissiveFactor,a.isIntegratedMesh=m.isIntegratedMesh,a.textureAlphaCutoff="mask"===r.alphaMode?r.alphaCutoff:i,a.alphaDiscardMode="opaque"===r.alphaMode?d.Opaque:"mask"===r.alphaMode?d.Mask:d.MaskBlend;const T=[],x=p(t.Color|t.AlphaMask);o(x)&&(a.baseColorTexture=new n(c,x),T.push(a.baseColorTexture.loadPromise));const b=p(t.MetallicRoughness);o(b)&&(a.metallicRoughnessTexture=new n(c,b),T.push(a.metallicRoughnessTexture.loadPromise));const F=p(t.Emissive);o(F)&&(a.emissionTexture=new n(c,F),T.push(a.emissionTexture.loadPromise));const C=p(t.Occlusion);o(C)&&(a.occlusionTexture=new n(c,C),T.push(a.occlusionTexture.loadPromise));const P=p(t.Normal);return o(P)&&(a.normalTexture=new n(c,P),T.push(a.normalTexture.loadPromise)),a.commonMaterialParameters.hasSlicePlane=m.slicePlaneEnabled,a.commonMaterialParameters.doubleSided=r.doubleSided,a.commonMaterialParameters.cullFace=r.cullFace,a.ellipsoidMode=u(m.viewSpatialReference),Promise.all(T)}function D(e){const a=!!e.compressedTextureS3TC,o=!!e.compressedTextureETC,r=has("disable-feature:i3s-basis")?0:s.Basis|s.KTX2,t=s.JPG|s.PNG,n=r|s.DDS_S3TC;return t|(a?n:0)|(o?r:0)}function w(e,a){if(null!=a)return e.find((e=>0!=(e.encoding&a)))}function R(e,a,s){if(r(e)||s===t.None)return null;for(let r=0;r<e.length;r++){const t=e[r];if(o(t)&&0!=(t.usage&s)){const e=a[r];return o(e)?e.id:null}}return null}function E(e){switch(e){case s.KTX2:return c.KTX2_ENCODING;case s.Basis:return c.BASIS_ENCODING;case s.DDS_S3TC:return c.DDS_ENCODING;case s.PNG:return"image/png";case s.JPG:return"image/jpeg";case s.KTX_ETC2:return"image/ktx";default:return""}}export{S as configureMaterial,C as createTexture,F as defaultMaterial,h as getMaterialAndTextures,b as getMaterialAndTexturesFromShared,D as getSupportedEncodings,w as selectEncoding};