Skip to content
Snippets Groups Projects
Select Git revision
21 results Searching

util.c

  • gaussian-surface-mesh.ts 22.40 KiB
    /**
     * Copyright (c) 2018-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
     *
     * @author Alexander Rose <alexander.rose@weirdbyte.de>
     */
    
    import { ParamDefinition as PD } from '../../../mol-util/param-definition';
    import { UnitsMeshParams, UnitsTextureMeshParams, UnitsVisual, UnitsMeshVisual, UnitsTextureMeshVisual } from '../units-visual';
    import { GaussianDensityParams, computeUnitGaussianDensity, computeUnitGaussianDensityTexture2d, GaussianDensityProps, computeStructureGaussianDensity, computeStructureGaussianDensityTexture2d } from './util/gaussian';
    import { VisualContext } from '../../visual';
    import { Unit, Structure } from '../../../mol-model/structure';
    import { Theme } from '../../../mol-theme/theme';
    import { Mesh } from '../../../mol-geo/geometry/mesh/mesh';
    import { computeMarchingCubesMesh } from '../../../mol-geo/util/marching-cubes/algorithm';
    import { ElementIterator, getElementLoci, eachElement, getSerialElementLoci, eachSerialElement } from './util/element';
    import { VisualUpdateState } from '../../util';
    import { TextureMesh } from '../../../mol-geo/geometry/texture-mesh/texture-mesh';
    import { extractIsosurface } from '../../../mol-gl/compute/marching-cubes/isosurface';
    import { Sphere3D } from '../../../mol-math/geometry';
    import { ComplexVisual, ComplexMeshParams, ComplexMeshVisual, ComplexTextureMeshVisual, ComplexTextureMeshParams } from '../complex-visual';
    import { getVolumeSliceInfo, StructureGroup } from './util/common';
    import { WebGLContext } from '../../../mol-gl/webgl/context';
    import { MeshValues } from '../../../mol-gl/renderable/mesh';
    import { TextureMeshValues } from '../../../mol-gl/renderable/texture-mesh';
    import { Texture } from '../../../mol-gl/webgl/texture';
    import { applyMeshColorSmoothing } from '../../../mol-geo/geometry/mesh/color-smoothing';
    import { applyTextureMeshColorSmoothing } from '../../../mol-geo/geometry/texture-mesh/color-smoothing';
    import { ColorSmoothingParams, getColorSmoothingProps } from '../../../mol-geo/geometry/base';
    import { Vec3 } from '../../../mol-math/linear-algebra';
    import { isTimingMode } from '../../../mol-util/debug';
    import { ValueCell } from '../../../mol-util/value-cell';
    
    const SharedParams = {
        ...GaussianDensityParams,
        ...ColorSmoothingParams,
        ignoreHydrogens: PD.Boolean(false),
        ignoreHydrogensVariant: PD.Select('all', PD.arrayToOptions(['all', 'non-polar'] as const)),
        tryUseGpu: PD.Boolean(true),
        includeParent: PD.Boolean(false, { isHidden: true }),
    };
    type SharedParams = typeof SharedParams
    
    export const GaussianSurfaceMeshParams = {
        ...UnitsMeshParams,
        ...UnitsTextureMeshParams,
        ...SharedParams,
    };
    export type GaussianSurfaceMeshParams = typeof GaussianSurfaceMeshParams
    
    export const StructureGaussianSurfaceMeshParams = {
        ...ComplexMeshParams,
        ...ComplexTextureMeshParams,
        ...SharedParams,
    };
    export type StructureGaussianSurfaceMeshParams = typeof StructureGaussianSurfaceMeshParams
    
    function gpuSupport(webgl: WebGLContext) {
        return webgl.extensions.colorBufferFloat && webgl.extensions.textureFloat && webgl.extensions.blendMinMax && webgl.extensions.drawBuffers;
    }
    
    function suitableForGpu(structure: Structure, props: PD.Values<SharedParams>, webgl: WebGLContext) {
        // lower resolutions are about as fast on CPU vs integrated GPU,
        // very low resolutions have artifacts when calculated on GPU
        if (props.resolution > 1) return false;
        // the GPU is much more memory contraint, especially true for integrated GPUs,
        // being conservative here still allows for small and medium sized assemblies
        const d = webgl.maxTextureSize / 3;
        const { areaCells, maxAreaCells } = getVolumeSliceInfo(structure.boundary.box, props.resolution, d * d);
        return areaCells < maxAreaCells;
    }