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

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

parent 4ca5284f
No related branches found
No related tags found
No related merge requests found
...@@ -11,7 +11,7 @@ import { Mesh } from '../../../mesh/mesh'; ...@@ -11,7 +11,7 @@ import { Mesh } from '../../../mesh/mesh';
import { MeshBuilder } from '../../../mesh/mesh-builder'; import { MeshBuilder } from '../../../mesh/mesh-builder';
import { PolymerTraceIterator, createCurveSegmentState, interpolateCurveSegment, PolymerLocationIterator, getPolymerElementLoci, markPolymerElement } from './util/polymer'; import { PolymerTraceIterator, createCurveSegmentState, interpolateCurveSegment, PolymerLocationIterator, getPolymerElementLoci, markPolymerElement } from './util/polymer';
import { Vec3, Mat4 } from 'mol-math/linear-algebra'; 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 { DefaultUnitsMeshProps, UnitsMeshVisual } from '../units-visual';
import { SizeThemeProps, SizeTheme } from 'mol-view/theme/size'; import { SizeThemeProps, SizeTheme } from 'mol-view/theme/size';
import { Wedge } from '../../../primitive/wedge'; import { Wedge } from '../../../primitive/wedge';
...@@ -51,11 +51,12 @@ async function createPolymerDirectionWedgeMesh(ctx: RuntimeContext, unit: Unit, ...@@ -51,11 +51,12 @@ async function createPolymerDirectionWedgeMesh(ctx: RuntimeContext, unit: Unit,
const v = polymerTraceIt.move() const v = polymerTraceIt.move()
builder.setGroup(i) 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 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) { if ((isSheet && !v.secStrucChange) || !isSheet) {
const size = sizeTheme.size(v.center) const size = sizeTheme.size(v.center)
...@@ -63,7 +64,7 @@ async function createPolymerDirectionWedgeMesh(ctx: RuntimeContext, unit: Unit, ...@@ -63,7 +64,7 @@ async function createPolymerDirectionWedgeMesh(ctx: RuntimeContext, unit: Unit,
const width = widthFactor * size const width = widthFactor * size
const height = heightFactor * size const height = heightFactor * size
const vectors = isNucleic ? binormalVectors : normalVectors const vectors = isNucleicType ? binormalVectors : normalVectors
Vec3.fromArray(n0, vectors, 0) Vec3.fromArray(n0, vectors, 0)
Vec3.fromArray(n1, vectors, 3) Vec3.fromArray(n1, vectors, 3)
Vec3.normalize(upVec, Vec3.add(upVec, n0, n1)) Vec3.normalize(upVec, Vec3.add(upVec, n0, n1))
......
...@@ -49,8 +49,9 @@ async function createPolymerTraceMesh(ctx: RuntimeContext, unit: Unit, structure ...@@ -49,8 +49,9 @@ async function createPolymerTraceMesh(ctx: RuntimeContext, unit: Unit, structure
const isSheet = SecondaryStructureType.is(v.secStrucType, SecondaryStructureType.Flag.Beta) const isSheet = SecondaryStructureType.is(v.secStrucType, SecondaryStructureType.Flag.Beta)
const isHelix = SecondaryStructureType.is(v.secStrucType, SecondaryStructureType.Flag.Helix) const isHelix = SecondaryStructureType.is(v.secStrucType, SecondaryStructureType.Flag.Helix)
const tension = (isNucleicType || 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)
let width = sizeTheme.size(v.center) let width = sizeTheme.size(v.center)
......
...@@ -30,8 +30,8 @@ export function createCurveSegmentState(linearSegments: number): CurveSegmentSta ...@@ -30,8 +30,8 @@ export function createCurveSegmentState(linearSegments: number): CurveSegmentSta
} }
} }
export function interpolateCurveSegment(state: CurveSegmentState, controls: CurveSegmentControls, tension: number) { export function interpolateCurveSegment(state: CurveSegmentState, controls: CurveSegmentControls, tension: number, shift: number) {
interpolatePointsAndTangents(state, controls, tension) interpolatePointsAndTangents(state, controls, tension, shift)
interpolateNormals(state, controls) interpolateNormals(state, controls)
} }
...@@ -39,22 +39,22 @@ const tanA = Vec3.zero() ...@@ -39,22 +39,22 @@ const tanA = Vec3.zero()
const tanB = Vec3.zero() const tanB = Vec3.zero()
const tB = 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 { curvePoints, tangentVectors, linearSegments } = state
const { p0, p1, p2, p3, p4 } = controls const { p0, p1, p2, p3, p4 } = controls
const shift1 = 1 - shift
for (let j = 0; j <= linearSegments; ++j) { for (let j = 0; j <= linearSegments; ++j) {
const t = j * 1.0 / linearSegments; const t = j * 1.0 / linearSegments;
// if ((v.last && t > 0.5) || (v.first && t < 0.5)) break if (t < shift1) {
Vec3.spline(tB, p0, p1, p2, p3, t + shift, tension)
if (t < 0.5) { Vec3.spline(tanA, p0, p1, p2, p3, t + shift + 0.01, tension)
Vec3.spline(tB, p0, p1, p2, p3, t + 0.5, tension) Vec3.spline(tanB, p0, p1, p2, p3, t + shift - 0.01, 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)
} else { } else {
Vec3.spline(tB, p1, p2, p3, p4, t - 0.5, tension) Vec3.spline(tB, p1, p2, p3, p4, t - shift1, tension)
Vec3.spline(tanA, p1, p2, p3, p4, t - 0.5 + 0.01, tension) Vec3.spline(tanA, p1, p2, p3, p4, t - shift1 + 0.01, tension)
Vec3.spline(tanB, p1, p2, p3, p4, t - 0.5 - 0.01, tension) Vec3.spline(tanB, p1, p2, p3, p4, t - shift1 - 0.01, tension)
} }
Vec3.toArray(tB, curvePoints, j * 3) Vec3.toArray(tB, curvePoints, j * 3)
Vec3.normalize(tangentVec, Vec3.sub(tangentVec, tanA, tanB)) Vec3.normalize(tangentVec, Vec3.sub(tangentVec, tanA, tanB))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment