Please Help,
I am new to the OpenGL Selection and have a quick question that I hope someone can help me with. I get the selection to work fine, i.e., I can record “hits” when switching from GL_SELECT to GL_RENDER but the NAME is not stored.
The output I get (when I select the Object):
"--------------------------
HITS: 1
Number of Names: 0
z1: -0.09484
z2: -0.3213
names:
------------------------------"
The following is the code from which the previous console output comes:
private void processHits(int hits, IntBuffer buffer) {
System.out.println("---------------------------------");
System.out.println(" HITS: " + hits);
int offset = 0;
int names;
float z1, z2;
for (int i = 0; i < hits; i++) {
System.out.println("- - - - - - - - - - - -");
System.out.println(" hit: " + (i + 1));
names = buffer.get(offset);
offset++;
z1 = (float) buffer.get(offset)/0x7fffffff;
offset++;
z2 = (float) buffer.get(offset)/0x7fffffff;
offset++;
System.out.println(" number of names: " + names);
System.out.println(" z1: " + z1);
System.out.println(" z2: " + z2);
System.out.println(" names: ");
for (int j = 0; j < names; j++) {
System.out.print(" " + buffer.get(offset));
if (j == (names - 1)) {
System.out.println("<-");
}else {
System.out.println();
}
offset++;
}// End of INNER FOR-LOOP
System.out.println("- - - - - - - - - - - -");
}// End of OUTER FOR-LOOP
System.out.println("--------------------------------- ");
}// End of processHits(int,IntBuffer)
The naming of the Object is done in the following code:
int[] viewport = new int[4];
int hits = 0;
// allocate fast memory. Necessary since glSelectBuffer takes IntBuffer
//
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4*BUFFERSIZE);
byteBuffer.order(ByteOrder.nativeOrder());
this.selectionBuffer = byteBuffer.asIntBuffer();
// Get the current Viewport for this Class
//
this.gl.glGetIntegerv(GL.GL_VIEWPORT, viewport, 0);
// the hits will be stored in the selection buffer after.
//
// Note that it's called *before* we change the render mode
//
this.gl.glSelectBuffer(selectionBuffer.capacity(), this.selectionBuffer);
// Set the GL Rendering Mode to SELECT
//
this.gl.glRenderMode(GL.GL_SELECT);
// clear name stack
//
this.gl.glInitNames();
// Switch to the Projection Matrix
//
this.gl.glMatrixMode(GL.GL_PROJECTION);
// save current projection matrix
//
this.gl.glPushMatrix();
// reset the projection matrix
//
this.gl.glLoadIdentity();
// restrict drawing to around the cursor
//
this.glu.gluPickMatrix(this.mouseX, viewport[3] - this.mouseY, 5.0d, 5.0d, viewport, 0);
this.glu.gluPerspective(45, this.ratio, 1, 200);
this.gl.glMatrixMode(GL.GL_MODELVIEW);
if (mode == GL.GL_SELECT) {
gl.glPushName(20);
}
// Call draw() that is using geometric primatives to render Object
draw();
this.gl.glMatrixMode(GL.GL_PROJECTION);
this.gl.glPopMatrix();
hits = gl.glRenderMode(GL.GL_RENDER);
this.mode = GL.GL_RENDER;
processHits(hits, selectionBuffer);
Thanks be to anyone that has any idea why this is happening.