Skip to content
Snippets Groups Projects
Commit efcf4a77 authored by Alexander Rose's avatar Alexander Rose
Browse files

add molecular surface wireframe visual

parent 221e1de4
Branches
Tags
No related merge requests found
...@@ -11,15 +11,18 @@ import { StructureRepresentation, StructureRepresentationProvider, StructureRepr ...@@ -11,15 +11,18 @@ import { StructureRepresentation, StructureRepresentationProvider, StructureRepr
import { Representation, RepresentationParamsGetter, RepresentationContext } from '../../../mol-repr/representation'; import { Representation, RepresentationParamsGetter, RepresentationContext } from '../../../mol-repr/representation';
import { ThemeRegistryContext } from '../../../mol-theme/theme'; import { ThemeRegistryContext } from '../../../mol-theme/theme';
import { Structure } from '../../../mol-model/structure'; import { Structure } from '../../../mol-model/structure';
import { MolecularSurfaceWireframeParams, MolecularSurfaceWireframeVisual } from '../visual/molecular-surface-wireframe';
const MolecularSurfaceVisuals = { const MolecularSurfaceVisuals = {
'molecular-surface-mesh': (ctx: RepresentationContext, getParams: RepresentationParamsGetter<Structure, MolecularSurfaceMeshParams>) => UnitsRepresentation('Molecular surface', ctx, getParams, MolecularSurfaceMeshVisual), 'molecular-surface-mesh': (ctx: RepresentationContext, getParams: RepresentationParamsGetter<Structure, MolecularSurfaceMeshParams>) => UnitsRepresentation('Molecular surface mesh', ctx, getParams, MolecularSurfaceMeshVisual),
'molecular-surface-wireframe': (ctx: RepresentationContext, getParams: RepresentationParamsGetter<Structure, MolecularSurfaceWireframeParams>) => UnitsRepresentation('Molecular surface wireframe', ctx, getParams, MolecularSurfaceWireframeVisual),
} }
type MolecularSurfaceVisualName = keyof typeof MolecularSurfaceVisuals type MolecularSurfaceVisualName = keyof typeof MolecularSurfaceVisuals
const MolecularSurfaceVisualOptions = Object.keys(MolecularSurfaceVisuals).map(name => [name, name] as [MolecularSurfaceVisualName, string]) const MolecularSurfaceVisualOptions = Object.keys(MolecularSurfaceVisuals).map(name => [name, name] as [MolecularSurfaceVisualName, string])
export const MolecularSurfaceParams = { export const MolecularSurfaceParams = {
...MolecularSurfaceMeshParams, ...MolecularSurfaceMeshParams,
...MolecularSurfaceWireframeParams,
visuals: PD.MultiSelect<MolecularSurfaceVisualName>(['molecular-surface-mesh'], MolecularSurfaceVisualOptions), visuals: PD.MultiSelect<MolecularSurfaceVisualName>(['molecular-surface-mesh'], MolecularSurfaceVisualOptions),
} }
export type MolecularSurfaceParams = typeof MolecularSurfaceParams export type MolecularSurfaceParams = typeof MolecularSurfaceParams
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
*/ */
import { ParamDefinition as PD } from '../../../mol-util/param-definition'; import { ParamDefinition as PD } from '../../../mol-util/param-definition';
import { UnitsMeshParams, UnitsTextureMeshParams, UnitsVisual, UnitsMeshVisual } from '../units-visual'; import { UnitsMeshParams, UnitsVisual, UnitsMeshVisual } from '../units-visual';
import { MolecularSurfaceCalculationParams } from '../../../mol-math/geometry/molecular-surface'; import { MolecularSurfaceCalculationParams } from '../../../mol-math/geometry/molecular-surface';
import { VisualContext } from '../../visual'; import { VisualContext } from '../../visual';
import { Unit, Structure } from '../../../mol-model/structure'; import { Unit, Structure } from '../../../mol-model/structure';
...@@ -18,7 +18,6 @@ import { VisualUpdateState } from '../../util'; ...@@ -18,7 +18,6 @@ import { VisualUpdateState } from '../../util';
export const MolecularSurfaceMeshParams = { export const MolecularSurfaceMeshParams = {
...UnitsMeshParams, ...UnitsMeshParams,
...UnitsTextureMeshParams,
...MolecularSurfaceCalculationParams, ...MolecularSurfaceCalculationParams,
ignoreHydrogens: PD.Boolean(false), ignoreHydrogens: PD.Boolean(false),
} }
......
/**
* Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { ParamDefinition as PD } from '../../../mol-util/param-definition';
import { UnitsVisual, UnitsLinesVisual, UnitsLinesParams } from '../units-visual';
import { MolecularSurfaceCalculationParams } from '../../../mol-math/geometry/molecular-surface';
import { VisualContext } from '../../visual';
import { Unit, Structure } from '../../../mol-model/structure';
import { Theme } from '../../../mol-theme/theme';
import { Lines } from '../../../mol-geo/geometry/lines/lines';
import { computeUnitMolecularSurface, MolecularSurfaceProps } from './util/molecular-surface';
import { computeMarchingCubesLines } from '../../../mol-geo/util/marching-cubes/algorithm';
import { ElementIterator, getElementLoci, eachElement } from './util/element';
import { VisualUpdateState } from '../../util';
export const MolecularSurfaceWireframeParams = {
...UnitsLinesParams,
...MolecularSurfaceCalculationParams,
sizeFactor: PD.Numeric(1.5, { min: 0, max: 10, step: 0.1 }),
ignoreHydrogens: PD.Boolean(false),
}
export type MolecularSurfaceWireframeParams = typeof MolecularSurfaceWireframeParams
//
async function createMolecularSurfaceWireframe(ctx: VisualContext, unit: Unit, structure: Structure, theme: Theme, props: MolecularSurfaceProps, lines?: Lines): Promise<Lines> {
const { transform, field, idField } = await computeUnitMolecularSurface(unit, props).runInContext(ctx.runtime)
const params = {
isoLevel: props.probeRadius,
scalarField: field,
idField
}
const wireframe = await computeMarchingCubesLines(params, lines).runAsChild(ctx.runtime)
Lines.transformImmediate(wireframe, transform)
return wireframe
}
export function MolecularSurfaceWireframeVisual(materialId: number): UnitsVisual<MolecularSurfaceWireframeParams> {
return UnitsLinesVisual<MolecularSurfaceWireframeParams>({
defaultProps: PD.getDefaultValues(MolecularSurfaceWireframeParams),
createGeometry: createMolecularSurfaceWireframe,
createLocationIterator: ElementIterator.fromGroup,
getLoci: getElementLoci,
eachLocation: eachElement,
setUpdateState: (state: VisualUpdateState, newProps: PD.Values<MolecularSurfaceWireframeParams>, currentProps: PD.Values<MolecularSurfaceWireframeParams>) => {
if (newProps.resolution !== currentProps.resolution) state.createGeometry = true
if (newProps.probeRadius !== currentProps.probeRadius) state.createGeometry = true
if (newProps.probePositions !== currentProps.probePositions) state.createGeometry = true
if (newProps.ignoreHydrogens !== currentProps.ignoreHydrogens) state.createGeometry = true
}
}, materialId)
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment