X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2Fgeom%2FHasBindingGroup.java;h=16dee1c8f4753f6d733370a8b2102a1313ca4456;hp=715f76396ff85786b91f33c80b868a503aea27df;hb=64c6939d78acfa06e7bc380cb713e3800bf16be5;hpb=468b086402bb0ccae7ce4dda8b009d61bfc37a71 diff --git a/src/edu/berkeley/qfat/geom/HasBindingGroup.java b/src/edu/berkeley/qfat/geom/HasBindingGroup.java index 715f763..16dee1c 100644 --- a/src/edu/berkeley/qfat/geom/HasBindingGroup.java +++ b/src/edu/berkeley/qfat/geom/HasBindingGroup.java @@ -1,10 +1,11 @@ package edu.berkeley.qfat.geom; import javax.media.opengl.*; import java.util.*; +import edu.berkeley.qfat.Mesh; public abstract class HasBindingGroup { - BindingGroup bindingGroup; + public BindingGroup bindingGroup; // know: self = bindingGroup[self] * master // know: other = other.bindingGroup[other] * other.bindingGroup.master @@ -15,26 +16,27 @@ public abstract class HasBindingGroup { 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() + getBindingMatrix().inverse() .times(bindingMatrix) .times(other.getBindingMatrix()); other.bindingGroup.merge(bindingGroup, bindingMatrix); } + public int bindingGroupSize() { + if (bindingGroup == null) return 1; + return bindingGroup.size(); + } + + 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 Matrix getBindingMatrix(HasBindingGroup other) { + if (other==this) return Matrix.ONE; + return bindingGroup.getMatrix(this, other); } public void unbind() { @@ -45,9 +47,12 @@ public abstract class HasBindingGroup { } public boolean isBoundTo(HasBindingGroup t) { - return bindingGroup.contains(t); + return t==this || (bindingGroup!=null && bindingGroup.contains(t)); } - public Iterable getBoundPeers() { return bindingGroup; } + public Iterable getBoundPeers() { + if (bindingGroup==null) bindingGroup = new BindingGroup(this); + return bindingGroup; + } public void bindingGroupChanged(BindingGroup newBindingGroup) { } }