/*
QtWagon: a project about 3D objects.
Science and technology promotion license applied. Third party license automatically cascaded.
Zhikai Wang/ www.heteroclinic.net 2013
You can do anything with this file or any file(s) published as part QtWagon project, given this header is kept.
*/
/****************************************************************************
**
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial Usage
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights.  These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QGLWidget>
#include "mathBasics.h"
#include "mathVector.h"
#include "glOrientation.h"
#include "glMovingObject.h"
#include "qtMovingObject.h"
#include "drawablesSingleton.h"
#include "qtmovingobjectSingleton.h"
//#include "qtCamera.h"
#include "qtCameraSingleton.h"
#include "glLight.h"
#include "qtLightSingleton.h"

class QtLogo;
class qtMovingObject;
class qtCamera;

typedef GLint		myint;
typedef	GLfloat		myfloat	;
typedef	GLdouble	mydouble;
typedef	GLboolean	mybool;


typedef struct _Point {
	GLfloat x, y, z;
} Point, Vector, * p_Point;
#define Length(v)  sqrt(v.x*v.x+v.y*v.y+v.z*v.z)	// Vector length

void drawRectangleWithNormal (Point * pt0,Point * pt1,Point * pt2,Point * pt3);
void drawRectangleWithNormal2 (Point * pt0,Point * pt1,
	Point * pt2,Point * pt3);
void drawCuboid (myfloat h1,myfloat h2, myfloat l1,myfloat l2,myfloat w1,myfloat w2);
void pointMinusPoint (Point  * v, Point * w, Point * result);
GLdouble crossVector (Vector  * v, Vector * w, Vector * crossVector);



//! [0]
class GLWidget : public QGLWidget
{
	Q_OBJECT

public:
	glLight light_default;
	float orthoganal_clip_size,orthoganal_clip_size2	;
	float eyex ,eyey,eyez ;
	float lookatx,lookaty,lookatz;
	float NEAR_Z;
	float FAR_Z;
	float translate_size;
	float translatex;
	float translatey;
	float translatez;
	float scale;
	//glMovingObject<float> * gmvopt;
	//glMovingObjectf * gmvopt;


	GLWidget(QWidget *parent = 0);
	~GLWidget();

	QSize minimumSizeHint() const;
	QSize sizeHint() const;
	//! [0]

	//! [1]
	public slots:
		void setXRotation(int angle);
		void setYRotation(int angle);
		void setZRotation(int angle);
		//void slotMOV3dMoveOrders(int,float);
		//void slotMOV3dMoveOrderspt(int,float,glMovingObjectf *);
		//void slotQtMovObjpt3dOrders(int,float,qtMovingObject *);
		//void slotQtMovobj3DOrders(int,float,qtMovingObject *);
		void slotQtMovobj3DOrders(int,float);
		void slotCAM3dMoveOrders(int op,float oprand);
		void slotLight3dMoveOrders(int op,float oprand);

signals:
		void xRotationChanged(int angle);
		void yRotationChanged(int angle);
		void zRotationChanged(int angle);
		void sigQtMovobjSetControl();
		void sigCAMUpdateWagonValueOnly();
		void sigLightUpdateWagonValueOnly();
		//! [1]

		//! [2]
protected:
	int wwidth,  wheight;
	void initializeGL();
	void paintGL();
	void resizeGL(int width, int height);
	void mousePressEvent(QMouseEvent *event);
	void mouseMoveEvent(QMouseEvent *event);
	//! [2]

	//! [3]
private:
	QtLogo *logo;
	int xRot;
	int yRot;
	int zRot;
	QPoint lastPos;
	QColor qtGreen;
	QColor qtPurple;
};
//! [3]

#endif
