import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
import javax.media.opengl.glu.GLU;
import javax.swing.JFrame;


public class BigWheel implements GLEventListener{

	public static void main(String[]args){

		GLProfile glp = GLProfile.getDefault(); //Default-Profil verwenden
		GLCapabilities caps = new GLCapabilities(glp);
		GLCanvas canvas = new GLCanvas(caps);
		canvas.addGLEventListener(new BigWheel());

		JFrame frame = new JFrame("Big Wheel");
		frame.setSize(800, 600);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(canvas);
		frame.setVisible(true);
		frame.pack();

	}


	@Override
	public void init(GLAutoDrawable drawable) {

		GL2 gl = drawable.getGL().getGL2();
		gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//Schwarzer Hintergrund

	}

	@Override
	public void display(GLAutoDrawable drawable) {

		GL2 gl = drawable.getGL().getGL2();
		GLU glu = new GLU();

		gl.glClear(GL.GL_COLOR_BUFFER_BIT);

		gl.glMatrixMode(GL2.GL_MODELVIEW);
		gl.glLoadIdentity();//ModelView-Matrix zurücksetzen
		glu.gluLookAt(20, 30, 50, -20, 0, -50, 0, 1, 0); //Kamera positionieren

		gl.glColor3d(0.3, 0.3, 0.3); //grau
		for(int i=-5; i<=5;i++){
			gl.glBegin(GL2.GL_LINES); // Gitter
			gl.glVertex3i(i, 0, -5);
			gl.glVertex3i(i, 0,5);	
			gl.glEnd();

			gl.glBegin(GL2.GL_LINES); // Gitter
			gl.glVertex3i(-5, 0, i);
			gl.glVertex3i(5, 0,i);	
			gl.glEnd();
		}

		gl.glBegin(GL2.GL_LINES); // X-, Y-, Z-Achse
		gl.glColor3d(1, 0, 0);	
		gl.glVertex3i(0, 0, 0);
		gl.glVertex3i(1, 0, 0);

		gl.glColor3d(0, 1, 0);
		gl.glVertex3i(0, 0, 0);
		gl.glVertex3i(0, 1, 0);

		gl.glColor3d(0, 0, 1);
		gl.glVertex3i(0, 0, 0);
		gl.glVertex3i(0, 0, 1);
		gl.glEnd();

		//Pfeiler vorne links
		gl.glPushMatrix();
		gl.glTranslated(-12, 0, 2);
		drawPile(gl);
		gl.glPopMatrix();
		//Pfeiler vorne rechts
		gl.glPushMatrix();
		gl.glTranslated(12, 0, 2);
		gl.glScaled(-1, 1, 1);
		drawPile(gl);
		gl.glPopMatrix();
		//Pfeiler hinten links
		gl.glPushMatrix();
		gl.glTranslated(-12, 0, -2);
		drawPile(gl);
		gl.glPopMatrix();
		//Pfeiler hinten rechts
		gl.glPushMatrix();
		gl.glTranslated(12, 0, -2);
		gl.glScaled(-1, 1, 1);
		drawPile(gl);
		gl.glPopMatrix();

		//Riesenrad 
		gl.glTranslated(0, 19, 0); //in der Höhe positionieren
		drawWheel(gl);//Riesenrad zeichnen


	}

	@Override
	public void dispose(GLAutoDrawable arg0) {
		// TODO Auto-generated method stub	
	}


	@Override
	public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {

		GL2 gl = drawable.getGL().getGL2();
		GLU glu = new GLU();
		gl.glMatrixMode(GL2.GL_PROJECTION); //Projektionsmatrix wählen
		gl.glLoadIdentity(); //Projektionsmatrix zurücksetzen
		glu.gluPerspective(45, (w*1.0)/(h*1.0), 0.1, 150);//perspektivische Projektion

	}

	public void drawWheel(GL2 gl){


		gl.glMatrixMode(GL2.GL_MODELVIEW); // ModelView-Matrix wählen

		for(int i = 0; i<7; i++){//7 Speichen
			gl.glPushMatrix();
			gl.glRotated(360/7*i,0,0,1); //Jede Speiche um i*360/7 rotieren
			gl.glTranslated(-0.25,1,0);//Erst: Translation zum richtigen Rotationspunkt 
			drawBox(gl,0.5,15,2);//Speiche zeichnen

			gl.glPushMatrix();

			gl.glTranslated(0,16,0);// Translation nach oben ans Ende der Speichen
			gl.glTranslated(0.25,-1,0);//inverse Translation zu den Speichen
			gl.glRotated((-(360/7*i)), 0, 0, 1); //Gegenrotation 	
			gl.glTranslated(-1,-2,0); //Zunächst: Translation der Kabine um um den richtigen Punkt zu rotieren

			drawBox(gl,2,2,2);//Wagen zeichnen
			gl.glPopMatrix();

			gl.glPopMatrix();

		}

	}



	//method for drawing a box wireframe
	public void drawBox(GL2 gl, double width, double height, double depth){

		gl.glBegin(GL2.GL_LINE_LOOP);
		gl.glVertex3d(0, 0, 0);
		gl.glVertex3d(width, 0, 0);
		gl.glVertex3d(width, height, 0);
		gl.glVertex3d(0, height, 0);
		gl.glEnd();

		gl.glBegin(GL2.GL_LINE_LOOP);
		gl.glVertex3d(0, 0, -depth);
		gl.glVertex3d(width, 0, -depth);
		gl.glVertex3d(width, height, -depth);
		gl.glVertex3d(0, height, -depth);
		gl.glEnd();

		gl.glBegin(GL2.GL_LINES);
		gl.glVertex3d(0, 0, 0);
		gl.glVertex3d(0, 0, -depth);

		gl.glVertex3d(width, 0, 0);
		gl.glVertex3d(width, 0, -depth);

		gl.glVertex3d(width, height, 0);
		gl.glVertex3d(width, height, -depth);

		gl.glVertex3d(0, height, 0);
		gl.glVertex3d(0, height, -depth);
		gl.glEnd();
	}

	public void drawPile(GL2 gl){

		gl.glBegin(GL2.GL_LINE_LOOP);
		gl.glVertex3d(0, 0, 0);
		gl.glVertex3d(2, 0, 0);
		gl.glVertex3d(12, 19, 0);
		gl.glVertex3d(10, 19, 0);
		gl.glEnd();

		gl.glBegin(GL2.GL_LINE_LOOP);
		gl.glVertex3d(0, 0, -2);
		gl.glVertex3d(2, 0, -2);
		gl.glVertex3d(12, 19, -2);
		gl.glVertex3d(10, 19, -2);
		gl.glEnd();

		gl.glBegin(GL2.GL_LINES);
		gl.glVertex3d(0, 0, 0);
		gl.glVertex3d(0, 0, -2);

		gl.glVertex3d(2, 0, 0);
		gl.glVertex3d(2, 0, -2);

		gl.glVertex3d(12, 19, 0);
		gl.glVertex3d(12, 19, -2);

		gl.glVertex3d(10, 19, 0);
		gl.glVertex3d(10, 19, -2);
		gl.glEnd();
	}



}
