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&mdash;usually a new
33/// feature or a bug fix&mdash;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