
#include <QtGui>
#include <QtOpenGL>
#include "glwidget.h"
#include <math.h>

// Konstruktor
GLWidget::GLWidget( QWidget* parent)
: QGLWidget( QGLFormat(QGL::SampleBuffers), parent)
{
//	setScaledContents(true);
	xRot = yRot = zRot = 0.0; // default object rotation
	scale = 1.25; // default object scale
	object = 0;
	
	// Das Spielfeld wird um 60° na hinten gedreht
	//xRot = -60;
}

// Destruktor
GLWidget::~GLWidget()
{
	makeCurrent();
	glDeleteLists( object, 1 );
}


QSize GLWidget::minimumSizeHint() const
{
	return QSize(50, 50);
}

QSize GLWidget::sizeHint() const
{
	return QSize(400, 400);
}

void GLWidget::setXRotation(int angle)
{
	normalizeAngle(&angle);
	
	if (angle != xRot) 
	{
		xRot = angle;
		emit xRotationChanged(angle);
		updateGL();
	}
}

void GLWidget::setYRotation(int angle)
{	
	normalizeAngle(&angle);
	if (angle != yRot) 
	{
		yRot = angle;
		emit yRotationChanged(angle);
		updateGL();
	}
}

void GLWidget::setZRotation(int angle)
{
	normalizeAngle(&angle);
	if (angle != zRot) 
	{
		zRot = angle;
		emit zRotationChanged(angle);
		updateGL();
	}
}


void GLWidget::initializeGL()
{
	qglClearColor( Qt::black ); // Let OpenGL clear to black
	object = makeObject(); // Generate an OpenGL display list
	glShadeModel( GL_SMOOTH );
}


void GLWidget::resizeGL( int w, int h )
{
	glViewport( 0, 0, (GLint)w, (GLint)h );
	glMatrixMode( GL_PROJECTION );
	glLoadIdentity();
	glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 );
	glMatrixMode( GL_MODELVIEW );
}


void GLWidget::paintGL()
{
	glClear( GL_COLOR_BUFFER_BIT );
	glLoadIdentity();
	glTranslatef( 0.0, 0.0, -10.0 );
	glScalef( scale, scale, scale );
	glRotatef( xRot, 1.0, 0.0, 0.0 );
	glRotatef( yRot, 0.0, 1.0, 0.0 );
	glRotatef( zRot, 0.0, 0.0, 1.0 );
	glCallList( object );
}


GLuint GLWidget::makeObject()
{
	GLuint list;
	list = glGenLists( 1 );
	glNewList( list, GL_COMPILE );

	// Die Spielfeldfarbe ist weiss
	
	glLineWidth( 1.5f );
	
	
	glBegin(GL_QUADS);
		qglColor( Qt::green );
		// Die vordere Spielfeldgrundflaeche zeichnen
		glVertex3f(-1.0f, 1.0f, 0.0f);
		glVertex3f( 1.0f, 1.0f, 0.0f);
		glVertex3f( 1.0f,-1.0f, 0.0f);
		glVertex3f(-1.0f,-1.0f, 0.0f);
	
		qglColor( Qt::gray );
		// Die hintere Spielgrundflaeche zeichnen
		glVertex3f(-1.0f, 1.0f, -0.1f);
		glVertex3f( 1.0f, 1.0f, -0.1f);
		glVertex3f( 1.0f,-1.0f, -0.1f);
		glVertex3f(-1.0f,-1.0f, -0.1f);
	
		glEnd();
		/*
		qglColor( Qt::lightGray );
		// Den oberen Abschluss zeichnen
		glVertex3f(-1.0f, 1.0f, 0.0f);
		glVertex3f(-1.0f, 1.0f, -0.1f);
		glVertex3f( 1.0f, 1.0f, 0.0f);
		glVertex3f( 1.0f, 1.0f, -0.1f);
	
		// Den unteren Abschluss zeichnen
		glVertex3f(-1.0f, -1.0f, 0.0f);
		glVertex3f(-1.0f, -1.0f, -0.1f);
		glVertex3f( 1.0f, -1.0f, 0.0f);
		glVertex3f( 1.0f, -1.0f, -0.1f);
	
		// Den linken Abschluss zeichnen
		glVertex3f(-1.0f, 1.0f, 0.0f);
		glVertex3f(-1.0f, 1.0f, -0.1f);
		glVertex3f( -1.0f, -1.0f, 0.0f);
		glVertex3f( -1.0f, -1.0f, -0.1f);
	
		// Den rechten Abschluss zeichnen
		glVertex3f( 1.0f, 1.0f, 0.0f );
		glVertex3f( 1.0f, 1.0f, -0.1f );
		glVertex3f( 1.0f, -1.0f, 0.0f );
		glVertex3f( 1.0f, -1.0f, -0.1f );
	glEnd();
	*/
	
	/*
	
	// Linienfarbe schwarz
	qglColor( Qt::black );
	
	// Linien zeichnen
	glBegin( GL_LINES );
		for( int i=1; i < 10; i++ )
		{
			// Vertikale Linien
			glVertex3f( -1.0f + (i * 0.2f), 1.0f, 0.0f ); glVertex3f( -1.0f + ( i * 0.2f ), -1.0, 0.0f );
			
			// Horizontale Linien
			glVertex3f( -1.0f, -1.0f + (i * 0.2f), 0.0f ); glVertex3f( 1.0f, -1.0f + (i * 0.2f), 0.0f );
		}	
	glEnd();
	
	
	// Die Spielfeldumrandung mit der Liniendicke von 4 zeichnen
	qglColor( Qt::red);
	glLineWidth( 4.0 );
	glBegin( GL_LINE_LOOP );
		glVertex3f(-1.0f, 1.0f, 0.0f);
		glVertex3f( 1.0f, 1.0f, 0.0f);
		glVertex3f( 1.0f,-1.0f, 0.0f);
		glVertex3f(-1.0f,-1.0f, 0.0f);
	glEnd();
	
	
	// Eine Testfigur auf dem Spielfeld zeichnen
	qglColor( Qt::red);
	glLineWidth( 1.0 );
	glBegin(GL_TRIANGLES);
	glVertex3f( -0.8f, -0.9f, 0.0f);
	glVertex3f(-0.6f,-0.9f, 0.0f);
	glVertex3f( -0.7f,-0.9f, 0.4f);
	glEnd(); 
	*/
	
	glEndList();
	return list;
}



void GLWidget::mousePressEvent(QMouseEvent* event)
{
	lastPos = event->pos();
}


void GLWidget::mouseMoveEvent(QMouseEvent* event)
{
	int dx = event->x() - lastPos.x();
	int dy = event->y() - lastPos.y();

	if (event->buttons() & Qt::LeftButton) 
	{
		setXRotation(xRot + 8 * dy);
		setYRotation(yRot + 8 * dx);
	} 
	else 
		if (event->buttons() & Qt::RightButton) 
		{
			setXRotation(xRot + 8 * dy);
			setZRotation(zRot + 8 * dx);
		}
	lastPos = event->pos();
}


void GLWidget::keyPressEvent( QKeyEvent* event )
{
	
}



void GLWidget::normalizeAngle(int *angle)
{
	while (*angle < 0)
		*angle += 360 * 16;
	while (*angle > 360 * 16)
		*angle -= 360 * 16;
}
