Skip to content
Snippets Groups Projects
Select Git revision
  • 612c5f78af7a0834b586b36a2ea4709b6493ec85
  • master default protected
  • rednatco-v2
  • rednatco
  • test
  • ntc-tube-uniform-color
  • ntc-tube-missing-atoms
  • restore-vertex-array-per-program
  • watlas2
  • dnatco_new
  • cleanup-old-nodejs
  • webmmb
  • fix_auth_seq_id
  • update_deps
  • ext_dev
  • ntc_balls
  • nci-2
  • plugin
  • bugfix-0.4.5
  • nci
  • servers
  • v0.5.0-dev.1
  • v0.4.5
  • v0.4.4
  • v0.4.3
  • v0.4.2
  • v0.4.1
  • v0.4.0
  • v0.3.12
  • v0.3.11
  • v0.3.10
  • v0.3.9
  • v0.3.8
  • v0.3.7
  • v0.3.6
  • v0.3.5
  • v0.3.4
  • v0.3.3
  • v0.3.2
  • v0.3.1
  • v0.3.0
41 results

viewer.ts

Blame
  • user avatar
    Alexander Rose authored
    612c5f78
    History
    viewer.ts 2.55 KiB
    /**
     * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
     *
     * @author Alexander Rose <alexander.rose@weirdbyte.de>
     */
    
    import { Vec3 } from 'mol-math/linear-algebra'
    import InputObserver from 'mol-util/input/input-observer'
    import Renderer from 'mol-gl/renderer'
    import { RenderObject } from 'mol-gl/scene'
    
    import TrackballControls from './controls/trackball'
    import { Viewport } from './camera/util'
    import { PerspectiveCamera } from './camera/perspective'
    import { resizeCanvas } from './util';
    
    interface Viewer {
        add: (o: RenderObject) => void
        remove: (o: RenderObject) => void
        clear: () => void
        draw: () => void
    
        requestDraw: () => void
        animate: () => void
    
        handleResize: () => void
    
        dispose: () => void
    }
    
    namespace Viewer {
        export function create(canvas: HTMLCanvasElement, container: Element): Viewer {
            const input = InputObserver.create(canvas)
            input.resize.subscribe(handleResize)
    
            const camera = PerspectiveCamera.create({
                near: 0.01,
                far: 10000,
                position: Vec3.create(0, 0, 50)
            })
    
            const controls = TrackballControls.create(input, camera, {
    
            })
    
            const renderer = Renderer.create(canvas, camera)
    
            let drawPending = false
    
            function draw () {
    
                controls.update()
                camera.update()
                renderer.draw()
            }
    
            function requestDraw () {
                if (drawPending) return
                drawPending = true
                window.requestAnimationFrame(draw)
            }
    
            function animate () {
                draw()
                window.requestAnimationFrame(animate)
            }
    
            handleResize()
    
            return {
                add: (o: RenderObject) => {
                    renderer.add(o)
                },
                remove: (o: RenderObject) => {
                    renderer.remove(o)
                },
                clear: () => {
                    renderer.clear()
                },
    
                draw,
                requestDraw,
                animate,
    
                handleResize,
    
                dispose: () => {
                    input.dispose()
                    controls.dispose()
                    renderer.dispose()
                }
            }
    
            function handleResize() {
                resizeCanvas(canvas, container)
                const viewport = { x: 0, y: 0, width: canvas.width, height: canvas.height }
                renderer.setViewport(viewport)
                Viewport.copy(camera.viewport, viewport)
                Viewport.copy(controls.viewport, viewport)
            }
        }
    }
    
    export default Viewer