eccb6b69d1cbed103f47966c358b34f3d02b2b27
[anneal.git] / src / edu / berkeley / qfat / Viewer.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 abstract class Viewer implements GLEventListener, MouseListener, MouseMotionListener, KeyListener, MouseWheelListener  {
15
16     Mesh.Vertex closest = null;
17
18     public boolean force = false;
19     public Mesh tile = new Mesh(false);
20     public Mesh goal = new Mesh(false);
21     public Matrix[] transforms;
22     public Mesh.Vertex[] points;
23
24     public int whichNeighbor = 1;
25
26     public double temp;
27     public boolean tileon = true;
28     public boolean tilemeshon = false;
29     public boolean goalon = true;
30     public boolean anneal = false;
31     public boolean hillclimb = false;
32     public boolean neighbors = false;
33     public boolean neighborsWire = false;
34     public boolean neighborsWireOne = false;
35     public boolean errorNormals = false;
36
37     public int breaks = 0;
38     boolean alt = false;
39     boolean shift = false;
40     boolean control = false;
41
42     Matrix projection = null;
43     JFrame f;
44     GLCanvas glcanvas;
45     Point clickPoint = null;
46     Point clickClosest = null;
47
48     int mousex;
49     int mousey;
50     float tx = 0;
51     float ty = 0;
52     float tz = 0;
53     float anglex = 0;
54     float angley = 0;
55
56     public abstract void _display(GLAutoDrawable drawable, GL gl);
57     public void display(GLAutoDrawable drawable) {
58         GL gl = drawable.getGL();
59         _display(drawable, gl);
60         this.projection = Matrix.getProjectionMatrix(gl);
61     }
62
63     public Point getMouse() {
64         return new Point(mousex, glcanvas.getHeight()-mousey, 0);
65     }
66
67     public void mouseWheelMoved(MouseWheelEvent e) {
68         tz -= e.getWheelRotation();
69     }
70
71     public void keyTyped(KeyEvent e)  { }
72     public void keyPressed(KeyEvent e)  {
73         switch(e.getKeyCode()) {
74             case KeyEvent.VK_CONTROL: control = true; break;
75             case KeyEvent.VK_ALT: alt = true; break;
76             case KeyEvent.VK_SHIFT: shift = true; break;
77         }
78     }
79
80     public void keyReleased(KeyEvent e) {
81         switch(e.getKeyCode()) {
82             case KeyEvent.VK_CONTROL: control = false; break;
83             case KeyEvent.VK_ALT: alt = false; break;
84             case KeyEvent.VK_SHIFT: shift = false; break;
85         }
86     }
87
88     public void mouseClicked(MouseEvent e) { }
89     public void mouseEntered(MouseEvent e) { }
90     public void mouseExited(MouseEvent e) { }
91     public void mousePressed(MouseEvent e) {
92         clickPoint = getMouse();
93         clickClosest = closest == null ? null : closest.getPoint();
94     }
95     public void mouseReleased(MouseEvent e) {
96         clickPoint = null;
97         clickClosest = null;
98     }
99
100
101     public void mouseMoved(MouseEvent e) {
102         mousex = e.getX();
103         mousey = e.getY();
104     }
105
106     public void mouseDragged(MouseEvent e) {
107         if (shift) {
108             /*
109             tx += (mousex - e.getX())/(float)20;
110             ty += (mousey - e.getY())/(float)20;
111             */
112             if (closest != null && projection != null && clickClosest != null) {
113                 synchronized(this) {
114                     Vec d1 = projection.inverse().times(getMouse()).minus(projection.inverse().times(clickPoint));
115                     Vec delta = d1.plus(clickClosest).minus(closest.getPoint());
116                     //System.out.println(delta + " " + closest.getPoint());
117                     System.out.println(getMouse().minus(clickPoint));
118                     closest.move(Matrix.translate(delta), true);
119                 }
120             }
121         } else {
122             anglex -= mousex - e.getX();
123             angley += mousey - e.getY();
124         }
125         mousex = e.getX();
126         mousey = e.getY();
127     }
128
129     public Viewer(JFrame f) {
130         this.f = f;
131
132         GLCapabilities glcaps = new GLCapabilities();
133         glcanvas = new GLCanvas();
134         glcanvas.addGLEventListener(this);
135         f.add(glcanvas, BorderLayout.CENTER);
136
137         glcanvas.addMouseListener(this);
138         glcanvas.addMouseMotionListener(this);
139         glcanvas.addMouseWheelListener(this);
140         glcanvas.addKeyListener(this);
141     }
142     public void repaint() {
143         glcanvas.repaint();
144     }
145 }