checkpoint
[anneal.git] / src / edu / berkeley / qfat / geom / HasBindingGroup.java
1 package edu.berkeley.qfat.geom;
2 import javax.media.opengl.*;
3 import java.util.*;
4
5 public abstract class HasBindingGroup {
6
7     BindingGroup bindingGroup;
8
9     // know:      self   = bindingGroup[self] * master
10     // know:      other  = other.bindingGroup[other] * other.bindingGroup.master
11     // want:      self   = bindingMatrix * other
12     // therefore: master = bindingGroup[self]^-1 * bindingMatrix * other
13     // therefore:        = bindingGroup[self]^-1 * bindingMatrix * other.bindingGroup[other] * other.bindingGroup.master
14     public void bindTo(Matrix bindingMatrix, HasBindingGroup other) {
15         if (bindingGroup == null) bindingGroup = new BindingGroup(this);
16         if (other.bindingGroup == null) other.bindingGroup = new BindingGroup(other);
17
18         if (other.bindingGroup == this.bindingGroup) {
19             if (bindingGroup.getMatrix(other).equals(Matrix.ONE)) return;
20             throw new Error("rebind attempt with " + bindingGroup.getMatrix(other));
21         }
22
23         bindingMatrix =
24             getBindingMatrix()
25             .times(bindingMatrix)
26             .times(other.getBindingMatrix());
27         other.bindingGroup.merge(bindingGroup, bindingMatrix);
28     }
29
30     public Matrix getBindingMatrix() {
31         if (bindingGroup==null) return Matrix.ONE;
32         return bindingGroup.getMatrix(this);
33     }
34
35     public HasBindingGroup getMaster() {
36         if (bindingGroup==null) return this;
37         return bindingGroup.getMaster();
38     }
39
40     public void unbind() {
41         if (bindingGroup==null) return;
42         bindingGroup.unbind(this);
43         bindingGroup = null;
44         bindingGroupChanged(bindingGroup);
45     }
46
47     public boolean isBoundTo(HasBindingGroup t) {
48         return bindingGroup.contains(t);
49     }
50
51     public Iterable getBoundPeers() { return bindingGroup; }
52     public void bindingGroupChanged(BindingGroup newBindingGroup) { }
53 }