@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 6.79 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.33/esri/copyright.txt for details.
*/
import{create as e}from"../../../../geometry/support/aaBoundingRect.js";import t from"../../../../layers/support/TileInfo.js";import{tileCoordSize as s,tilePixelSize as r}from"./constants.js";import{SymbolFader as i}from"./decluttering/SymbolFader.js";import{writeOpacityToBuffers as l}from"./decluttering/util.js";import{Visibility as o,StyleLayerType as n}from"./style/StyleDefinition.js";import{WGLDrawPhase as a}from"../webgl/enums.js";import{RenderableTile as d}from"../webgl/RenderableTile.js";import c from"../webgl/TileContainer.js";import h from"../../tiling/TileCoverage.js";import u from"../../tiling/TileKey.js";import{StencilOperation as y,CompareFunction as p,FramebufferBit as m,BlendFactor as f}from"../../../webgl/enums.js";const g=1e-6;function b(e,t){if(e){const s=e.getLayoutProperty("visibility");if(!s||s.getValue()!==o.NONE&&(void 0===e.minzoom||e.minzoom<t+g)&&(void 0===e.maxzoom||e.maxzoom>=t-g))return!0}return!1}class _ extends c{constructor(e){super(e),this._backgroundTiles=[],this._computeDisplayInfoView(e)}destroy(){this.removeAllChildren(),this._spriteMosaic?.dispose(),this._spriteMosaic=null,this._glyphMosaic?.dispose(),this._glyphMosaic=null,null!=this._symbolFader&&(this._symbolFader.clear(),this._symbolFader=null),this._styleRepository=null,this._backgroundTiles=[]}get fading(){return this._symbolFader?.fading??!1}get symbolFader(){return this._symbolFader}get symbolRepository(){return this._symbolFader?.symbolRepository}setStyleResources(e,t,r,o){if(this._spriteMosaic=e,this._glyphMosaic=t,this._styleRepository=r,this.tileInfoView=o,this._computeDisplayInfoView(o),null==this._symbolFader){const e=(e,t)=>{e.allSymbolsFadingOut=!0,e.lastOpacityUpdate=t,l(e,t,!0),e.decluttered=!0,e.requestRender()};this._symbolFader=new i("vector-tile",this._styleRepository,e,this.children,s)}this._symbolFader.styleRepository=r}setSpriteMosaic(e){this._spriteMosaic?.dispose(),this._spriteMosaic=e}deleteStyleLayers(e){null!=this._symbolFader&&this._symbolFader.deleteStyleLayers(e)}createRenderParams(e){return{...super.createRenderParams(e),renderPass:null,styleLayer:null,styleLayerUID:-1,glyphMosaic:this._glyphMosaic,spriteMosaic:this._spriteMosaic,hasClipping:!!this._clippingInfos}}doRender(e){!this.visible||e.drawPhase!==a.MAP&&e.drawPhase!==a.DEBUG||void 0===this._spriteMosaic||super.doRender(e)}addChild(e){return super.addChild(e),null!=this._symbolFader?this._symbolFader.addTile(e):e.decluttered=!0,this.requestRender(),e}removeChild(e){return null!=this._symbolFader&&this._symbolFader.removeTile(e),this.requestRender(),super.removeChild(e)}renderChildren(e){const{drawPhase:t}=e;t!==a.DEBUG?this._doRender(e):super.renderChildren(e)}removeAllChildren(){for(let e=0;e<this.children.length;e++){const t=this.children[e];null!=this._symbolFader&&this._symbolFader.removeTile(t),t.dispose()}super.removeAllChildren()}getStencilTarget(){return this.children.filter((e=>e.neededForCoverage&&e.hasData()))}restartDeclutter(){null!=this._symbolFader&&this._symbolFader.restartDeclutter()}_doRender(e){const{context:t,state:s}=e,r=this._styleRepository;if(!r)return;const i=r.layers,l=this._displayInfo.scaleToZoom(s.scale);r.backgroundBucketIds.length>0&&(e.renderPass="background",this._renderBackgroundLayers(e,r.backgroundBucketIds,l)),super.renderChildren(e),e.drawPhase===a.MAP&&this._fade(l,s);const o=this.children.filter((e=>e.visible&&e.hasData()));if(!o||0===o.length)return t.bindVAO(),t.setStencilTestEnabled(!0),void t.setBlendingEnabled(!0);for(const n of o)n.triangleCount=0;t.setStencilWriteMask(0),t.setColorMask(!0,!0,!0,!0),t.setStencilOp(y.KEEP,y.KEEP,y.REPLACE),t.setStencilTestEnabled(!0),t.setBlendingEnabled(!1),t.setDepthTestEnabled(!0),t.setDepthWriteEnabled(!0),t.setDepthFunction(p.LEQUAL),t.setClearDepth(1),t.clear(m.DEPTH),e.renderPass="opaque";for(let n=i.length-1;n>=0;n--)this._renderStyleLayer(i[n],e,o);t.setDepthWriteEnabled(!1),t.setBlendingEnabled(!0),t.setBlendFunctionSeparate(f.ONE,f.ONE_MINUS_SRC_ALPHA,f.ONE,f.ONE_MINUS_SRC_ALPHA),e.renderPass="translucent";for(let n=0;n<i.length;n++)this._renderStyleLayer(i[n],e,o);t.bindVAO(),t.setStencilTestEnabled(!0),t.setBlendingEnabled(!0);for(const n of o)n.debugInfo.display.triangleCount=n.triangleCount}_fade(e,t){null!=this._symbolFader&&(this._symbolFader.update(e,t)||this.requestRender())}_renderStyleLayer(e,t,s){const{displayLevel:r,painter:i,renderPass:l}=t;if(void 0===e)return;const a=e.getLayoutProperty("visibility");if(a&&a.getValue()===o.NONE)return;let d;switch(e.type){case n.BACKGROUND:return;case n.FILL:if("opaque"!==l&&"translucent"!==t.renderPass)return;d="vtlFill";break;case n.LINE:if("translucent"!==l)return;d="vtlLine";break;case n.CIRCLE:if("translucent"!==l)return;d="vtlCircle";break;case n.SYMBOL:if("translucent"!==l)return;d="vtlSymbol"}if(s=e.type===n.SYMBOL?s.filter((e=>e.decluttered)):s.filter((e=>e.neededForCoverage)),"vtlSymbol"!==d&&(0===s.length||void 0!==e.minzoom&&e.minzoom>=r+g||void 0!==e.maxzoom&&e.maxzoom<r-g))return;const c=e.uid;t.styleLayerUID=c,t.styleLayer=e;for(const o of s)if(o.layerData.has(c)){i.renderObjects(t,s,d);break}}_renderBackgroundLayers(t,i,l){const{context:o,painter:a,state:c}=t,m=this._styleRepository;let f=!1;for(const e of i){if(m.getLayerById(e).type===n.BACKGROUND&&b(m.getLayerById(e),l)){f=!0;break}}if(!f)return;const g=this.tileInfoView,_=g.getTileCoverage(t.state,0,!0,"smallest"),{spans:C,lodInfo:E}=_,{level:F}=E,L=e(),R=[];if(this._renderPasses){const e=this._renderPasses[0];null!=this._clippingInfos&&(e.brushes[0].prepareState(t),e.brushes[0].drawMany(t,this._clippingInfos))}const v=this._backgroundTiles;let S,I=0;for(const{row:n,colFrom:h,colTo:y}of C)for(let t=h;t<=y;t++){if(I<v.length)S=v[I],S.key.set(F,n,E.normalizeCol(t),E.getWorldForColumn(t)),g.getTileBounds(L,S.key,!1),S.x=L[0],S.y=L[3],S.resolution=g.getTileResolution(F);else{const i=new u(F,n,E.normalizeCol(t),E.getWorldForColumn(t)),l=g.getTileBounds(e(),i),o=g.getTileResolution(F);S=new d(i,o,l[0],l[3],r,r,s,s),v.push(S)}S.setTransform(c),R.push(S),I++}o.setStencilWriteMask(0),o.setColorMask(!0,!0,!0,!0),o.setStencilOp(y.KEEP,y.KEEP,y.REPLACE),o.setStencilFunction(p.EQUAL,0,255),o.setStencilTestEnabled(!0);for(const e of i){const s=m.getLayerById(e);s.type===n.BACKGROUND&&b(s,l)&&(t.styleLayerUID=s.uid,t.styleLayer=s,a.renderObjects(t,R,"vtlBackground"))}h.pool.release(_)}_computeDisplayInfoView(e){let s=e.tileInfo.lods[0].scale;const i=Math.max(25,e.tileInfo.lods.length),l=[];for(let t=0;t<=i;t++)l.push(s),s/=2;this._displayInfo=t.create({scales:l,size:r,spatialReference:e.spatialReference,numLODs:i})}}export{_ as VectorTileContainer};