import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
import javax.media.opengl.*;
import javax.media.opengl.awt.GLCanvas;
import javax.media.opengl.glu.GLU;


public class HelloJOGL2 extends JFrame implements KeyListener{

	GLCanvas canvas;
	SceneView sv;

	boolean xPressed,yPressed,zPressed;

	public HelloJOGL2() {


		sv = new SceneView();

		GLProfile glp = GLProfile.getDefault();
		GLCapabilities caps = new GLCapabilities(glp);
		canvas = new GLCanvas(caps);

		canvas.addGLEventListener(sv);

		add(canvas);

		canvas.addKeyListener(this);

		setTitle("Jogl Blatt 2");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(500,500);
		setVisible(true);  

	}



	class SceneView implements GLEventListener {

		private int eyeX = 10;
		private int eyeY = 10;
		private int eyeZ = 10;

		private int centerX = 0;
		private int centerY = 0;
		private int centerZ = 0;

		private int upX = 0;
		private int upY = 1;
		private int upZ = 0;

		public void init(GLAutoDrawable drawable) {
			GL2 gl = drawable.getGL().getGL2(); 
			gl.glClearColor(0.5f, 0.5f, 0.5f, 0f); // grey background

			gl.glMatrixMode(GL2.GL_PROJECTION);
			gl.glLoadIdentity();
			gl.glOrthof(-10, 10, -10, 10, 0, 100);

		}

		public void display(GLAutoDrawable drawable) {
			GL2 gl = drawable.getGL().getGL2();         
			gl.glClear(GL2.GL_COLOR_BUFFER_BIT); // clear background


			GLU glu = new GLU();
			gl.glMatrixMode(GL2.GL_MODELVIEW);
			gl.glLoadIdentity();
			glu.gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ);


			gl.glColor3d(0.3, 0.3, 0.3); //draw in grey
			for(int i=-5; i<=5;i++){
				gl.glBegin(GL2.GL_LINES); // draw grid
				gl.glVertex3i(i, 0, -5);
				gl.glVertex3i(i, 0,5);	
				gl.glEnd();

				gl.glBegin(GL2.GL_LINES); // draw grid
				gl.glVertex3i(-5, 0, i);
				gl.glVertex3i(5, 0,i);	
				gl.glEnd();

			}

			gl.glColor3d(1, 0, 0);

			gl.glBegin(GL2.GL_LINES); // draw x, y and z axis
			gl.glVertex3i(0, 0, 0);
			gl.glVertex3i(1, 0, 0);

			gl.glColor3d(1, 1, 0);
			gl.glVertex3i(0, 0, 0);
			gl.glVertex3i(0, 1, 0);

			gl.glColor3d(0, 1, 0);
			gl.glVertex3i(0, 0, 0);
			gl.glVertex3i(0, 0, 1);
			gl.glEnd();

			gl.glBegin(GL2.GL_LINE_LOOP); // begin: draw house
			gl.glVertex3i(2, 0, -2);
			gl.glVertex3i(4, 0, -2);
			gl.glVertex3i(4, 2, -2);
			gl.glVertex3i(2, 2, -2);
			gl.glEnd();

			gl.glBegin(GL2.GL_LINE_LOOP); 
			gl.glVertex3i(2, 0, -5);
			gl.glVertex3i(4, 0, -5);
			gl.glVertex3i(4, 2, -5);
			gl.glVertex3i(2, 2, -5);
			gl.glEnd();

			gl.glBegin(GL2.GL_LINES); 
			gl.glVertex3i(2, 0, -2);
			gl.glVertex3i(2, 0, -5);
			gl.glEnd();

			gl.glBegin(GL2.GL_LINES); 
			gl.glVertex3i(4, 0, -2);
			gl.glVertex3i(4, 0, -5);
			gl.glEnd();

			gl.glBegin(GL2.GL_LINES); 
			gl.glVertex3i(4, 2, -2);
			gl.glVertex3i(4, 2, -5);
			gl.glEnd();

			gl.glBegin(GL2.GL_LINES); 
			gl.glVertex3i(2, 2, -2);
			gl.glVertex3i(2, 2, -5);
			gl.glEnd();

			gl.glBegin(GL2.GL_LINES); 
			gl.glVertex3i(2, 2, -2);
			gl.glVertex3i(3, 3, -2);
			gl.glEnd();

			gl.glBegin(GL2.GL_LINES); 
			gl.glVertex3i(3, 3, -2);
			gl.glVertex3i(4, 2, -2);
			gl.glEnd();

			gl.glBegin(GL2.GL_LINES); 
			gl.glVertex3i(2, 2, -5);
			gl.glVertex3i(3, 3, -5);
			gl.glEnd();

			gl.glBegin(GL2.GL_LINES); 
			gl.glVertex3i(3, 3, -5);
			gl.glVertex3i(4, 2, -5);
			gl.glEnd();

			gl.glBegin(GL2.GL_LINES); 
			gl.glVertex3i(3, 3, -2);
			gl.glVertex3i(3, 3, -5);
			gl.glEnd(); // end: draw house


		}

		public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
			GL2 gl = drawable.getGL().getGL2();
			gl.glViewport(Math.max(0,(w-h)/2), Math.max(0,(h-w)/2), Math.min(w,h), Math.min(w,h)); //reset the current viewport

		}

		public void dispose(GLAutoDrawable drawable) {
		}

		private void setCamera(int x, int y, int z){
			eyeX = x;
			eyeY = y;
			eyeZ = z;
		}

		private void setCenter(int x, int y, int z){
			centerX = x;
			centerY = y;
			centerZ = z;
		}

		private void setUpVector(int x, int y, int z){
			upX = x;
			upY = y;
			upZ = z;
		}

		private void moveCamera(int x, int y, int z){
			eyeX += x;
			eyeY += y;
			eyeZ += z;
		}

		public void frontView(){
			setCamera(0,0,0);
			setCenter(0,0,-1);
			setUpVector(0,1,0);
		}

		public void sideView(){
			setCamera(10,0,0);
			setCenter(-10,0,0);
			setUpVector(0,1,0);
		}

		public void topView(){
			setCamera(0,10,0);
			setCenter(0,0,0);
			setUpVector(0,0,-1);
		}

		public void customView(){
			setCamera(10,10,10);
			setCenter(0,0,0);
			setUpVector(0,1,0);
		}
	}



	@Override
	public void keyPressed(KeyEvent evt) {
		switch(evt.getKeyCode()){
		case KeyEvent.VK_X:
			xPressed = true;
			yPressed = false;
			zPressed = false;
			break;
		case KeyEvent.VK_Y:
			yPressed = true;
			xPressed = false;
			zPressed = false;
			break;
		case KeyEvent.VK_Z:
			zPressed = true;
			xPressed = false;
			yPressed = false;
			break;
		case KeyEvent.VK_NUMPAD1:
			sv.frontView();
			canvas.repaint();
			break;
		case KeyEvent.VK_NUMPAD2:
			sv.sideView();
			canvas.repaint();
			break;
		case KeyEvent.VK_NUMPAD3:
			sv.topView();
			canvas.repaint();
			break;	
		case KeyEvent.VK_NUMPAD4:
			sv.customView();
			canvas.repaint();
			break;
		case KeyEvent.VK_UP:
			if(xPressed){
				sv.moveCamera(1, 0, 0);
				canvas.repaint();
			}
			if(yPressed){
				sv.moveCamera(0, 1, 0);
				canvas.repaint();
			}
			if(zPressed){
				sv.moveCamera(0, 0, 1);
				canvas.repaint();
			}
			break;
		case KeyEvent.VK_DOWN:
			if(xPressed){
				sv.moveCamera(-1, 0, 0);
				canvas.repaint();
			}
			if(yPressed){
				sv.moveCamera(0, -1, 0);
				canvas.repaint();
			}
			if(zPressed){
				sv.moveCamera(0, 0, -1);
				canvas.repaint();
			}
			break;

		}
	}

	@Override
	public void keyReleased(KeyEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub

	}

	public static void main(String args[]) {
		new HelloJOGL2();   
	}


}

