UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 6.62 kB
import{isSome as e,isNone as t,unwrap as s}from"../../../../core/maybe.js";import{createResolver as r}from"../../../../core/promiseUtils.js";import{create as i}from"../../../../geometry/support/aaBoundingRect.js";import{SymbolFader as o}from"./decluttering/SymbolFader.js";import{Visibility as l,StyleLayerType as n}from"./style/StyleDefinition.js";import{WGLDrawPhase as a}from"../webgl/enums.js";import{RenderableTile as d}from"../webgl/RenderableTile.js";import h from"../webgl/TileContainer.js";import c from"../../tiling/TileCoverage.js";import y from"../../tiling/TileKey.js";import{StencilOperation as p,CompareFunction as u,BlendFactor as m}from"../../../webgl/enums.js";const f=1e-6;function _(e,t){if(e){const s=e.getLayoutProperty("visibility");if(!s||s.getValue()!==l.NONE&&(void 0===e.minzoom||e.minzoom<t+f)&&(void 0===e.maxzoom||e.maxzoom>=t-f))return!0}return!1}class b extends h{constructor(e){super(e),this._backgroundTiles=[],this._pointToCallbacks=new Map}destroy(){this.removeAllChildren(),this._spriteMosaic?.dispose(),this._spriteMosaic=null,this._glyphMosaic?.dispose(),this._glyphMosaic=null,e(this._symbolFader)&&(this._symbolFader.clear(),this._symbolFader=null),this._styleRepository=null,this._backgroundTiles=[],this._pointToCallbacks.clear()}setStyleResources(e,r,i){if(this._spriteMosaic=e,this._glyphMosaic=r,this._styleRepository=i,t(this._symbolFader)){const e=new o(this._styleRepository,this.children);e.on("fade-start",(()=>{this.emit("fade-start"),this.requestRender()})),e.on("fade-complete",(()=>{this.emit("fade-complete"),this.requestRender()})),this._symbolFader=e}s(this._symbolFader).styleRepository=i}setSpriteMosaic(e){this._spriteMosaic?.dispose(),this._spriteMosaic=e}deleteStyleLayers(t){e(this._symbolFader)&&this._symbolFader.deleteStyleLayers(t)}async hitTest(e){const t=r();return this._pointToCallbacks.set(e,t),this.requestRender(),t.promise}enterTileInvalidation(){for(const e of this.children)e.invalidating=!0}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(t){return super.addChild(t),e(this._symbolFader)?this._symbolFader.addTile(t):t.decluttered=!0,this.requestRender(),t}removeChild(t){return e(this._symbolFader)&&this._symbolFader.removeTile(t),this.requestRender(),super.removeChild(t)}renderChildren(e){const{drawPhase:t}=e;if(t!==a.DEBUG){if(this._doRender(e),this._pointToCallbacks.size>0){e.drawPhase=a.HITTEST;const s=e.painter.effects.hittestVTL;s.bind(e),this._doRender(e),s.draw(e,this._pointToCallbacks),s.unbind(e),e.drawPhase=t}}else super.renderChildren(e)}removeAllChildren(){for(let t=0;t<this.children.length;t++){const s=this.children[t];e(this._symbolFader)&&this._symbolFader.removeTile(s),s.dispose()}super.removeAllChildren()}getStencilTarget(){return this.children.filter((e=>e.neededForCoverage&&e.hasData()))}restartDeclutter(){e(this._symbolFader)&&this._symbolFader.restartDeclutter()}_doRender(e){const{context:t}=e,s=this._styleRepository;if(!s)return;const r=s.layers;let i=!0;e.drawPhase===a.HITTEST&&(i=!1),s.backgroundBucketIds.length>0&&(e.renderPass="background",this._renderBackgroundLayers(e,s.backgroundBucketIds)),super.renderChildren(e),e.drawPhase===a.MAP&&this._fade(e.displayLevel,e.state);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 l of o)l.triangleCount=0;t.setStencilWriteMask(0),t.setColorMask(!0,!0,!0,!0),t.setStencilOp(p.KEEP,p.KEEP,p.REPLACE),t.setStencilTestEnabled(!0),t.setBlendingEnabled(!1),t.setDepthTestEnabled(!0),t.setDepthWriteEnabled(!0),t.setDepthFunction(u.LEQUAL),t.setClearDepth(1),t.clear(t.gl.DEPTH_BUFFER_BIT),e.renderPass="opaque";for(let l=r.length-1;l>=0;l--)this._renderStyleLayer(r[l],e,o);t.setDepthWriteEnabled(!1),t.setBlendingEnabled(i),t.setBlendFunctionSeparate(m.ONE,m.ONE_MINUS_SRC_ALPHA,m.ONE,m.ONE_MINUS_SRC_ALPHA),e.renderPass="translucent";for(let l=0;l<r.length;l++)this._renderStyleLayer(r[l],e,o);t.bindVAO(),t.setStencilTestEnabled(!0),t.setBlendingEnabled(!0)}_fade(t,s){e(this._symbolFader)&&(this._symbolFader.update(t,s)||this.requestRender())}_renderStyleLayer(e,t,s){const{painter:r,renderPass:i}=t;if(void 0===e)return;const o=e.getLayoutProperty("visibility");if(o&&o.getValue()===l.NONE)return;let a;switch(e.type){case n.BACKGROUND:return;case n.FILL:if("opaque"!==i&&"translucent"!==t.renderPass)return;a="vtlFill";break;case n.LINE:if("translucent"!==i)return;a="vtlLine";break;case n.CIRCLE:if("translucent"!==i)return;a="vtlCircle";break;case n.SYMBOL:if("translucent"!==i)return;a="vtlSymbol"}if(s=e.type===n.SYMBOL?s.filter((e=>e.decluttered)):s.filter((e=>e.neededForCoverage)),"vtlSymbol"!==a){const r=t.displayLevel;if(0===s.length||void 0!==e.minzoom&&e.minzoom>=r+f||void 0!==e.maxzoom&&e.maxzoom<r-f)return}const d=e.uid;t.styleLayerUID=d,t.styleLayer=e;for(const l of s)if(l.layerData.has(d)){r.renderObjects(t,s,a);break}}_renderBackgroundLayers(t,s){const{context:r,displayLevel:o,painter:l,state:h}=t,m=this._styleRepository;let f=!1;for(const e of s){if(m.getLayerById(e).type===n.BACKGROUND&&_(m.getLayerById(e),o)){f=!0;break}}if(!f)return;const b=this._tileInfoView.getTileCoverage(t.state,0,"smallest"),{spans:g,lodInfo:T}=b,{level:E}=T,C=i(),L=[];if(this._renderPasses){const s=this._renderPasses[0];e(this._clippingInfos)&&(s.brushes[0].prepareState(t),s.brushes[0].drawMany(t,this._clippingInfos))}const v=this._backgroundTiles;let R,S=0;for(const{row:e,colFrom:n,colTo:a}of g)for(let t=n;t<=a;t++){if(S<v.length)R=v[S],R.key.set(E,e,T.normalizeCol(t),T.getWorldForColumn(t)),this._tileInfoView.getTileBounds(C,R.key,!1),R.x=C[0],R.y=C[3],R.resolution=this._tileInfoView.getTileResolution(E);else{const s=new y(E,e,T.normalizeCol(t),T.getWorldForColumn(t)),r=this._tileInfoView.getTileBounds(i(),s),o=this._tileInfoView.getTileResolution(E);R=new d(s,o,r[0],r[3],512,512,4096,4096),v.push(R)}R.setTransform(h),L.push(R),S++}r.setStencilWriteMask(0),r.setColorMask(!0,!0,!0,!0),r.setStencilOp(p.KEEP,p.KEEP,p.REPLACE),r.setStencilFunction(u.EQUAL,0,255);let F=!0;t.drawPhase===a.HITTEST&&(F=!1),r.setStencilTestEnabled(F);for(const e of s){const s=m.getLayerById(e);s.type===n.BACKGROUND&&_(s,o)&&(t.styleLayerUID=s.uid,t.styleLayer=s,l.renderObjects(t,L,"vtlBackground"))}c.pool.release(b)}}export{b as VectorTileContainer};