diff --git a/src/mol-geo/geometry/direct-volume/direct-volume.ts b/src/mol-geo/geometry/direct-volume/direct-volume.ts index ea2c9694c19dd979d2245baba0cde0a8050eb37d..32eb6957b6d7a9bcf261962e08a33bcd106a414d 100644 --- a/src/mol-geo/geometry/direct-volume/direct-volume.ts +++ b/src/mol-geo/geometry/direct-volume/direct-volume.ts @@ -25,6 +25,7 @@ import { ColorListOptions, ColorListName } from 'mol-util/color/scale'; import { Color } from 'mol-util/color'; import { BaseGeometry } from '../base'; import { createEmptyOverpaint } from '../overpaint-data'; +import { createEmptyTransparency } from '../transparency-data'; const VolumeBox = Box() const RenderModeOptions = [['isosurface', 'Isosurface'], ['volume', 'Volume']] as [string, string][] @@ -103,6 +104,7 @@ export namespace DirectVolume { const color = createColors(locationIt, theme.color) const marker = createMarkers(instanceCount * groupCount) const overpaint = createEmptyOverpaint() + const transparency = createEmptyTransparency() const counts = { drawCount: VolumeBox.indices.length, groupCount, instanceCount } @@ -117,6 +119,7 @@ export namespace DirectVolume { ...color, ...marker, ...overpaint, + ...transparency, ...transform, ...BaseGeometry.createValues(props, counts), diff --git a/src/mol-geo/geometry/lines/lines.ts b/src/mol-geo/geometry/lines/lines.ts index a2795a9c8646390fd2fc0455ba9a779429ac9870..4ed81dd8582ae1b79225869f9c106b057c2a30fd 100644 --- a/src/mol-geo/geometry/lines/lines.ts +++ b/src/mol-geo/geometry/lines/lines.ts @@ -23,6 +23,7 @@ import { Theme } from 'mol-theme/theme'; import { Color } from 'mol-util/color'; import { BaseGeometry } from '../base'; import { createEmptyOverpaint } from '../overpaint-data'; +import { createEmptyTransparency } from '../transparency-data'; /** Wide line */ export interface Lines { @@ -119,6 +120,7 @@ export namespace Lines { const size = createSizes(locationIt, theme.size) const marker = createMarkers(instanceCount * groupCount) const overpaint = createEmptyOverpaint() + const transparency = createEmptyTransparency() const counts = { drawCount: lines.lineCount * 2 * 3, groupCount, instanceCount } @@ -137,6 +139,7 @@ export namespace Lines { ...size, ...marker, ...overpaint, + ...transparency, ...transform, ...BaseGeometry.createValues(props, counts), diff --git a/src/mol-geo/geometry/mesh/mesh.ts b/src/mol-geo/geometry/mesh/mesh.ts index fd594d952c6ad0aa3f886828537e0f833651b53c..1095cd65484827f2a2b72916adea018f47bef388 100644 --- a/src/mol-geo/geometry/mesh/mesh.ts +++ b/src/mol-geo/geometry/mesh/mesh.ts @@ -22,6 +22,7 @@ import { MeshValues } from 'mol-gl/renderable/mesh'; import { Color } from 'mol-util/color'; import { BaseGeometry } from '../base'; import { createEmptyOverpaint } from '../overpaint-data'; +import { createEmptyTransparency } from '../transparency-data'; export interface Mesh { readonly kind: 'mesh', @@ -383,6 +384,7 @@ export namespace Mesh { const color = createColors(locationIt, theme.color) const marker = createMarkers(instanceCount * groupCount) const overpaint = createEmptyOverpaint() + const transparency = createEmptyTransparency() const counts = { drawCount: mesh.triangleCount * 3, groupCount, instanceCount } @@ -401,6 +403,7 @@ export namespace Mesh { ...color, ...marker, ...overpaint, + ...transparency, ...transform, ...BaseGeometry.createValues(props, counts), diff --git a/src/mol-geo/geometry/points/points.ts b/src/mol-geo/geometry/points/points.ts index 7cda2e36ef2d8241561cdbcb1a341cfbf99d1446..cb5f9c648f38006387d7d9604bcc3704f5153ccf 100644 --- a/src/mol-geo/geometry/points/points.ts +++ b/src/mol-geo/geometry/points/points.ts @@ -22,6 +22,7 @@ import { RenderableState } from 'mol-gl/renderable'; import { Color } from 'mol-util/color'; import { BaseGeometry } from '../base'; import { createEmptyOverpaint } from '../overpaint-data'; +import { createEmptyTransparency } from '../transparency-data'; /** Point cloud */ export interface Points { @@ -84,6 +85,7 @@ export namespace Points { const size = createSizes(locationIt, theme.size) const marker = createMarkers(instanceCount * groupCount) const overpaint = createEmptyOverpaint() + const transparency = createEmptyTransparency() const counts = { drawCount: points.pointCount, groupCount, instanceCount } @@ -101,6 +103,7 @@ export namespace Points { ...size, ...marker, ...overpaint, + ...transparency, ...transform, ...BaseGeometry.createValues(props, counts), diff --git a/src/mol-geo/geometry/spheres/spheres.ts b/src/mol-geo/geometry/spheres/spheres.ts index eb22f55a918043f512f28824d857b3fb61d00db1..9d38ea9a2bfcb28cd64b5119e62f6caccad21303 100644 --- a/src/mol-geo/geometry/spheres/spheres.ts +++ b/src/mol-geo/geometry/spheres/spheres.ts @@ -19,6 +19,7 @@ import { createSizes, getMaxSize } from '../size-data'; import { Color } from 'mol-util/color'; import { BaseGeometry } from '../base'; import { createEmptyOverpaint } from '../overpaint-data'; +import { createEmptyTransparency } from '../transparency-data'; /** Spheres */ export interface Spheres { @@ -81,6 +82,7 @@ export namespace Spheres { const size = createSizes(locationIt, theme.size) const marker = createMarkers(instanceCount * groupCount) const overpaint = createEmptyOverpaint() + const transparency = createEmptyTransparency() const counts = { drawCount: spheres.sphereCount * 2 * 3, groupCount, instanceCount } @@ -101,6 +103,7 @@ export namespace Spheres { ...size, ...marker, ...overpaint, + ...transparency, ...transform, padding: ValueCell.create(padding), diff --git a/src/mol-geo/geometry/text/text.ts b/src/mol-geo/geometry/text/text.ts index 4238f2432cc9b24f9cb21e2d3dbf2841c70179af..58e11502cef2e2a24ffa86e2bdf4d7f05a094754 100644 --- a/src/mol-geo/geometry/text/text.ts +++ b/src/mol-geo/geometry/text/text.ts @@ -25,6 +25,7 @@ import { clamp } from 'mol-math/interpolate'; import { createRenderObject as _createRenderObject } from 'mol-gl/render-object'; import { BaseGeometry } from '../base'; import { createEmptyOverpaint } from '../overpaint-data'; +import { createEmptyTransparency } from '../transparency-data'; type TextAttachment = ( 'bottom-left' | 'bottom-center' | 'bottom-right' | @@ -124,6 +125,7 @@ export namespace Text { const size = createSizes(locationIt, theme.size) const marker = createMarkers(instanceCount * groupCount) const overpaint = createEmptyOverpaint() + const transparency = createEmptyTransparency() const counts = { drawCount: text.charCount * 2 * 3, groupCount, instanceCount } @@ -145,6 +147,7 @@ export namespace Text { ...size, ...marker, ...overpaint, + ...transparency, ...transform, aTexCoord: text.tcoordBuffer, diff --git a/src/mol-geo/geometry/transparency-data.ts b/src/mol-geo/geometry/transparency-data.ts new file mode 100644 index 0000000000000000000000000000000000000000..2d1ba6390fad16c90acc2002cb7d49d685b6fb94 --- /dev/null +++ b/src/mol-geo/geometry/transparency-data.ts @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info. + * + * @author Alexander Rose <alexander.rose@weirdbyte.de> + */ + +import { ValueCell } from 'mol-util/value-cell' +import { Vec2 } from 'mol-math/linear-algebra' +import { TextureImage, createTextureImage } from 'mol-gl/renderable/util'; + +export type TransparencyData = { + tTransparency: ValueCell<TextureImage<Uint8Array>> + uTransparencyTexDim: ValueCell<Vec2> + dTransparency: ValueCell<boolean>, +} + +export function applyTransparencyValue(array: Uint8Array, start: number, end: number, value: number) { + for (let i = start; i < end; ++i) { + array[i] = value * 255 + } + return true +} + +export function clearTransparency(array: Uint8Array, start: number, end: number) { + array.fill(0, start, end) +} + +export function createTransparency(count: number, transparencyData?: TransparencyData): TransparencyData { + const transparency = createTextureImage(Math.max(1, count), 1, transparencyData && transparencyData.tTransparency.ref.value.array) + if (transparencyData) { + ValueCell.update(transparencyData.tTransparency, transparency) + ValueCell.update(transparencyData.uTransparencyTexDim, Vec2.create(transparency.width, transparency.height)) + ValueCell.update(transparencyData.dTransparency, count > 0) + return transparencyData + } else { + return { + tTransparency: ValueCell.create(transparency), + uTransparencyTexDim: ValueCell.create(Vec2.create(transparency.width, transparency.height)), + dTransparency: ValueCell.create(count > 0), + } + } +} + +const emptyTransparencyTexture = { array: new Uint8Array(1), width: 1, height: 1 } +export function createEmptyTransparency(transparencyData?: TransparencyData): TransparencyData { + if (transparencyData) { + ValueCell.update(transparencyData.tTransparency, emptyTransparencyTexture) + ValueCell.update(transparencyData.uTransparencyTexDim, Vec2.create(1, 1)) + return transparencyData + } else { + return { + tTransparency: ValueCell.create(emptyTransparencyTexture), + uTransparencyTexDim: ValueCell.create(Vec2.create(1, 1)), + dTransparency: ValueCell.create(false), + } + } +} \ No newline at end of file diff --git a/src/mol-gl/_spec/renderer.spec.ts b/src/mol-gl/_spec/renderer.spec.ts index 59e21b88aaad8ad0a0712c011308369eb5a3d7bc..67d7ac11c0dd1b49c0a5fc9af2d666fc579189a2 100644 --- a/src/mol-gl/_spec/renderer.spec.ts +++ b/src/mol-gl/_spec/renderer.spec.ts @@ -23,6 +23,7 @@ import { fillSerial } from 'mol-util/array'; import { Color } from 'mol-util/color'; import { Sphere3D } from 'mol-math/geometry'; import { createEmptyOverpaint } from 'mol-geo/geometry/overpaint-data'; +import { createEmptyTransparency } from 'mol-geo/geometry/transparency-data'; // function writeImage(gl: WebGLRenderingContext, width: number, height: number) { // const pixels = new Uint8Array(width * height * 4) @@ -54,6 +55,7 @@ function createPoints() { const size = createValueSize(1) const marker = createEmptyMarkers() const overpaint = createEmptyOverpaint() + const transparency = createEmptyTransparency() const aTransform = ValueCell.create(new Float32Array(16)) const m4 = Mat4.identity() @@ -73,6 +75,7 @@ function createPoints() { ...marker, ...size, ...overpaint, + ...transparency, uAlpha: ValueCell.create(1.0), uHighlightColor: ValueCell.create(Vec3.create(1.0, 0.4, 0.6)), diff --git a/src/mol-gl/renderable/direct-volume.ts b/src/mol-gl/renderable/direct-volume.ts index 1c01119ecdbfcf8ebd7ae6de1708de39956a581e..50b4b3e5d4910e6c7abad51497ca1d7beec77089 100644 --- a/src/mol-gl/renderable/direct-volume.ts +++ b/src/mol-gl/renderable/direct-volume.ts @@ -24,6 +24,10 @@ export const DirectVolumeSchema = { tOverpaint: TextureSpec('image-uint8', 'rgba', 'ubyte', 'nearest'), dOverpaint: DefineSpec('boolean'), + uTransparencyTexDim: UniformSpec('v2'), + tTransparency: TextureSpec('image-uint8', 'alpha', 'ubyte', 'nearest'), + dTransparency: DefineSpec('boolean'), + uInstanceCount: UniformSpec('i'), uGroupCount: UniformSpec('i'), diff --git a/src/mol-gl/renderable/schema.ts b/src/mol-gl/renderable/schema.ts index e6d882b070f291c2b065ba102fab818e0afb1d47..139282f13fefc7f746bdffff11dfcac9c52b816e 100644 --- a/src/mol-gl/renderable/schema.ts +++ b/src/mol-gl/renderable/schema.ts @@ -207,10 +207,19 @@ export const OverpaintSchema = { export type OverpaintSchema = typeof OverpaintSchema export type OverpaintValues = Values<OverpaintSchema> +export const TransparencySchema = { + uTransparencyTexDim: UniformSpec('v2'), + tTransparency: TextureSpec('image-uint8', 'alpha', 'ubyte', 'nearest'), + dTransparency: DefineSpec('boolean'), +} +export type TransparencySchema = typeof TransparencySchema +export type TransparencyValues = Values<TransparencySchema> + export const BaseSchema = { ...ColorSchema, ...MarkerSchema, ...OverpaintSchema, + ...TransparencySchema, aInstance: AttributeSpec('float32', 1, 1), aGroup: AttributeSpec('float32', 1, 0), diff --git a/src/mol-gl/shader/chunks/apply-marker-color.glsl b/src/mol-gl/shader/chunks/apply-marker-color.glsl index 327ba74bb881a097df42ef173ec4bc1db168dc3c..59067c0074d3335034a90d7d2fbd5342977700c1 100644 --- a/src/mol-gl/shader/chunks/apply-marker-color.glsl +++ b/src/mol-gl/shader/chunks/apply-marker-color.glsl @@ -1,5 +1,5 @@ // only mark elements with an alpha above the picking threshold -if (uAlpha >= uPickingAlphaThreshold) { +if (gl_FragColor.a >= uPickingAlphaThreshold) { float marker = floor(vMarker * 255.0 + 0.5); // rounding required to work on some cards on win if (marker > 0.1) { if (intMod(marker, 2.0) > 0.1) { diff --git a/src/mol-gl/shader/chunks/assign-color-varying.glsl b/src/mol-gl/shader/chunks/assign-color-varying.glsl index 7175df041fa3cf59c66964a3a0598d49ac20c05f..e820a5849227b98f5c074bdadd7df819376fafa5 100644 --- a/src/mol-gl/shader/chunks/assign-color-varying.glsl +++ b/src/mol-gl/shader/chunks/assign-color-varying.glsl @@ -16,4 +16,8 @@ #ifdef dOverpaint vOverpaint = readFromTexture(tOverpaint, aInstance * float(uGroupCount) + aGroup, uOverpaintTexDim); +#endif + +#ifdef dTransparency + vTransparency = readFromTexture(tTransparency, aInstance * float(uGroupCount) + aGroup, uTransparencyTexDim); #endif \ No newline at end of file diff --git a/src/mol-gl/shader/chunks/assign-material-color.glsl b/src/mol-gl/shader/chunks/assign-material-color.glsl index d79b00d7da917237b2e5c1b657ccf1683adbd14b..bd35c1fcb6e4a3122b36c29c5991ede2326781a8 100644 --- a/src/mol-gl/shader/chunks/assign-material-color.glsl +++ b/src/mol-gl/shader/chunks/assign-material-color.glsl @@ -9,4 +9,9 @@ // mix material with overpaint #if defined(dOverpaint) && (defined(dColorType_uniform) || defined(dColorType_attribute) || defined(dColorType_instance) || defined(dColorType_group) || defined(dColorType_groupInstance)) material.rgb = mix(material.rgb, vOverpaint.rgb, vOverpaint.a); +#endif + +// apply transparency +#if defined(dTransparency) && (defined(dColorType_uniform) || defined(dColorType_attribute) || defined(dColorType_instance) || defined(dColorType_group) || defined(dColorType_groupInstance)) + material.a *= 1 - vTransparency; #endif \ No newline at end of file diff --git a/src/mol-gl/shader/chunks/color-frag-params.glsl b/src/mol-gl/shader/chunks/color-frag-params.glsl index 871e2dee3e9551de259c1273ac869154228df38e..8e3a16e29296e76b4c4ed3588b70304eaa760fea 100644 --- a/src/mol-gl/shader/chunks/color-frag-params.glsl +++ b/src/mol-gl/shader/chunks/color-frag-params.glsl @@ -12,4 +12,8 @@ #ifdef dOverpaint varying vec4 vOverpaint; +#endif + +#ifdef dTransparency + varying float vTransparency; #endif \ No newline at end of file diff --git a/src/mol-gl/shader/chunks/color-vert-params.glsl b/src/mol-gl/shader/chunks/color-vert-params.glsl index b3156a22ee6f0cabb1cf1505e09b82570ce865da..31066d58bd9bbeb357cc6e17d4b3bcae4f46f5e7 100644 --- a/src/mol-gl/shader/chunks/color-vert-params.glsl +++ b/src/mol-gl/shader/chunks/color-vert-params.glsl @@ -20,4 +20,10 @@ varying vec4 vOverpaint; uniform vec2 uOverpaintTexDim; uniform sampler2D tOverpaint; +#endif + +#ifdef dTransparency + varying float vTransparency; + uniform vec2 uTransparencyTexDim; + uniform sampler2D tTransparency; #endif \ No newline at end of file diff --git a/src/mol-repr/representation.ts b/src/mol-repr/representation.ts index 5bc851e2fdbac8163d79b00a4fdd8a5c18b319b9..812bc71d0ecbc3d35f9d0dc03200f76f2cfcd8d1 100644 --- a/src/mol-repr/representation.ts +++ b/src/mol-repr/representation.ts @@ -20,6 +20,7 @@ import { Mat4 } from 'mol-math/linear-algebra'; import { BaseGeometry } from 'mol-geo/geometry/base'; import { Visual } from './visual'; import { Overpaint } from 'mol-theme/overpaint'; +import { Transparency } from 'mol-theme/transparency'; // export interface RepresentationProps { // visuals?: string[] @@ -146,19 +147,22 @@ namespace Representation { pickable: boolean /** Overpaint applied to the representation's renderobjects */ overpaint: Overpaint + /** Per group transparency applied to the representation's renderobjects */ + transparency: Transparency /** Controls if the representation's renderobjects are synced automatically with GPU or not */ syncManually: boolean /** A transformation applied to the representation's renderobjects */ transform: Mat4 } export function createState(): State { - return { visible: false, alphaFactor: 0, pickable: false, syncManually: false, transform: Mat4.identity(), overpaint: Overpaint.Empty } + return { visible: false, alphaFactor: 0, pickable: false, syncManually: false, transform: Mat4.identity(), overpaint: Overpaint.Empty, transparency: Transparency.Empty } } export function updateState(state: State, update: Partial<State>) { if (update.visible !== undefined) state.visible = update.visible if (update.alphaFactor !== undefined) state.alphaFactor = update.alphaFactor if (update.pickable !== undefined) state.pickable = update.pickable if (update.overpaint !== undefined) state.overpaint = update.overpaint + if (update.transparency !== undefined) state.transparency = update.transparency if (update.syncManually !== undefined) state.syncManually = update.syncManually if (update.transform !== undefined) Mat4.copy(state.transform, update.transform) } @@ -322,6 +326,9 @@ namespace Representation { if (state.overpaint !== undefined) { // TODO } + if (state.transparency !== undefined) { + // TODO + } if (state.transform !== undefined) Visual.setTransform(renderObject, state.transform) Representation.updateState(currentState, state) diff --git a/src/mol-repr/shape/representation.ts b/src/mol-repr/shape/representation.ts index c9d32c61f99ca9a47856e8f6aad9b073601e5942..ed079f38cfb2430264d257e603b981039ba91a6f 100644 --- a/src/mol-repr/shape/representation.ts +++ b/src/mol-repr/shape/representation.ts @@ -186,6 +186,9 @@ export function ShapeRepresentation<D, G extends Geometry, P extends Geometry.Pa if (state.overpaint !== undefined) { Visual.setOverpaint(_renderObject, state.overpaint, lociApply, true) } + if (state.transparency !== undefined) { + Visual.setTransparency(_renderObject, state.transparency, lociApply, true) + } if (state.transform !== undefined) Visual.setTransform(_renderObject, state.transform) } diff --git a/src/mol-repr/structure/complex-visual.ts b/src/mol-repr/structure/complex-visual.ts index a5cf1607f5897e18e7884dddb1df327f843f0d18..aeb4752bd5415d26610e43f10cc3b77c779170c4 100644 --- a/src/mol-repr/structure/complex-visual.ts +++ b/src/mol-repr/structure/complex-visual.ts @@ -29,6 +29,7 @@ import { DirectVolume } from 'mol-geo/geometry/direct-volume/direct-volume'; import { Mat4 } from 'mol-math/linear-algebra'; import { createIdentityTransform } from 'mol-geo/geometry/transform-data'; import { Overpaint } from 'mol-theme/overpaint'; +import { Transparency } from 'mol-theme/transparency'; export interface ComplexVisual<P extends StructureParams> extends Visual<Structure, P> { } @@ -199,6 +200,9 @@ export function ComplexVisual<G extends Geometry, P extends ComplexParams & Geom setOverpaint(overpaint: Overpaint, clear = false) { return Visual.setOverpaint(renderObject, overpaint, lociApply, true) }, + setTransparency(transparency: Transparency) { + return Visual.setTransparency(renderObject, transparency, lociApply, true) + }, destroy() { // TODO renderObject = undefined diff --git a/src/mol-repr/structure/units-visual.ts b/src/mol-repr/structure/units-visual.ts index e8d4ed6a8bbade55e1bbad733862e9caf3e083f0..41b74b4d7bf1dce714566390520c8f44bcd3d735 100644 --- a/src/mol-repr/structure/units-visual.ts +++ b/src/mol-repr/structure/units-visual.ts @@ -32,6 +32,7 @@ import { Mat4 } from 'mol-math/linear-algebra'; import { Spheres } from 'mol-geo/geometry/spheres/spheres'; import { createUnitsTransform, includesUnitKind } from './visual/util/common'; import { Overpaint } from 'mol-theme/overpaint'; +import { Transparency } from 'mol-theme/transparency'; export type StructureGroup = { structure: Structure, group: Unit.SymmetryGroup } @@ -245,6 +246,9 @@ export function UnitsVisual<G extends Geometry, P extends UnitsParams & Geometry setOverpaint(overpaint: Overpaint) { return Visual.setOverpaint(renderObject, overpaint, lociApply, true) }, + setTransparency(transparency: Transparency) { + return Visual.setTransparency(renderObject, transparency, lociApply, true) + }, destroy() { // TODO renderObject = undefined diff --git a/src/mol-repr/visual.ts b/src/mol-repr/visual.ts index 92072569ebe9dae974c23f7e6966aebefdafabfe..3675e810816ce7393075864f2d3b25004f93a3c6 100644 --- a/src/mol-repr/visual.ts +++ b/src/mol-repr/visual.ts @@ -19,6 +19,8 @@ import { ValueCell } from 'mol-util'; import { Overpaint } from 'mol-theme/overpaint'; import { createOverpaint, clearOverpaint, applyOverpaintColor } from 'mol-geo/geometry/overpaint-data'; import { Interval } from 'mol-data/int'; +import { Transparency } from 'mol-theme/transparency'; +import { createTransparency, clearTransparency, applyTransparencyValue } from 'mol-geo/geometry/transparency-data'; export interface VisualContext { readonly runtime: RuntimeContext @@ -39,6 +41,7 @@ interface Visual<D, P extends PD.Params> { setPickable: (pickable: boolean) => void setTransform: (matrix?: Mat4, instanceMatrices?: Float32Array | null) => void setOverpaint: (overpaint: Overpaint) => void + setTransparency: (transparency: Transparency) => void destroy: () => void } namespace Visual { @@ -96,6 +99,30 @@ namespace Visual { ValueCell.update(tOverpaint, tOverpaint.ref.value) } + export function setTransparency(renderObject: GraphicsRenderObject | undefined, transparency: Transparency, lociApply: LociApply, clear: boolean) { + if (!renderObject) return + + const { tTransparency, uGroupCount, instanceCount } = renderObject.values + const count = uGroupCount.ref.value * instanceCount.ref.value + + // ensure texture has right size + createTransparency(transparency.layers.length ? count : 0, renderObject.values) + + // clear if requested + if (clear) clearTransparency(tTransparency.ref.value.array, 0, count) + + for (let i = 0, il = transparency.layers.length; i < il; ++i) { + const { loci, value } = transparency.layers[i] + const apply = (interval: Interval) => { + const start = Interval.start(interval) + const end = Interval.end(interval) + return applyTransparencyValue(tTransparency.ref.value.array, start, end, value) + } + lociApply(loci, apply) + } + ValueCell.update(tTransparency, tTransparency.ref.value) + } + export function setTransform(renderObject: GraphicsRenderObject | undefined, transform?: Mat4, instanceTransforms?: Float32Array | null) { if (!renderObject || (!transform && !instanceTransforms)) return diff --git a/src/mol-repr/volume/representation.ts b/src/mol-repr/volume/representation.ts index 13a4b1a0371d7f6a166c4c51c4b0449317194b18..fffc5461d14d62489e3c876816c306d75157a44d 100644 --- a/src/mol-repr/volume/representation.ts +++ b/src/mol-repr/volume/representation.ts @@ -27,6 +27,7 @@ import { ColorTheme } from 'mol-theme/color'; import { createColors } from 'mol-geo/geometry/color-data'; import { createSizes } from 'mol-geo/geometry/size-data'; import { Overpaint } from 'mol-theme/overpaint'; +import { Transparency } from 'mol-theme/transparency'; export interface VolumeVisual<P extends VolumeParams> extends Visual<VolumeData, P> { } @@ -186,6 +187,9 @@ export function VolumeVisual<G extends Geometry, P extends VolumeParams & Geomet setOverpaint(overpaint: Overpaint) { return Visual.setOverpaint(renderObject, overpaint, lociApply, true) }, + setTransparency(transparency: Transparency) { + return Visual.setTransparency(renderObject, transparency, lociApply, true) + }, destroy() { // TODO renderObject = undefined diff --git a/src/mol-theme/transparency.ts b/src/mol-theme/transparency.ts new file mode 100644 index 0000000000000000000000000000000000000000..0fad49f7f751f72a63bb2379821d7506146444a2 --- /dev/null +++ b/src/mol-theme/transparency.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info. + * + * @author Alexander Rose <alexander.rose@weirdbyte.de> + */ + +import { Loci } from 'mol-model/loci'; + +export { Transparency } + +type Transparency = { layers: ReadonlyArray<Transparency.Layer> } + +namespace Transparency { + export type Layer = { readonly loci: Loci, readonly value: number } + export const Empty: Transparency = { layers: [] } + + export function areEqual(tA: Transparency, tB: Transparency) { + if (tA.layers.length === 0 && tB.layers.length === 0) return true + if (tA.layers.length !== tB.layers.length) return false + for (let i = 0, il = tA.layers.length; i < il; ++i) { + if (tA.layers[i].value !== tB.layers[i].value) return false + if (!Loci.areEqual(tA.layers[i].loci, tB.layers[i].loci)) return false + } + return true + } +} \ No newline at end of file