UNPKG

molstar

Version:

A comprehensive macromolecular library.

84 lines (83 loc) 4.09 kB
/** * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ import { __assign } from "tslib"; import { ParamDefinition as PD } from '../../../mol-util/param-definition'; import { Mat4, Vec3 } from '../../../mol-math/linear-algebra'; import { Wedge } from '../../../mol-geo/primitive/wedge'; import { Mesh } from '../../../mol-geo/geometry/mesh/mesh'; import { MeshBuilder } from '../../../mol-geo/geometry/mesh/mesh-builder'; import { createCurveSegmentState, PolymerTraceIterator, interpolateCurveSegment, PolymerLocationIterator, getPolymerElementLoci, eachPolymerElement } from './util/polymer'; import { isNucleic, SecondaryStructureType } from '../../../mol-model/structure/model/types'; import { UnitsMeshParams, UnitsMeshVisual } from '../units-visual'; import { Sphere3D } from '../../../mol-math/geometry'; var t = Mat4.identity(); var sVec = Vec3.zero(); var n0 = Vec3.zero(); var n1 = Vec3.zero(); var upVec = Vec3.zero(); var depthFactor = 4; var widthFactor = 4; var heightFactor = 6; var wedge = Wedge(); export var PolymerDirectionWedgeParams = { sizeFactor: PD.Numeric(0.2, { min: 0, max: 10, step: 0.01 }), }; export var DefaultPolymerDirectionWedgeProps = PD.getDefaultValues(PolymerDirectionWedgeParams); function createPolymerDirectionWedgeMesh(ctx, unit, structure, theme, props, mesh) { var polymerElementCount = unit.polymerElements.length; if (!polymerElementCount) return Mesh.createEmpty(mesh); var sizeFactor = props.sizeFactor; var vertexCount = polymerElementCount * 24; var builderState = MeshBuilder.createState(vertexCount, vertexCount / 10, mesh); var linearSegments = 1; var state = createCurveSegmentState(linearSegments); var normalVectors = state.normalVectors, binormalVectors = state.binormalVectors; var i = 0; var polymerTraceIt = PolymerTraceIterator(unit, structure); while (polymerTraceIt.hasNext) { var v = polymerTraceIt.move(); builderState.currentGroup = i; var isNucleicType = isNucleic(v.moleculeType); var isSheet = SecondaryStructureType.is(v.secStrucType, 4 /* SecondaryStructureType.Flag.Beta */); var tension = (isNucleicType || isSheet) ? 0.5 : 0.9; var shift = isNucleicType ? 0.3 : 0.5; interpolateCurveSegment(state, v, tension, shift); if ((isSheet && !v.secStrucLast) || !isSheet) { var size = theme.size.size(v.center) * sizeFactor; var depth = depthFactor * size; var width = widthFactor * size; var height = heightFactor * size; var vectors = isNucleicType ? binormalVectors : normalVectors; Vec3.fromArray(n0, vectors, 0); Vec3.fromArray(n1, vectors, 3); Vec3.normalize(upVec, Vec3.add(upVec, n0, n1)); Mat4.targetTo(t, v.p3, v.p1, upVec); Mat4.mul(t, t, Mat4.rotY90Z180); Mat4.scale(t, t, Vec3.set(sVec, height, width, depth)); Mat4.setTranslation(t, v.p2); MeshBuilder.addPrimitive(builderState, t, wedge); } ++i; } var m = MeshBuilder.getMesh(builderState); var sphere = Sphere3D.expand(Sphere3D(), unit.boundary.sphere, 1 * props.sizeFactor); m.setBoundingSphere(sphere); return m; } export var PolymerDirectionParams = __assign(__assign({}, UnitsMeshParams), PolymerDirectionWedgeParams); export function PolymerDirectionVisual(materialId) { return UnitsMeshVisual({ defaultProps: PD.getDefaultValues(PolymerDirectionParams), createGeometry: createPolymerDirectionWedgeMesh, createLocationIterator: PolymerLocationIterator.fromGroup, getLoci: getPolymerElementLoci, eachLocation: eachPolymerElement, setUpdateState: function (state, newProps, currentProps) { state.createGeometry = (newProps.sizeFactor !== currentProps.sizeFactor); } }, materialId); }