I’ve cited Evolution War for the first time on this blog in my previous post, today I want to celebrate my return to SVN committing after a very long time. ๐
Revision 71 adds the support for a real Stanford PLY parser and loader, while the one I coded for my graphic class library is very primitive, expecting a hard-coded order for data, this one shouldn’t have any kind of problem with every well-formed PLY file.
For example, while the hard-coded loader can only accept a file like this:
ply format ascii 1.0 comment Created by Blender3D 249 - www.blender.org element vertex 4 property float x property float y property float z property float nx property float ny property float nz element face 3 property list uchar uint vertex_indices end_header 1.000000 2.000000 3.000000 -4.000000 -5.000000 6.000000 -1.000000 -2.000000 -3.000000 4.000000 5.000000 6.000000 1.000000 2.000000 3.000000 -4.000000 -5.000000 6.000000 -1.000000 -2.000000 -3.000000 4.000000 5.000000 6.000000 3 0 1 2 3 1 3 2 3 4 2 1
the parser loader can load even something like this:
ply format ascii 1.0 comment Created and shuffled by hand element face 3 property list uchar uint vertex_indices element skipme 3 property float skipfirst property float skipsecond element vertex 4 property float z property float nz property float y property float ny property float nx property float x end_header 3 0 1 2 3 1 3 2 3 4 2 1 0.0 0.0 0.0 0.0 0.0 0.0 3.000000 -6.000000 2.000000 -5.000000 -4.000000 1.000000 -3.000000 6.000000 -2.000000 5.000000 4.000000 -1.000000 3.000000 -6.000000 2.000000 -5.000000 -4.000000 1.000000 -3.000000 6.000000 -2.000000 5.000000 4.000000 -1.000000
But one of its most important feature resides in the ability to correctly load binary PLY files! ๐
Related to it there’s a bug I would like to share with you together with the fix:
istream& istream::read (char* s, streamsize n); [...] ifstream ifs; unsigned int *uIndices; [...] ifs.read((char *) uIndices+(j*3), sizeof(unsigned int) * 3);
The read() method only accepts char pointers, so uIndices is casted, but the precedence goes to casting and not to native unsigned int pointer arithmetics, leading to catastrophic effects! ๐ฎ
The fix was as simple as the bug was subtle:
-ifs.read((char *) uIndices+(j*3), sizeof(unsigned int) * 3); +ifs.read((char *) (uIndices+(j*3)), sizeof(unsigned int) * 3)