diff --git a/src/Admin/WASM/exclude_wasm.txt b/src/Admin/WASM/exclude_wasm.txt index dc354df7b7cc1a88e043414316872f552721c7e4..87800e636f7dd425936b17f689e17c934007c1bc 100644 --- a/src/Admin/WASM/exclude_wasm.txt +++ b/src/Admin/WASM/exclude_wasm.txt @@ -324,3 +324,4 @@ RayCastIsosurface SimpleRayCast CameraOrientationWidget MinIntensityRendering +MultiBlockVolumeMapper diff --git a/src/Cxx.md b/src/Cxx.md index 9dd5e314d23879456fd10ae2b2761d62fdb55758..c980319df820d33c723afd9885f127e397806645 100644 --- a/src/Cxx.md +++ b/src/Cxx.md @@ -1157,6 +1157,7 @@ See [this tutorial](http://www.vtk.org/Wiki/VTK/Tutorials/3DDataTypes) for a bri [RayCastIsosurface](/Cxx/VolumeRendering/RayCastIsosurface) | Isosufaces produced by volume rendering. [SimpleRayCast](/Cxx/VolumeRendering/SimpleRayCast) | Volume rendering of a high potential iron protein. [SmartVolumeMapper](/Cxx/VolumeRendering/SmartVolumeMapper) | Smart volume mapper. +[MultiBlockVolumeMapper](/Cxx/VolumeRendering/MultiBlockVolumeMapper) | Using a vtkMultiBlockVolumeMapper to render a vtkMultiBlockDataSet containing eight subvolumes. ## User Interaction diff --git a/src/Cxx/VolumeRendering/MultiBlockVolumeMapper.cxx b/src/Cxx/VolumeRendering/MultiBlockVolumeMapper.cxx new file mode 100644 index 0000000000000000000000000000000000000000..44c175b9ae0adb8021fcdea3b6adc8aa83912442 --- /dev/null +++ b/src/Cxx/VolumeRendering/MultiBlockVolumeMapper.cxx @@ -0,0 +1,79 @@ +#include <vtkColorSeries.h> +#include <vtkImageData.h> +#include <vtkMultiBlockDataSet.h> +#include <vtkMultiBlockVolumeMapper.h> +#include <vtkNamedColors.h> +#include <vtkNew.h> +#include <vtkRenderWindow.h> +#include <vtkRenderWindowInteractor.h> +#include <vtkRenderer.h> +#include <vtkVolumeProperty.h> + +int main(int argc, char* argv[]) +{ + // set up vtkMultiBlockDataSet (just a bunch of colored blocks): + const int dim[3] = {10, 10, 10}; + double spc[3] = {0.1, 0.1, 0.1}; + vtkNew<vtkMultiBlockDataSet> mb; + vtkNew<vtkColorSeries> colors; + colors->SetColorScheme(vtkColorSeries::BREWER_QUALITATIVE_SET3); + for (int i=0; i<8; ++i) + { + vtkNew<vtkImageData> img; + img->SetDimensions(dim); + img->AllocateScalars(VTK_UNSIGNED_CHAR, 4); + img->SetSpacing(spc); + + // position the volumes by their origin: + // shift object by the length of a volume in the axis directions so as to make them non-overlapping: + std::array<int, 3> ofs{ i % 2, (i / 2) % 2, i / 4 }; + img->SetOrigin( + ofs[0] * (dim[0]-1) * spc[0], + ofs[1] * (dim[1]-1) * spc[1], + ofs[2] * (dim[2]-1) * spc[2] + ); + + // set colors: + auto col = colors->GetColor(i); + for (int x = 0; x < dim[0]; ++x) + { + for (int y = 0; y < dim[1]; ++y) + { + for (int z = 0; z < dim[2]; ++z) + { + for (int c = 0; c < 3; ++c) + { + img->SetScalarComponentFromDouble(x, y, z, c, col[c]); + } + img->SetScalarComponentFromDouble(x, y, z, 3, 255); + } + } + } + mb->SetBlock(i, img); + } + + // setting up the vtkMultiBlockVolumeMapper: + vtkNew<vtkMultiBlockVolumeMapper> volMapper; + volMapper->SetInputDataObject(mb); + vtkNew<vtkVolume> volume; + vtkNew<vtkVolumeProperty> volProp; + volProp->SetIndependentComponents(false); + volume->SetMapper(volMapper); + volume->SetProperty(volProp); + volume->SetVisibility(true); + volume->SetOrientation(30, -45, 0); + + // standard render window and renderer setup: + vtkNew<vtkRenderer> renderer; + vtkNew<vtkNamedColors> namedColors; + renderer->SetBackground(namedColors->GetColor3d("ForestGreen").GetData()); + renderer->AddVolume(volume); + vtkNew<vtkRenderWindow> renWin; + renWin->AddRenderer(renderer); + renWin->Render(); + vtkNew<vtkRenderWindowInteractor> iren; + iren->SetRenderWindow(renWin); + iren->Start(); + + return EXIT_SUCCESS; +} diff --git a/src/Cxx/VolumeRendering/MultiBlockVolumeMapper.md b/src/Cxx/VolumeRendering/MultiBlockVolumeMapper.md new file mode 100644 index 0000000000000000000000000000000000000000..bb4e28dd72af46d2f9d2ba014d6e82e48216062a --- /dev/null +++ b/src/Cxx/VolumeRendering/MultiBlockVolumeMapper.md @@ -0,0 +1,4 @@ +### Description + +This example illustrates using the vtkMultiBlockVolumeMapper to render a +vtkMultiBlockDataSet containing eight 10x10x10 volumes.