1// Copyright Contributors to the OpenVDB Project 2// SPDX-License-Identifier: MPL-2.0 3 4/// @file openvdb/version.h 5/// @brief Library and file format version numbers 6/// 7/// @details 8/// When the library is built with the latest ABI, its namespace has the form 9/// <B>openvdb::vX_Y</B>, where @e X and @e Y are the major and minor version 10/// numbers. 11/// 12/// The library can be built using an older ABI by changing the value of the 13/// @b OPENVDB_ABI_VERSION_NUMBER. (e.g., via <TT>-DOPENVDB_ABI_VERSION_NUMBER=<I>N</I></TT>). 14/// In that case, the namespace has the form <B>openvdb::vX_YabiN</B>, 15/// where N is the ABI version number. 16/// 17/// The ABI version must be set consistently when building code that depends on 18/// OpenVDB. 19/// 20/// The ABI version number defaults to the library major version number, which 21/// gets incremented whenever changes are made to the ABI of the Grid class or 22/// related classes (Tree, Transform, Metadata, etc.). Setting the ABI version 23/// number to an earlier library version number disables grid ABI changes made 24/// since that library version. 25/// 26/// The library minor version number gets incremented whenever a change is made 27/// to any aspect of the public API (not just the grid API) that necessitates 28/// changes to client code. Changes to APIs in private or internal namespaces 29/// do not trigger a minor version number increment; such APIs should not be 30/// used in client code. 31/// 32/// A patch version number increment indicates a change—usually a new 33/// feature or a bug fix—that does not necessitate changes to client code 34/// but rather only recompilation of that code (because the library namespace 35/// incorporates the version number). 36/// 37/// The file format version number gets incremented when it becomes possible to 38/// write files that cannot safely be read with older versions of the library. 39/// Not all files written in a newer format are incompatible with older 40/// libraries, however. And in general, files containing grids of unknown type 41/// can be read safely, although the unknown grids will not be accessible. 42 43#ifndef OPENVDB_VERSION_HAS_BEEN_INCLUDED 44#define OPENVDB_VERSION_HAS_BEEN_INCLUDED 45 46#include "openvdb/Platform.h" 47 48#include <cstddef> // size_t 49#include <cstdint> // uint32_t 50 51/////////////////////////////////////////////////////////////////////////////// 52/////////////////////////////////////////////////////////////////////////////// 53 54// Auto generated build configurations from CMake 55 56///@{ 57/// @brief Library major, minor and patch version numbers 58/// @hideinitializer 59#define OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER ${OpenVDB_MAJOR_VERSION} 60/// @hideinitializer 61#define OPENVDB_LIBRARY_MINOR_VERSION_NUMBER ${OpenVDB_MINOR_VERSION} 62/// @hideinitializer 63#define OPENVDB_LIBRARY_PATCH_VERSION_NUMBER ${OpenVDB_PATCH_VERSION} 64///@} 65 66/// @note This ifndef exists for compatibility with older versions of OpenVDB. 67/// This value should never be different from the value configured when 68/// OpenVDB was built, but this previously needed to be defined by downstream 69/// software. Redefining it here would cause build failures, so this allows 70/// users to transition and remove the define in their build systems. 71#ifndef OPENVDB_ABI_VERSION_NUMBER 72/// @brief The ABI version that OpenVDB was built with 73/// @hideinitializer 74#define OPENVDB_ABI_VERSION_NUMBER ${OPENVDB_ABI_VERSION_NUMBER} 75#endif 76 77/// @brief Library version number string of the form "<major>.<minor>.<patch>" 78/// @details This is a macro rather than a static constant because we typically 79/// want the compile-time version number, not the runtime version number 80/// (although the two are usually the same). 81/// @hideinitializer 82#define OPENVDB_LIBRARY_VERSION_STRING "${OpenVDB_MAJOR_VERSION}.${OpenVDB_MINOR_VERSION}.${OpenVDB_PATCH_VERSION}" 83 84/// @brief Library version number string of the form "<major>.<minor>.<patch>abi<abi>" 85/// @details This is a macro rather than a static constant because we typically 86/// want the compile-time version number, not the runtime version number 87/// (although the two are usually the same). 88/// @hideinitializer 89#define OPENVDB_LIBRARY_ABI_VERSION_STRING "${OpenVDB_MAJOR_VERSION}.${OpenVDB_MINOR_VERSION}.${OpenVDB_PATCH_VERSION}abi${OPENVDB_ABI_VERSION_NUMBER}" 90 91/// @brief Library version number as a packed integer ("%02x%02x%04x", major, minor, patch) 92/// @hideinitializer 93#define OPENVDB_LIBRARY_VERSION_NUMBER ${OPENVDB_PACKED_VERSION} 94 95/// @brief The version namespace name for this library version 96/// @hideinitializer 97/// 98/// When the ABI version number matches the library major version number, 99/// symbols are named as in the following examples: 100/// - @b openvdb::vX_Y::Vec3i 101/// - @b openvdb::vX_Y::io::File 102/// - @b openvdb::vX_Y::tree::Tree 103/// 104/// where X and Y are the major and minor version numbers. 105/// 106/// When the ABI version number does not match the library major version number, 107/// symbol names include the ABI version: 108/// - @b openvdb::vX_YabiN::Vec3i 109/// - @b openvdb::vX_YabiN::io::File 110/// - @b openvdb::vX_YabiN::tree::Tree 111/// 112/// where X, Y and N are the major, minor and ABI version numbers, respectively. 113#if OPENVDB_ABI_VERSION_NUMBER == OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER 114 #define OPENVDB_VERSION_NAME v${OpenVDB_MAJOR_VERSION}_${OpenVDB_MINOR_VERSION}${OPENVDB_NAMESPACE_SUFFIX} 115#else 116 #define OPENVDB_VERSION_NAME v${OpenVDB_MAJOR_VERSION}_${OpenVDB_MINOR_VERSION}abi${OPENVDB_ABI_VERSION_NUMBER}${OPENVDB_NAMESPACE_SUFFIX} 117#endif 118 119/* Denotes whether VDB was built with IMath Half support */ 120#ifndef OPENVDB_USE_IMATH_HALF 121#cmakedefine OPENVDB_USE_IMATH_HALF 122/* Denotes whether VDB was built against Imath 3+ */ 123#cmakedefine OPENVDB_IMATH_VERSION 124#endif 125 126/* Denotes whether VDB was built with Blosc support */ 127#ifndef OPENVDB_USE_BLOSC 128#cmakedefine OPENVDB_USE_BLOSC 129#endif 130 131/* Denotes whether VDB was built with ZLIB support */ 132#ifndef OPENVDB_USE_ZLIB 133#cmakedefine OPENVDB_USE_ZLIB 134#endif 135 136/* Denotes whether VDB was built with explicit template instantiation */ 137#ifndef OPENVDB_USE_EXPLICIT_INSTANTIATION 138#cmakedefine OPENVDB_USE_EXPLICIT_INSTANTIATION 139#endif 140 141/* Defines the macros for explicit template declarations. */ 142#define OPENVDB_INSTANTIATE extern template OPENVDB_TEMPLATE_IMPORT 143#define OPENVDB_INSTANTIATE_CLASS extern template class OPENVDB_TEMPLATE_IMPORT 144#define OPENVDB_INSTANTIATE_STRUCT extern template struct OPENVDB_TEMPLATE_IMPORT 145 146/* Defines the macros for explicit template instantiations. */ 147#define OPENVDB_REAL_TREE_INSTANTIATE(Function) @OPENVDB_REAL_TREE_INSTANTIATIONS@ 148#define OPENVDB_NUMERIC_TREE_INSTANTIATE(Function) @OPENVDB_NUMERIC_TREE_INSTANTIATIONS@ 149#define OPENVDB_VEC3_TREE_INSTANTIATE(Function) @OPENVDB_VEC3_TREE_INSTANTIATIONS@ 150#define OPENVDB_VOLUME_TREE_INSTANTIATE(Function) @OPENVDB_VOLUME_TREE_INSTANTIATIONS@ 151#define OPENVDB_ALL_TREE_INSTANTIATE(Function) @OPENVDB_ALL_TREE_INSTANTIATIONS@ 152 153/////////////////////////////////////////////////////////////////////////////// 154/////////////////////////////////////////////////////////////////////////////// 155 156 157#if OPENVDB_ABI_VERSION_NUMBER > OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER 158 // If using a future OPENVDB_ABI_VERSION_NUMBER, issue a message directive. 159 // This can be suppressed by defining OPENVDB_USE_FUTURE_ABI_<VERSION>=ON. 160 // Note that, whilst the VDB CMake does not allow this option to be hit, 161 // it exists to propagate this message to downstream targets 162 #if OPENVDB_ABI_VERSION_NUMBER == 10 163 #ifndef OPENVDB_USE_FUTURE_ABI_10 164 PRAGMA(message("NOTE: ABI = 10 is still in active development and has not been finalized, " 165 "define OPENVDB_USE_FUTURE_ABI_10 to suppress this message")) 166 #endif 167 #else 168 #error expected OPENVDB_ABI_VERSION_NUMBER <= OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER 169 #endif 170#endif 171 172// If using an OPENVDB_ABI_VERSION_NUMBER that has been deprecated, issue a message 173// directive. This can be suppressed by defining OPENVDB_USE_DEPRECATED_ABI_<VERSION>. 174// Note that, whilst the VDB CMake does not allow this option to be hit, 175// it exists to propagate this message to downstream targets 176#ifndef OPENVDB_USE_DEPRECATED_ABI_6 177 #if OPENVDB_ABI_VERSION_NUMBER == 6 178 PRAGMA(message("NOTE: ABI = 6 is deprecated, define OPENVDB_USE_DEPRECATED_ABI_6 " 179 "to suppress this message")) 180 #endif 181#endif 182#ifndef OPENVDB_USE_DEPRECATED_ABI_7 183 #if OPENVDB_ABI_VERSION_NUMBER == 7 184 PRAGMA(message("NOTE: ABI = 7 is deprecated, define OPENVDB_USE_DEPRECATED_ABI_7 " 185 "to suppress this message")) 186 #endif 187#endif 188 189/// By default, the @b OPENVDB_REQUIRE_VERSION_NAME macro is undefined, and 190/// symbols from the version namespace are promoted to the top-level namespace 191/// so that, for example, @b openvdb::v5_0::io::File can be referred to 192/// simply as @b openvdb::io::File. 193/// 194/// When @b OPENVDB_REQUIRE_VERSION_NAME is defined, symbols must be 195/// fully namespace-qualified. 196/// @hideinitializer 197#ifdef OPENVDB_REQUIRE_VERSION_NAME 198#define OPENVDB_USE_VERSION_NAMESPACE 199#else 200// The empty namespace clause below ensures that OPENVDB_VERSION_NAME 201// is recognized as a namespace name. 202#define OPENVDB_USE_VERSION_NAMESPACE \ 203 namespace OPENVDB_VERSION_NAME {} \ 204 using namespace OPENVDB_VERSION_NAME; 205#endif 206 207 208namespace openvdb { 209OPENVDB_USE_VERSION_NAMESPACE 210namespace OPENVDB_VERSION_NAME { 211 212/// @brief The magic number is stored in the first four bytes of every VDB file. 213/// @details This can be used to quickly test whether we have a valid file or not. 214const int32_t OPENVDB_MAGIC = 0x56444220; 215 216/// Library major, minor and patch version numbers 217/// @hideinitializer 218const uint32_t 219 OPENVDB_LIBRARY_MAJOR_VERSION = OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER, 220 OPENVDB_LIBRARY_MINOR_VERSION = OPENVDB_LIBRARY_MINOR_VERSION_NUMBER, 221 OPENVDB_LIBRARY_PATCH_VERSION = OPENVDB_LIBRARY_PATCH_VERSION_NUMBER; 222/// Library version number as a packed integer ("%02x%02x%04x", major, minor, patch) 223/// @hideinitializer 224const uint32_t OPENVDB_LIBRARY_VERSION = OPENVDB_LIBRARY_VERSION_NUMBER; 225/// ABI version number 226/// @hideinitializer 227const uint32_t OPENVDB_ABI_VERSION = OPENVDB_ABI_VERSION_NUMBER; 228 229/// @brief The current version number of the VDB file format 230/// @details This can be used to enable various backwards compatibility switches 231/// or to reject files that cannot be read. 232const uint32_t OPENVDB_FILE_VERSION = 224; 233 234/// Notable file format version numbers 235enum { 236 OPENVDB_FILE_VERSION_ROOTNODE_MAP = 213, 237 OPENVDB_FILE_VERSION_INTERNALNODE_COMPRESSION = 214, 238 OPENVDB_FILE_VERSION_SIMPLIFIED_GRID_TYPENAME = 215, 239 OPENVDB_FILE_VERSION_GRID_INSTANCING = 216, 240 OPENVDB_FILE_VERSION_BOOL_LEAF_OPTIMIZATION = 217, 241 OPENVDB_FILE_VERSION_BOOST_UUID = 218, 242 OPENVDB_FILE_VERSION_NO_GRIDMAP = 219, 243 OPENVDB_FILE_VERSION_NEW_TRANSFORM = 219, 244 OPENVDB_FILE_VERSION_SELECTIVE_COMPRESSION = 220, 245 OPENVDB_FILE_VERSION_FLOAT_FRUSTUM_BBOX = 221, 246 OPENVDB_FILE_VERSION_NODE_MASK_COMPRESSION = 222, 247 OPENVDB_FILE_VERSION_BLOSC_COMPRESSION = 223, 248 OPENVDB_FILE_VERSION_POINT_INDEX_GRID = 223, 249 OPENVDB_FILE_VERSION_MULTIPASS_IO = 224 250}; 251 252 253/// Return a library version number string of the form "<major>.<minor>.<patch>". 254inline constexpr const char* getLibraryVersionString() { return OPENVDB_LIBRARY_VERSION_STRING; } 255/// Return a library version number string of the form "<major>.<minor>.<patch>abi<abi>". 256inline constexpr const char* getLibraryAbiVersionString() { 257 return OPENVDB_LIBRARY_ABI_VERSION_STRING; 258} 259 260 261struct VersionId { 262 uint32_t first, second; 263 VersionId(): first(0), second(0) {} 264 VersionId(uint32_t major, uint32_t minor): first(major), second(minor) {} 265}; 266 267} // namespace OPENVDB_VERSION_NAME 268} // namespace openvdb 269 270#endif // OPENVDB_VERSION_HAS_BEEN_INCLUDED 271