UNPKG

molstar

Version:

A comprehensive macromolecular library.

123 lines (122 loc) 6.08 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.createGroupInstanceSize = exports.createGroupSize = exports.createInstanceSize = exports.createTextureSize = exports.createUniformSize = exports.createValueSize = exports.getMaxSize = exports.sizeDataFactor = exports.createSizes = void 0; var tslib_1 = require("tslib"); var mol_util_1 = require("../../mol-util"); var linear_algebra_1 = require("../../mol-math/linear-algebra"); var util_1 = require("../../mol-gl/renderable/util"); var location_1 = require("../../mol-model/location"); var geometry_1 = require("./geometry"); var number_packing_1 = require("../../mol-util/number-packing"); function createSizes(locationIt, sizeTheme, sizeData) { switch (geometry_1.Geometry.getGranularity(locationIt, sizeTheme.granularity)) { case 'uniform': return createUniformSize(locationIt, sizeTheme.size, sizeData); case 'group': return createGroupSize(locationIt, sizeTheme.size, sizeData); case 'groupInstance': return createGroupInstanceSize(locationIt, sizeTheme.size, sizeData); case 'instance': return createInstanceSize(locationIt, sizeTheme.size, sizeData); } } exports.createSizes = createSizes; exports.sizeDataFactor = 100; // NOTE same factor is set in shaders function getMaxSize(sizeData) { var type = sizeData.dSizeType.ref.value; switch (type) { case 'uniform': return sizeData.uSize.ref.value; case 'instance': case 'group': case 'groupInstance': var maxSize = 0; var array = sizeData.tSize.ref.value.array; for (var i = 0, il = array.length; i < il; i += 3) { var value = (0, number_packing_1.unpackRGBToInt)(array[i], array[i + 1], array[i + 2]); if (maxSize < value) maxSize = value; } return maxSize / exports.sizeDataFactor; } } exports.getMaxSize = getMaxSize; var emptySizeTexture = { array: new Uint8Array(3), width: 1, height: 1 }; function createEmptySizeTexture() { return { tSize: mol_util_1.ValueCell.create(emptySizeTexture), uSizeTexDim: mol_util_1.ValueCell.create(linear_algebra_1.Vec2.create(1, 1)) }; } function createValueSize(value, sizeData) { if (sizeData) { mol_util_1.ValueCell.update(sizeData.uSize, value); mol_util_1.ValueCell.updateIfChanged(sizeData.dSizeType, 'uniform'); return sizeData; } else { return tslib_1.__assign(tslib_1.__assign({ uSize: mol_util_1.ValueCell.create(value) }, createEmptySizeTexture()), { dSizeType: mol_util_1.ValueCell.create('uniform') }); } } exports.createValueSize = createValueSize; /** Creates size uniform */ function createUniformSize(locationIt, sizeFn, sizeData) { return createValueSize(sizeFn(location_1.NullLocation), sizeData); } exports.createUniformSize = createUniformSize; function createTextureSize(sizes, type, sizeData) { if (sizeData) { mol_util_1.ValueCell.update(sizeData.tSize, sizes); mol_util_1.ValueCell.update(sizeData.uSizeTexDim, linear_algebra_1.Vec2.create(sizes.width, sizes.height)); mol_util_1.ValueCell.updateIfChanged(sizeData.dSizeType, type); return sizeData; } else { return { uSize: mol_util_1.ValueCell.create(0), tSize: mol_util_1.ValueCell.create(sizes), uSizeTexDim: mol_util_1.ValueCell.create(linear_algebra_1.Vec2.create(sizes.width, sizes.height)), dSizeType: mol_util_1.ValueCell.create(type), }; } } exports.createTextureSize = createTextureSize; /** Creates size texture with size for each instance/unit */ function createInstanceSize(locationIt, sizeFn, sizeData) { var instanceCount = locationIt.instanceCount; var sizes = (0, util_1.createTextureImage)(Math.max(1, instanceCount), 3, Uint8Array, sizeData && sizeData.tSize.ref.value.array); locationIt.reset(); while (locationIt.hasNext && !locationIt.isNextNewInstance) { var v = locationIt.move(); (0, number_packing_1.packIntToRGBArray)(sizeFn(v.location) * exports.sizeDataFactor, sizes.array, v.instanceIndex * 3); locationIt.skipInstance(); } return createTextureSize(sizes, 'instance', sizeData); } exports.createInstanceSize = createInstanceSize; /** Creates size texture with size for each group (i.e. shared across instances/units) */ function createGroupSize(locationIt, sizeFn, sizeData) { var groupCount = locationIt.groupCount; var sizes = (0, util_1.createTextureImage)(Math.max(1, groupCount), 3, Uint8Array, sizeData && sizeData.tSize.ref.value.array); locationIt.reset(); while (locationIt.hasNext && !locationIt.isNextNewInstance) { var v = locationIt.move(); (0, number_packing_1.packIntToRGBArray)(sizeFn(v.location) * exports.sizeDataFactor, sizes.array, v.groupIndex * 3); } return createTextureSize(sizes, 'group', sizeData); } exports.createGroupSize = createGroupSize; /** Creates size texture with size for each group in each instance (i.e. for each unit) */ function createGroupInstanceSize(locationIt, sizeFn, sizeData) { var groupCount = locationIt.groupCount, instanceCount = locationIt.instanceCount; var count = instanceCount * groupCount; var sizes = (0, util_1.createTextureImage)(Math.max(1, count), 3, Uint8Array, sizeData && sizeData.tSize.ref.value.array); locationIt.reset(); while (locationIt.hasNext) { var v = locationIt.move(); (0, number_packing_1.packIntToRGBArray)(sizeFn(v.location) * exports.sizeDataFactor, sizes.array, v.index * 3); } return createTextureSize(sizes, 'groupInstance', sizeData); } exports.createGroupInstanceSize = createGroupInstanceSize;