checkpoint
[anneal.git] / src / edu / berkeley / qfat / Mesh.java
index 1d842f7..bbb419a 100644 (file)
@@ -46,19 +46,6 @@ public class Mesh implements Iterable<Mesh.T> {
         }
     }
 
-    public void unApplyQuadricToNeighborAll() {
-        for(Vertex p : vertices)
-            p.unApplyQuadricToNeighbor();
-    }
-    public void recomputeAllFundamentalQuadrics() {
-        for(Vertex p : vertices)
-            p.recomputeFundamentalQuadric();
-    }
-    public void applyQuadricToNeighborAll() {
-        for(Vertex p : vertices)
-            p.applyQuadricToNeighbor();
-    }
-
     public void transform(Matrix m) {
         ArrayList<Vertex> set = new ArrayList<Vertex>();
         for(Vertex v : vertices) set.add(v);
@@ -125,18 +112,27 @@ public class Mesh implements Iterable<Mesh.T> {
             gl.glNormal3f(norm.x, norm.y, norm.z);
         }
 
+        public void recomputeFundamentalQuadricIfNeighborChanged() {
+            Vertex oldv = nearest_in_other_mesh;
+            Vertex newv = score_against.nearest(p);
+            if (oldv==newv) return;
+            recomputeFundamentalQuadric();
+            if (oldv!=null) oldv.recomputeFundamentalQuadricIfNeighborChanged();
+            //if (newv!=null) newv.recomputeFundamentalQuadricIfNeighborChanged();
+        }
         public void recomputeFundamentalQuadric() {
-            if (!quadricStale && fundamentalQuadric != null) return;
-            quadricStale = false;
             unApplyQuadricToNeighbor();
-            Matrix m = Matrix.ZERO;
-            int count = 0;
-            for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next) {
-                T t = e.t;
-                m = m.plus(t.norm().fundamentalQuadric(t.centroid()));
-                count++;
+            if (quadricStale || fundamentalQuadric==null) {
+                Matrix m = Matrix.ZERO;
+                int count = 0;
+                for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next) {
+                    T t = e.t;
+                    m = m.plus(t.norm().fundamentalQuadric(t.centroid()));
+                    count++;
+                }
+                quadricStale = false;
+                fundamentalQuadric = m.times(1/(float)count);
             }
-            fundamentalQuadric = m.times(1/(float)count);
             applyQuadricToNeighbor();
         }