diff -rC 3 rel-v1/cs418/model/MainWindow.java rel-v2/cs418/model/MainWindow.java
*** rel-v1/cs418/model/MainWindow.java	Sun Mar  2 09:26:04 2003
--- rel-v2/cs418/model/MainWindow.java	Sun Mar  2 23:06:21 2003
***************
*** 7,12 ****
--- 7,13 ----
  package cs418.model;
  
  import java.awt.*;
+ import java.awt.event.*;
  import javax.swing.*;
  import javax.vecmath.*;
  
***************
*** 22,27 ****
--- 23,36 ----
      public MainWindow() {
  	// Ensure that menus appear in front of GL window
  	JPopupMenu.setDefaultLightWeightPopupEnabled(false);
+ 
+ 	// Clean up the OpenGL connection and exit when the window is closed
+ 	addWindowListener(new WindowAdapter() {
+ 		public void windowClosing(WindowEvent e) {
+ 		    viewport.getCanvas().getGLContext().gljFree();
+ 		    System.exit(0);
+ 		}
+ 	    });
  
          // Create the viewport and set its initial size
          viewport = new Viewport(600, 400);
diff -rC 3 rel-v1/cs418/model/Shape.java rel-v2/cs418/model/Shape.java
*** rel-v1/cs418/model/Shape.java	Sun Mar  2 09:26:04 2003
--- rel-v2/cs418/model/Shape.java	Sun Mar  2 23:06:21 2003
***************
*** 26,39 ****
      public Material getMaterial() { return material; }
  
      // Assign unique ID to each shape when created
!     static int nextID = 0;
      int id = nextID++;
  
      // The ID encoded in an RGBA color
      byte[] idColor = { (byte) (id & 0xff),
                         (byte) ((id >> 8) & 0xff),
!                        (byte) ((id >> 16) & 0xff),
!                        (byte) ((id >> 24) & 0xff) };
  
      static private HashMap idToShape = new HashMap();
  
--- 26,39 ----
      public Material getMaterial() { return material; }
  
      // Assign unique ID to each shape when created
!     // 0 is reserved as a guaranteed-invalid ID
!     static int nextID = 1;
      int id = nextID++;
  
      // The ID encoded in an RGBA color
      byte[] idColor = { (byte) (id & 0xff),
                         (byte) ((id >> 8) & 0xff),
!                        (byte) ((id >> 16) & 0xff) };
  
      static private HashMap idToShape = new HashMap();
  
***************
*** 63,69 ****
  	transform.glMultMatrix(gl, glu);
  	if (byID) {
  	    gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_FILL);
! 	    gl.glColor4ubv(idColor);
  	} else {
  	    if (wireframe)
  		gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_LINE);
--- 63,69 ----
  	transform.glMultMatrix(gl, glu);
  	if (byID) {
  	    gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_FILL);
! 	    gl.glColor3ubv(idColor);
  	} else {
  	    if (wireframe)
  		gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_LINE);
diff -rC 3 rel-v1/cs418/model/Viewport.java rel-v2/cs418/model/Viewport.java
*** rel-v1/cs418/model/Viewport.java	Sun Mar  2 09:26:04 2003
--- rel-v2/cs418/model/Viewport.java	Sun Mar  2 23:06:21 2003
***************
*** 87,93 ****
  	gl.glGetIntegerv(GL_ALPHA_BITS, v); aBits = v[0];
  	System.out.println("FB format: " + rBits + "R " + gBits + "G " +
  			   bBits + "B " + aBits + "A");
! 	if (rBits < 8 || gBits < 8 || bBits < 8 || aBits < 8)
  	    System.out.println("Not enough framebuffer precision; picking is not going to work.");
          gl.glEnable(gl.GL_DEPTH_TEST);
      }
--- 87,93 ----
  	gl.glGetIntegerv(GL_ALPHA_BITS, v); aBits = v[0];
  	System.out.println("FB format: " + rBits + "R " + gBits + "G " +
  			   bBits + "B " + aBits + "A");
! 	if (rBits < 8 || gBits < 8 || bBits < 8)
  	    System.out.println("Not enough framebuffer precision; picking is not going to work.");
          gl.glEnable(gl.GL_DEPTH_TEST);
      }
***************
*** 135,141 ****
              GLFunc gl = glj.getGLFunc();
              GLUFunc glu = glj.getGLUFunc();
  	    gl.glShadeModel(gl.GL_FLAT);
! 	    gl.glClearColor(1, 1, 1, 1);
              gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  	    if (camera != null && scene != null) {
  		camera.glRender(gl, glu);
--- 135,141 ----
              GLFunc gl = glj.getGLFunc();
              GLUFunc glu = glj.getGLUFunc();
  	    gl.glShadeModel(gl.GL_FLAT);
! 	    gl.glClearColor(0, 0, 0, 1);
              gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  	    if (camera != null && scene != null) {
  		camera.glRender(gl, glu);
***************
*** 145,152 ****
              gl.glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixval);
              int id = (pixval[0] <<  0 & 0x000000ff |
  		      pixval[1] <<  8 & 0x0000ff00 |
! 		      pixval[2] << 16 & 0x00ff0000 |
! 		      pixval[3] << 24 & 0xff000000);
              glj.gljFree();
  	    return Shape.getShapeById(id);
          } else
--- 145,151 ----
              gl.glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixval);
              int id = (pixval[0] <<  0 & 0x000000ff |
  		      pixval[1] <<  8 & 0x0000ff00 |
! 		      pixval[2] << 16 & 0x00ff0000);
              glj.gljFree();
  	    return Shape.getShapeById(id);
          } else