package org.waltermilner;

import com.sun.opengl.util.Animator;
import com.sun.opengl.util.GLUT;
import java.awt.Frame;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;

public class ExploreOrientation implements GLEventListener, KeyListener {

    static Animator animator = null;
    private GLU glu = new GLU();
    private WMVector camera = new WMVector(1.0, 0.5, -10.0);
    private WMVector lookAt = new WMVector(0.0, 0.0, 0.0);
    private WMVector up = new WMVector(0.0, 1.0, 0.0);
    GLUT glut = new GLUT();
   Stick stick = new Stick();
    

    public void display(GLAutoDrawable drawable) {
        final GL gl = drawable.getGL();
        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();

        glu.gluLookAt(camera.getX(), camera.getY(), camera.getZ(), lookAt.getX(), lookAt.getY(), lookAt.getZ(), up.getX(), up.getY(), up.getZ());
        stick.draw(gl);

       

        
    }

    public void displayChanged(GLAutoDrawable gLDrawable, boolean modeChanged, boolean deviceChanged) {
    }

    public void init(GLAutoDrawable gLDrawable) {

        final GL gl = gLDrawable.getGL();
        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        gl.glShadeModel(GL.GL_SMOOTH);
        gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
        gLDrawable.addKeyListener(this);
    }

    public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height) {
        GL gl = gLDrawable.getGL();

        if (height <= 0) // avoid a divide by zero error!
        {
            height = 1;
        }
        final float h = (float) width / (float) height;
        gl.glViewport(0, 0, width, height);
        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();
        glu.gluPerspective(45.0f, h, 1.0, 100.0);
        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    /** Program's main entry point
     * @param args command line arguments.
     */
    public static void main(String[] args) {
     
        //Quaternion.test();
        
        Frame frame = new Frame("Explore orientation");
        GLCanvas canvas = new GLCanvas();
        canvas.addGLEventListener(new ExploreOrientation());
        frame.add(canvas);
        frame.setSize(640, 480);
        animator = new Animator(canvas);
        frame.addWindowListener(new  

              WindowAdapter( ) {

                
                @Override
            public void windowClosing(WindowEvent e) {
                animator.stop();
                System.exit(0);
            }
        });
        
        frame.setVisible(true);
        animator.start();
        canvas.requestFocus();
        
    }

    public void keyTyped(KeyEvent e) {
        
        
    }

    public void keyPressed(KeyEvent e) {
    switch (e.getKeyCode()) {
            case KeyEvent.VK_P:              
                stick.roll();
                break;
            case KeyEvent.VK_O:              
                stick.unRoll();
                break;    
            case KeyEvent.VK_Q:              
                stick.pitchUp();
                break;   
            case KeyEvent.VK_A:              
                stick.pitchDown();
                break;        
        }    
        
    }

    public void keyReleased(KeyEvent e) {
        
    }
}


