diff --git a/CHANGELOG.md b/CHANGELOG.md index 336e7c0ce53e0ded027658aafc714248c37b4186..2a9286f9effe1e23582d8065cef37a405c29e27b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ Note that since we don't clearly distinguish between a public and private interf - Fix occlusion artefact with non-canvas viewport and pixel-ratio > 1 - Update nodejs-shims conditionals to handle polyfilled document object in NodeJS environment. - Ensure marking edges are at least one pixel wide +- Add exposure parameter to renderer - Only trigger marking when mouse is directly over canvas - Fix blurry occlusion in screenshots diff --git a/src/mol-gl/renderable/schema.ts b/src/mol-gl/renderable/schema.ts index fd91530c40500e9570a973d6872e3645c81af088..1595f4994ea98cd382fda47084a5983252e80431 100644 --- a/src/mol-gl/renderable/schema.ts +++ b/src/mol-gl/renderable/schema.ts @@ -160,6 +160,7 @@ export const GlobalUniformSchema = { uMarkerAverage: UniformSpec('f'), uXrayEdgeFalloff: UniformSpec('f'), + uExposure: UniformSpec('f'), uRenderMask: UniformSpec('i'), uMarkingDepthTest: UniformSpec('b'), diff --git a/src/mol-gl/renderer.ts b/src/mol-gl/renderer.ts index d2968569f69cfc3e9d5814a08daf4d7f78feaffd..c1132d310e464de6dcdc6e1946186d67c311ac71 100644 --- a/src/mol-gl/renderer.ts +++ b/src/mol-gl/renderer.ts @@ -104,6 +104,7 @@ export const RendererParams = { markerPriority: PD.Select(1, [[1, 'Highlight'], [2, 'Select']]), xrayEdgeFalloff: PD.Numeric(1, { min: 0.0, max: 3.0, step: 0.1 }), + exposure: PD.Numeric(1, { min: 0.0, max: 3.0, step: 0.01 }), light: PD.ObjectList({ inclination: PD.Numeric(150, { min: 0, max: 180, step: 1 }), @@ -242,6 +243,7 @@ namespace Renderer { uMarkerAverage: ValueCell.create(0), uXrayEdgeFalloff: ValueCell.create(p.xrayEdgeFalloff), + uExposure: ValueCell.create(p.exposure), }; const globalUniformList = Object.entries(globalUniforms); @@ -787,6 +789,10 @@ namespace Renderer { p.xrayEdgeFalloff = props.xrayEdgeFalloff; ValueCell.update(globalUniforms.uXrayEdgeFalloff, p.xrayEdgeFalloff); } + if (props.exposure !== undefined && props.exposure !== p.exposure) { + p.exposure = props.exposure; + ValueCell.update(globalUniforms.uExposure, p.exposure); + } if (props.light !== undefined && !deepEqual(props.light, p.light)) { p.light = props.light; diff --git a/src/mol-gl/shader/chunks/apply-light-color.glsl.ts b/src/mol-gl/shader/chunks/apply-light-color.glsl.ts index ff2036d50cdc38547483552017dae5c90274bbcc..d4f2dc1f432299f85475af8cd791dd33336c161f 100644 --- a/src/mol-gl/shader/chunks/apply-light-color.glsl.ts +++ b/src/mol-gl/shader/chunks/apply-light-color.glsl.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017-2022 mol* contributors, licensed under MIT, See LICENSE file for more info. + * Copyright (c) 2017-2023 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> * @@ -65,4 +65,6 @@ export const apply_light_color = ` #ifdef dXrayShaded gl_FragColor.a *= 1.0 - pow(abs(dot(normal, vec3(0.0, 0.0, 1.0))), uXrayEdgeFalloff); #endif + +gl_FragColor.rgb *= uExposure; `; \ No newline at end of file diff --git a/src/mol-gl/shader/chunks/common-frag-params.glsl.ts b/src/mol-gl/shader/chunks/common-frag-params.glsl.ts index 31329c2a2fd8efdf1364b40b102b919a5b3f2c5b..3a3a28ca3f77d1c26df688a50a09e39380c7518b 100644 --- a/src/mol-gl/shader/chunks/common-frag-params.glsl.ts +++ b/src/mol-gl/shader/chunks/common-frag-params.glsl.ts @@ -72,6 +72,7 @@ uniform vec3 uInteriorColor; bool interior; uniform float uXrayEdgeFalloff; +uniform float uExposure; uniform mat4 uProjection; diff --git a/src/mol-gl/shader/direct-volume.frag.ts b/src/mol-gl/shader/direct-volume.frag.ts index 8c6a0d4dc32acdb260ad70671e9422eed3f08455..09df873119e7ef695c8bf0f0768c94d5aba1f46a 100644 --- a/src/mol-gl/shader/direct-volume.frag.ts +++ b/src/mol-gl/shader/direct-volume.frag.ts @@ -75,6 +75,7 @@ uniform vec3 uFogColor; uniform float uAlpha; uniform bool uTransparentBackground; uniform float uXrayEdgeFalloff; +uniform float uExposure; uniform int uRenderMask;