UNPKG

@arcgis/core

Version:

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

6 lines (5 loc) 7.77 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.32/esri/copyright.txt for details. */ import e from"../../../core/Logger.js";import{disposeMaybe as r}from"../../../core/maybe.js";import{ZEROS as t}from"../../../core/libs/gl-matrix-2/factories/vec2f64.js";import{RasterColorizerStretchType as i}from"../../2d/engine/imagery/enums.js";import{VectorTileRendererHelper3D as s}from"../../2d/engine/vectorTiles/VectorTileRendererHelper3D.js";import{BlendLayersTechnique as o}from"./BlendLayersTechnique.js";import{BlendLayersTechniqueConfiguration as n}from"./BlendLayersTechniqueConfiguration.js";import{LayerClass as a}from"./LayerClass.js";import{RasterColorizerTechnique as l}from"./RasterColorizerTechnique.js";import{RasterColorizerTechniqueConfiguration as h}from"./RasterColorizerTechniqueConfiguration.js";import{MultiSizeFramebuffer as c}from"./support/MultiSizeFramebuffer.js";import{LayerBlendMode as u}from"../webgl-engine/core/shaderLibrary/output/BlendOptions.js";import{BaseOpacityMode as d}from"../webgl-engine/core/shaderLibrary/terrain/BaseOpacityMode.js";import{BlendLayersOutput as _}from"../webgl-engine/core/shaderLibrary/terrain/BlendLayersOutput.js";import{PremultipliedAlphaSource as f}from"../webgl-engine/core/shaderLibrary/terrain/PremultipliedAlphaSource.js";import{a as p}from"../../../chunks/BlendLayers.glsl.js";import{BindParameters as m}from"../webgl-engine/lib/BindParameters.js";import{createQuadVAO as b,Layout as g}from"../webgl-engine/lib/glUtil3D.js";import{PrimitiveType as y,FramebufferBit as T,TextureType as C}from"../../webgl/enums.js";import{Texture as x}from"../../webgl/Texture.js";import{vertexCount as q}from"../../webgl/Util.js";const B=()=>e.getLogger("esri.views.3d.terrain");class O{constructor(e,r){this._rctx=e,this._techniques=r,this._fbos=[],this._vectorTileHelper=new s,this._bindParameters=new m(null),this._blendLayersTechniqueConfig=new n,this._current=0,this._lastUsedIds=new Array,this._lastCreatedBufferId=0,this._onHoldIds=new Array,this._vaoQuad=b(this._rctx,g.Pos2Tex)}dispose(){this._fbos.forEach(r),this._fbos=null,this._vtFBO=r(this._vtFBO),this._vaoQuad=r(this._vaoQuad),this._vectorTileHelper=r(this._vectorTileHelper)}updateHeading(e){this._vectorTileHelper?.updateHeading(e)}_acquireBlendLayersTechnique(e,r,t,i=f.Off,s=p.BelowLayer){return this._blendLayersTechniqueConfig.output=r,this._blendLayersTechniqueConfig.blendMode=e,this._blendLayersTechniqueConfig.baseOpacityMode=t,this._blendLayersTechniqueConfig.premultipliedSource=i,this._blendLayersTechniqueConfig.background=s,this._techniques.precompile(o,this._blendLayersTechniqueConfig),this._techniques.get(o,this._blendLayersTechniqueConfig)}drawBackground(e,r){const t=this._acquireBlendLayersTechnique(u.Normal,r?_.ColorComposite:_.GridComposite,d.NotRequired,f.Off,p.Only),i=this._rctx.bindTechnique(t,this._bindParameters,e);this._render(i)}_render(e){this._rctx.bindVAO(this._vaoQuad),e.assertCompatibleVertexAttributeLocations(this._vaoQuad),this._rctx.drawArrays(y.TRIANGLE_STRIP,0,q(this._vaoQuad,"geometry"))}drawGroup(e,r,t,i,s=f.On){r===_.Composite&&(e.fboTexture=this._fbos[this.getLastOnHoldId()].get(t).colorTexture),e.texture=this.currentFBO(t).colorTexture,this.closeGroup(t);const o=e.baseOpacity<1?d.Required:d.NotRequired,n=this._acquireBlendLayersTechnique(i,r,o,s),a=this._rctx.bindTechnique(n,this._bindParameters,e);this._render(a)}drawImageData(e,r,t,i,s=f.Off){if(null==e.texture)return;const o=e.baseOpacity<1?d.Required:d.NotRequired;e.fboTexture=r===_.GroupBackgroundComposite||i===u.Normal&&o===d.NotRequired&&s===f.Off?null:this.switch(t).colorTexture;const n=this._acquireBlendLayersTechnique(i,r,o,s),a=this._rctx.bindTechnique(n,this._bindParameters,e);this._render(a)}drawRasterData(e,r,t,i,s){const o=s.sourceLayerInfo.data;if(!o.source)return;if(s.tile.surface.layerViewByIndex(s.layerIndex,a.MAP).ensureSymbolizerParameters(o),!o.bind(this._rctx))return;const n=e.baseOpacity<1?d.Required:d.NotRequired;e.fboTexture=i===u.Normal&&n===d.NotRequired?null:this.switch(t).colorTexture;const l=this._acquireRasterColorizerTechnique(o,r,i,n);o.opacity=e.opacity;const h=o.getUniforms();h.scale=s.scale,h.offset=s.offset,h.backgroundColor=e.backgroundColor,h.fboTexture=e.fboTexture,h.baseOpacity=e.baseOpacity;const c=this._rctx.bindTechnique(l,this._bindParameters,h);this._render(c)}_acquireRasterColorizerTechnique(e,r,t,s){const o=e.symbolizerParameters,n=["stretch","lut","hillshade"].indexOf(o.type);return null==this._rasterColorizerConfig&&(this._rasterColorizerConfig=new h,this._rctx.gl.getExtension("WEBGL_color_buffer_float"),this._rctx.gl.getExtension("OES_texture_float")),this._rasterColorizerConfig.output=r,this._rasterColorizerConfig.blendMode=t,this._rasterColorizerConfig.baseOpacityMode=s,this._rasterColorizerConfig.colorizerType=n,this._rasterColorizerConfig.applyColormap=!!o.colormap,this._rasterColorizerConfig.requireBilinearWithNN=e.isBilinearWithStretchColorRamp,this._rasterColorizerConfig.stretchType=e.hasStretchTypeNone()?i.Noop:i.PerBand,this._techniques.precompile(l,this._rasterColorizerConfig),this._techniques.get(l,this._rasterColorizerConfig)}drawVectorData(e,r,i,s,o,n,l,h){const p=this._rctx,m=o.sourceLayerInfo.data,b=o.tile.surface.layerViewByIndex(o.layerIndex,a.MAP),g=e.baseOpacity<1?d.Required:d.NotRequired,y=g===d.Required||e.opacity<1||s!==u.Normal||r!==_.Composite,C=y?f.On:f.Off,x=this._acquireBlendLayersTechnique(s,r,g,C);p.setPipelineState(x.getPipeline());let q=null,O=null;y?(O=this.currentFBO(i),null==this._vtFBO&&(this._vtFBO=new c(this._rctx)),q=this._vtFBO.get(i),p.bindFramebuffer(q),this._clearCurrentFBO()):h&&p.clear(T.DEPTH);try{this._vectorTileHelper.renderBackground(p,o.sourceLod,b.painter,b.layer.styleRepository,b.schemaHelper,Math.round(1/o.scale),o.offset,l,n,b.contentZoom),m&&this._vectorTileHelper.renderContent(p,o.sourceLod,m,o.vtlNeighborInfos,b.painter,b.layer.styleRepository,b.schemaHelper,Math.round(1/o.scale),o.offset,l,n,b.contentZoom)}catch(L){B().warnOnce("A render call containing vector tiles did not resolve correctly.",L)}return!q||(p.bindFramebuffer(O),e.texture=q.colorTexture,e.offset=t,e.scale=1,this.drawImageData(e,r,i,s,C),h)}copyFBOToTexture(e){const r=this._rctx,t=r.bindTexture(e.texture,x.TEXTURE_UNIT_FOR_UPDATES),i=e.descriptor;r.gl.copyTexImage2D(C.TEXTURE_2D,0,i.pixelFormat,0,0,i.width,i.height,0),e.generateMipmap(),r.bindTexture(t,x.TEXTURE_UNIT_FOR_UPDATES)}_clearCurrentFBO(){this._rctx.setStencilWriteMask(255),this._rctx.setClearColor(0,0,0,0),this._rctx.setClearDepth(1),this._rctx.setClearStencil(0),this._rctx.clear(T.COLOR|T.DEPTH|T.STENCIL)}_initFBO(e,r,t){this._rctx.bindFramebuffer(e),t&&(this._rctx.setViewport(0,0,r,r),this._clearCurrentFBO())}ensureBuffer(e){this._lastUsedIds.length=0,this._lastUsedIds.push(1),this._lastCreatedBufferId=1,this._onHoldIds.length=0,this.bind(e)}bind(e,r=0,t=!0){if(this._current=r,r>=this._fbos.length)for(let i=this._fbos.length;i<=r;i++)this._fbos.push(new c(this._rctx));this._initFBO(this._fbos[r].get(e),e,t)}_bindNextFreeBuffer(e){this._lastUsedIds.length>0?this.bind(e,this._lastUsedIds.pop()):(this._lastCreatedBufferId++,this.bind(e,this._lastCreatedBufferId))}openGroup(e){this._onHoldIds.push(this._current),this._bindNextFreeBuffer(e)}switch(e){const r=this.currentFBO(e),t=this._current;return this._bindNextFreeBuffer(e),this._lastUsedIds.push(t),r}getLastOnHoldId(){return this._onHoldIds[this._onHoldIds.length-1]}closeGroup(e){const r=this._current;this._bindNextFreeBuffer(e),this._lastUsedIds.push(r),this._lastUsedIds.push(this._onHoldIds.pop())}unbind(){this._rctx.bindFramebuffer(null)}currentFBO(e){return this._fbos[this._current].get(e)}}export{O as TileCompositor};