import javax.media.j3d.*;
import java.util.*;
import java.applet.*;
import java.net.URL;
import java.awt.*;
import java.awt.event.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.*;
import com.sun.j3d.utils.behaviors.*;
import javax.vecmath.*;
import java.lang.Math;
import java.util.Enumeration;

public class ViewMovement extends Behavior {


        private TransformGroup yrot;
        private TransformGroup xrot;
        private Transform3D yTransform;
        private Transform3D xTransform;
        private Vector3d vec;
        private Vector3d addition;
        private WakeupCondition conditions;
        private double turnY=0;
        private double turnX=0;

        public ViewMovement(TransformGroup ynode,TransformGroup xnode)
        {
                yrot=ynode;xrot=xnode;
                WakeupCriterion wakeUp[]={
                        new WakeupOnElapsedFrames(0),new WakeupOnAWTEvent(Event.KEY_PRESS)};
                conditions=new WakeupOr(wakeUp);

        }	

        public void initialize()
        {
                vec=new Vector3d();
                yTransform=new Transform3D();
                xTransform=new Transform3D();
                yrot.getTransform(yTransform);
                yTransform.get(vec);

                wakeupOn(conditions);
        }

        public void processKeyEvent(KeyEvent evt)
        {
                int key;

                key=evt.getKeyCode();

                if(key==KeyEvent.VK_UP)
                {
                        turnX=turnX+0.1;
                        xTransform.rotX(turnX);
                        System.out.println("Up button");
                        return;
                }
                else if(key==KeyEvent.VK_DOWN)
                {
                        turnX=turnX-0.1;
                        xTransform.rotX(turnX);
                        System.out.println("Down button");
                        return;
                }
                else if(key==KeyEvent.VK_LEFT)
                {
                        turnY=turnY-0.1;
                        yTransform.rotY(turnY);
                        System.out.println("Left button");
                        return;
                }
                else if(key==KeyEvent.VK_RIGHT)
                {
                        turnY=turnY+0.1;
                        yTransform.rotY(turnY);
                        System.out.println("Right button");
                        return;
                }
                return;
        }

        public Vector3d calculateNewDistance(double distance, double xrotation, double yrotation)
        {
                double xdistance=0;
                double ydistance=0;
                double zdistance=0;
                double ztempdistance=0;
                Vector3d newDistance;

                // Calaculate two dimensional distances
                ydistance=            Math.sin(xrotation)*distance;

                ztempdistance=        Math.cos(xrotation)*distance;

                //Calculate 3 dimensional distances
                xdistance=            Math.sin(yrotation)*ztempdistance;
                zdistance=            Math.cos(yrotation)*ztempdistance;

                newDistance=new Vector3d(xdistance,ydistance,-zdistance);
//              System.out.println(""+newDistance);
                return newDistance;
        }



        public void processStimulus(Enumeration criteria)
        {
                WakeupCriterion wakeupInstance;

        	
                AWTEvent[] evt=null;
                try{
                while(criteria.hasMoreElements())
                {
                        wakeupInstance=(WakeupCriterion)criteria.nextElement();
                        if(wakeupInstance instanceof WakeupOnElapsedFrames)
                   {
                                vec.add(calculateNewDistance(0.1,turnX,turnY));
                	
                        }
                        if(wakeupInstance instanceof WakeupOnAWTEvent)
                        {
                	
                                System.out.println("Keyboard press detected");
                                evt=((WakeupOnAWTEvent)wakeupInstance).getAWTEvent();
                                processKeyEvent((KeyEvent)evt[0]);

                        }
                }
                yTransform.set(vec);
                yrot.setTransform(yTransform);
                xrot.setTransform(xTransform);
                wakeupOn(conditions);
                }
                catch(NullPointerException e1){System.out.println("Null Exception");}
        }
}

	
	











