X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2FMeshViewer.java;h=b4d958add87d0905d5d8260851bce8fc7b437e8a;hp=cc05e8692d90c0647563d37a0919a64db2dcae4f;hb=0e80eb500d944f8ad1f3a9e2d296d9a4cbcd7e25;hpb=42acb5af8ff15b7af9fa8f34c071ee58e24faf98 diff --git a/src/edu/berkeley/qfat/MeshViewer.java b/src/edu/berkeley/qfat/MeshViewer.java index cc05e86..b4d958a 100644 --- a/src/edu/berkeley/qfat/MeshViewer.java +++ b/src/edu/berkeley/qfat/MeshViewer.java @@ -1,5 +1,6 @@ package edu.berkeley.qfat; import java.io.*; +import java.nio.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; @@ -36,6 +37,10 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi boolean shift = false; boolean control = false; + public Point getMouse() { + return new Point(mousex, glcanvas.getHeight()-mousey, 0); + } + public void mouseWheelMoved(MouseWheelEvent e) { tz -= e.getWheelRotation(); } @@ -91,8 +96,17 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } - public void mousePressed(MouseEvent e) { } - public void mouseReleased(MouseEvent e) { } + public void mousePressed(MouseEvent e) { + clickPoint = getMouse(); + clickClosest = closest == null ? null : closest.getPoint(); + } + public void mouseReleased(MouseEvent e) { + clickPoint = null; + clickClosest = null; + } + + Point clickPoint = null; + Point clickClosest = null; int mousex; int mousey; @@ -108,8 +122,19 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi float angley = 0; public void mouseDragged(MouseEvent e) { if (shift) { + /* tx += (mousex - e.getX())/(float)20; ty += (mousey - e.getY())/(float)20; + */ + if (closest != null && lastGL != null && projection != null && clickClosest != null) { + synchronized(safeTriangles) { + Vec d1 = projection.inverse().times(getMouse()).minus(projection.inverse().times(clickPoint)); + Vec delta = d1.plus(clickClosest).minus(closest.getPoint()); + //System.out.println(delta + " " + closest.getPoint()); + System.out.println(getMouse().minus(clickPoint)); + closest.move(Matrix.translate(delta), true); + } + } } else { anglex -= mousex - e.getX(); angley += mousey - e.getY(); @@ -160,6 +185,8 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi display(gld); } + private GL lastGL = null; + public int temps; public int accepts; public int vertss; @@ -184,6 +211,7 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi g.fillRect(140, 65+top, vertss, 10); GL gl = drawable.getGL(); + lastGL = gl; GLU glu = new GLU(); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glPointSize(5.0f); @@ -215,9 +243,9 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi 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); @@ -258,8 +286,148 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi */ } //gl.glEnable(GL.GL_DEPTH_TEST); - gl.glEnable (GL.GL_LIGHTING); + 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("--------------------------------- "); + */ } protected HashSet safeTriangles = new HashSet(); @@ -278,7 +446,8 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi green -= .12f; blue -= .15f; - if (triangles) switch(t.color/*class*/) { + /* + if (triangles) switch(t.color) { case 0: gl.glColor4f((float)0.25, (float)0.25, (float)0.75, (float)0.3); break; case 1: gl.glColor4f((float)0.25, (float)0.75, (float)0.25, (float)0.3); break; case 2: gl.glColor4f((float)0.75, (float)0.25, (float)0.25, (float)0.3); break; @@ -287,6 +456,14 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi 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; } + */ + + gl.glColor4f((float)(0.25+(0.05*t.color)), + (float)(0.25+(0.05*t.color)), + (float)(0.75+(0.05*t.color)), + (float)0.3); + //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); @@ -296,15 +473,7 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi //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);