
#include <GL/glut.h>

float xrot, yrot, zrot;

enum texMode {REPEATING_SQUARES, STRING_LINE, CIRCLE_CUT};

void drawRingBasic( float inRadius = 3,
					float outRadius = 4,
					float angleRadians = 1.7,
					float sliceRadians = .2,
					texMode theTexMode = STRING_LINE)
{
	int loops = ceil(angleRadians/sliceRadians);
	glPushMatrix();
	glBegin (GL_QUADS);
	
	for (int i=0 ; i< loops ; i++)
	{
		//set tex coord (ccw!!!)
		if (theTexMode == REPEATING_SQUARES)
		{
			//x = rcosT
			//y = rsin
			glTexCoord2f(0, 0); glVertex2f(inRadius*cos(sliceRadians*i), inRadius*sin(sliceRadians*i));
			glTexCoord2f(1, 0); glVertex2f(outRadius*cos(sliceRadians*i), outRadius*sin(sliceRadians*i));
			glTexCoord2f(1, 1); glVertex2f(outRadius*cos(sliceRadians*(i+1)), outRadius*sin(sliceRadians*(i+1)));
			glTexCoord2f(0, 1); glVertex2f(inRadius*cos(sliceRadians*(i+1)), inRadius*sin(sliceRadians*(i+1)));
		}
		else if (theTexMode == STRING_LINE)
		{
			float loopf = loops;
			glTexCoord2f(1.0 - i*(1.0/loopf), 0); glVertex2f(inRadius*cos(sliceRadians*i), inRadius*sin(sliceRadians*i));
			glTexCoord2f(1.0 - i*(1.0/loopf), 1); glVertex2f(outRadius*cos(sliceRadians*i), outRadius*sin(sliceRadians*i));
			glTexCoord2f(1.0 - (i+1)*(1.0/loopf), 1); glVertex2f(outRadius*cos(sliceRadians*(i+1)), outRadius*sin(sliceRadians*(i+1)));
			glTexCoord2f(1.0 - (i+1)*(1.0/loopf), 0); glVertex2f(inRadius*cos(sliceRadians*(i+1)), inRadius*sin(sliceRadians*(i+1)));
		}
		else
		{
			ASSERTMSG(true, "drawRingBasic(): unimplemented texture mode");
		}
	}
	
	glEnd();
	glPopMatrix();
	return;
}


void display( void )
{
	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
	glLoadIdentity ( );
	glPushMatrix();
		glTranslatef ( 0.0, 0.0, -5.0 );
		glPushMatrix();
			glRotatef(zrot*1.66, 0, 0, 1);
			drawRingBasic(0, 0.75, 3.14/2, .1, STRING_LINE);
		glPopMatrix();
		glPushMatrix();
			//void drawRingBasic( inRadius, outRadius, angleRadians, sliceRadians, theTexMode)
			glRotatef(yrot*4.3, 0, 0, 1);
			drawRingBasic(1, 1.75, 3.14/12.0, 3.14/12.0, REPEATING_SQUARES);
			glRotatef(30, 0, 0, 1);
			drawRingBasic(1, 1.75, 3.14/12.0, 3.14/12.0, REPEATING_SQUARES);
			glRotatef(30, 0, 0, 1);
			drawRingBasic(1, 1.75, 3.14/12.0, 3.14/12.0, REPEATING_SQUARES);
			glRotatef(30, 0, 0, 1);
			drawRingBasic(1, 1.75, 3.14/12.0, 3.14/12.0, REPEATING_SQUARES);
			glRotatef(30, 0, 0, 1);
			drawRingBasic(1, 1.75, 3.14/12.0, 3.14/12.0, REPEATING_SQUARES);
			glRotatef(30, 0, 0, 1);
			drawRingBasic(1, 1.75, 3.14/12.0, 3.14/12.0, REPEATING_SQUARES);
		glPopMatrix();
		glPushMatrix();
			glRotatef(-1*zrot, 0, 0, 1);
			drawRingBasic(2.0, 2.75, 3.14*4/3, .1, STRING_LINE);
		glPopMatrix();
		glPushMatrix();
			glRotatef((1.83*xrot), 0, 0, 1);
			drawRingBasic(3, 3.75, 3.14/8, 3.14/(8*3), STRING_LINE);
			glRotatef(45, 0, 0, 1);
			drawRingBasic(3, 3.75, 3.14/8, 3.14/(8*3), STRING_LINE);
			
			glRotatef(45, 0, 0, 1);
			drawRingBasic(3, 3.75, 3.14/8, 3.14/(8*3), STRING_LINE);
			glRotatef(45, 0, 0, 1);
			drawRingBasic(3, 3.75, 3.14/8, 3.14/(8*3), STRING_LINE);
			
		glPopMatrix();
	glPopMatrix();
	
	if (animate)
	{
		xrot+=0.03f;
		yrot+=0.02f;
		zrot+=0.04f;
	}
	
	glutSwapBuffers();
}

