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