substance-data.ts 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /**
  2. * Copyright (c) 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, Vec3, Vec4 } from '../../mol-math/linear-algebra';
  8. import { TextureImage, createTextureImage } from '../../mol-gl/renderable/util';
  9. import { createNullTexture, Texture } from '../../mol-gl/webgl/texture';
  10. import { Material } from '../../mol-util/material';
  11. export type SubstanceData = {
  12. tSubstance: ValueCell<TextureImage<Uint8Array>>
  13. uSubstanceTexDim: ValueCell<Vec2>
  14. dSubstance: ValueCell<boolean>,
  15. tSubstanceGrid: ValueCell<Texture>,
  16. uSubstanceGridDim: ValueCell<Vec3>,
  17. uSubstanceGridTransform: ValueCell<Vec4>,
  18. dSubstanceType: ValueCell<string>,
  19. }
  20. export function applySubstanceMaterial(array: Uint8Array, start: number, end: number, material: Material) {
  21. for (let i = start; i < end; ++i) {
  22. Material.toArray(material, array, i * 3);
  23. array[i * 3 + 2] = 255;
  24. }
  25. return true;
  26. }
  27. export function clearSubstance(array: Uint8Array, start: number, end: number) {
  28. array.fill(0, start * 3, end * 3);
  29. return true;
  30. }
  31. export function createSubstance(count: number, substanceData?: SubstanceData): SubstanceData {
  32. const substance = createTextureImage(Math.max(1, count), 4, Uint8Array, substanceData && substanceData.tSubstance.ref.value.array);
  33. if (substanceData) {
  34. ValueCell.update(substanceData.tSubstance, substance);
  35. ValueCell.update(substanceData.uSubstanceTexDim, Vec2.create(substance.width, substance.height));
  36. ValueCell.updateIfChanged(substanceData.dSubstance, count > 0);
  37. return substanceData;
  38. } else {
  39. return {
  40. tSubstance: ValueCell.create(substance),
  41. uSubstanceTexDim: ValueCell.create(Vec2.create(substance.width, substance.height)),
  42. dSubstance: ValueCell.create(count > 0),
  43. tSubstanceGrid: ValueCell.create(createNullTexture()),
  44. uSubstanceGridDim: ValueCell.create(Vec3.create(1, 1, 1)),
  45. uSubstanceGridTransform: ValueCell.create(Vec4.create(0, 0, 0, 1)),
  46. dSubstanceType: ValueCell.create('groupInstance'),
  47. };
  48. }
  49. }
  50. const emptySubstanceTexture = { array: new Uint8Array(4), width: 1, height: 1 };
  51. export function createEmptySubstance(substanceData?: SubstanceData): SubstanceData {
  52. if (substanceData) {
  53. ValueCell.update(substanceData.tSubstance, emptySubstanceTexture);
  54. ValueCell.update(substanceData.uSubstanceTexDim, Vec2.create(1, 1));
  55. return substanceData;
  56. } else {
  57. return {
  58. tSubstance: ValueCell.create(emptySubstanceTexture),
  59. uSubstanceTexDim: ValueCell.create(Vec2.create(1, 1)),
  60. dSubstance: ValueCell.create(false),
  61. tSubstanceGrid: ValueCell.create(createNullTexture()),
  62. uSubstanceGridDim: ValueCell.create(Vec3.create(1, 1, 1)),
  63. uSubstanceGridTransform: ValueCell.create(Vec4.create(0, 0, 0, 1)),
  64. dSubstanceType: ValueCell.create('groupInstance'),
  65. };
  66. }
  67. }