UNPKG

@arcgis/core

Version:

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

45 lines (44 loc) 5.31 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */ import{create as e}from"../../../../../../core/libs/gl-matrix-2/factories/vec4f64.js";import{hasArea as o,width as r,height as t}from"../../../../../../geometry/support/aaBoundingRect.js";import{isColor as l}from"../ShaderOutput.js";import{addMainLightDirection as a,addMainLightIntensity as i}from"../shading/MainLighting.glsl.js";import{WaterColor as c}from"../shading/WaterColor.glsl.js";import{Float4DrawUniform as s}from"../../shaderModules/Float4DrawUniform.js";import{FloatPassUniform as n}from"../../shaderModules/FloatPassUniform.js";import{glsl as v}from"../../shaderModules/glsl.js";import{Texture2DPassUniform as d}from"../../shaderModules/Texture2DPassUniform.js";import{Texture2DUintPassUniform as u}from"../../shaderModules/Texture2DUintPassUniform.js";import{Uniform as x}from"../../../../../webgl/Uniform.js";function y(e,o){const{vertex:r,fragment:t}=e;r.uniforms.add(new s("overlayTexOffset",(e,r)=>h(o.spherical,e,r)),new s("overlayTexScale",(e,r)=>O(o.spherical,e,r))),t.uniforms.add(new s("overlayTexOffset",(e,r)=>h(o.spherical,e,r)),new s("overlayTexScale",(e,r)=>O(o.spherical,e,r))),t.constants.add("overlayOpacity","float",1),t.uniforms.add(new d("ovColorTex",(e,o)=>f(e,o))),g(e,o)}function f(e,o){return 0===e.identifier&&l(e.output)?e.occludedGround?o.overlay?.allSourcesOccluders?o.overlay?.getTexture(1):o.overlay?.getTexture(4):o.overlay?.getTexture(1):0===e.identifier&&9===e.output?o.overlay?.getTexture(5):2===e.identifier?o.overlay?.getTexture(2):null}function m(e,o){const{vertex:r,fragment:t}=e;r.uniforms.add(new V("overlayTexOffset"),new V("overlayTexScale")),t.uniforms.add(new n("overlayOpacity",e=>e.overlayOpacity)),8!==o.output&&t.uniforms.add(new d("ovColorTex",(e,o)=>o.overlay?.getTexture(e.overlayContent))),g(e,o)}function p(e,o){switch(e){case 0:return 10!==o.slot||o.overlay?.allSourcesOccluders?0:4;case 1:case 2:return 0;case 8:return 2;case 3:case 5:case 6:case 7:return null;case 9:return 5}return null}function g(e,o){const{hasWater:r,output:t}=o;r&&e.include(c,o);const{vertex:l,fragment:s,varyings:n}=e;n.add("vtcOverlay","vec4");const d=8===t;l.code.add(v`void setOverlayVTC(in vec2 uv) { vtcOverlay = vec4(uv, uv) * overlayTexScale + overlayTexOffset; }`),s.code.add(v`bool isValid(vec2 uv, vec2 dxdy) { return (uv.x >= 0.0 + dxdy.x) && (uv.x <= 1.0 - dxdy.x) && (uv.y >= 0.0 + dxdy.y) && (uv.y <= 1.0 - dxdy.y); } vec4 getOverlayColor(sampler2D ov0Tex, vec4 texCoords) { vec4 color0 = texture(ov0Tex, vec2(texCoords.x * 0.5, texCoords.y)); vec4 color1 = texture(ov0Tex, vec2(texCoords.z * 0.5 + 0.5, texCoords.w)); bool isValid0 = isValid(texCoords.xy, fwidth(texCoords.xy)); bool isValid1 = isValid(texCoords.zw, vec2(0.0, 0.0)); return mix(color1 * float(isValid1), color0, float(isValid0)); }`),d?s.uniforms.add(new u("overlayHighlightTexture",(e,o)=>o.overlay?.getTexture(2))).code.add(v`uvec2 getAllOverlayHighlightValuesEncoded() { vec4 texCoords = vtcOverlay; vec2 uvInner = texCoords.xy; vec2 uvOuter = texCoords.zw; bool isValidInner = isValid(uvInner, fwidth(uvInner)); bool isValidOuter = isValid(uvOuter, vec2(0.0, 0.0)); vec2 texelCoordInner = uvInner * vec2(0.5, 1.0); vec2 texelCoordOuter = uvOuter * vec2(0.5, 1.0) + vec2(0.5,0.0); vec2 texDim = vec2(textureSize(overlayHighlightTexture, 0)); uvec2 texelValueInner = texelFetch(overlayHighlightTexture, ivec2(texelCoordInner * texDim), 0).rg; uvec2 texelValueOuter = texelFetch(overlayHighlightTexture, ivec2(texelCoordOuter * texDim), 0).rg; return isValidInner ? texelValueInner : isValidOuter ? texelValueOuter : uvec2(0); }`):(s.code.add(v`vec4 getCombinedOverlayColor() { return overlayOpacity * getOverlayColor(ovColorTex, vtcOverlay); }`),s.code.add(v`vec4 getOverlayColorTexel() { vec4 texCoords = vtcOverlay; vec2 texDim = vec2(textureSize(ovColorTex, 0)); vec4 color0 = texelFetch(ovColorTex, ivec2(vec2(texCoords.x * 0.5, texCoords.y) * texDim), 0); vec4 color1 = texelFetch(ovColorTex, ivec2(vec2(texCoords.z * 0.5 + 0.5, texCoords.w) * texDim), 0); bool isValid0 = isValid(texCoords.xy, fwidth(texCoords.xy)); bool isValid1 = isValid(texCoords.zw, vec2(0.0, 0.0)); return mix(color1 * float(isValid1), color0, float(isValid0)); }`)),r&&(a(s),i(s),s.code.add(v`vec4 getOverlayWaterColor(vec4 maskInput, vec4 colorInput, vec3 vposEyeDir, float shadow, vec3 localUp, mat3 tbn, vec3 position, vec3 positionWorld) { vec3 n = normalize(tbn * (2.0 * maskInput.rgb - vec3(1.0))); vec3 v = vposEyeDir; vec3 final = getWaterColor(n, v, mainLightDirection, colorInput.rgb, mainLightIntensity, localUp, 1.0 - shadow, maskInput.w, position, positionWorld); return vec4(final, colorInput.w); }`))}function C(e,o){return e.overlay?.overlays[o]?.extent}function h(e,l,a){const i=T,c=e&&!l.useENUForGlobalOverlayUV,s=c?0:l.toMapSpace[0],n=c?0:l.toMapSpace[1],v=(e,l)=>{const c=C(a,l);o(c)&&(i[e+0]=(s-c[0])/r(c),i[e+1]=(n-c[1])/t(c))};return v(0,0),v(2,1),i}function O(e,l,a){const i=T,c=e&&!l.useENUForGlobalOverlayUV,s=c?1:l.toMapSpace[2],n=c?1:l.toMapSpace[3],v=(e,l)=>{const c=C(a,l);o(c)&&(i[e+0]=s/r(c),i[e+1]=n/t(c))};return v(0,0),v(2,1),i}const T=e();class V extends x{constructor(e){super(e,"vec4")}}export{y as OverlayIM,m as OverlayTerrain,f as getIMColorTexture,p as getOverlayContentForOutputTerrain};