checkpoint
[anneal.git] / src / edu / berkeley / qfat / Mesh.java
index ecee9e5..7c38672 100644 (file)
@@ -19,6 +19,47 @@ public class Mesh implements Iterable<Mesh.T> {
     private RTree<T>         triangles = new RTree<T>();
     private PointSet<Vertex> vertices  = new PointSet<Vertex>();
 
+    public boolean option_wireframe    = false;
+    public boolean option_errorNormals = false;
+    public boolean option_selectable   = true;
+
+    public void render(GL gl, Matrix m) {
+        if (option_wireframe) {
+            gl.glDisable(GL.GL_LIGHTING);
+            gl.glBegin(GL.GL_LINES);
+            gl.glColor3f(1, 1, 1);
+            for (T t : this) {
+                m.times(t.e1().p1.goodp).glVertex(gl);
+                m.times(t.e1().p2.goodp).glVertex(gl);
+                m.times(t.e2().p1.goodp).glVertex(gl);
+                m.times(t.e2().p2.goodp).glVertex(gl);
+                m.times(t.e3().p1.goodp).glVertex(gl);
+                m.times(t.e3().p2.goodp).glVertex(gl);
+            }
+            gl.glEnd();
+            gl.glEnable(GL.GL_LIGHTING);
+            return;
+        }
+        for(T t : this) {
+            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); 
+            t.glTriangle(gl, m);
+        }
+        if (option_errorNormals)
+            for(T t : this)
+                for(Mesh.Vertex p : new Mesh.Vertex[] { t.v1(), t.v2(), t.v3() }) {
+                    if (p.ok) {
+                        gl.glBegin(GL.GL_LINES);
+                        gl.glColor3f(1, 1, 1);
+                        p.p.glVertex(gl);
+                        p.p.plus(p.norm().times((float)p.error()*10)).glVertex(gl);
+                        gl.glEnd();
+                    }
+                }
+    }
+
     public boolean immutableVertices;
     public Mesh    error_against      = null;
     public double  error              = 0;
@@ -110,6 +151,7 @@ public class Mesh implements Iterable<Mesh.T> {
             error += olderror;
         }
 
+        /*
         public Vertex hack(GL gl, Point mouse) {
             double dist = Double.MAX_VALUE;
             Vertex cur = null;
@@ -123,6 +165,7 @@ public class Mesh implements Iterable<Mesh.T> {
             }
             return cur;
         }
+        */
 
         public float averageTriangleArea() {
             int count = 0;
@@ -204,7 +247,7 @@ public class Mesh implements Iterable<Mesh.T> {
             setError(nerror);
         }
 
-        public boolean move(Matrix m, boolean ignoreProblems) {
+        public boolean move(Vec vv, boolean ignoreProblems) {
 
             boolean good = true;
 
@@ -215,21 +258,26 @@ public class Mesh implements Iterable<Mesh.T> {
             // M * t1 = M * t1.getMatrix(t2) * t2
 
             if (bindingGroup!=null && this != bindingGroup.getMaster()) {
-                Matrix v = getBindingMatrix(bindingGroup.getMaster());
-                return ((Vertex)bindingGroup.getMaster()).move(v.inverse().times(m).times(v), ignoreProblems);
+                Matrix m2 = getBindingMatrix(bindingGroup.getMaster());
+                Vec v2 = m2.times(vv.plus(getPoint())).minus(m2.times(getPoint()));
+                return ((Vertex)bindingGroup.getMaster()).move(v2, ignoreProblems);
             }
 
+            Point op = this.p;
+            Point pp = vv.plus(getPoint());
             if (bindingGroup != null) {
-                Matrix m2 = null;
-                for(int i=0; i<20 && !m.equals(m2); i++) {
-                    m2 = m.times(getConstraint());
+                /*
+                for(int i=0; i<20 ; i++) {
+                    Point p2 = getConstraint().times(pp);
+                    pp = pp.midpoint(p2);
                     //System.out.println(m.minus(m2));
                 }
-                if (!m.equals(m2)) return true;
+            */
+                    pp = getConstraint().times(pp);
             }
+            pp = pp.minus(op).norm().times(vv.mag()).plus(op);
             ok = false;
-            Point op = this.p;
-            Point pt = m.times(this.p);
+            Point pt = pp;
             for(Vertex v : (Iterable<Vertex>)getBoundPeers()) {
                 Point pt2 = v.getBindingMatrix(this).times(pt);
                 /*
@@ -261,7 +309,6 @@ public class Mesh implements Iterable<Mesh.T> {
 
             unApplyQuadricToNeighbor();
 
-
             boolean illegalbefore = illegal;
             illegal = false;
             /*