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 GLSkeleton extends Thread{
	static Thread displayT = new Thread(new GLSkeleton());
	static boolean bQuit = false;

	public static void main(String[] args) {
		displayT.start();
	}

	public void run() {
		Frame frame = new Frame("GL Skeleton");
		GLCanvas canvas = new GLCanvas();
		canvas.addGLEventListener(new SkeletonRenderer());
		frame.add(canvas);
		frame.setSize(640, 480);
		int size = frame.getExtendedState();

		frame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				bQuit = true;
				displayT.interrupt();
				System.exit(0);
			}
		});
		frame.setVisible(true);
		canvas.requestFocus();
		while( !bQuit ) {
			canvas.display();
			try {
				sleep(2); // redisplay every 2 ms
			} catch (InterruptedException e1) {}
		}
	}
	
	public class SkeletonRenderer implements KeyListener, GLEventListener{
		
	    public void display(GLAutoDrawable gLDrawable) {
	        final GL gl = gLDrawable.getGL();
	        gl.glClear(GL.GL_COLOR_BUFFER_BIT);
	        gl.glClear(GL.GL_DEPTH_BUFFER_BIT);
	        gl.glLoadIdentity();
	        
	        // PUT RENDERING CODE HERE
	        gl.glBegin(GL.GL_TRIANGLES);
	        gl.glColor3f(0,0.5f,0.5f);
	        gl.glVertex3f(-1,0,-5);
	        gl.glVertex3f(0,(float)Math.sin(3.1415/3)*2,-5);
	        gl.glVertex3f(1,0,-5);
	        gl.glEnd();
	        // END RENDERING CODE 
	    }
	    
	    public void init(GLAutoDrawable gLDrawable) {
	        final GL gl = gLDrawable.getGL();
	        gl.glShadeModel(GL.GL_SMOOTH);
	        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
	        gl.glClearDepth(1.0f);
	        gl.glEnable(GL.GL_DEPTH_TEST);
	        gLDrawable.addKeyListener(this);
	    }

	    public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height) {
	        final GL gl = gLDrawable.getGL();
	        if(height <= 0) {
	            height = 1;
	        }
	        final float h = (float)width / (float)height;
	        gl.glMatrixMode(GL.GL_PROJECTION);
	        gl.glLoadIdentity();
	        new GLU().gluPerspective(50.0f, h, 1.0, 100.0);
	        gl.glMatrixMode(GL.GL_MODELVIEW);
	        gl.glLoadIdentity();
	    }

	    public void keyPressed(KeyEvent e) {
	        if(e.getKeyCode() == KeyEvent.VK_ESCAPE) {
	            JavaDia.bQuit = true;
	            JavaDia.displayT = null;
	            System.exit(0);
	        }
	    }
	    
	    public void displayChanged(GLAutoDrawable gLDrawable, boolean modeChanged, boolean deviceChanged) {}
	    public void keyReleased(KeyEvent e) {}
	    public void keyTyped(KeyEvent e) {}
	}
}
