#define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <math.h>

#include "glut.h"
#pragma comment (lib, "glut32.lib")

static void redraw(void);
int main(int argc, char **argv);

const int X = 512;
const int Y = 512;

void DrawTriangle (int x0, int y0, int x1, int y1, int pixelLength);

int main(int argc, char **argv)
{
	glutInit(&argc,argv);

	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
	glutInitWindowSize(X,Y);
	glutCreateWindow("Test");
	glClearColor(1, 1, 1, 1);

	glutDisplayFunc(redraw);	
	glutIdleFunc(redraw);

	int vPort[4];
	glGetIntegerv(GL_VIEWPORT, vPort);

	glMatrixMode(GL_PROJECTION);
	glPushMatrix();
	glLoadIdentity();

	glOrtho(0, vPort[2], 0, vPort[3], -1, 1);
	glMatrixMode(GL_MODELVIEW);
	glPushMatrix();
	glLoadIdentity();

	glutMainLoop();

	return 0; 
}

void DrawTriangle (int x0, int y0, int x1, int y1, int pixelLength) 
{
	// x1-x0 should be equal to y1-y0 so this condition can be shortened
	if (x1 - x0 <= pixelLength || y1 - y0 <= pixelLength) {
		glVertex3f(x0, y0, 0.0f);
		glVertex3f(x0, y1, 0.0f);
		glVertex3f(x1, y1, 0.0f);
		glVertex3f(x1, y0, 0.0f);
	} else {
		int hx, hy;
		hx = (x1-x0)/2;
		hy = (y1-y0)/2;
		// Continue algorithm without considering the top right square
		DrawTriangle(x0, y0, x0+hx, y0+hy, pixelLength);
		DrawTriangle(x0, y0+hy, x0+hx, y1, pixelLength);
		DrawTriangle(x0+hx, y0, x1, y0+hy, pixelLength);
	}
}

static void redraw(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glCullFace(GL_NONE);
	glBegin(GL_QUADS);
	glColor4f(0, 0, 0, 1);
	DrawTriangle(0, 0, 512, 512, 1);
	glEnd();

	glutSwapBuffers();
}