setupDepthTexture method

void setupDepthTexture(
  1. dynamic framebuffer,
  2. 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 );
}