#include <gl/glut.h>

//<<<<<<<<<<<<<<<<<<< Achsen >>>>>>>>>>>>>>
void axis(double length)
{ // zeichne z-Achse mit Kegel am Ende
	glPushMatrix();
	glBegin(GL_LINES);
	   glVertex3d(0, 0, 0); glVertex3d(0,0,length); // z-Richtung
	glEnd();
	glTranslated(0, 0,length -0.2); 
	glutWireCone(0.04, 0.2, 12, 9);
	glPopMatrix();
}	
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Drahtmodelle >>>>>>>>>>>>>>>>>>>>>>
void displayWire(void)
{
	glMatrixMode(GL_PROJECTION); // definiere View Volume
	glLoadIdentity();
	glOrtho(-2.0*64/48.0, 2.0*64/48.0, -2.0, 2.0, 0.1, 100);
	glMatrixMode(GL_MODELVIEW); // Definition der Kamera
	glLoadIdentity();
	gluLookAt(2.0, 2.0, 2.0, 0.4, 0.0, 0.0, 0.0, 1.0, 0.0);
	
	glClear(GL_COLOR_BUFFER_BIT); // clear Screen
        glColor3d(0,0,0); // zeichne schwarze Linien
        axis(0.5);					 // z-Achse
	glPushMatrix(); 
	glRotated(90, 0,1.0, 0);
	axis(0.5);					// y-Achse
	glRotated(-90.0, 1, 0, 0);
	axis(0.5);					// x-Achse
	glPopMatrix();	

	glPushMatrix();
	glTranslated(0.5, 0.5, 0.5); // großer Würfel in (0.5, 0.5, 0.5)
	glutWireCube(1.0);
	glPopMatrix();

	glPushMatrix();	
	glTranslated(1.0,1.0,0);	// Kugel in (1,1,0)
	glutWireSphere(0.25, 10, 8);
	glPopMatrix();	
	
	glPushMatrix();	
	glTranslated(1.0,0,1.0);	// Kegel in (1,0,1)
	glutWireCone(0.2, 0.5, 10, 8);
	glPopMatrix();
	
	glPushMatrix();
	glTranslated(1,1,1);
	glutWireTeapot(0.2); // Teekanne in (1,1,1)
	glPopMatrix();

	glPushMatrix();
	glTranslated(0, 1.0 ,0); // Torus in (0,1,0)
	glRotated(90.0, 1,0,0);
	glutWireTorus(0.1, 0.3, 10,10);
	glPopMatrix();

	glPushMatrix();
	glTranslated(1.0, 0 ,0); // Dodekaeder in (1,0,0)
	glScaled(0.2, 0.2, 0.2);
	glutWireDodecahedron();
	glPopMatrix();

	glPushMatrix();				//Ikosaeder in (0,1,1);
	glTranslated(0.0, 1.0, 1.0);
	glScaled(0.3, 0.3, 0.3);
	glutWireIcosahedron();
	glPopMatrix();

	glPushMatrix();
	glTranslated(0, 0 ,0); // kleiner Würfel in (0,0,0)
	glutWireCube(0.15);
	glPopMatrix();

	glPushMatrix();
	glTranslated(0, 0 ,1.0); // Zylinder in (0,0,1)
	GLUquadricObj * qobj;
	qobj = gluNewQuadric();
	gluQuadricDrawStyle(qobj,GLU_LINE);
	gluCylinder(qobj, 0.2, 0.2, 0.4, 8,8);
	glPopMatrix();
	glFlush();
}
//<<<<<<<<<<<<<<<<<<<<<< main >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void main(int argc, char **argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB );
	glutInitWindowSize(640,480);
	glutInitWindowPosition(100, 100);
	glutCreateWindow("Transformation testbed - wireframes");
	glutDisplayFunc(displayWire);
	glClearColor(0.9f, 0.9f, 0.9f,0.0f);  // grauer Hintergrund
	glViewport(0, 0, 640, 480);
	glutMainLoop();
}

