package edu.berkeley.qfat;
import java.io.*;
+import java.nio.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
boolean shift = false;
boolean control = false;
+ public Point getMouse() {
+ return new Point(mousex, glcanvas.getHeight()-mousey, 0);
+ }
+
public void mouseWheelMoved(MouseWheelEvent e) {
tz -= e.getWheelRotation();
}
public void mouseClicked(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
- public void mousePressed(MouseEvent e) { }
- public void mouseReleased(MouseEvent e) { }
+ public void mousePressed(MouseEvent e) {
+ clickPoint = getMouse();
+ clickClosest = closest == null ? null : closest.getPoint();
+ }
+ public void mouseReleased(MouseEvent e) {
+ clickPoint = null;
+ clickClosest = null;
+ }
+
+ Point clickPoint = null;
+ Point clickClosest = null;
int mousex;
int mousey;
float angley = 0;
public void mouseDragged(MouseEvent e) {
if (shift) {
+ /*
tx += (mousex - e.getX())/(float)20;
ty += (mousey - e.getY())/(float)20;
+ */
+ if (closest != null && lastGL != null && projection != null && clickClosest != null) {
+ synchronized(safeTriangles) {
+ Vec d1 = projection.inverse().times(getMouse()).minus(projection.inverse().times(clickPoint));
+ Vec delta = d1.plus(clickClosest).minus(closest.getPoint());
+ //System.out.println(delta + " " + closest.getPoint());
+ System.out.println(getMouse().minus(clickPoint));
+ closest.move(Matrix.translate(delta), true);
+ }
+ }
} else {
anglex -= mousex - e.getX();
angley += mousey - e.getY();
display(gld);
}
+ private GL lastGL = null;
+
public int temps;
public int accepts;
public int vertss;
g.fillRect(140, 65+top, vertss, 10);
GL gl = drawable.getGL();
+ lastGL = gl;
GLU glu = new GLU();
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl.glPointSize(5.0f);
gl.glBegin(GL.GL_TRIANGLES);
if (tileon)
- draw(gl, true, safeTriangles);
+ draw(gl, true, safeTriangles);
if (tilemeshon)
- draw(gl, false, safeTriangles);
+ draw(gl, false, safeTriangles);
gl.glEnd();
//draw(gl, false, tile);
*/
}
//gl.glEnable(GL.GL_DEPTH_TEST);
- gl.glEnable (GL.GL_LIGHTING);
+ gl.glDisable(GL.GL_LIGHTING);
+ gl.glShadeModel(GL.GL_FLAT);
+ if (closest != null) {
+ gl.glColor3f(1,1,1);
+ gl.glBegin(gl.GL_POINTS);
+ closest.getPoint().glVertex(gl);
+ gl.glEnd();
+ /*
+ Mesh.Vertex v2 = closest.hack(gl, getMouse());
+ gl.glBegin(GL.GL_LINES);
+ closest.getPoint().glVertex(gl);
+ if (v2 != null) v2.getPoint().glVertex(gl);
+ 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);
+
+ IntBuffer buf = ByteBuffer.allocateDirect(9*4*4).order(ByteOrder.nativeOrder()).asIntBuffer();
+ gl.glColor3f(0,0,0);
+ gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
+ double dist = Double.MAX_VALUE;
+ if (clickPoint==null) closest = null;
+ projection = Matrix.getProjectionMatrix(gl);
+ synchronized(safeTriangles) {
+ for(Mesh.T t : safeTriangles)
+ t.glTriangle(gl, null);
+ for(Mesh.Vertex v : tile.vertices()) {
+ Point p = v.getPoint();
+ gl.glColor3f(1,1,1);
+ gl.glBegin(gl.GL_POINTS);
+ p.glVertex(gl);
+ gl.glEnd();
+ gl.glFlush();
+
+ Point projected = projection.times(p);
+ int x = (int)projected.x;
+ int y = (int)projected.y;
+ gl.glReadPixels(x-1, y-1, 3, 3, gl.GL_RGB, gl.GL_UNSIGNED_BYTE, buf);
+
+ boolean vis = false;
+ for(int j=0; j<9*4; j++) vis |= buf.get(j)!=0;
+ v.visible = vis;
+ if (vis) {
+ gl.glColor3f(0,0,0);
+ gl.glBegin(gl.GL_POINTS);
+ p.glVertex(gl);
+ gl.glEnd();
+ y = glcanvas.getHeight()-y;
+ if (clickPoint==null) {
+ if (closest==null || (x-mousex)*(x-mousex)+(y-mousey)*(y-mousey) < dist) {
+ dist = (x-mousex)*(x-mousex)+(y-mousey)*(y-mousey);
+ closest = v;
+ }
+ }
+ }
+ }
+ }
+ gl.glShadeModel(GL.GL_SMOOTH);
+ gl.glEnable(GL.GL_LIGHTING);
+ gl.glDrawBuffer(GL.GL_FRONT);
+
+
+
+ /*
+ IntBuffer selectionBuffer =
+ ByteBuffer.allocateDirect(4*10000).order(ByteOrder.nativeOrder()).asIntBuffer();
+ gl.glSelectBuffer(selectionBuffer.capacity(), selectionBuffer);
+ gl.glInitNames();
+ gl.glRenderMode(GL.GL_SELECT);
+ draw(gl, true, safeTriangles);
+ int hits = gl.glRenderMode(GL.GL_RENDER);
+ synchronized(safeTriangles) {
+ for(Mesh.T t : safeTriangles) {
+ t.occluded = true;
+ }
+ processHits(hits, selectionBuffer);
+ }
+ */
+ }
+ Mesh.Vertex closest = null;
+ Matrix projection = null;
+
+ // I copied this method without changes from the mentioned base class.
+ // It extracts the data in the selection buffer and writes it on the console.
+ public void processHits(int hits, IntBuffer buffer) {
+ /*
+ System.out.println("---------------------------------");
+ System.out.println(" HITS: " + hits);
+ */
+ int offset = 0;
+ int names;
+ float z1, z2;
+ for (int i = 0; i < hits; i++) {
+ /*
+ System.out.println("- - - - - - - - - - - -");
+ System.out.println(" hit: " + (i + 1));
+ */
+ names = buffer.get(offset);
+ offset++;
+ z1 = (float) buffer.get(offset) / 0x7fffffff;
+ offset++;
+ z2 = (float) buffer.get(offset) / 0x7fffffff;
+ offset++;
+ /*
+ System.out.println(" number of names: " + names);
+ System.out.println(" z1: " + z1);
+ System.out.println(" z2: " + z2);
+ System.out.println(" names: ");
+ */
+
+ for (int j = 0; j < names; j++) {
+ int who = buffer.get(offset);
+ for(Mesh.T t : safeTriangles) {
+ if (t.serial==who) {
+ t.occluded = false;
+ }
+ }
+ /*
+ System.out.print(" " + who);
+ if (j == (names - 1)) {
+ System.out.println("<-");
+ } else {
+ System.out.println();
+ }
+ */
+ offset++;
+ }
+ /*
+ System.out.println("- - - - - - - - - - - -");
+ */
+ }
+ /*
+ System.out.println("--------------------------------- ");
+ */
}
protected HashSet<Mesh.T> safeTriangles = new HashSet<Mesh.T>();
green -= .12f;
blue -= .15f;
- if (triangles) switch(t.color/*class*/) {
+ /*
+ 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 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);
//gl.glBegin(GL.GL_LINES);
if (triangles) {
- gl.glBegin(GL.GL_TRIANGLES);
- if (t.shouldBeDrawn()) {
- m.times(t.norm()).glNormal(gl);
- m.times(t.v1().goodp).glVertex(gl);
- m.times(t.v2().goodp).glVertex(gl);
- m.times(t.v3().goodp).glVertex(gl);
- //t.glVertices(gl, m);
- }
- gl.glEnd();
+ t.glTriangle(gl, m);
} else {
gl.glDisable(GL.GL_LIGHTING);
gl.glBegin(GL.GL_LINES);