setupDepthRenderbuffer method
Implementation
void setupDepthRenderbuffer(RenderTarget renderTarget) {
final renderTargetProperties = properties.get( renderTarget );
final isCube = ( renderTarget is WebGLCubeRenderTarget == true );
// if the bound depth texture has changed
if ( renderTargetProperties['__boundDepthTexture'] != renderTarget.depthTexture ) {
// fire the dispose event to get rid of stored state associated with the previously bound depth buffer
final depthTexture = renderTarget.depthTexture;
if ( renderTargetProperties['__depthDisposeCallback'] ) {
renderTargetProperties['__depthDisposeCallback']();
}
// set up dispose listeners to track when the currently attached buffer is implicitly unbound
if ( depthTexture != null) {
disposeEvent(){
renderTargetProperties.remove('__boundDepthTexture');//delete renderTargetProperties.__boundDepthTexture;
renderTargetProperties.remove('__depthDisposeCallback');//delete renderTargetProperties.__depthDisposeCallback;
depthTexture.removeEventListener( 'dispose', disposeEvent );
}
depthTexture.addEventListener( 'dispose', disposeEvent );
renderTargetProperties['__depthDisposeCallback'] = disposeEvent;
}
renderTargetProperties['__boundDepthTexture'] = depthTexture;
}
if ( renderTarget.depthTexture != null && !renderTargetProperties['__autoAllocateDepthBuffer'] ) {
if ( isCube ) throw( 'target.depthTexture not supported in Cube render targets' );
setupDepthTexture( renderTargetProperties['__webglFramebuffer'], renderTarget );
} else {
if (isCube) {
renderTargetProperties['__webglDepthbuffer'] = [];
for (int i = 0; i < 6; i++) {
state.bindFramebuffer( WebGL.FRAMEBUFFER, renderTargetProperties['__webglFramebuffer'][ i ] );
if (renderTargetProperties['__webglDepthbuffer'].length <= i || renderTargetProperties['__webglDepthbuffer'][ i ] == null ) {
(renderTargetProperties['__webglDepthbuffer'] as List).listSetter(i,_gl.createRenderbuffer());// [ i ] = _gl.createRenderbuffer();
setupRenderBufferStorage( renderTargetProperties['__webglDepthbuffer'][ i ], renderTarget, false );
} else {
// attach buffer if it's been created already
final glAttachmentType = renderTarget.stencilBuffer ? WebGL.DEPTH_STENCIL_ATTACHMENT : WebGL.DEPTH_ATTACHMENT;
final renderbuffer = renderTargetProperties['__webglDepthbuffer'][ i ];
_gl.bindRenderbuffer( WebGL.RENDERBUFFER, renderbuffer );
_gl.framebufferRenderbuffer( WebGL.FRAMEBUFFER, glAttachmentType, WebGL.RENDERBUFFER, renderbuffer );
}
}
} else {
state.bindFramebuffer( WebGL.FRAMEBUFFER, renderTargetProperties['__webglFramebuffer'] );
if ( renderTargetProperties['__webglDepthbuffer'] == null ) {
renderTargetProperties['__webglDepthbuffer'] = _gl.createRenderbuffer();
setupRenderBufferStorage( renderTargetProperties['__webglDepthbuffer'], renderTarget, false );
} else {
// attach buffer if it's been created already
final glAttachmentType = renderTarget.stencilBuffer ? WebGL.DEPTH_STENCIL_ATTACHMENT : WebGL.DEPTH_ATTACHMENT;
final renderbuffer = renderTargetProperties['__webglDepthbuffer'];
_gl.bindRenderbuffer( WebGL.RENDERBUFFER, renderbuffer );
_gl.framebufferRenderbuffer( WebGL.FRAMEBUFFER, glAttachmentType, WebGL.RENDERBUFFER, renderbuffer );
}
}
}
state.bindFramebuffer( WebGL.FRAMEBUFFER, null );
}