diff --git a/src/mol-canvas3d/canvas3d.ts b/src/mol-canvas3d/canvas3d.ts index 03bb32c4bd383d003012e680bce95883ea45e752..8b18eef98d3a286bfc22586addecf5bdfcfb0a3f 100644 --- a/src/mol-canvas3d/canvas3d.ts +++ b/src/mol-canvas3d/canvas3d.ts @@ -37,6 +37,7 @@ import { HandleHelperParams } from './helper/handle-helper'; import { StereoCamera, StereoCameraParams } from './camera/stereo'; import { Helper } from './helper/helper'; import { Passes } from './passes/passes'; +import { shallowEqual } from '../mol-util'; export const Canvas3DParams = { camera: PD.Group({ @@ -114,7 +115,7 @@ interface Canvas3D { requestCameraReset(options?: { durationMs?: number, snapshot?: Partial<Camera.Snapshot> }): void readonly camera: Camera readonly boundingSphere: Readonly<Sphere3D> - setProps(props: PartialCanvas3DProps | ((old: Canvas3DProps) => Partial<Canvas3DProps> | void)): void + setProps(props: PartialCanvas3DProps | ((old: Canvas3DProps) => Partial<Canvas3DProps> | void), doNotRequestDraw?: boolean /* = false */): void getImagePass(props: Partial<ImageProps>): ImagePass /** Returns a copy of the current Canvas3D instance props */ @@ -572,7 +573,7 @@ namespace Canvas3D { boundingSphere: scene.boundingSphere, didDraw, reprCount, - setProps: (properties) => { + setProps: (properties, doNotRequestDraw = false) => { const props: PartialCanvas3DProps = typeof properties === 'function' ? produce(getProps(), properties) : properties; @@ -605,12 +606,17 @@ namespace Canvas3D { if (props.cameraResetDurationMs !== undefined) p.cameraResetDurationMs = props.cameraResetDurationMs; if (props.transparentBackground !== undefined) p.transparentBackground = props.transparentBackground; if (props.viewport !== undefined) { - // clear old viewport - renderer.setViewport(x, y, width, height); - renderer.clear(p.transparentBackground); - p.viewport = props.viewport; - updateViewport(); - syncViewport(); + const doNotUpdate = p.viewport === props.viewport || + (p.viewport.name && p.viewport.name && shallowEqual(p.viewport.params, p.viewport.params)); + + if (!doNotUpdate) { + // clear old viewport + renderer.setViewport(x, y, width, height); + renderer.clear(p.transparentBackground); + p.viewport = props.viewport; + updateViewport(); + syncViewport(); + } } if (props.postprocessing) Object.assign(p.postprocessing, props.postprocessing); @@ -624,7 +630,9 @@ namespace Canvas3D { p.camera.stereo.name = 'off'; } - requestDraw(true); + if (!doNotRequestDraw) { + requestDraw(true); + } }, getImagePass: (props: Partial<ImageProps> = {}) => { return new ImagePass(webgl, renderer, scene, camera, helper, props);