1# 9.1.0 Release Notes 2 3Changes made since VTK 9.0.0 include the following. 4 5[](#changes) 6## Changes 7 8[](#changes-charts) 9### Charts 10 11* `vtkChartXYZ` now applies matrix transformations in the right order (see 12 [issue 17542][vtk-issue17542]) 13 14[vtk-issue17542]: https://gitlab.kitware.com/vtk/vtk/-/issues/17542 15 16[](#changes-data) 17### Data 18 19* The node numbering for `VTK_LAGRANGE_HEXAHEDRON` has been corrected to match 20 the numbering of `VTK_QUADRATIC_HEXAHEDRON` when the Lagrange cell is 21 quadratic. Readers can internally convert data to the new numbering with XML 22 file version 2.2 and legacy file version 5.1. The `(0, 1)` edge is swapped 23 with the `(1, 1)` edge: 24 25``` 26 quadratic VTK_QUADRATIC_HEXAHEDRON 27VTK_LAGRANGE_HEXAHEDRON VTK_LAGRANGE_HEXAHEDRON 28 before VTK 9.1 VTK 9.1 and later 29 30 +_____+_____+ +_____+_____+ 31 |\ :\ |\ :\ 32 | + : + | + : + 33 | \ 19 + \ | \ 18 + \ 34 18 + +-----+-----+ 19 + +-----+-----+ 35 | | : | | | : | 36 |__ | _+____: | |__ | _+____: | 37 \ + \ + \ + \ + 38 + | + | + | + | 39 \ | \| \ | \| 40 +_____+_____+ +_____+_____+ 41``` 42 43* `vtkPolyData::ComputeBounds()` used to ignore points that do not belong to 44 any cell which was not consistent with other `vtkPointSet` subclasses. See 45 [ParaView issue #20354][paraview-issue20354]. The previous behavior is 46 available through `vtkPolyData::ComputeCellsBounds()` and 47 `vtkPolyData::GetCellsBounds()` (usually for rendering purposes). 48 49[paraview-issue28354]: https://gitlab.kitware.com/paraview/paraview/-/issues/20354 50 51[](#changes-filters) 52### Filters 53 54* The `VTK::FlowPaths` and `VTK::ParallelFlowPaths` filters now use a 55 `vtkSignedCharArray` rather than a `vtkCharArray` since the latter is 56 ambiguous as to whether it is signed or unsigned. This affects the 57 `protected` API available to subclasses and the usage of the output's 58 `ParticleSourceId` point data array. 59* `vtkStaticCellLocator::FindCellsAlongLine()` now uses a tolerance for 60 intersections with boxes. 61* The tolerance used in `vtkStaticCellLocator` is now retrieved from the 62 locator's tolerance rather than relying on the size of the dataset. Previous 63 behavior may be restored using the `UseDiagonalLengthTolerance` property. 64* `vtkTubeFilter` now increases the radius of tubes linearly with respect to 65 the norm of the input vector when the radius is selected to vary by the 66 vector's norm. 67* `vtkArrayCalculator` has been updated to use C++ containers rather than raw 68 pointers. 69* `vtkArrayCalculator` no longer supports the old `dot` syntax by default and 70 the `dot()` function must be used instead. 71* `vtkArrayCalculator` can now use [`exprtk`][exprtk] to parse expressions (the 72 new default). This brings in functionality, but cannot define functions that 73 return vectors. 74* `vtkArrayCalculator`'s input variable names must now be sanitized or quoted. 75 76[exprtk]: https://github.com/ArashPartow/exprtk 77 78[](#changes-io) 79### I/O 80 81* There is a new `VTK::IOChemistry` module which contains chemistry-related 82 readers. Moved classes: 83 * `vtkCMLMoleculeReader`: from `VTK::DomainsChemistry` 84 * `vtkGaussianCubeReader`: from `VTK::IOGeometry` 85 * `vtkGaussianCubeReader2`: from `VTK::IOGeometry` 86 * `vtkMoleculeReaderBase`: from `VTK::IOGeometry` 87 * `vtkPDBReader`: from `VTK::IOGeometry` 88 * `vtkVASPAnimationReader`: from `VTK::DomainsChemistry` 89 * `vtkVASPTessellationReader`: from `VTK::DomainsChemistry` 90 * `vtkXYZMolReader`: from `VTK::IOGeometry` 91 * `vtkXYZMolReader2`: from `VTK::IOGeometry` 92* `vtkOpenFOAMReader` no longer supports the `include` compatibility keyword 93 (deprecated in 2008). 94* `vtkOpenFOAMReader` no longer treats `uniformFixedValue` as special. Proper 95 support requires logic that would require VTK to use OpenFOAM libraries. 96* `vtkOpenFOAMReader` no longer supports OpenFOAM 1.3 cloud naming (deprecated 97 in 2007). 98 99[](#changes-rendering) 100### Rendering 101 102* `vtkVolumeMapper` and its subclasses now accept `vtkDataSet` input, but 103 ignore any type that is not a `vtkImageData` or `vtkRectilinearGrid` (or 104 their subclasses). Derived classes may need to `SafeDownCast` if the input is 105 assumed to be `vtkImageData`. 106* OpenGL framebuffers are now handled using a `RenderFramebuffer` that is 107 internally managed rather than destinations such as `BackLeft` and `Front`. 108 If `SwapBuffers` is on, then the `RenderFramebuffer` will be blitted to a 109 `DisplayFramebuffer` (twice for stereo rendering). The 110 `vtkOpenGLRenderWindow::BlitToRenderFramebuffer` may be used to blit the 111 current read framebuffer to the render framebuffer to initialize color and 112 depth data. The `vtkOpenGLRenderWindow::FrameBlitMode` property may be set to 113 control the following behavior: 114 * `BlitToHardware`: blit to hardware buffers (such as `BACK_LEFT`) 115 * `BlitToCurrent`: blit to the bound draw framebuffer 116 * `NoBlit`: blitting will be handled externally 117* `vtkTexture`'s API now more closely matches OpenGL's API. Instead of `Repeat` 118 and `EdgeClamp` properties, `Wrap` is provided using values such as 119 `ClampToEdge`, `Repeat`, `MirroredRepeat`, and `ClampToBorder`. A border 120 color may be selected when using `ClampToBorder`. 121 122[](#changes-java) 123### Java 124 125* The `byte`, `short`, `long`, and `float` types may now be exposed in the 126 wrapped Java APIs. The Java API now uses types as close as possible to the 127 C++ types used in the wrapped API. 128 129[](#changes-python) 130### Python 131 132* VTK now defaults to Python 3.x rather than Python 2. 133* The `VTK::WebPython` module no longer supports Python 2. 134* Python 2.6, 3.2, and 3.3 are no longer supported. Python 3.6 or higher is 135 recommended. 136* VTK's web support now requires `wslink>=1.0.0`. This slims down the 137 dependency tree by dropping Twisted in favor of `asyncio` and `aiohttp`. 138* VTK's wheels are now built via CI (rather than by hand). Wheels are available for: 139 * Python versions 3.6, 3.7, 3.8, and 3.9 140 * Platforms `manylinux2014`, `macos10.10`, and `windows` 141 * Python 3.9 also supports `macos11.0` `arm64` 142 * Official wheels do not use any external dependencies, but see 143 [`build.md`][build.md] for instructions on building custom wheels. 144* VTK object `repr()` now shows the address of the underlying C++ 145 `vtkObjectBase` and the Python object itself: 146 * `<vtkmodules.vtkCommonCore.vtkFloatArray(0xbd306710) at 0x69252b820>`. 147* VTK objects which are not derived from `vtkObjectBase` now have a `repr()` 148 that shows the construction method (though this is dependent on how the 149 backing type serializes itself, so it may not be 100% accurate; please file 150 issues for types which look "odd"): 151 * `vtkmodules.vtkCommonCore.vtkVariant("hello")` 152 * `vtkmodules.vtkCommonDataModel.vtkVector3f([1.0, 2.0, 3.0])` 153 154[build.md]: ../dev/build.md 155 156[](#changes-rendering) 157### Rendering 158 159* `vtkTextProperty::LineSpacing` now defaults to `1.0` rather than `1.1`. 160 161[](#changes-infrastructure) 162### Infrastructure 163 164* VTK's deprecation mechanism now marks specific APIs as deprecated so that 165 compilers may warn about its usage. Clients still requiring older APIs can 166 suppress warnings by defining `VTK_DEPRECATION_LEVEL` to 167 `VTK_VERSION_CHECK(x, y, z)` to suppress warnings about APIs deprecated after 168 `x.y.z`. 169 170[](#new-features) 171## New Features 172 173[](#new-features-algorithms) 174### Algorithms 175 176* `vtkFFT` is now available to perform discrete Fourier transformations. 177 178[](#new-features-core) 179### Core 180 181* The `vtkGaussianRandomSequence::GetNextScaledValue()`, 182 `vtkMinimalStandardRandomSequence::GetNextRangeValue()`, and 183 `vtkRandomSequence::GetNextValue()` APIs have been added to avoid the 184 `->Next()`, `->GetValue()` ping-ponging. 185* `vtkVariant::ToString()` and `vtkVariant::ToUnicodeString()` now support 186 formatting and precision arguments when processing numerical values or 187 arrays. 188 189[](#new-features-charts) 190### Charts 191 192* `vtkChartMatrix` may now share `x` and/or `y` axes between charts using the 193 `Link(c1, c2)` and `Unlink(c1, c2)` methods. Labels for the axes may be set 194 using the `LabelOuter(leftBottom, rightTop)` method. 195* `vtkChartMatrix` now supports nested `vtkChartMatrix` items. 196* `vtkChartMatrix::Paint` and `vtkChartMatrix::GetChartIndex` methods have been 197 refactored to use an iterator-based API. 198* `vtkChartXYZ` now resizes dynamically with the scene by managing its 199 margins). Manual calls to `SetGeometry` is no longer necessary. 200* `vtkChartXYZ` now supports removing plots. 201* `vtkChartXYZ` can now turn off its clipping planes to avoid disappearing 202 plots when zooming in. 203* `vtkChartXYZ` can now zoom the axes along with the data. 204* `vtkChartXYZ` now supports axes labels. 205* `vtkChartXYZ` now uses `vtkTextProperty` for its text rendering. 206 207[](#new-features-data) 208### Data 209 210* `vtkDataObjectTypes::TypeIdIsA` may be used to determine if a type is the 211 same as or a specialization of another type. 212* `vtkDataObjectTypes::GetCommonBaseTypeId` may be used to find the first 213 common base class of two types. 214* `vtkPartitionedDataSetCollection` and `vtkDataAssembly` has been introduced 215 to represent hierarchical datasets rather than `vtkMultiBlockDataSet` and 216 `vtkMultiPieceDataSet`. The new `vtkConvertToPartitionedDataSetCollection` 217 filter can be used to convert any dataset into a 218 `vtkPartitionedDataSetCollection` with `vtkDataAssembly` representing any 219 hierarchical organization within a `vtkMultiBlockDataSet`. Converting back 220 may be performed with `vtkPConvertToMultiBlockDataSet` or 221 `vtkConvertToMultiBlockDataSet`. 222* `vtkUnstructuredGrid::GetCell` is now thread-safe. 223 224[](#new-features-documentation) 225### Documentation 226 227* VTK's Doxygen documentation now cross-references pages with the 228 [vtk-examples][vtk-examples] website to examples using the class. Images for 229 the classes are now embedded into the class documentation as well. 230 231![Doxygen Examples](imgs/9.1/Doxygen_CrossReference_Examples.png) 232 233[vtk-examples]: https://kitware.github.io/vtk-examples/site/ 234 235[](#new-features-geometry) 236### Geometry 237 238* The `vtkCell` API now includes support for the 19-node-pyramid named 239 `vtkTriQuadraticPyramid`. Along with the addition of this API, several 240 filters, readers and tests have been updated to incorporate 241 `vtkTriQuadraticPyramid`: 242 - Filters: 243 * `vtkCellValidator` 244 * `vtkUnstructuredGridGeometryFilter` 245 * `vtkReflectionFilter` 246 * `vtkBoxClipDataset` 247 * `vtkCellTypeSource` 248 - Readers: 249 * `vtkIossReader` 250 251[](#new-features-filters) 252### Filters 253 254* `vtk3DLinearGridPlaneCutter` has been updated to also handle cell data. Each 255 triangle of the output dataset contains the attributes of the cell it 256 originated from. Using this class should be faster than using the 257 `vtkUnstructuredGridCutter` or the `vtkDataSetCutter` and should avoid some 258 small projection error. The `vtkCutter` has also been updated to benefit from 259 these changes. 260* `vtkMergeVectorComponents` has been added to the `VTK::FiltersGeneral` module 261 which supports `vtkDataSet` objects and may be used to combine three arrays 262 of components into a new output array. This filter supports multithreading 263 via `vtkSMPTools`. 264* `vtkArrowSource` now has an option to be placed and oriented around its 265 center which makes placing it after scaling and rotation much easier. 266* `vtkDataSetSurfaceFilter` can now extract surfaces from all structured data 267 sets including `vtkImageData`, `vtkStructuredGrid`, and `vtkRectilinearGrid` 268 when they have blanked cells marked using a ghost array. 269* `vtkDataSetSurfaceFilter` has a "fast mode" which only considers the 270 outer-most surface without considering external faces within the outer shell 271 which is intended for rendering purposes. 272* `vtkExtractExodusGlobalTemporalVariables` now supports field data arrays. 273* `vtkExtractEdges` now supports a `UseAllPoints` to use a non-`Locator`-based 274 strategy to skip selecting only the points which are used and instead assumes 275 that all points will be present in the output. 276* The `vtkGhostCellsGenerator` filter is now available to generate ghost cells. 277 It uses DIY for MPI communication internally and can handle any 278 `vtkMultiBlockDataSet`, `vtkPartitionedDataSet`, and 279 `vtkPartitionedDataSetCollection` that is filled with the supported input 280 dataset types including `vtkImageData`, `vtkRectilinearGrid`, 281 `vtkStructuredGrid`, `vtkUnstructuredGrid`, and `vtkPolyData`. Ghost cells 282 are only exchanged with elements of the same type and are treated as the 283 "closest" supported common ancestor class. Note that `vtkHyperTreeGrid` is 284 not supported and `vtkHyperTreeGridGhostCellsGenerator` should be used for it 285 instead. 286* `vtkGroupDataSetsFilter` may be used to combine input datasets into a 287 `vtkMultiBlockDataSet`, `vtkPartitionedDataSet`, or 288 `vtkPartitionedDataSetCollection`. Each input is added as an individual block 289 and may be named using `SetInputName`. 290* `vtkGroupTimeStepsFilter` may be used to turn temporal data into a single 291 `vtkMultiBlockDataSet` or `vtkPartitionedDataSetCollection` with all of the 292 temporal data. The output type is `vtkPartitionedDataSetCollection` unless 293 the input is `vtkMultiBlockDataSet` in which case another 294 `vtkMultiBlockDataSet` is output. 295* `vtkVortexCore`'s output points now include interpolated variables of the 296 input points. 297* `vtkVortexCore` is now fully multithreaded using `vtkSMPTools`. 298* `vtkMergeTimeFilter` may be used to synchronize multiple input temporal 299 datasets. The output is a `vtkMultiBlockDataSet` with one block per input 300 element. The output timestep may be either a union or intersection of the 301 input timestep lists (which may be de-duplicated with either absolute or 302 relative tolerances). 303* `vtkResizingWindowToImageFilter` may be used as an alternative to 304 `vtkWindowToImageFilter` to create screenshots of any size and aspect ratio 305 using the `SetSize(width, height)` method regardless of the window size. Note 306 that offscreen buffers are used and therefore memory usage is higher than 307 `vtkWindowToImageFilter`. Memory usage may be limited using the 308 `SetSizeLimit(width, height)` method (defaulting to `(4000, 4000)`). For 309 images larger than the limit the filter will fallback to 310 `vtkWindowToImageFilter` in order to save memory. 311* `vtkExtractVectorComponents` can now work multithreaded using `vtkSMPTools`. 312* `vtkPartitionedDataSetCollectionSource` is now available to programmatically 313 produce a `vtkPartitionedDataSetCollection`. 314* `vtkThresholdPoints::InputArrayComponent` has been added to enable selection 315 of a single component within the active data array. If a value larger than 316 the number of components is used, the magnitude of each array tuple will be 317 used. 318* `vtkTubeBender` is now provided in order to generate better paths for tubes 319 in `vtkTubeFilter`. This is particularly visible when generating tubes around 320 acute angles. 321* `vtkArrayCalculator` now supports multithreading via `vtkSMPTools`. 322* `vtkVectorFieldTopology` may be used to compute the topological skeleton of a 323 2D or 3D vector field given as a set of critical points and separatrices. 324 Separatrices are lines in 2D and surfaces in 3D (computed via 325 `vtkStreamSurface`). 326* `vtkTableFFT` now offers a frequency column in the output table. 327* `vtkTableFFT` can now compute the FFT per block and then average these 328 results. 329* `vtkTableFFT` can now apply a windowing function before computing the FFT. 330* `vtkMergeCells` can now merge points using double precision tolerances. 331* `vtkTemporalPathLineFilter` can now manage backwards times using its 332 `SetBackwardTime()` method. When using backwards time, each 333 `vtkDataObject::DATA_TIME_STEP()` from subsequent `::RequestData()` method 334 calls will decrease. 335* `vtkPlaneCutter` used to always generate a vtkMultiBlockDataSet regardless of 336 input type. Now `vtkPlaneCutter` decides what the output type will be based 337 on the input type. 338 * If input type is `vtkUniformGridAMR` or `vtkMultiBlockDataSet`, the output 339 type will be `vtkMultiBlockDataSet`. 340 * If input type is `vtkPartitionedDataSetCollection`, the output type will be 341 `vtkPartitionedDataSetCollection`. 342 * If input type is `vtkDataSet` or `vtkPartitionedDataSet`, the output type 343 will be `vtkPartitionedDataSet`. 344* The `RemapPointIds` functor of `vtkRemoveUnusedPoints` has now been 345 multithreaded properly. (#18222) 346 347[](#new-features-imaging) 348### Imaging 349 350* The `vtkImageProbeFilter` works like `vtkProbeFilter`, but is designed for 351 image data. It uses `vtkImageInterpolator` rather than cell and point 352 interpolations. The filter supports SMP acceleration. 353 354[](#new-features-io) 355### I/O 356 357* VTK can now read ADIOS2 files or data streams using [Fides][fides]. This can 358 be provided as a JSON file containing the data model or Fides can generate 359 its own data model automatically (see Fides documentation for details). Fides 360 converts the ADIOS2 data to a VTK-m dataset and the `vtkFidesReader` creates 361 partitioned datasets that contain either native VTK datasets or VTK VTK-m 362 datasets. Time and time streaming is supported. Note that the interface for 363 time streaming is different and requires calling `PrepareNextStep()` and 364 `Update()` for each new step. 365* The `vtkCONVERGECFDReader` has been added to read CONVERGE CFD (version 3.1) 366 files containing meshes, surfaces, and parcels as well as support for time 367 series data. Each stream is considered its own block. Cell and point data 368 arrays may be selected using the `CellArrayStatus` and `ParcelArrayStatus` 369 APIs. Note that parallel support is not yet available. 370* `vtkEnSightGoldBinaryReader` now supports reading undefined and partial 371 variables from per-node and per-element files. 372* VTK's EnSight Gold support can now read asymmetric tensors. This is not 373 supported in EnSight6 files yet. 374* The `vtkIossReader` has been added which supports reading CGNS and Exodus 375 databases and files. The output is provided as a 376 `vtkPartitionedDataSetCollection` with `vtkDataAssembly` representing the 377 logical structure. Note that not all CGNS files are supported; only the 378 subset supported by the backing [IOSS library][ioss]. Eventually, the 379 `vtkExodusIIReader` will be deprecated in preference for this reader. 380* The `vtkMP4Writer` writer may be used to write H.264-encoded MP4 files on 381 Windows using the Microsoft Media Foundation API. The `Rate` property is 382 available to set the framerate and the `BitRate` property may be used to set 383 the quality of the output. 384* `vtkOMFReader` may be used to read [Open Mining Format][open-mining-format] 385 files. The output is a `vtkPartitionedDataSetCollection` with each 386 `vtkPartitionedDataSet` is one OMF element (point set, line set, surface, or 387 volume). 388* `vtkOpenVDBWriter` may be used to write [OpenVDB][openvdb] files. MPI is 389 supported by writing separate files for each rank. Temporal data is also 390 written to a separate file for each timestep. 391* `vtkTGAReader` may be used to read TGA images. 392* `vtkPDBReader` now supports reading PDB files with multiple models. 393* `vtkPDBReader` now generates an array containing the model each atom belongs 394 to. 395* `vtkVelodyneReader` may be used to read Velodyne AMR files. 396 397![AMR-Detonation](imgs/9.1/AMRDetonationVelodyne.png) 398 399* `vtkNrrdReader` can now read gzip-encoded compressed NRRD files. 400* `vtkOpenFOAMReader` now supports reading internal dimensioned fields. 401* `vtkOpenFOAMReader` now supports string expansion syntaxes from OpenFOAM 402 v1806 (`#include`, `<case>`, `<constant>`, `<system>`). 403* `vtkOpenFOAMReader` now handles mixed-precision workflows much more robustly. 404* `vtkOpenFOAMReader` now handles multi-region cases without a default region. 405* `vtkOpenFOAMReader` now respects the `inGroups` boundary entry for selection 406 of multiple patches by group. 407* `vtkOpenFOAMReader` now properly handles empty zones and has basic support 408 for face zones. 409* `vtkOpenFOAMReader` respects point patch value fields suing the correct 410 visitation order. 411* `vtkOpenFOAMReader` no longer has hard-coded limits on polyhedral size. 412* `vtkOpenFOAMReader` now preserves uncollated Lagrangian information. 413* `vtkOpenFOAMReader` now avoids naming ambiguities for Lagrangian and region 414 names using a `/regionName/` prefix for non-default regions. 415 416[fides]: https://gitlab.kitware.com/vtk/fides 417[ioss]: http://gsjaardema.github.io/seacas 418[open-mining-format]: https://omf.readthedocs.io/en/stable/index.html 419[openvdb]: https://www.openvdb.org 420 421[](#new-features-interaction) 422### Interaction 423 424* A new 3D camera orientation widget. The widget's representation is 425 synchronized with the camera of the owning renderer. The widget may be used 426 to select an axis or using its handles. 427* `vtkSelectionNode` now supports `BLOCK_SELECTORS` to select whole blocks from 428 a composite dataset using a selector expression for hierarchy or an 429 associated `vtkDataAssembly` for `vtkPartitionedDataSetCollection`s. 430* Interactive 2D widgets have been added (ported from ParaView). The 431 `vtkEqualizerFilter` and `vtkEqualizerContextItem` are now available using 432 this feature. 433 * Source data: ![Equalizer filter and Interactive 2D](imgs/9.1/interactive_2d_before.png "Equalizer filter") 434 * After applying the filter: ![Equalizer filter and Interactive 2D](imgs/9.1/interactive_2d_after.png "Equalizer filter") 435* VTK's OpenVR's input model has been updated to be action-based and supports 436 binding customization within the OpenVR user interface. This includes 437 controller labeling and user configuration. 438* `vtkEventData` now understands an "Any" device so that handlers can look for 439 all events and do filtering internally. See [merge request 7557][vtk-mr7557] 440 for an example of how to update custom 3D event handling. 441* `vtkResliceCursorWidget` now refreshes when scrolling. 442* Frustum selection of lines and polylines now only considers the line itself, 443 not their containing area (i.e., they were treated as polygons during 444 selection). 445* Selections of `vtkDataAssembly` may be limited to a subset of blocks using a 446 collection of xpath selectors for the dataset. 447* `vtkChartXYZ` can now be controlled using the arrow keys for rotation. 448* `vtkScalarBarActor` now supports custom tick locations via 449 `vtkScalarBarActor::SetCustomLabels()` and 450 `vtkScalarBarActor::SetUseCustomLabels()`. 451 452[vtk-mr7557]: https://gitlab.kitware.com/vtk/vtk/-/merge_requests/7557#e8d22b8c27ce72ddec1110556087c6bd8d15fbec 453 454[](#new-features-java) 455### Java 456 457* Java 1.7 is now required (bumped from 1.6). 458* The wrapped Java API now handles strings more efficiently by handling 459 encoding in the Java wrappers directly. No APIs are affected. 460 461[](#new-features-python) 462### Python 463 464* `vtkPythonInterpreter::SetRedirectOutput` can be used to disable Python 465 output to `vtkOutputWindow`. 466* VTK now offers two CMake options for deployments that can help to handle 467 Python 3.8's DLL loading policy changes on Windows. This allows `import 468 vtkmodules` to handle `PATH` manipulations to ensure VTK can be loaded rather 469 than relying on `vtkpython` to do this work. 470 * `VTK_UNIFIED_INSTALL_TREE`: This option can be set to indicate that VTK 471 will share an install tree with its dependencies. This allows VTK to avoid 472 doing extra work that doesn't need to be done in such a situation. This is 473 ignored if `VTK_RELOCATABLE_INSTALL` is given (there's no difference there 474 as VTK assumes that how VTK is used in such a case is handled by other 475 means). 476 * `VTK_DLL_PATHS`: A list of paths to give to Python to use when loading DLL 477 libraries. 478* Python wrappers will now generate deprecation warnings when the underlying 479 VTK API is deprecated. Since Python silences `DeprecationWarning` by default, 480 the warnings must be allowed via: 481 482```python 483import warnings 484warnings.filterwarnings("default", category=DeprecationWarning) 485``` 486 487* With Python 3.6 and newer, VTK APIs marked with attributes that indicate that 488 paths are expected will now support `pathlike` objects. 489* Wrapped Python APIs now contain docstrings with type hints as described in 490 [PEP 484][pep-484]. This will help with IDE tab completion and hinting. 491* VTK's `vtkmodules` package and `vtk` module now provide `__version__` 492 attributes. 493* The `vtkmodules.web.render_window_serializer` module may be used to 494 additionally serialize `vtkPolyData`, `vtkImageData`, and `mergeToPolyData` 495 optionally using the `requested_fields=['*']` argument. 496 497[pep-484]: https://www.python.org/dev/peps/pep-0484/ 498 499[](#new-features-qt) 500### Qt 501 502* VTK now supports Qt6 using the `VTK_QT_VERSION` variable. This may be set to 503 `Auto` in which case the first of Qt6 or Qt5 found will be used. 504* The `VTK::GUISupportQtQuick` module has been added which supports the 505 necessary integration classes as well as the QML module infrastructure 506 required to import VTK into a QtQuick application. 507 508[](#new-features-rendering) 509### Rendering 510 511* The `vtkOutlineGlowRenderPass` renders a scene as a glowing outline. Combined 512 with layered renderers this creates a very visible highlight without altering 513 the highlighted object. 514* VisRTX and OptiX now offer trace-level debugging information to determine why 515 they may not be available. 516* `vtkMultiBlockUnstructuredGridVolumeMapper` has been added to volume render 517 the entirety of a multi-block unstructured grid without merging them. 518* The physical-based render shader now supports anisotropic materials. This may 519 be modified using the `Anisotropy` and `AnisotropyRotation` properties. 520 Support for these values from a texture is also available. 521* `vtkBlockItem` may now resize itself based on the label specified. 522 Additionally, options for the brush, pen, and text, padding, margins are 523 available. 524* Multi-volume ray-casting now supports shading. 525* `vtkMatplotlibMathTextUtilities` now supports multi-line (using `\n`) and 526 multi-column (using `|` separators) text. `vtkTextProperty` now has a 527 `CellOffset` property to control the spaces between columns (in pixels). 528* The GPU-based ray-casting volume mapper now supports rendering non-uniform 529 rectilinear grids. Volume streaming via block partitioning is not yet 530 supported. 531 532![Rectilinear-Grid-Volume](imgs/9.1/TestGPURayCastMapperRectilinearGrid.png) 533 534* `vtkOpenGLMovieSphere` may be used to display spherical movies using OpenGL. 535 Both regular 360° video and stereo 360° video is supported where stereo 536 streams are split into left and right eye rendering passes. The video is sent 537 to the graphics card as YUV textures which are decoded to RGB in the 538 associated shaders. 539* VTK's VisRTX support is now compatible with OSPRay 2.0. 540* The OpenGL `vtkPolyData` mappers now provide a way to handle jitter 541 introduced by rendering with single-precision vertex coordinates far from the 542 origin. The `PauseShiftScale` parameter may be used to suspend updates during 543 user interactions. 544* `vtkResliceCursorRepresentation::BoundPlane()` is now offered to show the 545 entire resliced image when rotating. 546* `vtkOpenGLPolyDataMapper` now supports a `vtkSelection` object to display 547 selected ids or values directly from the mapper itself. Selections are 548 rendered in a second pass as a wireframe using the 549 `vtkProperty::SelectionColor` color. 550* The GPU-based ray-casting volume mapper now supports direct volume rendering 551 with the blanking of cells and points defined by individual ghost arrays. 552 * Uniform grid with blanking: 553 554![Uniform-Grid-Blanking](imgs/9.1/TestGPURayCastVolumeUniformGridBlanking.png) 555 556 * Image data with ghost cells and points: 557 558![ImageData-Ghost-Arrays](imgs/9.1/TestGPURayCastVolumeGhostArrays.png) 559 560* Volume rendering may now use independent scalar arrays for the `x` and `y` 561 dimensions of 2D transfer functions. 562 563[](#new-features-web) 564### Web 565 566* `render_window_serializer.py` now supports serialization of a 567 `vtkRenderWindow` that contains `vtkVolume`, `vtkVolumeProperty`, or 568 `vtkVolumeMapper`. 569 570[](#new-features-smp) 571### SMP 572 573* `vtkSMPTools::For()` can now be used on iterators and ranges. This can be 574 especially useful for containers that are not indexed such as `std::map` and 575 `std::set`. 576* `vtkSMPTools::LocalScope` may be used to call a `vtkSMPTools` method with a 577 specific configuration within a scope. The configuration structure takes a 578 maximum thread number and/or a backend. 579* `vtkSMPTools` now has an `STDThreads` backend which uses C++'s `std::thread`. 580* `vtkSMPTools::Transform` and `vtkSMPTools::Fill` may be used as replacements 581 for `std::transform` and `std::fill`. 582* Multiple backends may now be compiled into VTK at build time rather than a 583 separate build per backend. The default may be selected using the 584 `VTK_SMP_IMPLEMENTATION_TYPE` CMake variable or the `VTK_SMP_BACKEND_IN_USE` 585 environment variable at runtime. Enabling a backend is controlled by the 586 `VTK_SMP_ENABLE_<backend>` CMake variable at build time. 587* The `VTK_SMP_MAX_THREADS` environment variable is now available to limit the 588 number of threads any SMP task will use. 589* `vtkSMPTools` now supports nested parallelism using the `NestedParallelism` 590 property (defaults to `false`) and the `IsParallelScope` query to detect such 591 scoping. 592 593[](#new-features-wrapping) 594### Wrapping 595 596* Wrapped classes no longer require a `vtk` prefix. 597* Hierarchy files are used exclusively for type checking. 598* The wrapping tools now keep an internal cache of which header files exist 599 where on the system to avoid repeated lookups when resolving `#include` 600 search paths. 601 602[](#new-features-modules) 603### Module System 604 605* The `vtk_module_add_module(NOWRAP_HEADERS)` argument may be used to list 606 public and installed headers which should not be exposed for wrapping 607 purposes. 608* The `vtk_module_add_module(NOWRAP_CLASSES)` argument may be used to list 609 class names for which the headers are treated as `NOWRAP_HEADERS` arguments. 610* The `vtk_module_add_module(HEADER_DIRECTORIES)` argument may be used to 611 indicate that the relative path of headers from the current source or binary 612 directory should be preserved upon installation. 613* The `vtk_module_install_headers(USE_RELATIVE_PATHS)` argument may be used to 614 indicate that the relative path of headers from the current source or binary 615 directory should be preserved upon installation. 616* The `vtk_module_build`, `vtk_module_wrap_python`, and `vtk_module_wrap_java` 617 APIs now support a `UTILITY_TARGET` argument. The target named using this 618 argument will be privately linked into every library created under these 619 APIs. This may be used to provide compile or link options to every target. 620 Note that the target given must be installed, but it may be installed with 621 the same export set given to any of these APIs. 622* The module system now supports target-specific components using the 623 `vtk_module_build(TARGET_SPECIFIC_COMPONENTS)` argument. 624 625[](#new-features-infrastructure) 626### Infrastructure 627 628* VTK plans to hold to a new minor (or major) release every six months with 629 releases in or around April and October each year. 630* VTK now uses GitLab-CI for testing. 631* OSPRay support now detects Apple's Rosetta translation environment and 632 refuses to run due to the environment not supporting instructions used within 633 OSPRay. 634* `vtkGetEnumMacro` and `vtkSetEnumMacro` are now available to work with `enum 635 class` properties. 636* VTK now requires CMake 3.12 to build and to consume. This is mainly due to 637 the usage of `SHELL:` syntax to properly support some MPI use cases. 638* `vtkSOADataArrayTemplate` compilation should use less memory now that its 639 template instantiations are split into separate TU compilations. 640* The `VTK_TARGET_SPECIFIC_COMPONENTS` option may be specified to provide 641 target-specific installation components. 642 643[](#new-features-third-party) 644### Third Party 645 646* An external `ioss` library may now be provided to VTK's build. 647* An external `pegtl` library may now be provided to VTK's build. 648* `exprtk` is now included in VTK (an external copy is supported). 649* `fmt` is now included in VTK (an external copy is supported, though VTK 650 requires patches which have been [merged upstream][fmt-pr2432] but not yet 651 released). 652* VTK's embedded third party packages have been updated: 653 * `cli11` 2.0.0 654 * `eigen` 3.3.9 655 * `exodusII` 2021-05-12 656 * `expat` 2.4.1 657 * `freetype` 2.11.0 658 * `glew` 2.2.0 659 * `hdf5` 1.12.1 660 * `jpeg` 2.1.0 661 * `libxml2` 2.9.12 662 * `lz4` 1.9.3 663 * `lzma` 5.2.5 664 * `mpi4py` 3.0.3 665 * `netcdf` 4.8.0 666 * `ogg` 1.3.5 667 * `pugixml` 1.11.4 668 * `sqlite` 3.36.0 669 * `tiff` 4.3.0 670 671[fmt-pr2432]: https://github.com/fmtlib/fmt/pull/2432. 672 673[](#deprecations) 674## Deprecated and Removed Features 675 676[](#deprecations-legacy) 677### Legacy 678 679Some APIs had been deprecated for a long time. The following APIs are now 680removed. 681 682* `vtkDataArrayTemplate` (deprecated since Dec 2015) 683* `vtkObjectBase::PrintRevisions` and `vtkObjectBase::CollectRevisions` 684 (deprecated since 2012) 685* `VTK___INT64` and `VTK_UNSIGNED___INT64` (deprecated since Mar 2017) 686* `vtkArrayCalculator::SetAttributeMode*` and `VTK_ATTRIBUTE_MODE_*` macros 687 (deprecated in Jun 2017) 688* `vtkContourGrid::ComputeGradients` (deprecated in Dec 2018) 689* `vtkSMPContourGridManyPieces`, `vtkSMPTransform`, 690 `vtkThreadedSynchronizedTemplates3D`, and 691 `vtkThreadedSynchronizedTemplatesCutter3D` (deprecated in Sep 2017) 692* `vtkAbstractImageInterpolator::GetWholeExtent` (deprecated in Mar 2016) 693* `vtkImageStencilData::InsertLine` (an overload) (deprecated in Nov 2014) 694* The `RemoveBlockVisibilites` method from `vtkCompositeDataDisplayAttributes`, 695 `vtkCompositeDataDisplayAttributesLegacy`, and `vtkCompositePolyDataMapper2` 696 (deprecated in Jul 2017) 697* `vtkOpenVRPropPicker` (deprecated in Apr 2018) 698 699[](#deprecations-core) 700### Core 701 702* `vtkLegacy.h` and `VTK_LEGACY_REMOVE` are now deprecated and 703 `vtkDeprecation.h` and its mechanisms should be used instead. 704* Building with kits is no longer supported with static builds. Since the goal 705 of a kit build is to reduce the number of runtime libraries needed at 706 startup, a static kit build does not make much sense. Additionally, some 707 dependency setups could not be resolved in such a build (as witnessed by 708 ParaView) and a proper fix is not easy, so disabling the support makes more 709 sense at this time. 710* The `vtkToolkits.h` header provided preprocessor definitions indicating some 711 features within VTK's build. However, these were inaccurate in 712 single-configure builds since the information was not available when the 713 header was configured. 714 * `VTK_USE_VIDEO_FOR_WINDOWS`: now available in `vtkIOMovieConfigure.h` 715 * `VTK_USE_VFW_CAPTURE`: now available in `vtkIOVideoConfigure.h` as 716 `VTK_USE_VIDEO_FOR_WINDOWS_CAPTURE`, but the old name is given for 717 compatibility. 718* `vtkUnicodeString` and `vtkUnicodeStringArray` are now deprecated since VTK, 719 since 8.2, has assumed UTF-8 for all string APIs. As such, 720 `vtkUnicodeString` and `vtkUnicodeStringArray` did not provide any additional 721 information. Users which used them to convert UTF-8 to UCS-2 for Windows API 722 usages should instead use `VTK::vtksys`'s `SystemTools` APIs for converting 723 such strings. 724* `vtkAtomic` is removed in favor of `std::atomic`. As such, `vtkAtomic.h` and 725 `vtkAtomicTypeConcepts.h` are no longer provided. 726* Threading-related classes are now deprecated in favor of C++11 standard 727 library mechanisms. 728 * `vtkConditionVariable`: `std::condition_variable_any` 729 * `vtkCriticalSection`: `std::mutex` 730 * `vtkMutexLock`: `std::mutex` 731 * `vtkSimpleConditionVariable`: `std::condition_variable_any` 732 * `vtkSimpleCriticalSection`: `std::mutex` 733 * `vtkSimpleMutexLock`: `std::mutex` 734 * `vtkThreadMessanger`: `std::mutex` and `std::condition_variable_any` 735* `vtkSetGet.h` no longer includes `<math.h>`. 736* `vtkVariant.h` methods `Is__Int64` and `IsUnsigned__Int64` were marked 737 deprecated, though they have been unconditionally returning false since 2015. 738 739[](#deprecations-filters) 740### Filters 741 742* `vtkDataSetSurfaceFilter` no longer supports generation of triangle strips. 743 The `vtkStripper` filter may be used to generate them if needed. 744* `vtkConfigure.h` is now deprecated and split into more focused headers. The 745 headers which now contain the information: 746 * `vtkBuild.h`: `VTK_BUILD_SHARED_LIBS` 747 * `vtkCompiler.h`: Compiler detection and compatibility macros. 748 * `vtkDebug.h`: `VTK_DEBUG_LEAKS` and `VTK_WARN_ON_DISPATCH_FAILURE` 749 * `vtkDebugRangeIterators.h`: `VTK_DEBUG_RANGE_ITERATORS` and 750 `VTK_ALWAYS_OPTIMIZE_ARRAY_ITERATORS` 751 * `vtkEndian.h`: `VTK_WORDS_BIGENDIAN` 752 * `vtkFeatures.h`: `VTK_ALL_NEW_OBJECT_FACTORY` and `VTK_USE_MEMKIND` 753 * `vtkLegacy.h`: `VTK_LEGACY_REMOVE`, `VTK_LEGACY_SILENT`, and `VTK_LEGACY` 754 * `vtkOptions.h`: `VTK_USE_64BIT_IDS` and `VTK_USE_64BIT_TIMESTAMPS` 755 * `vtkPlatform.h`: `VTK_REQUIRE_LARGE_FILE_SUPPORT` and `VTK_MAXPATH` 756 * `vtkSMP.h`: `VTK_SMP_${backend}` and `VTK_SMP_BACKEND` 757 * `vtkThreads.h`: `VTK_USE_PTHREADS`, `VTK_USE_WIN32_THREADS`, 758 `VTK_MAX_THREADS` 759 * Also includes `VTK_THREAD_RETURN_VALUE` and `VTK_THREAD_RETURN_TYPE`, but 760 `vtkMultiThreader.h` is guaranteed to provide this. 761* Old ghost cell filters are deprecated in favor of `vtkGhostCellsGenerator`. 762 * `vtkUnstructuredGridGhostCellsGenerator` 763 * `vtkPUnstructuredGridGhostDataGenerator` 764 * `vtkStructuredGridGhostDataGenerator` 765 * `vtkPStructuredGridGhostDataGenerator` 766 * `vtkUniformGridGhostDataGenerator` 767 * `vtkPUniformGridGhostDataGenerator` 768* `vtkThreshold`'s `ThresholdByLower()`, `ThresholdByUpper()`, and 769 `ThresholdBetween()` methods are deprecated in favor of 770 `vtkThreshold::LowerThreshold`, `vtkThreshold::UpperThreshold`, and 771 `vtkThreshold::ThresholdFunction` properties. 772 773[](#deprecations-python) 774### Python 775 776* Python 2 support, which reached its end-of-life in January 2020 is 777 deprecated. 778 779[](#deprecations-soft) 780### Soft deprecations 781 782Some groundwork has been laid down to deprecate existing classes with new 783features in this release, but have not been formally deprecated yet. Users are 784encouraged to use the new APIs to help ensure that the transition when they are 785deprecated is smoother. 786 787* `vtkMultiBlockDataGroupFilter` usage should be replaced by 788 `vtkGroupDataSetsFilter`. 789* `vtkMultiBlockFromTimeSeriesFilter` usage should be replaced by 790 `vtkGroupDataSetsFilter`. 791* `vtkExodusIIReader` usage should be replaced by` vtkIossReader`. 792* The random number APIs from `vtkMath` should be moved to 793 `vtkGaussianRandomSequence` or `vtkMinimalStandardRandomSequence` as needed. 794 795[](#other-changes) 796## Other Changes 797