checkpoint
[anneal.git] / src / edu / berkeley / qfat / InteractiveMeshViewer.java
1 package edu.berkeley.qfat;
2 import java.io.*;
3 import java.nio.*;
4 import java.awt.*;
5 import java.awt.event.*;
6 import javax.swing.*;
7 import javax.media.opengl.*;
8 import javax.media.opengl.glu.*;
9 import com.sun.opengl.util.*;
10 import java.util.*;
11 import edu.berkeley.qfat.geom.*;
12 import edu.berkeley.qfat.geom.Point;
13
14 public class InteractiveMeshViewer extends JPanel {
15
16     public Mesh tile;
17     public Mesh goal;
18
19     private MeshViewer mv;
20
21     public InteractiveMeshViewer(JFrame f) {
22         mv = new MeshViewer();
23         setLayout(new BorderLayout());
24         this.add(mv, BorderLayout.CENTER);
25         setTile(new Mesh(false));
26         setGoal(new Mesh(false));
27     }
28     public void repaint() {
29         if (mv != null) mv.repaint();
30     }
31
32
33     public void setTile(Mesh tile) {
34         mv.removeMesh(this.tile);
35         this.tile = tile;
36         mv.addMesh(this.tile);
37     }
38     public void setGoal(Mesh goal) {
39         mv.removeMesh(this.goal);
40         this.goal = goal;
41         goal.option_selectable = false;
42         goal.option_wireframe = true;
43         mv.addMesh(this.goal);
44     }
45
46     public synchronized void dump() {
47         try {
48             PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("dump.stl")));
49             pw.println("solid dump");
50             for(Mesh.T t : tile) {
51                 Vec normal = t.norm();
52                 pw.println("facet normal " + normal.x + " " + normal.y + " " + normal.z);
53                 pw.println("  outer loop");
54                 for(Mesh.Vertex v : new Mesh.Vertex[] { t.v1(), t.v2(), t.v3() }) {
55                     pw.println("    vertex " + v.p.x + " " + v.p.y + " " + v.p.z);
56                 }
57                 pw.println("  endloop");
58                 pw.println("endfacet");
59             }
60             pw.println("endsolid dump");
61             pw.flush();
62             pw.close();
63         } catch (Exception e) { throw new RuntimeException(e); }
64     }
65
66     public int whichNeighbor = 1;
67     public double temp;
68     public boolean tileon = true;
69     public boolean tilemeshon = false;
70     public boolean goalon = true;
71     public boolean anneal = false;
72     public boolean hillclimb = false;
73     public boolean neighbors = false;
74     public boolean neighborsWire = false;
75     public boolean neighborsWireOne = false;
76     public boolean errorNormals = false;
77
78     public boolean force = false;
79     public Mesh.Vertex[] points;
80     public int breaks = 0;
81
82     public int temps;
83     public int accepts;
84     public    int vertss;
85
86     public void keyPressed(KeyEvent e)  {
87         //super.keyPressed(e);
88         switch(e.getKeyCode()) {
89             case KeyEvent.VK_SPACE: breaks++; force = true; break;
90             case KeyEvent.VK_UP: temp = temp * 2; break;
91             case KeyEvent.VK_ENTER: temp = 10; break;
92             case KeyEvent.VK_LEFT: whichNeighbor--; break;
93             case KeyEvent.VK_RIGHT: whichNeighbor++; break;
94             case KeyEvent.VK_D: dump(); break;
95             case KeyEvent.VK_E: errorNormals = !errorNormals; break;
96             case KeyEvent.VK_A: hillclimb = false; anneal = !anneal; break;
97             case KeyEvent.VK_H: anneal = true; hillclimb = !hillclimb; break;
98             case KeyEvent.VK_N: neighbors = !neighbors; break;
99             case KeyEvent.VK_T: tileon = !tileon; break;
100             case KeyEvent.VK_G: goalon = !goalon; break;
101             case KeyEvent.VK_M: tilemeshon = !tilemeshon; break;
102         }
103     }
104
105 }