message: improved finding of closest element for vertices
diff: * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
  -import { Unit, Structure } from 'mol-model/structure';
  +import { Unit, Structure, StructureElement, ElementIndex } from 'mol-model/structure';
  import { UnitsVisual, VisualUpdateState } from '..';
  import { RuntimeContext } from 'mol-task'
  import { Mesh } from '../../../geometry/mesh/mesh';
  @@ -13,9 +13,11 @@ import { StructureElementIterator, getElementLoci, markElement } from './util/el
  import { computeMarchingCubesMesh } from '../../../util/marching-cubes/algorithm';
  import { GaussianDensityProps, GaussianDensityParams } from 'mol-model/structure/structure/unit/gaussian-density';
  import { paramDefaultValues } from 'mol-view/parameter';
  +import { SizeTheme } from 'mol-view/theme/size';
  +import { OrderedSet } from 'mol-data/int';
  async function createGaussianSurfaceMesh(ctx: RuntimeContext, unit: Unit, structure: Structure, props: GaussianDensityProps, mesh?: Mesh): Promise<Mesh> {
  - const { smoothness } = props
  + const { smoothness, radiusOffset } = props
  const { transform, field, idField } = await unit.computeGaussianDensity(props, ctx)
  const params = {
  @@ -28,16 +30,30 @@ async function createGaussianSurfaceMesh(ctx: RuntimeContext, unit: Unit, struct
  Mesh.transformImmediate(surface, transform)
  if (props.useGpu) {
  - console.time('find closest atom for vertices')
  + console.time('find max element radius')
  + const { elements } = unit
  + const n = OrderedSet.size(elements)
  + const l = StructureElement.create(unit)
  + const sizeTheme = SizeTheme({ name: 'physical' })
  + const radius = (index: number) => {
  + l.element = index as ElementIndex
  + return sizeTheme.size(l)
  + }
  + let maxRadius = 0
  + for (let i = 0; i < n; ++i) {
  + const r = radius(OrderedSet.getAt(elements, i)) + radiusOffset
  + if (maxRadius < r) maxRadius = r
  + }
  + console.timeEnd('find max element radius')
  +
  + console.time('find closest element for vertices')
  const { lookup3d } = unit
  - const maxRadius = 2
  - const maxRadiusSq = maxRadius * maxRadius
  const { vertexCount, vertexBuffer, groupBuffer } = surface
  const vertices = vertexBuffer.ref.value
  const groups = groupBuffer.ref.value
  for (let i = 0; i < vertexCount; ++i) {
  - const r = lookup3d.find(vertices[i * 3], vertices[i * 3 + 1], vertices[i * 3 + 2], maxRadiusSq)
  + const r = lookup3d.find(vertices[i * 3], vertices[i * 3 + 1], vertices[i * 3 + 2], maxRadius * 2)
  let minDsq = Infinity
  let group = 0
  for (let j = 0, jl = r.count; j < jl; ++j) {
  @@ -49,7 +65,7 @@ async function createGaussianSurfaceMesh(ctx: RuntimeContext, unit: Unit, struct
  }
  groups[i] = group
  }
  - console.timeEnd('find closest atom for vertices')
  + console.timeEnd('find closest element for vertices')
  }
  Mesh.computeNormalsImmediate(surface)
  