@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 4.4 kB
JavaScript
import{disposeMaybe as e,applySome as s,isSome as t,isNone as r}from"../../../../core/maybe.js";import{Milliseconds as i}from"../../../../core/time.js";import{s as a}from"../../../../chunks/vec2.js";import{createQuadVAO as h}from"./glUtil3D.js";import{SSAOBlurTechnique as _}from"./SSAOBlurTechnique.js";import{noiseData as o}from"./SSAONoiseData.js";import{SSAOTechnique as u}from"./SSAOTechnique.js";import{g as n}from"../../../../chunks/SSAO.glsl.js";import{SSAOPassParameters as l,BlurDrawParameters as m}from"../shaders/SSAOParameters.js";import{PrimitiveType as b,TextureType as c,PixelFormat as d,PixelType as p,TextureSamplingMode as T,TextureWrapMode as O,TargetType as B,DepthStencilTargetType as F}from"../../../webgl/enums.js";import{FramebufferObject as w}from"../../../webgl/FramebufferObject.js";import{Texture as f}from"../../../webgl/Texture.js";import{vertexCount as g}from"../../../webgl/Util.js";const q=2;class P{constructor(e,s,t,r){this._view=e,this._techniqueRepository=s,this._rctx=t,this._requestRender=r,this._quadVAO=null,this._passParameters=new l,this._drawParameters=new m}dispose(){this.enabled=!1,this._quadVAO=e(this._quadVAO)}disposeOffscreenBuffers(){s(this._ssaoFBO,(e=>e.resize(0,0))),s(this._blur0FBO,(e=>e.resize(0,0))),s(this._blur1FBO,(e=>e.resize(0,0)))}set enabled(e){e?this._enable():this._disable()}get enabled(){return t(this._enableTime)}get active(){return this.enabled&&this._ssaoTechnique.compiled&&this._blurTechnique.compiled}get colorTexture(){return t(this._blur1FBO)?this._blur1FBO.colorTexture:null}render(e,s,t,i){if(r(this._enableTime)||r(t)||r(i)||r(this._ssaoFBO)||r(this._blur0FBO)||r(this._blur1FBO))return;if(!this.active)return this._enableTime=s,void this._requestRender();0===this._enableTime&&(this._enableTime=s);const _=this._rctx,o=e.camera,u=this._view.qualitySettings.fadeDuration,l=u>0?Math.min(u,s-this._enableTime)/u:1;this._passParameters.normalTexture=i,this._passParameters.depthTexture=t,this._passParameters.projScale=1/o.computeRenderPixelSizeAtDist(1),this._passParameters.intensity=4*A/n(o)**6*l;const m=o.fullViewport,c=m[2],d=m[3],p=c/q,T=d/q;this._ssaoFBO.resize(c,d),this._blur0FBO.resize(p,T),this._blur1FBO.resize(p,T),r(this._quadVAO)&&(this._quadVAO=h(this._rctx)),_.bindFramebuffer(this._ssaoFBO),_.setViewport(0,0,c,d);_.bindTechnique(this._ssaoTechnique,this._passParameters,e).bindDraw(this._drawParameters,e,this._passParameters),_.bindVAO(this._quadVAO);const O=g(this._quadVAO,"geometry");_.drawArrays(b.TRIANGLE_STRIP,0,O);const B=_.bindTechnique(this._blurTechnique,this._passParameters,e);_.setViewport(0,0,p,T),_.bindFramebuffer(this._blur0FBO),this._drawParameters.colorTexture=this._ssaoFBO.colorTexture,a(this._drawParameters.blurSize,0,q/d),B.bindDraw(this._drawParameters,e,this._passParameters),_.setViewport(0,0,p,T),_.drawArrays(b.TRIANGLE_STRIP,0,O),_.bindFramebuffer(this._blur1FBO),this._drawParameters.colorTexture=this._blur0FBO.colorTexture,a(this._drawParameters.blurSize,q/c,0),B.bindDraw(this._drawParameters,e,this._passParameters),_.drawArrays(b.TRIANGLE_STRIP,0,O),_.setViewport(m[0],m[1],m[2],m[3]),l<1&&this._requestRender()}_enable(){if(t(this._enableTime))return;const e={target:c.TEXTURE_2D,pixelFormat:d.RGBA,dataType:p.UNSIGNED_BYTE,samplingMode:T.LINEAR,wrapMode:O.CLAMP_TO_EDGE,width:0,height:0},s={colorTarget:B.TEXTURE,depthStencilTarget:F.NONE};this._ssaoFBO=new w(this._rctx,s,e),this._blur0FBO=new w(this._rctx,s,e),this._blur1FBO=new w(this._rctx,s,e);const a=Uint8Array.from(atob(o),(e=>e.charCodeAt(0)));this._passParameters.noiseTexture=new f(this._rctx,{target:c.TEXTURE_2D,pixelFormat:d.RGB,dataType:p.UNSIGNED_BYTE,hasMipmap:!0,width:32,height:32},a),r(this._ssaoTechnique)&&(this._ssaoTechnique=this._techniqueRepository.acquire(u)),r(this._blurTechnique)&&(this._blurTechnique=this._techniqueRepository.acquire(_)),this._enableTime=i(0),this._requestRender()}_disable(){this._enableTime=null,this._passParameters.noiseTexture=e(this._passParameters.noiseTexture),this._blur1FBO=e(this._blur1FBO),this._blur0FBO=e(this._blur0FBO),this._ssaoFBO=e(this._ssaoFBO)}get gpuMemoryUsage(){return(t(this._blur0FBO)?this._blur0FBO.gpuMemoryUsage:0)+(t(this._blur1FBO)?this._blur1FBO.gpuMemoryUsage:0)+(t(this._ssaoFBO)?this._ssaoFBO.gpuMemoryUsage:0)}get test(){return{ssao:this._ssaoFBO,blur:this._blur1FBO}}}const A=.5;export{P as SSAOHelper,q as blurSizePixels};