UNPKG

molstar

Version:

A comprehensive macromolecular library.

206 lines 10.3 kB
/** * 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