diff --git a/src/mol-geo/representation/structure/visual/polymer-direction-wedge.ts b/src/mol-geo/representation/structure/visual/polymer-direction-wedge.ts index bf6afd3f8f2c21565851435caa2f10bbe60fa8cb..ddd31a67d6970f1b0e00416461a4a57fd7d79d40 100644 --- a/src/mol-geo/representation/structure/visual/polymer-direction-wedge.ts +++ b/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)) diff --git a/src/mol-geo/representation/structure/visual/polymer-trace-mesh.ts b/src/mol-geo/representation/structure/visual/polymer-trace-mesh.ts index 685b0d3c4f6889f3d55586505053c00cb5aba739..186f374e1ad71d661731431b3e9f100b6f690e63 100644 --- a/src/mol-geo/representation/structure/visual/polymer-trace-mesh.ts +++ b/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) diff --git a/src/mol-geo/representation/structure/visual/util/polymer/curve-segment.ts b/src/mol-geo/representation/structure/visual/util/polymer/curve-segment.ts index c5208d0527d59cd998a8659b06f9c0d05595a0bf..3bafdca9fba0db871e46e26aaba9f2b856535e7c 100644 --- a/src/mol-geo/representation/structure/visual/util/polymer/curve-segment.ts +++ b/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))