molstar
Version:
A comprehensive macromolecular library.
206 lines • 10.3 kB
JavaScript
/**
* Copyright (c) 2018-2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
* @author David Sehnal <david.sehnal@gmail.com>
*/
import { ValueCell } from '../../mol-util';
import { createTextureImage } from '../../mol-gl/renderable/util';
import { Color } from '../../mol-util/color';
import { Vec2, Vec3, Vec4 } from '../../mol-math/linear-algebra';
import { NullLocation } from '../../mol-model/location';
import { Geometry } from './geometry';
import { createNullTexture } from '../../mol-gl/webgl/texture';
export function createColors(locationIt, positionIt, colorTheme, colorData) {
var data = _createColors(locationIt, positionIt, colorTheme, colorData);
if (colorTheme.palette) {
ValueCell.updateIfChanged(data.dUsePalette, true);
updatePaletteTexture(colorTheme.palette, data.tPalette);
}
else {
ValueCell.updateIfChanged(data.dUsePalette, false);
}
return data;
}
function _createColors(locationIt, positionIt, colorTheme, colorData) {
switch (Geometry.getGranularity(locationIt, colorTheme.granularity)) {
case 'uniform': return createUniformColor(locationIt, colorTheme.color, colorData);
case 'instance': return createInstanceColor(locationIt, colorTheme.color, colorData);
case 'group': return createGroupColor(locationIt, colorTheme.color, colorData);
case 'groupInstance': return createGroupInstanceColor(locationIt, colorTheme.color, colorData);
case 'vertex': return createVertexColor(positionIt, colorTheme.color, colorData);
case 'vertexInstance': return createVertexInstanceColor(positionIt, colorTheme.color, colorData);
case 'volume': return createGridColor(colorTheme.grid, 'volume', colorData);
case 'volumeInstance': return createGridColor(colorTheme.grid, 'volumeInstance', colorData);
}
}
function updatePaletteTexture(palette, cell) {
var isSynced = true;
var texture = cell.ref.value;
if (palette.colors.length !== texture.width || texture.filter !== palette.filter) {
isSynced = false;
}
else {
var data = texture.array;
var o_1 = 0;
for (var _i = 0, _a = palette.colors; _i < _a.length; _i++) {
var c = _a[_i];
var _b = Color.toRgb(c), r = _b[0], g = _b[1], b = _b[2];
if (data[o_1++] !== r || data[o_1++] !== g || data[o_1++] !== b) {
isSynced = false;
break;
}
}
}
if (isSynced)
return;
var array = new Uint8Array(palette.colors.length * 3);
var o = 0;
for (var _c = 0, _d = palette.colors; _c < _d.length; _c++) {
var c = _d[_c];
var _e = Color.toRgb(c), r = _e[0], g = _e[1], b = _e[2];
array[o++] = r;
array[o++] = g;
array[o++] = b;
}
ValueCell.update(cell, { array: array, height: 1, width: palette.colors.length, filter: palette.filter });
}
//
export function createValueColor(value, colorData) {
if (colorData) {
ValueCell.update(colorData.uColor, Color.toVec3Normalized(colorData.uColor.ref.value, value));
ValueCell.updateIfChanged(colorData.dColorType, 'uniform');
return colorData;
}
else {
return {
uColor: ValueCell.create(Color.toVec3Normalized(Vec3(), value)),
tColor: ValueCell.create({ array: new Uint8Array(3), width: 1, height: 1 }),
tColorGrid: ValueCell.create(createNullTexture()),
tPalette: ValueCell.create({ array: new Uint8Array(3), width: 1, height: 1 }),
uColorTexDim: ValueCell.create(Vec2.create(1, 1)),
uColorGridDim: ValueCell.create(Vec3.create(1, 1, 1)),
uColorGridTransform: ValueCell.create(Vec4.create(0, 0, 0, 1)),
dColorType: ValueCell.create('uniform'),
dUsePalette: ValueCell.create(false),
};
}
}
/** Creates color uniform */
function createUniformColor(locationIt, color, colorData) {
return createValueColor(color(NullLocation, false), colorData);
}
//
export function createTextureColor(colors, type, colorData) {
if (colorData) {
ValueCell.update(colorData.tColor, colors);
ValueCell.update(colorData.uColorTexDim, Vec2.create(colors.width, colors.height));
ValueCell.updateIfChanged(colorData.dColorType, type);
return colorData;
}
else {
return {
uColor: ValueCell.create(Vec3()),
tColor: ValueCell.create(colors),
tColorGrid: ValueCell.create(createNullTexture()),
tPalette: ValueCell.create({ array: new Uint8Array(3), width: 1, height: 1 }),
uColorTexDim: ValueCell.create(Vec2.create(colors.width, colors.height)),
uColorGridDim: ValueCell.create(Vec3.create(1, 1, 1)),
uColorGridTransform: ValueCell.create(Vec4.create(0, 0, 0, 1)),
dColorType: ValueCell.create(type),
dUsePalette: ValueCell.create(false),
};
}
}
/** Creates color texture with color for each instance */
function createInstanceColor(locationIt, color, colorData) {
var instanceCount = locationIt.instanceCount;
var colors = createTextureImage(Math.max(1, instanceCount), 3, Uint8Array, colorData && colorData.tColor.ref.value.array);
locationIt.reset();
while (locationIt.hasNext) {
var _a = locationIt.move(), location_1 = _a.location, isSecondary = _a.isSecondary, instanceIndex = _a.instanceIndex;
Color.toArray(color(location_1, isSecondary), colors.array, instanceIndex * 3);
locationIt.skipInstance();
}
return createTextureColor(colors, 'instance', colorData);
}
/** Creates color texture with color for each group (i.e. shared across instances) */
function createGroupColor(locationIt, color, colorData) {
var groupCount = locationIt.groupCount;
var colors = createTextureImage(Math.max(1, groupCount), 3, Uint8Array, colorData && colorData.tColor.ref.value.array);
locationIt.reset();
while (locationIt.hasNext && !locationIt.isNextNewInstance) {
var _a = locationIt.move(), location_2 = _a.location, isSecondary = _a.isSecondary, groupIndex = _a.groupIndex;
Color.toArray(color(location_2, isSecondary), colors.array, groupIndex * 3);
}
return createTextureColor(colors, 'group', colorData);
}
/** Creates color texture with color for each group in each instance */
function createGroupInstanceColor(locationIt, color, colorData) {
var groupCount = locationIt.groupCount, instanceCount = locationIt.instanceCount;
var count = instanceCount * groupCount;
var colors = createTextureImage(Math.max(1, count), 3, Uint8Array, colorData && colorData.tColor.ref.value.array);
locationIt.reset();
while (locationIt.hasNext) {
var _a = locationIt.move(), location_3 = _a.location, isSecondary = _a.isSecondary, index = _a.index;
Color.toArray(color(location_3, isSecondary), colors.array, index * 3);
}
return createTextureColor(colors, 'groupInstance', colorData);
}
/** Creates color texture with color for each vertex (i.e. shared across instances) */
function createVertexColor(locationIt, color, colorData) {
var groupCount = locationIt.groupCount, stride = locationIt.stride;
var colors = createTextureImage(Math.max(1, groupCount), 3, Uint8Array, colorData && colorData.tColor.ref.value.array);
locationIt.reset();
locationIt.voidInstances();
while (locationIt.hasNext && !locationIt.isNextNewInstance) {
var _a = locationIt.move(), location_4 = _a.location, isSecondary = _a.isSecondary, groupIndex = _a.groupIndex;
var c = color(location_4, isSecondary);
for (var i = 0; i < stride; ++i) {
Color.toArray(c, colors.array, (groupIndex + i) * 3);
}
}
return createTextureColor(colors, 'vertex', colorData);
}
/** Creates color texture with color for each vertex in each instance */
function createVertexInstanceColor(locationIt, color, colorData) {
var groupCount = locationIt.groupCount, instanceCount = locationIt.instanceCount, stride = locationIt.stride;
var count = instanceCount * groupCount;
var colors = createTextureImage(Math.max(1, count), 3, Uint8Array, colorData && colorData.tColor.ref.value.array);
locationIt.reset();
while (locationIt.hasNext) {
var _a = locationIt.move(), location_5 = _a.location, isSecondary = _a.isSecondary, index = _a.index;
var c = color(location_5, isSecondary);
for (var i = 0; i < stride; ++i) {
Color.toArray(c, colors.array, (index + i) * 3);
}
}
return createTextureColor(colors, 'vertexInstance', colorData);
}
export function createGridColor(grid, type, colorData) {
var colors = grid.colors, dimension = grid.dimension, transform = grid.transform;
var width = colors.getWidth();
var height = colors.getHeight();
if (colorData) {
ValueCell.update(colorData.tColorGrid, colors);
ValueCell.update(colorData.uColorTexDim, Vec2.create(width, height));
ValueCell.update(colorData.uColorGridDim, Vec3.clone(dimension));
ValueCell.update(colorData.uColorGridTransform, Vec4.clone(transform));
ValueCell.updateIfChanged(colorData.dColorType, type);
return colorData;
}
else {
return {
uColor: ValueCell.create(Vec3()),
tColor: ValueCell.create({ array: new Uint8Array(3), width: 1, height: 1 }),
tColorGrid: ValueCell.create(colors),
tPalette: ValueCell.create({ array: new Uint8Array(3), width: 1, height: 1 }),
uColorTexDim: ValueCell.create(Vec2.create(width, height)),
uColorGridDim: ValueCell.create(Vec3.clone(dimension)),
uColorGridTransform: ValueCell.create(Vec4.clone(transform)),
dColorType: ValueCell.create(type),
dUsePalette: ValueCell.create(false),
};
}
}
//# sourceMappingURL=color-data.js.map