X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2FMeshViewer.java;h=a0e236d900c57e0f75278bdc12e14810b1e3ba88;hp=d7481e5a9ee1761fbaed7d6b6cb2b09f37ed173f;hb=00235327934dbc5ffaf5b09cbda538ee0d3686e8;hpb=8cb2aceb7c2b140b70b9955f1a0a6f2524f2314e diff --git a/src/edu/berkeley/qfat/MeshViewer.java b/src/edu/berkeley/qfat/MeshViewer.java index d7481e5..a0e236d 100644 --- a/src/edu/berkeley/qfat/MeshViewer.java +++ b/src/edu/berkeley/qfat/MeshViewer.java @@ -24,7 +24,10 @@ public class MeshViewer extends JPanel implements GLEventListener, MouseListener private float anglex = 0; private float angley = 0; + boolean drawEdge = false; + private Mesh.Vertex closest = null; + private Mesh.E closestEdge = null; private Point closestOriginallyAt = null; private int mousex; private int mousey; @@ -32,6 +35,7 @@ public class MeshViewer extends JPanel implements GLEventListener, MouseListener private Point clickPoint = null; private GLCanvas glcanvas; private boolean updateVisibilities = false; + private boolean updateClosest = false; private boolean mouseInside = false; private HashSet meshes = new HashSet(); @@ -110,10 +114,73 @@ public class MeshViewer extends JPanel implements GLEventListener, MouseListener if (closest != null) { gl.glDisable(GL.GL_LIGHTING); gl.glShadeModel(GL.GL_FLAT); - gl.glColor3f(1,1,1); - gl.glBegin(gl.GL_POINTS); - closest.getPoint().glVertex(gl); - gl.glEnd(); + + if (drawEdge) { + for(Mesh.E e : (Iterable)closestEdge.getBoundPeers()) { + gl.glColor3f(0,1,0); + gl.glBegin(gl.GL_LINES); + e.glVertices(gl); + gl.glEnd(); + gl.glColor3f(1,0,0); + gl.glBegin(gl.GL_LINES); + e.pair.glVertices(gl); + gl.glEnd(); + } + /* + if (closestEdge != null) { + gl.glColor3f(1,1,0); + gl.glBegin(gl.GL_TRIANGLES); + Mesh.T t = closestEdge.t; + t.p1().glVertex(gl); + t.p2().glVertex(gl); + t.p3().glVertex(gl); + gl.glColor3f(0,1,1); + main.transforms[main.whichNeighbor-1].times(closestEdge.t.p1()).glVertex(gl); + main.transforms[main.whichNeighbor-1].times(closestEdge.t.p2()).glVertex(gl); + main.transforms[main.whichNeighbor-1].times(closestEdge.t.p3()).glVertex(gl); + System.out.println("t=" + +t.p1()+"\n " + +t.p2()+"\n " + +t.p3()+"\n " + ); + System.out.println("x=" + +main.transforms[main.whichNeighbor-1].times(t.p1())+"\n " + +main.transforms[main.whichNeighbor-1].times(t.p2())+"\n " + +main.transforms[main.whichNeighbor-1].times(t.p3())+"\n " + ); + gl.glEnd(); + } + */ + } + + if (closest.visible) { + gl.glDisable(GL.GL_DEPTH_TEST); + gl.glColor3f(1,1,0); + gl.glBegin(gl.GL_POINTS); + closest.getPoint().glVertex(gl); + gl.glColor3f(0.5f,0.5f,0); + for(Mesh.Vertex v : (Iterable)closest.getBoundPeers()) + if (v!=closest) + v.getPoint().glVertex(gl); + gl.glEnd(); + + if (closest.getBindingConstraint() instanceof Plane) { + Plane p = (Plane)closest.getBindingConstraint(); + Vec v = p.norm(); + gl.glEnable(gl.GL_BLEND); + gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA); + gl.glColor4f(1,1,0,0.3f); + gl.glBegin(gl.GL_LINES); + closest.getPoint().glVertex(gl); + v.plus(closest.getPoint()).glVertex(gl); + closest.getPoint().glVertex(gl); + v.times(-1).plus(closest.getPoint()).glVertex(gl); + gl.glEnd(); + gl.glDisable(gl.GL_BLEND); + } + + gl.glEnable(GL.GL_DEPTH_TEST); + } } projection = Matrix.getProjectionMatrix(gl); @@ -122,11 +189,15 @@ public class MeshViewer extends JPanel implements GLEventListener, MouseListener updateVisibilities = false; // update vertex visibilities updateVisibility(gl); - - //Matrix projection = Matrix.getProjectionMatrix(gl); + } + + if (updateClosest) { + updateClosest = false; double dist = Double.MAX_VALUE; + double distE = Double.MAX_VALUE; closest = null; closestOriginallyAt = null; + closestEdge = null; for(Mesh mesh : meshes) if (mesh.option_selectable) for(Mesh.Vertex v : mesh.vertices()) { @@ -140,6 +211,17 @@ public class MeshViewer extends JPanel implements GLEventListener, MouseListener dist = (x-mousex)*(x-mousex)+(y-mousey)*(y-mousey); closest = v; } + for(Mesh.E e = v.e; e!=null; e=e.pair.next==v.e?null:e.pair.next) { + if (!e.v2.visible) continue; + Segment s = + new Segment(projection.times(e.v1.getPoint()), + projection.times(e.v2.getPoint())); + double dist2 = s.distance(getMouse()); + if (dist2 < distE) { + distE = dist2; + closestEdge = e; + } + } } } } @@ -153,24 +235,26 @@ public class MeshViewer extends JPanel implements GLEventListener, MouseListener gl.glFlush(); gl.glDisable(GL.GL_LIGHTING); gl.glShadeModel(GL.GL_FLAT); - gl.glColor3f(0,0,0); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); - for(Mesh mesh : meshes) mesh.render(gl, Matrix.ONE); + gl.glColor3f(0,0,0); + for(Mesh mesh : meshes) mesh.render(gl, Matrix.ONE, true); for(Mesh mesh : meshes) if (mesh.option_selectable) for(Mesh.Vertex v : mesh.vertices()) { Point p = v.getPoint(); + Point projected = projection.times(p); + boolean vis = false; + gl.glColor3f(1,1,1); gl.glBegin(gl.GL_POINTS); p.glVertex(gl); gl.glEnd(); gl.glFlush(); - - Point projected = projection.times(p); + + vis = false; gl.glReadPixels((int)projected.x-1, (int)projected.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); @@ -216,12 +300,18 @@ public class MeshViewer extends JPanel implements GLEventListener, MouseListener public void mouseMoved(MouseEvent e) { mousex = e.getX(); mousey = e.getY(); - if ((e.getModifiersEx() & MouseEvent.SHIFT_DOWN_MASK) != 0) + + if ((e.getModifiersEx() & MouseEvent.SHIFT_DOWN_MASK) != 0) { updateVisibilities = true; + drawEdge = true; + updateClosest = true; + } } public void mouseDragged(MouseEvent e) { if ((e.getModifiersEx() & MouseEvent.SHIFT_DOWN_MASK) != 0) { + updateVisibilities = true; + drawEdge = true; if (closest != null && projection != null) { synchronized(this) { if (closestOriginallyAt==null) closestOriginallyAt = closest.getPoint(); @@ -230,7 +320,10 @@ public class MeshViewer extends JPanel implements GLEventListener, MouseListener closest.move(delta, false); } } + } else if ((e.getModifiersEx() & MouseEvent.CTRL_DOWN_MASK) != 0) { + // move edge } else { + updateVisibilities = true; anglex -= mousex - e.getX(); angley += mousey - e.getY(); }