@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 6.83 kB
JavaScript
import{PIXELFORMAT_RGBA8 as e}from"../constants.js";class r{constructor(e,r){this.msaaFB=void 0,this.resolveFB=void 0,this.msaaFB=e,this.resolveFB=r}destroy(e){this.msaaFB&&(e.deleteRenderbuffer(this.msaaFB),this.msaaFB=null),this.resolveFB&&(e.deleteRenderbuffer(this.resolveFB),this.resolveFB=null)}}class f{constructor(){this._glFrameBuffer=null,this._glDepthBuffer=null,this._glResolveFrameBuffer=null,this.colorMrtFramebuffers=null,this._glMsaaColorBuffers=[],this._glMsaaDepthBuffer=null,this.suppliedColorFramebuffer=void 0,this._isInitialized=!1}destroy(e){var r;const f=e.gl;this._isInitialized=!1,this._glFrameBuffer&&(this._glFrameBuffer!==this.suppliedColorFramebuffer&&f.deleteFramebuffer(this._glFrameBuffer),this._glFrameBuffer=null),this._glDepthBuffer&&(f.deleteRenderbuffer(this._glDepthBuffer),this._glDepthBuffer=null),this._glResolveFrameBuffer&&(this._glResolveFrameBuffer!==this.suppliedColorFramebuffer&&f.deleteFramebuffer(this._glResolveFrameBuffer),this._glResolveFrameBuffer=null),this._glMsaaColorBuffers.forEach((e=>{f.deleteRenderbuffer(e)})),this._glMsaaColorBuffers.length=0,null==(r=this.colorMrtFramebuffers)||r.forEach((e=>{e.destroy(f)})),this.colorMrtFramebuffers=null,this._glMsaaDepthBuffer&&(f.deleteRenderbuffer(this._glMsaaDepthBuffer),this._glMsaaDepthBuffer=null),this.suppliedColorFramebuffer=void 0}get initialized(){return this._isInitialized}init(r,f){const t=r.gl;this._isInitialized=!0;const s=[];if(void 0!==this.suppliedColorFramebuffer)this._glFrameBuffer=this.suppliedColorFramebuffer;else{var l,i,u,a;this._glFrameBuffer=t.createFramebuffer(),r.setFramebuffer(this._glFrameBuffer);const e=null!=(l=null==(i=f._colorBuffers)?void 0:i.length)?l:0,F=r.isWebGL2?t.COLOR_ATTACHMENT0:null!=(u=null==(a=r.extDrawBuffers)?void 0:a.COLOR_ATTACHMENT0_WEBGL)?u:t.COLOR_ATTACHMENT0;for(let l=0;l<e;++l){const e=f.getColorBuffer(l);e&&(e.impl._glTexture||(e._width=Math.min(e.width,r.maxRenderBufferSize),e._height=Math.min(e.height,r.maxRenderBufferSize),r.setTexture(e,0)),t.framebufferTexture2D(t.FRAMEBUFFER,F+l,e._cubemap?t.TEXTURE_CUBE_MAP_POSITIVE_X+f._face:t.TEXTURE_2D,e.impl._glTexture,0),s.push(F+l))}r.drawBuffers&&r.drawBuffers(s);const E=f._depthBuffer;if(E)E.impl._glTexture||(E._width=Math.min(E.width,r.maxRenderBufferSize),E._height=Math.min(E.height,r.maxRenderBufferSize),r.setTexture(E,0)),f._stencil?t.framebufferTexture2D(t.FRAMEBUFFER,t.DEPTH_STENCIL_ATTACHMENT,E._cubemap?t.TEXTURE_CUBE_MAP_POSITIVE_X+f._face:t.TEXTURE_2D,f._depthBuffer.impl._glTexture,0):t.framebufferTexture2D(t.FRAMEBUFFER,t.DEPTH_ATTACHMENT,E._cubemap?t.TEXTURE_CUBE_MAP_POSITIVE_X+f._face:t.TEXTURE_2D,f._depthBuffer.impl._glTexture,0);else if(f._depth){if(!(f._samples>1&&r.isWebGL2)){if(this._glDepthBuffer||(this._glDepthBuffer=t.createRenderbuffer()),t.bindRenderbuffer(t.RENDERBUFFER,this._glDepthBuffer),f._stencil)t.renderbufferStorage(t.RENDERBUFFER,t.DEPTH_STENCIL,f.width,f.height),t.framebufferRenderbuffer(t.FRAMEBUFFER,t.DEPTH_STENCIL_ATTACHMENT,t.RENDERBUFFER,this._glDepthBuffer);else{const e=r.isWebGL2?t.DEPTH_COMPONENT32F:t.DEPTH_COMPONENT16;t.renderbufferStorage(t.RENDERBUFFER,e,f.width,f.height),t.framebufferRenderbuffer(t.FRAMEBUFFER,t.DEPTH_ATTACHMENT,t.RENDERBUFFER,this._glDepthBuffer)}t.bindRenderbuffer(t.RENDERBUFFER,null)}}}if(r.isWebGL2&&f._samples>1){var F,E;this._glResolveFrameBuffer=this._glFrameBuffer,this._glFrameBuffer=t.createFramebuffer(),r.setFramebuffer(this._glFrameBuffer);const l=null!=(F=null==(E=f._colorBuffers)?void 0:E.length)?F:0;if(void 0!==this.suppliedColorFramebuffer){const s=t.createRenderbuffer();this._glMsaaColorBuffers.push(s);const l=r.backBufferFormat===e?t.RGBA8:t.RGB8;t.bindRenderbuffer(t.RENDERBUFFER,s),t.renderbufferStorageMultisample(t.RENDERBUFFER,f._samples,l,f.width,f.height),t.framebufferRenderbuffer(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.RENDERBUFFER,s)}else for(let e=0;e<l;++e){const r=f.getColorBuffer(e);if(r){const s=t.createRenderbuffer();this._glMsaaColorBuffers.push(s),t.bindRenderbuffer(t.RENDERBUFFER,s),t.renderbufferStorageMultisample(t.RENDERBUFFER,f._samples,r.impl._glInternalFormat,f.width,f.height),t.framebufferRenderbuffer(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0+e,t.RENDERBUFFER,s)}}f._depth&&(this._glMsaaDepthBuffer||(this._glMsaaDepthBuffer=t.createRenderbuffer()),t.bindRenderbuffer(t.RENDERBUFFER,this._glMsaaDepthBuffer),f._stencil?(t.renderbufferStorageMultisample(t.RENDERBUFFER,f._samples,t.DEPTH24_STENCIL8,f.width,f.height),t.framebufferRenderbuffer(t.FRAMEBUFFER,t.DEPTH_STENCIL_ATTACHMENT,t.RENDERBUFFER,this._glMsaaDepthBuffer)):(t.renderbufferStorageMultisample(t.RENDERBUFFER,f._samples,t.DEPTH_COMPONENT32F,f.width,f.height),t.framebufferRenderbuffer(t.FRAMEBUFFER,t.DEPTH_ATTACHMENT,t.RENDERBUFFER,this._glMsaaDepthBuffer))),l>1&&(this._createMsaaMrtFramebuffers(r,f,l),r.setFramebuffer(this._glFrameBuffer),r.drawBuffers(s))}}_createMsaaMrtFramebuffers(e,f,t){const s=e.gl;this.colorMrtFramebuffers=[];for(let l=0;l<t;++l){const t=f.getColorBuffer(l),i=s.createFramebuffer();e.setFramebuffer(i);const u=this._glMsaaColorBuffers[l];s.bindRenderbuffer(s.RENDERBUFFER,u),s.renderbufferStorageMultisample(s.RENDERBUFFER,f._samples,t.impl._glInternalFormat,f.width,f.height),s.framebufferRenderbuffer(s.FRAMEBUFFER,s.COLOR_ATTACHMENT0,s.RENDERBUFFER,u),e.drawBuffers([s.COLOR_ATTACHMENT0]);const a=s.createFramebuffer();e.setFramebuffer(a),s.framebufferTexture2D(s.FRAMEBUFFER,s.COLOR_ATTACHMENT0,t._cubemap?s.TEXTURE_CUBE_MAP_POSITIVE_X+f._face:s.TEXTURE_2D,t.impl._glTexture,0),this.colorMrtFramebuffers[l]=new r(i,a)}}_checkFbo(e,r,f=""){const t=e.gl;switch(t.checkFramebufferStatus(t.FRAMEBUFFER)){case t.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:case t.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:case t.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:case t.FRAMEBUFFER_UNSUPPORTED:}}loseContext(){this._glFrameBuffer=null,this._glDepthBuffer=null,this._glResolveFrameBuffer=null,this._glMsaaColorBuffers.length=0,this._glMsaaDepthBuffer=null,this.colorMrtFramebuffers=null,this.suppliedColorFramebuffer=void 0,this._isInitialized=!1}internalResolve(e,r,f,t,s){e.setScissor(0,0,t.width,t.height);const l=e.gl;l.bindFramebuffer(l.READ_FRAMEBUFFER,r),l.bindFramebuffer(l.DRAW_FRAMEBUFFER,f),l.blitFramebuffer(0,0,t.width,t.height,0,0,t.width,t.height,s,l.NEAREST)}resolve(e,r,f,t){if(e.isWebGL2){const s=e.gl;if(this.colorMrtFramebuffers){if(f)for(let f=0;f<this.colorMrtFramebuffers.length;f++){const t=this.colorMrtFramebuffers[f];this.internalResolve(e,t.msaaFB,t.resolveFB,r,s.COLOR_BUFFER_BIT)}t&&this.internalResolve(e,this._glFrameBuffer,this._glResolveFrameBuffer,r,s.DEPTH_BUFFER_BIT)}else this.internalResolve(e,this._glFrameBuffer,this._glResolveFrameBuffer,r,(f?s.COLOR_BUFFER_BIT:0)|(t?s.DEPTH_BUFFER_BIT:0));s.bindFramebuffer(s.FRAMEBUFFER,this._glFrameBuffer)}}}export{f as WebglRenderTarget};