diff --git a/src/mol-app/ui/transform/ball-and-stick.tsx b/src/mol-app/ui/transform/ball-and-stick.tsx index 013300a73f0f0db6a90b499e10d5622389d2667d..82cf45d7e65d73fce92a9bbe632c4bea89c35ee3 100644 --- a/src/mol-app/ui/transform/ball-and-stick.tsx +++ b/src/mol-app/ui/transform/ball-and-stick.tsx @@ -18,7 +18,7 @@ import { StateContext } from 'mol-view/state/context'; import { ColorTheme, SizeTheme } from 'mol-geo/theme'; import { Color, ColorNames } from 'mol-util/color'; import { Slider } from '../controls/slider'; -import { VisualQuality } from 'mol-geo/representation'; +import { VisualQuality } from 'mol-geo/representation/util'; export const ColorThemeInfo = { 'atom-index': {}, diff --git a/src/mol-app/ui/transform/spacefill.tsx b/src/mol-app/ui/transform/spacefill.tsx index 3d6adbe7c4337008fb1c8737836790b774c97226..2da65fe8103adcd17d5669d4153b55b11e2db8f5 100644 --- a/src/mol-app/ui/transform/spacefill.tsx +++ b/src/mol-app/ui/transform/spacefill.tsx @@ -18,7 +18,7 @@ import { StateContext } from 'mol-view/state/context'; import { ColorTheme, SizeTheme } from 'mol-geo/theme'; import { Color, ColorNames } from 'mol-util/color'; import { Slider } from '../controls/slider'; -import { VisualQuality } from 'mol-geo/representation'; +import { VisualQuality } from 'mol-geo/representation/util'; export const ColorThemeInfo = { 'atom-index': {}, diff --git a/src/mol-geo/representation/index.ts b/src/mol-geo/representation/index.ts index 09c1b9fbef7f2103163764be29955a78699772c6..e7934d90d43f4024b5c5e238c520673db143b27c 100644 --- a/src/mol-geo/representation/index.ts +++ b/src/mol-geo/representation/index.ts @@ -10,25 +10,6 @@ import { PickingId } from '../util/picking'; import { Loci } from 'mol-model/loci'; import { MarkerAction } from '../util/marker-data'; -export type VisualQuality = 'custom' | 'auto' | 'highest' | 'high' | 'medium' | 'low' | 'lowest' - -export const DefaultBaseProps = { - alpha: 1, - visible: true, - depthMask: true, - useFog: true, - quality: 'auto' as VisualQuality -} -export type BaseProps = Partial<typeof DefaultBaseProps> - -export const DefaultMeshProps = { - ...DefaultBaseProps, - doubleSided: false, - flipSided: false, - flatShaded: false, -} -export type MeshProps = Partial<typeof DefaultMeshProps> - export interface RepresentationProps {} export interface Representation<D, P extends RepresentationProps = {}> { diff --git a/src/mol-geo/representation/structure/index.ts b/src/mol-geo/representation/structure/index.ts index 719a13c19e2ef768a164c5fded9b6b040acde93c..25d49da0194698dea4ced08ea0a0725ac887a06a 100644 --- a/src/mol-geo/representation/structure/index.ts +++ b/src/mol-geo/representation/structure/index.ts @@ -8,75 +8,18 @@ import { Structure, StructureSymmetry, Unit } from 'mol-model/structure'; import { Task } from 'mol-task' import { RenderObject } from 'mol-gl/render-object'; -import { Representation, RepresentationProps, Visual, VisualQuality, DefaultBaseProps } from '..'; +import { Representation, RepresentationProps, Visual } from '..'; import { ColorTheme, SizeTheme } from '../../theme'; import { PickingId } from '../../util/picking'; import { Loci, EmptyLoci, isEmptyLoci } from 'mol-model/loci'; import { MarkerAction } from '../../util/marker-data'; -import { defaults } from 'mol-util'; +import { getQualityProps, DefaultBaseProps } from '../util'; export interface UnitsVisual<P extends RepresentationProps = {}> extends Visual<Unit.SymmetryGroup, P> { } export interface StructureVisual<P extends RepresentationProps = {}> extends Visual<Structure, P> { } export interface StructureRepresentation<P extends RepresentationProps = {}> extends Representation<Structure, P> { } -interface QualityProps { - quality: VisualQuality - detail: number - radialSegments: number -} - -function getQualityProps(props: Partial<QualityProps>, structure: Structure) { - let quality = defaults(props.quality, 'auto' as VisualQuality) - let detail = 1 - let radialSegments = 12 - - if (quality === 'auto') { - const score = structure.elementCount - if (score > 500_000) { - quality = 'lowest' - } else if (score > 100_000) { - quality = 'low' - } else if (score > 30_000) { - quality = 'medium' - } else { - quality = 'high' - } - } - - switch (quality) { - case 'highest': - detail = 3 - radialSegments = 36 - break - case 'high': - detail = 2 - radialSegments = 24 - break - case 'medium': - detail = 1 - radialSegments = 12 - break - case 'low': - detail = 0 - radialSegments = 5 - break - case 'lowest': - detail = 0 - radialSegments = 3 - break - case 'custom': - detail = defaults(props.detail, 1) - radialSegments = defaults(props.radialSegments, 12) - break - } - - return { - detail, - radialSegments - } -} - export const DefaultStructureProps = { ...DefaultBaseProps, colorTheme: { name: 'instance-index' } as ColorTheme, diff --git a/src/mol-geo/representation/structure/visual/element-sphere.ts b/src/mol-geo/representation/structure/visual/element-sphere.ts index e991ad536e97c708f1324ca4db60b56a449beebf..42e26a4846793d7cbe24142abff93ae8da8a64e3 100644 --- a/src/mol-geo/representation/structure/visual/element-sphere.ts +++ b/src/mol-geo/representation/structure/visual/element-sphere.ts @@ -22,8 +22,7 @@ import { OrderedSet } from 'mol-data/int'; import { createMarkers, MarkerAction } from '../../../util/marker-data'; import { Loci, EmptyLoci } from 'mol-model/loci'; import { SizeTheme } from '../../../theme'; -import { DefaultMeshProps } from '../..'; -import { createMeshValues, updateMeshValues, updateRenderableState, createRenderableState } from '../../util'; +import { createMeshValues, updateMeshValues, updateRenderableState, createRenderableState, DefaultMeshProps } from '../../util'; export const DefaultElementSphereProps = { ...DefaultMeshProps, diff --git a/src/mol-geo/representation/structure/visual/util/link.ts b/src/mol-geo/representation/structure/visual/util/link.ts index 16808dbc77c077633eba088eaa8ae41fa5bad891..7959b43c0b1566ae5ba919823bc9c0d7f39d40e6 100644 --- a/src/mol-geo/representation/structure/visual/util/link.ts +++ b/src/mol-geo/representation/structure/visual/util/link.ts @@ -9,7 +9,7 @@ import { RuntimeContext } from 'mol-task'; import { Mesh } from '../../../../shape/mesh'; import { MeshBuilder } from '../../../../shape/mesh-builder'; import { LinkType } from 'mol-model/structure/model/types'; -import { DefaultMeshProps } from '../../..'; +import { DefaultMeshProps } from '../../../util'; export const DefaultLinkCylinderProps = { ...DefaultMeshProps, diff --git a/src/mol-geo/representation/util.ts b/src/mol-geo/representation/util.ts index cdcd133b883252032a9a2f64d93379e142477513..fdb8f988ee22472ff58139af63c052a1ad1e1731 100644 --- a/src/mol-geo/representation/util.ts +++ b/src/mol-geo/representation/util.ts @@ -6,9 +6,27 @@ import { ValueCell } from 'mol-util/value-cell' import { BaseValues } from 'mol-gl/renderable/schema'; -import { BaseProps, MeshProps } from '.'; import { MeshValues, RenderableState } from 'mol-gl/renderable'; import { fillSerial } from 'mol-gl/renderable/util'; +import { defaults } from 'mol-util'; +import { Structure } from 'mol-model/structure'; + +export const DefaultBaseProps = { + alpha: 1, + visible: true, + depthMask: true, + useFog: true, + quality: 'auto' as VisualQuality +} +export type BaseProps = Partial<typeof DefaultBaseProps> + +export const DefaultMeshProps = { + ...DefaultBaseProps, + doubleSided: false, + flipSided: false, + flatShaded: false, +} +export type MeshProps = Partial<typeof DefaultMeshProps> type Counts = { drawCount: number, elementCount: number, instanceCount: number } @@ -55,4 +73,63 @@ export function updateMeshValues(values: MeshValues, props: Required<MeshProps>) export function updateRenderableState(state: RenderableState, props: Required<BaseProps>) { state.visible = props.visible state.depthMask = props.depthMask +} + +export type VisualQuality = 'custom' | 'auto' | 'highest' | 'high' | 'medium' | 'low' | 'lowest' + +interface QualityProps { + quality: VisualQuality + detail: number + radialSegments: number +} + +export function getQualityProps(props: Partial<QualityProps>, structure: Structure) { + let quality = defaults(props.quality, 'auto' as VisualQuality) + let detail = 1 + let radialSegments = 12 + + if (quality === 'auto') { + const score = structure.elementCount + if (score > 500_000) { + quality = 'lowest' + } else if (score > 100_000) { + quality = 'low' + } else if (score > 30_000) { + quality = 'medium' + } else { + quality = 'high' + } + } + + switch (quality) { + case 'highest': + detail = 3 + radialSegments = 36 + break + case 'high': + detail = 2 + radialSegments = 24 + break + case 'medium': + detail = 1 + radialSegments = 12 + break + case 'low': + detail = 0 + radialSegments = 5 + break + case 'lowest': + detail = 0 + radialSegments = 3 + break + case 'custom': + detail = defaults(props.detail, 1) + radialSegments = defaults(props.radialSegments, 12) + break + } + + return { + detail, + radialSegments + } } \ No newline at end of file