Hi Brett and Wes,
It certainly is possible to use non-POD data types as voxel values in VDB, in fact we do it all the time! However, I admit that the documentation could be much better - to put it mildly :) In fact the best description and example is to look at the local class
BlindData in ParticlesToLevelSet.h. It's a simple non-POD data type that includes all the methods needed to perform some simple level set operations (CSG). The exact number of methods required for a custom value type varies somewhat with the methods you call on the corresponding tree, and
BlindData might even include methods that are not needed in your case. The sad truth is that the only way to be sure is by trial and error, but of course it helps to start out with a good guess like the set of methods in BlindData. We've tried to reduce the number of required methods on custom value types, but unfortunately found that to do so we have to remove algorithms from the tree structure and make them external stand-alone functions which in turn can impair performance. On the upside most of these methods are also required by std container classes and the ones that are not can easily be implemented as nops. Hope this was helpful advise?!
-Ken