00001
00002
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
00034 public VisClientPanel panel;
00035
00036
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
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();
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();
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);
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
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;
00173 hud.notifyUser();
00174 }
00175
00176 coerceEvents();
00177
00178 oldEvents.addAll(events);
00179
00180
00181
00182 GLUtil.aspect = w / (float) h;
00183 GL11.glViewport(0, 0, w, h);
00184 GLUtil.initFrustum(GLUtil.fov, .1, 300);
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
00193 if (transViewpoint != null) {
00194 transViewpoint.render(dt);
00195 if (transViewpoint.checkArrived()) {
00196
00197 mouseViewpoint.set(transViewpoint);
00198 transViewpoint = null;
00199
00200 if (animateViewpoint)
00201 stepViewpoint(1);
00202 }
00203 } else {
00204 mouseViewpoint.render(dt);
00205 if (mouseViewpoint.moving)
00206 timeSinceVpSave=0;
00207 }
00208
00209
00210 root.render(events);
00211
00212
00213 hud.render(events);
00214
00215 for (AWTEvent e : events)
00216 if (e instanceof MouseEvent)
00217 mouseViewpoint.handleEvent((MouseEvent) e);
00218
00219 for (EventObject e : oldEvents)
00220 events.remove(e);
00221 oldEvents.clear();
00222 }
00223
00225 void coerceEvents() {
00226
00227 if (mouseViewpoint.moving && lastDragEvent!=null && lastDragEvent.getID()==MouseEvent.MOUSE_DRAGGED)
00228 events.add(lastDragEvent);
00229
00230
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
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;
00265
00266 setViewpoint(new Viewpoint(eye, angle, 0),1);
00267 }
00268
00274 public void stepViewpoint(int direction){
00275
00276 if (transViewpoint!=null)
00277 mouseViewpoint.set(transViewpoint);
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
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();
00331
00332
00333 new ServerManager().start();
00334
00335
00336 new VisClientWindow();
00337 }
00338 }