@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 5.33 kB
JavaScript
import{disposeMaybe as t}from"../../../../../../core/maybe.js";import e from"../../VertexStream.js";import{BlendFactor as i,TargetType as s,DepthStencilTargetType as r,TextureType as o,PixelFormat as n,PixelType as a,TextureWrapMode as h,TextureSamplingMode as l}from"../../../../../webgl/enums.js";import{FramebufferObject as u}from"../../../../../webgl/FramebufferObject.js";const p=5,m=[1,0],_=[0,1],c=[1,.8,.6,.4,.2],d=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];class T{constructor(){this._intensityFBO=null,this._compositeFBO=null,this._mipsFBOs=new Array(p),this._nMips=p,this._kernelSizeArray=[3,5,7,9,11],this._size=[0,0],this._programDesc={luminosityHighPass:{vsPath:"post-processing/pp",fsPath:"post-processing/bloom/luminosityHighPass",attributes:new Map([["a_position",0]])},gaussianBlur:{vsPath:"post-processing/pp",fsPath:"post-processing/bloom/gaussianBlur",attributes:new Map([["a_position",0]])},composite:{vsPath:"post-processing/pp",fsPath:"post-processing/bloom/composite",attributes:new Map([["a_position",0]])},blit:{vsPath:"post-processing/pp",fsPath:"post-processing/blit",attributes:new Map([["a_position",0]])}}}dispose(){if(this._quad=t(this._quad),this._intensityFBO=t(this._intensityFBO),this._compositeFBO=t(this._compositeFBO),this._mipsFBOs){for(let t=0;t<this._nMips;t++)this._mipsFBOs[t]&&(this._mipsFBOs[t].horizontal.dispose(),this._mipsFBOs[t].vertical.dispose());this._mipsFBOs=null}}draw(t,s,r){const{width:o,height:n}=s,{context:a,painter:h}=t,{materialManager:l}=h,u=a.gl,T=this._programDesc,{strength:f,radius:g,threshold:B}=r;this._quad||(this._quad=new e(a,[-1,-1,1,-1,-1,1,1,1])),this._createOrResizeResources(t,o,n),a.setStencilTestEnabled(!1),a.setBlendingEnabled(!0),a.setBlendFunction(i.ONE,i.ONE_MINUS_SRC_ALPHA),a.setStencilWriteMask(0);const O=this._quad;O.bind(),a.bindFramebuffer(this._intensityFBO);const F=l.getProgram(T.luminosityHighPass);a.useProgram(F),a.bindTexture(s.colorTexture,0),F.setUniform1i("u_texture",0),F.setUniform3fv("u_defaultColor",[0,0,0]),F.setUniform1f("u_defaultOpacity",0),F.setUniform1f("u_luminosityThreshold",B),F.setUniform1f("u_smoothWidth",.01);const b=[Math.round(o/2),Math.round(n/2)];a.setViewport(0,0,b[0],b[1]),a.setClearColor(0,0,0,0),a.clear(u.COLOR_BUFFER_BIT),O.draw(),a.setBlendingEnabled(!1);let E=this._intensityFBO.colorTexture;for(let e=0;e<this._nMips;e++){const t=l.getProgram(T.gaussianBlur,[{name:"radius",value:this._kernelSizeArray[e]}]);a.useProgram(t),a.bindTexture(E,e+1),t.setUniform1i("u_colorTexture",e+1),t.setUniform2fv("u_texSize",b),t.setUniform2fv("u_direction",m),a.setViewport(0,0,b[0],b[1]);const i=this._mipsFBOs[e];a.bindFramebuffer(i.horizontal),O.draw(),E=i.horizontal.colorTexture,a.bindFramebuffer(i.vertical),a.bindTexture(E,e+1),t.setUniform2fv("u_direction",_),O.draw(),E=i.vertical.colorTexture,b[0]=Math.round(b[0]/2),b[1]=Math.round(b[1]/2)}a.setViewport(0,0,o,n);const x=l.getProgram(T.composite,[{name:"nummips",value:p}]);a.bindFramebuffer(this._compositeFBO),a.useProgram(x),x.setUniform1f("u_bloomStrength",f),x.setUniform1f("u_bloomRadius",g),x.setUniform1fv("u_bloomFactors",c),x.setUniform3fv("u_bloomTintColors",d),a.bindTexture(this._mipsFBOs[0].vertical.colorTexture,1),x.setUniform1i("u_blurTexture1",1),a.bindTexture(this._mipsFBOs[1].vertical.colorTexture,2),x.setUniform1i("u_blurTexture2",2),a.bindTexture(this._mipsFBOs[2].vertical.colorTexture,3),x.setUniform1i("u_blurTexture3",3),a.bindTexture(this._mipsFBOs[3].vertical.colorTexture,4),x.setUniform1i("u_blurTexture4",4),a.bindTexture(this._mipsFBOs[4].vertical.colorTexture,5),x.setUniform1i("u_blurTexture5",5),O.draw(),a.bindFramebuffer(s),a.setBlendingEnabled(!0);const w=l.getProgram(T.blit);a.useProgram(w),a.bindTexture(this._compositeFBO.colorTexture,6),w.setUniform1i("u_texture",6),a.setBlendFunction(i.ONE,i.ONE),O.draw(),O.unbind(),a.setBlendFunction(i.ONE,i.ONE_MINUS_SRC_ALPHA),a.setStencilTestEnabled(!0)}_createOrResizeResources(t,e,i){const{context:p}=t;if(this._compositeFBO&&this._size[0]===e&&this._size[1]===i)return;this._size[0]=e,this._size[1]=i;const m=[Math.round(e/2),Math.round(i/2)];this._compositeFBO?this._compositeFBO.resize(e,i):this._compositeFBO=new u(p,{colorTarget:s.TEXTURE,depthStencilTarget:r.NONE,width:e,height:i}),this._intensityFBO?this._intensityFBO.resize(m[0],m[1]):this._intensityFBO=new u(p,{colorTarget:s.TEXTURE,depthStencilTarget:r.NONE,width:m[0],height:m[1]},{target:o.TEXTURE_2D,pixelFormat:n.RGBA,internalFormat:n.RGBA,dataType:a.UNSIGNED_BYTE,wrapMode:h.CLAMP_TO_EDGE,samplingMode:l.LINEAR,flipped:!1,width:m[0],height:m[1]});for(let _=0;_<this._nMips;_++)this._mipsFBOs[_]?(this._mipsFBOs[_].horizontal.resize(m[0],m[1]),this._mipsFBOs[_].vertical.resize(m[0],m[1])):this._mipsFBOs[_]={horizontal:new u(p,{colorTarget:s.TEXTURE,depthStencilTarget:r.NONE,width:m[0],height:m[1]},{target:o.TEXTURE_2D,pixelFormat:n.RGBA,internalFormat:n.RGBA,dataType:a.UNSIGNED_BYTE,wrapMode:h.CLAMP_TO_EDGE,samplingMode:l.LINEAR,flipped:!1,width:m[0],height:m[1]}),vertical:new u(p,{colorTarget:s.TEXTURE,depthStencilTarget:r.NONE,width:m[0],height:m[1]},{target:o.TEXTURE_2D,pixelFormat:n.RGBA,internalFormat:n.RGBA,dataType:a.UNSIGNED_BYTE,wrapMode:h.CLAMP_TO_EDGE,samplingMode:l.LINEAR,flipped:!1,width:m[0],height:m[1]})},m[0]=Math.round(m[0]/2),m[1]=Math.round(m[1]/2)}}export{T as Bloom};