#include "cs148.h"

GLfloat ctrlpoints[4][3] = {
	{ -4.0, -4.0, 0.0}, { -2.0, 4.0, 0.0}, 
	{2.0, -4.0, 0.0}, {4.0, 4.0, 0.0}};

GLint whichpt = 1;

void init(void)
{
   glClearColor(0.0, 0.0, 0.0, 0.0);
}

void display(void)
{
   int i;

   glClear(GL_COLOR_BUFFER_BIT);
   glColor3f(1.0, 1.0, 1.0);
   glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);
   glEnable(GL_MAP1_VERTEX_3);
   //  glBegin(GL_LINE_STRIP);
   //    for (i = 0; i <= 30; i++) 
   //      glEvalCoord1f((GLfloat) i/30.0);
   //  glEnd();
   glMapGrid1f(30, 0.0, 1.0);  // Same as commented code above
   glEvalMesh1(GL_LINE, 0, 30);

   // The following code displays the control points as dots.
   glPointSize(5.0);
   glColor3f(1.0, 1.0, 0.0);
   glBegin(GL_POINTS);
      for (i = 0; i < 4; i++) 
         glVertex3fv(&ctrlpoints[i][0]);
   glEnd();
   glFlush();
}

void reshape(int w, int h)
{
   glViewport(0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   if (w <= h)
      glOrtho(-5.0, 5.0, -5.0*(GLfloat)h/(GLfloat)w, 
               5.0*(GLfloat)h/(GLfloat)w, -5.0, 5.0);
   else
      glOrtho(-5.0*(GLfloat)w/(GLfloat)h, 
               5.0*(GLfloat)w/(GLfloat)h, -5.0, 5.0, -5.0, 5.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
}

void goUp(void) {
	switch (whichpt) {
		case 1: ctrlpoints[0][1] = ctrlpoints[0][1] + 0.1; break;
		case 2: ctrlpoints[1][1] = ctrlpoints[1][1] + 0.1; break;
		case 3: ctrlpoints[2][1] = ctrlpoints[2][1] + 0.1; break;
		case 4: ctrlpoints[3][1] = ctrlpoints[3][1] + 0.1; break;
	}
}

void goD(void) {
	switch (whichpt) {
		case 1: ctrlpoints[0][1] = ctrlpoints[0][1] - 0.1; break;
		case 2: ctrlpoints[1][1] = ctrlpoints[1][1] - 0.1; break;
		case 3: ctrlpoints[2][1] = ctrlpoints[2][1] - 0.1; break;
		case 4: ctrlpoints[3][1] = ctrlpoints[3][1] - 0.1; break;
	}
}

void goL(void) {
	switch (whichpt) {
		case 1: ctrlpoints[0][0] = ctrlpoints[0][0] - 0.1; break;
		case 2: ctrlpoints[1][0] = ctrlpoints[1][0] - 0.1; break;
		case 3: ctrlpoints[2][0] = ctrlpoints[2][0] - 0.1; break;
		case 4: ctrlpoints[3][0] = ctrlpoints[3][0] - 0.1; break;
	}
}

void goR(void) {
	switch (whichpt) {
		case 1: ctrlpoints[0][0] = ctrlpoints[0][0] + 0.1; break;
		case 2: ctrlpoints[1][0] = ctrlpoints[1][0] + 0.1; break;
		case 3: ctrlpoints[2][0] = ctrlpoints[2][0] + 0.1; break;
		case 4: ctrlpoints[3][0] = ctrlpoints[3][0] + 0.1; break;
	}
}

void keyboard(unsigned char key, int x, int y)
{
   switch (key) {
	  case '1':
	  	 whichpt = 1;
	  	 break;
	  case '2':
	  	 whichpt = 2;
	  	 break;
	  case '3':
	  	 whichpt = 3;
	  	 break;
	  case '4':
	  	 whichpt = 4;
	  	 break;
	  case 'u':
	  	 goUp();
	  	 glutPostRedisplay();
	  	 break;
	  case 'd':
	  	 goD();
	  	 glutPostRedisplay();
	  	 break;
	  case 'l':
	  	 goL();
	  	 glutPostRedisplay();
	  	 break;
	  case 'r':
	  	 goR();
	  	 glutPostRedisplay();
	  	 break;
      case 27:
         exit(0);
         break;
   }
}

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
   glutInitWindowSize (500, 500);
   glutInitWindowPosition (100, 100);
   glutCreateWindow (argv[0]);
   init ();
   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   glutKeyboardFunc (keyboard);
   glutMainLoop();
   return 0;
}

