Line | Branch | Exec | Source |
---|---|---|---|
1 | // Copyright Contributors to the OpenVDB Project | ||
2 | // SPDX-License-Identifier: MPL-2.0 | ||
3 | |||
4 | #ifndef OPENVDB_IO_ARCHIVE_HAS_BEEN_INCLUDED | ||
5 | #define OPENVDB_IO_ARCHIVE_HAS_BEEN_INCLUDED | ||
6 | |||
7 | #include <openvdb/version.h> | ||
8 | #include "Compression.h" // for COMPRESS_ZIP, etc. | ||
9 | #include <openvdb/Grid.h> | ||
10 | #include <openvdb/MetaMap.h> | ||
11 | #include <openvdb/Platform.h> | ||
12 | #include <openvdb/version.h> // for VersionId | ||
13 | #include <boost/uuid/uuid.hpp> | ||
14 | #include <cstdint> | ||
15 | #include <iosfwd> | ||
16 | #include <map> | ||
17 | #include <memory> | ||
18 | #include <string> | ||
19 | |||
20 | |||
21 | class TestFile; | ||
22 | |||
23 | namespace openvdb { | ||
24 | OPENVDB_USE_VERSION_NAMESPACE | ||
25 | namespace OPENVDB_VERSION_NAME { | ||
26 | namespace io { | ||
27 | |||
28 | class GridDescriptor; | ||
29 | |||
30 | |||
31 | /// Grid serializer/unserializer | ||
32 | 18 | class OPENVDB_API Archive | |
33 | { | ||
34 | public: | ||
35 | using Ptr = SharedPtr<Archive>; | ||
36 | using ConstPtr = SharedPtr<const Archive>; | ||
37 | |||
38 | static const uint32_t DEFAULT_COMPRESSION_FLAGS; | ||
39 | |||
40 | Archive(); | ||
41 |
1/2✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
|
20 | Archive(const Archive&) = default; |
42 | Archive& operator=(const Archive&) = default; | ||
43 | virtual ~Archive(); | ||
44 | |||
45 | /// @brief Return a copy of this archive. | ||
46 | virtual Ptr copy() const; | ||
47 | |||
48 | /// @brief Return the UUID that was most recently written (or read, | ||
49 | /// if no UUID has been written yet). | ||
50 | std::string getUniqueTag() const; | ||
51 | /// @brief Return @c true if the given UUID matches this archive's UUID. | ||
52 | bool isIdentical(const std::string& uuidStr) const; | ||
53 | |||
54 | /// @brief Return the file format version number of the input stream. | ||
55 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
|
6 | uint32_t fileVersion() const { return mFileVersion; } |
56 | /// @brief Return the (major, minor) version number of the library that was | ||
57 | /// used to write the input stream. | ||
58 |
7/14✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
|
7 | VersionId libraryVersion() const { return mLibraryVersion; } |
59 | /// @brief Return a string of the form "<major>.<minor>/<format>", giving the | ||
60 | /// library and file format version numbers associated with the input stream. | ||
61 | std::string version() const; | ||
62 | |||
63 | /// @brief Return @c true if trees shared by multiple grids are written out | ||
64 | /// only once, @c false if they are written out once per grid. | ||
65 | bool isInstancingEnabled() const { return mEnableInstancing; } | ||
66 | /// @brief Specify whether trees shared by multiple grids should be | ||
67 | /// written out only once (@c true) or once per grid (@c false). | ||
68 | /// @note Instancing is enabled by default. | ||
69 |
5/10✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
|
7 | void setInstancingEnabled(bool b) { mEnableInstancing = b; } |
70 | |||
71 | /// Return @c true if the OpenVDB library includes support for the Blosc compressor. | ||
72 | static bool hasBloscCompression(); | ||
73 | |||
74 | /// Return @c true if the OpenVDB library includes support for the ZLib compressor. | ||
75 | static bool hasZLibCompression(); | ||
76 | |||
77 | /// Return a bit mask specifying compression options for the data stream. | ||
78 |
3/6✓ Branch 1 taken 150 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 65 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 154 times.
✗ Branch 8 not taken.
|
532 | uint32_t compression() const { return mCompression; } |
79 | /// @brief Specify whether and how the data stream should be compressed. | ||
80 | /// @param c bitwise OR (e.g., COMPRESS_ZIP | COMPRESS_ACTIVE_MASK) of | ||
81 | /// compression option flags (see Compression.h for the available flags) | ||
82 | /// @note Not all combinations of compression options are supported. | ||
83 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
|
6 | void setCompression(uint32_t c) { mCompression = c; } |
84 | |||
85 | /// @brief Return @c true if grid statistics (active voxel count and | ||
86 | /// bounding box, etc.) are computed and written as grid metadata. | ||
87 |
1/2✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
|
65 | bool isGridStatsMetadataEnabled() const { return mEnableGridStats; } |
88 | /// @brief Specify whether grid statistics (active voxel count and | ||
89 | /// bounding box, etc.) should be computed and written as grid metadata. | ||
90 | void setGridStatsMetadataEnabled(bool b) { mEnableGridStats = b; } | ||
91 | |||
92 | /// @brief Write the grids in the given container to this archive's output stream. | ||
93 | ✗ | virtual void write(const GridCPtrVec&, const MetaMap& = MetaMap()) const {} | |
94 | |||
95 | /// @brief Return @c true if delayed loading is enabled. | ||
96 | /// @details If enabled, delayed loading can be disabled for individual files, | ||
97 | /// but not vice-versa. | ||
98 | /// @note Define the environment variable @c OPENVDB_DISABLE_DELAYED_LOAD | ||
99 | /// to disable delayed loading unconditionally. | ||
100 | static bool isDelayedLoadingEnabled(); | ||
101 | |||
102 | protected: | ||
103 | /// @brief Return @c true if the input stream contains grid offsets | ||
104 | /// that allow for random access or partial reading. | ||
105 |
16/22✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 102 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 53 times.
✓ Branch 12 taken 3 times.
✓ Branch 13 taken 3 times.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 41 times.
✓ Branch 17 taken 6 times.
✓ Branch 18 taken 3 times.
✓ Branch 19 taken 25 times.
✓ Branch 20 taken 5 times.
✓ Branch 21 taken 51 times.
|
308 | bool inputHasGridOffsets() const { return mInputHasGridOffsets; } |
106 | 119 | void setInputHasGridOffsets(bool b) { mInputHasGridOffsets = b; } | |
107 | |||
108 | /// @brief Tag the given input stream with the input file format version number. | ||
109 | /// | ||
110 | /// The tag can be retrieved with getFormatVersion(). | ||
111 | /// @sa getFormatVersion() | ||
112 | void setFormatVersion(std::istream&); | ||
113 | |||
114 | /// @brief Tag the given input stream with the version number of | ||
115 | /// the library with which the input stream was created. | ||
116 | /// | ||
117 | /// The tag can be retrieved with getLibraryVersion(). | ||
118 | /// @sa getLibraryVersion() | ||
119 | void setLibraryVersion(std::istream&); | ||
120 | |||
121 | /// @brief Tag the given input stream with flags indicating whether | ||
122 | /// the input stream contains compressed data and how it is compressed. | ||
123 | void setDataCompression(std::istream&); | ||
124 | |||
125 | /// @brief Tag an output stream with flags specifying only those | ||
126 | /// compression options that are applicable to the given grid. | ||
127 | void setGridCompression(std::ostream&, const GridBase&) const; | ||
128 | /// @brief Read in the compression flags for a grid and | ||
129 | /// tag the given input stream with those flags. | ||
130 | static void readGridCompression(std::istream&); | ||
131 | |||
132 | /// Read in and return the number of grids on the input stream. | ||
133 | static int32_t readGridCount(std::istream&); | ||
134 | |||
135 | /// Populate the given grid from the input stream. | ||
136 | static void readGrid(GridBase::Ptr, const GridDescriptor&, std::istream&); | ||
137 | /// @brief Populate the given grid from the input stream, but only where it | ||
138 | /// intersects the given world-space bounding box. | ||
139 | static void readGrid(GridBase::Ptr, const GridDescriptor&, std::istream&, const BBoxd&); | ||
140 | /// @brief Populate the given grid from the input stream, but only where it | ||
141 | /// intersects the given index-space bounding box. | ||
142 | static void readGrid(GridBase::Ptr, const GridDescriptor&, std::istream&, const CoordBBox&); | ||
143 | |||
144 | using NamedGridMap = std::map<Name /*uniqueName*/, GridBase::Ptr>; | ||
145 | |||
146 | /// @brief If the grid represented by the given grid descriptor | ||
147 | /// is an instance, connect it with its instance parent. | ||
148 | void connectInstance(const GridDescriptor&, const NamedGridMap&) const; | ||
149 | |||
150 | /// Write the given grid descriptor and grid to an output stream | ||
151 | /// and update the GridDescriptor offsets. | ||
152 | /// @param seekable if true, the output stream supports seek operations | ||
153 | void writeGrid(GridDescriptor&, GridBase::ConstPtr, std::ostream&, bool seekable) const; | ||
154 | /// Write the given grid descriptor and grid metadata to an output stream | ||
155 | /// and update the GridDescriptor offsets, but don't write the grid's tree, | ||
156 | /// since it is shared with another grid. | ||
157 | /// @param seekable if true, the output stream supports seek operations | ||
158 | void writeGridInstance(GridDescriptor&, GridBase::ConstPtr, | ||
159 | std::ostream&, bool seekable) const; | ||
160 | |||
161 | /// @brief Read the magic number, version numbers, UUID, etc. from the given input stream. | ||
162 | /// @return @c true if the input UUID differs from the previously-read UUID. | ||
163 | bool readHeader(std::istream&); | ||
164 | /// @brief Write the magic number, version numbers, UUID, etc. to the given output stream. | ||
165 | /// @param seekable if true, the output stream supports seek operations | ||
166 | /// @todo This method should not be const since it actually redefines the UUID! | ||
167 | void writeHeader(std::ostream&, bool seekable) const; | ||
168 | |||
169 | //@{ | ||
170 | /// Write the given grids to an output stream. | ||
171 | void write(std::ostream&, const GridPtrVec&, bool seekable, const MetaMap& = MetaMap()) const; | ||
172 | void write(std::ostream&, const GridCPtrVec&, bool seekable, const MetaMap& = MetaMap()) const; | ||
173 | //@} | ||
174 | |||
175 | private: | ||
176 | friend class ::TestFile; | ||
177 | |||
178 | /// The version of the file that was read | ||
179 | uint32_t mFileVersion; | ||
180 | /// The version of the library that was used to create the file that was read | ||
181 | VersionId mLibraryVersion; | ||
182 | /// 16-byte (128-bit) UUID | ||
183 | mutable boost::uuids::uuid mUuid;// needs to be mutable since writeHeader is const! | ||
184 | /// Flag indicating whether the input stream contains grid offsets | ||
185 | /// and therefore supports partial reading | ||
186 | bool mInputHasGridOffsets; | ||
187 | /// Flag indicating whether a tree shared by multiple grids should be | ||
188 | /// written out only once (true) or once per grid (false) | ||
189 | bool mEnableInstancing; | ||
190 | /// Flags indicating whether and how the data stream is compressed | ||
191 | uint32_t mCompression; | ||
192 | /// Flag indicating whether grid statistics metadata should be written | ||
193 | bool mEnableGridStats; | ||
194 | }; // class Archive | ||
195 | |||
196 | } // namespace io | ||
197 | } // namespace OPENVDB_VERSION_NAME | ||
198 | } // namespace openvdb | ||
199 | |||
200 | #endif // OPENVDB_IO_ARCHIVE_HAS_BEEN_INCLUDED | ||
201 |