import edu.berkeley.qfat.geom.*;
import edu.berkeley.qfat.geom.Point;
-public class MeshViewer implements GLEventListener, MouseListener, MouseMotionListener, KeyListener, MouseWheelListener {
+public class MeshViewer extends JPanel implements GLEventListener, MouseListener, MouseMotionListener, KeyListener, MouseWheelListener {
- Mesh.Vertex closest = null;
+ private float tz = 0;
+ private float anglex = 0;
+ private float angley = 0;
+
+ private Mesh.Vertex closest = null;
+ private int mousex;
+ private int mousey;
+ private Matrix projection = null;
+ private Point clickPoint = null;
+ private GLCanvas glcanvas;
+ private boolean updateVisibilities = false;
private HashSet<Mesh> meshes = new HashSet<Mesh>();
+
public synchronized void addMesh(Mesh m) { meshes.add(m); }
public synchronized void removeMesh(Mesh m) { meshes.remove(m); }
- private int mousex;
- private int mousey;
- private Matrix projection = null;
- private Point clickPoint = null;
-
- GLCanvas glcanvas;
-
- Point clickClosest = null;
-
- float tz = 0;
- float anglex = 0;
- float angley = 0;
-
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { }
public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) { }
public synchronized void init(GLAutoDrawable gld) {
- GL gl = gld.getGL();
+ GL gl = glcanvas.getGL();//gld.getGL();
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
gl.glViewport(0, 0, 500, 300);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glEnable(GL.GL_COLOR_MATERIAL);
display(gld);
+
+ // hack to get around Mac OS bug
+ IntBuffer buf = ByteBuffer.allocateDirect(9*4*4).order(ByteOrder.nativeOrder()).asIntBuffer();
+ gl.glReadPixels(0,0, 1, 1, gl.GL_RGB, gl.GL_UNSIGNED_BYTE, buf);
}
public synchronized final void display(GLAutoDrawable drawable) {
- GL gl = drawable.getGL();
- glcanvas.setSize(glcanvas.getParent().getWidth(), glcanvas.getParent().getHeight() - 100);
+ glcanvas.setSize(glcanvas.getParent().getWidth(), glcanvas.getParent().getHeight());
+ GL gl = glcanvas.getGL();//drawable.getGL();
GLU glu = new GLU();
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl.glPointSize(5.0f);
gl.glRotatef(anglex/3, 0, 1, 0);
gl.glRotatef(-(angley/3), 1, 0, 0);
+ gl.glEnable(GL.GL_LIGHTING);
+ gl.glShadeModel(GL.GL_SMOOTH);
for(Mesh mesh : meshes)
mesh.render(gl, Matrix.ONE);
// highlight the point closest to the mouse; we do this here to avoid flicker
- gl.glDisable(GL.GL_LIGHTING);
- gl.glShadeModel(GL.GL_FLAT);
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();
}
- // update vertex visibilities
- // FIXME: only do this when we switch into vertex-finding mode
- updateVisibility(gl);
+ projection = Matrix.getProjectionMatrix(gl);
- Matrix projection = Matrix.getProjectionMatrix(gl);
- double dist = Double.MAX_VALUE;
- if (getMouseClick() != null) return;
- closest = null;
- for(Mesh mesh : meshes)
- if (mesh.option_selectable)
- for(Mesh.Vertex v : mesh.vertices()) {
- if (!v.visible) continue;
- Point p = projection.times(v.getPoint());
- int x = (int)p.x;
- int y = (int)p.y;
- int mousex = (int)getMouse().x;
- int mousey = (int)getMouse().y;
- if (closest==null || (x-mousex)*(x-mousex)+(y-mousey)*(y-mousey) < dist) {
- dist = (x-mousex)*(x-mousex)+(y-mousey)*(y-mousey);
- closest = v;
+ if (updateVisibilities) {
+ updateVisibilities = false;
+ // update vertex visibilities
+ updateVisibility(gl);
+
+ //Matrix projection = Matrix.getProjectionMatrix(gl);
+ double dist = Double.MAX_VALUE;
+ closest = null;
+ for(Mesh mesh : meshes)
+ if (mesh.option_selectable)
+ for(Mesh.Vertex v : mesh.vertices()) {
+ if (!v.visible) continue;
+ Point p = projection.times(v.getPoint());
+ int x = (int)p.x;
+ int y = (int)p.y;
+ int mousex = (int)getMouse().x;
+ int mousey = (int)getMouse().y;
+ if (closest==null || (x-mousex)*(x-mousex)+(y-mousey)*(y-mousey) < dist) {
+ dist = (x-mousex)*(x-mousex)+(y-mousey)*(y-mousey);
+ closest = v;
+ }
}
- }
-
- projection = Matrix.getProjectionMatrix(gl);
+ }
}
protected synchronized void updateVisibility(GL gl) {
- Matrix projection = Matrix.getProjectionMatrix(gl);
IntBuffer buf = ByteBuffer.allocateDirect(9*4*4).order(ByteOrder.nativeOrder()).asIntBuffer();
gl.glFlush();
gl.glDrawBuffer(GL.GL_BACK);
public void mouseExited(MouseEvent e) { }
public void mousePressed(MouseEvent e) {
clickPoint = getMouse();
- clickClosest = closest == null ? null : closest.getPoint();
}
public void mouseReleased(MouseEvent e) {
clickPoint = null;
- clickClosest = null;
}
public void mouseMoved(MouseEvent e) {
mousex = e.getX();
mousey = e.getY();
+ if ((e.getModifiersEx() & MouseEvent.SHIFT_DOWN_MASK) != 0)
+ updateVisibilities = true;
}
public void mouseDragged(MouseEvent e) {
if ((e.getModifiersEx() & MouseEvent.SHIFT_DOWN_MASK) != 0) {
- if (closest != null && projection != null && clickClosest != null) {
+ if (closest != null && projection != null) {
synchronized(this) {
+ Point clickClosest = closest == null ? null : closest.getPoint();
Vec d1 = projection.inverse().times(getMouse()).minus(projection.inverse().times(clickPoint));
Vec delta = d1.plus(clickClosest).minus(closest.getPoint());
closest.move(delta, false);
mousey = e.getY();
}
- public MeshViewer(JFrame f) {
+ public MeshViewer() {
glcanvas = new GLCanvas();
glcanvas.addGLEventListener(this);
- f.add(glcanvas, BorderLayout.CENTER);
+ setLayout(new BorderLayout());
+ this.add(glcanvas, BorderLayout.CENTER);
glcanvas.addMouseListener(this);
glcanvas.addMouseMotionListener(this);
glcanvas.addMouseWheelListener(this);
}
public void repaint() {
- glcanvas.repaint();
+ if (glcanvas != null) glcanvas.repaint();
}
}
\ No newline at end of file