Browse Source

different shift of cartoon for dna/rna to better align with backbone atoms

Alexander Rose 6 years ago
parent
commit
7565d39923

+ 6 - 5
src/mol-geo/representation/structure/visual/polymer-direction-wedge.ts

@@ -11,7 +11,7 @@ import { Mesh } from '../../../mesh/mesh';
 import { MeshBuilder } from '../../../mesh/mesh-builder';
 import { PolymerTraceIterator, createCurveSegmentState, interpolateCurveSegment, PolymerLocationIterator, getPolymerElementLoci, markPolymerElement } from './util/polymer';
 import { Vec3, Mat4 } from 'mol-math/linear-algebra';
-import { SecondaryStructureType, MoleculeType } from 'mol-model/structure/model/types';
+import { SecondaryStructureType, isNucleic } from 'mol-model/structure/model/types';
 import { DefaultUnitsMeshProps, UnitsMeshVisual } from '../units-visual';
 import { SizeThemeProps, SizeTheme } from 'mol-view/theme/size';
 import { Wedge } from '../../../primitive/wedge';
@@ -51,11 +51,12 @@ async function createPolymerDirectionWedgeMesh(ctx: RuntimeContext, unit: Unit,
         const v = polymerTraceIt.move()
         builder.setGroup(i)
 
-        const isNucleic = v.moleculeType === MoleculeType.DNA || v.moleculeType === MoleculeType.RNA
+        const isNucleicType = isNucleic(v.moleculeType)
         const isSheet = SecondaryStructureType.is(v.secStrucType, SecondaryStructureType.Flag.Beta)
-        const tension = (isNucleic || isSheet) ? 0.5 : 0.9
+        const tension = (isNucleicType || isSheet) ? 0.5 : 0.9
+        const shift = isNucleicType ? 0.3 : 0.5
 
-        interpolateCurveSegment(state, v, tension)
+        interpolateCurveSegment(state, v, tension, shift)
 
         if ((isSheet && !v.secStrucChange) || !isSheet) {
             const size = sizeTheme.size(v.center)
@@ -63,7 +64,7 @@ async function createPolymerDirectionWedgeMesh(ctx: RuntimeContext, unit: Unit,
             const width = widthFactor * size
             const height = heightFactor * size
 
-            const vectors = isNucleic ? binormalVectors : normalVectors
+            const vectors = isNucleicType ? binormalVectors : normalVectors
             Vec3.fromArray(n0, vectors, 0)
             Vec3.fromArray(n1, vectors, 3)
             Vec3.normalize(upVec, Vec3.add(upVec, n0, n1))

+ 2 - 1
src/mol-geo/representation/structure/visual/polymer-trace-mesh.ts

@@ -49,8 +49,9 @@ async function createPolymerTraceMesh(ctx: RuntimeContext, unit: Unit, structure
         const isSheet = SecondaryStructureType.is(v.secStrucType, SecondaryStructureType.Flag.Beta)
         const isHelix = SecondaryStructureType.is(v.secStrucType, SecondaryStructureType.Flag.Helix)
         const tension = (isNucleicType || isSheet) ? 0.5 : 0.9
+        const shift = isNucleicType ? 0.3 : 0.5
 
-        interpolateCurveSegment(state, v, tension)
+        interpolateCurveSegment(state, v, tension, shift)
 
         let width = sizeTheme.size(v.center)
 

+ 12 - 12
src/mol-geo/representation/structure/visual/util/polymer/curve-segment.ts

@@ -30,8 +30,8 @@ export function createCurveSegmentState(linearSegments: number): CurveSegmentSta
     }
 }
 
-export function interpolateCurveSegment(state: CurveSegmentState, controls: CurveSegmentControls, tension: number) {
-    interpolatePointsAndTangents(state, controls, tension)
+export function interpolateCurveSegment(state: CurveSegmentState, controls: CurveSegmentControls, tension: number, shift: number) {
+    interpolatePointsAndTangents(state, controls, tension, shift)
     interpolateNormals(state, controls)
 }
 
@@ -39,22 +39,22 @@ const tanA = Vec3.zero()
 const tanB = Vec3.zero()
 const tB = Vec3.zero()
 
-export function interpolatePointsAndTangents(state: CurveSegmentState, controls: CurveSegmentControls, tension: number) {
+export function interpolatePointsAndTangents(state: CurveSegmentState, controls: CurveSegmentControls, tension: number, shift: number) {
     const { curvePoints, tangentVectors, linearSegments } = state
     const { p0, p1, p2, p3, p4 } = controls
 
+    const shift1 = 1 - shift
+
     for (let j = 0; j <= linearSegments; ++j) {
         const t = j * 1.0 / linearSegments;
-        // if ((v.last && t > 0.5) || (v.first && t < 0.5)) break
-
-        if (t < 0.5) {
-            Vec3.spline(tB, p0, p1, p2, p3, t + 0.5, tension)
-            Vec3.spline(tanA, p0, p1, p2, p3, t + 0.5 + 0.01, tension)
-            Vec3.spline(tanB, p0, p1, p2, p3, t + 0.5 - 0.01, tension)
+        if (t < shift1) {
+            Vec3.spline(tB, p0, p1, p2, p3, t + shift, tension)
+            Vec3.spline(tanA, p0, p1, p2, p3, t + shift + 0.01, tension)
+            Vec3.spline(tanB, p0, p1, p2, p3, t + shift - 0.01, tension)
         } else {
-            Vec3.spline(tB, p1, p2, p3, p4, t - 0.5, tension)
-            Vec3.spline(tanA, p1, p2, p3, p4, t - 0.5 + 0.01, tension)
-            Vec3.spline(tanB, p1, p2, p3, p4, t - 0.5 - 0.01, tension)
+            Vec3.spline(tB, p1, p2, p3, p4, t - shift1, tension)
+            Vec3.spline(tanA, p1, p2, p3, p4, t - shift1 + 0.01, tension)
+            Vec3.spline(tanB, p1, p2, p3, p4, t - shift1 - 0.01, tension)
         }
         Vec3.toArray(tB, curvePoints, j * 3)
         Vec3.normalize(tangentVec, Vec3.sub(tangentVec, tanA, tanB))