UNPKG

molstar

Version:

A comprehensive macromolecular library.

76 lines 3.68 kB
/** * Copyright (c) 2019-2020 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ import { __assign } from "tslib"; import { Model, Symmetry } from '../../../mol-model/structure'; import { ShapeRepresentation } from '../representation'; import { Shape } from '../../../mol-model/shape'; import { ColorNames } from '../../../mol-util/color/names'; import { ParamDefinition as PD } from '../../../mol-util/param-definition'; import { Mesh } from '../../../mol-geo/geometry/mesh/mesh'; import { MeshBuilder } from '../../../mol-geo/geometry/mesh/mesh-builder'; import { BoxCage } from '../../../mol-geo/primitive/box'; import { Mat4, Vec3 } from '../../../mol-math/linear-algebra'; import { transformCage, cloneCage } from '../../../mol-geo/primitive/cage'; import { Sphere3D } from '../../../mol-math/geometry'; import { Representation } from '../../representation'; var translate05 = Mat4.fromTranslation(Mat4(), Vec3.create(0.5, 0.5, 0.5)); var unitCage = transformCage(cloneCage(BoxCage()), translate05); var tmpRef = Vec3(); var tmpTranslate = Mat4(); var CellRef = { origin: 'Origin', model: 'Model' }; var CellAttachment = { corner: 'Corner', center: 'Center' }; var CellParams = __assign(__assign({}, Mesh.Params), { cellColor: PD.Color(ColorNames.orange), cellScale: PD.Numeric(2, { min: 0.1, max: 5, step: 0.1 }), ref: PD.Select('model', PD.objectToOptions(CellRef), { isEssential: true }), attachment: PD.Select('corner', PD.objectToOptions(CellAttachment), { isEssential: true }) }); var UnitcellVisuals = { 'mesh': function (ctx, getParams) { return ShapeRepresentation(getUnitcellShape, Mesh.Utils); }, }; export var UnitcellParams = __assign({}, CellParams); function getUnitcellMesh(data, props, mesh) { var state = MeshBuilder.createState(256, 128, mesh); var fromFractional = data.symmetry.spacegroup.cell.fromFractional; Vec3.copy(tmpRef, data.ref); if (props.attachment === 'center') { Vec3.trunc(tmpRef, tmpRef); Vec3.subScalar(tmpRef, tmpRef, 0.5); } else { Vec3.floor(tmpRef, tmpRef); } Mat4.fromTranslation(tmpTranslate, tmpRef); var cellCage = transformCage(cloneCage(unitCage), tmpTranslate); var radius = (Math.cbrt(data.symmetry.spacegroup.cell.volume) / 300) * props.cellScale; state.currentGroup = 1; MeshBuilder.addCage(state, fromFractional, cellCage, radius, 2, 20); var sphere = Sphere3D.fromDimensionsAndTransform(Sphere3D(), Vec3.unit, fromFractional); Vec3.transformMat4(tmpRef, tmpRef, fromFractional); Sphere3D.translate(sphere, sphere, tmpRef); Sphere3D.expand(sphere, sphere, radius); var m = MeshBuilder.getMesh(state); m.setBoundingSphere(sphere); return m; } function getUnitcellShape(ctx, data, props, shape) { var geo = getUnitcellMesh(data, props, shape && shape.geometry); var label = Symmetry.getUnitcellLabel(data.symmetry); return Shape.create(label, data, geo, function () { return props.cellColor; }, function () { return 1; }, function () { return label; }); } // export function getUnitcellData(model, symmetry, props) { var ref = Vec3(); if (props.ref === 'model') { Vec3.transformMat4(ref, Model.getCenter(model), symmetry.spacegroup.cell.toFractional); } return { symmetry: symmetry, ref: ref }; } export function UnitcellRepresentation(ctx, getParams) { return Representation.createMulti('Unit Cell', ctx, getParams, Representation.StateBuilder, UnitcellVisuals); } //# sourceMappingURL=unitcell.js.map