package NET.worlds.scape; import java.io.IOException; public class RollBehavior extends VelocityBehavior { public float rollFactor; private long lastTime; private float bumpFraction; private static Object classCookie = new Object(); public RollBehavior(Point3Temp vel, float diameter) { super(vel, 0.0F, Point3Temp.make(0.0F, 0.0F, 1.0F), 0.0F, 0.0F); this.rollFactor = 360.0F / (3.1416F * diameter); } public RollBehavior() { } @Override public boolean handle(FrameEvent e) { float vel = this.linearVel; float dT = (float)(e.time - this.lastTime) / 1000.0F; this.bumpFraction = 1.0F; super.handle(e); if (vel != 0.0F && this.lastTime != 0L) { e.receiver.worldSpin(-this.dir.y, this.dir.x, this.dir.z, this.dir.length() * dT * vel * this.rollFactor * this.bumpFraction); } this.lastTime = e.time; return true; } @Override public boolean handle(BumpEventTemp b) { this.bumpFraction = b.fraction; return super.handle(b); } @Override public Object properties(int index, int offset, int mode, Object value) throws NoSuchPropertyException { Object ret = null; switch (index - offset) { case 0: if (mode == 0) { ret = FloatPropertyEditor.make(new Property(this, index, "Roll Factor")); } else if (mode == 1) { ret = new Float(this.rollFactor); } else if (mode == 2) { this.rollFactor = (Float)value; } break; default: ret = super.properties(index, offset + 1, mode, value); } return ret; } @Override public void saveState(Saver s) throws IOException { s.saveVersion(0, classCookie); super.saveState(s); s.saveFloat(this.rollFactor); s.saveFloat(this.bumpFraction); } @Override public void restoreState(Restorer r) throws IOException, TooNewException { switch (r.restoreVersion(classCookie)) { case 0: super.restoreState(r); this.rollFactor = r.restoreFloat(); this.bumpFraction = r.restoreFloat(); return; default: throw new TooNewException(); } } }