From e332f7cb995666495f5def129e7d65900587a442 Mon Sep 17 00:00:00 2001 From: Alexander Rose <alex.rose@rcsb.org> Date: Fri, 16 Nov 2018 11:42:12 -0800 Subject: [PATCH] added repr.setPickable(boolean) --- src/mol-geo/geometry/geometry.ts | 1 + src/mol-gl/_spec/renderer.spec.ts | 1 + src/mol-gl/renderable.ts | 1 + src/mol-gl/renderer.ts | 2 +- src/mol-math/geometry/gaussian-density/gpu.ts | 1 + src/mol-repr/representation.ts | 8 ++++++++ src/mol-repr/shape/representation.ts | 3 +++ src/mol-repr/structure/complex-representation.ts | 5 +++++ src/mol-repr/structure/complex-visual.ts | 3 +++ src/mol-repr/structure/units-representation.ts | 7 +++++++ src/mol-repr/structure/units-visual.ts | 3 +++ src/mol-repr/volume/representation.ts | 10 +++++++++- 12 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/mol-geo/geometry/geometry.ts b/src/mol-geo/geometry/geometry.ts index 190e21d27..8533bc342 100644 --- a/src/mol-geo/geometry/geometry.ts +++ b/src/mol-geo/geometry/geometry.ts @@ -104,6 +104,7 @@ export namespace Geometry { export function createRenderableState(props: PD.Values<Geometry.Params>): RenderableState { return { visible: true, + pickable: true, depthMask: props.depthMask } } diff --git a/src/mol-gl/_spec/renderer.spec.ts b/src/mol-gl/_spec/renderer.spec.ts index 51552ebf2..e62c5415f 100644 --- a/src/mol-gl/_spec/renderer.spec.ts +++ b/src/mol-gl/_spec/renderer.spec.ts @@ -85,6 +85,7 @@ function createPoints() { } const state: RenderableState = { visible: true, + pickable: true, depthMask: true, } diff --git a/src/mol-gl/renderable.ts b/src/mol-gl/renderable.ts index 370437898..9693861ed 100644 --- a/src/mol-gl/renderable.ts +++ b/src/mol-gl/renderable.ts @@ -12,6 +12,7 @@ import { Vec3 } from 'mol-math/linear-algebra'; export type RenderableState = { visible: boolean + pickable: boolean depthMask: boolean } diff --git a/src/mol-gl/renderer.ts b/src/mol-gl/renderer.ts index c7d4ce3a4..b3a8d51dd 100644 --- a/src/mol-gl/renderer.ts +++ b/src/mol-gl/renderer.ts @@ -103,7 +103,7 @@ namespace Renderer { let currentProgramId = -1 const renderObject = (r: Renderable<RenderableValues & BaseValues>, variant: RenderVariant) => { const program = r.getProgram(variant) - if (r.state.visible) { + if (r.state.visible && (variant === 'draw' || r.state.pickable)) { if (currentProgramId !== program.id) { program.use() program.setUniforms(globalUniforms) diff --git a/src/mol-math/geometry/gaussian-density/gpu.ts b/src/mol-math/geometry/gaussian-density/gpu.ts index e14fb754a..d0429a36d 100644 --- a/src/mol-math/geometry/gaussian-density/gpu.ts +++ b/src/mol-math/geometry/gaussian-density/gpu.ts @@ -232,6 +232,7 @@ function getGaussianDensityRenderObject(webgl: WebGLContext, drawCount: number, } const state: RenderableState = { visible: true, + pickable: false, depthMask: false } diff --git a/src/mol-repr/representation.ts b/src/mol-repr/representation.ts index 1325c1481..cdd92dbcc 100644 --- a/src/mol-repr/representation.ts +++ b/src/mol-repr/representation.ts @@ -88,6 +88,7 @@ interface Representation<D, P extends PD.Params = {}> { getLoci: (pickingId: PickingId) => Loci mark: (loci: Loci, action: MarkerAction) => boolean setVisibility: (value: boolean) => void + setPickable: (value: boolean) => void destroy: () => void } namespace Representation { @@ -98,6 +99,7 @@ namespace Representation { getLoci: () => EmptyLoci, mark: () => false, setVisibility: () => {}, + setPickable: () => {}, destroy: () => {} } @@ -175,6 +177,11 @@ namespace Representation { reprList[i].setVisibility(value) } }, + setPickable: (value: boolean) => { + for (let i = 0, il = reprList.length; i < il; ++i) { + reprList[i].setPickable(value) + } + }, destroy() { for (let i = 0, il = reprList.length; i < il; ++i) { reprList[i].destroy() @@ -197,5 +204,6 @@ export interface Visual<D, P extends PD.Params> { getLoci: (pickingId: PickingId) => Loci mark: (loci: Loci, action: MarkerAction) => boolean setVisibility: (value: boolean) => void + setPickable: (value: boolean) => void destroy: () => void } \ No newline at end of file diff --git a/src/mol-repr/shape/representation.ts b/src/mol-repr/shape/representation.ts index 27c7d9e73..87333b0e4 100644 --- a/src/mol-repr/shape/representation.ts +++ b/src/mol-repr/shape/representation.ts @@ -103,6 +103,9 @@ export function ShapeRepresentation<P extends ShapeParams>(): ShapeRepresentatio setVisibility(value: boolean) { renderObjects.forEach(ro => ro.state.visible = value) }, + setPickable(value: boolean) { + renderObjects.forEach(ro => ro.state.pickable = value) + }, destroy() { // TODO renderObjects.length = 0 diff --git a/src/mol-repr/structure/complex-representation.ts b/src/mol-repr/structure/complex-representation.ts index f74d05510..c3b9051ac 100644 --- a/src/mol-repr/structure/complex-representation.ts +++ b/src/mol-repr/structure/complex-representation.ts @@ -54,6 +54,10 @@ export function ComplexRepresentation<P extends StructureParams>(label: string, if (visual) visual.setVisibility(value) } + function setPickable(value: boolean) { + if (visual) visual.setPickable(value) + } + function destroy() { if (visual) visual.destroy() } @@ -70,6 +74,7 @@ export function ComplexRepresentation<P extends StructureParams>(label: string, getLoci, mark, setVisibility, + setPickable, destroy } } \ No newline at end of file diff --git a/src/mol-repr/structure/complex-visual.ts b/src/mol-repr/structure/complex-visual.ts index 25823c82f..d7110771a 100644 --- a/src/mol-repr/structure/complex-visual.ts +++ b/src/mol-repr/structure/complex-visual.ts @@ -165,6 +165,9 @@ export function ComplexVisual<P extends ComplexParams>(builder: ComplexVisualGeo setVisibility(value: boolean) { if (renderObject) renderObject.state.visible = value }, + setPickable(value: boolean) { + if (renderObject) renderObject.state.pickable = value + }, destroy() { // TODO renderObject = undefined diff --git a/src/mol-repr/structure/units-representation.ts b/src/mol-repr/structure/units-representation.ts index 42bb3fb86..aa525857d 100644 --- a/src/mol-repr/structure/units-representation.ts +++ b/src/mol-repr/structure/units-representation.ts @@ -147,6 +147,12 @@ export function UnitsRepresentation<P extends UnitsParams>(label: string, getPar }) } + function setPickable(value: boolean) { + visuals.forEach(({ visual }) => { + visual.setPickable(value) + }) + } + function destroy() { visuals.forEach(({ visual }) => visual.destroy()) visuals.clear() @@ -168,6 +174,7 @@ export function UnitsRepresentation<P extends UnitsParams>(label: string, getPar getLoci, mark, setVisibility, + setPickable, destroy } } \ No newline at end of file diff --git a/src/mol-repr/structure/units-visual.ts b/src/mol-repr/structure/units-visual.ts index f5cc5a4a5..c1f6716ce 100644 --- a/src/mol-repr/structure/units-visual.ts +++ b/src/mol-repr/structure/units-visual.ts @@ -195,6 +195,9 @@ export function UnitsVisual<P extends UnitsParams>(builder: UnitsVisualGeometryB setVisibility(value: boolean) { if (renderObject) renderObject.state.visible = value }, + setPickable(value: boolean) { + if (renderObject) renderObject.state.pickable = value + }, destroy() { // TODO renderObject = undefined diff --git a/src/mol-repr/volume/representation.ts b/src/mol-repr/volume/representation.ts index 12e24cdf1..81e7d1ad0 100644 --- a/src/mol-repr/volume/representation.ts +++ b/src/mol-repr/volume/representation.ts @@ -39,7 +39,7 @@ interface VolumeVisualGeometryBuilder<P extends VolumeParams, G extends Geometry updateValues(values: RenderableValues, newProps: PD.Values<P>): void } -export function VolumeVisual<P extends VolumeParams>(builder: VolumeVisualGeometryBuilder<P, Geometry>) { +export function VolumeVisual<P extends VolumeParams>(builder: VolumeVisualGeometryBuilder<P, Geometry>): VolumeVisual<P> { const { defaultProps, createGeometry, getLoci, mark, setUpdateState } = builder const { createRenderObject, updateValues } = builder const updateState = VisualUpdateState.create() @@ -120,6 +120,9 @@ export function VolumeVisual<P extends VolumeParams>(builder: VolumeVisualGeomet setVisibility(value: boolean) { if (renderObject) renderObject.state.visible = value }, + setPickable(value: boolean) { + if (renderObject) renderObject.state.pickable = value + }, destroy() { // TODO renderObject = undefined @@ -194,6 +197,10 @@ export function VolumeRepresentation<P extends VolumeParams>(label: string, getP if (visual) visual.setVisibility(value) } + function setPickable(value: boolean) { + if (visual) visual.setPickable(value) + } + return { label, get renderObjects() { @@ -206,6 +213,7 @@ export function VolumeRepresentation<P extends VolumeParams>(label: string, getP getLoci, mark, setVisibility, + setPickable, destroy } } \ No newline at end of file -- GitLab