import vrml.*;
import vrml.node.*;
import vrml.field.*;


public class mobile extends Script {
    private SFString node_name;
    private SFRotation current_rotation;
    private SFRotation rotation_changed;
    private SFBool running;
    private SFRotation dialrot;
    private float oldfrac = 0.0f;
    private float lastrot = 0.0f;
    private float vel;
    private float decel;
    private float threshold;

    public void initialize() {
	node_name = (SFString) getField("nodename");
	current_rotation = (SFRotation) getField("currentRotation");
	rotation_changed = (SFRotation) getEventOut("rotation_changed");
	dialrot = (SFRotation) getEventOut("dialrot");
	running = (SFBool) getField("running");
	vel = ((SFFloat) getField("velocity")).getValue();
	decel = ((SFFloat) getField("decel")).getValue();
	threshold = ((SFFloat) getField("decel")).getValue();
    }

    public void processEvent(Event e) {
	String EventName = e.getName();
	if (EventName.equals("set_fraction"))
	    set_fraction(((ConstSFFloat)e.getValue()).getValue());
	if (EventName.equals("spinning"))
	    spin((ConstSFRotation) e.getValue());
    }
    

    private void spin(ConstSFRotation angle) {
	float temp[] = new float[4];
	angle.getValue(temp);
	vel = temp[3] / 3.7f;
	if (vel < 0) 
	    decel = -((SFFloat) getField("decel")).getValue();
	else 
	    decel = ((SFFloat) getField("decel")).getValue();
    }

    private void set_fraction(float frac) {
	if (vel != 0) {
	    float dTime;
	    if (frac > oldfrac) 
		dTime = frac - oldfrac;
	    else 
		    dTime = (1.0f - oldfrac) + frac;
	    oldfrac = frac;
	    lastrot += (vel * dTime) - (decel * dTime * dTime / 2);
	    vel -= decel * dTime;
	    if (Math.abs(vel) < threshold) {
		vel = 0;
		dialrot.setValue(0, 1, 0, 0);
	    }
	    rotation_changed.setValue(0, 1, 0, lastrot);
	} else 
	    oldfrac = frac;
    }
}