--- /dev/null
+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();
+ }
+
+}