UNPKG

molstar

Version:

A comprehensive macromolecular library.

146 lines 8.4 kB
"use strict"; /** * Copyright (c) 2018-2020 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.DirectVolumeRepresentationProvider = exports.DirectVolumeRepresentation = exports.DirectVolumeVisual = exports.getDirectVolumeParams = exports.DirectVolumeParams = exports.eachDirectVolume = exports.getDirectVolumeLoci = exports.createDirectVolume = exports.createDirectVolume3d = exports.createDirectVolume2d = void 0; var tslib_1 = require("tslib"); var param_definition_1 = require("../../mol-util/param-definition"); var linear_algebra_1 = require("../../mol-math/linear-algebra"); var geometry_1 = require("../../mol-math/geometry"); var volume_1 = require("../../mol-model/volume"); var direct_volume_1 = require("../../mol-geo/geometry/direct-volume/direct-volume"); var representation_1 = require("./representation"); var location_iterator_1 = require("../../mol-geo/util/location-iterator"); var location_1 = require("../../mol-model/location"); var int_1 = require("../../mol-data/int"); var loci_1 = require("../../mol-model/loci"); var util_1 = require("./util"); function getBoundingBox(gridDimension, transform) { var bbox = (0, geometry_1.Box3D)(); geometry_1.Box3D.add(bbox, gridDimension); geometry_1.Box3D.transform(bbox, bbox, transform); return bbox; } // 2d volume texture function createDirectVolume2d(ctx, webgl, volume, directVolume) { var gridDimension = volume.grid.cells.space.dimensions; var _a = (0, util_1.getVolumeTexture2dLayout)(gridDimension), width = _a.width, height = _a.height; if (Math.max(width, height) > webgl.maxTextureSize / 2) { throw new Error('volume too large for direct-volume rendering'); } var textureImage = (0, util_1.createVolumeTexture2d)(volume, 'normals'); // debugTexture(createImageData(textureImage.array, textureImage.width, textureImage.height), 1/3) var transform = volume_1.Grid.getGridToCartesianTransform(volume.grid); var bbox = getBoundingBox(gridDimension, transform); var texture = directVolume ? directVolume.gridTexture.ref.value : webgl.resources.texture('image-uint8', 'rgba', 'ubyte', 'linear'); texture.load(textureImage); var _b = getUnitToCartn(volume.grid), unitToCartn = _b.unitToCartn, cellDim = _b.cellDim; return direct_volume_1.DirectVolume.create(bbox, gridDimension, transform, unitToCartn, cellDim, texture, volume.grid.stats, false, directVolume); } exports.createDirectVolume2d = createDirectVolume2d; // 3d volume texture function getUnitToCartn(grid) { if (grid.transform.kind === 'matrix') { return { unitToCartn: linear_algebra_1.Mat4.mul((0, linear_algebra_1.Mat4)(), grid.transform.matrix, linear_algebra_1.Mat4.fromScaling((0, linear_algebra_1.Mat4)(), grid.cells.space.dimensions)), cellDim: linear_algebra_1.Mat4.getScaling((0, linear_algebra_1.Vec3)(), grid.transform.matrix) }; } var box = grid.transform.fractionalBox; var size = geometry_1.Box3D.size((0, linear_algebra_1.Vec3)(), box); return { unitToCartn: linear_algebra_1.Mat4.mul3((0, linear_algebra_1.Mat4)(), grid.transform.cell.fromFractional, linear_algebra_1.Mat4.fromTranslation((0, linear_algebra_1.Mat4)(), box.min), linear_algebra_1.Mat4.fromScaling((0, linear_algebra_1.Mat4)(), size)), cellDim: linear_algebra_1.Vec3.div((0, linear_algebra_1.Vec3)(), grid.transform.cell.size, grid.cells.space.dimensions) }; } function createDirectVolume3d(ctx, webgl, volume, directVolume) { var gridDimension = volume.grid.cells.space.dimensions; if (Math.max.apply(Math, gridDimension) > webgl.max3dTextureSize / 2) { throw new Error('volume too large for direct-volume rendering'); } var textureVolume = (0, util_1.createVolumeTexture3d)(volume); var transform = volume_1.Grid.getGridToCartesianTransform(volume.grid); var bbox = getBoundingBox(gridDimension, transform); var texture = directVolume ? directVolume.gridTexture.ref.value : webgl.resources.texture('volume-uint8', 'rgba', 'ubyte', 'linear'); texture.load(textureVolume); var _a = getUnitToCartn(volume.grid), unitToCartn = _a.unitToCartn, cellDim = _a.cellDim; return direct_volume_1.DirectVolume.create(bbox, gridDimension, transform, unitToCartn, cellDim, texture, volume.grid.stats, false, directVolume); } exports.createDirectVolume3d = createDirectVolume3d; // function createDirectVolume(ctx, volume, theme, props, directVolume) { return (0, tslib_1.__awaiter)(this, void 0, void 0, function () { var runtime, webgl; return (0, tslib_1.__generator)(this, function (_a) { runtime = ctx.runtime, webgl = ctx.webgl; if (webgl === undefined) throw new Error('DirectVolumeVisual requires `webgl` in props'); return [2 /*return*/, webgl.isWebGL2 ? createDirectVolume3d(runtime, webgl, volume, directVolume) : createDirectVolume2d(runtime, webgl, volume, directVolume)]; }); }); } exports.createDirectVolume = createDirectVolume; function getLoci(volume, props) { return props.renderMode.name === 'isosurface' ? volume_1.Volume.Isosurface.Loci(volume, props.renderMode.params.isoValue) : volume_1.Volume.Loci(volume); } function getDirectVolumeLoci(pickingId, volume, props, id) { var objectId = pickingId.objectId, groupId = pickingId.groupId; if (id === objectId) { return volume_1.Volume.Cell.Loci(volume, int_1.Interval.ofSingleton(groupId)); } return loci_1.EmptyLoci; } exports.getDirectVolumeLoci = getDirectVolumeLoci; function eachDirectVolume(loci, volume, props, apply) { var isoValue = props.renderMode.name === 'isosurface' ? props.renderMode.params.isoValue : undefined; return (0, util_1.eachVolumeLoci)(loci, volume, isoValue, apply); } exports.eachDirectVolume = eachDirectVolume; // exports.DirectVolumeParams = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, direct_volume_1.DirectVolume.Params), { quality: (0, tslib_1.__assign)((0, tslib_1.__assign)({}, direct_volume_1.DirectVolume.Params.quality), { isEssential: false }) }); function getDirectVolumeParams(ctx, volume) { var p = param_definition_1.ParamDefinition.clone(exports.DirectVolumeParams); p.renderMode = direct_volume_1.DirectVolume.createRenderModeParam(volume.grid.stats); return p; } exports.getDirectVolumeParams = getDirectVolumeParams; function DirectVolumeVisual(materialId) { return (0, representation_1.VolumeVisual)({ defaultProps: param_definition_1.ParamDefinition.getDefaultValues(exports.DirectVolumeParams), createGeometry: createDirectVolume, createLocationIterator: function (volume) { return (0, location_iterator_1.LocationIterator)(volume.grid.cells.data.length, 1, 1, function () { return location_1.NullLocation; }); }, getLoci: getDirectVolumeLoci, eachLocation: eachDirectVolume, setUpdateState: function (state, volume, newProps, currentProps) { }, geometryUtils: direct_volume_1.DirectVolume.Utils, dispose: function (geometry) { geometry.gridTexture.ref.value.destroy(); } }, materialId); } exports.DirectVolumeVisual = DirectVolumeVisual; function DirectVolumeRepresentation(ctx, getParams) { return (0, representation_1.VolumeRepresentation)('Direct Volume', ctx, getParams, DirectVolumeVisual, getLoci); } exports.DirectVolumeRepresentation = DirectVolumeRepresentation; exports.DirectVolumeRepresentationProvider = (0, representation_1.VolumeRepresentationProvider)({ name: 'direct-volume', label: 'Direct Volume', description: 'Direct rendering of volumetric data.', factory: DirectVolumeRepresentation, getParams: getDirectVolumeParams, defaultValues: param_definition_1.ParamDefinition.getDefaultValues(exports.DirectVolumeParams), defaultColorTheme: { name: 'uniform' }, defaultSizeTheme: { name: 'uniform' }, isApplicable: function (volume) { return !volume_1.Volume.isEmpty(volume); } }); //# sourceMappingURL=direct-volume.js.map