package edu.berkeley.qfat;
import java.io.*;
+import java.nio.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
gl.glBegin(GL.GL_TRIANGLES);
if (tileon)
- draw(gl, true, safeTriangles);
+ draw(gl, true, safeTriangles);
if (tilemeshon)
- draw(gl, false, safeTriangles);
+ draw(gl, false, safeTriangles);
gl.glEnd();
//draw(gl, false, tile);
*/
}
//gl.glEnable(GL.GL_DEPTH_TEST);
- gl.glEnable (GL.GL_LIGHTING);
+ 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);
+ }
+ */
+ }
+
+
+ // 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("--------------------------------- ");
+ */
}
protected HashSet<Mesh.T> safeTriangles = new HashSet<Mesh.T>();
case 5: gl.glColor4f((float)0.25, (float)0.75, (float)0.75, (float)0.3); break;
case 6: gl.glColor4f((float)0.75, (float)0.25, (float)0.75, (float)0.3); break;
}
+
+ if (t.v1().visible && t.v2().visible && t.v3().visible) continue;
+
/*
if (t.e1().pair.t==null) gl.glColor4f((float)0.25, (float)0.25, (float)0.75, (float)0.3);
else if (t.e2().pair.t==null) gl.glColor4f((float)0.25, (float)0.25, (float)0.75, (float)0.3);
//gl.glBegin(GL.GL_LINES);
if (triangles) {
- gl.glBegin(GL.GL_TRIANGLES);
- if (t.shouldBeDrawn()) {
- m.times(t.norm()).glNormal(gl);
- m.times(t.v1().goodp).glVertex(gl);
- m.times(t.v2().goodp).glVertex(gl);
- m.times(t.v3().goodp).glVertex(gl);
- //t.glVertices(gl, m);
- }
- gl.glEnd();
+ t.glTriangle(gl, m);
} else {
gl.glDisable(GL.GL_LIGHTING);
gl.glBegin(GL.GL_LINES);