marker-data.ts 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /**
  2. * Copyright (c) 2018 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. tMarker: ValueCell<TextureImage>
  11. uMarkerTexDim: ValueCell<Vec2>
  12. }
  13. export enum MarkerAction {
  14. Highlight,
  15. RemoveHighlight,
  16. Select,
  17. Deselect,
  18. Clear
  19. }
  20. export function applyMarkerAction(array: Uint8Array, start: number, end: number, action: MarkerAction) {
  21. let changed = false
  22. for (let i = start; i < end; ++i) {
  23. let v = array[i]
  24. switch (action) {
  25. case MarkerAction.Highlight:
  26. if (v % 2 === 0) {
  27. v += 1
  28. }
  29. break
  30. case MarkerAction.RemoveHighlight:
  31. if (v % 2 !== 0) {
  32. v -= 1
  33. }
  34. break
  35. case MarkerAction.Select:
  36. v += 2
  37. break
  38. case MarkerAction.Deselect:
  39. if (v >= 2) {
  40. v -= 2
  41. }
  42. break
  43. case MarkerAction.Clear:
  44. v = 0
  45. break
  46. }
  47. changed = array[i] !== v || changed
  48. array[i] = v
  49. }
  50. return changed
  51. }
  52. export function createMarkers(count: number, markerData?: MarkerData): MarkerData {
  53. const markers = markerData && markerData.tMarker.ref.value.array.length >= count
  54. ? markerData.tMarker.ref.value
  55. : createTextureImage(count, 1)
  56. if (markerData) {
  57. ValueCell.update(markerData.tMarker, markers)
  58. ValueCell.update(markerData.uMarkerTexDim, Vec2.create(markers.width, markers.height))
  59. return markerData
  60. } else {
  61. return {
  62. tMarker: ValueCell.create(markers),
  63. uMarkerTexDim: ValueCell.create(Vec2.create(markers.width, markers.height)),
  64. }
  65. }
  66. }
  67. const emptyMarkerTexture = { array: new Uint8Array(1), width: 1, height: 1 }
  68. export function createEmptyMarkers(markerData?: MarkerData): MarkerData {
  69. if (markerData) {
  70. ValueCell.update(markerData.tMarker, emptyMarkerTexture)
  71. ValueCell.update(markerData.uMarkerTexDim, Vec2.create(1, 1))
  72. return markerData
  73. } else {
  74. return {
  75. tMarker: ValueCell.create(emptyMarkerTexture),
  76. uMarkerTexDim: ValueCell.create(Vec2.create(1, 1)),
  77. }
  78. }
  79. }