Skip to content
Snippets Groups Projects
Select Git revision
  • cd3798b46f32ff993b910ee5974aca18e40b5a5e
  • master default protected
  • rednatco-v2
  • rednatco
  • test
  • ntc-tube-uniform-color
  • ntc-tube-missing-atoms
  • restore-vertex-array-per-program
  • watlas2
  • dnatco_new
  • cleanup-old-nodejs
  • webmmb
  • fix_auth_seq_id
  • update_deps
  • ext_dev
  • ntc_balls
  • nci-2
  • plugin
  • bugfix-0.4.5
  • nci
  • servers
  • v0.5.0-dev.1
  • v0.4.5
  • v0.4.4
  • v0.4.3
  • v0.4.2
  • v0.4.1
  • v0.4.0
  • v0.3.12
  • v0.3.11
  • v0.3.10
  • v0.3.9
  • v0.3.8
  • v0.3.7
  • v0.3.6
  • v0.3.5
  • v0.3.4
  • v0.3.3
  • v0.3.2
  • v0.3.1
  • v0.3.0
41 results

indexTemplate.ts

Blame
  • gaussian-surface-wireframe.ts 3.35 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 { 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 { computeMarchingCubesLines } from '../../../mol-geo/util/marching-cubes/algorithm';
    import { UnitsLinesParams, UnitsVisual, UnitsLinesVisual } from '../units-visual';
    import { ElementIterator, getElementLoci, eachElement } from './util/element';
    import { VisualUpdateState } from '../../util';
    import { Sphere3D } from '../../../mol-math/geometry';
    
    async function createGaussianWireframe(ctx: VisualContext, unit: Unit, structure: Structure, theme: Theme, props: GaussianDensityProps, lines?: Lines): Promise<Lines> {
        const { smoothness } = props;
        const { transform, field, idField, maxRadius } = await computeUnitGaussianDensity(structure, unit, theme.size, props).runInContext(ctx.runtime);
    
        const params = {
            isoLevel: Math.exp(-smoothness),
            scalarField: field,
            idField
        };
        const wireframe = await computeMarchingCubesLines(params, lines).runAsChild(ctx.runtime);
    
        Lines.transform(wireframe, transform);
    
        const sphere = Sphere3D.expand(Sphere3D(), unit.boundary.sphere, maxRadius);
        wireframe.setBoundingSphere(sphere);
    
        return wireframe;
    }
    
    export const GaussianWireframeParams = {
        ...UnitsLinesParams,
        ...GaussianDensityParams,
        sizeFactor: PD.Numeric(3, { min: 0, max: 10, step: 0.1 }),
        lineSizeAttenuation: PD.Boolean(false),
        ignoreHydrogens: PD.Boolean(false),
        ignoreHydrogensVariant: PD.Select('all', PD.arrayToOptions(['all', 'non-polar'] as const)),
        includeParent: PD.Boolean(false, { isHidden: true }),
    };
    export type GaussianWireframeParams = typeof GaussianWireframeParams
    
    export function GaussianWireframeVisual(materialId: number): UnitsVisual<GaussianWireframeParams> {
        return UnitsLinesVisual<GaussianWireframeParams>({
            defaultProps: PD.getDefaultValues(GaussianWireframeParams),
            createGeometry: createGaussianWireframe,
            createLocationIterator: ElementIterator.fromGroup,
            getLoci: getElementLoci,
            eachLocation: eachElement,
            setUpdateState: (state: VisualUpdateState, newProps: PD.Values<GaussianWireframeParams>, currentProps: PD.Values<GaussianWireframeParams>) => {
                if (newProps.resolution !== currentProps.resolution) state.createGeometry = true;
                if (newProps.radiusOffset !== currentProps.radiusOffset) state.createGeometry = true;
                if (newProps.smoothness !== currentProps.smoothness) state.createGeometry = true;
                if (newProps.ignoreHydrogens !== currentProps.ignoreHydrogens) state.createGeometry = true;
                if (newProps.ignoreHydrogensVariant !== currentProps.ignoreHydrogensVariant) state.createGeometry = true;
                if (newProps.traceOnly !== currentProps.traceOnly) state.createGeometry = true;
                if (newProps.includeParent !== currentProps.includeParent) state.createGeometry = true;
            }
        }, materialId);
    }