X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2Fgeom%2FHasBindingGroup.java;fp=src%2Fedu%2Fberkeley%2Fqfat%2Fgeom%2FHasBindingGroup.java;h=cf72a08a125168808b024c484e385b577354acb9;hp=0000000000000000000000000000000000000000;hb=bebc4007cb48fe93ca03f97047d3445a881afe9e;hpb=64b959c2f7b32e81c510f5dabec573adcebda4b6 diff --git a/src/edu/berkeley/qfat/geom/HasBindingGroup.java b/src/edu/berkeley/qfat/geom/HasBindingGroup.java new file mode 100644 index 0000000..cf72a08 --- /dev/null +++ b/src/edu/berkeley/qfat/geom/HasBindingGroup.java @@ -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(); + } + +}