import vrml.*; import vrml.node.*; import vrml.field.*; public class watch extends Script{ // Define all the eventOuts and fields as class variables. private SFFloat oldFrac; private SFInt32 tick; private SFBool running; private SFRotation value_changed; private float jvalue_changed[]; // Declare any arrays // This method is called when the script is loaded public void initialize(){ // Get handles to eventOuts and fields from the VRML environment oldFrac = (SFFloat) getField("oldFrac"); tick = (SFInt32) getField("tick"); running = (SFBool) getField("running"); value_changed = (SFRotation) getEventOut("value_changed"); jvalue_changed = new float[4]; // Initialize arrays } // Declare eventIn handlers as private methods private void set_fraction (float frac) { if (running.getValue() == true) { if (frac < oldFrac.getValue()) { int jtick = tick.getValue(); jtick = jtick + 1; if (jtick > 299) jtick = 0; jvalue_changed[3] = -jtick * 2.0f * 3.14159f/300.0f; jvalue_changed[0] = 0.0f; jvalue_changed[1] = 0.0f; jvalue_changed[2] = 1.0f; value_changed.setValue(jvalue_changed); tick.setValue(jtick); } oldFrac.setValue(frac); } } private void stop_start(boolean bval) { if (bval == true) running.setValue(!running.getValue()); } private void reset(boolean bval) { if (bval == true) { tick.setValue(0); jvalue_changed[3] = 0.0f; jvalue_changed[0] = 0.0f; jvalue_changed[1] = 0.0f; jvalue_changed[2] = 1.0f; value_changed.setValue(jvalue_changed); } } // In Java, you have to explicitly handle each event using the // processEvent method. Use it to call a private method for each event. public void processEvent (Event e) { String EventName = e.getName(); if (EventName.equals("set_fraction")) set_fraction(((ConstSFFloat)e.getValue()).getValue()); else if (EventName.equals("stop_start")) stop_start(((ConstSFBool)e.getValue()).getValue()); else if (EventName.equals("reset")) reset(((ConstSFBool)e.getValue()).getValue()); } }