src/viewer/tiled-renderer.js
- /**
- * @file Tiled Renderer
- * @author Alexander Rose <alexander.rose@weirdbyte.de>
- * @private
- */
-
- function TiledRenderer (renderer, camera, viewer, params) {
- const p = params || {}
-
- let factor = p.factor !== undefined ? p.factor : 2
- const antialias = p.antialias !== undefined ? p.antialias : false
-
- const onProgress = p.onProgress
- const onFinish = p.onFinish
-
- //
-
- if (antialias) factor *= 2
- const n = factor * factor
-
- // canvas
-
- const canvas = document.createElement('canvas')
- const width = viewer.width
- const height = viewer.height
-
- if (antialias) {
- canvas.width = width * factor / 2
- canvas.height = height * factor / 2
- } else {
- canvas.width = width * factor
- canvas.height = height * factor
- }
-
- const ctx = canvas.getContext('2d')
-
- const viewerSampleLevel = viewer.sampleLevel
- viewer.setSampling(-1)
-
- function renderTile (i) {
- const x = i % factor
- const y = Math.floor(i / factor)
-
- const offsetX = x * width
- const offsetY = y * height
-
- viewer.camera.setViewOffset(
- width * factor,
- height * factor,
- offsetX,
- offsetY,
- width,
- height
- )
-
- viewer.render()
-
- if (antialias) {
- ctx.drawImage(
- renderer.domElement,
- Math.floor(offsetX / 2),
- Math.floor(offsetY / 2),
- Math.ceil(width / 2),
- Math.ceil(height / 2)
- )
- } else {
- ctx.drawImage(
- renderer.domElement,
- Math.floor(offsetX),
- Math.floor(offsetY),
- Math.ceil(width),
- Math.ceil(height)
- )
- }
-
- if (typeof onProgress === 'function') {
- onProgress(i + 1, n, false)
- }
- }
-
- function finalize () {
- viewer.setSampling(viewerSampleLevel)
- viewer.camera.view = null
-
- if (typeof onFinish === 'function') {
- onFinish(n + 1, n, false)
- }
- }
-
- function render () {
- for (let i = 0; i <= n; ++i) {
- if (i === n) {
- finalize()
- } else {
- renderTile(i)
- }
- }
- }
-
- function renderAsync () {
- let count = 0
-
- function fn () {
- if (count === n) {
- finalize()
- } else {
- renderTile(count)
- }
- count += 1
- }
-
- for (let i = 0; i <= n; ++i) {
- setTimeout(fn, 0)
- }
- }
-
- // API
-
- this.render = render
- this.renderAsync = renderAsync
-
- this.canvas = canvas
- }
-
- TiledRenderer.prototype.constructor = TiledRenderer
-
- export default TiledRenderer