Browse Source

gaussian surface getUnitExtraRadius

David Sehnal 4 years ago
parent
commit
ed69d15ee1

+ 6 - 8
src/extensions/g3d/model.ts

@@ -5,24 +5,22 @@
  */
 
 import { Column, Table } from '../../mol-data/db';
+import { OrderedSet } from '../../mol-data/int';
+import { Vec3 } from '../../mol-math/linear-algebra';
 import { createModels } from '../../mol-model-formats/structure/basic/parser';
 import { BasicSchema, createBasic } from '../../mol-model-formats/structure/basic/schema';
 import { EntityBuilder } from '../../mol-model-formats/structure/common/entity';
-import { CustomModelProperty } from '../../mol-model-props/common/custom-model-property';
+import { Loci } from '../../mol-model/loci';
 import { Model, Trajectory, Unit } from '../../mol-model/structure';
 import { MoleculeType } from '../../mol-model/structure/model/types';
+import { LociLabelProvider } from '../../mol-plugin-state/manager/loci-label';
+import { MolScriptBuilder as MS } from '../../mol-script/language/builder';
 import { CustomPropSymbol } from '../../mol-script/language/symbol';
 import Type from '../../mol-script/language/type';
 import { QuerySymbolRuntime } from '../../mol-script/runtime/query/base';
-import { Task, RuntimeContext } from '../../mol-task';
+import { RuntimeContext, Task } from '../../mol-task';
 import { objectForEach } from '../../mol-util/object';
-import { ParamDefinition } from '../../mol-util/param-definition';
-import { MolScriptBuilder as MS } from '../../mol-script/language/builder';
 import { G3dDataBlock } from './data';
-import { Loci } from '../../mol-model/loci';
-import { LociLabelProvider } from '../../mol-plugin-state/manager/loci-label';
-import { OrderedSet } from '../../mol-data/int';
-import { Vec3 } from '../../mol-math/linear-algebra';
 
 interface NormalizedData {
     entity_id: string[],

+ 2 - 4
src/mol-repr/structure/visual/gaussian-surface-mesh.ts

@@ -6,7 +6,7 @@
 
 import { ParamDefinition as PD } from '../../../mol-util/param-definition';
 import { UnitsMeshParams, UnitsTextureMeshParams, UnitsVisual, UnitsMeshVisual, UnitsTextureMeshVisual } from '../units-visual';
-import { GaussianDensityParams, computeUnitGaussianDensity, GaussianDensityTextureProps, computeUnitGaussianDensityTexture2d, GaussianDensityProps, computeStructureGaussianDensity } from './util/gaussian';
+import { GaussianDensityParams, computeUnitGaussianDensity, GaussianDensityTextureProps, computeUnitGaussianDensityTexture2d, GaussianDensityProps, computeStructureGaussianDensity, getUnitExtraRadius } from './util/gaussian';
 import { WebGLContext } from '../../../mol-gl/webgl/context';
 import { VisualContext } from '../../visual';
 import { Unit, Structure } from '../../../mol-model/structure';
@@ -49,9 +49,7 @@ async function createGaussianSurfaceMesh(ctx: VisualContext, unit: Unit, structu
     Mesh.transform(surface, transform);
     if (ctx.webgl && !ctx.webgl.isWebGL2) Mesh.uniformTriangleGroup(surface);
 
-    // Add 3 to the offset so that the surface boundary doesn't get cut off by clipping plane
-    // TODO: is 3 too low/high?
-    const sphere = Sphere3D.expand(Sphere3D(), unit.boundary.sphere, props.radiusOffset + 3);
+    const sphere = Sphere3D.expand(Sphere3D(), unit.boundary.sphere, props.radiusOffset + getUnitExtraRadius(unit));
     surface.setBoundingSphere(sphere);
 
     return surface;

+ 2 - 4
src/mol-repr/structure/visual/gaussian-surface-wireframe.ts

@@ -9,7 +9,7 @@ import { VisualContext } from '../../visual';
 import { Unit, Structure } from '../../../mol-model/structure';
 import { Theme } from '../../../mol-theme/theme';
 import { Lines } from '../../../mol-geo/geometry/lines/lines';
-import { computeUnitGaussianDensity, GaussianDensityParams, GaussianDensityProps } from './util/gaussian';
+import { computeUnitGaussianDensity, GaussianDensityParams, GaussianDensityProps, getUnitExtraRadius } from './util/gaussian';
 import { computeMarchingCubesLines } from '../../../mol-geo/util/marching-cubes/algorithm';
 import { UnitsLinesParams, UnitsVisual, UnitsLinesVisual } from '../units-visual';
 import { ElementIterator, getElementLoci, eachElement } from './util/element';
@@ -29,9 +29,7 @@ async function createGaussianWireframe(ctx: VisualContext, unit: Unit, structure
 
     Lines.transform(wireframe, transform);
 
-    // Add 3 to the offset so that the surface boundary doesn't get cut off by clipping plane
-    // TODO: is 3 too low/high?
-    const sphere = Sphere3D.expand(Sphere3D(), unit.boundary.sphere, props.radiusOffset + 3);
+    const sphere = Sphere3D.expand(Sphere3D(), unit.boundary.sphere, props.radiusOffset + getUnitExtraRadius(unit));
     wireframe.setBoundingSphere(sphere);
 
     return wireframe;

+ 13 - 0
src/mol-repr/structure/visual/util/gaussian.ts

@@ -81,4 +81,17 @@ export function computeStructureGaussianDensityTexture(structure: Structure, pro
     return Task.create('Gaussian Density', async ctx => {
         return GaussianDensityTexture(webgl, position, box, radius, p, texture);
     });
+}
+
+export function getUnitExtraRadius(unit: Unit) {
+    if (Unit.isAtomic(unit)) return 4;
+
+    let max = 0;
+    const { elements } = unit;
+    const { r } = unit.conformation;
+    for (let i = 0, _i = elements.length; i < _i; i++) {
+        const _r = r(elements[i]);
+        if (_r > max) max = _r;
+    }
+    return max + 1;
 }