Picking problem?

Dear All,

While debugging some picking code, I decided to try the picksquare sample in OpenGL red book.

The code doesn’t work and I’m not sure why, can anyone help? ???

Thanks,

Here is the sample ported to JOGL:



import java.awt.Frame;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import net.java.games.jogl.Animator;
import net.java.games.jogl.GL;
import net.java.games.jogl.GLCanvas;
import net.java.games.jogl.GLCapabilities;
import net.java.games.jogl.GLDrawable;
import net.java.games.jogl.GLDrawableFactory;
import net.java.games.jogl.GLEventListener;
import net.java.games.jogl.GLU;

public class PickSquare {
      
      public static void main(String[] args) {
        Frame frame = new Frame("PickSquare Demo");
        GLCanvas canvas = GLDrawableFactory.getFactory().createGLCanvas(new GLCapabilities());

        canvas.addGLEventListener(new PickSquareSample());
        frame.add(canvas);
        frame.setSize(300, 300);
        final Animator animator = new Animator(canvas);
        frame.addWindowListener(new WindowAdapter() {
              public void windowClosing(WindowEvent e) {
                  animator.stop();
                  System.exit(0);
              }
            });
        frame.show();
        animator.start();
      }
      
      static class PickSquareSample implements GLEventListener, MouseListener {
      
            GL myGL;
            GLU myGLU;
      
            private int board[][] = new int[3][3]; /* amount of color for each square */
      
            private void init () {
                  int i, j;
                  for (i = 0; i < 3; i++) {
                        for (j = 0; j < 3; j++) {
                        board [i][j] = 0;
                        }
                  }
                  myGL.glClearColor (0.0f, 0.0f, 0.0f, 0.0f); 
            }
      
            private void drawSquares (int mode) {
                  int i, j;
                  for (i = 0; i < 3; i++) {
                        if (mode == GL.GL_SELECT) {
                              myGL.glLoadName (i);
                        }
                        for (j = 0; j < 3; j ++) {
                              if (mode == GL.GL_SELECT) {
                                    myGL.glPushName (j);
                              }
                              myGL.glColor3f ((float)(i/3.0),(float)(j/3.0),(float)(board[i][j]/3.0));
                              myGL.glRecti (i, j, i+1, j+1);
                              if (mode == GL.GL_SELECT) {
                                    myGL.glPopName ();
                              }
                        }
                  }
            }
      
            private void processHits (int hits, int buffer []) {
                  int i, j;
                  int ii = 0, jj = 0, names, ptr;
            
                  System.out.println ("hits = " + hits);
                  ptr = 0;
                  for (i = 0; i < hits; i++) {        /*  for each hit  */
                        names = buffer [ptr];
                        System.out.println (" number of names for hit = " + names); ptr++;
                        System.out.print ("  z1 is " + buffer [ptr] + ";"); ptr++;
                        System.out.println (" z2 is " + buffer [ptr]); ptr++;
                        System.out.print ("   the name is ");
                        for (j = 0; j < names; j++) {   /*  for each name */
                              System.out.print (buffer [ptr] + " ");
                              if (j == 0) { /*  set row and column */
                                    ii = buffer [ptr];
                              } else {
                                    jj = buffer [ptr];
                              }
                              ptr++;
                        }
                        System.out.println ();
                        board [ii][jj] = (board [ii][jj] + 1) % 3;
                  }
            }
      
            private static final int BUFSIZE = 512;
      
            private void pickSquares (MouseEvent e) {
                  int selectBuf [] = new int [BUFSIZE];
                  int hits;
                  int viewport [] = new int [4];
                  int x, y;
            
                  x = e.getX ();
                  y = e.getY ();
                  
                  myGL.glGetIntegerv (GL.GL_VIEWPORT, viewport);
                  
                  myGL.glSelectBuffer (BUFSIZE, selectBuf);
                  myGL.glRenderMode (GL.GL_SELECT);
            
                  myGL.glInitNames ();
                  myGL.glPushName (-1);
            
                  myGL.glMatrixMode (GL.GL_PROJECTION);
                  myGL.glPushMatrix ();
                  myGL.glLoadIdentity ();
                  
                  /*  create 5x5 pixel picking region near cursor location        */
                  myGLU.gluPickMatrix((double)x,(double)(viewport[3]-y),5.0,5.0,viewport);
                  myGLU.gluOrtho2D (0.0, 3.0, 0.0, 3.0);
                  drawSquares (GL.GL_SELECT);
                  myGL.glPopMatrix ();
                  myGL.glFlush ();
            
                  hits = myGL.glRenderMode (GL.GL_RENDER);
                  processHits (hits, selectBuf);
            }
      
            public void mousePressed(MouseEvent e) {
                  // process which button by myself
                  if ((e.getModifiers() & MouseEvent.BUTTON1_MASK) == MouseEvent.BUTTON1_MASK) { // left
                        pickSquares (e);
                        //display(null);
                        e.consume ();
                  }
            } 
      
            public void display (GLDrawable d) {
                  myGL.glClear (GL.GL_COLOR_BUFFER_BIT);
                  drawSquares (GL.GL_RENDER);
                  myGL.glFlush ();
            }
      
            public void reshape(GLDrawable drawable, int x, int y, int w, int h) {
                  myGL.glViewport (0, 0, w, h);
                  myGL.glMatrixMode (GL.GL_PROJECTION);
                  myGL.glLoadIdentity ();
                  myGLU.gluOrtho2D (0.0, 3.0, 0.0, 3.0);
                  myGL.glMatrixMode (GL.GL_MODELVIEW);
                  myGL.glLoadIdentity ();
            }
      
            public void init (GLDrawable drawable) {
                  myGL=drawable.getGL();
                  myGLU=drawable.getGLU();
                  drawable.addMouseListener(this);
                  
                  init ();
            }

            // unimplemented interface methods
            public void displayChanged(GLDrawable arg0, boolean arg1, boolean arg2) {}
            public void mouseClicked(MouseEvent e) {}
            public void mouseEntered(MouseEvent arg0) {}
            public void mouseExited(MouseEvent arg0) {}
            public void mouseReleased(MouseEvent arg0) {}
      }
}