checkpoint
[anneal.git] / src / edu / berkeley / qfat / geom / HasBindingGroup.java
index d884672..65d581f 100644 (file)
@@ -1,6 +1,7 @@
 package edu.berkeley.qfat.geom;
 import javax.media.opengl.*;
 import java.util.*;
+import edu.berkeley.qfat.Mesh;
 
 public abstract class HasBindingGroup {
 
@@ -19,16 +20,13 @@ public abstract class HasBindingGroup {
             if (getBindingMatrix(other).equals(bindingMatrix))
                 return;
             /*
-            throw new Error("rebind attempt: "+this+" and "+other+" with "
-                            + bindingMatrix
-                            + "; expected "
-                            + getBindingMatrix(other));
+            if (this instanceof Mesh.E)
+                throw new Error("rebind attempt: "+this+" and "+other+" with "
+                                + bindingMatrix
+                                + "; expected "
+                                + getBindingMatrix(other));
             */
-            Matrix vom = other.getBindingMatrix(bindingGroup.getMaster());
-            Matrix v2 = bindingMatrix;
-            Matrix v3 = getBindingMatrix(other);
-            Matrix m = vom.inverse().times(v2.inverse()).times(v3).times(vom);
-            bindingGroup.krank = bindingGroup.krank.times(m);
+            setConstraint(bindingMatrix);
             /*
               System.err.println("WARNING: discarding rebind attempt: "+this+" and "+other+m);
             */
@@ -68,6 +66,17 @@ public abstract class HasBindingGroup {
         return bindingGroup.getMaster();
     }
 
+    public Matrix getConstraint() {
+        if (bindingGroup==null) return Matrix.ONE;
+        Matrix v = getBindingMatrix(getMaster());
+        return v.inverse().times(bindingGroup.krank).times(v);
+    }
+    public void setConstraint(Matrix m) {
+        if (bindingGroup==null) bindingGroup = new BindingGroup(this);
+        Matrix v = getBindingMatrix(getMaster());
+        bindingGroup.krank = bindingGroup.krank.times(v.inverse().times(m).times(v));
+    }
+
     public void unbind() {
         if (bindingGroup==null) return;
         bindingGroup.unbind(this);