1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 package ffx.ui.behaviors;
39
40 import java.awt.AWTEvent;
41 import java.awt.event.MouseEvent;
42 import java.util.Iterator;
43 import org.jogamp.java3d.Behavior;
44 import org.jogamp.java3d.Bounds;
45 import org.jogamp.java3d.BranchGroup;
46 import org.jogamp.java3d.Canvas3D;
47 import org.jogamp.java3d.TransformGroup;
48 import org.jogamp.java3d.WakeupCriterion;
49 import org.jogamp.java3d.WakeupOnAWTEvent;
50 import org.jogamp.java3d.WakeupOr;
51 import org.jogamp.java3d.utils.picking.PickCanvas;
52
53
54
55
56
57
58 public abstract class PickMouseBehavior extends Behavior {
59
60 static int count = 0;
61 protected PickCanvas pickCanvas;
62 protected WakeupCriterion[] conditions;
63 protected WakeupOr wakeupCondition;
64 protected boolean buttonPress = false;
65 protected boolean shiftButton = false;
66 protected boolean controlButton = false;
67 protected TransformGroup currGrp;
68 protected MouseEvent mevent;
69
70
71
72
73
74
75
76
77
78 public PickMouseBehavior(Canvas3D canvas, BranchGroup root, Bounds bounds) {
79 super();
80 setSchedulingBounds(bounds);
81 currGrp = new TransformGroup();
82 currGrp.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
83 currGrp.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
84 root.addChild(currGrp);
85 pickCanvas = new PickCanvas(canvas, root);
86 pickCanvas.setMode(PickCanvas.GEOMETRY);
87 pickCanvas.setTolerance(10.0f);
88 }
89
90
91 public void initialize() {
92 conditions = new WakeupCriterion[1];
93
94 conditions[0] = new WakeupOnAWTEvent(AWTEvent.MOUSE_EVENT_MASK);
95 wakeupCondition = new WakeupOr(conditions);
96 wakeupOn(wakeupCondition);
97 }
98
99
100 @Override
101 public void processStimulus(Iterator<WakeupCriterion> criteria) {
102 AWTEvent[] evt = null;
103 while (criteria.hasNext()) {
104 WakeupCriterion wakeup = criteria.next();
105 if (wakeup instanceof WakeupOnAWTEvent) {
106 evt = ((WakeupOnAWTEvent) wakeup).getAWTEvent();
107 }
108 }
109 int xpos = 0, ypos = 0;
110 if (evt != null && evt[0] instanceof MouseEvent) {
111 mevent = (MouseEvent) evt[0];
112 processMouseEvent((MouseEvent) evt[0]);
113 xpos = mevent.getPoint().x;
114 ypos = mevent.getPoint().y;
115 }
116 if (buttonPress) {
117 updateScene(xpos, ypos);
118 }
119 wakeupOn(wakeupCondition);
120 }
121
122
123
124
125
126
127 public void setTolerance(float tol) {
128 if (pickCanvas != null) {
129 pickCanvas.setTolerance(tol);
130 }
131 }
132
133
134
135
136
137
138
139 public abstract void updateScene(int xpos, int ypos);
140
141 private void processMouseEvent(MouseEvent evt) {
142 buttonPress =
143 evt.getID() == MouseEvent.MOUSE_PRESSED
144 | evt.getID() == MouseEvent.MOUSE_CLICKED
145 | evt.getID() == MouseEvent.MOUSE_RELEASED;
146 controlButton = evt.isControlDown();
147 shiftButton = evt.isShiftDown();
148 }
149 }