-
Alexander Rose authoredAlexander Rose authored
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
}
}