@@ -182,7 +182,9 @@ struct ReadTopologyOp
182182 valueMask.load (is);
183183 node.setValueMaskUnsafe (valueMask);
184184
185- const Index numValues = NodeT::NUM_VALUES;
185+ const bool oldVersion =
186+ (io::getFormatVersion (is) < OPENVDB_FILE_VERSION_NODE_MASK_COMPRESSION);
187+ const Index numValues = (oldVersion ? childMask.countOff () : NodeT::NUM_VALUES);
186188 {
187189 // Read in (and uncompress, if necessary) all of this node's values
188190 // into a contiguous array.
@@ -191,13 +193,27 @@ struct ReadTopologyOp
191193 io::readCompressedValues (is, values, numValues, valueMask, saveFloatAsHalf);
192194
193195 // Copy values from the array into this node's table.
194- if constexpr (std::is_same_v<ValueT, StorageValueT>) {
195- for (auto iter = node.beginValueAll (); iter; ++iter) {
196- node.setValueOnlyUnsafe (iter.pos (), values[iter.pos ()]);
196+ if (oldVersion) {
197+ Index n = 0 ;
198+ if constexpr (std::is_same_v<ValueT, StorageValueT>) {
199+ for (auto iter = node.beginValueAll (); iter; ++iter) {
200+ node.setValueOnlyUnsafe (iter.pos (), values[n++]);
201+ }
202+ } else {
203+ for (auto iter = node.beginValueAll (); iter; ++iter) {
204+ node.setValueOnlyUnsafe (iter.pos (), static_cast <ValueT>(values[n++]));
205+ }
197206 }
207+ OPENVDB_ASSERT (n == numValues);
198208 } else {
199- for (auto iter = node.beginValueAll (); iter; ++iter) {
200- node.setValueOnlyUnsafe (iter.pos (), static_cast <ValueT>(values[iter.pos ()]));
209+ if constexpr (std::is_same_v<ValueT, StorageValueT>) {
210+ for (auto iter = node.beginValueAll (); iter; ++iter) {
211+ node.setValueOnlyUnsafe (iter.pos (), values[iter.pos ()]);
212+ }
213+ } else {
214+ for (auto iter = node.beginValueAll (); iter; ++iter) {
215+ node.setValueOnlyUnsafe (iter.pos (), static_cast <ValueT>(values[iter.pos ()]));
216+ }
201217 }
202218 }
203219 }
0 commit comments