Excited to see the extra int32_t that will be added to OpenVdb!
Another potential suggestion for Emmanuel -- something we've done in the past to accommodate custom data types is look for an existing data type in openvdb that has a size >= our desired size (so in your case, assuming you need 27 floats, you would need an existing data type of size >= 27 * 4 = 108 bytes). Then, we create a packed struct of the same size as the existing data type. From there, all we need to do is reinterpret_cast the data type into a struct whenever we access data (easily hidden behind an API).
So, for example, in the case of a 27-length velocity vector of floats, you could choose the Mat4D type (which is 16 * 8.= 128 bytes) and do:
struct __attribute__((packed)) VelocityVoxel {
using StorageType = Mat4d;
float components[27]; // 108 bytes
int padding[5];
};
openvdb::tree::Tree<VelocityVoxel::StorageType, ...>