UNPKG

molstar

Version:

A comprehensive macromolecular library.

113 lines 6.95 kB
/** * Copyright (c) 2020 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> * @author Sebastian Bittrich <sebastian.bittrich@rcsb.org> */ import { __assign } from "tslib"; import { ParamDefinition as PD } from '../../mol-util/param-definition'; import { Vec3, Mat4 } from '../../mol-math/linear-algebra'; import { Representation } from '../../mol-repr/representation'; import { Structure } from '../../mol-model/structure'; import { StructureRepresentationProvider, StructureRepresentationStateBuilder } from '../../mol-repr/structure/representation'; import { ShapeRepresentation } from '../../mol-repr/shape/representation'; import { Shape } from '../../mol-model/shape'; import { Lines } from '../../mol-geo/geometry/lines/lines'; import { Mesh } from '../../mol-geo/geometry/mesh/mesh'; import { LinesBuilder } from '../../mol-geo/geometry/lines/lines-builder'; import { Circle } from '../../mol-geo/primitive/circle'; import { transformPrimitive } from '../../mol-geo/primitive/primitive'; import { MeshBuilder } from '../../mol-geo/geometry/mesh/mesh-builder'; import { MembraneOrientationProvider } from './prop'; import { MarkerActions } from '../../mol-util/marker-action'; import { lociLabel } from '../../mol-theme/label'; import { ColorNames } from '../../mol-util/color/names'; var SharedParams = { color: PD.Color(ColorNames.lightgrey), radiusFactor: PD.Numeric(1.2, { min: 0.1, max: 3.0, step: 0.01 }, { description: 'Scale the radius of the membrane layer' }) }; var BilayerPlanesParams = __assign(__assign(__assign({}, Mesh.Params), SharedParams), { sectorOpacity: PD.Numeric(0.5, { min: 0, max: 1, step: 0.01 }) }); var BilayerRimsParams = __assign(__assign(__assign({}, Lines.Params), SharedParams), { lineSizeAttenuation: PD.Boolean(true), linesSize: PD.Numeric(0.3, { min: 0.01, max: 50, step: 0.01 }), dashedLines: PD.Boolean(true) }); var MembraneOrientationVisuals = { 'bilayer-planes': function (ctx, getParams) { return ShapeRepresentation(getBilayerPlanes, Mesh.Utils, { modifyState: function (s) { return (__assign(__assign({}, s), { markerActions: MarkerActions.Highlighting })); }, modifyProps: function (p) { return (__assign(__assign({}, p), { alpha: p.sectorOpacity, ignoreLight: true, doubleSided: false })); } }); }, 'bilayer-rims': function (ctx, getParams) { return ShapeRepresentation(getBilayerRims, Lines.Utils, { modifyState: function (s) { return (__assign(__assign({}, s), { markerActions: MarkerActions.Highlighting })); } }); } }; export var MembraneOrientationParams = __assign(__assign(__assign({}, BilayerPlanesParams), BilayerRimsParams), { visuals: PD.MultiSelect(['bilayer-planes', 'bilayer-rims'], PD.objectToOptions(MembraneOrientationVisuals)) }); export function getMembraneOrientationParams(ctx, structure) { return PD.clone(MembraneOrientationParams); } export function MembraneOrientationRepresentation(ctx, getParams) { return Representation.createMulti('Membrane Orientation', ctx, getParams, StructureRepresentationStateBuilder, MembraneOrientationVisuals); } export var MembraneOrientationRepresentationProvider = StructureRepresentationProvider({ name: 'membrane-orientation', label: 'Membrane Orientation', description: 'Displays a grid of points representing membrane layers.', factory: MembraneOrientationRepresentation, getParams: getMembraneOrientationParams, defaultValues: PD.getDefaultValues(MembraneOrientationParams), defaultColorTheme: { name: 'shape-group' }, defaultSizeTheme: { name: 'shape-group' }, isApplicable: function (structure) { return structure.elementCount > 0; }, ensureCustomProperties: { attach: function (ctx, structure) { return MembraneOrientationProvider.attach(ctx, structure, void 0, true); }, detach: function (data) { return MembraneOrientationProvider.ref(data, false); } } }); function membraneLabel(data) { return lociLabel(Structure.Loci(data)) + " | Membrane Orientation"; } function getBilayerRims(ctx, data, props, shape) { var _a = MembraneOrientationProvider.get(data).value, p1 = _a.planePoint1, p2 = _a.planePoint2, centroid = _a.centroid, radius = _a.radius; var scaledRadius = props.radiusFactor * radius; var builder = LinesBuilder.create(128, 64, shape === null || shape === void 0 ? void 0 : shape.geometry); getLayerCircle(builder, p1, centroid, scaledRadius, props); getLayerCircle(builder, p2, centroid, scaledRadius, props); return Shape.create('Bilayer rims', data, builder.getLines(), function () { return props.color; }, function () { return props.linesSize; }, function () { return membraneLabel(data); }); } function getLayerCircle(builder, p, centroid, radius, props, shape) { var circle = getCircle(p, centroid, radius); var indices = circle.indices, vertices = circle.vertices; for (var j = 0, jl = indices.length; j < jl; j += 3) { if (props.dashedLines && j % 2 === 1) continue; // draw every other segment to get dashes var start = indices[j] * 3; var end = indices[j + 1] * 3; var startX = vertices[start]; var startY = vertices[start + 1]; var startZ = vertices[start + 2]; var endX = vertices[end]; var endY = vertices[end + 1]; var endZ = vertices[end + 2]; builder.add(startX, startY, startZ, endX, endY, endZ, 0); } } var tmpMat = Mat4(); var tmpV = Vec3(); function getCircle(p, centroid, radius) { if (Vec3.dot(Vec3.unitY, Vec3.sub(tmpV, p, centroid)) === 0) { Mat4.targetTo(tmpMat, p, centroid, Vec3.unitY); } else { Mat4.targetTo(tmpMat, p, centroid, Vec3.unitX); } Mat4.setTranslation(tmpMat, p); Mat4.mul(tmpMat, tmpMat, Mat4.rotX90); var circle = Circle({ radius: radius, segments: 64 }); return transformPrimitive(circle, tmpMat); } function getBilayerPlanes(ctx, data, props, shape) { var _a = MembraneOrientationProvider.get(data).value, p1 = _a.planePoint1, p2 = _a.planePoint2, centroid = _a.centroid, radius = _a.radius; var state = MeshBuilder.createState(128, 64, shape && shape.geometry); var scaledRadius = props.radiusFactor * radius; getLayerPlane(state, p1, centroid, scaledRadius); getLayerPlane(state, p2, centroid, scaledRadius); return Shape.create('Bilayer planes', data, MeshBuilder.getMesh(state), function () { return props.color; }, function () { return 1; }, function () { return membraneLabel(data); }); } function getLayerPlane(state, p, centroid, radius) { var circle = getCircle(p, centroid, radius); state.currentGroup = 0; MeshBuilder.addPrimitive(state, Mat4.id, circle); MeshBuilder.addPrimitiveFlipped(state, Mat4.id, circle); } //# sourceMappingURL=representation.js.map