marker-data.ts 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /**
  2. * Copyright (c) 2018-2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { ValueCell } from '../../mol-util/value-cell';
  7. import { Vec2 } from '../../mol-math/linear-algebra';
  8. import { TextureImage, createTextureImage } from '../../mol-gl/renderable/util';
  9. export type MarkerData = {
  10. uMarker: ValueCell<number>,
  11. tMarker: ValueCell<TextureImage<Uint8Array>>
  12. uMarkerTexDim: ValueCell<Vec2>
  13. dMarkerType: ValueCell<string>,
  14. markerAverage: ValueCell<number>
  15. markerStatus: ValueCell<number>
  16. }
  17. export function getMarkersAverage(array: Uint8Array, count: number): number {
  18. if (count === 0) return 0;
  19. let sum = 0;
  20. for (let i = 0; i < count; ++i) {
  21. sum += array[i] && 1;
  22. }
  23. return sum / count;
  24. }
  25. export function createMarkers(count: number, markerData?: MarkerData): MarkerData {
  26. const markers = createTextureImage(Math.max(1, count), 1, Uint8Array, markerData && markerData.tMarker.ref.value.array);
  27. const average = getMarkersAverage(markers.array, count);
  28. const status = average === 0 ? 0 : -1;
  29. if (markerData) {
  30. ValueCell.updateIfChanged(markerData.uMarker, 0);
  31. ValueCell.update(markerData.tMarker, markers);
  32. ValueCell.update(markerData.uMarkerTexDim, Vec2.create(markers.width, markers.height));
  33. ValueCell.updateIfChanged(markerData.dMarkerType, status === -1 ? 'groupInstance' : 'uniform');
  34. ValueCell.updateIfChanged(markerData.markerAverage, average);
  35. ValueCell.updateIfChanged(markerData.markerStatus, status);
  36. return markerData;
  37. } else {
  38. return {
  39. uMarker: ValueCell.create(0),
  40. tMarker: ValueCell.create(markers),
  41. uMarkerTexDim: ValueCell.create(Vec2.create(markers.width, markers.height)),
  42. markerAverage: ValueCell.create(average),
  43. markerStatus: ValueCell.create(status),
  44. dMarkerType: ValueCell.create('uniform'),
  45. };
  46. }
  47. }
  48. const emptyMarkerTexture = { array: new Uint8Array(1), width: 1, height: 1 };
  49. export function createEmptyMarkers(markerData?: MarkerData): MarkerData {
  50. if (markerData) {
  51. ValueCell.updateIfChanged(markerData.uMarker, 0);
  52. ValueCell.update(markerData.tMarker, emptyMarkerTexture);
  53. ValueCell.update(markerData.uMarkerTexDim, Vec2.create(1, 1));
  54. ValueCell.updateIfChanged(markerData.dMarkerType, 'uniform');
  55. ValueCell.updateIfChanged(markerData.markerAverage, 0);
  56. ValueCell.updateIfChanged(markerData.markerStatus, 0);
  57. return markerData;
  58. } else {
  59. return {
  60. uMarker: ValueCell.create(0),
  61. tMarker: ValueCell.create(emptyMarkerTexture),
  62. uMarkerTexDim: ValueCell.create(Vec2.create(1, 1)),
  63. markerAverage: ValueCell.create(0),
  64. markerStatus: ValueCell.create(0),
  65. dMarkerType: ValueCell.create('uniform'),
  66. };
  67. }
  68. }