diff --git a/src/mol-canvas3d/canvas3d.ts b/src/mol-canvas3d/canvas3d.ts index 5c8685584c9bc13a453a5c22be3b52293d4805f3..4a43e3e124732384aa34bef60262ede4c8c99b49 100644 --- a/src/mol-canvas3d/canvas3d.ts +++ b/src/mol-canvas3d/canvas3d.ts @@ -84,6 +84,7 @@ export const Canvas3DParams = { cameraResetDurationMs: PD.Numeric(250, { min: 0, max: 1000, step: 1 }, { description: 'The time it takes to reset the camera.' }), sceneRadiusFactor: PD.Numeric(1, { min: 1, max: 10, step: 0.1 }), transparentBackground: PD.Boolean(false), + dpoitIterations: PD.Numeric(2, { min: 1, max: 1000, step: 1 }), multiSample: PD.Group(MultiSampleParams), postprocessing: PD.Group(PostprocessingParams), @@ -686,6 +687,7 @@ namespace Canvas3D { cameraResetDurationMs: p.cameraResetDurationMs, sceneRadiusFactor: p.sceneRadiusFactor, transparentBackground: p.transparentBackground, + dpoitIterations: p.dpoitIterations, viewport: p.viewport, postprocessing: { ...p.postprocessing }, @@ -823,6 +825,7 @@ namespace Canvas3D { if (props.camera?.stereo !== undefined) Object.assign(p.camera.stereo, props.camera.stereo); if (props.cameraResetDurationMs !== undefined) p.cameraResetDurationMs = props.cameraResetDurationMs; if (props.transparentBackground !== undefined) p.transparentBackground = props.transparentBackground; + if (props.dpoitIterations !== undefined) p.dpoitIterations = props.dpoitIterations; if (props.viewport !== undefined) { const doNotUpdate = p.viewport === props.viewport || (p.viewport.name === props.viewport.name && shallowEqual(p.viewport.params, props.viewport.params)); diff --git a/src/mol-canvas3d/passes/draw.ts b/src/mol-canvas3d/passes/draw.ts index e3ebc363f011ce04d21b50a5b7be4cafcbed55b0..71fe5b9a24ec9011bd33792316a1a4e0924c877f 100644 --- a/src/mol-canvas3d/passes/draw.ts +++ b/src/mol-canvas3d/passes/draw.ts @@ -29,6 +29,7 @@ type Props = { postprocessing: PostprocessingProps; marking: MarkingProps; transparentBackground: boolean; + dpoitIterations: number; } type RenderContext = { @@ -129,7 +130,7 @@ export class DrawPass { } } - private _renderDpoit(renderer: Renderer, camera: ICamera, scene: Scene, transparentBackground: boolean, postprocessingProps: PostprocessingProps) { + private _renderDpoit(renderer: Renderer, camera: ICamera, scene: Scene, iterations: number, transparentBackground: boolean, postprocessingProps: PostprocessingProps) { if (!this.dpoit?.supported) throw new Error('expected dpoit to be supported'); this.colorTarget.bind(); @@ -168,7 +169,7 @@ export class DrawPass { renderer.renderDpoitTransparent(scene.volumes, camera, this.depthTextureOpaque, dpoitTextures); } - for (let i = 0; i < 2; i++) { // not working with 1 pass + for (let i = 0; i < iterations; i++) { dpoitTextures = this.dpoit.bindDualDepthPeeling(); if (scene.opacityAverage < 1) { renderer.renderDpoitTransparent(scene.primitives, camera, this.depthTextureOpaque, dpoitTextures); @@ -330,7 +331,7 @@ export class DrawPass { if (this.wboitEnabled) { this._renderWboit(renderer, camera, scene, transparentBackground, props.postprocessing); } else if (this.dpoitEnabled) { - this._renderDpoit(renderer, camera, scene, transparentBackground, props.postprocessing); + this._renderDpoit(renderer, camera, scene, props.dpoitIterations, transparentBackground, props.postprocessing); } else { this._renderBlended(renderer, camera, scene, !volumeRendering && !postprocessingEnabled && !antialiasingEnabled && toDrawingBuffer, transparentBackground, props.postprocessing); }