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';
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))
......
......@@ -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)
......
......@@ -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))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment