+
+ gl.glDisable(GL.GL_LIGHTING);
+ gl.glShadeModel(GL.GL_FLAT);
+ if (closest != null) {
+ gl.glColor3f(1,1,1);
+ gl.glBegin(gl.GL_POINTS);
+ closest.getPoint().glVertex(gl);
+ gl.glEnd();
+ /*
+ Mesh.Vertex v2 = closest.hack(gl, getMouse());
+ gl.glBegin(GL.GL_LINES);
+ closest.getPoint().glVertex(gl);
+ if (v2 != null) v2.getPoint().glVertex(gl);
+ gl.glEnd();
+ */
+ }
+
+ gl.glFlush();
+ gl.glDrawBuffer(GL.GL_BACK);
+ gl.glReadBuffer( GL.GL_BACK );
+ gl.glPixelStorei( GL.GL_PACK_ALIGNMENT, 1);
+ gl.glFlush();
+ gl.glDisable(GL.GL_LIGHTING);
+ gl.glShadeModel(GL.GL_FLAT);
+
+ IntBuffer buf = ByteBuffer.allocateDirect(9*4*4).order(ByteOrder.nativeOrder()).asIntBuffer();
+ gl.glColor3f(0,0,0);
+ gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
+ double dist = Double.MAX_VALUE;
+ if (clickPoint==null) closest = null;
+ projection = Matrix.getProjectionMatrix(gl);
+ synchronized(safeTriangles) {
+ for(Mesh.T t : safeTriangles)
+ t.glTriangle(gl, null);
+ for(Mesh.Vertex v : tile.vertices()) {
+ Point p = v.getPoint();
+ gl.glColor3f(1,1,1);
+ gl.glBegin(gl.GL_POINTS);
+ p.glVertex(gl);
+ gl.glEnd();
+ gl.glFlush();
+
+ Point projected = projection.times(p);
+ int x = (int)projected.x;
+ int y = (int)projected.y;
+ gl.glReadPixels(x-1, y-1, 3, 3, gl.GL_RGB, gl.GL_UNSIGNED_BYTE, buf);
+
+ boolean vis = false;
+ for(int j=0; j<9*4; j++) vis |= buf.get(j)!=0;
+ v.visible = vis;
+ if (vis) {
+ gl.glColor3f(0,0,0);
+ gl.glBegin(gl.GL_POINTS);
+ p.glVertex(gl);
+ gl.glEnd();
+ y = glcanvas.getHeight()-y;
+ if (clickPoint==null) {
+ if (closest==null || (x-mousex)*(x-mousex)+(y-mousey)*(y-mousey) < dist) {
+ dist = (x-mousex)*(x-mousex)+(y-mousey)*(y-mousey);
+ closest = v;
+ }
+ }
+ }
+ }
+ }
+ gl.glShadeModel(GL.GL_SMOOTH);
+ gl.glEnable(GL.GL_LIGHTING);
+ gl.glDrawBuffer(GL.GL_FRONT);
+
+
+
+ /*
+ IntBuffer selectionBuffer =
+ ByteBuffer.allocateDirect(4*10000).order(ByteOrder.nativeOrder()).asIntBuffer();
+ gl.glSelectBuffer(selectionBuffer.capacity(), selectionBuffer);
+ gl.glInitNames();
+ gl.glRenderMode(GL.GL_SELECT);
+ draw(gl, true, safeTriangles);
+ int hits = gl.glRenderMode(GL.GL_RENDER);
+ synchronized(safeTriangles) {
+ for(Mesh.T t : safeTriangles) {
+ t.occluded = true;
+ }
+ processHits(hits, selectionBuffer);
+ }
+ */
+ }
+ Mesh.Vertex closest = null;
+ Matrix projection = null;
+
+ // I copied this method without changes from the mentioned base class.
+ // It extracts the data in the selection buffer and writes it on the console.
+ public 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++) {
+ int who = buffer.get(offset);
+ for(Mesh.T t : safeTriangles) {
+ if (t.serial==who) {
+ t.occluded = false;
+ }
+ }
+ /*
+ System.out.print(" " + who);
+ if (j == (names - 1)) {
+ System.out.println("<-");
+ } else {
+ System.out.println();
+ }
+ */
+ offset++;
+ }
+ /*
+ System.out.println("- - - - - - - - - - - -");
+ */
+ }
+ /*
+ System.out.println("--------------------------------- ");
+ */