checkpoint
[anneal.git] / src / edu / berkeley / qfat / geom / HasQuadric.java
diff --git a/src/edu/berkeley/qfat/geom/HasQuadric.java b/src/edu/berkeley/qfat/geom/HasQuadric.java
new file mode 100644 (file)
index 0000000..825bda9
--- /dev/null
@@ -0,0 +1,45 @@
+package edu.berkeley.qfat.geom;
+import javax.media.opengl.*;
+
+/** any object associated with a specific point in 3D space */
+public abstract class HasQuadric extends HasPoint {
+
+    public Matrix errorQuadric() { return quadric; }
+    public boolean quadricStale = false;
+    /** the nearest vertex in the "score_against" mesh */
+    public HasQuadric nearest_in_other_mesh;
+
+    /** the number of vertices in the other mesh for which this is the nearest_in_other_mesh */
+    public int    quadric_count;
+
+    /** the total error quadric (contributions from all vertices in other mesh for which this is nearest) */
+    public Matrix quadric = Matrix.ZERO;
+
+    public Matrix fundamentalQuadric = null;
+
+        public void recomputeFundamentalQuadricIfNeighborChanged() {
+            HasQuadric oldv = nearest_in_other_mesh;
+            HasQuadric newv = nearest();
+            if (oldv==newv) return;
+            recomputeFundamentalQuadric();
+            if (oldv!=null) oldv.recomputeFundamentalQuadricIfNeighborChanged();
+            // for some reason this causes an infinite loop
+            //if (newv!=null) newv.recomputeFundamentalQuadricIfNeighborChanged();
+        }
+        public void recomputeFundamentalQuadricIfStale() {
+            if (quadricStale || fundamentalQuadric==null) 
+                recomputeFundamentalQuadric();
+        }
+    public abstract void recomputeFundamentalQuadric();
+    public abstract void unApplyQuadricToNeighbor();
+    public abstract void applyQuadricToNeighbor();
+    public abstract void reComputeErrorAround();
+    public abstract void reComputeError();
+    public abstract void unComputeError();
+    public abstract void computeError();
+    public abstract HasQuadric nearest();
+        public Matrix fundamentalQuadric() {
+            if (fundamentalQuadric == null) recomputeFundamentalQuadric();
+            return fundamentalQuadric;
+        }
+}