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

import { defaults } from '../mol-util';
import { Structure } from '../mol-model/structure';
import { VisualQuality } from '../mol-geo/geometry/base';

export interface VisualUpdateState {
    updateTransform: boolean
    updateMatrix: boolean
    updateColor: boolean
    updateSize: boolean
    createGeometry: boolean
    createNew: boolean

    /** holds contextual info, is not reset  */
    info: { [k: string]: unknown }
}
export namespace VisualUpdateState {
    export function create(): VisualUpdateState {
        return {
            updateTransform: false,
            updateMatrix: false,
            updateColor: false,
            updateSize: false,
            createGeometry: false,
            createNew: false,

            info: {}
        }
    }
    export function reset(state: VisualUpdateState) {
        state.updateTransform = false
        state.updateMatrix = false
        state.updateColor = false
        state.updateSize = false
        state.createGeometry = false
        state.createNew = false
    }
}

//

export interface QualityProps {
    quality: VisualQuality
    detail: number
    radialSegments: number
    linearSegments: number
    resolution: number
}

export function getQualityProps(props: Partial<QualityProps>, data?: any) {
    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)
    let resolution = defaults(props.resolution, 2)

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

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

    return {
        detail,
        radialSegments,
        linearSegments,
        resolution
    }
}