// opengl1.cpp: определяет точку входа для консольного приложения.
//

#pragma comment(lib,"opengl32.lib")
//#pragma comment(lib,"glaux.lib")
#pragma comment(lib,"freeglut.lib") 
//#include"gl/glaux.h"
#include"gl/glut.h"
#define PI 3.14
#define step PI/360
float Trot = 0;
float Qrot = 0;
float alpha = 0;
int w = 500, h = 500;
void display(void);
//void CALLBACK ProcUp (void);
void KeybFunc(unsigned char key, int x, int y);
//void CALLBACK mousefunction(AUX_EVENTREC *event);
void MouseFunc(int button, int state, int x, int у);
void inc(void);
void reshape(int w1, int h1);

int main(int argc, char* argv[])
{
	/*auxInitDisplayMode(AUX_SINGLE | AUX_RGB);
		//AUX_DOUBLE | AUX_RGBA | AUX_DEPTH | AUX_STENCIL
		//AUX_INDEX | AUX_SINGLE
	auxInitPosition (0, 0, 500, 500);
	auxInitWindow  (L"GLAUX");
	//auxReshapeFunc
	auxKeyFunc(AUX_UP, ProcUp);
	auxMouseFunc(AUX_LEFTBUTTON, AUX_MOUSEUP, mousefunction);
	auxMainLoop(display);
	auxIdleFunc(inc);*/

	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	//GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL. 
	//За умовч.: GLUT_INDEX | GLUT_SINGLE 

	glutInitWindowSize(w, h);
	glutCreateWindow("GLUT");
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutKeyboardFunc(KeybFunc);
	glutMouseFunc(MouseFunc);
	glutIdleFunc(inc);
	glutMainLoop();

	return 0;
}

void display(void) //CALLBACK or WINAPI
{
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);// устанавливаем цвет для очистки буфера цвета
	glClearDepth(1.0);		// устенавливаем параметр для очистки буфера глубины
	glDepthFunc(GL_LESS);	// настройка Z буфера
	glEnable(GL_DEPTH_TEST);	// и, наконец, включение
	glShadeModel(GL_SMOOTH);	// выбираете режим затенения ( flat или smooth )
	glMatrixMode(GL_PROJECTION);// устанавливаем текушей матрицей матрицу проекта
	glLoadIdentity();		// обнуляем эту самую матрицу
	// настраиваем перспективу ( вот она, функция из glu32 )
	gluPerspective(45.0f, (GLfloat)500 / (GLfloat)500, 0.1f, 100.0f);
	glMatrixMode(GL_MODELVIEW);	// и переключаемся в модельную матрицу
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	glTranslatef(-1.5f, -0.0f, -5.0f);
	glRotatef(Trot, 0.0f, 0.0f, 1.0f);	// вот тут весь секрет
	// Функция glRotate выполняет  вращение текущей матрицы на угол,
	// указанный первым аргументом и делает это вокруг осей, 
	//заданных 2-м, 3-м, 4-м аргументами, т.е. вокруг x,y,z.
	// Принципиальное значение имеет последовательность функций 
// glRotatef(:)
// glTranslatef(:)
// или
// glTranslatef(:)
// glRotatef(:)
// попробуйте поменять их местами
	glBegin(GL_TRIANGLES);
	glColor3f(1.0f, 0.0f, 0.0f);
	glVertex3f(0.0f, 1.0f, 0.0f);	// Top
	glColor3f(0.0f, 1.0f, 0.0f);
	glVertex3f(-1.0f, -1.0f, 0.0f);	// Bottom Left
	glColor3f(0.0f, 0.0f, 1.0f);
	glVertex3f(1.0f, -1.0f, 0.0f);	// Bottom Right
	glEnd();

	glLoadIdentity();	// не забудьте привести матрицу, 
			//а то квадратик вокруг треугольничка поедет ;)

	glTranslatef(1.5f, 0.0f, -5.0f);
	glRotatef(Qrot, 0.0f, 0.0f, 1.0f);

	glColor3f(0.3f, 0.2f, 0.4f);
	glBegin(GL_QUADS);
	glVertex3f(-1.0f, 1.0f, 0.0f);	// Top Left
	glVertex3f(1.0f, 1.0f, 0.0f);	// Top Right
	glVertex3f(1.0f, -1.0f, 0.0f);	// Bottom Right
	glVertex3f(-1.0f, -1.0f, 0.0f);	// Bottom Left
	glEnd();


	glFlush();
	glutPostRedisplay();
}


/*void KeybFunc (void)
{
	MessageBox(0,L"Up",L"Press",MB_ICONINFORMATION);
}


void MouseFunc(AUX_EVENTREC *event)
{
	GLint x, y;
	x = event->data[AUX_MOUSEX];
	y = event->data[AUX_MOUSEY];
	glBegin(GL_LINES);
	glVertex2f (0,0);
	glVertex2f (x,500-y);
	glEnd();
	glFlush();
}*/

void KeybFunc(unsigned char key, int x, int y)
{
	const char esc = '\033';
	if (key == esc)exit(0);

}


void MouseFunc(int button, int state, int x, int у)
{
	if (state == GLUT_DOWN)
	{
		switch (button)
		{
		case GLUT_LEFT_BUTTON: break;
		case GLUT_RIGHT_BUTTON: break;
		}
		glutPostRedisplay();
	}
}

void inc(void)
{
	alpha += step; if (alpha > 6.28)alpha = 0;
	Trot += 0.03f;
	Qrot -= 0.03f;
	glutPostRedisplay();
}

void reshape(int w1, int h1)
{
	w = w1; h = h1;
	glViewport(0, 0, w1, h1);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(0, w1, 0, h1, -1.0, 1.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glShadeModel(GL_SMOOTH);//GL_FLAT

}


/*void CALLBACK ProcUp (void)
{
	MessageBox(0,L"Up",L"Press",MB_ICONINFORMATION);
}


void CALLBACK mousefunction(AUX_EVENTREC *event)
{
	x = event->data[AUX_MOUSEX];
	y = event->data[AUX_MOUSEY];
	glFlush();
}
*/
