diff --git a/CHANGELOG.md b/CHANGELOG.md index c0607d054e17e2ef030315724ed9d3b935c889dd..0d9bc61ae81788741d433282bf743e973be34fae 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] +- Add ``colorMarker`` option to Renderer. This disables the highlight and select marker at a shader level for faster rendering of large scenes in some cases. - Bind shared textures only once per pass, not for each render item - Fix missing 'material' annotation for some uniforms, causing unnecessary uniform updates - Remove use of ``isnan`` in impostor shaders, not needed and causing slowdown diff --git a/src/mol-canvas3d/canvas3d.ts b/src/mol-canvas3d/canvas3d.ts index 2af6cf0a438d2c36b3585a12660eab8207c619ef..2c20201ff5dea241bdd72243d49ad45ae1613a5b 100644 --- a/src/mol-canvas3d/canvas3d.ts +++ b/src/mol-canvas3d/canvas3d.ts @@ -395,7 +395,7 @@ namespace Canvas3D { y > gl.drawingBufferHeight || y + height < 0 ) return false; - const markingUpdated = resolveMarking(); + const markingUpdated = resolveMarking() && (renderer.props.colorMarker || p.marking.enabled); let didRender = false; controls.update(currentTime); diff --git a/src/mol-geo/geometry/base.ts b/src/mol-geo/geometry/base.ts index ca2ba47d8f0a1a50b974cc56fffd31543e4568bd..d17a47077333819561ef57ceb5234b08b8bee45e 100644 --- a/src/mol-geo/geometry/base.ts +++ b/src/mol-geo/geometry/base.ts @@ -111,6 +111,7 @@ export namespace BaseGeometry { uRoughness: ValueCell.create(props.material.roughness), uBumpiness: ValueCell.create(props.material.bumpiness), dLightCount: ValueCell.create(1), + dColorMarker: ValueCell.create(true), dClipObjectCount: ValueCell.create(clip.objects.count), dClipVariant: ValueCell.create(clip.variant), diff --git a/src/mol-gl/renderable/schema.ts b/src/mol-gl/renderable/schema.ts index 116d56bdf57af4940b00f94b50ac7e8bf5062a3c..a364a1cd4fde6c89feb66594679b6bb9054c9389 100644 --- a/src/mol-gl/renderable/schema.ts +++ b/src/mol-gl/renderable/schema.ts @@ -270,6 +270,7 @@ export const BaseSchema = { ...ClippingSchema, dLightCount: DefineSpec('number'), + dColorMarker: DefineSpec('boolean'), dClipObjectCount: DefineSpec('number'), dClipVariant: DefineSpec('string', ['instance', 'pixel']), diff --git a/src/mol-gl/renderer.ts b/src/mol-gl/renderer.ts index 8c6a4710b764e7be2a87dc7784a67675e15b820f..259e99e16651bed9b82cced4f10bcc610e0d3e4d 100644 --- a/src/mol-gl/renderer.ts +++ b/src/mol-gl/renderer.ts @@ -89,6 +89,7 @@ export const RendererParams = { interiorColorFlag: PD.Boolean(true, { label: 'Use Interior Color' }), interiorColor: PD.Color(Color.fromNormalizedRgb(0.3, 0.3, 0.3)), + colorMarker: PD.Boolean(true, { description: 'Enable color marker' }), highlightColor: PD.Color(Color.fromNormalizedRgb(1.0, 0.4, 0.6)), selectColor: PD.Color(Color.fromNormalizedRgb(0.2, 1.0, 0.1)), highlightStrength: PD.Numeric(0.3, { min: 0.0, max: 1.0, step: 0.1 }), @@ -246,6 +247,10 @@ namespace Renderer { ValueCell.update(r.values.dLightCount, light.count); definesNeedUpdate = true; } + if (r.values.dColorMarker.ref.value !== p.colorMarker) { + ValueCell.update(r.values.dColorMarker, p.colorMarker); + definesNeedUpdate = true; + } if (definesNeedUpdate) r.update(); const program = r.getProgram(variant); @@ -662,6 +667,9 @@ namespace Renderer { ValueCell.update(globalUniforms.uInteriorColor, Color.toVec3Normalized(globalUniforms.uInteriorColor.ref.value, p.interiorColor)); } + if (props.colorMarker !== undefined && props.colorMarker !== p.colorMarker) { + p.colorMarker = props.colorMarker; + } if (props.highlightColor !== undefined && props.highlightColor !== p.highlightColor) { p.highlightColor = props.highlightColor; ValueCell.update(globalUniforms.uHighlightColor, Color.toVec3Normalized(globalUniforms.uHighlightColor.ref.value, p.highlightColor)); diff --git a/src/mol-gl/shader/chunks/apply-marker-color.glsl.ts b/src/mol-gl/shader/chunks/apply-marker-color.glsl.ts index 6f09848c28ae456bf73cf2d39b8895e63fa46c43..2033ca6d93b0cb5aced2ad3ff6f6dd618eb6d3a4 100644 --- a/src/mol-gl/shader/chunks/apply-marker-color.glsl.ts +++ b/src/mol-gl/shader/chunks/apply-marker-color.glsl.ts @@ -1,11 +1,13 @@ export const apply_marker_color = ` -if (marker > 0.0) { - if ((uMarkerPriority == 1 && marker != 2.0) || (uMarkerPriority != 1 && marker == 1.0)) { - gl_FragColor.rgb = mix(gl_FragColor.rgb, uHighlightColor, uHighlightStrength); - gl_FragColor.a = max(gl_FragColor.a, uHighlightStrength * 0.002); // for direct-volume rendering - } else { - gl_FragColor.rgb = mix(gl_FragColor.rgb, uSelectColor, uSelectStrength); - gl_FragColor.a = max(gl_FragColor.a, uSelectStrength * 0.002); // for direct-volume rendering +#if defined(dColorMarker) + if (marker > 0.0) { + if ((uMarkerPriority == 1 && marker != 2.0) || (uMarkerPriority != 1 && marker == 1.0)) { + gl_FragColor.rgb = mix(gl_FragColor.rgb, uHighlightColor, uHighlightStrength); + gl_FragColor.a = max(gl_FragColor.a, uHighlightStrength * 0.002); // for direct-volume rendering + } else { + gl_FragColor.rgb = mix(gl_FragColor.rgb, uSelectColor, uSelectStrength); + gl_FragColor.a = max(gl_FragColor.a, uSelectStrength * 0.002); // for direct-volume rendering + } } -} +#endif `; \ No newline at end of file diff --git a/src/mol-gl/shader/chunks/assign-marker-varying.glsl.ts b/src/mol-gl/shader/chunks/assign-marker-varying.glsl.ts index 361ff36decaa432001944ba7a796b11c99203e02..2548b262849459b8cf038c90e2c18da5f5c6f51b 100644 --- a/src/mol-gl/shader/chunks/assign-marker-varying.glsl.ts +++ b/src/mol-gl/shader/chunks/assign-marker-varying.glsl.ts @@ -1,5 +1,5 @@ export const assign_marker_varying = ` -#if defined(dRenderVariant_color) || defined(dRenderVariant_marking) +#if defined(dNeedsMarker) #if defined(dMarkerType_instance) vMarker = readFromTexture(tMarker, aInstance, uMarkerTexDim).a; #elif defined(dMarkerType_groupInstance) diff --git a/src/mol-gl/shader/chunks/assign-material-color.glsl.ts b/src/mol-gl/shader/chunks/assign-material-color.glsl.ts index 0f206270a5c071ce2a00b501341690acee35b7c3..267fd7334edee0a25328ac783924dd9c21f3862d 100644 --- a/src/mol-gl/shader/chunks/assign-material-color.glsl.ts +++ b/src/mol-gl/shader/chunks/assign-material-color.glsl.ts @@ -1,5 +1,5 @@ export const assign_material_color = ` -#if defined(dRenderVariant_color) || defined(dRenderVariant_marking) +#if defined(dNeedsMarker) float marker = uMarker; if (uMarker == -1.0) { marker = floor(vMarker * 255.0 + 0.5); // rounding required to work on some cards on win 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 877d8663619268257dc392788c63f6beb539a102..3f49073d4250d0973d2a05558171a6ec58c177e4 100644 --- a/src/mol-gl/shader/chunks/common-frag-params.glsl.ts +++ b/src/mol-gl/shader/chunks/common-frag-params.glsl.ts @@ -22,13 +22,15 @@ uniform int uMarkingType; #endif #endif -uniform vec3 uHighlightColor; -uniform vec3 uSelectColor; -uniform float uHighlightStrength; -uniform float uSelectStrength; -uniform int uMarkerPriority; +#if defined(dColorMarker) + uniform vec3 uHighlightColor; + uniform vec3 uSelectColor; + uniform float uHighlightStrength; + uniform float uSelectStrength; + uniform int uMarkerPriority; +#endif -#if defined(dRenderVariant_color) || defined(dRenderVariant_marking) +#if defined(dNeedsMarker) uniform float uMarker; #if __VERSION__ == 100 varying float vMarker; diff --git a/src/mol-gl/shader/chunks/common-vert-params.glsl.ts b/src/mol-gl/shader/chunks/common-vert-params.glsl.ts index b4e3e2c50c604e079ddf150da5d4a823f276580c..a0175b56aa4147e237f9f47c4524860158bab982 100644 --- a/src/mol-gl/shader/chunks/common-vert-params.glsl.ts +++ b/src/mol-gl/shader/chunks/common-vert-params.glsl.ts @@ -29,7 +29,7 @@ uniform int uPickType; #endif #endif -#if defined(dRenderVariant_color) || defined(dRenderVariant_marking) +#if defined(dNeedsMarker) uniform float uMarker; uniform vec2 uMarkerTexDim; uniform sampler2D tMarker; diff --git a/src/mol-gl/shader/chunks/common.glsl.ts b/src/mol-gl/shader/chunks/common.glsl.ts index 785decd348bc5782b60b354ff47f474d107b1081..0df48939f6767eadd3658d1bd4538dbdba3b6f92 100644 --- a/src/mol-gl/shader/chunks/common.glsl.ts +++ b/src/mol-gl/shader/chunks/common.glsl.ts @@ -17,6 +17,10 @@ export const common = ` #define dColorType_varying #endif +#if (defined(dRenderVariant_color) && defined(dColorMarker)) || defined(dRenderVariant_marking) + #define dNeedsMarker +#endif + #define MaskAll 0 #define MaskOpaque 1 #define MaskTransparent 2 diff --git a/src/mol-gl/shader/direct-volume.frag.ts b/src/mol-gl/shader/direct-volume.frag.ts index a6e73a7f3d958ff3b0c192e9444a8bcd14e7ebe5..fd0f3af260fcac42e74d3ab34cd6a6c3203e0043 100644 --- a/src/mol-gl/shader/direct-volume.frag.ts +++ b/src/mol-gl/shader/direct-volume.frag.ts @@ -50,15 +50,17 @@ uniform int uVertexCount; uniform int uInstanceCount; uniform int uGroupCount; -uniform vec3 uHighlightColor; -uniform vec3 uSelectColor; -uniform float uHighlightStrength; -uniform float uSelectStrength; -uniform int uMarkerPriority; - -uniform float uMarker; -uniform vec2 uMarkerTexDim; -uniform sampler2D tMarker; +#if defined(dColorMarker) + uniform vec3 uHighlightColor; + uniform vec3 uSelectColor; + uniform float uHighlightStrength; + uniform float uSelectStrength; + uniform int uMarkerPriority; + + uniform float uMarker; + uniform vec2 uMarkerTexDim; + uniform sampler2D tMarker; +#endif uniform float uMetalness; uniform float uRoughness; @@ -304,11 +306,13 @@ vec4 raymarch(vec3 startLoc, vec3 step, vec3 rayDir) { gl_FragColor.a = material.a * uAlpha * uTransferScale; - float marker = uMarker; - if (uMarker == -1.0) { - marker = readFromTexture(tMarker, vInstance * float(uGroupCount) + group, uMarkerTexDim).a; - marker = floor(marker * 255.0 + 0.5); // rounding required to work on some cards on win - } + #if defined(dColorMarker) + float marker = uMarker; + if (uMarker == -1.0) { + marker = readFromTexture(tMarker, vInstance * float(uGroupCount) + group, uMarkerTexDim).a; + marker = floor(marker * 255.0 + 0.5); // rounding required to work on some cards on win + } + #endif #include apply_marker_color preFogAlphaBlended = (1.0 - preFogAlphaBlended) * gl_FragColor.a + preFogAlphaBlended; diff --git a/src/mol-gl/shader/spheres.frag.ts b/src/mol-gl/shader/spheres.frag.ts index e4f2e39e81a8dc4c53bdc6b2d99d285360e936a5..cf8f8a990be9b9ed8a697021bba245cf294ab834 100644 --- a/src/mol-gl/shader/spheres.frag.ts +++ b/src/mol-gl/shader/spheres.frag.ts @@ -48,7 +48,6 @@ bool Impostor(out vec3 cameraPos, out vec3 cameraNormal){ cameraPos = rayDirection * negT + rayOrigin; - if (calcDepth(cameraPos) <= 0.0) { cameraPos = rayDirection * posT + rayOrigin; interior = true;