X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2Fgeom%2FHasBindingGroup.java;h=65d581f9d5cce15645948c31a8fb6070a79fc8d7;hp=cf72a08a125168808b024c484e385b577354acb9;hb=30607e6bf4827d90fc055c8db1e7f363ef2693e6;hpb=bebc4007cb48fe93ca03f97047d3445a881afe9e diff --git a/src/edu/berkeley/qfat/geom/HasBindingGroup.java b/src/edu/berkeley/qfat/geom/HasBindingGroup.java index cf72a08..65d581f 100644 --- a/src/edu/berkeley/qfat/geom/HasBindingGroup.java +++ b/src/edu/berkeley/qfat/geom/HasBindingGroup.java @@ -1,33 +1,96 @@ 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 // 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 (getBindingMatrix(other).equals(bindingMatrix)) + return; + /* + if (this instanceof Mesh.E) + throw new Error("rebind attempt: "+this+" and "+other+" with " + + bindingMatrix + + "; expected " + + getBindingMatrix(other)); + */ + setConstraint(bindingMatrix); + /* + System.err.println("WARNING: discarding rebind attempt: "+this+" and "+other+m); + */ + //" with " + //+ bindingMatrix + //+ "; expected " + //+ getBindingMatrix(other)); + return; + } + 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 Matrix getBindingMatrix(HasBindingGroup other) { + if (other==this) return Matrix.ONE; + return bindingGroup.getMatrix(this, other); + } + public HasBindingGroup getMaster() { + if (bindingGroup==null) return this; return bindingGroup.getMaster(); } + public Matrix getConstraint() { + if (bindingGroup==null) return Matrix.ONE; + Matrix v = getBindingMatrix(getMaster()); + return v.inverse().times(bindingGroup.krank).times(v); + } + public void setConstraint(Matrix m) { + if (bindingGroup==null) bindingGroup = new BindingGroup(this); + Matrix v = getBindingMatrix(getMaster()); + bindingGroup.krank = bindingGroup.krank.times(v.inverse().times(m).times(v)); + } + + public void unbind() { + if (bindingGroup==null) return; + bindingGroup.unbind(this); + bindingGroup = null; + bindingGroupChanged(bindingGroup); + } + + public boolean isBoundTo(HasBindingGroup t) { + return t==this || (bindingGroup!=null && bindingGroup.contains(t)); + } + + public Iterable getBoundPeers() { + if (bindingGroup==null) bindingGroup = new BindingGroup(this); + return bindingGroup; + } + public void bindingGroupChanged(BindingGroup newBindingGroup) { } }