checkpoint
[anneal.git] / src / edu / berkeley / qfat / bind / HasBindingGroup.java
1 package edu.berkeley.qfat.bind;
2 import edu.berkeley.qfat.geom.*;
3 import javax.media.opengl.*;
4 import java.util.*;
5 import edu.berkeley.qfat.Mesh;
6
7 /**
8  *  A member of an equivalence class of geometric objects whose
9  *  positions are related by affine transformation matrices and are
10  *  constrained by an affine constraint.
11  */
12 public abstract class HasBindingGroup {
13
14     private BindingGroup bindingGroup;
15
16     // know:      self   = bindingGroup[self] * master
17     // know:      other  = other.bindingGroup[other] * other.bindingGroup.master
18     // want:      self   = bindingMatrix * other
19     // therefore: master = bindingGroup[self]^-1 * bindingMatrix * other
20     // therefore:        = bindingGroup[self]^-1 * bindingMatrix * other.bindingGroup[other] * other.bindingGroup.master
21     public void bindTo(Matrix bindingMatrix, HasBindingGroup other) {
22         // FIXME
23         bindTo(bindingMatrix, other, 0.001f);
24     }
25     public void bindTo(Matrix bindingMatrix, HasBindingGroup other, float epsilon) {
26         if (bindingGroup == null) bindingGroup = new BindingGroup(this);
27         if (other.bindingGroup == null) other.bindingGroup = new BindingGroup(other);
28
29         bindingMatrix =
30             getBindingMatrix().inverse()
31             .times(bindingMatrix)
32             .times(other.getBindingMatrix());
33         other.bindingGroup.merge(bindingGroup, bindingMatrix, epsilon);
34     }
35
36     public int bindingGroupSize() {
37         if (bindingGroup == null) return 1;
38         return bindingGroup.size();
39     }
40
41     public AffineConstraint getBindingConstraint() {
42         if (bindingGroup==null) return new AffineConstraint.All();
43         return bindingGroup.getAffineConstraint(this);
44     }
45
46     public Matrix getBindingMatrix() {
47         if (bindingGroup==null) return Matrix.ONE;
48         return bindingGroup.getMatrix(this);
49     }
50
51     public Matrix getBindingMatrix(HasBindingGroup other) {
52         if (other==this) return Matrix.ONE;
53         return bindingGroup.getMatrix(this, other);
54     }
55
56     public void unbind() {
57         if (bindingGroup==null) return;
58         bindingGroup.unbind(this);
59         bindingGroup = null;
60         bindingGroupChanged();
61     }
62
63     public boolean isBoundTo(HasBindingGroup t) {
64         return t==this || (bindingGroup!=null && bindingGroup.contains(t));
65     }
66
67     public Iterable getBoundPeers() {
68         if (bindingGroup==null) bindingGroup = new BindingGroup(this);
69         return bindingGroup;
70     }
71     public void bindingGroupChanged() { }
72 }