molstar
Version:
A comprehensive macromolecular library.
99 lines • 4.41 kB
JavaScript
/**
* 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
;