diff --git a/src/mol-geo/geometry/geometry.ts b/src/mol-geo/geometry/geometry.ts index 190e21d27a4cf9ebfe361c2d1b280902e26ebef9..8533bc34244aa8a4691e389d249d7e50655aeee2 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 51552ebf2dac61950224535024a725c0574b78d6..e62c5415f7be59b638ff97167f2ca012d6d2c34a 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 370437898cfee60a0df4e37d155640412c21a6fb..9693861ed06631f06bb82b8b3cef778c2664403d 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 c7d4ce3a4fec1c3b17a1dd68cd02d8d020f80a49..b3a8d51dd2d961cc6326bc2798358947b754b910 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 e14fb754a15fa825b4b1b98dcfda5593a076c65e..d0429a36dfee714b53ba6de3a59c0cae93856e9a 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 1325c1481edc2963cb4cff2584431022142599da..cdd92dbcce622beba428691e64f8c8bde84a64ac 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 27c7d9e7339a29438bce609f766c8cc2d8bf3570..87333b0e41e49770e1d229d7c7cd69eca8904635 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 f74d0551005db1201cd232d17b9b23321ade0838..c3b9051ac0989766600760af5d8e0f34ec70d87e 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 25823c82f05c06438cb4c61af328390ad3a87395..d7110771a18beecf1180f367165514ce71e6d0b0 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 42bb3fb8604b8660664dbdf7476772105c6cab63..aa525857dad38c11a419e7ffc99803ca8b2f6e3e 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 f5cc5a4a58ce0ae94f8eb3bd551a47d0d49565f8..c1f6716ce51ce2f0b306258a8302759c0015c83f 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 12e24cdf1cd98895bb3e61971202c9aea2a1b5b8..81e7d1ad09b81a4c4f7b327c574ebd6b6078abe1 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