if (other.bindingGroup == null) other.bindingGroup = new BindingGroup(other);
if (other.bindingGroup == this.bindingGroup) {
- if (getBindingMatrix(other).equals(bindingMatrix))
+ if (getBindingMatrix(other).equalsModuloEpsilon(bindingMatrix, 0.001f))
return;
- /*
- if (this instanceof Mesh.E)
- throw new Error("rebind attempt: "+this+" and "+other+" with "
- + bindingMatrix
- + "; expected "
- + getBindingMatrix(other));
- */
- Matrix vom = other.getBindingMatrix(bindingGroup.getMaster());
- Matrix v2 = bindingMatrix;
- Matrix v3 = getBindingMatrix(other);
- Matrix m = vom.inverse().times(v2.inverse()).times(v3).times(vom);
- bindingGroup.krank = bindingGroup.krank.times(m);
- /*
- System.err.println("WARNING: discarding rebind attempt: "+this+" and "+other+m);
- */
- //" with "
- //+ bindingMatrix
- //+ "; expected "
- //+ getBindingMatrix(other));
return;
}
-
bindingMatrix =
getBindingMatrix().inverse()
.times(bindingMatrix)
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);