Browse Source

add traceOnly support to element-sphere visual

Alexander Rose 5 years ago
parent
commit
774f419a53

+ 6 - 3
src/mol-repr/structure/visual/element-sphere.ts

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
+ * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
  *
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  * @author David Sehnal <david.sehnal@gmail.com>
@@ -17,6 +17,7 @@ export const ElementSphereParams = {
     sizeFactor: PD.Numeric(1, { min: 0, max: 10, step: 0.1 }),
     detail: PD.Numeric(0, { min: 0, max: 3, step: 1 }),
     ignoreHydrogens: PD.Boolean(false),
+    traceOnly: PD.Boolean(false),
 }
 export type ElementSphereParams = typeof ElementSphereParams
 
@@ -33,7 +34,8 @@ export function ElementSphereImpostorVisual(materialId: number): UnitsVisual<Ele
         eachLocation: eachElement,
         setUpdateState: (state: VisualUpdateState, newProps: PD.Values<ElementSphereParams>, currentProps: PD.Values<ElementSphereParams>) => {
             state.createGeometry = (
-                newProps.ignoreHydrogens !== currentProps.ignoreHydrogens
+                newProps.ignoreHydrogens !== currentProps.ignoreHydrogens ||
+                newProps.traceOnly !== currentProps.traceOnly
             )
         }
     }, materialId)
@@ -50,7 +52,8 @@ export function ElementSphereMeshVisual(materialId: number): UnitsVisual<Element
             state.createGeometry = (
                 newProps.sizeFactor !== currentProps.sizeFactor ||
                 newProps.detail !== currentProps.detail ||
-                newProps.ignoreHydrogens !== currentProps.ignoreHydrogens
+                newProps.ignoreHydrogens !== currentProps.ignoreHydrogens ||
+                newProps.traceOnly !== currentProps.traceOnly
             )
         }
     }, materialId)

+ 1 - 1
src/mol-repr/structure/visual/util/common.ts

@@ -262,7 +262,7 @@ export function isHydrogen(unit: Unit, element: ElementIndex) {
     return false
 }
 
-function isTrace(unit: Unit, element: ElementIndex) {
+export function isTrace(unit: Unit, element: ElementIndex) {
     if (Unit.isCoarse(unit)) return true
     const atomId = unit.model.atomicHierarchy.atoms.label_atom_id.value(element)
     if (atomId === 'CA' || atomId === 'P') return true

+ 10 - 5
src/mol-repr/structure/visual/util/element.ts

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
+ * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
  *
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  * @author David Sehnal <david.sehnal@gmail.com>
@@ -20,17 +20,18 @@ import { Theme } from '../../../../mol-theme/theme';
 import { StructureGroup } from '../../../../mol-repr/structure/units-visual';
 import { Spheres } from '../../../../mol-geo/geometry/spheres/spheres';
 import { SpheresBuilder } from '../../../../mol-geo/geometry/spheres/spheres-builder';
-import { isHydrogen } from './common';
+import { isHydrogen, isTrace } from './common';
 import { Sphere3D } from '../../../../mol-math/geometry';
 
 export interface ElementSphereMeshProps {
     detail: number,
     sizeFactor: number,
     ignoreHydrogens: boolean,
+    traceOnly: boolean,
 }
 
 export function createElementSphereMesh(ctx: VisualContext, unit: Unit, structure: Structure, theme: Theme, props: ElementSphereMeshProps, mesh?: Mesh): Mesh {
-    const { detail, sizeFactor } = props
+    const { detail, sizeFactor, ignoreHydrogens, traceOnly } = props
 
     const { elements } = unit;
     const elementCount = elements.length;
@@ -43,7 +44,8 @@ export function createElementSphereMesh(ctx: VisualContext, unit: Unit, structur
     l.unit = unit
 
     for (let i = 0; i < elementCount; i++) {
-        if (props.ignoreHydrogens && isHydrogen(unit, elements[i])) continue
+        if (ignoreHydrogens && isHydrogen(unit, elements[i])) continue
+        if (traceOnly && !isTrace(unit, elements[i])) continue
 
         l.element = elements[i]
         pos(elements[i], v)
@@ -62,9 +64,11 @@ export function createElementSphereMesh(ctx: VisualContext, unit: Unit, structur
 
 export interface ElementSphereImpostorProps {
     ignoreHydrogens: boolean,
+    traceOnly: boolean
 }
 
 export function createElementSphereImpostor(ctx: VisualContext, unit: Unit, structure: Structure, theme: Theme, props: ElementSphereImpostorProps, spheres?: Spheres): Spheres {
+    const { ignoreHydrogens, traceOnly } = props
 
     const { elements } = unit;
     const elementCount = elements.length;
@@ -74,7 +78,8 @@ export function createElementSphereImpostor(ctx: VisualContext, unit: Unit, stru
     const pos = unit.conformation.invariantPosition
 
     for (let i = 0; i < elementCount; i++) {
-        if (props.ignoreHydrogens && isHydrogen(unit, elements[i])) continue
+        if (ignoreHydrogens && isHydrogen(unit, elements[i])) continue
+        if (traceOnly && !isTrace(unit, elements[i])) continue
 
         pos(elements[i], v)
         builder.add(v[0], v[1], v[2], i)