@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 2.71 kB
JavaScript
import{Color as e}from"../../core/math/color.js";import{Texture as r}from"../../platform/graphics/texture.js";import{BlendState as t}from"../../platform/graphics/blend-state.js";import{RenderTarget as s}from"../../platform/graphics/render-target.js";import{RenderPass as o}from"../../platform/graphics/render-pass.js";import{FILTER_LINEAR as a,ADDRESS_CLAMP_TO_EDGE as i}from"../../platform/graphics/constants.js";import{RenderPassDownsample as h}from"./render-pass-downsample.js";import{RenderPassUpsample as n}from"./render-pass-upsample.js";class d extends o{constructor(e,r,t){super(e),this.bloomTexture=void 0,this.lastMipLevel=1,this.bloomRenderTarget=void 0,this.textureFormat=void 0,this.renderTargets=[],this._sourceTexture=r,this.textureFormat=t,this.bloomRenderTarget=this.createRenderTarget(0),this.bloomTexture=this.bloomRenderTarget.colorBuffer}destroy(){this.destroyRenderPasses(),this.destroyRenderTargets()}destroyRenderTargets(e=0){for(let r=e;r<this.renderTargets.length;r++){const e=this.renderTargets[r];e.destroyTextureBuffers(),e.destroy()}this.renderTargets.length=0}destroyRenderPasses(){for(let e=0;e<this.beforePasses.length;e++)this.beforePasses[e].destroy();this.beforePasses.length=0}createRenderTarget(e){return new s({depth:!1,colorBuffer:new r(this.device,{name:`BloomTexture${e}`,width:1,height:1,format:this.textureFormat,mipmaps:!1,minFilter:a,magFilter:a,addressU:i,addressV:i})})}createRenderTargets(e){for(let r=0;r<e;r++){const e=0===r?this.bloomRenderTarget:this.createRenderTarget(r);this.renderTargets.push(e)}}calcMipLevels(e,r,t){const s=Math.min(e,r);return Math.floor(Math.log2(s)-Math.log2(t))}createRenderPasses(r){const s=this.device;let o=this._sourceTexture;for(let t=0;t<r;t++){const r=new h(s,o),a=this.renderTargets[t];r.init(a,{resizeSource:o,scaleX:.5,scaleY:.5}),r.setClearColor(e.BLACK),this.beforePasses.push(r),o=a.colorBuffer}o=this.renderTargets[r-1].colorBuffer;for(let e=r-2;e>=0;e--){const r=new n(s,o),a=this.renderTargets[e];r.init(a),r.blendState=t.ADDBLEND,this.beforePasses.push(r),o=a.colorBuffer}}onDisable(){var e;null==(e=this.renderTargets[0])||e.resize(1,1),this.destroyRenderPasses(),this.destroyRenderTargets(1)}set sourceTexture(e){if(this._sourceTexture=e,this.beforePasses.length>0){const r=this.beforePasses[0];r.options.resizeSource=e,r.sourceTexture=e}}get sourceTexture(){return this._sourceTexture}frameUpdate(){super.frameUpdate();let e=this.calcMipLevels(this._sourceTexture.width,this._sourceTexture.height,2**this.lastMipLevel);e=Math.max(1,e),this.renderTargets.length!==e&&(this.destroyRenderPasses(),this.destroyRenderTargets(1),this.createRenderTargets(e),this.createRenderPasses(e))}}export{d as RenderPassBloom};