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;
00026
00027 public float dangle=0, dforward=0, dlift=0, delevation=0, droll=0, dfov=0, tfov=0;
00028
00029
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;
00038
00039
00040 boolean button[] = new boolean[MouseEvent.BUTTON3 + 1];
00041 boolean drag=false;
00042
00043 HashSet<Integer> keysdown=new HashSet<Integer>();
00044
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
00142 if (button[MouseEvent.BUTTON1]) {
00143 angle -= dx * dt * angularSpeed;
00144 forward(-dy * dt * linearSpeed);
00145 }
00146 if (button[MouseEvent.BUTTON3]) {
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 }