VisClient/org/hfbk/vis/VisClient.java

Go to the documentation of this file.
00001 /*
00002  * Created on 17.03.2008
00003  *
00004  */
00005 package org.hfbk.vis;
00006 
00007 import java.awt.AWTEvent;
00008 import java.awt.event.MouseEvent;
00009 import java.util.ArrayList;
00010 import java.util.EventObject;
00011 import java.util.LinkedList;
00012 import java.util.List;
00013 
00014 import org.dronus.gl.GLUtil;
00015 import org.hfbk.vis.visnode.VisHUD;
00016 import org.hfbk.vis.visnode.VisNodeMousable;
00017 import org.hfbk.vis.visnode.VisRoot;
00018 import org.hfbk.vis.visnode.VisStructure;
00019 import org.hfbk.vis.visnode.VisWelcome;
00020 import org.lwjgl.opengl.GL11;
00021 import org.lwjgl.util.Color;
00022 import org.lwjgl.util.Timer;
00023 import org.lwjgl.util.vector.Vector3f;
00031 public class VisClient{
00032 
00033         //the Panel we draw in 
00034         public VisClientPanel panel;
00035         
00036         //services
00037         Timer timer = new Timer();
00038         public float timescale=1;
00040         public float dt;
00041         
00043         List<AWTEvent> events = new LinkedList<AWTEvent>(), oldEvents = new LinkedList<AWTEvent>();
00044         
00046         public VisRoot root;
00047 
00049         public VisHUD hud;
00050         public boolean hudEnabled=true;
00051         
00052         public VisNodeMousable hoovered=null;
00053         
00054         //viewpoint management
00055         List<Viewpoint> history = new ArrayList<Viewpoint>();
00056         int viewpointIndex = -1; 
00058         public MouseViewpoint mouseViewpoint=new MouseViewpoint();
00060         public TransitionViewpoint transViewpoint = null;
00061         public boolean animateViewpoint=false;
00062         float timeSinceVpSave=0;  
00063         
00064 
00065         public VisClient(VisClientPanel panel) {
00066                 System.out.println("vis/client revision "+Prefs.current.version);
00067                 this.panel=panel;
00068         }
00069 
00074         public void reset(){ //
00075                 if (root!=null) root.close(); //stops threads if any 
00076                 root = new VisRoot(this);
00077                 root.add(new VisStructure());
00078                 
00079                 hud = new VisHUD(this);
00080 
00081                 panel.removeKeyListener(mouseViewpoint.keys);
00082                 mouseViewpoint=new MouseViewpoint();
00083                 panel.addKeyListener(mouseViewpoint.keys);
00084                 mouseViewpoint.forward(-100);
00085                 mouseViewpoint.angle = -.3f;
00086                 
00087                 history.clear();
00088                 animateViewpoint=false;
00089                 transViewpoint=null;
00090                 
00091                 if (Prefs.current.init.length()>0){
00092                         try{
00093                                 new VisClientScripter(this).evaluate(Prefs.current.init);
00094                         }catch(Exception e){
00095                                 System.out.println("Init script failed! Check prefs->init!");
00096                         }
00097                 }
00098                 
00099                 System.gc();
00100                 System.runFinalization();
00101         }
00102         
00103         public void resetValues() {
00104                 timescale=1;
00105                 mouseViewpoint.fov=Viewpoint.DEFAULT_FOV;
00106         }
00107 
00115         public void init() {
00116                 GLUtil.init(); // some gl default setup
00117 
00118                 reset();
00119                 root.add(new VisWelcome());
00120         }
00121 
00122         
00123         AWTEvent lastDragEvent=null;
00128         public void processEvent(AWTEvent e) {
00129                 
00130                 if (mouseViewpoint.drag && e instanceof MouseEvent){
00131                         mouseViewpoint.handleEvent((MouseEvent) e); //handle right here instead of in paintGL()
00132                         lastDragEvent=null;
00133                 }else{
00134                         events.add(e);
00135                         
00136                         if (e.getID()==MouseEvent.MOUSE_DRAGGED) lastDragEvent=e;
00137                         else if (e.getID()==MouseEvent.MOUSE_RELEASED) lastDragEvent=null;
00138                 }
00139                 
00140                 
00141         }
00142                 
00162         public void paintGL(int w, int h) {
00163                 
00164                 // got time since last frame
00165                 Timer.tick();   
00166                 dt = timer.getTime()*timescale;
00167                 timer.reset();
00168                 
00169                 timeSinceVpSave+=dt;
00170                 if (timeSinceVpSave>4){
00171                         saveVewpoint();
00172                         timeSinceVpSave=Float.NEGATIVE_INFINITY; //never save again until moved.
00173                         hud.notifyUser();
00174                 }
00175                 
00176                 coerceEvents();
00177                 
00178                 oldEvents.addAll(events); // remember events to detect new ones
00179 
00180                 // lets begin rendering.
00181                 //GL11.glColor4d(6, 6, 6, 0);
00182                 GLUtil.aspect = w / (float) h;
00183                 GL11.glViewport(0, 0, w, h); // may have changed due to window resizing!                
00184                 GLUtil.initFrustum(GLUtil.fov, .1, 300); // set the perspective transform
00185 
00186                 Color c=GLUtil.backgroundcolor;
00187                 GL11.glClearColor(c.getRed()/256f, c.getGreen()/256f, c.getBlue()/256f, c.getAlpha()/256f);
00188                 
00189                 GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
00190 
00191                 
00192                 // set the camera transform
00193                 if (transViewpoint != null) {// are we just in transition?
00194                         transViewpoint.render(dt);
00195                         if (transViewpoint.checkArrived()) {
00196                                 // the  transition just finished.
00197                                 mouseViewpoint.set(transViewpoint);
00198                                 transViewpoint = null;
00199                                 
00200                                 if (animateViewpoint) //animation, so continue with further vps. 
00201                                         stepViewpoint(1); 
00202                         }
00203                 } else {
00204                         mouseViewpoint.render(dt);
00205                         if (mouseViewpoint.moving)
00206                                 timeSinceVpSave=0; //only save a vp if resting for some secs
00207                 }
00208 
00209                 // now render all visual nodes, respecting incoming events
00210                 root.render(events);
00211                 
00212                 //render the HUD overlay
00213                 hud.render(events); 
00214 
00215                 for (AWTEvent e : events) // let the viewpoint process its events..
00216                         if (e instanceof MouseEvent)
00217                                 mouseViewpoint.handleEvent((MouseEvent) e);
00218 
00219                 for (EventObject e : oldEvents) // clear all events except new issued ones.
00220                         events.remove(e);
00221                 oldEvents.clear();
00222         }
00223 
00225         void coerceEvents() {
00226                 //      dirty: push back last drag event to allow dragging by camera mvmnt.
00227                 if (mouseViewpoint.moving && lastDragEvent!=null && lastDragEvent.getID()==MouseEvent.MOUSE_DRAGGED)
00228                         events.add(lastDragEvent);
00229                 //TODO  corerce events!!!
00230                 //List<AWTEvent> tmp=events.clone();
00231         }
00232 
00238         public void setViewpoint(Viewpoint vp, float speed) {
00239                 if (transViewpoint!=null)
00240                         mouseViewpoint.set(transViewpoint);
00241                 transViewpoint = new TransitionViewpoint(mouseViewpoint, vp, speed);
00242         }
00243         
00246         public void setViewpoint(Vector3f vposition, float speed) {
00247                 Viewpoint vp=new Viewpoint(vposition, 0, 0);
00248                 vp.z += 40;
00249                 setViewpoint(vp, speed);
00250         }
00251 
00253         public void setLookAt(Vector3f position) {
00254 
00255                 Vector3f eye = new Vector3f(mouseViewpoint);
00256 
00257                 Vector3f dir = Vector3f.sub(eye, position, null);
00258                 
00259                 //calculate heading
00260                 float angle = (float) Math.atan(dir.x / dir.z);
00261                 if (dir.z < 0)
00262                         angle += Math.PI;
00263 
00264                 eye.y = position.y; //set height
00265 
00266                 setViewpoint(new Viewpoint(eye, angle, 0),1);
00267         }
00268         
00274         public void stepViewpoint(int direction){
00275                 
00276                 if (transViewpoint!=null) //we interrupt or continue a existing transition
00277                         mouseViewpoint.set(transViewpoint);//get back its current position
00278                 
00279                 int s=history.size();
00280                 viewpointIndex=(viewpointIndex+direction+s)%s;          
00281                 
00282                 if (viewpointIndex>=0)
00283                         transViewpoint = new TransitionViewpoint(mouseViewpoint, history.get(viewpointIndex), .4f);
00284         }
00290         public boolean saveVewpoint() {
00291                 //check if we just added this vp to prevent double vps if user presses button too much :-)
00292                 if (! (history.size()>0 && mouseViewpoint.equals(history.get(history.size()-1)))){
00293                         history.add(mouseViewpoint.clone());
00294                         return true;
00295                 }
00296                 return false;
00297         }
00305         public void animateViewpoint(boolean animate) {
00306                 if (animate && history.size() > 0) {
00307                         stepViewpoint(1);
00308                         animateViewpoint=true;
00309                 } else if (transViewpoint!=null){                       
00310                         mouseViewpoint.set(transViewpoint);
00311                         transViewpoint = null;
00312                         animateViewpoint=false;
00313                 }               
00314         }
00315         
00324         public static void main(String[] args) throws Exception{
00325 
00326                 Prefs.current.load();
00327                 if (args.length>0)
00328                         Prefs.current.parse(args);      
00329                 else 
00330                         Prefs.addShutdownHook(); //register Prefs to save itself on exit
00331                 
00332                 //get a working vis server.
00333                 new ServerManager().start();
00334                 
00335                 //let's go!
00336                 new VisClientWindow();
00337         }
00338 }

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