+
+ 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);
+
+ int viewport[] = new int[4];
+ double mvmatrix[] = new double[16];
+ double projmatrix[] = new double[16];
+ double wcoord[] = new double[4];
+ gl.glGetIntegerv(GL.GL_VIEWPORT, viewport, 0);
+ gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX, mvmatrix, 0);
+ gl.glGetDoublev(GL.GL_PROJECTION_MATRIX, projmatrix, 0);
+
+ 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);
+ 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();
+
+ glu.gluProject(p.x,
+ p.y,
+ p.z,
+ mvmatrix, 0, projmatrix, 0, viewport, 0, wcoord, 0);
+ int x = (int)Math.round(wcoord[0]);
+ int y = (int)Math.round(wcoord[1]);
+
+ 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();
+ }
+ }
+ }
+ 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);
+ }
+ */