UNPKG

molstar

Version:

A comprehensive macromolecular library.

118 lines (117 loc) 5.96 kB
"use strict"; /** * Copyright (c) 2019 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.createOrientationEllipsoidMesh = exports.OrientationEllipsoidMeshVisual = exports.OrientationEllipsoidMeshParams = void 0; var tslib_1 = require("tslib"); var param_definition_1 = require("../../../mol-util/param-definition"); var units_visual_1 = require("../../../mol-repr/structure/units-visual"); var structure_1 = require("../../../mol-model/structure"); var mesh_1 = require("../../../mol-geo/geometry/mesh/mesh"); var mesh_builder_1 = require("../../../mol-geo/geometry/mesh/mesh-builder"); var linear_algebra_1 = require("../../../mol-math/linear-algebra"); var ellipsoid_1 = require("../../../mol-geo/geometry/mesh/builder/ellipsoid"); var geometry_1 = require("../../../mol-math/geometry"); var int_1 = require("../../../mol-data/int"); var loci_1 = require("../../../mol-model/loci"); var location_iterator_1 = require("../../../mol-geo/util/location-iterator"); var base_1 = require("../../../mol-geo/geometry/base"); exports.OrientationEllipsoidMeshParams = tslib_1.__assign(tslib_1.__assign({}, units_visual_1.UnitsMeshParams), { sizeFactor: param_definition_1.ParamDefinition.Numeric(1, { min: 0, max: 2, step: 0.1 }), detail: param_definition_1.ParamDefinition.Numeric(0, { min: 0, max: 3, step: 1 }, base_1.BaseGeometry.CustomQualityParamInfo) }); function OrientationEllipsoidMeshVisual(materialId) { return (0, units_visual_1.UnitsMeshVisual)({ defaultProps: param_definition_1.ParamDefinition.getDefaultValues(exports.OrientationEllipsoidMeshParams), createGeometry: createOrientationEllipsoidMesh, createLocationIterator: UnitIterator, getLoci: getUnitLoci, eachLocation: eachUnit, setUpdateState: function (state, newProps, currentProps) { state.createGeometry = (newProps.sizeFactor !== currentProps.sizeFactor || newProps.detail !== currentProps.detail); } }, materialId); } exports.OrientationEllipsoidMeshVisual = OrientationEllipsoidMeshVisual; function isUnitApplicable(unit) { if (structure_1.Unit.Traits.is(unit.traits, 1 /* Unit.Trait.MultiChain */)) return false; if (structure_1.Unit.Traits.is(unit.traits, 2 /* Unit.Trait.Partitioned */)) return false; if (structure_1.Unit.isCoarse(unit)) return true; if (unit.elements.length === 0) return false; unit.model.atomicHierarchy.derived.residue.moleculeType; var rI = unit.residueIndex[unit.elements[0]]; var mt = unit.model.atomicHierarchy.derived.residue.moleculeType[rI]; if (mt === 3 /* MoleculeType.Ion */) return false; if (mt === 2 /* MoleculeType.Water */) return false; return true; } function createOrientationEllipsoidMesh(ctx, unit, structure, theme, props, mesh) { if (!isUnitApplicable(unit)) return mesh_1.Mesh.createEmpty(mesh); var detail = props.detail, sizeFactor = props.sizeFactor; var vertexCount = 256; var builderState = mesh_builder_1.MeshBuilder.createState(vertexCount, vertexCount / 2, mesh); var axes = unit.principalAxes.boxAxes; var origin = axes.origin, dirA = axes.dirA, dirB = axes.dirB; var size = geometry_1.Axes3D.size((0, linear_algebra_1.Vec3)(), axes); linear_algebra_1.Vec3.scale(size, size, sizeFactor / 2); var radiusScale = linear_algebra_1.Vec3.create(size[2], size[1], size[0]); builderState.currentGroup = 0; (0, ellipsoid_1.addEllipsoid)(builderState, origin, dirA, dirB, radiusScale, detail + 1); var m = mesh_builder_1.MeshBuilder.getMesh(builderState); var sphere = geometry_1.Sphere3D.expand((0, geometry_1.Sphere3D)(), unit.boundary.sphere, 1 * props.sizeFactor); m.setBoundingSphere(sphere); return m; } exports.createOrientationEllipsoidMesh = createOrientationEllipsoidMesh; // function UnitIterator(structureGroup) { var group = structureGroup.group, structure = structureGroup.structure; var groupCount = 1; var instanceCount = group.units.length; var location = structure_1.StructureElement.Location.create(structure); var getLocation = function (groupIndex, instanceIndex) { var unit = group.units[instanceIndex]; location.unit = unit; location.element = unit.elements[groupIndex]; return location; }; return (0, location_iterator_1.LocationIterator)(groupCount, instanceCount, 1, getLocation); } function getUnitLoci(pickingId, structureGroup, id) { var objectId = pickingId.objectId, instanceId = pickingId.instanceId; if (id === objectId) { var structure = structureGroup.structure, group = structureGroup.group; var unit = group.units[instanceId]; var indices = int_1.OrderedSet.ofBounds(0, unit.elements.length); return structure_1.StructureElement.Loci(structure, [{ unit: unit, indices: indices }]); } return loci_1.EmptyLoci; } function eachUnit(loci, structureGroup, apply) { var changed = false; if (!structure_1.StructureElement.Loci.is(loci)) return false; var structure = structureGroup.structure, group = structureGroup.group; if (!structure_1.Structure.areEquivalent(loci.structure, structure)) return false; var elementCount = group.elements.length; for (var _i = 0, _a = loci.elements; _i < _a.length; _i++) { var e = _a[_i]; var unitIdx = group.unitIndexMap.get(e.unit.id); if (unitIdx !== undefined) { if (int_1.OrderedSet.size(e.indices) === elementCount) { if (apply(int_1.Interval.ofSingleton(unitIdx))) changed = true; } } } return changed; }