mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/terrain/KeyMotionBehavior.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2003, The Institute for Genomic Research (TIGR).
2 26 Feb 07 jari 3 All rights reserved.
2 26 Feb 07 jari 4 */
2 26 Feb 07 jari 5 /*
2 26 Feb 07 jari 6  * $RCSfile: KeyMotionBehavior.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.3 $
2 26 Feb 07 jari 8  * $Date: 2005/03/10 20:33:21 $
2 26 Feb 07 jari 9  * $Author: braistedj $
2 26 Feb 07 jari 10  * $State: Exp $
2 26 Feb 07 jari 11  */
2 26 Feb 07 jari 12 package org.tigr.microarray.mev.cluster.gui.impl.terrain;
2 26 Feb 07 jari 13
2 26 Feb 07 jari 14 import java.awt.event.KeyEvent;
2 26 Feb 07 jari 15 import java.util.Enumeration;
2 26 Feb 07 jari 16
2 26 Feb 07 jari 17 import javax.media.j3d.Behavior;
2 26 Feb 07 jari 18 import javax.media.j3d.Transform3D;
2 26 Feb 07 jari 19 import javax.media.j3d.TransformGroup;
2 26 Feb 07 jari 20 import javax.media.j3d.WakeupCriterion;
2 26 Feb 07 jari 21 import javax.media.j3d.WakeupOnBehaviorPost;
2 26 Feb 07 jari 22 import javax.vecmath.AxisAngle4d;
2 26 Feb 07 jari 23 import javax.vecmath.Matrix3d;
2 26 Feb 07 jari 24 import javax.vecmath.Point3d;
2 26 Feb 07 jari 25 import javax.vecmath.Vector3d;
2 26 Feb 07 jari 26 import javax.vecmath.Vector3f;
2 26 Feb 07 jari 27
2 26 Feb 07 jari 28 public class KeyMotionBehavior extends Behavior {
2 26 Feb 07 jari 29
2 26 Feb 07 jari 30     public static final int MOVE_LEFT_CMD  = 0;
2 26 Feb 07 jari 31     public static final int MOVE_RIGHT_CMD = 1;
2 26 Feb 07 jari 32     public static final int MOVE_FWD_CMD   = 2;
2 26 Feb 07 jari 33     public static final int MOVE_BWD_CMD   = 3;
2 26 Feb 07 jari 34     public static final int MOVE_UP_CMD    = 4;
2 26 Feb 07 jari 35     public static final int MOVE_DOWN_CMD  = 5;
2 26 Feb 07 jari 36     public static final int TURN_LEFT_CMD  = 6;
2 26 Feb 07 jari 37     public static final int TURN_RIGHT_CMD = 7;
2 26 Feb 07 jari 38     public static final int TURN_UP_CMD    = 8;
2 26 Feb 07 jari 39     public static final int TURN_DOWN_CMD  = 9;
2 26 Feb 07 jari 40     public static final int TILT_LEFT_CMD  = 10;
2 26 Feb 07 jari 41     public static final int TILT_RIGHT_CMD = 11;
2 26 Feb 07 jari 42     public static final int ROT_X_POS_CMD  = 12;
2 26 Feb 07 jari 43     public static final int ROT_Y_POS_CMD  = 13;
2 26 Feb 07 jari 44     public static final int ROT_Z_POS_CMD  = 14;
2 26 Feb 07 jari 45     public static final int ROT_X_NEG_CMD  = 15;
2 26 Feb 07 jari 46     public static final int ROT_Y_NEG_CMD  = 16;
2 26 Feb 07 jari 47     public static final int ROT_Z_NEG_CMD  = 17;
2 26 Feb 07 jari 48     public static final int RESET_CMD      = 18;
2 26 Feb 07 jari 49
2 26 Feb 07 jari 50     private float STEP = 0.01f;
2 26 Feb 07 jari 51     private float UNGLE = (float)Math.PI/180f;
2 26 Feb 07 jari 52
2 26 Feb 07 jari 53     private TransformGroup target;
2 26 Feb 07 jari 54     private Point3d basis;
2 26 Feb 07 jari 55     private Transform3D initialTransform = new Transform3D();
2 26 Feb 07 jari 56     private WakeupOnBehaviorPost wakeupCondition;
2 26 Feb 07 jari 57
2 26 Feb 07 jari 58     public KeyMotionBehavior(TransformGroup target) {
2 26 Feb 07 jari 59         this.target = target;
2 26 Feb 07 jari 60         this.target.getTransform(this.initialTransform);
2 26 Feb 07 jari 61         this.wakeupCondition = new WakeupOnBehaviorPost(this, 0);
2 26 Feb 07 jari 62     }
2 26 Feb 07 jari 63
2 26 Feb 07 jari 64     public void execute(int command) {
2 26 Feb 07 jari 65         postId(command);
2 26 Feb 07 jari 66     }
2 26 Feb 07 jari 67
2 26 Feb 07 jari 68     public void onKeyEvent(KeyEvent e) {
2 26 Feb 07 jari 69         execute(key2command(e));
2 26 Feb 07 jari 70     }
2 26 Feb 07 jari 71
2 26 Feb 07 jari 72     /**
2 26 Feb 07 jari 73      * Sets basis point for the target rotation.
2 26 Feb 07 jari 74      */
2 26 Feb 07 jari 75     public void setBasis(Point3d basis) {
2 26 Feb 07 jari 76         this.basis = basis;
2 26 Feb 07 jari 77     }
2 26 Feb 07 jari 78
2 26 Feb 07 jari 79     public void initialize() {
2 26 Feb 07 jari 80         wakeupOn(this.wakeupCondition);
2 26 Feb 07 jari 81     }
2 26 Feb 07 jari 82
2 26 Feb 07 jari 83     public void processStimulus(Enumeration criteria) {
2 26 Feb 07 jari 84         while (criteria.hasMoreElements()) {
2 26 Feb 07 jari 85             WakeupCriterion wakeup = (WakeupCriterion)criteria.nextElement();
2 26 Feb 07 jari 86             if (wakeup == this.wakeupCondition)
2 26 Feb 07 jari 87                 processCommand(this.wakeupCondition.getTriggeringPostId());
2 26 Feb 07 jari 88         }
2 26 Feb 07 jari 89         wakeupOn(this.wakeupCondition);
2 26 Feb 07 jari 90     }
2 26 Feb 07 jari 91
2 26 Feb 07 jari 92     private void processCommand(int id) {
2 26 Feb 07 jari 93         switch (id) {
2 26 Feb 07 jari 94         case MOVE_LEFT_CMD:
2 26 Feb 07 jari 95             move_left();
2 26 Feb 07 jari 96             break;
2 26 Feb 07 jari 97         case MOVE_RIGHT_CMD:
2 26 Feb 07 jari 98             move_right();
2 26 Feb 07 jari 99             break;
2 26 Feb 07 jari 100         case MOVE_FWD_CMD:
2 26 Feb 07 jari 101             move_forward();
2 26 Feb 07 jari 102             break;
2 26 Feb 07 jari 103         case MOVE_BWD_CMD:
2 26 Feb 07 jari 104             move_backward();
2 26 Feb 07 jari 105             break;
2 26 Feb 07 jari 106         case MOVE_UP_CMD:
2 26 Feb 07 jari 107             move_up();
2 26 Feb 07 jari 108             break;
2 26 Feb 07 jari 109         case MOVE_DOWN_CMD:
2 26 Feb 07 jari 110             move_down();
2 26 Feb 07 jari 111             break;
2 26 Feb 07 jari 112         case TURN_LEFT_CMD:
2 26 Feb 07 jari 113             turn_left();
2 26 Feb 07 jari 114             break;
2 26 Feb 07 jari 115         case TURN_RIGHT_CMD:
2 26 Feb 07 jari 116             turn_right();
2 26 Feb 07 jari 117             break;
2 26 Feb 07 jari 118         case TURN_UP_CMD:
2 26 Feb 07 jari 119             turn_up();
2 26 Feb 07 jari 120             break;
2 26 Feb 07 jari 121         case TURN_DOWN_CMD:
2 26 Feb 07 jari 122             turn_down();
2 26 Feb 07 jari 123             break;
2 26 Feb 07 jari 124         case TILT_LEFT_CMD:
2 26 Feb 07 jari 125             tilt_left();
2 26 Feb 07 jari 126             break;
2 26 Feb 07 jari 127         case TILT_RIGHT_CMD:
2 26 Feb 07 jari 128             tilt_right();
2 26 Feb 07 jari 129             break;
2 26 Feb 07 jari 130         case ROT_X_POS_CMD:
2 26 Feb 07 jari 131             rotate(this.basis, new AxisAngle4d(1, 0, 0, UNGLE));
2 26 Feb 07 jari 132             break;
2 26 Feb 07 jari 133         case ROT_Y_POS_CMD:
2 26 Feb 07 jari 134             rotate(this.basis, new AxisAngle4d(0, 1, 0, UNGLE));
2 26 Feb 07 jari 135             break;
2 26 Feb 07 jari 136         case ROT_Z_POS_CMD:
2 26 Feb 07 jari 137             rotate(this.basis, new AxisAngle4d(0, 0, 1, UNGLE));
2 26 Feb 07 jari 138             break;
2 26 Feb 07 jari 139         case ROT_X_NEG_CMD:
2 26 Feb 07 jari 140             rotate(this.basis, new AxisAngle4d(1, 0, 0, -UNGLE));
2 26 Feb 07 jari 141             break;
2 26 Feb 07 jari 142         case ROT_Y_NEG_CMD:
2 26 Feb 07 jari 143             rotate(this.basis, new AxisAngle4d(0, 1, 0, -UNGLE));
2 26 Feb 07 jari 144             break;
2 26 Feb 07 jari 145         case ROT_Z_NEG_CMD:
2 26 Feb 07 jari 146             rotate(this.basis, new AxisAngle4d(0, 0, 1, -UNGLE));
2 26 Feb 07 jari 147             break;
2 26 Feb 07 jari 148         case RESET_CMD:
2 26 Feb 07 jari 149             reset();
2 26 Feb 07 jari 150             break;
2 26 Feb 07 jari 151         }
2 26 Feb 07 jari 152     }
2 26 Feb 07 jari 153
2 26 Feb 07 jari 154     private static int key2command(KeyEvent e) {
2 26 Feb 07 jari 155         int code = e.getKeyCode();
2 26 Feb 07 jari 156         if (e.isShiftDown()) {
2 26 Feb 07 jari 157             switch (code) {
2 26 Feb 07 jari 158             case KeyEvent.VK_LEFT:
2 26 Feb 07 jari 159                 return TURN_LEFT_CMD;
2 26 Feb 07 jari 160             case KeyEvent.VK_RIGHT:
2 26 Feb 07 jari 161                 return TURN_RIGHT_CMD;
2 26 Feb 07 jari 162             case KeyEvent.VK_UP:
2 26 Feb 07 jari 163                 return TURN_UP_CMD;
2 26 Feb 07 jari 164             case KeyEvent.VK_DOWN:
2 26 Feb 07 jari 165                 return TURN_DOWN_CMD;
2 26 Feb 07 jari 166             }
2 26 Feb 07 jari 167         } else if (e.isControlDown()) {
2 26 Feb 07 jari 168             switch (code) {
2 26 Feb 07 jari 169             case KeyEvent.VK_LEFT:
2 26 Feb 07 jari 170                 return TILT_LEFT_CMD;
2 26 Feb 07 jari 171             case KeyEvent.VK_RIGHT:
2 26 Feb 07 jari 172                 return TILT_RIGHT_CMD;
2 26 Feb 07 jari 173             case KeyEvent.VK_X:
2 26 Feb 07 jari 174                 return ROT_X_POS_CMD;
2 26 Feb 07 jari 175             case KeyEvent.VK_Y:
2 26 Feb 07 jari 176                 return ROT_Y_POS_CMD;
2 26 Feb 07 jari 177             case KeyEvent.VK_Z:
2 26 Feb 07 jari 178                 return ROT_Z_POS_CMD;
2 26 Feb 07 jari 179             }
2 26 Feb 07 jari 180         } else {
2 26 Feb 07 jari 181             switch (code) {
2 26 Feb 07 jari 182             case KeyEvent.VK_LEFT:
2 26 Feb 07 jari 183                 return MOVE_LEFT_CMD;
2 26 Feb 07 jari 184             case KeyEvent.VK_RIGHT:
2 26 Feb 07 jari 185                 return MOVE_RIGHT_CMD;
2 26 Feb 07 jari 186             case KeyEvent.VK_UP:
2 26 Feb 07 jari 187                 return MOVE_FWD_CMD;
2 26 Feb 07 jari 188             case KeyEvent.VK_DOWN:
2 26 Feb 07 jari 189                 return MOVE_BWD_CMD;
2 26 Feb 07 jari 190             case KeyEvent.VK_PAGE_UP:
2 26 Feb 07 jari 191                 return MOVE_UP_CMD;
2 26 Feb 07 jari 192             case KeyEvent.VK_PAGE_DOWN:
2 26 Feb 07 jari 193                 return MOVE_DOWN_CMD;
2 26 Feb 07 jari 194             case KeyEvent.VK_X:
2 26 Feb 07 jari 195                 return ROT_X_NEG_CMD;
2 26 Feb 07 jari 196             case KeyEvent.VK_Y:
2 26 Feb 07 jari 197                 return ROT_Y_NEG_CMD;
2 26 Feb 07 jari 198             case KeyEvent.VK_Z:
2 26 Feb 07 jari 199                 return ROT_Z_NEG_CMD;
2 26 Feb 07 jari 200             case KeyEvent.VK_R:
2 26 Feb 07 jari 201                 return RESET_CMD;
2 26 Feb 07 jari 202             }
2 26 Feb 07 jari 203         }
2 26 Feb 07 jari 204         return -1;
2 26 Feb 07 jari 205     }
2 26 Feb 07 jari 206
2 26 Feb 07 jari 207     protected void reset() {
2 26 Feb 07 jari 208         this.target.setTransform(this.initialTransform);
2 26 Feb 07 jari 209     }
2 26 Feb 07 jari 210
2 26 Feb 07 jari 211     protected void turn_left() {
2 26 Feb 07 jari 212         turnHorizontal(UNGLE);
2 26 Feb 07 jari 213     }
2 26 Feb 07 jari 214
2 26 Feb 07 jari 215     protected void turn_right() {
2 26 Feb 07 jari 216         turnHorizontal(-UNGLE);
2 26 Feb 07 jari 217     }
2 26 Feb 07 jari 218
2 26 Feb 07 jari 219     protected void turn_up() {
2 26 Feb 07 jari 220         turnVertical(UNGLE);
2 26 Feb 07 jari 221     }
2 26 Feb 07 jari 222
2 26 Feb 07 jari 223     protected void turn_down() {
2 26 Feb 07 jari 224         turnVertical(-UNGLE);
2 26 Feb 07 jari 225     }
2 26 Feb 07 jari 226
2 26 Feb 07 jari 227     protected void tilt_left() {
2 26 Feb 07 jari 228         turnFront(UNGLE);
2 26 Feb 07 jari 229     }
2 26 Feb 07 jari 230
2 26 Feb 07 jari 231     protected void tilt_right() {
2 26 Feb 07 jari 232         turnFront(-UNGLE);
2 26 Feb 07 jari 233     }
2 26 Feb 07 jari 234
2 26 Feb 07 jari 235     protected void move_left() {
2 26 Feb 07 jari 236         move(new Vector3f(-STEP, 0f, 0f));
2 26 Feb 07 jari 237     }
2 26 Feb 07 jari 238
2 26 Feb 07 jari 239     protected void move_right() {
2 26 Feb 07 jari 240         move(new Vector3f(STEP, 0f, 0f));
2 26 Feb 07 jari 241     }
2 26 Feb 07 jari 242
2 26 Feb 07 jari 243     protected void move_backward() {
2 26 Feb 07 jari 244         move(new Vector3f(0f, 0f, STEP));
2 26 Feb 07 jari 245     }
2 26 Feb 07 jari 246
2 26 Feb 07 jari 247     protected void move_forward() {
2 26 Feb 07 jari 248         move(new Vector3f(0f, 0f, -STEP));
2 26 Feb 07 jari 249     }
2 26 Feb 07 jari 250
2 26 Feb 07 jari 251     protected void move_up() {
2 26 Feb 07 jari 252         move(new Vector3f(0f, STEP, 0f));
2 26 Feb 07 jari 253     }
2 26 Feb 07 jari 254
2 26 Feb 07 jari 255     protected void move_down() {
2 26 Feb 07 jari 256         move(new Vector3f(0f, -STEP, 0f));
2 26 Feb 07 jari 257     }
2 26 Feb 07 jari 258
2 26 Feb 07 jari 259     protected void rotate(Point3d basis, AxisAngle4d axis) {
2 26 Feb 07 jari 260         if (basis == null || axis == null)
2 26 Feb 07 jari 261             return;
2 26 Feb 07 jari 262         // get target transform
2 26 Feb 07 jari 263         Transform3D target_t3d = new Transform3D();
2 26 Feb 07 jari 264         this.target.getTransform(target_t3d);
2 26 Feb 07 jari 265         // get scale matrix
2 26 Feb 07 jari 266         Matrix3d scale_m3d = new Matrix3d();
2 26 Feb 07 jari 267         target_t3d.getRotationScale(scale_m3d);
2 26 Feb 07 jari 268         // get direction
2 26 Feb 07 jari 269         Vector3d vector3d = new Vector3d();
2 26 Feb 07 jari 270         target_t3d.get(vector3d);
2 26 Feb 07 jari 271         // diff distance
2 26 Feb 07 jari 272         Point3d target_p3d = new Point3d(vector3d);
2 26 Feb 07 jari 273         Point3d diff_p3d   = new Point3d(basis);
2 26 Feb 07 jari 274         diff_p3d.sub(target_p3d);
2 26 Feb 07 jari 275         // calculate direction to the basis point
2 26 Feb 07 jari 276         Matrix3d basis_m3d = new Matrix3d();
2 26 Feb 07 jari 277         basis_m3d.m00 = diff_p3d.x;
2 26 Feb 07 jari 278         basis_m3d.m10 = diff_p3d.y;
2 26 Feb 07 jari 279         basis_m3d.m20 = diff_p3d.z;
2 26 Feb 07 jari 280         scale_m3d.transpose();
2 26 Feb 07 jari 281         scale_m3d.mul(basis_m3d);
2 26 Feb 07 jari 282         Vector3d direction_v3d = new Vector3d();
2 26 Feb 07 jari 283         scale_m3d.getColumn(0, direction_v3d);
2 26 Feb 07 jari 284         // move to basis point
2 26 Feb 07 jari 285         Transform3D move_t3d = new Transform3D();
2 26 Feb 07 jari 286         move_t3d.set(direction_v3d);
2 26 Feb 07 jari 287         target_t3d.mul(move_t3d);
2 26 Feb 07 jari 288         // rotate
2 26 Feb 07 jari 289         Transform3D rotx_t3d = new Transform3D();
2 26 Feb 07 jari 290         rotx_t3d.set(axis);
2 26 Feb 07 jari 291         target_t3d.mul(rotx_t3d);
2 26 Feb 07 jari 292         // move back
2 26 Feb 07 jari 293         direction_v3d.negate();
2 26 Feb 07 jari 294         move_t3d.set(direction_v3d);
2 26 Feb 07 jari 295         target_t3d.mul(move_t3d);
2 26 Feb 07 jari 296         this.target.setTransform(target_t3d);
2 26 Feb 07 jari 297     }
2 26 Feb 07 jari 298
2 26 Feb 07 jari 299     protected void move(Vector3f direction) {
2 26 Feb 07 jari 300         Transform3D transform = new Transform3D();
2 26 Feb 07 jari 301         transform.set(direction);
2 26 Feb 07 jari 302         mul(transform);
2 26 Feb 07 jari 303     }
2 26 Feb 07 jari 304
2 26 Feb 07 jari 305     protected void turnHorizontal(double ungle) {
2 26 Feb 07 jari 306         Transform3D transform = new Transform3D();
2 26 Feb 07 jari 307         transform.rotY(ungle);
2 26 Feb 07 jari 308         mul(transform);
2 26 Feb 07 jari 309     }
2 26 Feb 07 jari 310
2 26 Feb 07 jari 311     protected void turnFront(double ungle) {
2 26 Feb 07 jari 312         Transform3D transform = new Transform3D();
2 26 Feb 07 jari 313         transform.rotZ(ungle);
2 26 Feb 07 jari 314         mul(transform);
2 26 Feb 07 jari 315     }
2 26 Feb 07 jari 316
2 26 Feb 07 jari 317     protected void turnVertical(double ungle) {
2 26 Feb 07 jari 318         Transform3D transform = new Transform3D();
2 26 Feb 07 jari 319         transform.rotX(ungle);
2 26 Feb 07 jari 320         mul(transform);
2 26 Feb 07 jari 321     }
2 26 Feb 07 jari 322
2 26 Feb 07 jari 323     private void mul(Transform3D transform) {
2 26 Feb 07 jari 324         Transform3D t3D = new Transform3D();
2 26 Feb 07 jari 325         this.target.getTransform(t3D);
2 26 Feb 07 jari 326         t3D.mul(transform);
2 26 Feb 07 jari 327         this.target.setTransform(t3D);
2 26 Feb 07 jari 328     }
2 26 Feb 07 jari 329 }