ソースを参照

iso value simplification

Alexander Rose 6 年 前
コミット
9d87ae427c

+ 1 - 1
src/apps/structure-info/volume.ts

@@ -38,7 +38,7 @@ function print(data: Volume) {
 }
 
 async function doMesh(data: Volume, filename: string) {
-    const mesh = await Task.create('', runtime => createVolumeIsosurface({ runtime }, data.volume, { isoValueAbsolute: VolumeIsoValue.calcAbsolute(data.volume.dataStats, 1.5) } )).run();
+    const mesh = await Task.create('', runtime => createVolumeIsosurface({ runtime }, data.volume, { isoValue: VolumeIsoValue.calcAbsolute(data.volume.dataStats, 1.5) } )).run();
     console.log({ vc: mesh.vertexCount, tc: mesh.triangleCount });
 
     // Export the mesh in OBJ format.

+ 3 - 4
src/mol-geo/geometry/direct-volume/direct-volume.ts

@@ -70,8 +70,7 @@ export namespace DirectVolume {
 
     export const Params = {
         ...Geometry.Params,
-        isoValueAbsolute: PD.Range('Iso Value Absolute', '', 0.22, -1, 1, 0.01),
-        isoValueRelative: PD.Range('Iso Value Relative', '', 2, -10, 10, 0.1),
+        isoValue: PD.Range('Iso Value', '', 0.22, -1, 1, 0.01),
         renderMode: PD.Select('Render Mode', '', 'isosurface', RenderModeOptions),
         controlPoints: PD.Text('Control Points', '', '0.19:0.1, 0.2:0.5, 0.21:0.1, 0.4:0.3'),
     }
@@ -109,7 +108,7 @@ export namespace DirectVolume {
             elements: ValueCell.create(VolumeBox.indices as Uint32Array),
             boundingSphere: ValueCell.create(boundingSphere),
 
-            uIsoValue: ValueCell.create(props.isoValueAbsolute),
+            uIsoValue: ValueCell.create(props.isoValue),
             uBboxMin: bboxMin,
             uBboxMax: bboxMax,
             uBboxSize: bboxSize,
@@ -136,7 +135,7 @@ export namespace DirectVolume {
             ValueCell.update(values.boundingSphere, boundingSphere)
         }
 
-        ValueCell.updateIfChanged(values.uIsoValue, props.isoValueAbsolute)
+        ValueCell.updateIfChanged(values.uIsoValue, props.isoValue)
         ValueCell.updateIfChanged(values.uAlpha, props.alpha)
         ValueCell.updateIfChanged(values.dUseFog, props.useFog)
         ValueCell.updateIfChanged(values.dRenderMode, props.renderMode)

+ 1 - 1
src/mol-repr/structure/visual/gaussian-density-volume.ts

@@ -45,7 +45,7 @@ export function GaussianDensityVolumeVisual(): UnitsVisual<GaussianDensityVolume
             if (newProps.radiusOffset !== currentProps.radiusOffset) state.createGeometry = true
             if (newProps.smoothness !== currentProps.smoothness) {
                 state.createGeometry = true
-                newProps.isoValueAbsolute = Math.exp(-newProps.smoothness)
+                newProps.isoValue = Math.exp(-newProps.smoothness)
             }
             if (newProps.useGpu !== currentProps.useGpu) state.createGeometry = true
             if (newProps.ignoreCache !== currentProps.ignoreCache) state.createGeometry = true

+ 4 - 5
src/mol-repr/volume/isosurface-mesh.ts

@@ -20,14 +20,14 @@ import { VisualContext } from 'mol-repr/representation';
 import { Theme, ThemeRegistryContext } from 'mol-theme/theme';
 
 interface VolumeIsosurfaceProps {
-    isoValueAbsolute: number
+    isoValue: number
 }
 
 export async function createVolumeIsosurface(ctx: VisualContext, volume: VolumeData, props: VolumeIsosurfaceProps, mesh?: Mesh) {
     ctx.runtime.update({ message: 'Marching cubes...' });
 
     const surface = await computeMarchingCubesMesh({
-        isoLevel: props.isoValueAbsolute,
+        isoLevel: props.isoValue,
         scalarField: volume.data
     }, mesh).runAsChild(ctx.runtime);
 
@@ -41,8 +41,7 @@ export async function createVolumeIsosurface(ctx: VisualContext, volume: VolumeD
 
 export const IsosurfaceParams = {
     ...Mesh.Params,
-    isoValueAbsolute: PD.Range('Iso Value Absolute', '', 0.22, -1, 1, 0.01),
-    isoValueRelative: PD.Range('Iso Value Relative', '', 2, -10, 10, 0.1),
+    isoValue: PD.Range('Iso Value', '', 0.22, -1, 1, 0.01),
 }
 export type IsosurfaceParams = typeof IsosurfaceParams
 export function getIsosurfaceParams(ctx: ThemeRegistryContext, volume: VolumeData) {
@@ -56,7 +55,7 @@ export function IsosurfaceVisual(): VolumeVisual<IsosurfaceParams> {
         getLoci: () => EmptyLoci,
         mark: () => false,
         setUpdateState: (state: VisualUpdateState, newProps: PD.Values<IsosurfaceParams>, currentProps: PD.Values<IsosurfaceParams>) => {
-            if (newProps.isoValueAbsolute !== currentProps.isoValueAbsolute) state.createGeometry = true
+            if (newProps.isoValue !== currentProps.isoValue) state.createGeometry = true
         },
         createRenderObject: async (ctx: VisualContext, geometry: Mesh, locationIt: LocationIterator, theme: Theme, props: PD.Values<IsosurfaceParams>) => {
             const transform = createIdentityTransform()

+ 2 - 13
src/mol-repr/volume/representation.ts

@@ -6,7 +6,7 @@
 
 import { Task } from 'mol-task'
 import { Representation, Visual, RepresentationContext, VisualContext, RepresentationProvider, RepresentationParamsGetter } from '../representation';
-import { VolumeData, VolumeIsoValue } from 'mol-model/volume';
+import { VolumeData } from 'mol-model/volume';
 import { Loci, EmptyLoci, isEveryLoci } from 'mol-model/loci';
 import { Geometry, updateRenderableState } from 'mol-geo/geometry/geometry';
 import { ParamDefinition as PD } from 'mol-util/param-definition';
@@ -52,11 +52,6 @@ export function VolumeVisual<P extends VolumeParams>(builder: VolumeVisualGeomet
 
     async function create(ctx: VisualContext, volume: VolumeData, theme: Theme, props: Partial<PD.Values<P>> = {}) {
         currentProps = Object.assign({}, defaultProps, props)
-        if (props.isoValueRelative) {
-            currentProps.isoValueAbsolute = VolumeIsoValue.calcAbsolute(currentVolume.dataStats, props.isoValueRelative)
-            // console.log('create props.isoValueRelative', props.isoValueRelative, currentProps.isoValueAbsolute, currentVolume.dataStats)
-        }
-
         geometry = await createGeometry(ctx, volume, currentProps, geometry)
         locationIt = LocationIterator(1, 1, () => NullLocation)
         renderObject = await createRenderObject(ctx, geometry, locationIt, theme, currentProps)
@@ -66,11 +61,6 @@ export function VolumeVisual<P extends VolumeParams>(builder: VolumeVisualGeomet
         if (!renderObject) return
         const newProps = Object.assign({}, currentProps, props)
 
-        if (props.isoValueRelative) {
-            newProps.isoValueAbsolute = VolumeIsoValue.calcAbsolute(currentVolume.dataStats, props.isoValueRelative)
-            // console.log('update props.isoValueRelative', props.isoValueRelative, newProps.isoValueAbsolute, currentVolume.dataStats)
-        }
-
         VisualUpdateState.reset(updateState)
         setUpdateState(updateState, newProps, currentProps)
 
@@ -145,8 +135,7 @@ export type VolumeRepresentationProvider<P extends VolumeParams> = Representatio
 
 export const VolumeParams = {
     ...Geometry.Params,
-    isoValueAbsolute: PD.Range('Iso Value Absolute', '', 0.22, -1, 1, 0.01),
-    isoValueRelative: PD.Range('Iso Value Relative', '', 2, -10, 10, 0.1),
+    isoValue: PD.Range('Iso Value', '', 0.22, -1, 1, 0.01),
 }
 export type VolumeParams = typeof VolumeParams