
//This is the tomasu rotating cube demo slashed to just show one textured triangle.
//Your mission, should you decide to accept it, consists of getting this to display using VBO's.

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_opengl.h>
#include <allegro5/allegro_image.h>
#include <GL/glu.h>

#ifndef M_PI
#define M_PI 3.14159
#endif

void render(void)
{
			glLoadIdentity();

			glTranslatef(-1.3, 0.0, -4.0);

			glBegin(GL_TRIANGLE_FAN);

				glTexCoord2f(1.0,1.0);	//upper right
				glVertex3f( 1.0, 1.5, 1.0);

				glTexCoord2f(0.0,1.0);	//upper left
				glVertex3f(-1.0, 1.0, 1.0);

				glTexCoord2f(0.0,0.0);	//lower left
				glVertex3f(-1.0,-1.0, 1.0);

				glTexCoord2f(1.0,0.0);	//lower right
				glVertex3f( 1.0, -1.5, 1.0);

			glEnd();

			glLoadIdentity();

			glTranslatef( 1.5, 0.0, -4.0);
			glRotatef( -40.0,0.0,1.0,0.0);


			glBegin(GL_TRIANGLE_FAN);

				glTexCoord2f(1.0,1.0);	//upper right
				glVertex3f( 1.0, 1.0, 1.0);

				//upper left triangle (viewed face on)
				glTexCoord2f(0.0,1.0);	//upper left
				glVertex3f(-1.0, 1.0, 1.0);

				glTexCoord2f(0.0,0.0);	//lower left
				glVertex3f(-1.0,-1.0, 1.0);

				glTexCoord2f(1.0,0.0);	//lower right
				glVertex3f( 1.0, -1.0, 1.0);

			glEnd();

			al_flip_display();
			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}

int main(int argc, char **argv)
{
	ALLEGRO_DISPLAY *display;
	ALLEGRO_BITMAP *img;
	ALLEGRO_EVENT_QUEUE *queue;
	ALLEGRO_TIMER *timer;			glColor4f(1.0,1.0,1.0,1.0);

	ALLEGRO_EVENT event;
	int imgID;
	int display_width = 800;
	int display_height = 600;
	int redraw = 0;

	if (!al_init())
	{
		fprintf(stderr,"Could not init Allegro.\n");
		return 1;
	}

	al_install_keyboard();

	al_set_new_display_option(ALLEGRO_DEPTH_SIZE,24,ALLEGRO_REQUIRE);
	al_set_new_display_flags(ALLEGRO_OPENGL);
	display = al_create_display(display_width,display_height);
	if (!display)
	{
		fprintf(stderr,"Could not create display.\n");
		return 1;
	}

	al_init_image_addon();

	img = al_load_bitmap("bricks2.jpg");
	if(!img)
	{
		fprintf(stderr,"Can't load image\n");
		return 1;
	}

	imgID = al_get_opengl_texture(img);
	glBindTexture(GL_TEXTURE_2D,imgID);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

	timer = al_create_timer(1.0 / 60.0);

	queue = al_create_event_queue();
	al_register_event_source(queue, al_get_keyboard_event_source());
	al_register_event_source(queue, al_get_display_event_source(display));
	al_register_event_source(queue, al_get_timer_event_source(timer));

	glEnable(GL_DEPTH_TEST);
	glEnable(GL_BLEND);
	glEnable(GL_CULL_FACE);
	glDepthFunc(GL_LEQUAL);
  	glClearDepth(1.0f);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 400.0);
	glMatrixMode(GL_MODELVIEW);
	glColor4f(1.0,1.0,1.0,1.0);

	glEnable(GL_TEXTURE_2D);
	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
	glMatrixMode(GL_MODELVIEW);


	al_start_timer(timer);

	while (true)
	{
		al_wait_for_event(queue, &event);
		{
			switch (event.type)
			{
				case ALLEGRO_EVENT_DISPLAY_CLOSE:
					goto done;

				case ALLEGRO_EVENT_KEY_DOWN:
					if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE)
						goto done;
					break;

				case ALLEGRO_EVENT_TIMER:
				{
					redraw++;
				}
			}

			while( (redraw > 0) && al_is_event_queue_empty(queue))
			{
				render();
				redraw--;
			}
		}
	}

done:

	al_destroy_event_queue(queue);
	return 0;
}
