/*
   Program to display the earth and its equatorial plane moving around
   the sun, with the plane intersecting the sun at the spring and
   autumn equinoxes.
   
   (c) 2001, Steve Cunningham
*/

#include "glut.h"
#include <stdlib.h>
#include <math.h>

#define PI 3.14159
#define RAD 10.
#define D 17.

//	Global variables
//	GLfloat light0_position[]={ 10.0, 10.0, -10.0, 1.0 };
	GLfloat light0_position[]={ 0.0, 0.0, 0.0, 1.0 };
	GLfloat light0_color[]={ 1.0, 1.0, 1.0, 1.0 };
	GLfloat light1_position[]={ 0.0, 0.0, 0.0, 1.0 };
	GLfloat light1_color[]={ 1.0, 1.0, 1.0, 1.0 };
	GLfloat ambient_color[]={ 0.3, 0.3, 0.3, 1.0 };
	GLfloat	red[]    ={1.0,0.0,0.0,1.0},
			pink[]	 ={1.0,0.3,0.3,1.0},
			green[]  ={0.0,1.0,0.0,1.0},
			blue[]   ={0.0,0.0,1.0,1.0},
			yellow[] ={1.0,1.0,0.0,1.0},
			cyan[]   ={0.0,1.0,1.0,1.0},
			magenta[]={1.0,0.0,1.0,1.0},
			white[]  ={1.0,1.0,1.0,1.0},
			clear[]  ={.5,.5,.5,.5}, //{1.0,1.0,1.0,0.3},
			black[]  ={0.0,0.0,0.0,1.0};
	GLfloat mat_shininess[]={ 30.0 };
	GLfloat theta = 0.0;
	    
	GLUquadric *Q1, *Q2;

		typedef float point3[3];

void myinit(void)
{
	glClearColor( 0.1, 0.1, 0.1, 0.0 );
	glShadeModel(GL_FLAT);
//	glLightfv(GL_LIGHT0, GL_POSITION, light0_position );
	glLightfv(GL_LIGHT0, GL_AMBIENT,  ambient_color );
	glLightfv(GL_LIGHT0, GL_SPECULAR, light0_color );
	glLightfv(GL_LIGHT0, GL_DIFFUSE,  light0_color );
	glLightfv(GL_LIGHT1, GL_POSITION, light0_position );
	glLightfv(GL_LIGHT1, GL_AMBIENT,  ambient_color );
	glLightfv(GL_LIGHT1, GL_SPECULAR, light0_color );
	glLightfv(GL_LIGHT1, GL_DIFFUSE,  light0_color );
    
	glEnable(GL_LIGHTING);
//	glEnable(GL_LIGHT0);
//	glEnable(GL_LIGHT1);
	glEnable(GL_NORMALIZE);
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	
	Q1 = gluNewQuadric();
	Q2 = gluNewQuadric();
}

void display( void )
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glMatrixMode(GL_MODELVIEW);
	glLightfv(GL_LIGHT0, GL_POSITION, light0_position );
	glLoadIdentity();
	/*           eye point     center of view      up   */
	gluLookAt(0.0, 50.0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);

//	the sun
   	glEnable(GL_LIGHT1);
   	glDisable(GL_LIGHT0);
   	glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, yellow );
   	glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, yellow );
   	glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, light0_color );
   	glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess );
    glPushMatrix();
    	//glScalef(2., 2., 2.);
    	glEnable(GL_DEPTH_TEST);
    	gluSphere(Q1, 1., 50, 50);
//    	glDisable(GL_DEPTH_TEST);
    glPopMatrix();
    glDisable(GL_LIGHT1);
    glEnable(GL_LIGHT0);

//	the earth
    glPushMatrix();
    	glTranslatef(RAD*cos(theta),RAD*sin(theta),0.);
    	glRotatef(23.5, 0., 1., 0.);
		glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, pink );
		glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pink );
		glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, light0_color );
		glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess );
		glLineWidth(2.);
    	glBegin(GL_LINES);
    		glVertex3f( 0., 0., .5);
    		glVertex3f( 0., 0.,-.5);
    	glEnd();
		glScalef(.33, .33, .33);
		glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, cyan );
		glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, cyan );
		glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, light0_color );
		glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess );
//		glEnable(GL_DEPTH_TEST);
		gluSphere(Q2, 1., 50, 50);
		glDisable(GL_DEPTH_TEST);
	glPopMatrix();

//	the earth's equatorial plane
    glPushMatrix();
		glEnable(GL_DEPTH_TEST);
    	glTranslatef(RAD*cos(theta),RAD*sin(theta),0.);
    	glRotatef(23.5, 0., 1., 0.);
		glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, clear );
		glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, clear );
		glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, light0_color );
		glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess );
    	glBegin(GL_QUADS);
    		glVertex3f(-5.*D,-D, 0.);
    		glVertex3f( 5.*D,-D, 0.);
    		glVertex3f( 5.*D, D, 0.);
    		glVertex3f(-5.*D, D, 0.);
    	glEnd();
    	glDisable(GL_DEPTH_TEST);
	glPopMatrix();

    glutSwapBuffers();
}

void animate(void)
{
	int i, j;
	
	theta += 0.01;
	for (i=0; i<1000; i++) {
		j = i;
	}
	j=0;
	glutPostRedisplay();
}

void reshape(int w,int h)
{
        glViewport(0,0,(GLsizei)w,(GLsizei)h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(25.0,1.0,1.0,600.0);
}

void main(int argc, char** argv)
{
        glutInit(&argc,argv);
        glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
        glutInitWindowSize(500,500);
        glutInitWindowPosition(70,70);
        glutCreateWindow("The earth's progression around the sun");
        glutDisplayFunc(display);
        glutReshapeFunc(reshape);
        glutIdleFunc(animate);

        myinit();
        glutMainLoop();
}