Skip to content
Snippets Groups Projects
Commit d82635b2 authored by Alexander Rose's avatar Alexander Rose
Browse files

add support for marking direct volume isosurfaces

parent 15ebfd61
No related branches found
No related tags found
No related merge requests found
...@@ -9,7 +9,7 @@ import { GaussianSurfaceVisual, GaussianSurfaceParams } from '../visual/gaussian ...@@ -9,7 +9,7 @@ import { GaussianSurfaceVisual, GaussianSurfaceParams } from '../visual/gaussian
import { StructureRepresentation } from '../units-representation'; import { StructureRepresentation } from '../units-representation';
import { Structure } from 'mol-model/structure'; import { Structure } from 'mol-model/structure';
import { MarkerAction } from '../../../geometry/marker-data'; import { MarkerAction } from '../../../geometry/marker-data';
import { Loci } from 'mol-model/loci'; import { Loci, isEmptyLoci } from 'mol-model/loci';
import { PickingId } from '../../../geometry/picking'; import { PickingId } from '../../../geometry/picking';
import { Task } from 'mol-task'; import { Task } from 'mol-task';
import { GaussianWireframeVisual, GaussianWireframeParams } from '../visual/gaussian-surface-wireframe'; import { GaussianWireframeVisual, GaussianWireframeParams } from '../visual/gaussian-surface-wireframe';
...@@ -63,10 +63,24 @@ export function MolecularSurfaceRepresentation(): MolecularSurfaceRepresentation ...@@ -63,10 +63,24 @@ export function MolecularSurfaceRepresentation(): MolecularSurfaceRepresentation
}) })
}, },
getLoci: (pickingId: PickingId) => { getLoci: (pickingId: PickingId) => {
return gaussianSurfaceRepr.getLoci(pickingId) const surfaceLoci = gaussianSurfaceRepr.getLoci(pickingId)
const wireframeLoci = gaussianWireframeRepr.getLoci(pickingId)
const volumeLoci = gaussianVolumeRepr.getLoci(pickingId)
if (isEmptyLoci(surfaceLoci)) {
if (isEmptyLoci(wireframeLoci)) {
return volumeLoci
} else {
return wireframeLoci
}
} else {
return surfaceLoci
}
}, },
mark: (loci: Loci, action: MarkerAction) => { mark: (loci: Loci, action: MarkerAction) => {
return gaussianSurfaceRepr.mark(loci, action) const markSurfaceElement = gaussianSurfaceRepr.mark(loci, action)
const markWireframeElement = gaussianWireframeRepr.mark(loci, action)
const markVolumeElement = gaussianVolumeRepr.mark(loci, action)
return markSurfaceElement || markWireframeElement || markVolumeElement
}, },
destroy() { destroy() {
gaussianSurfaceRepr.destroy() gaussianSurfaceRepr.destroy()
......
...@@ -529,7 +529,7 @@ export type UnitsDirectVolumeProps = typeof DefaultUnitsDirectVolumeProps ...@@ -529,7 +529,7 @@ export type UnitsDirectVolumeProps = typeof DefaultUnitsDirectVolumeProps
export interface UnitsDirectVolumeVisualBuilder<P extends UnitsDirectVolumeProps> extends UnitsVisualBuilder<P, DirectVolume2d | DirectVolume3d> { } export interface UnitsDirectVolumeVisualBuilder<P extends UnitsDirectVolumeProps> extends UnitsVisualBuilder<P, DirectVolume2d | DirectVolume3d> { }
export function UnitsDirectVolumeVisual<P extends UnitsDirectVolumeProps>(builder: UnitsDirectVolumeVisualBuilder<P>): UnitsVisual<P> { export function UnitsDirectVolumeVisual<P extends UnitsDirectVolumeProps>(builder: UnitsDirectVolumeVisualBuilder<P>): UnitsVisual<P> {
const { defaultProps, createGeometry, createLocationIterator, getLoci, setUpdateState } = builder const { defaultProps, createGeometry, createLocationIterator, getLoci, mark, setUpdateState } = builder
const updateState = VisualUpdateState.create() const updateState = VisualUpdateState.create()
let renderObject: DirectVolume2dRenderObject | DirectVolume3dRenderObject | undefined let renderObject: DirectVolume2dRenderObject | DirectVolume3dRenderObject | undefined
...@@ -644,8 +644,26 @@ export function UnitsDirectVolumeVisual<P extends UnitsDirectVolumeProps>(builde ...@@ -644,8 +644,26 @@ export function UnitsDirectVolumeVisual<P extends UnitsDirectVolumeProps>(builde
return renderObject ? getLoci(pickingId, currentGroup, renderObject.id) : EmptyLoci return renderObject ? getLoci(pickingId, currentGroup, renderObject.id) : EmptyLoci
}, },
mark(loci: Loci, action: MarkerAction) { mark(loci: Loci, action: MarkerAction) {
// TODO if (!renderObject) return false
return false const { tMarker } = renderObject.values
const { groupCount, instanceCount } = locationIt
function apply(interval: Interval) {
const start = Interval.start(interval)
const end = Interval.end(interval)
return applyMarkerAction(tMarker.ref.value.array, start, end, action)
}
let changed = false
if (isEveryLoci(loci)) {
changed = apply(Interval.ofBounds(0, groupCount * instanceCount))
} else {
changed = mark(loci, currentGroup, apply)
}
if (changed) {
ValueCell.update(tMarker, tMarker.ref.value)
}
return changed
}, },
destroy() { destroy() {
// TODO // TODO
......
...@@ -63,7 +63,7 @@ function DirectVolumeRenderable<T extends DirectVolumeBaseValues, S extends Dire ...@@ -63,7 +63,7 @@ function DirectVolumeRenderable<T extends DirectVolumeBaseValues, S extends Dire
const renderItem = createRenderItem(ctx, 'triangles', shaderCode, fullSchema, fullValues) const renderItem = createRenderItem(ctx, 'triangles', shaderCode, fullSchema, fullValues)
const renderable = createRenderable(renderItem, values, state); const renderable = createRenderable(renderItem, values, state);
Object.defineProperty(renderable, 'opaque', { get: () => false }); Object.defineProperty(renderable, 'opaque', { get: () => true });
return renderable return renderable
} }
......
...@@ -122,23 +122,31 @@ vec4 raymarch(vec3 startLoc, vec3 step, vec3 viewDir) { ...@@ -122,23 +122,31 @@ vec4 raymarch(vec3 startLoc, vec3 step, vec3 viewDir) {
gradient.y = textureVal(isoPos - dy).a - textureVal(isoPos + dy).a; gradient.y = textureVal(isoPos - dy).a - textureVal(isoPos + dy).a;
gradient.z = textureVal(isoPos - dz).a - textureVal(isoPos + dz).a; gradient.z = textureVal(isoPos - dz).a - textureVal(isoPos + dz).a;
gradient = normalize(gradient); gradient = normalize(gradient);
float d = float(dot(gradient, viewDir) > 0.0); float d = float(dot(gradient, viewDir) > 0.0);
gradient = (2.0 * d - 1.0) * gradient; gradient = (2.0 * d - 1.0) * gradient;
float group = floor(decodeIdRGB(textureGroup(isoPos).rgb) + 0.5);
#if defined(dColorType_instance) #if defined(dColorType_instance)
color = readFromTexture(tColor, instance, uColorTexDim).rgb; color = readFromTexture(tColor, instance, uColorTexDim).rgb;
#elif defined(dColorType_group) #elif defined(dColorType_group)
float group = floor(decodeIdRGB(textureGroup(isoPos).rgb) + 0.5);
color = readFromTexture(tColor, group, uColorTexDim).rgb; color = readFromTexture(tColor, group, uColorTexDim).rgb;
#elif defined(dColorType_groupInstance) #elif defined(dColorType_groupInstance)
float group = floor(decodeIdRGB(textureGroup(isoPos).rgb) + 0.5);
color = readFromTexture(tColor, instance * float(uGroupCount) + group, uColorTexDim).rgb; color = readFromTexture(tColor, instance * float(uGroupCount) + group, uColorTexDim).rgb;
#endif #endif
src.rgb = color * abs(dot(gradient, viewDir)); src.rgb = color * abs(dot(gradient, viewDir));
src.a = uAlpha; src.a = uAlpha;
float marker = readFromTexture(tMarker, instance * float(uGroupCount) + group, uMarkerTexDim).a * 256.0;
if (marker > 0.1) {
if (mod(marker, 2.0) < 0.1) {
src.rgb = mix(uHighlightColor, src.rgb, 0.3);
} else {
src.rgb = mix(uSelectColor, src.rgb, 0.3);
}
}
// draw interior darker // draw interior darker
if( (prevValue - uIsoValue) > 0.0 ) { if( (prevValue - uIsoValue) > 0.0 ) {
src.rgb *= 0.5; src.rgb *= 0.5;
......
...@@ -64,7 +64,9 @@ void main() { ...@@ -64,7 +64,9 @@ void main() {
gl_FragColor.a = 1.0 - encodeDistLog(dist); gl_FragColor.a = 1.0 - encodeDistLog(dist);
#elif defined(dCalcType_groupId) #elif defined(dCalcType_groupId)
float minDistance = decodeDistLog(1.0 - textureMinDist(fragPos).a); float minDistance = decodeDistLog(1.0 - textureMinDist(fragPos).a);
if (dist > minDistance + length(uBboxSize / uGridDim) / 1.5) // TODO verify `length(uBboxSize / uGridDim) * 2.0`
// on some machines `* 2.0` is needed while on others `* 0.5` works
if (dist > minDistance + length(uBboxSize / uGridDim) * 2.0)
discard; discard;
gl_FragColor.rgb = encodeIdRGB(vGroup); gl_FragColor.rgb = encodeIdRGB(vGroup);
#endif #endif
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment