2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
5 package edu
.mit
.ezyang
.gravity
.j3d
;
7 import com
.sun
.j3d
.utils
.behaviors
.mouse
.MouseZoom
;
8 import java
.awt
.AWTEvent
;
9 import java
.awt
.event
.MouseEvent
;
10 import java
.util
.Enumeration
;
11 import javax
.media
.j3d
.Transform3D
;
12 import javax
.media
.j3d
.TransformGroup
;
13 import javax
.media
.j3d
.WakeupCriterion
;
14 import javax
.media
.j3d
.WakeupOnAWTEvent
;
15 import javax
.media
.j3d
.WakeupOnBehaviorPost
;
16 import javax
.vecmath
.Vector3d
;
19 * Modified MouseWheelZoom class which accounts for a rotation in a parent
20 * TransformGroup when calculating translation based off of screen change.
21 * @warning Only the flags constructor was reimplemented.
22 * @author Edward Z. Yang <ezyang@mit.edu>
24 public class SmartMouseZoom
extends MouseZoom
implements SmartMouseBehavior
{
26 protected TransformGroup rotateTG
;
28 public SmartMouseZoom(int flags
) {
33 * Sets the TransformGroup used to determine the rotation that will
34 * be adjusted against.
35 * @param group TransformGroup with Transform3D rotation to adjust for
37 public void setRotateTransformGroup(TransformGroup group
) {
42 * @note Overridden in order to force MouseTranslate to call our overloaded
43 * doProcess() function.
47 public void processStimulus(Enumeration criteria
) {
48 WakeupCriterion wakeup
;
54 while (criteria
.hasMoreElements()) {
55 wakeup
= (WakeupCriterion
) criteria
.nextElement();
56 if (wakeup
instanceof WakeupOnAWTEvent
) {
57 events
= ((WakeupOnAWTEvent
) wakeup
).getAWTEvent();
58 if (events
.length
> 0) {
59 evt
= (MouseEvent
) events
[events
.length
- 1];
62 } else if (wakeup
instanceof WakeupOnBehaviorPost
) {
64 synchronized (mouseq
) {
65 if (mouseq
.isEmpty()) {
68 evt
= (MouseEvent
) mouseq
.remove(0);
69 // consolodate MOUSE_DRAG events
70 while ((evt
.getID() == MouseEvent
.MOUSE_DRAGGED
) &&
72 (((MouseEvent
) mouseq
.get(0)).getID() ==
73 MouseEvent
.MOUSE_DRAGGED
)) {
74 evt
= (MouseEvent
) mouseq
.remove(0);
82 wakeupOn(mouseCriterion
);
86 * Modified doProcess() function with transform from rotateTG
88 void doProcess(MouseEvent evt
) {
92 processMouseEvent(evt
);
94 if (((buttonPress
) && ((flags
& MANUAL_WAKEUP
) == 0)) ||
95 ((wakeUp
) && ((flags
& MANUAL_WAKEUP
) != 0))) {
97 if ((id
== MouseEvent
.MOUSE_DRAGGED
) &&
98 evt
.isAltDown() && !evt
.isMetaDown()) {
107 transformGroup
.getTransform(currXform
);
109 Vector3d trans
= new Vector3d();
110 trans
.z
= dy
* this.getFactor();
112 // The magic happens here:
113 Transform3D transform
= new Transform3D();
114 rotateTG
.getTransform(transform
);
116 transform
.transform(trans
);
119 transformX
.set(trans
);
122 currXform
.mul(currXform
, transformX
);
124 currXform
.mul(transformX
, currXform
);
127 transformGroup
.setTransform(currXform
);
129 transformChanged(currXform
);
131 //if (callback!=null)
132 //callback.transformChanged( MouseBehaviorCallback.ZOOM,
141 } else if (id
== MouseEvent
.MOUSE_PRESSED
) {