X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2FMeshViewer.java;h=b4d958add87d0905d5d8260851bce8fc7b437e8a;hp=6bad5ebb421b8fa0f55b9ae1e2922baaf60cd09c;hb=0e80eb500d944f8ad1f3a9e2d296d9a4cbcd7e25;hpb=fe5601878bcdd906f4b58aa204af45272bf21c61 diff --git a/src/edu/berkeley/qfat/MeshViewer.java b/src/edu/berkeley/qfat/MeshViewer.java index 6bad5eb..b4d958a 100644 --- a/src/edu/berkeley/qfat/MeshViewer.java +++ b/src/edu/berkeley/qfat/MeshViewer.java @@ -37,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(); } @@ -92,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; @@ -109,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(); @@ -161,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; @@ -185,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); @@ -260,6 +287,23 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi } //gl.glEnable(GL.GL_DEPTH_TEST); + 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); @@ -267,17 +311,12 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi 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); + 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); @@ -289,14 +328,11 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi 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]); - + 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; @@ -305,12 +341,22 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi 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(); @@ -327,7 +373,8 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi } */ } - + 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. @@ -399,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; @@ -408,8 +456,13 @@ 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; } + */ - if (t.v1().visible && t.v2().visible && t.v3().visible) continue; + 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);