123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- /**
- * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
- *
- * @author Alexander Rose <alexander.rose@weirdbyte.de>
- */
- import { WebGLContext } from 'mol-gl/webgl/context';
- import { createRenderTarget, RenderTarget } from 'mol-gl/webgl/render-target';
- import Renderer from 'mol-gl/renderer';
- import Scene from 'mol-gl/scene';
- import { BoundingSphereHelper } from './bounding-sphere-helper';
- import { createTexture, Texture } from 'mol-gl/webgl/texture';
- export class DrawPass {
- colorTarget: RenderTarget
- depthTexture: Texture
- packedDepth: boolean
- private depthTarget: RenderTarget | null
- constructor(private webgl: WebGLContext, private renderer: Renderer, private scene: Scene, private debugHelper: BoundingSphereHelper) {
- const { gl, extensions } = webgl
- const width = gl.drawingBufferWidth
- const height = gl.drawingBufferHeight
- this.colorTarget = createRenderTarget(webgl, gl.drawingBufferWidth, gl.drawingBufferHeight)
- this.packedDepth = !extensions.depthTexture
- this.depthTarget = this.packedDepth ? createRenderTarget(webgl, width, height) : null
- this.depthTexture = this.depthTarget ? this.depthTarget.texture : createTexture(webgl, 'image-depth', 'depth', 'ushort', 'nearest')
- if (!this.packedDepth) {
- this.depthTexture.define(width, height)
- this.depthTexture.attachFramebuffer(this.colorTarget.framebuffer, 'depth')
- }
- }
- setSize(width: number, height: number) {
- this.colorTarget.setSize(width, height)
- if (this.depthTarget) {
- this.depthTarget.setSize(width, height)
- } else {
- this.depthTexture.define(width, height)
- }
- }
- render(toDrawingBuffer: boolean) {
- const { webgl, renderer, scene, debugHelper, colorTarget, depthTarget } = this
- const { gl } = webgl
- if (toDrawingBuffer) {
- webgl.unbindFramebuffer()
- gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight)
- } else {
- colorTarget.bind()
- }
- renderer.setViewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight)
- renderer.render(scene, 'color', true)
- if (debugHelper.isEnabled) {
- debugHelper.syncVisibility()
- renderer.render(debugHelper.scene, 'color', false)
- }
- // do a depth pass if not rendering to drawing buffer and
- // extensions.depthTexture is unsupported (i.e. depthTarget is set)
- if (!toDrawingBuffer && depthTarget) {
- depthTarget.bind()
- renderer.render(scene, 'depth', true)
- if (debugHelper.isEnabled) {
- debugHelper.syncVisibility()
- renderer.render(debugHelper.scene, 'depth', false)
- }
- }
- }
- }
|