UNPKG

molstar

Version:

A comprehensive macromolecular library.

77 lines (76 loc) 4.22 kB
"use strict"; /** * Copyright (c) 2021 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ Object.defineProperty(exports, "__esModule", { value: true }); exports.ElementCrossVisual = exports.createElementCross = exports.ElementCrossParams = void 0; var tslib_1 = require("tslib"); var param_definition_1 = require("../../../mol-util/param-definition"); var units_visual_1 = require("../units-visual"); var structure_1 = require("../../../mol-model/structure"); var linear_algebra_1 = require("../../../mol-math/linear-algebra"); var element_1 = require("./util/element"); var geometry_1 = require("../../../mol-math/geometry"); var lines_1 = require("../../../mol-geo/geometry/lines/lines"); var lines_builder_1 = require("../../../mol-geo/geometry/lines/lines-builder"); var util_1 = require("../../../mol-model-props/computed/chemistry/util"); // avoiding namespace lookup improved performance in Chrome (Aug 2020) var v3scaleAndAdd = linear_algebra_1.Vec3.scaleAndAdd; var v3unitX = linear_algebra_1.Vec3.unitX; var v3unitY = linear_algebra_1.Vec3.unitY; var v3unitZ = linear_algebra_1.Vec3.unitZ; exports.ElementCrossParams = tslib_1.__assign(tslib_1.__assign({}, units_visual_1.UnitsLinesParams), { lineSizeAttenuation: param_definition_1.ParamDefinition.Boolean(false), ignoreHydrogens: param_definition_1.ParamDefinition.Boolean(false), traceOnly: param_definition_1.ParamDefinition.Boolean(false), crosses: param_definition_1.ParamDefinition.Select('lone', param_definition_1.ParamDefinition.arrayToOptions(['lone', 'all'])), crossSize: param_definition_1.ParamDefinition.Numeric(0.35, { min: 0, max: 2, step: 0.01 }) }); function createElementCross(ctx, unit, structure, theme, props, lines) { var child = structure.child; if (child && !child.unitMap.get(unit.id)) return lines_1.Lines.createEmpty(lines); var elements = unit.elements; var n = elements.length; var builder = lines_builder_1.LinesBuilder.create(n, n / 10, lines); var p = (0, linear_algebra_1.Vec3)(); var s = (0, linear_algebra_1.Vec3)(); var e = (0, linear_algebra_1.Vec3)(); var pos = unit.conformation.invariantPosition; var ignore = (0, element_1.makeElementIgnoreTest)(structure, unit, props); var r = props.crossSize / 2; var lone = props.crosses === 'lone'; for (var i = 0; i < n; ++i) { if (ignore && ignore(elements[i])) continue; if (lone && structure_1.Unit.isAtomic(unit) && (0, util_1.bondCount)(structure, unit, i) !== 0) continue; pos(elements[i], p); v3scaleAndAdd(s, p, v3unitX, r); v3scaleAndAdd(e, p, v3unitX, -r); builder.add(s[0], s[1], s[2], e[0], e[1], e[2], i); v3scaleAndAdd(s, p, v3unitY, r); v3scaleAndAdd(e, p, v3unitY, -r); builder.add(s[0], s[1], s[2], e[0], e[1], e[2], i); v3scaleAndAdd(s, p, v3unitZ, r); v3scaleAndAdd(e, p, v3unitZ, -r); builder.add(s[0], s[1], s[2], e[0], e[1], e[2], i); } var l = builder.getLines(); var sphere = geometry_1.Sphere3D.expand((0, geometry_1.Sphere3D)(), unit.boundary.sphere, 1 * props.sizeFactor); l.setBoundingSphere(sphere); return l; } exports.createElementCross = createElementCross; function ElementCrossVisual(materialId) { return (0, units_visual_1.UnitsLinesVisual)({ defaultProps: param_definition_1.ParamDefinition.getDefaultValues(exports.ElementCrossParams), createGeometry: createElementCross, createLocationIterator: element_1.ElementIterator.fromGroup, getLoci: element_1.getElementLoci, eachLocation: element_1.eachElement, setUpdateState: function (state, newProps, currentProps) { state.createGeometry = (newProps.ignoreHydrogens !== currentProps.ignoreHydrogens || newProps.traceOnly !== currentProps.traceOnly || newProps.crosses !== currentProps.crosses || newProps.crossSize !== currentProps.crossSize); } }, materialId); } exports.ElementCrossVisual = ElementCrossVisual;