NGL@1.0.0-beta.7 Home Manual Reference Source Gallery

src/viewer/tiled-renderer.js

  1. /**
  2. * @file Tiled Renderer
  3. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  4. * @private
  5. */
  6.  
  7. function TiledRenderer (renderer, camera, viewer, params) {
  8. const p = params || {}
  9.  
  10. let factor = p.factor !== undefined ? p.factor : 2
  11. const antialias = p.antialias !== undefined ? p.antialias : false
  12.  
  13. const onProgress = p.onProgress
  14. const onFinish = p.onFinish
  15.  
  16. //
  17.  
  18. if (antialias) factor *= 2
  19. const n = factor * factor
  20.  
  21. // canvas
  22.  
  23. const canvas = document.createElement('canvas')
  24. const width = viewer.width
  25. const height = viewer.height
  26.  
  27. if (antialias) {
  28. canvas.width = width * factor / 2
  29. canvas.height = height * factor / 2
  30. } else {
  31. canvas.width = width * factor
  32. canvas.height = height * factor
  33. }
  34.  
  35. const ctx = canvas.getContext('2d')
  36.  
  37. const viewerSampleLevel = viewer.sampleLevel
  38. viewer.setSampling(-1)
  39.  
  40. function renderTile (i) {
  41. const x = i % factor
  42. const y = Math.floor(i / factor)
  43.  
  44. const offsetX = x * width
  45. const offsetY = y * height
  46.  
  47. viewer.camera.setViewOffset(
  48. width * factor,
  49. height * factor,
  50. offsetX,
  51. offsetY,
  52. width,
  53. height
  54. )
  55.  
  56. viewer.render()
  57.  
  58. if (antialias) {
  59. ctx.drawImage(
  60. renderer.domElement,
  61. Math.floor(offsetX / 2),
  62. Math.floor(offsetY / 2),
  63. Math.ceil(width / 2),
  64. Math.ceil(height / 2)
  65. )
  66. } else {
  67. ctx.drawImage(
  68. renderer.domElement,
  69. Math.floor(offsetX),
  70. Math.floor(offsetY),
  71. Math.ceil(width),
  72. Math.ceil(height)
  73. )
  74. }
  75.  
  76. if (typeof onProgress === 'function') {
  77. onProgress(i + 1, n, false)
  78. }
  79. }
  80.  
  81. function finalize () {
  82. viewer.setSampling(viewerSampleLevel)
  83. viewer.camera.view = null
  84.  
  85. if (typeof onFinish === 'function') {
  86. onFinish(n + 1, n, false)
  87. }
  88. }
  89.  
  90. function render () {
  91. for (let i = 0; i <= n; ++i) {
  92. if (i === n) {
  93. finalize()
  94. } else {
  95. renderTile(i)
  96. }
  97. }
  98. }
  99.  
  100. function renderAsync () {
  101. let count = 0
  102.  
  103. function fn () {
  104. if (count === n) {
  105. finalize()
  106. } else {
  107. renderTile(count)
  108. }
  109. count += 1
  110. }
  111.  
  112. for (let i = 0; i <= n; ++i) {
  113. setTimeout(fn, 0)
  114. }
  115. }
  116.  
  117. // API
  118.  
  119. this.render = render
  120. this.renderAsync = renderAsync
  121.  
  122. this.canvas = canvas
  123. }
  124.  
  125. TiledRenderer.prototype.constructor = TiledRenderer
  126.  
  127. export default TiledRenderer