setupDepthTexture method
void
setupDepthTexture(
- dynamic framebuffer,
- RenderTarget renderTarget
)
Implementation
void setupDepthTexture(framebuffer, RenderTarget renderTarget) {
final renderTargetProperties = properties.get( renderTarget );
final isCube = renderTarget is WebGLCubeRenderTarget;
// 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'] != null) {
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'][ i ] == null ) {
renderTargetProperties['__webglDepthbuffer'][ 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 );
}