From 2a2e64829786ee415fd0c0f16957c55e174b793b Mon Sep 17 00:00:00 2001 From: adam Date: Sun, 29 Jun 2008 19:43:31 -0700 Subject: [PATCH] checkpoint darcs-hash:20080630024331-5007d-e5eb1ba5d4748ce2ef802ddaf338ccf084f257b3.gz --- src/edu/berkeley/qfat/InteractiveMeshViewer.java | 39 +++++ src/edu/berkeley/qfat/Mesh.java | 41 +++++ src/edu/berkeley/qfat/MeshViewer.java | 180 +--------------------- src/edu/berkeley/qfat/Viewer.java | 7 + 4 files changed, 91 insertions(+), 176 deletions(-) diff --git a/src/edu/berkeley/qfat/InteractiveMeshViewer.java b/src/edu/berkeley/qfat/InteractiveMeshViewer.java index 10ec045..1a72d7e 100644 --- a/src/edu/berkeley/qfat/InteractiveMeshViewer.java +++ b/src/edu/berkeley/qfat/InteractiveMeshViewer.java @@ -15,4 +15,43 @@ public class InteractiveMeshViewer extends MeshViewer { public InteractiveMeshViewer(JFrame f) { super(f); } + public synchronized void dump() { + try { + PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("dump.stl"))); + pw.println("solid dump"); + for(Mesh.T t : tile) { + Vec normal = t.norm(); + pw.println("facet normal " + normal.x + " " + normal.y + " " + normal.z); + pw.println(" outer loop"); + for(Mesh.Vertex v : new Mesh.Vertex[] { t.v1(), t.v2(), t.v3() }) { + pw.println(" vertex " + v.p.x + " " + v.p.y + " " + v.p.z); + } + pw.println(" endloop"); + pw.println("endfacet"); + } + pw.println("endsolid dump"); + pw.flush(); + pw.close(); + } catch (Exception e) { throw new RuntimeException(e); } + } + + public void keyPressed(KeyEvent e) { + super.keyPressed(e); + switch(e.getKeyCode()) { + case KeyEvent.VK_SPACE: breaks++; force = true; break; + case KeyEvent.VK_UP: temp = temp * 2; break; + case KeyEvent.VK_ENTER: temp = 10; break; + case KeyEvent.VK_LEFT: whichNeighbor--; break; + case KeyEvent.VK_RIGHT: whichNeighbor++; break; + case KeyEvent.VK_D: dump(); break; + case KeyEvent.VK_E: errorNormals = !errorNormals; break; + case KeyEvent.VK_A: hillclimb = false; anneal = !anneal; break; + case KeyEvent.VK_H: anneal = true; hillclimb = !hillclimb; break; + case KeyEvent.VK_N: neighbors = !neighbors; break; + case KeyEvent.VK_T: tileon = !tileon; break; + case KeyEvent.VK_G: goalon = !goalon; break; + case KeyEvent.VK_M: tilemeshon = !tilemeshon; break; + } + } + } \ No newline at end of file diff --git a/src/edu/berkeley/qfat/Mesh.java b/src/edu/berkeley/qfat/Mesh.java index fd73795..d56e2a0 100644 --- a/src/edu/berkeley/qfat/Mesh.java +++ b/src/edu/berkeley/qfat/Mesh.java @@ -19,6 +19,47 @@ public class Mesh implements Iterable { private RTree triangles = new RTree(); private PointSet vertices = new PointSet(); + + public boolean option_wireframe = false; + public boolean option_errorNormals = false; + + public void render(GL gl, Matrix m) { + if (option_wireframe) { + gl.glDisable(GL.GL_LIGHTING); + gl.glBegin(GL.GL_LINES); + gl.glColor3f(1, 1, 1); + for (T t : this) { + m.times(t.e1().p1.goodp).glVertex(gl); + m.times(t.e1().p2.goodp).glVertex(gl); + m.times(t.e2().p1.goodp).glVertex(gl); + m.times(t.e2().p2.goodp).glVertex(gl); + m.times(t.e3().p1.goodp).glVertex(gl); + m.times(t.e3().p2.goodp).glVertex(gl); + } + gl.glEnd(); + gl.glEnable(GL.GL_LIGHTING); + return; + } + for(T t : this) { + 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); + t.glTriangle(gl, m); + } + if (option_errorNormals) + for(T t : this) + for(Mesh.Vertex p : new Mesh.Vertex[] { t.v1(), t.v2(), t.v3() }) { + if (p.ok) { + gl.glBegin(GL.GL_LINES); + gl.glColor3f(1, 1, 1); + p.p.glVertex(gl); + p.p.plus(p.norm().times((float)p.error()*10)).glVertex(gl); + gl.glEnd(); + } + } + } + public boolean immutableVertices; public Mesh error_against = null; public double error = 0; diff --git a/src/edu/berkeley/qfat/MeshViewer.java b/src/edu/berkeley/qfat/MeshViewer.java index 356fbad..3f57d77 100644 --- a/src/edu/berkeley/qfat/MeshViewer.java +++ b/src/edu/berkeley/qfat/MeshViewer.java @@ -14,7 +14,6 @@ import edu.berkeley.qfat.geom.Point; public class MeshViewer extends Viewer { public int whichNeighbor = 1; - public double temp; public boolean tileon = true; public boolean tilemeshon = false; @@ -42,17 +41,6 @@ public class MeshViewer extends Viewer { if (transforms==null) return; glcanvas.setSize(f.getWidth(), f.getHeight() - 100); - Graphics2D g = (Graphics2D)f.getGraphics(); - g.setColor(Color.black); - g.fillRect(0, f.getHeight()-100, f.getWidth(), f.getHeight()); - g.setColor(Color.red); - int top = f.getHeight()-70; - g.drawString("temperature: "+temps, 10, 30+top); - g.drawString("acceptance: "+accepts, 10, 50+top); - g.drawString("vertices: "+vertss, 10, 70+top); - g.fillRect(140, 25+top, temps, 10); - g.fillRect(140, 45+top, accepts, 10); - g.fillRect(140, 65+top, vertss, 10); GLU glu = new GLU(); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); @@ -63,49 +51,16 @@ public class MeshViewer extends Viewer { gl.glRotatef(anglex/3, 0, 1, 0); gl.glRotatef(-(angley/3), 1, 0, 0); - - gl.glDisable(GL.GL_LIGHTING); - gl.glColor4f(1, 0, 0, 1); - gl.glBegin(GL.GL_LINES); - gl.glVertex3f(0,0,0); - gl.glVertex3f(.3f,0,0); - gl.glEnd(); - gl.glColor4f(0, 1, 0, 1); - gl.glBegin(GL.GL_LINES); - gl.glVertex3f(0,0,0); - gl.glVertex3f(0,.3f,0); - gl.glEnd(); - gl.glColor4f(0, 0, 1, 1); - gl.glBegin(GL.GL_LINES); - gl.glVertex3f(0,0,0); - gl.glVertex3f(0,0,.3f); - gl.glEnd(); - gl.glEnable(GL.GL_LIGHTING); - - - gl.glBegin(GL.GL_TRIANGLES); - if (tileon) - draw(gl, true, safeTriangles); - if (tilemeshon) - draw(gl, false, safeTriangles); - gl.glEnd(); - - //draw(gl, false, tile); - - gl.glBegin(GL.GL_TRIANGLES); - gl.glColor4f((float)0.5, (float)0.5, (float)0.5, (float)0.8); - if (goalon) - draw(gl, false, goal); - gl.glEnd(); - + tile.render(gl, Matrix.ONE); + goal.render(gl, Matrix.ONE); int i = 0; gl.glColor4f(1,1,1,1); for(Matrix m : transforms) { i++; if (neighborsWireOne && i!=whichNeighbor) continue; - if (neighbors) draw(gl, true, safeTriangles, m); - else if (neighborsWire || neighborsWireOne) draw(gl, false, safeTriangles, m); + if (neighbors) tile.render(gl, m); + else if (neighborsWire || neighborsWireOne) tile.render(gl, m); } gl.glDisable(GL.GL_LIGHTING); @@ -117,14 +72,6 @@ public class MeshViewer extends Viewer { 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); - updateVisibility(gl, tile); Matrix projection = Matrix.getProjectionMatrix(gl); @@ -144,123 +91,4 @@ public class MeshViewer extends Viewer { } } - private void draw(GL gl, boolean triangles, Iterable tris) { draw(gl, triangles, tris, Matrix.ONE); } - private void draw(GL gl, boolean triangles, Iterable tris, Matrix m) { - float red = 0.0f; - float green = 0.0f; - float blue = 0.0f; - synchronized(this) { - for(Mesh.T t : tris) { - if (red < 0.15) red = 1.0f; - if (green < 0.15) green = 1.0f; - if (blue < 0.15) blue = 1.0f; - red -= .09f; - green -= .12f; - blue -= .15f; - - /* - 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; - case 3: gl.glColor4f((float)0.50, (float)0.50, (float)0.50, (float)0.3); break; - case 4: gl.glColor4f((float)0.25, (float)0.75, (float)0.75, (float)0.3); break; - 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); - else if (t.e3().pair.t==null) gl.glColor4f((float)0.25, (float)0.25, (float)0.75, (float)0.3); - else gl.glColor4f((float)0.75, (float)0.25, (float)0.25, (float)0.3); - */ - //gl.glBegin(GL.GL_LINES); - - if (triangles) { - t.glTriangle(gl, m); - } else { - gl.glDisable(GL.GL_LIGHTING); - gl.glBegin(GL.GL_LINES); - gl.glColor3f(1, 1, 1); - m.times(t.e1().p1.goodp).glVertex(gl); - m.times(t.e1().p2.goodp).glVertex(gl); - m.times(t.e2().p1.goodp).glVertex(gl); - m.times(t.e2().p2.goodp).glVertex(gl); - m.times(t.e3().p1.goodp).glVertex(gl); - m.times(t.e3().p2.goodp).glVertex(gl); - gl.glEnd(); - gl.glEnable(GL.GL_LIGHTING); - } - - Point centroid = t.centroid(); - gl.glBegin(GL.GL_LINES); - gl.glColor3f(1, 1, 1); - - if (triangles && errorNormals) - for(Mesh.Vertex p : new Mesh.Vertex[] { t.v1(), t.v2(), t.v3() }) { - if (p.ok) { - //gl.glDisable(GL.GL_LIGHTING); - gl.glBegin(GL.GL_LINES); - gl.glColor3f(1, 1, 1); - p.p.glVertex(gl); - p.p.plus(p.norm().times((float)p.error()*10)).glVertex(gl); - //if (p.nearest_in_other_mesh != null) p.nearest_in_other_mesh.p.glVertex(gl); - //tile.nearest(p).centroid().glVertex(gl); - gl.glEnd(); - //gl.glEnable(GL.GL_LIGHTING); - } - } - gl.glEnd(); - - } - } - } - - public synchronized void dump() { - try { - PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("dump.stl"))); - pw.println("solid dump"); - for(Mesh.T t : tile) { - Vec normal = t.norm(); - pw.println("facet normal " + normal.x + " " + normal.y + " " + normal.z); - pw.println(" outer loop"); - for(Mesh.Vertex v : new Mesh.Vertex[] { t.v1(), t.v2(), t.v3() }) { - pw.println(" vertex " + v.p.x + " " + v.p.y + " " + v.p.z); - } - pw.println(" endloop"); - pw.println("endfacet"); - } - pw.println("endsolid dump"); - pw.flush(); - pw.close(); - } catch (Exception e) { throw new RuntimeException(e); } - } - - public void keyPressed(KeyEvent e) { - super.keyPressed(e); - switch(e.getKeyCode()) { - case KeyEvent.VK_SPACE: breaks++; force = true; break; - case KeyEvent.VK_UP: temp = temp * 2; break; - case KeyEvent.VK_ENTER: temp = 10; break; - case KeyEvent.VK_LEFT: whichNeighbor--; break; - case KeyEvent.VK_RIGHT: whichNeighbor++; break; - case KeyEvent.VK_D: dump(); break; - case KeyEvent.VK_E: errorNormals = !errorNormals; break; - case KeyEvent.VK_A: hillclimb = false; anneal = !anneal; break; - case KeyEvent.VK_H: anneal = true; hillclimb = !hillclimb; break; - case KeyEvent.VK_N: neighbors = !neighbors; break; - case KeyEvent.VK_T: tileon = !tileon; break; - case KeyEvent.VK_G: goalon = !goalon; break; - case KeyEvent.VK_M: tilemeshon = !tilemeshon; break; - } - } - } \ No newline at end of file diff --git a/src/edu/berkeley/qfat/Viewer.java b/src/edu/berkeley/qfat/Viewer.java index 627b457..89ba7b3 100644 --- a/src/edu/berkeley/qfat/Viewer.java +++ b/src/edu/berkeley/qfat/Viewer.java @@ -83,6 +83,13 @@ public abstract class Viewer implements GLEventListener, MouseListener, MouseMot protected synchronized void updateVisibility(GL gl, Mesh mesh) { Matrix projection = Matrix.getProjectionMatrix(gl); IntBuffer buf = ByteBuffer.allocateDirect(9*4*4).order(ByteOrder.nativeOrder()).asIntBuffer(); + 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); gl.glColor3f(0,0,0); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); for(Mesh.T t : mesh) t.glTriangle(gl, null); -- 1.7.10.4