Browse Source

add molecular surface wireframe visual

Alexander Rose 5 years ago
parent
commit
efcf4a77c6

+ 4 - 1
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

+ 1 - 2
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),
 }

+ 58 - 0
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)
+}