/* COPYRIGHT Esri - https://js.arcgis.com/5.0.18/LICENSE.txt */
import{exactEquals as e}from"../../../../../../core/libs/gl-matrix-2/math/vec3.js";import{ZEROS as r}from"../../../../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{ComponentTechnique as t}from"./ComponentTechnique.js";import{ComponentTechniqueConfiguration as s}from"./ComponentTechniqueConfiguration.js";import{MaterialBase as i}from"../../../core/material/MaterialBase.js";import{isColor as o}from"../../../core/shaderLibrary/ShaderOutput.js";class a extends i{constructor(e,r,t,i,o){super(),this.parameters=e,this.key=o,this.usePBR=e.usePBR,this.hasParametersFromSource=e.hasParametersFromSource,this.isGround=e.isGround,this.slicePlaneEnabled=e.slicePlaneEnabled,this.isIntegratedMesh=e.isIntegratedMesh,this.applySSAO=e.applySSAO,this.hasEmissions=u(e,t,i),this.materialPass=n(e,t),this._configuration=new s(i.sphericalSR),this._initializeMaterialConfiguration(e,r,t,i)}destroy(){}acquireTechnique(e,r,s,i){const o=this._updateConfiguration(r,s);return e.get(t,o,i.layout)}_initializeMaterialConfiguration(e,r,t,s){const i=this._configuration;i.hasMetallicRoughnessTexture=null!=e.metallicRoughnessTexture,i.hasOcclusionTexture=null!=e.occlusionTexture,i.hasNormalTexture=null!=e.normalTexture,i.sphereDepthInterpolate=e.sphereDepthInterpolate&&i.spherical,i.ellipsoidMode=e.ellipsoidMode,i.doubleSidedMode=e.doubleSided?1:0,i.hasColorTexture=null!=e.baseColorTexture,i.cullFace=e.cullFace,i.alphaDiscardMode=e.alphaDiscardMode,i.hasVertexColors=r.hasVertexColors,i.textureCoordinateType=r.textureCoordinateType,i.shadeNormals=r.shadeNormals,i.normalType=r.hasNormals?1:2,i.hasPolygonOffset=e.polygonOffsetEnabled,i.hasModelRotationScale=r.hasModelRotationScale,i.componentDataType=t.componentDataType,i.emissionSource=c(e,t,s)}_updateConfiguration(e,r){const t=this._configuration,{identifier:s,output:i}=e,a=0===s;t.output=i,t.hasEmission=r.hasEmission&&a,t.renderOccluded=10===r.slot,t.oitPass=a?r.oitPass:0,t.terrainDepthTest=a&&r.terrainDepthTest,t.cullAboveTerrain=!!a&&r.cullAboveTerrain;const n=this.isIntegratedMesh?d(r)?h(r)?3:2:1:0;t.integratedMeshMode=n,t.pbrMode=3===n?4:this.usePBR?this.hasParametersFromSource?t.shadeNormals&&this.isIntegratedMesh?0:2:1:0,t.hasSlicePlane=null!=r.slicePlane&&this.slicePlaneEnabled,t.isGroundSlice=t.hasSlicePlane&&this.isGround;const{materialPass:l}=this;t.blendingEnabled=a&&(1===l||2===l&&e.transparent||4===l)||t.isGroundSlice,t.hasHighlightMixTexture=2===s&&null!=r.highlightMixTexture,t.snowCover=a&&r.snowCover>0,t.vertexDiscardMode=a&&2===l?e.transparent?2:1:0;const u=a&&o(i);return t.receiveAmbientOcclusion=u&&this.applySSAO&&!t.renderOccluded&&null!=r.ssao?.getTexture(),t.hasOccludees=u&&r.hasOccludees,t.receiveShadows=u&&r.shadowMap.ready,t.screenSpaceReflections=u&&null!=r.ssr.lastFrameColor,t.cloudReflections=u&&null!=r.clouds.data?.cubeMap?.colorTexture,t}}function n(e,r){const{alphaDiscardMode:t,isIntegratedMesh:s,slicePlaneEnabled:i}=e,{transparent:o,opaqueOverride:a}=r,n=e.opacity<1,l=e.baseColor[3]<1;if(s)return n||i?4:3;if(n)return 1;if(0===a)return 0;if(l||0===t||3===t)return 1;switch(o){case 2:return 0;case 0:return 1;case 1:return 2}}function l(t){return null!=t.emissionTexture||!e(t.emissiveBaseColor,r)}function u(e,r,t){const s=l(e);return t.floatBufferBlendSupported&&2!==r.emissiveOverride&&(s||2!==r.emissiveSourceOverride)}function c(e,r,t){const s=null!=e.emissionTexture,{emissiveSourceOverride:i}=r,o=1===i,a=2===i,n=u(e,r,t),c=l(e);return n?c?a?s?4:2:o?s?5:7:6:o?7:6:0}function h(e){return null!=e.overlay?.getTexture(3)}function d(e){return null!=e.overlay?.getTexture(1)}export{a as ComponentMaterial,c as calculateEmissionSource,u as calculateHasEmissions,l as calculateHasEmissiveBase,n as computeMaterialPass};
