User interface mostly done, except for velocity editing.
[gravitysimulator.git] / src / edu / mit / ezyang / gravity / j3d / SmartMouseZoom.java
blob0fa9e0e0780e8262c9b8a33ab5c006807222faea
1 /*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
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;
18 /**
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) {
29 super(flags);
32 /**
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) {
38 rotateTG = group;
41 /**
42 * @note Overridden in order to force MouseTranslate to call our overloaded
43 * doProcess() function.
44 * @param criteria
46 @Override
47 public void processStimulus(Enumeration criteria) {
48 WakeupCriterion wakeup;
49 AWTEvent[] events;
50 MouseEvent evt;
51 // int id;
52 // int dx, dy;
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];
60 doProcess(evt);
62 } else if (wakeup instanceof WakeupOnBehaviorPost) {
63 while (true) {
64 synchronized (mouseq) {
65 if (mouseq.isEmpty()) {
66 break;
68 evt = (MouseEvent) mouseq.remove(0);
69 // consolodate MOUSE_DRAG events
70 while ((evt.getID() == MouseEvent.MOUSE_DRAGGED) &&
71 !mouseq.isEmpty() &&
72 (((MouseEvent) mouseq.get(0)).getID() ==
73 MouseEvent.MOUSE_DRAGGED)) {
74 evt = (MouseEvent) mouseq.remove(0);
77 doProcess(evt);
82 wakeupOn(mouseCriterion);
85 /**
86 * Modified doProcess() function with transform from rotateTG
88 void doProcess(MouseEvent evt) {
89 int id;
90 int dx, dy;
92 processMouseEvent(evt);
94 if (((buttonPress) && ((flags & MANUAL_WAKEUP) == 0)) ||
95 ((wakeUp) && ((flags & MANUAL_WAKEUP) != 0))) {
96 id = evt.getID();
97 if ((id == MouseEvent.MOUSE_DRAGGED) &&
98 evt.isAltDown() && !evt.isMetaDown()) {
100 x = evt.getX();
101 y = evt.getY();
103 dx = x - x_last;
104 dy = y - y_last;
106 if (!reset) {
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);
115 transform.invert();
116 transform.transform(trans);
117 // End magic
119 transformX.set(trans);
121 if (invert) {
122 currXform.mul(currXform, transformX);
123 } else {
124 currXform.mul(transformX, currXform);
127 transformGroup.setTransform(currXform);
129 transformChanged(currXform);
131 //if (callback!=null)
132 //callback.transformChanged( MouseBehaviorCallback.ZOOM,
133 // currXform );
135 } else {
136 reset = false;
139 x_last = x;
140 y_last = y;
141 } else if (id == MouseEvent.MOUSE_PRESSED) {
142 x_last = evt.getX();
143 y_last = evt.getY();