/// Inlcudes
#include "MicroGlut.h"
#include "GL_utilities.h"


/// Defines
#define ARRAY_COUNT(ARRAY) (sizeof(ARRAY)/sizeof(*(ARRAY)))


/// Globals
GLuint  vertexArray;
GLfloat positions[] =
{
	-0.5f, -0.5f, 0.0f,
	-0.5f, +0.5f, 0.0f,
	+0.5f, -0.5f, 0.0f,
};


/// Init
void init(void)
{
	// GL inits.
	glClearColor(0.2, 0.2, 0.5, 0.0);
	glDisable(GL_DEPTH_TEST);
	printError("init GL");

	// Load and compile shader.
	GLuint program = loadShaders("lab1-1.vert", "lab1-1.frag");
	printError("init shader");

	// Allocate and activate Vertex Array Object (VAO), used for uploading
	// the geometry.
	glGenVertexArrays(1, &vertexArray);
	glBindVertexArray(vertexArray);

	// Allocate and activate Vertex Buffer Objects (VBO), for vertex data.
	GLint  positionLocation = glGetAttribLocation(program, "inPosition");
	GLuint positionBuffer;
	glGenBuffers(1, &positionBuffer);
	glBindBuffer(GL_ARRAY_BUFFER, positionBuffer);
	glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);
	glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
	glEnableVertexAttribArray(positionLocation);
	printError("init VBOs");
}


/// Display
void display(void)
{
	// Clear the screen.
	glClear(GL_COLOR_BUFFER_BIT);

	// Select VAO.
	glBindVertexArray(vertexArray);

	// Draw.
	glDrawArrays(GL_TRIANGLES, 0, ARRAY_COUNT(positions)/3);
	printError("display draw");

	// Show on the screen.
	glutSwapBuffers();
}


/// Main
int main(int argc, char * argv[])
{
	glutInit(&argc, argv);
	glutInitContextVersion(3, 2);
	glutInitWindowSize(600, 600);
	glutCreateWindow("TSBK07");

	glutDisplayFunc(display);

	dumpInfo();
	init();
	glutMainLoop();
}