UNPKG

molstar

Version:

A comprehensive macromolecular library.

99 lines 4.41 kB
"use strict"; /** * Copyright (c) 2018-2021 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.createEmptyMarkers = exports.createMarkers = exports.getMarkersAverage = void 0; var value_cell_1 = require("../../mol-util/value-cell"); var linear_algebra_1 = require("../../mol-math/linear-algebra"); var util_1 = require("../../mol-gl/renderable/util"); var MarkerCountLut = new Uint8Array(0x0303 + 1); MarkerCountLut[0x0001] = 1; MarkerCountLut[0x0002] = 1; MarkerCountLut[0x0003] = 1; MarkerCountLut[0x0100] = 1; MarkerCountLut[0x0200] = 1; MarkerCountLut[0x0300] = 1; MarkerCountLut[0x0101] = 2; MarkerCountLut[0x0201] = 2; MarkerCountLut[0x0301] = 2; MarkerCountLut[0x0102] = 2; MarkerCountLut[0x0202] = 2; MarkerCountLut[0x0302] = 2; MarkerCountLut[0x0103] = 2; MarkerCountLut[0x0203] = 2; MarkerCountLut[0x0303] = 2; /** * Calculates the average number of entries that have any marker flag set. * * For alternative implementations and performance tests see * `src\perf-tests\markers-average.ts`. */ function getMarkersAverage(array, count) { if (count === 0) return 0; var view = new Uint32Array(array.buffer, 0, array.buffer.byteLength >> 2); var viewEnd = (count - 4) >> 2; var backStart = 4 * viewEnd; var sum = 0; for (var i = 0; i < viewEnd; ++i) { var v = view[i]; sum += MarkerCountLut[v & 0xFFFF] + MarkerCountLut[v >> 16]; } for (var i = backStart; i < count; ++i) { sum += array[i] && 1; } return sum / count; } exports.getMarkersAverage = getMarkersAverage; function createMarkers(count, markerData) { var markers = (0, util_1.createTextureImage)(Math.max(1, count), 1, Uint8Array, markerData && markerData.tMarker.ref.value.array); var average = getMarkersAverage(markers.array, count); var status = average === 0 ? 0 : -1; if (markerData) { value_cell_1.ValueCell.updateIfChanged(markerData.uMarker, 0); value_cell_1.ValueCell.update(markerData.tMarker, markers); value_cell_1.ValueCell.update(markerData.uMarkerTexDim, linear_algebra_1.Vec2.create(markers.width, markers.height)); value_cell_1.ValueCell.updateIfChanged(markerData.dMarkerType, status === -1 ? 'groupInstance' : 'uniform'); value_cell_1.ValueCell.updateIfChanged(markerData.markerAverage, average); value_cell_1.ValueCell.updateIfChanged(markerData.markerStatus, status); return markerData; } else { return { uMarker: value_cell_1.ValueCell.create(0), tMarker: value_cell_1.ValueCell.create(markers), uMarkerTexDim: value_cell_1.ValueCell.create(linear_algebra_1.Vec2.create(markers.width, markers.height)), markerAverage: value_cell_1.ValueCell.create(average), markerStatus: value_cell_1.ValueCell.create(status), dMarkerType: value_cell_1.ValueCell.create('uniform'), }; } } exports.createMarkers = createMarkers; var emptyMarkerTexture = { array: new Uint8Array(1), width: 1, height: 1 }; function createEmptyMarkers(markerData) { if (markerData) { value_cell_1.ValueCell.updateIfChanged(markerData.uMarker, 0); value_cell_1.ValueCell.update(markerData.tMarker, emptyMarkerTexture); value_cell_1.ValueCell.update(markerData.uMarkerTexDim, linear_algebra_1.Vec2.create(1, 1)); value_cell_1.ValueCell.updateIfChanged(markerData.dMarkerType, 'uniform'); value_cell_1.ValueCell.updateIfChanged(markerData.markerAverage, 0); value_cell_1.ValueCell.updateIfChanged(markerData.markerStatus, 0); return markerData; } else { return { uMarker: value_cell_1.ValueCell.create(0), tMarker: value_cell_1.ValueCell.create(emptyMarkerTexture), uMarkerTexDim: value_cell_1.ValueCell.create(linear_algebra_1.Vec2.create(1, 1)), markerAverage: value_cell_1.ValueCell.create(0), markerStatus: value_cell_1.ValueCell.create(0), dMarkerType: value_cell_1.ValueCell.create('uniform'), }; } } exports.createEmptyMarkers = createEmptyMarkers; //# sourceMappingURL=marker-data.js.map