Add selection highlighting support; disable cube.
[gravitysimulator.git] / src / edu / mit / ezyang / gravity / j3d / SmartMouseTranslate.java
blob713c977e7c5438a5a6ca8b6942adb1ba4faf2922
1 /*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
6 package edu.mit.ezyang.gravity.j3d;
8 import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
9 import java.awt.*;
10 import java.awt.event.*;
11 import java.util.*;
12 import javax.media.j3d.*;
13 import javax.vecmath.*;
15 /**
16 * Modified MouseTranslate class which accounts for a rotation in a parent
17 * TransformGroup when calculating translation based off of screen change.
18 * @warning Only the flags constructor was reimplemented; manually call
19 * all other methods.
20 * @author Edward Z. Yang <ezyang@mit.edu>
22 public class SmartMouseTranslate extends MouseTranslate implements SmartMouseBehavior {
23 protected TransformGroup rotateTG;
25 public SmartMouseTranslate(int flags) {
26 super(flags);
29 /**
30 * Sets the TransformGroup used to determine the rotation that will
31 * be adjusted against.
32 * @param group TransformGroup with Transform3D rotation to adjust for
34 public void setRotateTransformGroup(TransformGroup group) {
35 rotateTG = group;
39 /**
40 * @note Overridden in order to force MouseTranslate to call our overloaded
41 * doProcess() function.
42 * @param criteria
44 @Override
45 public void processStimulus (Enumeration criteria) {
46 WakeupCriterion wakeup;
47 AWTEvent[] events;
48 MouseEvent evt;
50 while (criteria.hasMoreElements()) {
51 wakeup = (WakeupCriterion) criteria.nextElement();
53 if (wakeup instanceof WakeupOnAWTEvent) {
54 events = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
55 if (events.length > 0) {
56 evt = (MouseEvent) events[events.length-1];
57 doProcess(evt);
61 else if (wakeup instanceof WakeupOnBehaviorPost) {
62 while (true) {
63 // access to the queue must be synchronized
64 synchronized (mouseq) {
65 if (mouseq.isEmpty()) break;
66 evt = (MouseEvent)mouseq.remove(0);
67 // consolodate MOUSE_DRAG events
68 while ((evt.getID() == MouseEvent.MOUSE_DRAGGED) &&
69 !mouseq.isEmpty() &&
70 (((MouseEvent)mouseq.get(0)).getID() ==
71 MouseEvent.MOUSE_DRAGGED)) {
72 evt = (MouseEvent)mouseq.remove(0);
75 doProcess(evt);
80 wakeupOn(mouseCriterion);
83 /**
84 * Modified doProcess() function with transform from rotateTG
86 private void doProcess(MouseEvent evt) {
87 int id;
88 int dx, dy;
90 processMouseEvent(evt);
92 if (((buttonPress)&&((flags & MANUAL_WAKEUP) == 0)) ||
93 ((wakeUp)&&((flags & MANUAL_WAKEUP) != 0))){
94 id = evt.getID();
95 if ((id == MouseEvent.MOUSE_DRAGGED) &&
96 !evt.isAltDown() && evt.isMetaDown()) {
98 x = evt.getX();
99 y = evt.getY();
101 dx = x - x_last;
102 dy = y - y_last;
104 if ((!reset) && ((Math.abs(dy) < 50) && (Math.abs(dx) < 50))) {
105 //System.out.println("dx " + dx + " dy " + dy);
106 transformGroup.getTransform(currXform);
108 Vector3d trans = new Vector3d();
109 trans.x = dx*this.getXFactor();
110 trans.y = -dy*this.getYFactor();
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 // callback is a private property, so we don't support it.
132 // For completeness sake, we could overload all of the
133 // relevant functions to reimplement it.
134 //if (callback!=null)
135 //callback.transformChanged( MouseBehaviorCallback.TRANSLATE,
136 // currXform );
139 else {
140 reset = false;
142 x_last = x;
143 y_last = y;
145 else if (id == MouseEvent.MOUSE_PRESSED) {
146 x_last = evt.getX();
147 y_last = evt.getY();