/**
 * by Alessandro Borges (2002)
 * new TransformInterpolator.
 * a simplier version of original TransformInterpolator
 **/

import java.util.Enumeration;
import javax.media.j3d.*;

public abstract class TransformInterpolator2 extends Behavior
{

    public TransformInterpolator2()
    {
        target = null;
        axis = new Transform3D();
        axisInverse = new Transform3D();
        currentTransform = new Transform3D();
        prevAlphaValue = (0.0F / 0.0F);
        //passiveWakeupCriterion = new WakeupOnElapsedFrames(elapsedFrames);
        defaultWakeupCriterion = new WakeupOnElapsedFrames(elapsedFrames);
    }

    public TransformInterpolator2(Alpha alph, TransformGroup transformgroup)
    {
        this.alpha = alph;
        target = null;
        axis = new Transform3D();
        axisInverse = new Transform3D();
        currentTransform = new Transform3D();
        prevAlphaValue = (0.0F / 0.0F);
      //  passiveWakeupCriterion = new WakeupOnElapsedFrames(elapsedFrames);
        defaultWakeupCriterion = new WakeupOnElapsedFrames(elapsedFrames);
        target = transformgroup;
        axis.setIdentity();
        axisInverse.setIdentity();
    }

    public TransformInterpolator2(Alpha alph, TransformGroup transformgroup, Transform3D transform3d)
    {
        alpha = alph;
        target = null;
        axis = new Transform3D();
        axisInverse = new Transform3D();
        currentTransform = new Transform3D();
        prevAlphaValue = (0.0F / 0.0F);
        //passiveWakeupCriterion = new WakeupOnElapsedFrames(elapsedFrames);
        defaultWakeupCriterion = new WakeupOnElapsedFrames(elapsedFrames);
        target = transformgroup;
        axis.set(transform3d);
        axisInverse.invert(axis);
    }


    public abstract void computeTransform(float f, Transform3D transform3d);

    public void processStimulus(Enumeration enumeration)
    {

        if(alpha != null)
        {
            float f = alpha.value();
            if(f != prevAlphaValue)
            {
                computeTransform(f, currentTransform);
                target.setTransform(currentTransform);
                prevAlphaValue = f;
            }


            // some difficults here ...
            if(alpha.finished() && alpha.isPaused())
            {
                wakeupOn(defaultWakeupCriterion);
                return;
                        }

        }
        wakeupOn(passiveWakeupCriterion);

    }

     public void initialize()
         {
              wakeupOn(defaultWakeupCriterion);
          }



    TransformGroup target;
    Transform3D axis;
    Transform3D axisInverse;
    Transform3D currentTransform;
    float prevAlphaValue;
    public WakeupCriterion passiveWakeupCriterion;
    Alpha alpha;
    WakeupCriterion defaultWakeupCriterion;
    int elapsedFrames=0;

}