VisClient/org/hfbk/vis/MouseViewpoint.java

Go to the documentation of this file.
00001 package org.hfbk.vis;
00002 
00003 import java.awt.event.KeyAdapter;
00004 import java.awt.event.KeyEvent;
00005 import java.awt.event.MouseEvent;
00006 import java.util.HashSet;
00007 
00008 import org.hfbk.nubsi.Spacemouse;
00009 
00010 
00023 public class MouseViewpoint extends Viewpoint{
00024         
00025         final float D=.99f; // damper for dynamic motions
00026         
00027         public float dangle=0, dforward=0, dlift=0, delevation=0, droll=0, dfov=0, tfov=0; // external
00028                                                                                                                                                                                 // settable
00029                                                                                                                                                                                 // motions
00030         public int testomat;
00034         final float angularSpeed = .01f, linearSpeed = .4f;
00035         final int KEYSPEED=100;
00036         
00037         int mx, my, ox, oy, dx, dy; // drag distance
00038 
00039          
00040         boolean button[] = new boolean[MouseEvent.BUTTON3 + 1];
00041         boolean drag=false; // if we got the cam drag
00042                 
00043         HashSet<Integer> keysdown=new HashSet<Integer>();
00044         // final LinkedList<String> keysdown=new LinkedList<String>();
00045         
00046         
00047         public MouseViewpoint(){};
00048         
00049         public void setFov(float value){
00050                 tfov=3.15f-value*3;
00051         }
00052         
00053         public KeyAdapter keys=new KeyAdapter(){
00054                 public void keyPressed(KeyEvent e) {
00055                         keysdown.add(e.getKeyCode());
00056                 }
00057                 public void keyReleased(KeyEvent e) {
00058                         keysdown.remove(new Integer(e.getKeyCode()));
00059                 }
00060         };
00061         
00062         void handleEvent(MouseEvent e) {
00063                 drag=false;
00064                 switch (e.getID()) {
00065                 case MouseEvent.MOUSE_RELEASED:
00066                         button[e.getButton()] = false;
00067                         break;
00068                 case MouseEvent.MOUSE_PRESSED:
00069                         button[e.getButton()] = true;
00070                         ox = e.getX();
00071                         oy = e.getY();
00072                         dx = dy = 0;
00073                         break;
00074                 case MouseEvent.MOUSE_DRAGGED:
00075                         mx = e.getX();
00076                         my = e.getY();
00077                         dx = mx - ox;
00078                         dy = my - oy;
00079                         drag=true;
00080                         break;
00081                 }
00082         }
00083 
00090         public void render(float dt) {
00091                 
00092                 pollMouse(dt);
00093                 
00094                 pollSpacemouse(dt);
00095                 
00096                 forward(dforward*dt*linearSpeed);
00097                 y+=dlift*dt*linearSpeed;
00098                 angle+=dangle*dt;
00099                 elevation+=delevation*dt;
00100                 roll+=droll*dt;
00101                 roll*=.99f;
00102 
00103                 if (tfov!=0)
00104                         dfov=(tfov-fov)*10;
00105                 if (Math.abs(dfov)<.1f)
00106                         tfov=0;
00107                 
00108                 fov+=dfov*dt;
00109                 
00110                 
00111                 dangle          *=D;
00112                 dforward        *=D;
00113                 dlift           *=D;
00114                 delevation      *=D;
00115                 droll           *=D;
00116                 dfov            *=D;
00117         
00118                 super.render(dt);
00119         }
00120         
00121         void pollMouse(float dt){
00122                 if (keysdown.contains(KeyEvent.VK_UP))
00123                         forward( KEYSPEED * linearSpeed* dt );
00124                 if (keysdown.contains(KeyEvent.VK_DOWN))
00125                         forward(-KEYSPEED * linearSpeed* dt );
00126                 if (keysdown.contains(KeyEvent.VK_LEFT))
00127                         angle+= KEYSPEED * angularSpeed* dt ;
00128                 if (keysdown.contains(KeyEvent.VK_RIGHT))
00129                         angle-= KEYSPEED * angularSpeed* dt ;
00130                 if (keysdown.contains(KeyEvent.VK_PAGE_UP))
00131                         y+= KEYSPEED * linearSpeed* dt ;
00132                 if (keysdown.contains(KeyEvent.VK_PAGE_DOWN))
00133                         y-= KEYSPEED * linearSpeed* dt ;
00134                 if (keysdown.contains(KeyEvent.VK_PLUS))
00135                         fov-=fov*dt;
00136                 if (keysdown.contains(KeyEvent.VK_MINUS))
00137                         fov+=fov*dt;
00138                 if (keysdown.contains(KeyEvent.VK_NUMBER_SIGN))
00139                         fov=.5f;
00140                 
00141                 // move the camera by mouse input
00142                 if (button[MouseEvent.BUTTON1]) {
00143                         angle -= dx * dt * angularSpeed;
00144                         forward(-dy * dt * linearSpeed);
00145                 }
00146                 if (button[MouseEvent.BUTTON3]) { // right button
00147                         elevation -= dy * dt * angularSpeed;
00148                         strafe(dx * dt * linearSpeed);
00149                 }
00150                 if (button[MouseEvent.BUTTON2]) { 
00151                         strafe(dx * dt * linearSpeed);
00152                         y -= dy * dt * linearSpeed;
00153                 }
00154         }
00155         
00156         void pollSpacemouse(float dt){
00157                 final float SPEED=15;
00158                 
00159                 try{
00160                                 Spacemouse sm=Spacemouse.getInstance();
00161                                 synchronized(sm){
00162                                         forward(-sm.trans.z*SPEED*dt);
00163                                         strafe(sm.trans.x*SPEED*dt);
00164                                         y+=sm.trans.y*SPEED*dt;
00165                                         
00166                                         angle+=sm.rot.y*dt;
00167                                         elevation+=sm.rot.x*dt;
00168                                 }
00169                 }catch(Error e){}
00170         }
00171 }

Generated on Tue Apr 7 17:57:20 2009 for visclient by  doxygen 1.5.1