import com.blaxxun.x3d.*; import com.blaxxun.bx3d.blaxxun3d; /** * CylinderSensor * * implements a cylinder sensor, * * @author marc kaufmann (mk), blaxxun interactive * @version 0.1 * **/ public class cylinderSensor extends java.applet.Applet implements EventObserver { private Browser browser=null; private Node text=null; private Field textrot=null; private int x=0; public void start() { // connect to blaxxun3d while (browser==null) { browser=blaxxun3d.getBrowser("browser"); hesitate(); } System.out.println("Got browser."); // wait till everything is loaded while (browser.getWorld()==null) { hesitate(); } System.out.println("World loaded."); browser.addAWTObserver(this); browser.addBrowserObserver(this); connectNodes(); } /** * cleanup **/ public void stop() { browser.removeAWTObserver(this); browser.removeBrowserObserver(this); super.destroy(); } /** * Handles awt events sent from the x3d browser * * @param e The java.awt.Event * **/ public boolean onEvent(java.awt.Event event) { switch (event.id) { case java.awt.Event.MOUSE_DOWN: { x=event.x; break; } case java.awt.Event.MOUSE_DRAG: { update3d(event.x-x); x=event.x; break; } } return false; } /** * Handles render events sent from the x3d browser * * method must be implemented, cause applet uses EventObserver interface * not used here * * @param type The type of the event * @param object The object that is associated with the event, Field or Node. object might be * null for certain events, e.g. SHUTDOWN. * @param userdata The userdata that was specified when registering for the event. **/ public boolean onEvent(int type, Object object, Object userData){ return false; } /** * Establishes the connection to the nodes * * @return false if connection has not been established, else true **/ private void connectNodes() { try { text=browser.getNode("text"); textrot=text.getField("rotation"); } catch (Exception e) { System.out.println(e+": Problems getting nodes!"); stop(); } System.out.println("Got nodes."); } /** * updates the orientation coordinate of the node **/ private void update3d(int delta) { float [] rot=new float[4]; // get current orientation rot=textrot.getValueFloatArray(0,-1); rot[3]+=delta/20f; // sync with renderer browser.beginUpdate(); // set new orientation textrot.setValueFloatArray(0,-1,rot); // continue rendering browser.endUpdate(); } /** * waits 300 millis */ private void hesitate() { try { Thread.sleep(300); } catch(InterruptedException ignored) {} } }