molstar
Version:
A comprehensive macromolecular library.
123 lines (122 loc) • 6.08 kB
JavaScript
/**
* 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;
;