gaussian-density.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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 { Box3D, DensityData, DensityTextureData } from '../geometry';
  7. import { PositionData } from './common';
  8. import { WebGLContext } from '../../mol-gl/webgl/context';
  9. import { Texture } from '../../mol-gl/webgl/texture';
  10. import { GaussianDensityTexture2d, GaussianDensityTexture3d } from './gaussian-density/gpu';
  11. import { Task } from '../../mol-task/task';
  12. import { GaussianDensityCPU } from './gaussian-density/cpu';
  13. export const DefaultGaussianDensityProps = {
  14. resolution: 1,
  15. radiusOffset: 0,
  16. smoothness: 1.5,
  17. };
  18. export type GaussianDensityProps = typeof DefaultGaussianDensityProps
  19. export type GaussianDensityData = {
  20. radiusFactor: number
  21. } & DensityData
  22. export type GaussianDensityTextureData = {
  23. radiusFactor: number
  24. } & DensityTextureData
  25. export function computeGaussianDensity(position: PositionData, box: Box3D, radius: (index: number) => number, props: GaussianDensityProps) {
  26. return Task.create('Gaussian Density', async ctx => {
  27. return await GaussianDensityCPU(ctx, position, box, radius, props);
  28. });
  29. }
  30. export function computeGaussianDensityTexture(position: PositionData, box: Box3D, radius: (index: number) => number, props: GaussianDensityProps, webgl: WebGLContext, texture?: Texture) {
  31. return _computeGaussianDensityTexture(webgl.isWebGL2 ? '3d' : '2d', position, box, radius, props, webgl, texture);
  32. }
  33. export function computeGaussianDensityTexture2d(position: PositionData, box: Box3D, radius: (index: number) => number, props: GaussianDensityProps, webgl: WebGLContext, texture?: Texture) {
  34. return _computeGaussianDensityTexture('2d', position, box, radius, props, webgl, texture);
  35. }
  36. export function computeGaussianDensityTexture3d(position: PositionData, box: Box3D, radius: (index: number) => number, props: GaussianDensityProps, webgl: WebGLContext, texture?: Texture) {
  37. return _computeGaussianDensityTexture('2d', position, box, radius, props, webgl, texture);
  38. }
  39. function _computeGaussianDensityTexture(type: '2d' | '3d', position: PositionData, box: Box3D, radius: (index: number) => number, props: GaussianDensityProps, webgl: WebGLContext, texture?: Texture) {
  40. return Task.create('Gaussian Density', async ctx => {
  41. return type === '2d' ?
  42. GaussianDensityTexture2d(webgl, position, box, radius, false, props, texture) :
  43. GaussianDensityTexture3d(webgl, position, box, radius, props, texture);
  44. });
  45. }