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 implements KeyListener {
15
16     public Mesh tile;
17     public Mesh goal;
18
19     private HashSet<MeshViewer> mvs = new HashSet<MeshViewer>();
20
21     public InteractiveMeshViewer(JFrame f) {
22         MeshViewer mv1 = new MeshViewer();
23         MeshViewer mv2 = new MeshViewer();
24         MeshViewer mv3 = new MeshViewer();
25         MeshViewer mv4 = new MeshViewer();
26         mvs.add(mv1);
27         mvs.add(mv2);
28         mvs.add(mv3);
29         mvs.add(mv4);
30         addKeyListener(this);
31         mv1.addKeyListener(this);
32         mv2.addKeyListener(this);
33         mv3.addKeyListener(this);
34         mv4.addKeyListener(this);
35         setLayout(new GridLayout(2,2));
36         this.add(mv1);
37         this.add(mv2);
38         this.add(mv3);
39         this.add(mv4);
40         setTile(new Mesh(false));
41         setGoal(new Mesh(false));
42     }
43     public void repaint() {
44         if (mvs != null)
45             for(MeshViewer mv : mvs)
46                 mv.repaint();
47     }
48
49
50     public void setTile(Mesh tile) {
51         for(MeshViewer mv : mvs) mv.removeMesh(this.tile);
52         this.tile = tile;
53         for(MeshViewer mv : mvs) mv.addMesh(this.tile);
54     }
55     public void setGoal(Mesh goal) {
56         for(MeshViewer mv : mvs) mv.removeMesh(this.goal);
57         this.goal = goal;
58         goal.option_selectable = false;
59         goal.option_wireframe = true;
60         for(MeshViewer mv : mvs) mv.addMesh(this.goal);
61     }
62
63     public synchronized void dump() {
64         try {
65             PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("dump.stl")));
66             pw.println("solid dump");
67             for(Mesh.T t : tile) {
68                 Vec normal = t.norm();
69                 pw.println("facet normal " + normal.x + " " + normal.y + " " + normal.z);
70                 pw.println("  outer loop");
71                 for(Mesh.Vertex v : new Mesh.Vertex[] { t.v1(), t.v2(), t.v3() }) {
72                     pw.println("    vertex " + v.p.x + " " + v.p.y + " " + v.p.z);
73                 }
74                 pw.println("  endloop");
75                 pw.println("endfacet");
76             }
77             pw.println("endsolid dump");
78             pw.flush();
79             pw.close();
80         } catch (Exception e) { throw new RuntimeException(e); }
81     }
82
83     public int whichNeighbor = 1;
84     public double temp;
85     public boolean tileon = true;
86     public boolean tilemeshon = false;
87     public boolean goalon = true;
88     public boolean anneal = false;
89     public boolean hillclimb = false;
90     public boolean neighbors = false;
91     public boolean neighborsWire = false;
92     public boolean neighborsWireOne = false;
93     public boolean errorNormals = false;
94
95     public boolean force = false;
96     public Mesh.Vertex[] points;
97     public int breaks = 0;
98
99     public int temps;
100     public int accepts;
101     public    int vertss;
102
103     public void keyTyped(KeyEvent e)  { }
104     public void keyReleased(KeyEvent e) { }
105     public void keyPressed(KeyEvent e)  {
106         //super.keyPressed(e);
107         switch(e.getKeyCode()) {
108             case KeyEvent.VK_SPACE:
109                 synchronized(this) {
110                     tile.subdivide();
111                 }
112                 //case KeyEvent.VK_SPACE: breaks++; force = true; break;
113             case KeyEvent.VK_UP: temp = temp * 2; break;
114             case KeyEvent.VK_ENTER: temp = 10; break;
115             case KeyEvent.VK_LEFT: whichNeighbor--; break;
116             case KeyEvent.VK_RIGHT: whichNeighbor++; break;
117             case KeyEvent.VK_D: dump(); break;
118             case KeyEvent.VK_E: errorNormals = !errorNormals; break;
119             case KeyEvent.VK_A: hillclimb = false; anneal = !anneal; break;
120             case KeyEvent.VK_H: anneal = true; hillclimb = !hillclimb; break;
121             case KeyEvent.VK_N: neighbors = !neighbors; break;
122             case KeyEvent.VK_T: tileon = !tileon; break;
123             case KeyEvent.VK_G: goalon = !goalon; break;
124             case KeyEvent.VK_M: tilemeshon = !tilemeshon; break;
125         }
126     }
127
128 }