diff --git a/src/mol-repr/structure/representation/molecular-surface.ts b/src/mol-repr/structure/representation/molecular-surface.ts index 6bac839151e0c25301b27aef9e5ab0ed6bdf4ed1..477ab2d4358ed004d784eb22843def42e9a931e0 100644 --- a/src/mol-repr/structure/representation/molecular-surface.ts +++ b/src/mol-repr/structure/representation/molecular-surface.ts @@ -11,15 +11,18 @@ import { StructureRepresentation, StructureRepresentationProvider, StructureRepr import { Representation, RepresentationParamsGetter, RepresentationContext } from '../../../mol-repr/representation'; import { ThemeRegistryContext } from '../../../mol-theme/theme'; import { Structure } from '../../../mol-model/structure'; +import { MolecularSurfaceWireframeParams, MolecularSurfaceWireframeVisual } from '../visual/molecular-surface-wireframe'; 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 const MolecularSurfaceVisualOptions = Object.keys(MolecularSurfaceVisuals).map(name => [name, name] as [MolecularSurfaceVisualName, string]) export const MolecularSurfaceParams = { ...MolecularSurfaceMeshParams, + ...MolecularSurfaceWireframeParams, visuals: PD.MultiSelect<MolecularSurfaceVisualName>(['molecular-surface-mesh'], MolecularSurfaceVisualOptions), } export type MolecularSurfaceParams = typeof MolecularSurfaceParams diff --git a/src/mol-repr/structure/visual/molecular-surface-mesh.ts b/src/mol-repr/structure/visual/molecular-surface-mesh.ts index b19364b55ae31ef541e2c3da471b3c68542994c2..2908c2275cfeb5a8d18b248da72a480d7f305987 100644 --- a/src/mol-repr/structure/visual/molecular-surface-mesh.ts +++ b/src/mol-repr/structure/visual/molecular-surface-mesh.ts @@ -5,7 +5,7 @@ */ 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 { VisualContext } from '../../visual'; import { Unit, Structure } from '../../../mol-model/structure'; @@ -18,7 +18,6 @@ import { VisualUpdateState } from '../../util'; export const MolecularSurfaceMeshParams = { ...UnitsMeshParams, - ...UnitsTextureMeshParams, ...MolecularSurfaceCalculationParams, ignoreHydrogens: PD.Boolean(false), } diff --git a/src/mol-repr/structure/visual/molecular-surface-wireframe.ts b/src/mol-repr/structure/visual/molecular-surface-wireframe.ts new file mode 100644 index 0000000000000000000000000000000000000000..c87eaab5379b894d73742d927e4eabfd6ecbea52 --- /dev/null +++ b/src/mol-repr/structure/visual/molecular-surface-wireframe.ts @@ -0,0 +1,58 @@ +/** + * 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