checkpoint
[anneal.git] / src / edu / berkeley / qfat / geom / HasBindingGroup.java
diff --git a/src/edu/berkeley/qfat/geom/HasBindingGroup.java b/src/edu/berkeley/qfat/geom/HasBindingGroup.java
new file mode 100644 (file)
index 0000000..cf72a08
--- /dev/null
@@ -0,0 +1,33 @@
+package edu.berkeley.qfat.geom;
+import javax.media.opengl.*;
+import java.util.*;
+
+public abstract class HasBindingGroup {
+
+    BindingGroup bindingGroup;
+
+    // know:      self   = bindingGroup[self] * master
+    // know:      other  = other.bindingGroup[other] * other.bindingGroup.master
+    // want:      self   = bindingMatrix * other
+    // therefore: master = bindingGroup[self]^-1 * bindingMatrix * other
+    // therefore:        = bindingGroup[self]^-1 * bindingMatrix * other.bindingGroup[other] * other.bindingGroup.master
+    public void bindTo(HasBindingGroup other, Matrix bindingMatrix) {
+        if (other.bindingGroup == this.bindingGroup)
+            throw new Error("rebind attempt");
+
+        bindingMatrix =
+            getBindingMatrix()
+            .times(bindingMatrix)
+            .times(other.getBindingMatrix());
+        other.bindingGroup.merge(bindingGroup, bindingMatrix);
+    }
+
+    public Matrix getBindingMatrix() {
+        return bindingGroup.getMatrix(this);
+    }
+
+    public HasBindingGroup getMaster() {
+        return bindingGroup.getMaster();
+    }
+
+}