Login  Register

bad use of depths in Picking.java

Posted by gouessej on Sep 09, 2010; 2:24pm
URL: https://forum.jogamp.org/bad-use-of-depths-in-Picking-java-tp1446213.html

Hi!

Picking.java is a provided example of JOGL 2 here:
http://jogamp.org/jogl-demos/src/demos/misc/Picking.java

The both lines above are wrong:
z1 = (float) buffer.get(offset) / 0x7fffffff; offset++;
z2 = (float) buffer.get(offset) / 0x7fffffff; offset++;

Actually, the select buffer contains 32-bits unsigned integers stored into 32-bits signed integers. Then, the last digit is wrongly used as a sign bit. As Java has no unsigned type, at least 33 bits are required to store these positive values with their sign. Therefore, the long type (64 bits) should be used. The both lines above often work correctly except when the depth values are bigger than 2^31. I assume that they have been copied from an example written in C++. We should rather do this:
z1 = (float) (buffer.get(offset)& 0xffffffffL) / 0x7fffffff; offset++;
z2 = (float) (buffer.get(offset)& 0xffffffffL) / 0x7fffffff; offset++;
Julien Gouesse | Personal blog | Website