Skip to content
Snippets Groups Projects
Select Git revision
  • 65c7c2f4325f6ec81c8a0e355a4e3f588e2bc737
  • 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

renderer.ts

Blame
  • renderer.ts 12.47 KiB
    /**
     * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
     *
     * @author Alexander Rose <alexander.rose@weirdbyte.de>
     */
    
    import { Viewport } from 'mol-canvas3d/camera/util';
    import { Camera } from 'mol-canvas3d/camera';
    
    import Scene from './scene';
    import { WebGLContext, createImageData } from './webgl/context';
    import { Mat4, Vec3, Vec4 } from 'mol-math/linear-algebra';
    import { Renderable } from './renderable';
    import { Color } from 'mol-util/color';
    import { ValueCell } from 'mol-util';
    import { RenderableValues, GlobalUniformValues, BaseValues } from './renderable/schema';
    import { GraphicsRenderVariant } from './webgl/render-item';
    import { ParamDefinition as PD } from 'mol-util/param-definition';
    import { deepClone } from 'mol-util/object';
    
    export interface RendererStats {
        programCount: number
        shaderCount: number
    
        bufferCount: number
        framebufferCount: number
        renderbufferCount: number
        textureCount: number
        vaoCount: number
    
        drawCount: number
        instanceCount: number
        instancedDrawCount: number
    }
    
    interface Renderer {
        readonly stats: RendererStats
        readonly props: Readonly<RendererProps>
    
        clear: () => void
        render: (scene: Scene, variant: GraphicsRenderVariant) => void
        setProps: (props: Partial<RendererProps>) => void
        setViewport: (x: number, y: number, width: number, height: number) => void
        getImageData: () => ImageData
        dispose: () => void
    }
    
    export const RendererParams = {
        backgroundColor: PD.Color(Color(0x000000)),
        pickingAlphaThreshold: PD.Numeric(0.5, { min: 0.0, max: 1.0, step: 0.01 }, { description: 'The minimum opacity value needed for an object to be pickable.' }),
    
        lightIntensity: PD.Numeric(0.6, { min: 0.0, max: 1.0, step: 0.01 }),
        ambientIntensity: PD.Numeric(0.4, { min: 0.0, max: 1.0, step: 0.01 }),
    
        metalness: PD.Numeric(0.0, { min: 0.0, max: 1.0, step: 0.01 }),
        roughness: PD.Numeric(0.4, { min: 0.0, max: 1.0, step: 0.01 }),
        reflectivity: PD.Numeric(0.5, { min: 0.0, max: 1.0, step: 0.01 }),
    }
    export type RendererProps = PD.Values<typeof RendererParams>
    
    namespace Renderer {
        export function create(ctx: WebGLContext, camera: Camera, props: Partial<RendererProps> = {}): Renderer {
            const { gl, state, stats } = ctx
            const p = deepClone({ ...PD.getDefaultValues(RendererParams), ...props })
    
            const viewport = Viewport()
            const bgColor = Color.toVec3Normalized(Vec3(), p.backgroundColor)
    
            const view = Mat4.clone(camera.view)
            const invView = Mat4.invert(Mat4.identity(), view)