OpenVDB  12.0.0
GridDescriptor.h
Go to the documentation of this file.
1 // Copyright Contributors to the OpenVDB Project
2 // SPDX-License-Identifier: Apache-2.0
3 
4 #ifndef OPENVDB_IO_GRIDDESCRIPTOR_HAS_BEEN_INCLUDED
5 #define OPENVDB_IO_GRIDDESCRIPTOR_HAS_BEEN_INCLUDED
6 
7 #include <openvdb/Grid.h>
8 #include <iostream>
9 #include <string>
10 
11 namespace openvdb {
13 namespace OPENVDB_VERSION_NAME {
14 namespace io {
15 
16 /// This structure stores useful information that describes a grid on disk.
17 /// It can be used to retrieve I/O information about the grid such as
18 /// offsets into the file where the grid is located, its type, etc.
20 {
21 public:
23  GridDescriptor(const Name& name, const Name& gridType, bool saveFloatAsHalf = false);
24  GridDescriptor(const GridDescriptor&) = default;
25  GridDescriptor& operator=(const GridDescriptor&) = default;
26  ~GridDescriptor();
27 
28  const Name& gridType() const { return mGridType; }
29  const Name& gridName() const { return mGridName; }
30  const Name& uniqueName() const { return mUniqueName; }
31 
32  const Name& instanceParentName() const { return mInstanceParentName; }
33  void setInstanceParentName(const Name& name) { mInstanceParentName = name; }
34  bool isInstance() const { return !mInstanceParentName.empty(); }
35 
36  bool saveFloatAsHalf() const { return mSaveFloatAsHalf; }
37 
38  void setGridPos(int64_t pos) { mGridPos = pos; }
39  int64_t getGridPos() const { return mGridPos; }
40 
41  void setBlockPos(int64_t pos) { mBlockPos = pos; }
42  int64_t getBlockPos() const { return mBlockPos; }
43 
44  void setEndPos(int64_t pos) { mEndPos = pos; }
45  int64_t getEndPos() const { return mEndPos; }
46 
47  // These methods seek to the right position in the given stream.
48  void seekToGrid(std::istream&) const;
49  void seekToBlocks(std::istream&) const;
50  void seekToEnd(std::istream&) const;
51 
52  void seekToGrid(std::ostream&) const;
53  void seekToBlocks(std::ostream&) const;
54  void seekToEnd(std::ostream&) const;
55 
56  /// @brief Write out this descriptor's header information (all data except for
57  /// stream offsets).
58  void writeHeader(std::ostream&) const;
59 
60  /// @brief Since positions into the stream are known at a later time, they are
61  /// written out separately.
62  void writeStreamPos(std::ostream&) const;
63 
64  /// @brief Read a grid descriptor from the given stream.
65  /// @return an empty grid of the type specified by the grid descriptor.
66  GridBase::Ptr read(std::istream&);
67 
68  /// @brief Append the number @a n to the given name (separated by an ASCII
69  /// "record separator" character) and return the resulting name.
70  static Name addSuffix(const Name&, int n);
71  /// @brief Strip from the given name any suffix that is separated by an ASCII
72  /// "record separator" character and return the resulting name.
73  static Name stripSuffix(const Name&);
74  /// @brief Given a name with suffix N, return "name[N]", otherwise just return "name".
75  /// Use this to produce a human-readable string from a descriptor's unique name.
76  static std::string nameAsString(const Name&);
77  /// @brief Given a string of the form "name[N]", return "name" with the suffix N
78  /// separated by an ASCII "record separator" character). Otherwise just return
79  /// the string as is.
80  static Name stringAsUniqueName(const std::string&);
81 
82 private:
83  /// Name of the grid
84  Name mGridName;
85  /// Unique name for this descriptor
86  Name mUniqueName;
87  /// If nonempty, the name of another grid that shares this grid's tree
88  Name mInstanceParentName;
89  /// The type of the grid
90  Name mGridType;
91  /// Are floats quantized to 16 bits on disk?
92  bool mSaveFloatAsHalf;
93  /// Location in the stream where the grid data is stored
94  int64_t mGridPos;
95  /// Location in the stream where the grid blocks are stored
96  int64_t mBlockPos;
97  /// Location in the stream where the next grid descriptor begins
98  int64_t mEndPos;
99 };
100 
101 } // namespace io
102 } // namespace OPENVDB_VERSION_NAME
103 } // namespace openvdb
104 
105 #endif // OPENVDB_IO_GRIDDESCRIPTOR_HAS_BEEN_INCLUDED
#define OPENVDB_API
Definition: Platform.h:268
const Name & gridType() const
Definition: GridDescriptor.h:28
void setBlockPos(int64_t pos)
Definition: GridDescriptor.h:41
SharedPtr< GridBase > Ptr
Definition: Grid.h:80
bool saveFloatAsHalf() const
Definition: GridDescriptor.h:36
int64_t getGridPos() const
Definition: GridDescriptor.h:39
void setEndPos(int64_t pos)
Definition: GridDescriptor.h:44
const Name & gridName() const
Definition: GridDescriptor.h:29
const Name & uniqueName() const
Definition: GridDescriptor.h:30
Definition: Exceptions.h:13
int64_t getEndPos() const
Definition: GridDescriptor.h:45
void setGridPos(int64_t pos)
Definition: GridDescriptor.h:38
bool isInstance() const
Definition: GridDescriptor.h:34
void setInstanceParentName(const Name &name)
Definition: GridDescriptor.h:33
const Name & instanceParentName() const
Definition: GridDescriptor.h:32
int64_t getBlockPos() const
Definition: GridDescriptor.h:42
Definition: GridDescriptor.h:19
std::string Name
Definition: Name.h:19
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h.in:121
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h.in:218