draw.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /**
  2. * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { WebGLContext } from 'mol-gl/webgl/context';
  7. import { createRenderTarget, RenderTarget } from 'mol-gl/webgl/render-target';
  8. import Renderer from 'mol-gl/renderer';
  9. import Scene from 'mol-gl/scene';
  10. import { BoundingSphereHelper } from './bounding-sphere-helper';
  11. import { createTexture, Texture } from 'mol-gl/webgl/texture';
  12. export class DrawPass {
  13. colorTarget: RenderTarget
  14. depthTexture: Texture
  15. packedDepth: boolean
  16. private depthTarget: RenderTarget | null
  17. constructor(private webgl: WebGLContext, private renderer: Renderer, private scene: Scene, private debugHelper: BoundingSphereHelper) {
  18. const { gl, extensions } = webgl
  19. const width = gl.drawingBufferWidth
  20. const height = gl.drawingBufferHeight
  21. this.colorTarget = createRenderTarget(webgl, gl.drawingBufferWidth, gl.drawingBufferHeight)
  22. this.packedDepth = !extensions.depthTexture
  23. this.depthTarget = this.packedDepth ? createRenderTarget(webgl, width, height) : null
  24. this.depthTexture = this.depthTarget ? this.depthTarget.texture : createTexture(webgl, 'image-depth', 'depth', 'ushort', 'nearest')
  25. if (!this.packedDepth) {
  26. this.depthTexture.define(width, height)
  27. this.depthTexture.attachFramebuffer(this.colorTarget.framebuffer, 'depth')
  28. }
  29. }
  30. setSize(width: number, height: number) {
  31. this.colorTarget.setSize(width, height)
  32. if (this.depthTarget) {
  33. this.depthTarget.setSize(width, height)
  34. } else {
  35. this.depthTexture.define(width, height)
  36. }
  37. }
  38. render(toDrawingBuffer: boolean) {
  39. const { webgl, renderer, scene, debugHelper, colorTarget, depthTarget } = this
  40. const { gl } = webgl
  41. if (toDrawingBuffer) {
  42. webgl.unbindFramebuffer()
  43. gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight)
  44. } else {
  45. colorTarget.bind()
  46. }
  47. renderer.setViewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight)
  48. renderer.render(scene, 'color', true)
  49. if (debugHelper.isEnabled) {
  50. debugHelper.syncVisibility()
  51. renderer.render(debugHelper.scene, 'color', false)
  52. }
  53. // do a depth pass if not rendering to drawing buffer and
  54. // extensions.depthTexture is unsupported (i.e. depthTarget is set)
  55. if (!toDrawingBuffer && depthTarget) {
  56. depthTarget.bind()
  57. renderer.render(scene, 'depth', true)
  58. if (debugHelper.isEnabled) {
  59. debugHelper.syncVisibility()
  60. renderer.render(debugHelper.scene, 'depth', false)
  61. }
  62. }
  63. }
  64. }