#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <GL/glut.h>
#include <GL/gl.h>

int orthographic=1;
float angle = 0;
int depthTest=0;

void drawTriangle(void)
	{
	glPushMatrix();
	glRotatef(angle,0.0,1.0,0.0);
	glBegin(GL_TRIANGLES);
	 glVertex3f(-1.0, -1.0, 0.0);
	 glVertex3f(1.0, -1.0, 0.0);
	 glVertex3f(0.0, 1.0, 0.0);
	glEnd();
	glPopMatrix();
	}


void drawGroundPlane(void)
	{
	glColor3f(0.25, 0.25, 0.25);
	glBegin(GL_QUADS);
	glVertex3f(-5.0, -1.0, 0.0);
	glVertex3f(5.0, -1.0, 0.0);
	glVertex3f(5.0, -1.0, -10.0);
	glVertex3f(-5.0, -1.0, -10.0);
	glEnd();
	}


void drawEverything(void)
	{
	glClearColor(0.0, 0.0, 0.0, 0.0);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	if (depthTest)
		glEnable(GL_DEPTH_TEST);
	else
		glDisable(GL_DEPTH_TEST);

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	if (orthographic)
		glOrtho(-5.0, 5.0, -5.0, 5.0, 0.0, 10.0);
	else
		gluPerspective(90.0, 1.0, 1.0, 10.0);
	glMatrixMode(GL_MODELVIEW);

	glLoadIdentity();
	
	glTranslatef(-2.0, 0.0, -4.0);
	glColor3f(0.5, 0.4, 0.0);
	drawTriangle();
	
	glTranslatef(1.0, 0.0, -1.0);
	glColor3f(1.0, 0.9, 0.0);
	drawTriangle();

	glTranslatef(1.0, 0.0, -1.0);
	glColor3f(0.5, 0.9, 0.5);
	drawTriangle();

	glTranslatef(1.0, 0.0, -1.0);
	glColor3f(0.0, 0.9, 1.0);
	drawTriangle();

	glTranslatef(1.0, 0.0, -1.0);
	glColor3f(0.0, 0.0, 0.7);
	drawTriangle();

	glLoadIdentity();
	drawGroundPlane();

	glutSwapBuffers();
	}


static void key(unsigned char k, int x, int y)
	{
	if (k == 27)
		exit(0);
	else if (k == 'p')
		orthographic = 0;
	else if (k == 'o')
		orthographic = 1;
	else if (k == 'd')
		depthTest = !depthTest;
	glutPostRedisplay();
	}


static void specialkey(int k, int x, int y)
	{
	if (k == GLUT_KEY_LEFT)
		angle += 3;
	else if (k == GLUT_KEY_RIGHT)
		angle -= 3;
	glutPostRedisplay();
	}



int main(int argc, char *argv[])
	{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
	glutCreateWindow("example");
	glutDisplayFunc(drawEverything);
	glutKeyboardFunc(key);
	glutSpecialFunc(specialkey);
	glutMainLoop();
	return 0;
	}
