viewer.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { Vec3 } from 'mol-math/linear-algebra'
  7. import InputObserver from 'mol-util/input/input-observer'
  8. import Renderer from 'mol-gl/renderer'
  9. import { RenderObject } from 'mol-gl/scene'
  10. import TrackballControls from './controls/trackball'
  11. import { Viewport } from './camera/util'
  12. import { PerspectiveCamera } from './camera/perspective'
  13. import { resizeCanvas } from './util';
  14. interface Viewer {
  15. add: (o: RenderObject) => void
  16. remove: (o: RenderObject) => void
  17. clear: () => void
  18. draw: () => void
  19. requestDraw: () => void
  20. animate: () => void
  21. handleResize: () => void
  22. dispose: () => void
  23. }
  24. namespace Viewer {
  25. export function create(canvas: HTMLCanvasElement, container: Element): Viewer {
  26. const input = InputObserver.create(canvas)
  27. input.resize.subscribe(handleResize)
  28. const camera = PerspectiveCamera.create({
  29. near: 0.01,
  30. far: 10000,
  31. position: Vec3.create(0, 0, 50)
  32. })
  33. const controls = TrackballControls.create(input, camera, {
  34. })
  35. const renderer = Renderer.create(canvas, camera)
  36. let drawPending = false
  37. function draw () {
  38. controls.update()
  39. camera.update()
  40. renderer.draw()
  41. }
  42. function requestDraw () {
  43. if (drawPending) return
  44. drawPending = true
  45. window.requestAnimationFrame(draw)
  46. }
  47. function animate () {
  48. draw()
  49. window.requestAnimationFrame(animate)
  50. }
  51. handleResize()
  52. return {
  53. add: (o: RenderObject) => {
  54. renderer.add(o)
  55. },
  56. remove: (o: RenderObject) => {
  57. renderer.remove(o)
  58. },
  59. clear: () => {
  60. renderer.clear()
  61. },
  62. draw,
  63. requestDraw,
  64. animate,
  65. handleResize,
  66. dispose: () => {
  67. input.dispose()
  68. controls.dispose()
  69. renderer.dispose()
  70. }
  71. }
  72. function handleResize() {
  73. resizeCanvas(canvas, container)
  74. const viewport = { x: 0, y: 0, width: canvas.width, height: canvas.height }
  75. renderer.setViewport(viewport)
  76. Viewport.copy(camera.viewport, viewport)
  77. Viewport.copy(controls.viewport, viewport)
  78. }
  79. }
  80. }
  81. export default Viewer