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