OpenVDB 11.0.0
Loading...
Searching...
No Matches
Release Notes

Version 11.0.0 - November 1, 2023

This version introduces ABI changes relative to older major releases, so to preserve ABI compatibility it might be necessary to define the macro OPENVDB_ABI_VERSION_NUMBER=N.

OpenEXR 2 and Python 2 are no longer supported.

OpenVDB:
  • Improvements:
    • Removed use of boost::any in favor of std::any. [Contributed by Brian McKinnon]
  • Bug Fixes:
    • Fix potential crash reading corrupt .vdb files with invalid blosc or zip chunks. [Contributed by Matthias Ueberheide]
NanoVDB:
  • Highlights:
    • Several new tools to generate and modify NanoVDB grids on the GPU.
    • New file format that supports streaming of raw grid buffers.
  • New Features:
    • New memory efficient GridClass::IndexGrid that separates values from tree
    • 4 new GridTypes (Index, OnIndex, IndexMask, OnIndexMask) used by IndexGrid
    • Added createNanoGrid that replaces older conversion methods in GridBuilder.h, IndexGridBuilder.h and OpenToNanoVDB.h
    • Added cudaPointsToGrid that constructs a point device grid from a list of points.
    • Added cudaVoxelsToGrid that constructs a voxel device grid from a list of voxels.
    • Added cuda/CudaUtils.h with several cuda utility functions.
    • Added GpuTimer for timing of kernels in a specific cuda stream.
    • Added cudaIndexToGrid that converts IndexGrids into regular Grids.
    • Added cudaSignedFloodFill that performs signed-flood filling on the GPU.
    • Added cudaAddBlindData that adds blind data to an existing grid on the GPU.
    • Added cudaGridChecksum that computes checksums of device grids.
    • Added cudaGridHandle that handles grids on the GPU.
    • Added cudaNodeManager that constructs a NodeManager on the GPU.
    • Added build type Points and GridType::PointIndex for point grids.
    • Added GridType::Vec3u16 and GridType::Vec3u8 for compressed coordinates.
    • Added PrefixSum.h for concurrent computation of prefix sum on the CPU.
  • API Changes:
    • Version 32.6.0 (ABI is unchanged).
    • Transition from C++11 to C++17
    • Vec3R is deprecated, please use Vec3d instead.
    • nanoToOpenVDB now takes the index of a NanoVDB in a GridHandle.
    • GridData, InternalData and LeafData are now public.
    • GridMetaData can be copied.
    • Improvements to GridBuilder.h that allows construction of grids on CPU.
    • GridHandle's move c-tor now requires the GridBuffer to contain a valid grid.
    • Moved CudaDeviceBuffer.h to cuda/CudaDeviceBuffer.h.
    • New API for acceleration of custom random-access with ValueAccessors.
    • Added BitFlags class for convenient bit-mask operations.
    • Added Vec2/3 min/maxComponentAtomic GPU methods.
    • Added BBox::expandAtomic and BBox::intersectAtomic.
    • Added Coord::expandAtomic.
    • Added Map constructors.
    • Added Mask::DenseIterator, Mask::setOnAtomic, and Mask::setOffAtomic.
    • InternalNode::ChildIterator is now const-correct.
    • Added several new NanoVDB Build Traits.
    • Syncing PNanoVDB.h with NanoVDB.h.
Build:
  • Support for OpenEXR 2.X has been removed.
  • Better support for building with external package configurations with CMAKE_FIND_PACKAGE_PREFER_CONFIG=ON.
Python:
  • Removed Python 2 support. [Contributed by Matthew Cong]
  • Removed explicit bindings for Math types. [Contributed by Matthew Cong]
  • Improved type casting for TypedMetadata. [Contributed by Matthew Cong]

Version 10.1.0 - October 11, 2023
Highlights:
  • OpenVDB Python bindings are now implemented using pybind11 instead of Boost.Python. [Contributed by Matthew Cong]
OpenVDB:
  • New features:
    • Added points::replicate() for the replication of PointDataGrid points and attributes.
  • Improvements:
    • Upgraded OpenVDBs internal half representation to IMath 3.1.6. Brings conversion support using F16C instructions (if enabled using -mf16c) and the removal of the exponent lookup table in favor of bit shifting.
    • OpenVDBs copy of Half.h is no longer built with an internal lookup table, but explicitly selects the non-LUT version and disables the creation of the LUT. This is required to avoid symbol conflicts with different namespaced OpenVDB builds.
    • Removed boost::uuid from Archive, instead std::random_device is used directly to generate UUID-like objects.
    • Moved all cases of file static/global variables which relied on non-trivial construction into function scopes as static locals. These would previously initialize themselves on start-up in a non-deterministic, compiler-dictated order(static-initialization-order-fiasco). This order is now defined by the program's execution.
    • Fixed the constants used in openvdb::math::Coord::hash() and nanovdb::Coord::hash() to correctly be prime numbers (note that this changes the result of these methods). [Contributed by Benedikt Mersch]
    • Updated tools::meshToVolume to take two new optional arguments to provide an interior test oracle and an interior testing method. These allow the default outside-flood-fill to be replaced if the actual sidedness can be known. [Contributed by Tomas Skrivan]
    • LevelSetRebuild now includes example code that demonstrates the intended use of the new meshToVolume interior testing parameters for the resampling of level sets, where the original grid is used as the true sign value. However, due to differences between polygonalization and trilinear interpolation, this behaviour is disabled and exists as a reference.
    • Introduced openvdb::TupleList to wrap std::tuple and provide interface interop methods with openvdb::TypeList.
    • Added OPENVDB_FORCE_INLINE, OPENVDB_LIKELY and OPENVDB_UNLIKELY macros.
    • Introduced openvdb::make_index_sequence to solve clang compilations issues with compiler built-in index_sequence implementations.
  • API changes:
    • Significant infrastructural change to the ValueAccessor header and implementation. All ValueAccessor specializations have been consolidated into a single class which supports all possible ValueAccessor configurations using index_sequences. Backward compatible declarations have been provided. The new ValueAccessor implementation is marked as final.
    • PagedArray iterators no longer derive from std::iterator (but remains standard compliant).
  • Bug Fixes:
    • Internal counters in tree::RangeIterator were limited to 32bit precision. They are now extended to size_t. [Reported by SpaceX]
    • Fixed a bug when compiling with -fvisibility=hidden and GCC 11 which would cause a crash in openvdb::initialize().
    • Fixed a bug with LeafManager which wouldn't correctly initialize its LeafNode array for single level Tree configurations i.e. RootNode<LeafNode> (bug introduced in 7.2.0). [Reported by @lanwatch]
    • Fixed a bug with LeafNodeBool Topology constructor with designated on/off values which wouldn't apply them correctly. [Reported by @hozhaoea]
OpenVDB AX:
  • Improvements:
    • Added support for LLVM 15.
  • Bug Fixes:
    • Fixed a bug in AX on older X86 hardware which could cause a crash when accessing point attributes with half compression (bug introduced in 9.1.0).
    • Fixed an incorrect option in the vdb_ax command line tool where the default optimization level was set to NONE instead of O3 (issue introduced in 10.0.0).
OpenVDB Houdini:
  • Improvements:
    • Added Preserve Holes option to VDB From Polygons that uses the fast winding oracle to not collapse holes in polygonal geometry.
  • Bug Fixes:
    • Fix a bug in the projection mode of the Advect Points SOP that was causing a segfault.
Build:
  • Fixed a build issue where Boost was not being pulled in when OPENVDB_USE_DELAYED_LOADING was set to OFF.
  • Fixed a build issue with AX on 32-bit platforms. [Reported by Mathieu Malaterre]
  • Fixed a compilation issue with the min() and max() methods on Stencils in openvdb/math/Stencils.h. [Reported by Samuel Mauch]
  • Fixed a compilation error that would be encountered when attempting to enable the SSE4.2 or AVX SIMD options on non-x86 based platforms.
  • Improved support for compiling with C++20. [Contributed by Denys Maletskyy and Jérémie Dumas]
  • OpenVDB's CMake no longer modifies the BUILD_SHARED_LIBS variable. [Reported by Maksim Shabunin]
  • Fix int-in-bool-context GCC9+ warnings by switching to use constexpr if.
Version 10.0.1 - November 30, 2022
Bug Fixes:
  • Fixed uninitialized point flags in tools::VolumeToMesh which could result in non-deterministic results (bug introduced in 10.0.0).
Build:
  • Fixed CXX standard requirement for VDB components in FindOpenVDB.cmake

Version 10.0.0 - October 27, 2022

This version introduces ABI changes relative to older major releases, so to preserve ABI compatibility it might be necessary to define the macro OPENVDB_ABI_VERSION_NUMBER=N.

Highlights:
  • Introducing OpenVDBLink, which provides a Mathematica interface to OpenVDB. This link ports over access to various grid containers including level sets, fog volumes, vector grids, integer grids, Boolean grids, and mask grids. Construction, modification, combinations, visualisations, queries, import, export, etc. can be achieved over grids too. Any Mathematica 3D region that's ConstantRegionQ and BoundedRegionQ can be represented as a level set grid, providing a more seamless integration with OpenVDB.
  • Introducing a new command-line tool, dubbed vdb_tool, that can combine any number of the high-level tools available in openvdb/tools. For instance, it can convert a sequence of polygon meshes and particles to level sets, perform a large number of operations on these level set surfaces and export them as adaptive polygon meshes.
OpenVDB:
  • Improvements:
    • Significantly improved the performance of all ValueAccessor methods which access LeafNode value buffer data. This improvement applies to any type which is delay load compatible (all default types except for bool and mask grids) and improves the performance of many OpenVDB tools.
    • Improved the performance of volumeToMesh by 10-15%.
  • ABI changes:
    • ABI change to openvdb::RootNode, which now has a new member that defines the origin of the node. For now this origin is set to a default value of (0,0,0), but in the near future we will allow for offsets to improve access performance and reduce the memory footprints.
    • Removed deprecated virtual methods from AttributeArray.
  • API changes:
    • Removed PagedArray::push_back().
    • Removed Tree visitor methods from Tree, RootNode, InternalNode and LeafNode classes - visit(), visit2(), visitActiveBBox().
    • Removed LeafManager::getNodes().
    • Removed tools::dilateVoxels() and tools::erodeVoxels() in favor of tools::dilateActiveValues() and tools::erodeActiveValues().
    • Removed tools::FindActiveValues::any() and tools::FindActiveValues::none().
    • StringGrid and StringTrees have been removed.
  • Bug Fixes:
    • Fixed an issue with tools::topologyToLevelSet which would previously ignore active tiles in the input topology. [Reported by Tobias Rittig]
    • Fixed a bug with ValueAccessor::addLeaf and ValueAccessor::addTile which wouldn't add the provided leaf nodes to the underlying tree. This bug did NOT affect the specialized accessors which are used by the default tree configuration. [Contributed by Andrey Zakirov]
    • Fixed a bug where ValueAccessor::probeNode<NodeT> and ValueAccessor:probeConstNode<NodeT> would return a nullptr if the NodeT type was not explicitly being cached by the accessor but the node existed in the tree.
    • Fixed a bug on Windows where math::Abs could truncate 64bit integer values. [Contributed by Edward Lam]
    • Fixed an occurrence of undefined behaviour with math::floatToInt32 and math::doubleToInt64. [Reported by Vojtěch Bubník]
    • Fixed bugs in the sum merge that produced incorrect merged grids when deep-copying the input nodes or when non-zero background grids were being used.
    • Fixed a bug in FastSweeping where voxels/tiles are left with min/max float values.
    • Fixed a bug in math/Tuple.h that prevented compilation with VS2017.
OpenVDB AX:
  • Improvements:
    • Major updates to the command line interface of the vdb_ax binary, exposing more controls such as tile streaming, value iterator types and attribute bindings.
OpenVDB Houdini:
  • New Features:
    • Add convex hull activation for VDB Activate SOP (requires 19.5).
  • Improvements:
    • Improved SDF activation to use dynamic node manager.
  • Bug Fixes:
    • Fixed a bug in VDB Visualize SOP where color values that exceed the range wrap around instead of being clamped.
NanoVDB:
  • New Features:
    • Added nanovdb::IndexGrid that allows for arbitrary voxel values and even multiple channels to be associated with NanoVDB grids. They are more flexible and memory efficient than regular grids at a small cost of random-access performance. IndexGrids are constructed with the new nanovdb::IndexGridBuilder and accessed with the new nanovdb::ChannelAccessor.
    • Added iterators to all tree node classes for visiting inactive, active, or all values and child nodes.
    • NanoVDB.h now includes standalone implementations of reading and writing uncompressed nanovdb grids buffers.
    • Added Stats::getExtrema, which computes the min/max values of all voxels in a NanoVDB grid that intersects with a user-defined bounding-box.
    • Added nanovdb::Mask::countOn(int) which is essential to the new nanovdb::IndexGrid.
    • Added RootNode::probeChild and InternalNode::probeChild.
  • Improvements:
    • Added a new much improved nanovdb::NodeManager, that is both faster and more memory efficient, and that works on both the CPU and GPU. Note, it uses a handle for allocation (just like nanovdb::Grid) and replaces the old nanovdb::LeafManager which is now deprecated.
    • NanoToOpenVDB is extended to work with grids templated on Fp4, Fp8, Fp16, FpN, bool and ValueMask.
    • Renamed RootNode::findTile to RootNode::probeTile and made it public.
    • Made Mask::getWord return both a const and non-const reference.
    • Improved unit-tests to use explicit 32B alignment (see alignment bug-fix below).
    • PNanoVDB.h (a C99 port of NanoVDB.h) has been updated.
  • Bug Fixes:
    • Fixed a bug in nanovdb::HostBuffer that could produce crashes due to misaligned CPU memory allocations.
    • Fixed bug related to uninitialized memory in nanovdb::Grid which could confuse CRC32 checksum validation.
    • Fixed bugs related to the use of intrinsic functions for fast bit-counting in nanovdb.
    • Fixed a potential security vulnerability in NanoVDB.h related to buffer overflow exploits.
Build:
  • Added OPENVDB_USE_DELAYED_LOAD flag that enables delayed loading and defaults to on.
  • Add a placeholder to inject the specific revision and URL used to build OpenVDB, useful for 3rd party build scripts to publish their exact versions.
  • Fixed an issue where OPENVDB_AX_DLL was not being defined on shared library builds of AX, resulting in symbols not being exported. [Reported by Ray Molenkamp]
  • Fixed an issue where setting Tbb_INCLUDE_DIR could cause CMake failures.
  • Updated FindTBB.cmake to support newer library ABI suffixing in TBB 2021.5.
  • Updated FindBlosc.cmake to better handle cases where blosc is built with external sources.
  • Resolved LLVM deprecation warnings in AX and added support for LLVM 14.
  • On Windows (MSVC), OpenVDB is now built with extra compiler options to ensure stricter C++ conformance: /permissive- /Zc:throwingNew /Zc:inline.
  • On Windows (MSVC), the _USE_MATH_DEFINES macro is no longer defined when including <openvdb/Platform.h> (or any dependent headers). If you were relying on this in your own project for M_PI, M_PI_2, etc. you can add -D_USE_MATH_DEFINES to your own project compiler options. See this page for more info.

Version 9.1.0 - June 9, 2022
Bug Fixes:
  • Minor fix to move assignment operator in nanovdb/util/HostBuffer.h. This could potentially be a problem on Windows debug builds (unconfirmed).
  • Minor fix to range in openvdb/tools/LevelSetSphere.h. This could result in data races for multi-threaded execution (unconfirmed) [Reported by Tommy Hinks]
  • Fixed a bug with Tree::combineExtended which wouldn't propagate the resulting active state when a destination tile overlapped a source child node. [Reported by @frapit]
  • Fix unit tests failures with Blosc versions >= 1.19.0.
  • Fixed a regression in ax::run which wouldn't propagate exceptions
  • Fixed a bug where ax::ast::parse could return a partially constructed but invalid AST on failure
  • Fixed AX logger exit handling in ax::Compiler::compile and ax::ast::parse
  • Fixed an issue which could result in significant compilation times when instantiating TypeList<>::Unique<>
New features:
  • Added support for AMD's HIP API in NanoVDB [Contributed by Blender Foundation]
  • Added bindings mechanism to AX to allow differing data and AX attribute names (@) in Point and Volume executables.
  • Added support for OpenVDB AX on Windows.
  • Added tools::memUsageIfLoaded() which returns the memory consumption of a deserialized VDB tree, useful if delay-loading is enabled.
  • Added points::rasterizeSpheres() and points::rasterizeSmoothSpheres() variants, new kernels and improved performance for OpenVDB points to surface rasterization.
  • Added points::rasterizeTrilinear() for OpenVDB points, fast staggered or colocated trilinear rasterization for scalar and vector attributes.
  • Exposed TypeList declarations in openvdb.h which denote the default set of types supported by OpenVDB.
  • Added points::FrustumRasterizer for efficient rasterization of OpenVDB points to frustum volumes with optional motion blur.
Improvements:
  • Added a –thread [n] argument to the vdb_ax binary.
  • Added a –copy-file-metadata option to vdb_ax. This behaviour is now off by default.
  • Added support for multiple input files with the vdb_ax binary using -i. Positional arguments as input files are deprecated.
  • Added tools::minMax() which supports multithreaded evaluation of active minimum and maximum values. Grid::evalMinMax() has been deprecated. [Contributed by Greg Hurst]
  • Significant performance improvements to AX point kernels, primarily due to providing AX access to attribute buffers for superior code generation.
  • vdb_print now prints both the in-core memory and total memory usage for VDB grids.
  • Improved build support for MinGW [Contributed by Mehdi Chinoune]
  • Added a new foreach method to TypeList for iterating over types without constructing them.
  • Added TypeList::Transform declaration for transforming TypeLists into new types.
  • Moved Grid::apply implementation to TypeList::apply to allow for other polymorphic types to invoke it.
  • Minor updates to NanoVDB to remove compiler warnings.
Build:
  • Regenerated AX grammar with Flex 2.6.4 and Bison 3.8.2.
  • Improved locating NumPy in CMake when multiple python versions are installed.
  • Fixed an issue which could report Python as missing when using CMake 3.18 and later on some systems. [Reported by Sam James]
  • Changed the way boost_python and boost_numpy are located. Both components must match the major/minor version of python in use. This can be circumvented by providing Boost_PYTHON_VERSION or Boost_PYTHON_VERSION_MAJOR.
  • Relocated OpenVDB binaries to a new openvdb_cmd root directory.
  • FindTBB.cmake now prioritises newer TBB installations.
  • Added option to compress PDB data in MSVC debug builds.
Houdini:
  • Added Attribute Bindings to AX SOP to allow differently named AX attributes (@) and target point attributes/volumes.
  • Fix race condition in OpenVDB Merge SOP that could cause crashes or merged VDBs to not be deleted.
  • VDB Activate SOP no longer stops at the first non-VDB primitive, but instead just skips such primitives.
  • Added VDB Rasterize Frustum SOP for efficient rasterization of OpenVDB points into frustum volumes with optional motion blur.

Version 9.0.0 - October 29, 2021

This version introduces ABI changes relative to older major releases, so to preserve ABI compatibility it might be necessary to define the macro OPENVDB_ABI_VERSION_NUMBER=N, where, for example, N is 7 for Houdini 18.5 and 8 for Houdini 19.0.

Official release of NanoVDB, which for the first time offers GPU support for static sparse volumes in OpenVDB. See the documentation for details.

New features:
  • Faster build times from support for explicit template instantiation, which is enabled by default for most of the tools.
  • Added support for OpenEXR 3 and TBB 2021.
  • Added transient data to the RootNode, InternalNode, and LeafNode.
Improvements:
  • Added tools::countActiveLeafVoxels(), tools::countInactiveVoxels(), tools::countInactiveLeafVoxels() and tools::activeTiles() to perform multi-threaded counting. The Tree methods now use these implementations.
  • Moved from the deprecated TBB task scheduler to TBB arenas. Various methods now respect the TBB arena state they were invoked from.
  • Introduced a new thread/Threading.h header to consolidate calls to third-party threading methods.
  • Minor performance improvements to dilation calls in fast sweeping algorithms.
  • Added hsvtogrb() and rgbtohsv() AX helper functions for converting hue, saturation and value inputs to RGB values and vice-versa.
  • PointDataGrid conversion can now be performed using 32-bit float arrays.
  • Improved support for size_t grid types on systems where size_t is a unique type. [Contributed by Brecht Van Lommel]
  • Add support for dilation in one direction and extending a field in one direction in fast sweeping algorithms.
  • Added PNG support to vdb_render which can be enabled with during CMake with -DUSE_PNG=ON.
  • Explicit template instantiation has been enabled by default for most of the tools. This pre-compiles template instantiations into the core library to reduce the time spent compiling code in downstream libraries or applications.
  • Added a python binding for OpenVDB AX which allows you to invoke accelerated AX code from the python module.
Bug Fixes:
  • Fixed a bug where ax::run() would crash if it could not parse a single statement.
ABI changes:
  • Added transient data to the RootNode, InternalNode, and LeafNode.
API changes:
  • DynamicNodeManager can now set one grain size for threading across leaf nodes and another for threading across non-leaf nodes.
  • StringGrid and StringTrees are deprecated.
  • The NullInterrupter is now a virtual base class to help reduce compile-time instantiation cost.
Houdini:
  • Fix crash in VDB Combine in Copy B mode if the second input has more VDBs than the first.
  • VDB Vector Merge SOP is now VDB Vector From Scalar SOP to distinguish it from the VDB Merge SOP. It keeps the same internal name so this is merely a label change.
  • Add option to pass in OPENVDB_DSO_NAMES to CMake to configure which Houdini DSOs are compiled.
  • VDB Activate SOP now has an option for the expansion pattern to use for dilation.
  • The label for Voxels to Expand is now Expand Voxels to match Houdini.
  • Fix bug to allow VDB LOD SOPs to be chained together.
  • SOP Extrapolate supports dilation in one direction and extending a field in one (domain) direction.
  • The default OpenVDB ABI is now 8 for Houdini versions > 18.5.
  • VDB Visualize Tree SOP is now multi-threaded and provides slicing and color remapping.
  • A new HoudiniInterrupter has been added that derives from the NullInterrupter and the Interrupter is now deprecated. All the SOPs have been updated to use the new HoudiniInterrupter.
  • Add a sanitizer in SOP OpenVDB Extrapolate when expanding a narrow-band level-set with a dilation value of 0, which will result in no operation.
Build:
  • Added support for TBB 2021.
  • Enabled the OPENVDB_FUTURE_DEPRECATION variable by default to warn on upcoming deprecations.
  • Introduced a OPENVDB_DOXYGEN_INTERNAL CMake variable which is ON by default and removes the majority of internal namespaces from the generated doxygen.
  • Improved the doxygen deprecation listings, folder layouts and fixes issues when using later versions of doxygen.
  • Build fixes for MinGW on Windows. [Contributed by Brecht Sanders]
  • Added support for OpenEXR 3. [Contributed by Cary Phillips]
  • Added an OPENVDB_NAMESPACE_SUFFIX CMake string option which provides the ability to customise the VDB namespace.
  • The Python Module now appends the base directory defined by Python_SITELIB to the default install path (typically dist-packages or site-packages). [Contributed by Ignacio Vizzo]
  • As of this release, VFX Reference Platform 2019 is no longer supported. CMake now issues deprecation warnings for 2020 VFX Reference Platform version dependencies.
  • Build fixes for OpenVDB AX with C++17 and greater.
  • Bumped the new blosc version future minimum to 1.17.0.
  • OpenEXR is now optional for vdb_render. It can be enabled with -DUSE_EXR=ON.

Version 8.2.0 - November 24, 2021

Added support for TBB 2021.

Added support for OpenEXR 3. This is contributed by Cary Phillips.

Improvements:
  • Added tools::countActiveLeafVoxels(), tools::countInactiveVoxels(), tools::countInactiveLeafVoxels() and tools::activeTiles() to perform multi-threaded counting. The Tree methods now use these implementations.
  • Moved from the deprecated TBB task scheduler to TBB arenas. Various methods now respect the TBB arena state they were invoked from.
  • Introduced a new thread/Threading.h header to consolidate calls to third-party threading methods.
  • Minor performance improvements to dilation calls in fast sweeping algorithms.
  • Added hsvtogrb() and rgbtohsv() AX helper functions for converting hue, saturation and value inputs to RGB values and vice-versa.
  • PointDataGrid conversion can now be performed using 32-bit float arrays.
  • Improved support for size_t grid types on systems where size_t is a unique type. [Contributed by Brecht Van Lommel]
  • Minor performance improvements to dilation calls in fast sweeping algorithms.
  • Add support for dilation in one direction and extending a field in one direction in fast sweeping algorithms.
API changes:
  • DynamicNodeManager can now set one grain size for threading across leaf nodes and another for threading across non-leaf nodes.
Houdini:
  • Fix crash in VDB Combine in Copy B mode if the second input has more VDBs than the first.
  • VDB Vector Merge SOP is now VDB Vector From Scalar SOP to distinguish it from the VDB Merge SOP. It keeps the same internal name so this is merely a label change.
  • Add option to pass in OPENVDB_DSO_NAMES to CMake to configure which Houdini DSOs are compiled.
  • VDB Activate SOP now has an option for the expansion pattern to use for dilation.
  • The label for Voxels to Expand is now Expand Voxels to match Houdini.
  • Fix bug to allow VDB LOD SOPs to be chained together.
  • SOP Extrapolate supports dilation in one direction and extending a field in one (domain) direction.
  • The default OpenVDB ABI is now 8 for Houdini versions > 18.5.
  • VDB Visualize Tree SOP is now multi-threaded and provides slicing and color remapping.
  • Add a sanitizer in SOP OpenVDB Extrapolate when expanding a narrow-band level-set with a dilation value of 0, which will result in no operation.
Build:
  • Added support for TBB 2021.
  • Enabled the OPENVDB_FUTURE_DEPRECATION variable by default to warn on upcoming deprecations.
  • Introduced a OPENVDB_DOXYGEN_INTERNAL CMake variable which is ON by default and removes the majority of internal namespaces from the generated doxygen.
  • Improved the doxygen deprecation listings, folder layouts and fixes issues when using later versions of doxygen.
  • Build fixes for MinGW on Windows. [Contributed by Brecht Sanders]
  • Added support for OpenEXR 3. [Contributed by Cary Phillips]
  • Added an OPENVDB_NAMESPACE_SUFFIX CMake string option which provides the ability to customise the VDB namespace.
  • The Python Module now appends the base directory defined by Python_SITELIB to the default install path (typically dist-packages or site-packages). [Contributed by Ignacio Vizzo]

Version 8.1.0 - June 11, 2021

As of this release, support for grid ABI=5 has been removed.

New features:
  • Added ::tools::erodeActiveValues() tools::erodeActiveValues, to match the existing ::tools::dilateActiveValues() tools::dilateActiveValues. New erosion tools support all tile policies and edge/vertex neighbor patterns.
  • Added support for automatic filtering of active tiles in ::tools::Filter Filter by setting ::tools::Filter::setProcessTiles Filter::setProcessTiles. Active tiles are densified on demand, only when necessary.
  • Added tools::visitNodesDepthFirst and tools::DepthFirstNodeVisitor which visit nodes in a tree or sub-tree in single-threaded depth-first order.
  • Significant performance improvements to AX volume kernels, primarily due to improved vectorization. Performance scales depending on the available host CPU instruction set and scalability of the AX kernel. Trivial assignments profile upwards of 3x faster on AVX.
  • Introduced Active Tile Streaming for volumes kernels. AX can now dynamically expand and collapse active nodes at all levels of a VDB tree on demand, switching on or off by checking the spatial access pattern of AX programs.
  • Added tools::countActiveVoxels() for multi-threaded counting of active voxels, optionally by bounding box. The Tree::activeVoxelCount() method now uses this implementation.
  • Added tools::memUsage() for multi-threaded counting of bytes of memory used. The Tree::memUsage() method now uses this implementation.
  • Added tools::SumMergeOp that uses a parallel breadth-first algorithm to accelerate summing grids.
Improvements:
  • Significant performance improvements to large dilations with ::tools::dilateActiveValues() tools::dilateActiveValues. Performance gains will improve relative to increases in the inputs size and dilation scheme.
  • Added an optional argument to ::tree::Tree::topologyUnion() Tree::topologyUnion which preserves active tiles on the destination tree should they overlap leaf nodes from the source tree.
  • Reduced the time spent in the hot path of ::initialize() initialize and ::uninitialize() uninitialize by leveraging atomics with double-checked locks. [Contributed by Ben FrantzDale]
  • Extended ::tree::DynamicNodeManager DynamicNodeManager to allow for use with a const tree.
  • Replace tbb::mutex with std::mutex and tbb::atomic with std::atomic as these have now been removed in TBB 2021. [Contributed by Ben FrantzDale].
  • Significant performance improvements to ::tools::activate() tools::activate and ::tools::deactivate() tools::deactivate through use of the DynamicNodeManager to parallelize tile processing.
  • Added degree() and radians() AX helper functions for converting radians to degrees and vice versa, respectively.
  • Added adjoint(), cofactor() and inverse() AX matrix functions.
  • Added sort(), argsort(), isfinite(), isinf() and isnan() AX utility and math functions.
  • Added Vec4 argument support to normalize() AX function.
  • Removed unused int16 AX modulo function signatures.
  • Refactored the backend AX representation of strings with SSO support and heap allocation.
  • Added new methods on the VolumeExecutable to control active tile streaming and node execution levels
  • The deletepoint() AX function is now natively supported by the PointExecutable
  • vdb_view: Fixed a bug which wouldn't reset the camera speed on focus
  • vdb_view: Improved the drawing of PointDataGrids
  • vdb_view: Improved the exception handling of BufferObjects and added support for drawing an array without index values
Bug Fixes:
  • Fix a memory leak in AttributeArray when delayed-loading is disabled.
  • Fixed a crash in OpenVDB AX when declaring arrays with non-scalar elements (unsupported) i.e. {"foo", 1, 2}, {1, {1,2}, 3} etc.
  • Fixed a bug in OpenVDB AX which would cause an error when multiplying a vec3 by a mat4.
  • In OpenVDB AX, improved the error message produced when attempting to use a matrix literal (i.e. {1,2,3...}) in a binary expression (this is invalid but would previously print out bad IR).
  • Fixed a non-deterministic failure in the TestStreamCompression unit test.
  • Use copy-by-reference for the operator in a ::tree::DynamicNodeManager DynamicNodeManager to fix a performance regression.
  • ::tools::deactivate() tools::deactivate now also works with a MaskTree.
  • Fixed a memory leak in the OpenVDB AX parser
  • Fixed an occurrence of undefined behavior in the OpenVDB AX visitor
  • Fixed some memory leaks in the OpenVDB and OpenVDB AX unit tests
  • Fixed a bug in AX which could cause string allocations in loops to overflow the stack
  • Fixed a bug where the ValueOff iterator for the AX VolumeExecutable could remove child branches of a VDB tree.
  • Fixed a crash in the AX Houdini SOP with an empty PointDataGrid input.
  • Fixed all cases where PointIndex and PointData aliases were used instead of a templated type. [Reported by Karl Marrett]
  • Fixed a crash when calling openvdb::points::pointOffsets with an empty PointDataGrid input.
  • Add missing 8-bit and 16-bit attribute type registration.
API changes:
Houdini:
  • Updated the VDB Activate SOP and others to use the multi-threaded implementation for voxel dilation, providing a significant performance increase.
  • Introduced the VDB AX SOP which provides an interface for running OpenVDB AX code in Houdini on VDB grids.
  • Updated the VDB Smooth SOP to support the filtering of active tiles.
  • Fixed a parameter warning in VDB AX SOP.
  • Transfer Surface Attributes in Convert VDB SOP could use uninitialized memory.
  • VDB Activate SOP now uses the multi-threaded ::tools::deactivate() tools::deactivate for much faster performance.
  • Improved the formatting and updated the OpenVDB AX SOPs help card.
  • The AX SOP utilizes the new Active Tile Streaming feature for Volumes. Grids will only be densified in areas where unique values are created.
  • VDB Activate SOP dilation will affect tiles, changing its behavior from previous versions, but producing a more expected result.
  • VDB Activate SOP has a world space dilation option.
  • Introduced the VDB Merge SOP that merges multiple grids in parallel and is faster and more convenient to use than the VDB Combine SOP.
  • Fix a bug where the VDB Rebuild SDF was not preserving metadata from the input grid.
  • Fix a bug in VDB Resample SOP where input transform was not being used for voxel size and voxel scale transform modes.
Build:
  • Dependency on OpenEXR's Half implementation has been removed from the core library by naturalizing the implementation into openvdb::math. This is fully bitwise compatible, but may require switching Half references to math::Half. The USE_IMATH_HALF build configuration can be used to switch back to OpenEXR based half.
  • Blosc, Log4cplus, IlmBase, OpenEXR and TBB find modules now configure release and debug library variants. [Reported by Matthew Cong]
  • Fixed an issue where FindBlosc wouldn't add zstd as a dep in non static builds BLOSC_USE_EXTERNAL_SOURCES.
  • Fixed Log4cplus interface language and missing interface libraries on Win32.
  • Removed Jemalloc and Tbbmalloc logic from the core library builds.
  • The variable CMAKE_MSVC_RUNTIME_LIBRARY is no longer set by the OpenVDB CMake. If CMAKE_MSVC_RUNTIME_LIBRARY is not explicitly provided, OpenVDB configures the static library with /MT(d) and the dynamic library with /MD(d). [Reported by Jérémie Dumas]
  • Added support for ABI=9 and a CMake option OPENVDB_USE_FUTURE_ABI_9 to use it without errors.
  • The value of CONCURRENT_MALLOC is now respected when building the vdb_ax command line binary.
  • Added an option OPENVDB_ENABLE_UNINSTALL to allow the toggling of the uninstall build target. [Contributed by Jérémie Dumas]
  • Improved the behavior of locating static zlib libraries when USE_STATIC_DEPENDENCIES is enabled.
  • Fixed an issue where extra hboost libraries could not be found when building against Houdini 18.5 on Windows.
  • Build fixes to OpenVDB AX for LLVM 12.
  • Re-introduced the OPENVDB_DEPRECATED macro with an additional option that takes a message. Added support to disable deprecations throughout OpenVDB by defining OPENVDB_NO_DEPRECATION_WARNINGS
  • Added an optional OPENVDB_TESTS variable to easily build a subset of the unit tests.
  • Fixed various incorrect RPATH directory paths in CMake (introduced in 8.0.1) [Contributed by Ignacio Vizzo].
  • Removed some unnecessary CMake for vdb_view
  • The Windows defines NOMINMAX and _USE_MATH_DEFINES are now provided in Platform.h.
  • Moved the logic from PlatformConfig.h into Platform.h.
  • The version.h header is now an auto generated header (version.h.in) populated by CMake. The OpenVDB Version and ABI defines are computed from the installation settings. Importantly, the value of OPENVDB_ABI_VERSION_NUMBER now always matches the version used at build time.
  • Added OPENVDB_USE_HALF, OPENVDB_USE_BLOSC and OPENVDB_USE_ZLIB as publicly available defines in version.h. These will be defined depending on the settings used to build OpenVDB.

Version 8.0.1 - February 5, 2021
Bug fixes:
  • Fixed a bug in the new CSG intersection merge algorithm where data outside of the intersection region was not being removed.
Build:
  • Fixed various incorrect RPATH directory paths in CMake
  • Dropped the minimum boost requirement back to 1.61.
  • Documentation installed by the doc target is now installed to the share/doc/OpenVDB prefix
Houdini:
  • VDB Combine SOP no longer attempts to invoke SDF CSG operations on bool grids because unary negation is undefined on bools in the template expansion.

Version 8.0.0 - December 23, 2020

This version introduces ABI changes relative to older major releases, so to preserve ABI compatibility it might be necessary to define the macro OPENVDB_ABI_VERSION_NUMBER=N, where, for example, N is 6 for Houdini 18.0 and 7 for Houdini 18.5.

Official release of OpenVDB AX, a new C++ library that implements a domain specific JIT (just-in-time) compiled expression language, providing users with a new way of interacting with OpenVDB data. AX is tailored towards writing highly parallelizable and customizable OpenVDB volume and point kernel operations. See the documentation for more.

New features:
Improvements:
  • Made LeafManager class non-virtual.
Bug fixes:
  • Fixed a determinism bug in ::tree::NodeManager NodeManager when using non-thread-safe functor members.
  • Fix ::tools::GridTransformer grid transformer tool construction to use correct rotate-scale-translate order when recomposing matrix components. [Contributed by Tom Cnops]
  • OpenVDB AX: Fixed a potential code generation crash in binary, ternary or comma operators when errors occurred in first operand.

ABI changes:
  • ::Grid::isTreeUnique() Grid::isTreeUnique is now virtual as of ABI=8 so that it can be accessed from the GridBase.
  • Private method RootNode::getChildCount() has been removed as of ABI=8.
  • Mark map classes and functions as final for ABI=8 where beneficial to allow devirtualization optimization.
  • As of ABI 8, Vector, Matrix and Quaternion types now satisfy the Trivial Type requirement. Their empty constructors and copy constructors have been removed (and are left to the compiler to define).
  • As of ABI 8, removed an unnecessary specialization of NodeUnion and CopyTraits from NodeUnion.h. Replaced std::is_pod usage with std::is_trivially_copyable which allows more types to benefit from the union storage.
  • As of ABI 8, PointDataGrids use the union NodeUnion specialization, reducing the memory footprint of their topology by 50%.
API changes:
  • Removed a number of deprecated point, volume and AX methods.
Houdini:
  • VDB to Spheres SOP doesn't reset the radius when in worldspace mode. VDB Write SOP should likewise not reset the compression values.
Build:
  • As of this release, VFX Reference Platform 2018 is no longer supported. CMake now issues deprecation warnings for 2019 VFX Reference Platform version dependencies, with the exception that OpenEXR/IlmBase 2.2 is still supported.
  • Added a missing header include to resolve an undefined size_t build error on GCC10.
  • Improved the python module's linkage with the CMake 3.15 Python::Module target. Explicitly linking with the Development target could result in crashes, particularly on macOS. [Reported by Alexander Hagen]
  • Removed OPENVDB_DEPRECATED macro in favor of C++14 [[deprecated]] attribute.

Version 7.2.3 - <March 16, 2021
Bug fixes:
  • Use copy-by-reference for the operator in a DynamicNodeManager to fix a performance regression.

Version 7.2.2 - February 4, 2021
Bug fixes:
  • Fixed a bug in the new CSG intersection merge algorithm where data outside of the intersection region was not being removed.
  • Fix ::tools::GridTransformer grid transformer tool construction to use correct rotate-scale-translate order when recomposing matrix components. [Contributed by Tom Cnops]
Houdini:
  • VDB Combine SOP no longer attempts to invoke SDF CSG operations on bool grids because unary negation is undefined on bools in the template expansion.
  • VDB to Spheres SOP doesn't reset the radius when in worldspace mode. VDB Write SOP should likewise not reset the compression values.

Version 7.2.1 - December 23, 2020
Bug fixes:
Build:
  • Added a missing header include to resolve an undefined size_t build error on GCC10.

Version 7.2.0 - December 9, 2020
New features:
Improvements:
Houdini:
  • Fixed a bug in the OpenVDB Points Convert SOP where the auto voxel transform was ignoring the contents of packed geometry.
  • Fixed a bug in the OpenVDB Points Convert SOP where points representing packed geometry were also being converted.
  • Fixed a bug where a Houdini SOP's verb would not be correctly associated with the corresponding node if the node's internal name was changed.
  • Fixed bug where OpenVDB Convert SOP could revert the name attribute.
Bug Fixes:
  • Fixed a bug which could cause recursive compile time instantiations of TypeList objects, manifesting in longer compile times.
  • Deprecated util::PagedArray::push_back due to a race condition. Instead use util::PagedArray::ValueBuffer::push_back which is faster and thread-safe.
  • Fixed various cases of undefined behavior in some LevelSetUtil methods [Reported by fkemmler]
API changes:
  • Deprecated tree::LeafManager::getNodes. This method is no longer used when constructing a NodeManager from a LeafManager.
  • Deprecated Tree::visitActiveBBox, Tree::visit and Tree::visit2 methods in favor of using a tree::DynamicNodeManager.
  • Removed tools::CsgVisitorBase, tools::CsgVisitorUnion, tools::CsgVisitorIntersection and tools::CsgVisitorDifference. The CSG tools now use the parallel breath-first algorithms.
  • Moved openvdb::TypeList from Types.h into its own header TypeList.h
Build:
  • Removed the Makefiles.
  • Re-organised the repository layout such that each independent library is able to be configured against an existing installation of OpenVDB without ambiguous include paths.
  • Upgraded CMake minimum version support to 3.12.
  • Removed OPENVDB_STATIC_SPECIALIZATION macro which is no longer required.
  • Fixed various compiler warnings for GCC 9.1.
  • Moved to CMake doxygen commands and removed the doxygen-config files for doxygen documentation.
  • Added USE_ZLIB compiler flag that enables zlib compression and defaults to on.
  • Added the OPENVDB_STATICLIB define to all static builds to fix builds on Windows which use the multithread/DLL-specific version of the CRT. [Reported by Tobias Rittig]
  • Core library unit tests use GoogleTest instead of CppUnit.

Version 7.1.0 - August 13, 2020

As of this release, support for grid ABI=4 has been removed.

New features:
Improvements:
  • Added GroupWriteHandle::setUnsafe() for faster performance when the group array is known to be in-core and non-uniform.
  • Add support for default value metadata when creating AttributeArrays or appending to an AttributeSet.
  • Added new group inspection methods to the ::points::AttributeSet::Descriptor AttributeSet::Descriptor.
  • Introduced a ::points::StringMetaCache StringMetaCache class for convenient string attribute metadata lookup and performed some minor optimizations.
  • Removed redundant floor in ::points::floatingPointToFixedPoint floatingPointToFixedPoint.
  • Add gitignore to repository root.
  • Removed some logic for compilers older than Visual Studio 2019.
  • Add a new Houdini ABI test binary.
  • Fixed an indexing typo in tools::Filter. [Contributed by Yuanming Hu]
  • Removed redundant null pointer checks. [Contributed by Kuba Roth]
  • Added support for vdb_view on Windows. Requires GLEW.
  • Removed support for GLFW 2.
  • vdb_view now uses OPENVDB_LOG_FATAL when catching exceptions.
  • vdb_view, vdb_print and vdb_render now use std::terminate() when catching an unknown exception.
  • Removed Boost::thread as a dependency of vdb_view in favour of std::thread.
  • Removed usage of boost/integer.hpp and boost/math/constants/constants.hpp, the latter in favour of new openvdb math constants for pi
  • Removed usage of boost/mpl/*.hpp methods in favour of new template meta-programming methods on the ::TypeList TypeList struct. This now supports get, front, back, contains, index, unique, popback, popfront and range removal of types.
  • Changed the ::tree::NodeChain tree::NodeChain implementation to use an ::TypeList TypeList rather than a boost::mpl::vector and updated all usage of ::tree::NodeChain tree::NodeChain accordingly.
Bug fixes:
  • Fixed a bug where grids with no active values might return true when the method evalActiveVoxelBoundingBox is called. The correct behavior is to only return true if the grid contains any active values.
  • Fixed a sign propagation bug in ::tools::traceExteriorBoundaries() tools::traceExteriorBoundaries used by ::tools::meshToVolume() tools::meshToVolume. This could cause values to not be propagated across node boundaries, leading to voxels incorrectly being marked as inside the isosurface. [Contributed by Tristan Barback]
  • Fixed a rotation order bug in the ::tools::local_util::decompose() decompose utility that caused it to fail to decompose some matrices.
  • Fixed a bug where ::math::Quat::inverse() Quat::inverse was not marked as const. [Contributed by Michael Tao]
  • Fixed a bug in the unit test for util::CpuTimer on Windows by using a more accurate sleep implementation.
  • Fixed a bug where the requested uniform value of an ::points::AttributeArray AttributeArray was not being applied on attribute creation if the default attribute value was not the default value for that value type.
  • Fixed a compiler error when using C++17 by changing std::unexpected() to std::terminate(). [Contributed by Mark Sisson]
API changes:
  • Removed a number of deprecated point methods.
  • points::StringIndexType is now deprecated, use ::Index Index instead.
  • PointPartitioner::voxelOffsets now returns a std::unique_ptr instead of a boost::scoped_array.
  • Renamed AttributeSet::Descriptor::nextUnusedGroupOffset() to AttributeSet::Descriptor::unusedGroupOffset() to allow for providing an optional group offset hint.
Houdini:
  • Platonic SOP is now verbified.
  • Extend all SOP references to support VDB Points.
  • Combine SOP will not error in flatten-all mode if second has no grids.
  • Changed the label (but not the opname) of Resize Narrow Band SOP to match the corresponding native Houdini SOP. The new label is Activate SDF.
  • Fixed a bug by using GEO_Detail::getBBox() instead of GEO_Detail::computeQuickBounds() as the latter was incorrectly using the point of the VDB when computing bounding box. SOPs affected include Clip, Fill, Points Group, Rasterize Points, Read, Remove Divergence. [Contributed by Kuba Roth]
  • OpenVDB from Polygons SOP now always displays the vector UI, as otherwise it might be stuck hidden if the input hasn't cooked.
  • OpenVDB from Polygons and OpenVDB from Particles SOPs no longer require input geometry to have been cooked to offer a choice of attributes, the user may now also type in a value.
Build:
  • Improved the CMake build for the OpenVDB Houdini library on Windows. [Reported by Ian Woodward]
  • Remove some logic for compilers older than Visual Studio 2019.
  • Fixed a bug in the CMake FindIlmBase/OpenEXR modules which could cause compilers on UNIX systems to fail to find stdlib.h if IlmBase/OpenEXR headers were installed to /usr/include.
  • CMake now checks the minimum supported MSVC compiler for Windows.
  • CMake now only requires a CXX compiler.
  • Improved the Windows README instructions and various MSVC warnings.
  • Remove CMake warning when using GLFW 3.2+ on Debian.
  • Various fixes to unary minus on unsigned compiler warnings.
  • The defines _CRT_NONSTDC_NO_WARNINGS and _CRT_SECURE_NO_WARNINGS are now enabled by default with MSVC.
  • New CMake option OPENVDB_BUILD_PYTHON_UNITTESTS to disable or enable the python module tests and fixed the required environment for them on Windows. The python interpreter is no longer required by default if the tests are disabled.
  • Improved the CMake user messages when locating python and numpy.
  • The python module extension is now .pyd on Windows.
  • Fixed some build issues with the Houdini plugin on Windows.
  • Standardized the library components install paths for the OpenVDB Houdini shared library.
  • Added a USE_PKGCONFIG option to CMake to optionally disable use of pkg-config. [Contributed by Kartik Shrivastava]
  • Standardized the dependency search paths in FindPackage modules using GNU install paths.
  • Added better library type detection of dependencies through FindPackage modules on UNIX.
  • Added missing TBB, OpenEXR and IlmBase defines for static builds on Windows through the relevant FindPackage modules.
  • Improved the logic in FindOpenVDB for static builds.
  • Fixed a compiler warning on Apple Clang 11.0 where the ::points::AttributeArray AttributeArray move constructor was being implicitly deleted despite being marked default.
  • Added an option BLOSC_USE_EXTERNAL_SOURCES to FindBlosc to include blosc dependencies as interface libraries.
  • Added a root CMake option USE_STATIC_DEPENDENCIES to force CMake to only locate static libraries on UNIX. On Windows, if enabled, located libraries are assumed to be static.
  • Added support for CMAKE_MSVC_RUNTIME_LIBRARY for compilers that target the MSVC ABI. Requires CMake 3.15 or greater.
  • Fixed an issue where OPENVDB_OPENEXR_STATICLIB was not being defined and OPENEXR_DLL was being defined when linking against static builds of OpenEXR/IlmBase on Windows.
  • Improved the behaviour of boost implicit linking with the Boost::disable_autolinking target.
  • Added support for importing pyopenvdb and openvdb_houdini through the FindOpenVDB CMake module
  • Removed the OPENVDB_2_ABI_COMPATIBLE and OPENVDB_3_ABI_COMPATIBLE macros.
  • Fixed a few GCC compiler warnings by adding override keywords. [Contributed by Edward Lam]
  • jemalloc/tbbmalloc are no longer linked into library artifacts of the OpenVDB CMake build. The CONCURRENT_MALLOC CMake option now only applies to the executables.
  • Introduced a new OpenVDB::openvdb_je interface target through the FindOpenVDB CMake module which adds Jemalloc as a link time dependency.
  • CMake build fix for the vdb_render binary on Windows when building statically and using OpenEXR 2.5

Version 7.0.0 - December 6, 2019

Some changes in this release (see ABI changes below) alter the grid ABI so that it is incompatible with earlier versions of the OpenVDB library, such as the ones built into Houdini up to and including Houdini 18. To preserve ABI compatibility, when compiling OpenVDB or any dependent code define the macro OPENVDB_ABI_VERSION_NUMBER=N, where, for example, N is 5 for Houdini 17.0 and 17.5 and 6 for Houdini 18.0.

As of this release, a C++14 compiler is required and the oldest supported Houdini version is 17.0.

New features:
Improvements:
  • The minimum ABI for OpenVDB is now always enforced through CMake separately from other minimum dependency version variables.
  • Added support for CMake 3.12 compatible Xxx_ROOT variables.
  • Replaced the CMake USE_SYSTEM_LIBRARY_PATHS option with DISABLE_CMAKE_SEARCH_PATHS and removed the hard coded list of SYSTEM_LIBRARY_PATHS in favor of using CMake's default search procedure. SYSTEM_LIBRARY_PATHS can still be used as a global list of paths for all dependency searches.
  • Improvements to OpenVDB's CMake module setup order in regards to CMake policy, minimum version and project calls.
  • Replaced occurrences of boost::scoped_array with std::unique_ptr.
  • Added an OPENVDB_SIMD option to CMake to optionally define SSE4.2 and AVX compiler flags, this is switched off by default.
  • Made various small changes to improve Visual Studio compatiblity and deprecate some logic for compilers older than Visual Studio 2017.
  • Standardized CMake install locations using GNUInstallDirs. Importantly, this changes the default library installation folder from lib to lib64 on some 64-bit systems, or to lib/multiarch-tuple on Debian [Contributed by David Aguilar]
  • Added SIMD intrinsics to a few common NodeMask methods. [Contributed by Konstantin]
Bug fixes:
  • Fixed a bug in FindJemalloc.cmake where paths were not being handled correctly.
  • Fixed a Windows build issue in openvdb_render.
  • Fixed a non deterministic threading bug in ::tools::meshToVolume() mesh to volume during polygon voxelization which could result in different distance values.

ABI changes:
API changes:
Python:
  • Removed the requirement of CMake 3.14 for NumPy usage.
  • Added support for Boost versions 1.65 and later when building the Python module with NumPy support through CMake.
  • Improved CMake Python3 support.
  • The Python Module is now disabled by default in CMake.
Houdini:
  • Fixed a bug in the Points Convert SOP during conversion from Houdini geometry to OpenVDB Points, where point group information could end up corrupted or cause a crash with non-contiguous point offsets (mesh inputs).
  • Threaded the population of point group memberships during conversion from Houdini geometry to OpenVDB Points
  • Added logic to the Rasterize Points SOP to suppress the output of non-finite attribute values due to subnormal input densities.
  • Introduced a position compression option to the Scatter SOP for VDB Points and default to 16-bit fixed point.

Version 6.2.1 - September 30, 2019
Bug fixes:
  • Fixed a crash that arose from an inadvertent ABI change of an I/O class with the 6.2.0 release. The crash occured when attempting to write out a point data grid using an I/O routine from a different version of OpenVDB than the one with which the grid was authored and when one of those OpenVDB versions was 6.2.0.

Version 6.2.0 - September 18, 2019
New features:
  • Added FindActiveValues , which counts the active values in a tree that intersect a given bounding box.
  • Added DelayedLoadMetadata , which stores mask offsets and compression sizes on write to accelerate delayed load reading.
Improvements:
  • LeafNode::modifyValue and LeafNode::modifyValueAndActiveState now modify voxel values in place for improved performance.
  • Added math::isInfinite and math::isNan to resolve Visual Studio compatibility issues with integer types.
  • Made minor performance improvements to moving and filtering VDB points.
  • Improved performance related to a mutex contention when appending multiple AttributeArray s in parallel through various point operations.
  • Significantly improved the performance of ::tools::createLevelSetSphere() createLevelSetSphere using threading.
  • Improved directory and file path lookups of some CMake commands in the root CMakeLists.txt. [Reported by Daniel Elliott]
  • Improved CMake support for GLFW versions 3.1 and later.
  • FindOpenVDB.cmake now correctly propagates CXX version requirements.
  • Added CMake support for linking against Jemalloc and TBB malloc and enabled Jemalloc by default for Linux and non-Maya builds and TBB malloc for all other builds.
  • Added a USE_COLORED_OUTPUT option to CMake to display compiler output in color.
  • Added an OPENVDB_CODE_COVERAGE option to CMake.
  • CMake now automatically detects and configures the CXX11 ABI requirement for Houdini builds.
  • CMake now issues deprecation warnings for 2017 VFX Reference Platform version dependencies. In particular, C++11-only compilers are now deprecated; OpenVDB 7.0 will require a C++14-compatible compiler.
Bug fixes:
  • Replaced std::vector with std::deque as the underlying container for PagedArray , to address a rare crash when reading from multiple threads while writing from another thread.
  • Fixed a bug that could cause an empty CoordBBox to report nonzero volume.
  • Fixed a bug in computeScalarPotential that could produce a corrupt result due to invalid memory access. [Reported by Edwin Braun]
  • Partially reverted the ClosestSurfacePoint tool’s distance calculations to their pre-OpenVDB 5.0 behavior to address a bug in the fillWithSpheres tool that caused generated spheres to sometimes extend outside the target volume.
  • CMake now correctly sets rpaths for the unit test binary.
  • Addressed a Valgrind warning by allocating the point attribute array registry using a Meyers singleton. [Contributed by Autodesk]
ABI changes:
  • ABI versions 3 and older are now deprecated, and support for them will be removed in a future release. Until then, define the macro OPENVDB_USE_DEPRECATED_ABI (or set the CMake OPENVDB_USE_DEPRECATED_ABI option to ON) to suppress deprecation messages when compiling OpenVDB or dependent code.
API changes:
  • Changed RandomLeafFilter::LeafMap from a std::map to a std::unordered_map.
  • Removed the TableT template argument from PagedArray . The table type is now hardcoded to std::deque.
  • The minimum supported version of GLFW is now 3.1.
Python:
  • CMake now always produces a .so for the Python module on Linux and Unix platforms.
  • Fixed a compile-time error when building the Python module for Python 3. [Reported by yurivict]
Houdini:
  • OpenVDB SOPs are now displayed in an ASWF sub-menu of the VDB tab menu.
  • Added API documentation and examples.
  • Added GEOvdbApply , which invokes a functor on a VDB primitive if the resolved grid type is a member of a given type list.
  • Fixed a regression in the Fill SOP that caused it to modify VDBs in the input detail.
  • The Combine SOP no longer crashes in Copy B mode when the destination is not a VDB.
  • Added an OpFactory::addSpareData method and addOperatorSpareData and getOperatorSpareData functions to manage spare data associated with operator types.
  • Added an opsparedata HScript command and hou.NodeType.spareData and hou.NodeType.spareDataDict methods to retrieve spare data associated with operator types.
  • Added a pythonrc.py startup script to set the tab menu visibility of nodes and their native Houdini equivalents, based on an OPENVDB_OPHIDE_POLICY environment variable.
  • Added an OpFactory::setInvisible method to hide nodes from tab menus.
  • Added an OpenVDBOpFactory::setNativeName method to pair OpenVDB nodes with their native Houdini equivalents.
  • Added an OpPolicy::getTabSubMenuPath method to allow OpPolicy subclasses to provide their own tab sub-menu path.
  • OpenVDB nodes now override OP_Operator::getVersion to return a version string of the form "vdb6.2.0 houdini18.0.222".

Version 6.1.0 - May 8, 2019

As of this release, the oldest supported Houdini version is 16.5.

New features:
Improvements:
  • ::util::CpuTimer CpuTimer now makes use of ::util::printTime() printTime for nicer output, and its API has been improved.
  • Significantly improved the performance of point data grid string attribute generation.
  • ::points::AttributeArray::copy() AttributeArray::copy and the ::points::AttributeArray::operator=() AttributeArray copy assignment operator are now thread-safe.
  • The command-line tools (vdb_print, etc.) now include the library ABI version in their -version output.
  • Further improved the responsiveness of the mesh to volume converter to interrupt requests.
  • The CMake build system has been significantly improved to support a wider range of build options and use cases. This includes better dependency handling and status reporting, find module installation for external use, more robust handling of different platform configurations and the introduction of dependency and build documentation.
Bug fixes:
API changes:
Houdini:
  • The Points Convert SOP now reports NaN Positions as warnings when converting from Houdini Points to VDB Points.
  • Fixed a bug where the Points Convert SOP was incorrectly ignoring point attributes with the same name as an existing point group.
  • The Transform SOP now supports frustum transforms by applying the transformation to the internal affine map.
  • Changed the labels (but not the opnames) of several SOPs to match the corresponding native Houdini SOPs. The new labels are Morph SDF, Project Non-Divergent, Rebuild SDF, Renormalize SDF, Reshape SDF, Segment by Connectivity, Smooth SDF, Topology to SDF, and Visualize Tree.
  • Added an OpPolicy::getFirstName method to allow OpPolicy subclasses to provide their own first name scheme.
  • Added an OpPolicy::getLabelName method to allow OpPolicy subclasses to provide their own label naming scheme for tab menus.
  • Added type lists for sets of commonly used grid types, including ScalarGridTypes, Vec3GridTypes, AllGridTypes, etc.
  • The Vector Merge SOP now copies metadata from the representative scalar grid.
  • Deprecated SOP_NodeVDB::duplicateSourceStealable, houdini_utils::getNodeChain and houdini_utils::OP_EvalScope.
Python:

Version 6.0.0 - December 18, 2018

Some changes in this release (see ABI changes below) alter the grid ABI so that it is incompatible with earlier versions of the OpenVDB library, such as the ones built into Houdini up to and including Houdini 17. To preserve ABI compatibility, when compiling OpenVDB or any dependent code define the macro OPENVDB_ABI_VERSION_NUMBER=N, where, for example, N is 3 for Houdini 15, 15.5 and 16, 4 for Houdini 16.5 and 5 for Houdini 17.0.

New features:
Improvements:
  • Improved the responsiveness of the mesh to volume converter to interrupt requests.
  • Attempts to use a partially deserialized ::points::AttributeArray AttributeArray now errors.
  • Updated point deletion to use faster batch copying for ABI=6+.
  • Methods relating to in-memory Blosc compression for AttributeArray::compress() now do nothing and have been marked deprecated resulting in memory savings for ABI=6+.
Bug fixes:
  • Fixed various signed/unsigned casting issues to resolve compiler warnings when moving points in point data grids.

ABI changes:
API changes:
  • Removed a number of methods that were deprecated in version 5.0.0 or earlier.
  • Removed the experimental ValueAccessor::newSetValue method.
  • Deprecated AttributeArray::compress() methods relating to in-memory Blosc compression.
Houdini:
  • The Convert and To Polygons SOPs now correctly transfer vertex attributes when the output is a polygon soup.
  • Added an option to the Visualize SOP to display leaf nodes as points.
  • Renamed the Visualize SOP’s leafmode, internalmode, tilemode and voxelmode parameters to leafstyle, internalstyle, etc. and converted them from ordinals to strings.
  • Made various improvements to viewport rendering of point data grids.
  • Added a ParmFactory::setInvisible method to allow parameters to be marked as hidden. This is useful for multi-parms, whose child parameters cannot be made obsolete.
  • Removed the option to use in-memory Blosc compression from the Points Convert SOP as this feature has now been deprecated.
  • Made various small changes for Houdini 17 compatibility.

Version 5.2.0 - August 13, 2018
New features:
  • Added tools to advect points stored in point data grids through velocity fields. [Contributed by Dan Bailey]
  • For point data grids, voxel data can now be ::points::prefetch() prefetched independently of position or other attributes. [Contributed by Dan Bailey]
  • Added tools to sample voxel values onto points stored in point data grids. [Contributed by Double Negative]
Improvements:
  • The ::tools::UniformPointScatter UniformPointScatter tool now generates points in “points per volume” mode even when the product of the density and the voxel volume is less than one, and the point count now varies continuously with the density.
  • Added a minimum/maximum sphere count argument to the ::tools::fillWithSpheres() fillWithSpheres tool. (The previous version, now deprecated, supported only a maximum sphere count.)
  • Added a method to the level set tracking tool to enable and disable ::tools::LevelSetTracker::setTrimming() trimming of voxels outside the narrow band. Previously, trimming was always enabled, which caused dense SDFs to be converted to narrow-band level sets.
  • Added state methods to point data index filters to improve optimization opportunities. [Contributed by Dan Bailey]
  • Added ::points::ActiveFilter active and ::points::InactiveFilter inactive value mask point data index filters. [Contributed by Dan Bailey]
  • Replaced include/exclude group list parameters with filter functors in various point data functions. [Contributed by Dan Bailey]
  • Refactored and simplified the point count API. [Contributed by Dan Bailey]
  • Computing cumulative per-leaf point offsets is now parallelized. [Contributed by Dan Bailey]
  • Made various small changes for Visual Studio 2017 compatibility. [Contributed by Edward Lam]
Bug fixes:
  • Fixed a bug that could cause an infinite loop when iterating over an empty root node.
  • Fixed namespace-related bugs in ::math::Tuple::isZero() Tuple::isZero and ::math::Mat::isZero() Mat::isZero that led to compile-time errors.
  • Fixed type conversion bugs in the vector-to-vector rotation function that made it impossible for it to return a single-precision rotation matrix, and modified the function to accept Vec3 arguments of any value type.
  • Fixed a bug in the mesh to volume converter that made it uninterruptible in certain cases even though an interrupter was provided. [Reported by Doug Epps]
Houdini:
  • Added an option to the From Particles SOP to output an interior mask grid.
  • Added options to the Metadata SOP to set the grid name and to propagate metadata to primitive attributes and vice-versa.
  • Modified convertVolumesToVDBs to set the output VDBs’ grid names to the names of the volume primitives.
  • Added an option to the Offset Level Set, Renormalize Level Set, Smooth Level Set and Resize Narrow Band SOPs to enable and disable trimming of voxels outside the narrow band. Previously, trimming was always enabled, which caused dense SDFs to be converted to narrow-band level sets.
  • Fixed a bug in the Resample SOP that prevented it from reading a reference VDB from the second input.
  • Added an option to the Scatter SOP to scatter points only on an isosurface of a signed distance field.
  • The Scatter SOP now generates points in Point Density mode even when the product of the density and the voxel volume is less than one, and the point count now varies continuously with the density.
  • Added a minimum sphere count option to the To Spheres SOP.
  • Added enable/disable toggles to the To Spheres SOP’s minimum and maximum radius parameters and eliminated the world space radius parameters. The remaining minimum and maximum parameters, formerly the voxel space radii, are now used in both world unit and voxel unit modes.
  • Added transform and rotation order options to the Transform SOP.
  • Added support to the Advect Points SOP for advecting points stored in point data grids. [Contributed by Dan Bailey]
  • Added support to the Sample Points SOP for sampling onto points stored in point data grids. [Contributed by Double Negative]

Version 5.1.0 - April 10, 2018
New features:
Improvements:
Python:
  • Fixed a bug introduced in version 3.2.0 that caused boolean and integer values added to a grid’s metadata to be stored as floating-point values.
Houdini:
  • Added options to the Clip SOP to expand or shrink the clipping region and, when clipping to a camera frustum, to set the near and far clipping planes.
  • Added output grid naming options to the Points Convert SOP.
  • Added a Keep Original Geometry toggle to the Points Convert SOP and improved the efficiency of point unpacking. [Contributed by Dan Bailey]
  • Added an option to the Points Delete SOP to delete point groups. [Contributed by Nick Avramoussis]
  • Fixed a rare crash when extracting points from a point data primitive. [Contributed by Jeff Lait]
  • Added a SOP_NodeVDB::evalStdString method that facilitates string parameter evaluation in expressions, e.g., matchGroup(*gdp, evalStdString("group", time)).
  • Removed the deprecated openvdb_houdini::validateGeometry function. Use convertGeometry instead.
  • Added a SOP_NodeVDB::matchGroup overload that eliminates the need to const_cast the GU_Detail. [Contributed by Jeff Lait]
  • Grid transforms are now more aggressively simplified, making it less likely to produce nonuniform voxels erroneously. [Contributed by Jeff Lait]
  • Fixed a bug when copying and pasting a Create SOP that could cause the Voxel Size toggle to change state.
  • Added a houdini_utils::OpFactory::setVerb method to register compilable SOPs.
  • Made SOP_NodeVDB::cookMySop final (that is, non-overridable) to facilitate the implementation of compilable SOPs. Override SOP_NodeVDB::cookVDBSop instead. (In most cases, it suffices to rename cookMySop to cookVDBSop.)
  • Renamed some parameters on the following SOPs to match the equivalent native Houdini nodes: Advect, Advect Points, Analysis, Combine, Filter, Fracture, From Particles, From Polygons, Morph Level Set, Occlusion Mask, Offset Level Set, Points Group, Resample, Resize Narrow Band, Smooth Level Set, Topology To Level Set, Vector Merge, and Visualize.
  • Added SOP_VDBCacheOptions, a convenience base class for compilable SOPs. [Contributed by Jeff Lait]
  • Converted most SOPs into compilable SOPs.

Version 5.0.0 - November 6, 2017

Some changes in this release (see ABI changes below) alter the grid ABI so that it is incompatible with earlier versions of the OpenVDB library, such as the ones built into Houdini up to and including Houdini 16. To preserve ABI compatibility, when compiling OpenVDB or any dependent code define the macro OPENVDB_ABI_VERSION_NUMBER=N, where, for example, N is 3 for Houdini 15, 15.5 and 16 and 4 for Houdini 16.5.

New features:
  • Added a ::getLibraryAbiVersionString() getLibraryAbiVersionString function, which returns a string such as "5.0.0abi3".
  • Added a ::WeakPtr weak pointer type alias for ABI compatibility.
  • Metadata fields of unregistered types are no longer discarded after being read from a .vdb file, and although their values are not printable, they can be written back to disk.
  • Added a DESTDIR_LIB_DIR Makefile variable for Linux multiarch support. [Contributed by Mathieu Malaterre]
  • Added tools to create potential flow fields, as described in the 2017 SIGGRAPH OpenVDB course. [Contributed by Double Negative]
  • Added tools to create mask grids from point data grids and to compute ::points::pointCountGrid() point counts. [Contributed by Dan Bailey]
  • Added tools to scatter OpenVDB points randomly throughout a volume. [Contributed by Nick Avramoussis]
Improvements:
Bug fixes:

ABI changes:
  • Made ::tree::InternalNode InternalNode’s destructor non-virtual.
  • The fix for a delayed-loading race condition in the ::tree::LeafBuffer LeafBuffer class that was only partially rolled out in the previous release is now enabled on all platforms.
  • Replaced a bit flag with an atomic integer in ::points::AttributeArray points::AttributeArray to address a threading issue during delayed loading. [Contributed by Dan Bailey]
  • Deprecated the OPENVDB_2_ABI_COMPATIBLE and OPENVDB_3_ABI_COMPATIBLE macros in favor of a new OPENVDB_ABI_VERSION_NUMBER macro. The new macro defaults to the library major version number but can be set at compile time to an earlier version number to disable ABI changes since that version. (Older ABIs will not be supported indefinitely, however.) For example, compile OpenVDB and any dependent code with -DOPENVDB_ABI_VERSION_NUMBER=4 to use the 4.x ABI.
API changes:
  • Replaced tools::ClosestSurfacePoint::initialize with ::tools::ClosestSurfacePoint::create() tools::ClosestSurfacePoint::create, which returns a newly-allocated and properly initialized object.
  • Removed methods that were deprecated in version 4.0.0 or earlier, including io::File::readGridPartial, points::initialize, points::uninitialize and util::PagedArray::pop_back.
  • Deprecated IllegalValueException in favor of ::ValueError ValueError.
  • Changed the naming scheme for the library namespace from openvdb::vX_Y_Z to openvdb::vX_YabiN, where X, Y, Z and N are the major, minor, patch and ABI version numbers, respectively. The abiN suffix is added only when the library is built using an older ABI version.
Python:
  • Reimplemented NumPy support for Boost 1.65 compatibility.
Houdini:
  • Fixed bugs that caused the Ray SOP’s closest surface point searches to produce incorrect results.
  • Changed the VdbPrimCIterator::FilterFunc type from boost::function to std::function.
  • Changed the houdini_utils::OpPolicyPtr type from boost:shared_ptr to std::shared_ptr.
  • Debug-level log messages generated by OpenVDB are no longer forwarded to Houdini’s error manager.
  • Fixed a bug in the Read SOP that made it impossible to select among grids of the same name in a file.
  • Added houdini_utils::ParmFactory::setAttrChoiceList, a convenience method for the creation of menus of attributes.
  • Added a Potential Flow SOP. [Contributed by Double Negative]
  • Added point data grid support to the Scatter SOP. [Contributed by Nick Avramoussis]
  • Added mask and point count output options to the Points Convert SOP. [Contributed by Dan Bailey]

Version 4.0.2 - July 28, 2017
New features:
Improvements:
Bug fixes:
  • Fixed a delayed-loading race condition that could result in crashes. [Reported by Dan Bailey]

    Note: To preserve ABI compatibility, this fix is currently enabled only on platforms for which the alignment of a tbb::atomic<uint32_t> is the same as for a uint32_t. On other platforms, warnings will be logged during OpenVDB initialization, and it is recommended to disable delayed loading in that case (for example, by defining the environment variable OPENVDB_DISABLE_DELAYED_LOAD).

  • Fixed a delayed-loading memory leak in the ::points::PointDataLeafNode PointDataLeafNode. [Contributed by Double Negative]
  • Changed the random number seeding mechanism for .vdb file UUIDs to avoid duplicate IDs. [Reported by Jason Lefley]
  • Fixed an off-by-one bug in the ::tools::GridResampler resampler that produced grid patterns of missing interior voxels for scale factors greater than one.
Houdini:
  • As of Houdini 16.0.549, houdini_utils::OpFactory can generate help cards for operators automatically. New OpFactory::setDocumentation and ParmFactory::setDocumentation methods allow one to add custom help text in wiki markup format.
  • Added help cards for all SOPs. Houdini 16.0.578 or later is required. [Contributed by Dan Bailey and SideFX]
  • The Extended Operator Info window in Houdini 16 now renders correctly for OpenVDB SOPs, instead of displaying a Python stack trace. [Contributed by Dan Bailey]
  • Added a Points Delete SOP for deleting points from point data grids based on group membership. [Contributed by Double Negative]
  • Added a Mantra VRAY procedural and a delayed load SHOP for rendering point data grids. Houdini 16 is required. [Contributed by Double Negative]
  • Replaced the Combine SOP’s “A/B Pairs” and “Flatten” toggles with a menu of collation options that include flattening only A grids and flattening groups of A grids independently.
  • Added a slider to the Remove Divergence SOP to set the error tolerance for the pressure solver.
  • Added value type conversion options (for VDB output) to the Convert SOP.
  • Added a Densify SOP that replaces active tiles with leaf voxels.
  • Fixed a bug in the Rasterize Points SOP that capped density values to one instead of to the particles’ densities.
  • The Convert and To Polygons SOPs now accept grids of any type as surface masks, not just level set or SDF grids.
  • Added an option to the Clip SOP to clip to a camera frustum.

Version 4.0.1 - March 8, 2017
New features:
Improvements:
Bug fixes:
Python:
  • Added functions getLoggingLevel, setLoggingLevel, and setProgramName, to allow configuration of the logging system.
Houdini:
  • Fixed a crash in the Ray SOP when the user selected an isosurface outside the target volume’s narrow band.
  • The LOD SOP now supports all standard grid types, including boolean grids.
  • Added houdini_utils::ParmFactory::setGroupChoiceList, a convenience method for the creation of menus of primitive groups.
  • Made various small changes for Houdini 16 compatibility. [Contributed by SideFX]
  • The Create SOP now supports matching the new grids’ transform, voxel size, and topology to a reference grid. If the topology is being matched, it can optionally be resampled to a different voxel size.
  • Added some support for point data grids to the Clip, Topology To Level Set and Visualize SOPs. [Contributed by Double Negative]
  • Compression is no longer enabled by default in the Points Convert SOP for normals and colors, because they are not guaranteed to have a [0, 1] range. [Contributed by Double Negative]
  • Added a 16-bit truncation compression option to the Points Convert SOP. [Contributed by Double Negative]
  • Fixed a build issue with the GR_PrimVDBPoints render hook plugin that could cause hython to report a DSO error. [Reported by Double Negative]
  • Added an install_lib build target to the Makefile.
  • Rewrote the Remove Divergence SOP to actually remove divergence from vector fields on collocated grids, and added support for stationary and moving obstacles and an option to output a pressure field.
  • The Analysis SOP now produces correct results for grids with active tile values.
  • Added a sparse/dense toggle to the Fill SOP.
  • Added openvdb_houdini::startLogForwarding, openvdb_houdini::stopLogForwarding and openvdb_houdini::isLogForwarding, which control the forwarding of log messages to Houdini’s error manager. Forwarding of library warnings and error messages is now enabled by default for SOPs when OpenVDB is built with log4cplus.

Version 4.0.0 - November 15, 2016
Highlights:
  • Incorporated Double Negative’s OpenVDB Points library.
  • Introduced some C++11 constructs. A C++11-compatible compiler is now required.
  • Blosc-compressed .vdb files are now as much as 20% smaller.
  • Vector-valued grids are now constructed and destroyed much faster.

    Note: This change and other changes in this release (see ABI changes below) alter the grid ABI so that it is incompatible with earlier versions of the OpenVDB library, such as the ones built into Houdini 15, 15.5 and 16. To disable these changes and preserve ABI compatibility, define the macro OPENVDB_3_ABI_COMPATIBLE when compiling OpenVDB or any code that depends on OpenVDB.

New features:
  • Added an option to the point scattering tools to specify how far each point may be displaced from the center of its host voxel or tile.
  • Added a toggle to the ::tools::clip() clip tool to invert the clipping mask.
  • Custom leaf node implementations may now optimize their file layout by inheriting from ::io::MultiPass io::MultiPass. Voxel data for grids with such leaf nodes will be written and read in multiple passes, allowing blocks of related data to be stored contiguously. [Contributed by Double Negative]
  • Added ::tree::Tree::unallocatedLeafCount() Tree::unallocatedLeafCount, which returns the number of leaf nodes with unallocated data buffers (typically due to delayed loading).
Improvements:
  • Vector-valued grids are now constructed and destroyed much faster.
  • Changed ::math::Coord Coord’s data representation to facilitate C++11 uniform initialization.
  • Delayed loading from ::io::File io::Files is now faster due to the use of seeks instead of reads. [Contributed by Double Negative]
  • Made many small changes to address type conversion and other warnings reported by newer compilers, including Clang 3.8.
  • Improved Blosc compression ratios and write times by increasing the block size. [Contributed by Dan Bailey]
Bug fixes:

ABI changes:
API changes:
Python:
  • Fixed a build issue with Python 3 and NumPy. [Contributed by Jonathan Scruggs]
Houdini:
  • Certain changes in this release (see ABI changes above) alter the grid ABI so that it is incompatible with earlier versions of the OpenVDB library, such as the ones built into Houdini 15, 15.5 and 16. To disable these changes and preserve ABI compatibility, define the macro OPENVDB_3_ABI_COMPATIBLE when compiling OpenVDB or any code that depends on OpenVDB.
  • Introduced some C++11 constructs that are incompatible with versions of Houdini older than 15.0.
  • Fixed a bug in the Rasterize Points SOP that caused vector-valued attributes to be transferred as scalars. [Contributed by Double Negative]
  • Added a toggle to the Clip SOP to invert the clipping mask.
  • Added a slider to the Scatter SOP to specify how far each point may be displaced from the center of its host voxel or tile.

Version 3.2.0 - August 10, 2016
Highlights:
  • New features: tool to produce and store a sequences of progressively lower resolution grids (mipmaps), an acceleration structure for fast range and nearest-neighbor searches on particles, arbitrary volume and level set specific segmentation tools, a new binary mask grid type and an efficient point to level set conversion scheme.
  • Optimizations: Faster volume to mesh conversion and threaded grid destruction, morphological dilation, csg operations and fracture tool.
  • New Houdini nodes: Segment, LOD and Topology To Level Set.
New features:
Improvements:
Bug fixes:
API changes:
  • Deprecated math::Mat3::setBasis and math::Mat4::setBasis.
  • Renamed GudonovsNormSqrd to ::math::GodunovsNormSqrd GodunovsNormSqrd [Contributed by Branislav Radjenovic]
  • Renamed ValueType to PosType in the PointArray interface.
  • Deprecated tree::Tree::addLeaf(LeafNode&) and added tree::Tree::addLeaf(LeafNode*).
Python:
  • Updated the Python module for Python 3 compatibility.
  • Updated the Python module for Boost 1.60 compatibility, to address “no to_python (by-value) converter found” exceptions.
Maya:
  • Fixed bugs related to data ownership, and improved error checking. [Contributed by Crawford Doran]
  • Updated the Read and Write DAG nodes to support file sequences and subframe evaluation.
Houdini:
  • Added a Segment SOP that separates a grid’s connected components into distinct grids.
  • Added a LOD SOP that produces a sequences of progressively lower resolution grids.
  • Added a Topology To Level Set SOP that generates a narrow-band signed distance field / level set from the interface between active and inactive voxels in an arbitrary grid.
  • Revamped the From Particles SOP UI and added a more efficient level set conversion method that supports Houdini 15 packed points.
  • Updated the Rasterize Points SOP with support for frustum transforms, sub region masking and orientation logic that matches the native Copy SOP’s orientation.
  • Updated the Platonic SOP with support for all five Platonic solids.
  • Added hooks for registering SOP_NodeVDB text callbacks for different grid types. [Contributed by Nick Avramoussis]
  • The Resample and Combine SOPs now correctly handle affine transforms with shear and/or reflection.
  • Removed the StaggeredBoxSampler code path in SOP_OpenVDB_Advect because it introduces bias. [Contributed by Fredrik Salomonsson]
  • Fixed a bug in the Ray SOP whereby the distance attribute was created with the wrong data type. [Contributed by Nick Avramoussis]
  • The From Polygon SOP now allows the user to either specify the voxel count along an axis or the voxel size in world units (the only option in the past).

Version 3.1.0 - October 1, 2015
Highlights:
  • New features: advection of arbitrary volumes, general-purpose preconditioned linear solver and Poisson solver, segmentation of topologically-enclosed regions of a volume, new and faster bitmask operators, concurrent paged array, volume diagnostics
  • Optimizations: threaded grid constructors and topology operations; faster mesh to volume conversion, SDF to fog volume conversion and grid pruning; faster, unbounded particle partitioning
  • New Houdini nodes: Advect, Diagnostics, Rasterize Points, Remap, Remove Divergence, Sort Points
New features:
Improvements:
Bug fixes:
API changes:
Houdini:
  • Added a Rasterize Points SOP that produces density volumes and transfers arbitrary point attributes using a weighted-average scheme. The node incorporates a VOP subnetwork for procedural modeling, and its accompanying creation script defines a default network with VEX procedures for cloud and velocity field modeling. (See the creation script file header for installation details.)
  • Merged the Advect Level Set SOP into a new Advect SOP that supports advection of arbitrary volumes, not just level sets.
  • Added a Remove Divergence SOP that eliminates divergence from a velocity field.
  • Added a Diagnostics SOP that can identify various problems with level sets, fog volumes and other grids.
  • Added a Sort Points SOP that spatially reorders a list of points so that points that are close together in space are also close together in the list. This can improve CPU cache coherency and performance for random-access operations.
  • Added a Remap SOP that maps voxel values in an input range to values in an output range through a user-defined transfer function.
  • Added an option to the Convert SOP to activate interior voxels. [Contributed by SESI]
  • The To Spheres SOP can now optionally output a pscale attribute.
  • Added openvdb_houdini::SOP_NodeVDB::duplicateSourceStealable(), which in conjunction with the Unload flag can help to minimize deep copying of grids between nodes. The Advect, Convert, Fill, Filter, Fracture, Noise, Offset Level Set, Prune, Remap, Remove Divergence, Renormalize Level Set, Resize Narrow Band, Smooth Level Set and Transform SOPs all have this optimization enabled, meaning that they can potentially steal, rather than copy, data from upstream nodes that have the Unload flag enabled. [Contributed by Double Negative]
  • Redesigned the UI of the Visualize SOP and added toggles to draw with or without color, to use the grid name as the attribute name for points with values, and to attach grid index coordinates to points.
  • Added toggles to the Filter, Rebuild Level Set, Resize Narrow Band, Smooth Level Set and To Spheres SOPs to specify units in either world space or index space.
  • Fixed an issue whereby grids generated by the Rebuild Level Set SOP did not always display as surfaces in the viewport.
  • The Metadata SOP now sets appropriate viewport visualization options when the grid class is changed.

Version 3.0.0 - January 14, 2015
API changes:
Python:
  • Added grid methods convertToPolygons() and convertToQuads(), which convert volumes to meshes, and createLevelSetFromPolygons(), which converts meshes to volumes. NumPy is required.
Maya:
  • Added an adaptive polygonal surface extraction node.
Houdini:
  • Added a new Resize Narrow Band SOP that can efficiently adjust the width of a level set’s narrow band. This allows, for example, for a level set to be created quickly from points or polygons with a very narrow band that is then quickly resized to a desired width.
  • Fixed bugs in the Smooth Level Set and Reshape Level Set SOPs that caused them to ignore the selected discretization scheme.
  • Added a Morph Level Set SOP.
  • Added a From Points SOP to very quickly generate a level set from a point cloud, ignoring any radius attribute. [DWA internal]
  • Added a Voxel Scale mode to the Resample SOP.
  • Improved the performance and memory footprint of the From Particles SOP for large numbers (tens to hundreds of millions) of particles.
  • The Scatter SOP now accepts fractional numbers of particles per voxel.
  • Improved the performance of the Scatter SOP by more than an order of magnitude.
  • The Clip SOP now has a toggle to choose explicitly between a mask grid or a bounding box as the clipping region. As a consequence, the mask grid can now be unnamed.
  • Added the OpenVDB library version number to the Extended Operator Information for all SOPs.
  • SOPs are now linked with an rpath to the directory containing the OpenVDB library.
  • Like the native Houdini file SOP, the Read SOP now allows missing frames to be reported either as errors or as warnings.
  • The Read SOP now has an optional input for geometry, the bounding box of which can be used to clip grids as they are read. For large grids, clipping while reading can result in significantly lower memory usage than clipping after reading.
  • The From Polygons and Convert SOPs now default to using the polygon soup mesh representation, which uses less memory.

Version 2.3.0 - April 23, 2014
API changes:
Houdini:
  • Added a Clip SOP, which does volumetric clipping.
  • Added an Occlusion Mask SOP, which generates a mask of the voxels inside a camera frustum that are occluded by objects in an input grid.
  • The Combine SOP now applies the optional signed flood fill only to level set grids, since that operation isn’t meaningful for other grids.
  • The Filter SOP now processes all grid types, not just scalar grids.

Version 2.2.0 - February 20, 2014
API changes:
  • ::tools::VolumeRayIntersector::march() VolumeRayIntersector::march no longer returns an int to distinguish tile vs. voxel hits. Instead, it now returns false if no intersection is detected and true otherwise. Also, t0 and t1 might now correspond to the first and last hits of multiple adjacent leaf nodes and/or active tiles.
  • ::tools::DualGridSampler DualGridSampler is no longer templated on the target grid type, and the value accessor is now passed as an argument.
  • The .vdb file format has changed slightly. Tools built with older versions of OpenVDB should be recompiled to ensure that they can read files in the new format.
Houdini:
  • Added topology union, intersection and difference operations to the Combine SOP. These operations combine the active voxel topologies of grids that may have different value types.
  • Added a Divide operation to the Combine SOP.
  • Added support for boolean grids to the Combine, Resample, Scatter, Prune and Visualize SOPs.
  • The Fill SOP now accepts a vector as the fill value, and it allows the fill region bounds to be specified either in index space (as before), in world space, or using the bounds of geometry connected to an optional new reference input.
  • Added a toggle to the Offset Level Set SOP to specify the offset in either world or voxel units.
  • Added a toggle to the Transform and Resample SOPs to apply the transform to the voxel values of vector-valued grids, in accordance with those grids’ ::VecType vector types and ::Grid::isInWorldSpace() world space/local space settings.
  • Added a Vector Type menu to the Vector Merge SOP.
  • Removed masking options from the Renormalize SOP (since masking is not supported yet).
  • Reimplemented the Vector Merge SOP for better performance and interruptibility and to fix a bug in the handling of tile values.

Version 2.1.0 - December 12, 2013
API changes:
  • The ::tools::Filter Filter tool is now templated on a mask grid, and threading is controlled using a grain size, for consistency with most of the other level set tools.
  • The ::tools::LevelSetFilter LevelSetFilter tool is now templated on a mask grid.
  • All shaders now take a ray direction instead of a ray.

Version 2.0.0 - October 31, 2013

Version 1.2.0 - June 28 2013
  • ::tools::LevelSetFilter Level set filters now accept an optional alpha mask grid.
  • Implemented sharp feature extraction for level set surfacing. This enhances the quality of the output mesh and reduces aliasing artifacts.
  • Added masking options to the meshing tools, as well as a spatial multiplier for the adaptivity threshold, automatic partitioning, and the ability to preserve edges and corners when mesh adaptivity is applied.
  • The mesh to volume attribute transfer scheme now takes surface orientation into account, which improves accuracy in proximity to edges and corners.
  • Added a ::tree::LeafManager::foreach() foreach method to ::tree::LeafManager tree::LeafManager that, like ::tools::foreach() tools::foreach, applies a user-supplied functor to each leaf node in parallel.
  • Rewrote the particle to level set converter, simplifying the API, improving performance (especially when particles have a fixed radius), adding the capability to transfer arbitrary point attributes, and fixing a velocity trail bug.
  • Added utility methods ::math::Sign() Sign, ::math::SignChange() SignChange, ::math::isApproxZero() isApproxZero, ::math::Cbrt() Cbrt and ::math::ZeroCrossing() ZeroCrossing to math/Math.h.
  • Added a ::tree::ValueAccessor3::probeNode() probeNode method to the value accessor and to tree nodes that returns a pointer to the node that contains a given voxel.
  • Deprecated LeafNode::addValue and LeafNode::scaleValue.
  • Doubled the speed of the mesh to volume converter (which also improves the performance of the fracture and level set rebuild tools) and improved its inside/outside voxel classification near edges and corners.
  • ::tools::GridSampler GridSampler now accepts either a grid, a tree or a value accessor, and it offers faster index-based access methods and much better performance in cases where many instances are allocated.
  • Extended ::tools::Dense tools::Dense to make it more compatible with existing tools.
  • Fixed a crash in ::io::Archive io::Archive whenever the library was unloaded from memory and then reloaded. [Contributed by Ollie Harding]
  • Fixed a bug in GU_PrimVDB::buildFromPrimVolume(), seen during the conversion from Houdini volumes to OpenVDB grids, that could cause signed flood fill to be applied to non-level set grids, resulting in active tiles with incorrect values.
  • Added a Prune SOP with several pruning schemes.

Version 1.1.1 - May 10 2013

Version 1.1.0 - April 4 2013
  • The ::tools::resampleToMatch() resampleToMatch tool, the Resample SOP and the Combine SOP now use level set rebuild to correctly and safely resample level sets. Previously, scaling a level set would invalidate the signed distance field, leading to holes and other artifacts.
  • Added a mask-based topological tools::erodeVoxels() erosion tool and rewrote and simplified the tools::dilateVoxels() dilation tool.
  • The ::tools::LevelSetAdvection LevelSetAdvection tool can now advect forward or backward in time.
  • Tree::pruneLevelSet() now replaces each pruned node with a tile having the inside or outside background value, instead of arbitrarily selecting one of the node’s tile or voxel values.
  • When a grid is saved to a file with ::Grid::saveFloatAsHalf() saveFloatAsHalf set to true, the grid’s background value is now also quantized to 16 bits. (Not quantizing the background value caused a mismatch with the values of background tiles.)
  • As with ::tools::foreach() tools::foreach, it is now possible to specify whether functors passed to ::tools::transformValues() tools::transformValues should be shared across threads.
  • ::tree::LeafManager tree::LeafManager can now be instantiated with a const tree, although buffer swapping with const trees is disabled.
  • Added a ::Grid::signedFloodFill() Grid::signedFloodFill overload that allows one to specify inside and outside values.
  • Fixed a bug in Grid::setBackground() so that now only the values of inactive voxels change.
  • Fixed ::Grid::topologyUnion() Grid::topologyUnion so that it actually unions tree topology, instead of just the active states of tiles and voxels. The previous behavior broke multithreaded code that relied on input and output grids having compatible tree topology.
  • ::math::Transform math::Transform now includes an ::math::Transform::isIdentity() isIdentity predicate and methods to ::math::Transform::preMult(const Mat4d&) pre- and ::math::Transform::postMult(const Mat4d&) postmultiply by a matrix.
  • Modified the node mask classes to permit octree-like tree configurations (i.e., with a branching factor of two) and to use 64-bit operations instead of 32-bit operations.
  • Implemented a new, more efficient ::math::closestPointOnTriangleToPoint() closest point on triangle algorithm.
  • Implemented a new vertex normal scheme in the volume to mesh converter, and resolved some overlapping polygon issues.
  • The volume to mesh converter now meshes not just active voxels but also active tiles.
  • Fixed a bug in the mesh to volume converter that caused unsigned distance field conversion to produce empty grids.
  • Fixed a bug in the level set fracture tool whereby the cutter overlap toggle was ignored.
  • Fixed an infinite loop bug in vdb_view.
  • Updated vdb_view to use the faster and less memory-intensive OpenVDB volume to mesh converter instead of marching cubes, and rewrote the shader to be OpenGL 3.2 and GLSL 1.2 compatible.
  • Given multiple input files or a file containing multiple grids, vdb_view now displays one grid at a time. The left and right arrow keys cycle between grids.
  • The To Polygons SOP now has an option to associate the input grid’s name with each output polygon.

Version 1.0.0 - March 14 2013

Version 0.104.0 - February 15 2013

Version 0.103.1 - January 15 2013
  • ::tree::ValueAccessor tree::ValueAccessor read operations are now faster for four-level trees. (Preliminary benchmark tests suggest a 30-40% improvement.)
  • For vector-valued grids, ::tools::compMin() tools::compMin and ::tools::compMax() tools::compMax now compare vector magnitudes instead of individual components.
  • Migrated grid sampling code to a new file, Interpolation.h, and deprecated old files and classes.
  • Added a level-set ::tools::LevelSetFracture fracture tool and a Fracture SOP.
  • Added ::tools::sdfInteriorMask() tools::sdfInteriorMask, which creates a mask of the interior region of a level set grid.
  • Fixed a bug in the mesh to volume converter that produced unexpected nonzero values for voxels at the intersection of two polygons, and another bug that produced narrow-band widths that didn’t respect the background value when the half-band width was less than three voxels.
  • houdini_utils::ParmFactory can now correctly generate ramp multi-parms.
  • Made various changes for Visual C++ compatibility. [Contributed by SESI]
  • The Convert SOP can now convert between signed distance fields and fog volumes and from volumes to meshes. [Contributed by SESI]
  • For level sets, the From Mesh and From Particles SOPs now match the reference grid’s narrow-band width.
  • The Scatter SOP can now optionally scatter points in the interior of a level set.

Version 0.103.0 - December 21 2012

Version 0.102.0 - December 13 2012
  • Added ::tools::compReplace() tools::compReplace, which copies the active values of one grid into another, and added a "Replace A With Active B" mode to the Combine SOP.
  • ::Grid::signedFloodFill() Grid::signedFloodFill no longer enters an infinite loop when filling an empty grid.
  • Fixed a bug in the particle to level set converter that sometimes produced level sets with holes, and fixed a bug in the SOP that could result in random output.
  • Fixed an issue in the frustum preview feature of the Create SOP whereby rendering very large frustums could cause high CPU usage.
  • Added streamline support to the constrained advection scheme in the Advect Points SOP.
  • Added an Advect Level Set SOP.

Version 0.101.1 - December 11 2012 (DWA internal release)
  • Partially reverted the Houdini VDB primitive’s grid accessor methods to their pre-0.98.0 behavior. A primitive’s grid can once again be accessed by shared pointer, but now also by reference. Accessor methods for grid metadata have also been added, and the primitive now ensures that metadata and transforms are never shared.
  • Fixed an intermittent crash in the From Particles SOP.

Version 0.101.0 - December 6 2012 (DWA internal release)

Version 0.100.0 - November 30 2012 (DWA internal release)
  • Greatly improved the performance of the level set to fog volume ::tools::sdfToFogVolume() converter.
  • Improved the performance of the ::tools::Filter::median() median filter and of level set ::tools::csgUnion() CSG operations.
  • Reintroduced Tree::pruneLevelSet(), a specialized Tree::pruneInactive() for level-set grids.
  • Added utilities to the houdini_utils library to facilitate the collection of a chain of adjacent nodes of a particular type so that they can be cooked in a single step. (For example, adjacent xform SOPs could be collapsed by composing their transformation matrices into a single matrix.)
  • Added pruning and flood-filling options to the Convert SOP.
  • Reimplemented the Filter SOP, omitting level-set-specific filters and adding node chaining (to reduce memory usage when applying several filters in sequence).
  • Added a toggle to the Read SOP to read grid metadata and transforms only.
  • Changed the attribute transfer scheme on the From Mesh and From Particles SOPs to allow for custom grid names and vector type metadata.

Version 0.99.0 - November 21 2012

Version 0.98.0 - November 16 2012

Version 0.97.0 - October 18 2012
  • Added a narrow-band ::tools::LevelSetTracker level set interface tracking tool (up to fifth-order in space but currently only first-order in time, with higher temporal orders to be added soon).
  • Added a ::tools::LevelSetFilter level set filter tool to perform unrestricted surface smoothing (e.g., Laplacian flow), filtering (e.g., mean value) and morphological operations (e.g., morphological opening).
  • Added adaptivity to the ::tools::VolumeToMesh level set meshing tool for faster mesh extraction with fewer polygons, without postprocessing.
  • Added a ::tree::ValueAccessor::touchLeaf() ValueAccessor::touchLeaf method that creates (if necessary) and returns the leaf node containing a given voxel. It can be used to preallocate leaf nodes over which to run parallel algorithms.
  • Fixed a bug in ::Grid::merge() Grid::merge whereby active tiles were sometimes lost.
  • Added ::tree::LeafManager LeafManager, which is similar to LeafArray but supports a dynamic buffer count and allocates buffers more efficiently. Useful for temporal integration (e.g., for level set propagation and interface tracking), LeafManager is meant to replace LeafArray, which will be deprecated in the next release.
  • Added a ::tree::LeafNode::fill() LeafNode::fill method to efficiently populate leaf nodes with constant values.
  • Added a tree::Tree::visitActiveBBox() method that applies a functor to the bounding boxes of all active tiles and leaf nodes and that can be used to improve the performance of ray intersection tests, rendering of bounding boxes, etc.
  • Added a ::tree::Tree::voxelizeActiveTiles() Tree::voxelizeActiveTiles method to densify active tiles. While convenient and fast, this can produce large dense grids, so use it with caution.
  • Repackaged Tree::pruneLevelSet() as a Tree::pruneOp()-compatible functor. Tree::LevelSetPrune is a specialized Tree::pruneInactive for level-set grids and is used in interface tracking.
  • Added a GridBase::pruneGrid() method.
  • Added a ::Grid::hasUniformVoxels() Grid:hasUniformVoxels method.
  • Renamed tools::dilate to tools::dilateVoxels() and improved its performance. The new name reflects the fact that the current implementation ignores active tiles.
  • Added a ::tools::resampleToMatch() tools::resampleToMatch function that resamples an input grid into an output grid with a different transform such that, after resampling, the input and output grids coincide, but the output grid’s transform is preserved.
  • Significantly improved the performance of depth-bounded value iterators (::tree::Tree::ValueOnIter ValueOnIter, ::tree::Tree::ValueAllIter ValueAllIter, etc.) when the depth bound excludes leaf nodes.
  • Exposed the value buffers inside leaf nodes with ::tree::LeafNode::buffer() LeafNode::buffer. This allows for very fast access (const and non-const) to voxel values using linear array offsets instead of (i,&nbsp j,&nbsp k) coordinates.
  • In openvdb_houdini/UT_VDBTools.h, added operators for use with processTypedGrid that resample grids in several different ways.
  • Added a policy mechanism to houdini_utils::OpFactory that allows for customization of operator names, icons, and Help URLs.
  • Renamed many of the Houdini SOPs to make the names more consistent.
  • Added an Advect Points SOP.
  • Added a Level Set Filter SOP that allows for unrestricted surface deformations, unlike the older Filter SOP, which restricts surface motion to the initial narrow band.
  • Added staggered vector sampling to the Sample Points SOP.
  • Added a minimum radius threshold to the particle voxelization tool and SOP.
  • Merged the Composite and CSG SOPs into a single Combine SOP.
  • Added a tool and a SOP to efficiently generate narrow-band level set representations of spheres.
  • In the Visualize SOP, improved the performance of tree topology generation, which is now enabled by default.

Version 0.96.0 - September 24 2012
  • Fixed a memory corruption bug in the mesh voxelizer tool.
  • Temporarily removed the optional clipping feature from the level set mesher.
  • Added "Staggered Vector Field" to the list of grid classes in the Create SOP.

Version 0.95.0 - September 20 2012

Version 0.94.1 - September 7 2012

Version 0.94.0 - August 30 2012

Version 0.93.0 - August 24 2012

Version 0.92.0 - August 23 2012
  • Added a Laplacian diffusion ::tools::Filter::laplacian() filter.
  • Fixed a bug in the initialization of the sparse contour tracer that caused mesh-to-volume conversion to fail in certain cases.
  • Fixed a bug in the curvature stencil that caused mean curvature filtering to produce wrong results.
  • Increased the speed of the ::tools::GridTransformer GridTransformer by as much as 20% for fog volumes.
  • Added optional pruning to the Resample SOP.
  • Modified the PointSample SOP to allow it to work with ungrouped, anonymous grids.
  • Fixed a crash in the LevelSetNoise SOP.

Version 0.91.0 - August 16 2012

Version 0.90.1 - August 7 2012

Version 0.90.0 - August 3 2012 (initial public release)
  • Added a basic GL viewer for OpenVDB files.
  • Greatly improved the performance of two commonly-used Tree methods, ::tree::Tree::evalActiveVoxelBoundingBox() evalActiveVoxelBoundingBox() and ::tree::Tree::memUsage() memUsage().
  • Eliminated the GridMap class. File I/O now uses STL containers of grid pointers instead.
  • Refactored stencil-based tools (Gradient, Laplacian, etc.) and rewrote some of them for generality and better performance. Most now behave correctly for grids with nonlinear index-to-world transforms.
  • Added a library of index-space finite difference operators.
  • Added a Hermite grid type that compactly stores each voxel’s upwind normals and can be used to convert volumes to and from polygonal meshes.
  • Added a tool (and a Houdini SOP) to scatter points randomly throughout a volume.