Skip to content
Snippets Groups Projects
util.ts 3.37 KiB
Newer Older
Alexander Rose's avatar
Alexander Rose committed
/**
 * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
 *
 * @author Alexander Rose <alexander.rose@weirdbyte.de>
 */

Alexander Rose's avatar
Alexander Rose committed
import { defaults } from 'mol-util';
import { Structure } from 'mol-model/structure';
Alexander Rose's avatar
Alexander Rose committed
import { VisualQuality } from 'mol-geo/geometry/base';
Alexander Rose's avatar
Alexander Rose committed

export interface VisualUpdateState {
    updateTransform: boolean
Alexander Rose's avatar
Alexander Rose committed
    updateColor: boolean
    updateSize: boolean
    createGeometry: boolean
    createNew: boolean
Alexander Rose's avatar
Alexander Rose committed
}
export namespace VisualUpdateState {
    export function create(): VisualUpdateState {
        return {
            updateTransform: false,
Alexander Rose's avatar
Alexander Rose committed
            updateColor: false,
            updateSize: false,
            createGeometry: false,
            createNew: false,
Alexander Rose's avatar
Alexander Rose committed
        }
    }
    export function reset(state: VisualUpdateState) {
        state.updateTransform = false
Alexander Rose's avatar
Alexander Rose committed
        state.updateColor = false
        state.updateSize = false
        state.createGeometry = false
        state.createNew = false
Alexander Rose's avatar
Alexander Rose committed

Alexander Rose's avatar
Alexander Rose committed
export interface QualityProps {
Alexander Rose's avatar
Alexander Rose committed
    quality: VisualQuality
    detail: number
    radialSegments: number
Alexander Rose's avatar
Alexander Rose committed
    linearSegments: number
    resolution: number
Alexander Rose's avatar
Alexander Rose committed
}

export function getQualityProps(props: Partial<QualityProps>, data?: any) {
Alexander Rose's avatar
Alexander Rose committed
    let quality = defaults(props.quality, 'auto' as VisualQuality)
    let detail = defaults(props.detail, 1)
    let radialSegments = defaults(props.radialSegments, 12)
    let linearSegments = defaults(props.linearSegments, 8)
Alexander Rose's avatar
Alexander Rose committed
    let resolution = defaults(props.resolution, 2)
Alexander Rose's avatar
Alexander Rose committed

    if (quality === 'auto' && data instanceof Structure) {
        let score = data.elementCount
        if (data.isCoarse) score *= 10
Alexander Rose's avatar
Alexander Rose committed
        if (score > 500_000) {
            quality = 'lowest'
Alexander Rose's avatar
Alexander Rose committed
        } else if (score > 300_000) {
            quality = 'lower'
Alexander Rose's avatar
Alexander Rose committed
        } else if (score > 100_000) {
            quality = 'low'
        } else if (score > 30_000) {
            quality = 'medium'
Alexander Rose's avatar
Alexander Rose committed
        } else if (score > 2_000) {
Alexander Rose's avatar
Alexander Rose committed
            quality = 'high'
Alexander Rose's avatar
Alexander Rose committed
        } else {
            quality = 'higher'
Alexander Rose's avatar
Alexander Rose committed
        }
    }

    switch (quality) {
        case 'highest':
Alexander Rose's avatar
Alexander Rose committed
            radialSegments = 36
            linearSegments = 18
Alexander Rose's avatar
Alexander Rose committed
            resolution = 0.3
            break
        case 'higher':
            detail = 3
            radialSegments = 28
            linearSegments = 14
            resolution = 0.5
Alexander Rose's avatar
Alexander Rose committed
            break
        case 'high':
Alexander Rose's avatar
Alexander Rose committed
            radialSegments = 20
            linearSegments = 10
            resolution = 1.0
Alexander Rose's avatar
Alexander Rose committed
            break
        case 'medium':
Alexander Rose's avatar
Alexander Rose committed
            radialSegments = 12
            linearSegments = 8
Alexander Rose's avatar
Alexander Rose committed
            resolution = 2.0
Alexander Rose's avatar
Alexander Rose committed
            break
        case 'low':
            detail = 0
            radialSegments = 8
            linearSegments = 3
Alexander Rose's avatar
Alexander Rose committed
            break
Alexander Rose's avatar
Alexander Rose committed
        case 'lower':
            detail = 0
            radialSegments = 4
            linearSegments = 2
Alexander Rose's avatar
Alexander Rose committed
            resolution = 5
            break
Alexander Rose's avatar
Alexander Rose committed
        case 'lowest':
            detail = 0
            radialSegments = 2
            linearSegments = 1
Alexander Rose's avatar
Alexander Rose committed
            resolution = 8
Alexander Rose's avatar
Alexander Rose committed
            break
        case 'custom':
            // use defaults or given props as set above
Alexander Rose's avatar
Alexander Rose committed
            break
    }

    return {
        detail,
        radialSegments,
        linearSegments,
        resolution
Alexander Rose's avatar
Alexander Rose committed
    }