X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2Fgeom%2FHasBindingGroup.java;h=1c3737a808677ef23a28811a684d3d4ccddb0933;hp=cf72a08a125168808b024c484e385b577354acb9;hb=de98420094a537a70140842ff185e6d113ad270e;hpb=bebc4007cb48fe93ca03f97047d3445a881afe9e diff --git a/src/edu/berkeley/qfat/geom/HasBindingGroup.java b/src/edu/berkeley/qfat/geom/HasBindingGroup.java index cf72a08..1c3737a 100644 --- a/src/edu/berkeley/qfat/geom/HasBindingGroup.java +++ b/src/edu/berkeley/qfat/geom/HasBindingGroup.java @@ -11,9 +11,14 @@ public abstract class HasBindingGroup { // 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"); + public void bindTo(Matrix bindingMatrix, HasBindingGroup other) { + if (bindingGroup == null) bindingGroup = new BindingGroup(this); + if (other.bindingGroup == null) other.bindingGroup = new BindingGroup(other); + + if (other.bindingGroup == this.bindingGroup) { + if (bindingGroup.getMatrix(other).equals(Matrix.ONE)) return; + throw new Error("rebind attempt with " + bindingGroup.getMatrix(other)); + } bindingMatrix = getBindingMatrix() @@ -23,11 +28,24 @@ public abstract class HasBindingGroup { } public Matrix getBindingMatrix() { + if (bindingGroup==null) return Matrix.ONE; return bindingGroup.getMatrix(this); } public HasBindingGroup getMaster() { + if (bindingGroup==null) return this; return bindingGroup.getMaster(); } + public void unbind() { + if (bindingGroup==null) return; + bindingGroup.unbind(this); + bindingGroup = null; + } + + public boolean isBoundTo(HasBindingGroup t) { + return bindingGroup.contains(t); + } + + public Iterable getBoundPeers() { return bindingGroup; } }