UNPKG

@arcgis/core

Version:

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

38 lines (37 loc) 2.11 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.32/esri/copyright.txt for details. */ import{HighlightReadBitmap as i}from"../HighlightReadBitmap.glsl.js";import{ShaderOutput as t}from"../ShaderOutput.js";import{glsl as e}from"../../shaderModules/glsl.js";import{Integer2BindUniform as l}from"../../shaderModules/Integer2BindUniform.js";import{IntegerBindUniform as h}from"../../shaderModules/IntegerBindUniform.js";import{Texture2DBindUniform as g}from"../../shaderModules/Texture2DBindUniform.js";function d(d,u){const{fragment:o}=d;u.output===t.Highlight?(o.uniforms.add(new g("depthTexture",(i=>i.mainDepth)),new g("highlightTexture",(i=>i.highlightMixTexture)),new h("highlightLevel",(i=>i.highlightLevel??0)),new l("highlightMixOrigin",(i=>i.highlightMixOrigin))),d.outputs.add("fragHighlight","vec2",0),d.include(i),o.code.add(e`vec2 getAccumulatedHighlight() { return texelFetch(highlightTexture, ivec2(gl_FragCoord.xy) - highlightMixOrigin, 0).rg; } void outputHighlight(bool occluded) { if (highlightLevel == 0) { uint bits = occluded ? 3u : 1u; fragHighlight = vec2(float(bits) / 255.0, 0.0); } else { int ll = (highlightLevel & 3) << 1; int li = (highlightLevel >> 2) & 3; uint bits; if (occluded) { bits = 3u << ll; } else { bits = 1u << ll; } vec2 combinedHighlight = getAccumulatedHighlight(); uint accumulatedI = uint(combinedHighlight[li] * 255.0); combinedHighlight[li] = float(bits | accumulatedI) / 255.0; fragHighlight = combinedHighlight; } } bool isHighlightOccluded() { float sceneDepth = texelFetch(depthTexture, ivec2(gl_FragCoord.xy), 0).x; return gl_FragCoord.z > sceneDepth + 5e-7; } void calculateOcclusionAndOutputHighlight() { outputHighlight(isHighlightOccluded()); }`),u.canHaveOverlay&&o.code.add(e`void calculateOcclusionAndOutputHighlightOverlay(vec2 highlightToAdd) { uint levelBits = readLevelBits(highlightToAdd, highlightLevel); if ((levelBits & 1u) == 0u) { discard; } outputHighlight(isHighlightOccluded()); }`)):o.code.add(e`void calculateOcclusionAndOutputHighlight() {}`)}export{d as OutputHighlight};