@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 5.11 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{lerp as t}from"../../../../../core/mathUtils.js";import{watch as r,syncAndInitial as s}from"../../../../../core/reactiveUtils.js";import{property as o}from"../../../../../core/accessorSupport/decorators/property.js";import"../../../../../core/has.js";import"../../../../../core/Logger.js";import"../../../../../core/RandomLCG.js";import{subclass as i}from"../../../../../core/accessorSupport/decorators/subclass.js";import{RenderCategory as a}from"../../../webgl.js";import m from"../../../webgl/RenderNode.js";import{b as l,c as u,a as n}from"../../../../../chunks/BloomBlur.glsl.js";import{BloomBlurTechnique as h}from"./BloomBlurTechnique.js";import{BloomBlurTechniqueConfiguration as c}from"./BloomBlurTechniqueConfiguration.js";import{a as p,e as b}from"../../../../../chunks/BloomComposition.glsl.js";import{BloomCompositionTechnique as d}from"./BloomCompositionTechnique.js";import{a as _}from"../../../../../chunks/BloomDepthAdjust.glsl.js";import{BloomDepthAdjustTechnique as g}from"./BloomDepthAdjustTechnique.js";import{RenderRequestType as f}from"../../lib/basicInterfaces.js";import{ColorAttachment as P,FramebufferBit as T}from"../../../../webgl/enums.js";let C=class extends m{constructor(e){super(e),this.consumes={required:[a.COMPOSITE,"emissive"]},this.produces=a.COMPOSITE,this._blurHorizontalConfiguration=new c,this._blurVerticalConfiguration=new c,this._compositionParameters=new p,this._depthAdjustParameters=new _,this._blurParameters=new l,this._blurScale=3.06,this._bloomResults=new Array}initialize(){this.addHandles([r((()=>this._updateFogParameters()),(()=>{}),s)])}destroy(){}_updateFogParameters(){const e=this.view.environment.weather;if("sunny"===e.type||"cloudy"===e.type)this._blurParameters.blurRadius=u[e.type],this._compositionParameters.exposure=b[e.type];else{const r="foggy"===e.type?e.fogStrength:e.precipitation;this._blurParameters.blurRadius=t(u[e.type],.004,r),this._compositionParameters.exposure=t(3,b[e.type],1-r)}this.requestRender(f.UPDATE)}precompile(){this._blurHorizontalConfiguration.bloomStage=n.Horizontal,this._blurVerticalConfiguration.bloomStage=n.Vertical,this.techniques.precompile(h,this._blurHorizontalConfiguration),this.techniques.precompile(h,this._blurVerticalConfiguration),this.techniques.precompile(d),this.techniques.precompile(g)}render(e){const t=e.find((({name:e})=>e===a.COMPOSITE)),r=t.getAttachment(P.COLOR_ATTACHMENT1)?.attachment;if(!r)return t;const s=this.techniques.get(h,this._blurHorizontalConfiguration),o=this.techniques.get(h,this._blurVerticalConfiguration),i=this.techniques.get(d),m=this.techniques.get(g);if(!(s.compiled&&o.compiled&&i.compiled&&m.compiled))return this.requestRender(f.UPDATE),t;const l=t.getTexture(),u=this.fboCache,{fullWidth:n,fullHeight:c}=this.bindParameters.camera,p=this.renderingContext,b=u.acquire(n,c,"emissiveDepthAdjusted");this._depthAdjustParameters.color=r,this._prepareFBO(b,n,c),p.bindTechnique(m,this.bindParameters,this._depthAdjustParameters),p.screen.draw();let _=b.getTexture(),T=Math.round(n/2),C=Math.round(c/2);const j=5,q=this._blurParameters.blurRadius;for(let a=0;a<j;a++){const e=u.acquire(T,C,"bloomHorizontal");this._blurParameters.color=_,this._prepareFBO(e,T,C),p.bindTechnique(s,this.bindParameters,this._blurParameters),p.screen.draw(),0===a&&b.release();const t=u.acquire(T,C,"bloomVertical");this._blurParameters.color=e.getTexture(),this._prepareFBO(t,T,C),p.bindTechnique(o,this.bindParameters,this._blurParameters),p.screen.draw(),e.release(),this._bloomResults[a]=t,T=Math.ceil(T/2),C=Math.ceil(C/2),_=this._bloomResults[a].getTexture(),this._blurParameters.blurRadius*=this._blurScale}this._blurParameters.blurRadius=q,this._compositionParameters.color=l,this._compositionParameters.bloomTexture0=this._bloomResults[0].getTexture(),this._compositionParameters.bloomTexture1=this._bloomResults[1].getTexture(),this._compositionParameters.bloomTexture2=this._bloomResults[2].getTexture(),this._compositionParameters.bloomTexture3=this._bloomResults[3].getTexture(),this._compositionParameters.bloomTexture4=this._bloomResults[4].getTexture();const R=this.acquireOutputFramebuffer();return this._prepareFBO(R,n,c),p.bindTechnique(i,this.bindParameters,this._compositionParameters),p.screen.draw(),this._bloomResults.forEach((e=>e.release())),R.attachDepth(t.getAttachment(this.gl.DEPTH_STENCIL_ATTACHMENT)),R.attachColor(t.getAttachment(P.COLOR_ATTACHMENT1),P.COLOR_ATTACHMENT1),R}_prepareFBO(e,t,r){const s=this.renderingContext;s.bindFramebuffer(e.fbo),s.setViewport(0,0,t,r),s.setClearColor(0,0,0,0),s.clear(T.COLOR)}get test(){return{compositionParameters:this._compositionParameters,depthAdjustParameters:this._depthAdjustParameters,blurParameters:this._blurParameters}}};e([o()],C.prototype,"consumes",void 0),e([o()],C.prototype,"produces",void 0),C=e([i("esri.views.3d.webgl-engine.effects.bloom.BloomRenderNode")],C);export{C as BloomRenderNode};