@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 7.85 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.32/esri/copyright.txt for details.
*/
import{_ as e}from"../../../../../chunks/tslib.es6.js";import"../../../../../core/has.js";import{releaseMaybe as t,disposeMaybe as i}from"../../../../../core/maybe.js";import{watch as r,initial as s}from"../../../../../core/reactiveUtils.js";import{property as o}from"../../../../../core/accessorSupport/decorators/property.js";import"../../../../../core/Logger.js";import"../../../../../core/RandomLCG.js";import{subclass as h}from"../../../../../core/accessorSupport/decorators/subclass.js";import{set as l}from"../../../../../core/libs/gl-matrix-2/math/vec2.js";import{ZEROS as n}from"../../../../../core/libs/gl-matrix-2/factories/vec4f64.js";import{InternalRenderCategory as a}from"../../../webgl.js";import{ColorFormat as g}from"../../../webgl/formats.js";import c from"../../../webgl/RenderNode.js";import{HighlightApplyTechnique as u}from"./HighlightApplyTechnique.js";import{HighlightDownsampleTechnique as m}from"./HighlightDownsampleTechnique.js";import{HighlightPassParameters as p}from"./HighlightPassParameters.js";import{HighlightToSingleTechnique as d}from"./HighlightToSingleTechnique.js";import{SingleHighlightApplyTechnique as f}from"./SingleHighlightApplyTechnique.js";import{SingleHighlightBlurTechnique as b}from"./SingleHighlightBlurTechnique.js";import{RenderRequestType as T}from"../../lib/basicInterfaces.js";import{Default3D as w}from"../../lib/DefaultVertexAttributeLocations.js";import{NoVertex as x}from"../../lib/DefaultVertexBufferLayouts.js";import{VertexArrayObject as _}from"../../lib/VertexArrayObject.js";import{H as C,g as v}from"../../../../../chunks/HighlightDownsample.glsl.js";import{S as j}from"../../../../../chunks/SingleHighlightBlur.glsl.js";import{BufferObject as H}from"../../../../webgl/BufferObject.js";import{PixelFormat as q,TextureSamplingMode as P,FramebufferBit as R,Usage as D,TextureType as O,PrimitiveType as S,DataType as A}from"../../../../webgl/enums.js";import{Texture as E}from"../../../../webgl/Texture.js";import{TextureDescriptor as y}from"../../../../webgl/TextureDescriptor.js";let I=class extends c{constructor(){super(...arguments),this.produces=a.HIGHLIGHTS,this.consumes={required:[a.HIGHLIGHTS,"highlights"]},this._useMultipleHighlights=!1,this._downsampleDrawParameters=new C,this._passParameters=new p,this._singleHighlightBlurDrawParameters=new j,this._grid=new M}initialize(){this.addHandles([r((()=>this._updateOptionsTexture()),(()=>{}),s)])}destroy(){this._grid.coverage=t(this._grid.coverage),this._grid.vao=i(this._grid.vao),this._passParameters.highlightOptionsTexture=t(this._passParameters.highlightOptionsTexture)}_updateOptionsTexture(){if(null==this._passParameters.highlightOptionsTexture){const e=new y(16,2);e.internalFormat=q.RGBA,e.samplingMode=P.NEAREST,this._passParameters.highlightOptionsTexture=new E(this.renderingContext,e,null)}this._passParameters.highlightOptionsTexture.setData(U(this.view.state.highlights)),this.requestRender(T.UPDATE)}precompile(){this.techniques.precompile(m),this._useMultipleHighlights?this.techniques.precompile(u):(this.techniques.precompile(d),this.techniques.precompile(b),this.techniques.precompile(f))}render(e){const t=e.find((({name:e})=>e===a.HIGHLIGHTS)),{techniques:i,bindParameters:r,_passParameters:s,renderingContext:o}=this;if(!r.decorations)return t;const h=i.get(m);if(!h.compiled)return this.requestRender(T.UPDATE),t;const l=e.find((({name:e})=>"highlights"===e)).getTexture(),n=()=>{this._gridUpdateResources(l);const e=this._gridComputeCoverage(h,l,r),{horizontalCellCount:t,verticalCellCount:i}=e;return s.horizontalCellCount=t,s.verticalCellCount=i,s.coverageTexture=e.coverage?.getTexture(),e},g=e=>{const t=e.verticalCellCount*e.horizontalCellCount;o.bindVAO(e.vao),o.drawElementsInstanced(S.TRIANGLES,6,A.UNSIGNED_BYTE,0,t)},{camera:c}=r,u=()=>{o.bindFramebuffer(t.fbo),o.setViewport4fv(c.fullViewport)};return this._useMultipleHighlights?this._renderMultiple(l,n,g,u):this._renderSingle(l,n,g,u),s.highlightTexture=null,s.coverageTexture=null,t}_renderMultiple(e,t,i,r){const{techniques:s,bindParameters:o,_passParameters:h,renderingContext:l}=this,n=s.get(u);if(!n.compiled)return void this.requestRender(T.UPDATE);const a=t();h.highlightTexture=e,h.pixelRatio=o.camera.pixelRatio,l.bindTechnique(n,o,h),r(),i(a)}_renderSingle(e,t,i,r){const{fboCache:s,techniques:o,bindParameters:h,_passParameters:n,renderingContext:a}=this,c=o.get(d),u=o.get(b),m=o.get(f);if(!m.compiled||!u.compiled||!c.compiled)return void this.requestRender(T.UPDATE);const p=t(),{width:w,height:x}=e.descriptor;n.highlightTexture=e;const{camera:_}=h,{fullWidth:C,fullHeight:v,pixelRatio:j}=_,H=Math.ceil(C/j),q=Math.ceil(v/j),{_singleHighlightBlurDrawParameters:P}=this,D=this.view._stage.renderView.renderer,{highlights:O}=h;for(let d=0;d<O.length;++d){const{name:e}=O[d];if(!D.hasHighlightOptions(e))continue;n.highlightLevel=d,a.setClearColor(0,0,0,0);const t=s.acquire(w,x,"single highlight",g.RG);a.bindFramebuffer(t.fbo),a.setViewport(0,0,w,x),a.clear(R.COLOR),a.bindTechnique(c,h,n),i(p),P.blurInput=t.getTexture(),l(P.blurSize,1/H,0);const o=s.acquire(H,q,"single highlight blur h",g.RG);a.unbindTexture(o.fbo?.colorTexture),a.bindFramebuffer(o.fbo),a.setViewport(0,0,H,q),a.clear(R.COLOR),a.bindTechnique(u,h,n,P),i(p),t.release(),l(P.blurSize,0,1/q),n.singleHighlightBlurTexture=o.getTexture(),r(),a.bindTechnique(m,h,n,P),i(p),o.release()}}_gridUpdateResources(e){const t=this._grid,{width:i,height:r}=e.descriptor;if(t.horizontalCellCount=Math.ceil(i/v),t.verticalCellCount=Math.ceil(r/v),t.vao)return;const s=this.renderingContext,o=H.createIndex(s,D.STATIC_DRAW,F);t.vao=new _(s,w,new Map([["geometry",x]]),new Map([["geometry",H.createVertex(s,D.STATIC_DRAW)]]),o)}_gridComputeCoverage(e,t,i){const r=this.renderingContext,s=this._grid,o=t.descriptor,h=Math.ceil(o.width/v),l=Math.ceil(o.height/v);this._downsampleDrawParameters.input=t,s.coverage?.release();const n=this.fboCache.acquire(h,l,"highlight coverage",g.RG);return s.coverage=n,r.bindFramebuffer(n.fbo),r.bindTechnique(e,i,this._passParameters,this._downsampleDrawParameters),r.setViewport(0,0,h,l),r.screen.draw(),s}get test(){}};e([o()],I.prototype,"produces",void 0),e([o()],I.prototype,"consumes",void 0),I=e([h("esri.views.3d.webgl-engine.effects.highlight.Highlight")],I);class M{constructor(){this.coverage=null,this.vao=null,this.verticalCellCount=0,this.horizontalCellCount=0,this.viewportWidth=0,this.viewportHeight=0}}function U(e){const t=new Uint8Array(128);let i=0;for(const r of e){const e=4*i,s=4*i+64;++i;const{color:o}=r,h=r.haloColor??o;t[e+0]=o.r,t[e+1]=o.g,t[e+2]=o.b,t[e+3]=r.fillOpacity*o.a*255,t[s+0]=h.r,t[s+1]=h.g,t[s+2]=h.b,t[s+3]=r.haloOpacity*h.a*255}return t}let G=0;function L(e){let t=0;for(const r of e){const{name:e}=r;t+=e.length;const{color:i,fillOpacity:s,haloColor:o,haloOpacity:h}=r;t+=i.r+i.g+i.b+i.a+s,t+=o?o.r+o.g+o.b+o.a+h:0}const i=e.at(0);if(i){const{shadowOpacity:e,shadowDifference:r,shadowColor:s}=i;t+=e+r+s.r+s.g+s.b+s.a}return G+++(t>=0?0:1)}const F=new Uint8Array([0,1,2,2,1,3]);function V(e,t,i,r,s,o=0){const h=r.highlights,a=h.length>1?t.acquire(i.width,i.height,"highlight mix",g.RG):null;if(a){const t=e.getBoundFramebufferObject();e.bindFramebuffer(a.fbo),e.clearFramebuffer(n),e.bindFramebuffer(t)}const c=a?.getTexture();r.highlightMixTexture=c,l(r.highlightMixOrigin,o,0),h.forEach(((t,h)=>{h>0&&(e.bindTexture(c,E.TEXTURE_UNIT_FOR_UPDATES),e.gl.copyTexSubImage2D(O.TEXTURE_2D,0,0,0,o,0,i.width,i.height),e.bindTexture(null,E.TEXTURE_UNIT_FOR_UPDATES)),e.clear(R.DEPTH),r.highlightLevel=h,s()})),r.highlightLevel=null,r.highlightMixTexture=null,a?.release()}export{I as Highlight,V as renderHighlightBuffer,L as trackHighlightOptions};