X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2FMeshViewer.java;h=b4d958add87d0905d5d8260851bce8fc7b437e8a;hp=c9435658f911f1e0158b5a3602cf11ea930a8465;hb=0e80eb500d944f8ad1f3a9e2d296d9a4cbcd7e25;hpb=2d6bccf0ca59bca01f2a9942e90c7ddb9399ed44 diff --git a/src/edu/berkeley/qfat/MeshViewer.java b/src/edu/berkeley/qfat/MeshViewer.java index c943565..b4d958a 100644 --- a/src/edu/berkeley/qfat/MeshViewer.java +++ b/src/edu/berkeley/qfat/MeshViewer.java @@ -96,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; @@ -113,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(); @@ -165,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; @@ -189,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); @@ -271,11 +294,13 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi 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(); @@ -290,7 +315,8 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi gl.glColor3f(0,0,0); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); double dist = Double.MAX_VALUE; - closest = null; + if (clickPoint==null) closest = null; + projection = Matrix.getProjectionMatrix(gl); synchronized(safeTriangles) { for(Mesh.T t : safeTriangles) t.glTriangle(gl, null); @@ -302,7 +328,7 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi gl.glEnd(); gl.glFlush(); - Point projected = p.glProject(gl); + 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); @@ -316,9 +342,11 @@ public class MeshViewer implements GLEventListener, MouseListener, MouseMotionLi p.glVertex(gl); gl.glEnd(); y = glcanvas.getHeight()-y; - if (closest==null || (x-mousex)*(x-mousex)+(y-mousey)*(y-mousey) < dist) { - dist = (x-mousex)*(x-mousex)+(y-mousey)*(y-mousey); - closest = v; + 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; + } } } } @@ -346,6 +374,7 @@ 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. @@ -417,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; @@ -426,8 +456,12 @@ 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, (float)0.25, (float)0.75, (float)0.3); + 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; /*