// All material copyright Esri, All Rights Reserved, unless otherwise specified. // See https://js.arcgis.com/4.30/esri/copyright.txt for details. //>>built define("exports ../../../chunks/tslib.es6 ../../../core/Evented ../../../core/has ../../../core/MapUtils ../../../core/maybe ../../../core/PooledArray ../../../core/reactiveUtils ../../../core/SetUtils ../../../core/accessorSupport/decorators/property ../../../core/Logger ../../../core/RandomLCG ../../../core/accessorSupport/decorators/subclass ../../../core/libs/gl-matrix-2/math/mat4 ../../../chunks/vec32 ../../../core/libs/gl-matrix-2/factories/vec3f64 ../../ViewingMode ../layers/interfaces ../support/debugFlags ./interfaces ./Overlay ./OverlayContent ./OverlayRenderTargets ../webgl/RenderCamera ../webgl-engine/core/shaderLibrary/ShaderOutput ../webgl-engine/core/shaderLibrary/terrain/Overlay.glsl ../../../chunks/TextureOnly.glsl ../webgl-engine/core/shaderTechnique/ShaderTechniqueRepository ../webgl-engine/effects/RenderPlugin ../webgl-engine/lib/GLMaterialRepository ../webgl-engine/lib/GridLocalOriginFactory ../webgl-engine/lib/Material ../webgl-engine/lib/RenderContext ../webgl-engine/lib/RenderSlot ../webgl-engine/lib/ShadowMap ../webgl-engine/lib/SortedRenderGeometryRenderer ../webgl-engine/lib/TextureTechnique ../webgl-engine/lib/TextureTechniqueConfiguration ../webgl-engine/lib/TransparencyPassType ../webgl-engine/lib/UpdatePolicy ../webgl-engine/lighting/Lightsources ../../../chunks/OverlayCompositing.glsl ../webgl-engine/shaders/OverlayCompositingTechnique ../../support/Scheduler ../../webgl/enums ../../webgl/Texture ../../webgl/TextureDescriptor".split(" "), function(f,h,O,qa,w,x,P,n,B,k,ra,sa,Q,K,R,S,T,p,C,y,L,l,U,V,r,z,W,X,Y,Z,aa,ba,D,t,ca,da,ea,fa,ha,ia,ja,ka,la,M,E,ma,na){f.OverlayRenderer=class extends Y.SyncRenderPlugin{constructor(a){super(a);this._renderTargets=this._overlays=null;this._overlayParameters=new ka.OverlayCompositingPassParameters;this._hasWater=this.hasHighlights=!1;this._renderers=new Map;this._sortedDrapeSourceRenderersDirty=!1;this._sortedRenderers=new P;this._passParameters=new W.TextureOnlyPassParameters;this._materials=null; this._screenToWorldRatio=1;this._localOriginFactory=null;this.unloadedMemory=0;this.ignoresMemoryFactor=!1;this._camera=new V;this.worldToPCSRatio=1;this.events=new O;this.longitudeCyclical=null;this.produces=new Map([[t.RenderSlot.DRAPED_MATERIAL,b=>b!==r.ShaderOutput.Highlight||this.hasHighlights],[t.RenderSlot.DRAPED_WATER,()=>this._hasWater]]);this._hasDrapedRasterSource=this._hasDrapedFeatureSource=this._hasTargetWithoutRasterImage=!1}initialize(){const a=this.view._stage.renderer.fboCache,b= this.view._stage.renderView,{waterTextures:c,stippleTextures:d,markerTextures:e}=b;this._techniques=new X.ShaderTechniqueRepository({rctx:this._rctx,viewingMode:T.ViewingMode.Local,stippleTextures:d,markerTextures:e,waterTextures:c});this._renderContext=new D.OverlayRenderContext(this._rctx,new ca.ShadowMap(a,this.view.state.viewingMode),null);this.addHandles([n.watch(()=>c.updating,()=>this.events.emit("content-changed"),n.syncAndInitial),n.watch(()=>this.spatialReference,g=>this._localOriginFactory= new aa.GridLocalOriginFactory(g),n.syncAndInitial),n.on(()=>this.view.allLayerViews,"after-changes",()=>this._sortedDrapeSourceRenderersDirty=!0)]);this._materials=new Z.GLMaterialRepository(b.textures,this._techniques,()=>{this.notifyChange("rendersOccludedDraped");this.events.emit("content-changed");this.notifyChange("updating");this.notifyChange("isEmpty")},()=>this.events.emit("content-changed"));this._bindParameters.slot=t.RenderSlot.DRAPED_MATERIAL;this._bindParameters.mainDepth=null;this._camera.near= 1;this._camera.far=1E4;this._camera.relativeElevation=null;this._bindParameters.camera=this._camera;this._bindParameters.transparencyPassType=ha.TransparencyPassType.NONE;this._bindParameters.newLighting.noonFactor=0;this._bindParameters.newLighting.globalFactor=0;this._bindParameters.newLighting.set([new ja.AmbientLight(S.fromValues(1,1,1))]);this.addHandles(this.view.resourceController.scheduler.registerTask(M.TaskPriority.STAGE,this))}destroy(){this._renderers.forEach(a=>a.destroy());this._renderers.clear(); this._debugTextureTechnique=x.releaseMaybe(this._debugTextureTechnique);this._passParameters.texture=x.disposeMaybe(this._passParameters.texture);this._techniques=x.destroyMaybe(this._techniques);this.disposeOverlays()}get _bindParameters(){return this._renderContext.bindParameters}get _rctx(){return this.view._stage.renderView.renderingContext}get rctx(){return this._rctx}get materials(){return this._materials}get screenToWorldRatio(){return this._screenToWorldRatio}get localOriginFactory(){return this._localOriginFactory}initializeRenderContext(a){this.pluginContext= a}uninitializeRenderContext(){}renderNode(){}get updating(){return this._sortedDrapeSourceRenderersDirty||w.someMap(this._renderers,a=>a.updating)}get hasOverlays(){return null!=this._overlays&&null!=this._renderTargets}getMaterialRenderer(a){for(const b of this._renderers.values()){const c=b.getMaterialRenderer(a);if(c)return c}return null}get layers(){this._sortedDrapeSourceRenderersDirty&&this._updateSortedDrapeSourceRenderers();return this._sortedRenderers.map(a=>a.drapeSource.layer).filter(a=> !!a)}createGeometryDrapeSourceRenderer(a){return this.createDrapeSourceRenderer(a,da.SortedRenderGeometryRenderer)}createDrapeSourceRenderer(a,b,c){const d=this._renderers.get(a);null!=d&&d.destroy();b=new b({...c,rendererContext:this,drapeSource:a});this._renderers.set(a,b);this._sortedDrapeSourceRenderersDirty=!0;"fullOpacity"in a&&this.addHandles(n.watch(()=>a.fullOpacity,()=>this.events.emit("content-changed")),a);return b}removeDrapeSourceRenderer(a){if(null!=a){var b=this._renderers.get(a); null!=b&&(this._sortedDrapeSourceRenderersDirty=!0,this._renderers.delete(a),this.removeHandles(a),b.destroy())}}computeValidity(){return this._renderTargets?.computeValidity()??0}releaseRenderTargets(){this._renderTargets?.dispose()}get overlays(){return this._overlays??[]}ensureDrapeTargets(a){this._hasTargetWithoutRasterImage=this._overlays?B.someSet(a,b=>b.drapeTargetType===p.DrapeTargetType.WithoutRasterImage):!1}ensureDrapeSources(a){this._overlays?(this._hasDrapedFeatureSource=B.someSet(a, b=>b.drapeSourceType===p.DrapeSourceType.Features),this._hasDrapedRasterSource=B.someSet(a,b=>b.drapeSourceType===p.DrapeSourceType.RasterImage)):this._hasDrapedFeatureSource=this._hasDrapedRasterSource=!1}get _needsColorWithoutRasterImage(){return this._hasDrapedRasterSource&&this._hasDrapedFeatureSource&&this._hasTargetWithoutRasterImage}ensureOverlays(a,b,c=this._bindParameters.overlayStretch){null==this._overlays&&(this._renderTargets=new U.OverlayRenderTargets(this.view._stage.renderer.fboCache), this._overlays=[new L.Overlay,new L.Overlay]);this.ensureDrapeTargets(a);this.ensureDrapeSources(b);this._bindParameters.overlayStretch=c}disposeOverlays(){this._overlays=null;this._renderTargets=x.disposeMaybe(this._renderTargets);this.events.emit("textures-disposed")}getTexture(a){if(null!=a)return a===l.OverlayContent.ColorNoRasterImage&&!this._needsColorWithoutRasterImage&&this._hasDrapedFeatureSource?this._renderTargets?.getTexture(l.OverlayContent.Color):this._renderTargets?.getTexture(a)}get running(){return this.updating}runTask(a){this._processDrapeSources(a, ()=>!0)}_processDrapeSources(a,b){let c=!1;for(const [d,e]of this._renderers){if(a.done)break;(d.destroyed||b(d))&&e.commitChanges()&&(c=!0,a.madeProgress())}this._sortedDrapeSourceRenderersDirty&&(this._sortedDrapeSourceRenderersDirty=!1,c=!0,this._updateSortedDrapeSourceRenderers());c&&(null!=this._overlays&&0===this._renderers.size&&this.disposeOverlays(),this.notifyChange("updating"),this.notifyChange("isEmpty"),this.events.emit("content-changed"),this.hasHighlights=w.someMap(this._renderers, d=>d.hasHighlights),this.notifyChange("rendersOccludedDraped"),this._updateHasWater())}processSyncDrapeSources(){this._processDrapeSources(M.noBudget,a=>a.updatePolicy===ia.UpdatePolicy.SYNC)}get isEmpty(){return C.debugFlags.OVERLAY_DRAW_DEBUG_TEXTURE?!1:!w.someMap(this._renderers,a=>!a.isEmpty)}get hasWater(){return this._hasWater}get rendersOccludedDraped(){const a=this._renderContext.renderOccludedMask;this._renderContext.renderOccludedMask=F;const b=this._sortedRenderers.some(({renderer:c})=> c.shouldRender(this._renderContext));this._renderContext.renderOccludedMask=a;return b}renders(a){return C.debugFlags.OVERLAY_DRAW_DEBUG_TEXTURE&&a!==l.OverlayContent.Occluded||this._sortedRenderers.some(({renderer:b})=>b.shouldRender(this._renderContext))}get mode(){return this.isEmpty?z.OverlayMode.Disabled:this._renderTargets?.getTexture(l.OverlayContent.WaterNormal)?z.OverlayMode.EnabledWithWater:this._renderTargets?.getTexture(l.OverlayContent.Color)?z.OverlayMode.Enabled:z.OverlayMode.Disabled}updateAnimation(a){let b= !1;this._renderers.forEach(c=>b=c.updateAnimation(a)||b);return b}updateDrapeSourceOrder(){this._sortedDrapeSourceRenderersDirty=!0}drawOverlays(a){if(this._overlays&&this._renderTargets){for(var b of this._overlays)this.longitudeCyclical?b.setupGeometryViewsCyclical(this.longitudeCyclical):b.setupGeometryViewsDirect();for(const c of this._renderTargets.targets){if(c.content===l.OverlayContent.ColorNoRasterImage&&!this._needsColorWithoutRasterImage)continue;b=this._drawTarget(y.OverlayIndex.INNER, c,a);const d=this._drawTarget(y.OverlayIndex.OUTER,c,a);(b||d)&&c.fbo.generateMipMap()}}}_drawTarget(a,b,c){const d=this._overlays[a],e=d.canvasGeometries;if(0===e.numViews)return!1;const {alignPixelEnabled:g,contentPixelRatio:m}=c;this._screenToWorldRatio=m*d.mapUnitsPerPixel/this._bindParameters.overlayStretch;const u=b.output;if(this.isEmpty||u===r.ShaderOutput.Highlight&&!this.hasHighlights||u===r.ShaderOutput.Normal&&!this.hasWater||!d.hasSomeSizedView())return!1;const v=this._rctx;this._camera.pixelRatio= d.pixelRatio*m;this._renderContext.output=u;this._bindParameters.alignPixelEnabled=g;this._bindParameters.screenToWorldRatio=this._screenToWorldRatio;this._bindParameters.screenToPCSRatio=this._screenToWorldRatio*this.worldToPCSRatio;this._bindParameters.slot=u===r.ShaderOutput.Normal?t.RenderSlot.DRAPED_WATER:t.RenderSlot.DRAPED_MATERIAL;b.content===l.OverlayContent.Occluded&&(this._renderContext.renderOccludedMask=F);if(!this.renders(b.content))return this._renderContext.renderOccludedMask=D.defaultRenderOccludedMask, !1;c=d.resolution;this._rctx.setViewport(a===y.OverlayIndex.INNER?0:c,0,c,c);const G=2*d.resolution,H=d.resolution,N=b.fbo;N.bind(v,G,H);a===y.OverlayIndex.INNER&&(v.setClearColor(0,0,0,0),v.clear(E.ClearBufferBit.COLOR_BUFFER_BIT));if(C.debugFlags.OVERLAY_DRAW_DEBUG_TEXTURE&&b.content!==l.OverlayContent.Occluded)for(c=0;c{if(b.content!==l.OverlayContent.ColorNoRasterImage||q.drapeSourceType!==p.DrapeSourceType.RasterImage){var {fullOpacity:I}=q;q=null!=I&&1>I&&u===r.ShaderOutput.Color?this.bindTemporaryFramebuffer(G,H):null;for(let J=0;J{const e=a.indexOf(d.layer),g=0<=e;this._sortedRenderers.push(new pa(d,c,b*(d.renderGroup??(g?p.DrapedRenderGroup.MapLayer:p.DrapedRenderGroup.ViewLayer))+(g?e:0)))});this._sortedRenderers.sort((c,d)=>c.index-d.index)}}_setViewParameters(a,b){const c=this._camera;c.viewport=[0,0,b.resolution,b.resolution];K.ortho(c.projectionMatrix,0,a[2]-a[0],0,a[3]-a[1],c.near,c.far);K.fromTranslation(c.viewMatrix,[-a[0],-a[1],0])}_updateHasWater(){const a=w.someMap(this._renderers,b=>b.hasWater);a!==this._hasWater&& (this._hasWater=a,this.events.emit("has-water",a))}_ensureDebugPatternResources(a,b){R.set(this._passParameters.color,b[0],b[1],b[2]);if(!this._passParameters.texture){b=new Uint8Array(a*a*4);var c=0;for(let d=0;dg||2>m||10*g>a-20||10*m>a-20?(b[c++]=255,b[c++]=255,b[c++]=255,b[c++]=255):(b[c++]=255,b[c++]=255,b[c++]=255,g&1&&m&1?b[c++]=e&1^d&1?0:255:b[c++]=g&1^m&1?0:128)}a=new na.TextureDescriptor(a);a.samplingMode=E.TextureSamplingMode.NEAREST; this._passParameters.texture=new ma.Texture(this._rctx,a,b);a=new fa.TextureTechniqueConfiguration;a.hasAlpha=!0;this._debugTextureTechnique=this._techniques.acquire(ea.TextureTechnique,a)}}get test(){}};h.__decorate([k.property()],f.OverlayRenderer.prototype,"hasHighlights",void 0);h.__decorate([k.property()],f.OverlayRenderer.prototype,"_sortedDrapeSourceRenderersDirty",void 0);h.__decorate([k.property()],f.OverlayRenderer.prototype,"_techniques",void 0);h.__decorate([k.property({constructOnly:!0})], f.OverlayRenderer.prototype,"view",void 0);h.__decorate([k.property()],f.OverlayRenderer.prototype,"worldToPCSRatio",void 0);h.__decorate([k.property()],f.OverlayRenderer.prototype,"spatialReference",void 0);h.__decorate([k.property({type:Boolean,readOnly:!0})],f.OverlayRenderer.prototype,"updating",null);h.__decorate([k.property()],f.OverlayRenderer.prototype,"isEmpty",null);h.__decorate([k.property({readOnly:!0})],f.OverlayRenderer.prototype,"rendersOccludedDraped",null);f.OverlayRenderer=h.__decorate([Q.subclass("esri.views.3d.terrain.OverlayRenderer")], f.OverlayRenderer);class pa{constructor(a,b,c){this.drapeSource=a;this.renderer=b;this.index=c}}const oa=[[1,.5,.5],[.5,.5,1]],F=ba.RenderOccludedFlag.OccludeAndTransparent;f.drapedZ=-2;f.overlayRenderOccludedFlag=F;Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})});