From 9ec0f9e736759d155cb0310f1b4a42e8e945f89a Mon Sep 17 00:00:00 2001 From: Alexander Rose <alexander.rose@weirdbyte.de> Date: Mon, 5 Jul 2021 13:29:45 -0700 Subject: [PATCH] outline fixes and improvements - better handle outlines in orthographic mode - remove unused code - increase default outline scale to 2 --- CHANGELOG.md | 1 + src/mol-canvas3d/camera.ts | 5 +++-- src/mol-canvas3d/passes/postprocessing.ts | 11 +++++++---- src/mol-gl/shader/postprocessing.frag.ts | 3 --- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abbbb13a0..bacf60eec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Note that since we don't clearly distinguish between a public and private interf ## [Unreleased] +- Fix outline in orthographic mode and set default scale to 2. ## [v2.0.7] - 2021-06-23 diff --git a/src/mol-canvas3d/camera.ts b/src/mol-canvas3d/camera.ts index 100b00c9b..835c9198e 100644 --- a/src/mol-canvas3d/camera.ts +++ b/src/mol-canvas3d/camera.ts @@ -364,8 +364,9 @@ function updateClip(camera: Camera) { near = Math.max(Math.min(radiusMax, 5), near); far = Math.max(5, far); } else { - near = Math.max(0, near); - far = Math.max(0, far); + // not too close to 0 as it causes issues with outline rendering + near = Math.max(Math.min(radiusMax, 5), near); + far = Math.max(5, far); } if (near === far) { diff --git a/src/mol-canvas3d/passes/postprocessing.ts b/src/mol-canvas3d/passes/postprocessing.ts index 785a18b58..bc7491332 100644 --- a/src/mol-canvas3d/passes/postprocessing.ts +++ b/src/mol-canvas3d/passes/postprocessing.ts @@ -250,7 +250,7 @@ export const PostprocessingParams = { }, { cycle: true, description: 'Darken occluded crevices with the ambient occlusion effect' }), outline: PD.MappedStatic('off', { on: PD.Group({ - scale: PD.Numeric(1, { min: 1, max: 5, step: 1 }), + scale: PD.Numeric(2, { min: 1, max: 5, step: 1 }), threshold: PD.Numeric(0.33, { min: 0.01, max: 1, step: 0.01 }), }), off: PD.Group({}) @@ -434,8 +434,12 @@ export class PostprocessingPass { } if (props.outline.name === 'on') { - const factor = Math.pow(1000, props.outline.params.threshold) / 1000; - const maxPossibleViewZDiff = factor * (camera.far - camera.near); + let { threshold } = props.outline.params; + // orthographic needs lower threshold + if (camera.state.mode === 'orthographic') threshold /= 5; + const factor = Math.pow(1000, threshold) / 1000; + // use radiusMax for stable outlines when zooming + const maxPossibleViewZDiff = factor * camera.state.radiusMax; const outlineScale = props.outline.params.scale - 1; ValueCell.updateIfChanged(this.outlinesRenderable.values.uNear, camera.near); @@ -443,7 +447,6 @@ export class PostprocessingPass { ValueCell.updateIfChanged(this.outlinesRenderable.values.uMaxPossibleViewZDiff, maxPossibleViewZDiff); ValueCell.updateIfChanged(this.renderable.values.uMaxPossibleViewZDiff, maxPossibleViewZDiff); - ValueCell.updateIfChanged(this.renderable.values.uOutlineThreshold, props.outline.params.threshold); if (this.renderable.values.dOutlineScale.ref.value !== outlineScale) { needsUpdateMain = true; } ValueCell.updateIfChanged(this.renderable.values.dOutlineScale, outlineScale); } diff --git a/src/mol-gl/shader/postprocessing.frag.ts b/src/mol-gl/shader/postprocessing.frag.ts index 55cdf3062..8bb6b78c1 100644 --- a/src/mol-gl/shader/postprocessing.frag.ts +++ b/src/mol-gl/shader/postprocessing.frag.ts @@ -26,9 +26,6 @@ uniform bool uTransparentBackground; uniform float uOcclusionBias; uniform float uOcclusionRadius; -uniform float uOutlineScale; -uniform float uOutlineThreshold; - uniform float uMaxPossibleViewZDiff; const vec3 occlusionColor = vec3(0.0); -- GitLab