00001 package org.hfbk.vis; 00002 00003 import java.awt.AWTEvent; 00004 import java.awt.Dimension; 00005 import java.awt.dnd.DropTarget; 00006 import java.awt.event.KeyAdapter; 00007 import java.awt.event.KeyEvent; 00008 00009 import org.hfbk.util.ScriptShell; 00010 import org.hfbk.vis.visnode.Screenshooter; 00011 import org.lwjgl.LWJGLException; 00012 import org.lwjgl.opengl.AWTGLCanvas; 00013 import org.lwjgl.opengl.PixelFormat; 00014 import org.lwjgl.util.vector.Vector3f; 00015 00050 public class VisClientPanel extends AWTGLCanvas{ 00051 00052 00053 VisClient client=new VisClient(this); 00054 00055 Allesfresser allesfresser=new Allesfresser(client); 00056 00057 UdpListener udplistener; 00058 00059 ScriptRouter keyrouter=new ScriptRouter(client); 00060 00066 KeyAdapter keys=new KeyAdapter() { 00067 public void keyReleased(KeyEvent e) { 00068 int key = e.getKeyCode(); 00069 if (e.isControlDown()){ 00070 // first dispatch to user prefs defined routes and return if 00071 // key is already handled by a route 00072 if (keyrouter.dispatch(KeyEvent.getKeyText(key),null)) return; 00073 00074 switch(key){ 00075 case KeyEvent.VK_F10: 00076 client.root.add(new Screenshooter()); 00077 break; 00078 case KeyEvent.VK_V: 00079 allesfresser.frissClipboard(); 00080 break; 00081 case KeyEvent.VK_H: 00082 client.hudEnabled=!client.hudEnabled; 00083 break; 00084 case KeyEvent.VK_W: 00085 client.reset(); 00086 break; 00087 case KeyEvent.VK_K: 00088 if (client.hoovered!=null && client.hoovered.parent!=null) 00089 client.hoovered.close(); 00090 client.hoovered.parent.remove(client.hoovered); 00091 break; 00092 case KeyEvent.VK_R: 00093 client.resetValues(); 00094 break; 00095 case KeyEvent.VK_M: 00096 Prefs.current.map^=true; 00097 break; 00098 case KeyEvent.VK_P: 00099 new PrefsDialog(); 00100 break; 00101 case KeyEvent.VK_T: 00102 new ScriptShell(client); 00103 break; 00104 } 00105 }else switch(key){ 00106 case KeyEvent.VK_F1: 00107 new VisClientScripter(client).source("scripts/help.vs"); 00108 break; 00109 case KeyEvent.VK_BACK_SPACE: 00110 client.stepViewpoint(-1); 00111 break; 00112 case KeyEvent.VK_SHIFT: 00113 if (client.root.lastVisNode!=null) 00114 client.setViewpoint(client.root.lastVisNode.traverse(client.root,new Vector3f()),1); 00115 break; 00116 } 00117 } 00118 }; 00119 00120 00121 static PixelFormat getPixelFormat(){ 00122 return new PixelFormat().withSamples(4); 00123 } 00124 00125 public Dimension getPreferredSize() { 00126 return new Dimension(640,480); 00127 } 00128 00134 public VisClientPanel() throws LWJGLException { 00135 00136 //super(getPixelFormat()); 00137 00138 // setSize(640, 480); 00139 00140 addKeyListener(keys); 00141 00142 setDropTarget(new DropTarget(this,allesfresser)); //to handle drag'n drop objects 00143 00144 if (Prefs.current.udp) udplistener=new UdpListener(client); 00145 00146 enableEvents(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK); 00147 00148 00149 Thread updater=new Thread("Update Loop"){ 00150 public void run() { 00151 while (true) 00152 update(); 00153 } 00154 }; 00155 updater.setDaemon(true); 00156 updater.start(); 00157 } 00158 00159 00164 public void processEvent(AWTEvent e) { 00165 super.processEvent(e); 00166 client.processEvent(e); 00167 } 00168 00183 public void update() { 00184 try { 00185 while(hasToRender) 00186 Thread.sleep(10); 00187 } catch (InterruptedException e) {} 00188 hasToRender=true; 00189 repaint(); 00190 } 00191 boolean hasToRender=true; 00192 00197 protected void initGL() { 00198 /*if (GLContext.getCapabilities().GL_ARB_multisample) { 00199 System.out.println("multisample!"); 00200 GL11.glEnable(ARBMultisample.GL_MULTISAMPLE_ARB); 00201 }*/ 00202 00203 client.init(); 00204 } 00205 00209 protected void paintGL() { 00210 00211 if (Prefs.current.udp && udplistener==null) 00212 udplistener=new UdpListener(client); 00213 else if (!Prefs.current.udp && udplistener!=null){ 00214 udplistener.close(); 00215 udplistener=null; 00216 } 00217 client.paintGL(getWidth(), getHeight()); 00218 00219 try { 00220 swapBuffers(); // actually show this render 00221 } catch (LWJGLException e) { 00222 throw new RuntimeException(e); 00223 } 00224 00225 hasToRender=false; //notify main loop 00226 // repaint(); 00227 } 00228 }