From 5b1ffdac521178c95581d34f7a95ffdd0a7f36c9 Mon Sep 17 00:00:00 2001 From: Paul Elliott Date: Fri, 27 Sep 2024 17:24:04 -0400 Subject: [PATCH] feat(ImageSlice): add forceOpacity and forceTransparent To maintain consistent render effect with stacked image slices no matter the opacity of the slices. closes #3126 --- Sources/Rendering/Core/ImageSlice/index.d.ts | 12 ++ Sources/Rendering/Core/ImageSlice/index.js | 6 +- .../ImageSlice/test/testForceOpaque.png | Bin 0 -> 23983 bytes .../ImageSlice/test/testForceRenderPass.js | 128 ++++++++++++++++++ .../ImageSlice/test/testForceTranslucent.png | Bin 0 -> 24807 bytes 5 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 Sources/Rendering/OpenGL/ImageSlice/test/testForceOpaque.png create mode 100644 Sources/Rendering/OpenGL/ImageSlice/test/testForceRenderPass.js create mode 100644 Sources/Rendering/OpenGL/ImageSlice/test/testForceTranslucent.png diff --git a/Sources/Rendering/Core/ImageSlice/index.d.ts b/Sources/Rendering/Core/ImageSlice/index.d.ts index 914dc3f4a83..52f5962bd9f 100755 --- a/Sources/Rendering/Core/ImageSlice/index.d.ts +++ b/Sources/Rendering/Core/ImageSlice/index.d.ts @@ -135,6 +135,18 @@ export interface vtkImageSlice extends vtkProp3D { * @param {vtkImageProperty} property The vtkImageProperty instance. */ setProperty(property: vtkImageProperty): boolean; + + /** + * + * @param {boolean} forceOpaque If true, render during opaque pass even if opacity value is below 1.0. + */ + setForceOpaque(forceOpaque: boolean): boolean; + + /** + * + * @param {boolean} forceTranslucent If true, render during translucent pass even if opacity value is 1.0. + */ + setForceTranslucent(forceTranslucent: boolean): boolean; } /** diff --git a/Sources/Rendering/Core/ImageSlice/index.js b/Sources/Rendering/Core/ImageSlice/index.js index 1e83b8256f2..3cdc5ca3136 100644 --- a/Sources/Rendering/Core/ImageSlice/index.js +++ b/Sources/Rendering/Core/ImageSlice/index.js @@ -179,6 +179,9 @@ const DEFAULT_VALUES = { mapper: null, property: null, + forceOpaque: false, + forceTranslucent: false, + bounds: [...vtkBoundingBox.INIT_BOUNDS], }; @@ -196,7 +199,8 @@ export function extend(publicAPI, model, initialValues = {}) { // Build VTK API macro.set(publicAPI, model, ['property']); - macro.setGet(publicAPI, model, ['mapper']); + macro.setGet(publicAPI, model, ['mapper', 'forceOpaque', 'forceTranslucent']); + macro.getArray(publicAPI, model, ['bounds'], 6); // Object methods diff --git a/Sources/Rendering/OpenGL/ImageSlice/test/testForceOpaque.png b/Sources/Rendering/OpenGL/ImageSlice/test/testForceOpaque.png new file mode 100644 index 0000000000000000000000000000000000000000..6c7067d07c2417e43a675d6b735f4843a65b604f GIT binary patch literal 23983 zcmeGE^*`PJ{|Am^$212sHg(iAV>8{RW0Fh z#?SbGKiHIBJ{pY$rXz+G6hP+aI<4V8tKm1g=>PNmC*DbeMPcC=2MY(Q-mM)adK!g0 zXItK-`|T-j%dY2ia-gWRVvsNt!YV{313ff7teT$?h9(t&$%IA^wTJxg-=0eZK#U>e zf`tG3Sga4;0hs@NUL+J2NY>S-3_kw;&uA-D|9vhLl@1~cldh^J{@?!#h>i&^1@QD5Yd;I_Vi2FtVe;4Zi&rTE!PRN&VlDOaplSFa^yoezO_X2*x z#79WG%#H?&K5+Ic2wrf53Cs29HBEkSBa%(?_^xlNE4|z}@1JbsaCar-38`vwH^FcI z^BvFX$^{<0%k;arq`*p9hP6 zkotK_$}Q$6B8>9bwIy=H%2)`J=i8JDL`b3&4~eN5r5Pqez&tn|FBX4`>g+ifiW0U8 z-j+~*%vD{M);>4&l}nu1M4$5?mIMeYZ+Y|^StxPPPbfBFRX7S(4~v?u48%vOQvr!- z__!QOP3?q+uY@Mo8QRBONC`21P0%_R#PJfdh0rquisg1}W^k)y? zhivrx7iD^-w1G__^k@0}5HSi3R$*_yMNSQGgFAO_LYYI!0#?=$yQ3nUXMs{7VR&Jk zy_g^3F?1E@_+*~hWw0-8+_G5FtOj~bi0I~p#EC_|GbyYK7vn=>_8~JLtfJq=YgmTR z?Gt2F^^DxI(W8ofz8D6{_RqPgnpS{w;Bjcy{dgyKSP*O1<%8o2*KW9?fhCO#qU&pHT?JYz~4JuWiM*P^d>bkD|)5SNtebi_h9TNJ=EWEqlk+3 zT@qhV;d7VG=lt;F54hB?zSpKQfK^!rtMcm{q0mbo+vLNRk;shpY>kkNRUw(J#^=gu zFpZ~l>rnNEK@jl+8_|LuUxJE7Urc2&XAlWC;`8~xn}cD&gEqS1WcCxtz>@!+fo|J* znvZth`~z>5XAY9g3?Ax4vO%Jqbt1mJVRU5OHD<%x@4cFx*7ZZðnlDA&_^ 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 literal 0 HcmV?d00001 diff --git a/Sources/Rendering/OpenGL/ImageSlice/test/testForceRenderPass.js b/Sources/Rendering/OpenGL/ImageSlice/test/testForceRenderPass.js new file mode 100644 index 00000000000..22cde57a8b4 --- /dev/null +++ b/Sources/Rendering/OpenGL/ImageSlice/test/testForceRenderPass.js @@ -0,0 +1,128 @@ +import test from 'tape'; +import testUtils from 'vtk.js/Sources/Testing/testUtils'; + +import vtkImageGridSource from 'vtk.js/Sources/Filters/Sources/ImageGridSource'; +import vtkImageMapper from 'vtk.js/Sources/Rendering/Core/ImageMapper'; +import vtkImageSlice from 'vtk.js/Sources/Rendering/Core/ImageSlice'; +import vtkOpenGLRenderWindow from 'vtk.js/Sources/Rendering/OpenGL/RenderWindow'; +import vtkRenderer from 'vtk.js/Sources/Rendering/Core/Renderer'; +import vtkRenderWindow from 'vtk.js/Sources/Rendering/Core/RenderWindow'; +import vtkColorTransferFunction from 'vtk.js/Sources/Rendering/Core/ColorTransferFunction'; + +import forceOpaqueBaseline from './testForceOpaque.png'; +import forceTranslucentBaseline from './testForceTranslucent.png'; +import { SlicingMode } from '../../../Core/ImageMapper/Constants'; + +const setupSlices = (t) => { + const gc = testUtils.createGarbageCollector(t); + t.ok('rendering', 'vtkOpenGLImageMapper testImage'); + + // Create some control UI + const container = document.querySelector('body'); + const renderWindowContainer = gc.registerDOMElement( + document.createElement('div') + ); + container.appendChild(renderWindowContainer); + + // create what we will view + const renderWindow = gc.registerResource(vtkRenderWindow.newInstance()); + const renderer = gc.registerResource(vtkRenderer.newInstance()); + renderWindow.addRenderer(renderer); + renderer.setBackground(0.32, 0.34, 0.43); + + // ---------------------------------------------------------------------------- + // Test code + // ---------------------------------------------------------------------------- + + const gridSource = gc.registerResource(vtkImageGridSource.newInstance()); + const extent = 200; + const gridSpacing = 32; + const dataSpacing = 4; + const origin = 16; + gridSource.setDataExtent(0, extent, 0, extent, 0, 4); + gridSource.setDataSpacing(dataSpacing, dataSpacing, dataSpacing); + gridSource.setGridSpacing(gridSpacing, gridSpacing, gridSpacing); + gridSource.setGridOrigin(origin, origin, 1); + const direction = [0.866, 0.5, 0, -0.5, 0.866, 0, 0, 0, 1]; + gridSource.setDataDirection(...direction); + + const slice = 0; + + // mapperAbove should show above mapperBelow + // scalars, however, should be correct + const mapperBelow = gc.registerResource(vtkImageMapper.newInstance()); + mapperBelow.setInputConnection(gridSource.getOutputPort()); + mapperBelow.setSlicingMode(SlicingMode.Z); + mapperBelow.setSlice(slice * dataSpacing); + + const mapperAbove = gc.registerResource(vtkImageMapper.newInstance()); + mapperAbove.setInputConnection(gridSource.getOutputPort()); + mapperAbove.setSlicingMode(SlicingMode.Z); + mapperAbove.setSlice(slice * dataSpacing); + + const actorBelow = gc.registerResource(vtkImageSlice.newInstance()); + const rgb = vtkColorTransferFunction.newInstance(); + rgb.addRGBPoint(0, 0, 1, 0); + rgb.addRGBPoint(255, 0, 1, 0); + actorBelow.getProperty().setRGBTransferFunction(rgb); + actorBelow.setMapper(mapperBelow); + actorBelow.setPosition(100, 100, 0); + + const actorAbove = gc.registerResource(vtkImageSlice.newInstance()); + actorAbove.setMapper(mapperAbove); + actorAbove.setPosition(-100, 0, 0); + + renderer.addActor(actorBelow); + renderer.addActor(actorAbove); + renderer.resetCamera(); + + // create something to view it, in this case webgl + const glWindow = gc.registerResource(vtkOpenGLRenderWindow.newInstance()); + glWindow.setContainer(renderWindowContainer); + renderWindow.addView(glWindow); + glWindow.setSize(400, 400); + + return { glWindow, renderWindow, actorAbove, actorBelow, gc }; +}; + +test.onlyIfWebGL('Test ImageMapper forceOpaque', (t) => { + const { glWindow, renderWindow, actorBelow, gc } = setupSlices(t); + + // If this actor is simply just made transparent, then it will show above the actorAbove + actorBelow.getProperty().setOpacity(0.5); + // Make actorBelow get rendered in same pass as actorAbove + actorBelow.setForceOpaque(true); + + glWindow.captureNextImage().then((image) => { + testUtils.compareImages( + image, + [forceOpaqueBaseline], + 'Rendering/OpenGL/ImageSlice', + t, + 0.5, + gc.releaseResources + ); + }); + renderWindow.render(); +}); + +test.onlyIfWebGL.only('Test ImageMapper forceTranslucent', (t) => { + const { glWindow, renderWindow, actorAbove, actorBelow, gc } = setupSlices(t); + + actorBelow.getProperty().setOpacity(0.9); + actorAbove.getProperty().setOpacity(1); + // keep translucent blending + actorAbove.setForceTranslucent(true); + + glWindow.captureNextImage().then((image) => { + testUtils.compareImages( + image, + [forceTranslucentBaseline], + 'Rendering/OpenGL/ImageSlice', + t, + 0.5, + gc.releaseResources + ); + }); + renderWindow.render(); +}); diff --git a/Sources/Rendering/OpenGL/ImageSlice/test/testForceTranslucent.png b/Sources/Rendering/OpenGL/ImageSlice/test/testForceTranslucent.png new file mode 100644 index 0000000000000000000000000000000000000000..6ce4b08c36da86ae87f8f1671d096594303be1e7 GIT binary patch literal 24807 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 l3JQu4^8X0