int main (int argc, char ** argv)
{
    if (argc<2)
    {
        printf ("usage: %s <trackfile>\n", argv[0]);
        exit(0);
    }
    
    loadSplines(argv[1]);
    
    glutInit(&argc, argv);
    
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize (500, 500);
    glutInitWindowPosition (100, 100);
    glutCreateWindow (argv[0]);
    init ();
    glClearDepth(1.0);
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    
    
    glutKeyboardFunc(handleKeypress);
    glutIdleFunc(doIdle);
    glutMotionFunc(mousedrag);
    glutPassiveMotionFunc(mouseidle);
    glutMouseFunc(mousebutton);
    
    glutMainLoop();
    return 0;
    
}
int _tmain(int argc, _TCHAR* argv[])
{
	// I've set the argv[1] to track.txt.
	// To change it, on the "Solution Explorer",
	// right click "assign1", choose "Properties",
	// go to "Configuration Properties", click "Debugging",
	// then type your track file name for the "Command Arguments"
	if (argc<2)
	{  
		printf ("usage: %s <trackfile>\n", argv[0]);
		exit(0);
	}
	g_pFloorTexture = jpeg_read("Ground.jpg", NULL);
	if (!g_pFloorTexture)
	{
		printf("no ground texture file found. \n");
	}
	g_pFloorHeight = jpeg_read("Height.jpg", NULL);
	if (!g_pFloorHeight)
	{
		printf("no ground height file found. \n");
	}
	g_pSkyTexture = jpeg_read("Sky.jpg", NULL);
	if (!g_pFloorTexture)
	{
		printf("no sky texture file found. \n");
	}
	glutInit(&argc, (char**)argv);

	loadSplines(argv[1]);

	glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
	glutInitWindowSize(640, 480);
	glutInitWindowPosition(0, 0);
	glutCreateWindow("Assignment 2");

	/* tells glut to use a particular display function to redraw */
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);

	/* replace with any animate code */
	glutIdleFunc(doIdle);

	/* callback for mouse drags */
	glutMotionFunc(mousedrag);
	/* callback for idle mouse movement */
	glutPassiveMotionFunc(mouseidle);
	/* callback for mouse button changes */
	glutMouseFunc(mousebutton);


	/* do initialization */
	myinit();


	glutMainLoop();

	return 0;
}
int main (int argc, char ** argv)
{
  	if (argc<2)
  	{  
  	printf ("usage: %s <trackfile>\n", argv[0]);
  	exit(0);
  	}


  	
  	loadSplines(argv[1]);
  	
	
  	
		/* create window */
  	glutInit(&argc,argv);
  	glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);  
  	glutInitWindowSize(WIDTH, HEIGHT);
  	glutInitWindowPosition(0, 0);  
  	glutCreateWindow("Assignment 2 - Roller Coaster");   
  	
  	/* allow the user to quit using the right mouse button menu */
  	g_iMenuId = glutCreateMenu(menufunc); /* menu triggered function */
  	glutSetMenu(g_iMenuId);
  	glutAddMenuEntry("Quit",0);   		/* Menu item = (menu title, value) */
  	glutAttachMenu(GLUT_RIGHT_BUTTON);	/* which button trigger menu show up*/
  	
  	/* replace with any animate code */
  	glutIdleFunc(doIdle);
  	
  	/*  set GLUT callbacks */
  	glutDisplayFunc(display);        /* display function to redraw */	
  	glutMotionFunc(mousedrag);       /* callback for mouse drags */
  	glutPassiveMotionFunc(mouseidle);/* callback for idle mouse */
  	glutMouseFunc(mousebutton);      /* callback for mouse button */
  	glutReshapeFunc(reshape);	       /* reshape callback */
  	glutKeyboardFunc(keyboard);	     /* keyboard callback */  
  	  
  	/* do initialization */
  	myinit();
  	
  	/* cannot put before diaply*/
  	loadTexture();  	
  	
	/* start GLUT program - affect window showing */
  	glutMainLoop();    
  	  
  	  
  	return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
	// I've set the argv[1] to track.txt.
	// To change it, on the "Solution Explorer",
	// right click "assign2", choose "Properties",
	// go to "Configuration Properties", click "Debugging",
	// then type your track file name for the "Command Arguments"
	if (argc < 2)
	{
		printf("usage: %s <trackfile>\n", argv[0]);
		exit(0);
	}

	loadSplines(argv[1]);

	/* initialization */
	glutInit(&argc, (char**)argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

	/* create window */
	glutInitWindowSize(640, 480);
	glutInitWindowPosition(100, 100);
	glutCreateWindow("CSCI 420 Assignment 2 - Rollercoaster");

	/* used for double buffering */
	glEnable(GL_DEPTH_TEST);

	/* tells glut to use a particular display function to redraw */
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);

	/* replace with any animate code */
	glutIdleFunc(idle);

	/* user keyboard input */
	glutSpecialFunc(keySpecial);

	/* enable materials */

	myInit();

	glutMainLoop();

	return 0;
}
int main (int argc, char ** argv) { // main function
    if (argc<2) {
        printf ("usage: %s <trackfile>\n", argv[0]);
        exit(0);
    }

    loadSplines(argv[1]); // load up the splines

    // used to get the second spline, offset it to get two tracks
    for (int i=0; i<g_Splines[1].numControlPoints; i++) { // load up the second spline
        double x_offset = g_Splines[1].points[i].x;
        double y_offset = g_Splines[1].points[i].y;
        double z_offset = g_Splines[1].points[i].z;
        double normal = sqrt(pow(x_offset,2)+pow(y_offset,2)+pow(z_offset,2)); // normalize
        x_offset = x_offset/normal*-1.1; // to offset
        y_offset = y_offset/normal*-1.1;
        z_offset = z_offset/normal*-1.1;
        g_Splines[1].points[i].x = g_Splines[0].points[i].x + x_offset; // offset slightly from the original track
        g_Splines[1].points[i].y = g_Splines[0].points[i].y + y_offset;
        g_Splines[1].points[i].z = g_Splines[0].points[i].z + z_offset;
    }

    glutInit(&argc,argv);

    glutInitDisplayMode(GLUT_DEPTH | GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowPosition(200,200); // window position on screen at 200,200
    glutInitWindowSize(640, 480); // window size is 640x480
    glutCreateWindow("CSCI480 Assignment 2 - Jeremy Chen"); // window title

    glutDisplayFunc(display);

    g_iMenuId = glutCreateMenu(menu); // create menu
    glutSetMenu(g_iMenuId);
    glutAddMenuEntry("Quit", 0);
    glutAddMenuEntry("Restart",1);
    glutAttachMenu(GLUT_RIGHT_BUTTON); // use right-button to get menu

    glutIdleFunc(doIdle);

    myinit();

    glutMainLoop();
}
int _tmain(int argc, _TCHAR* argv[])
{
	// I've set the argv[1] to track.txt.
	// To change it, on the "Solution Explorer",
	// right click "assign1", choose "Properties",
	// go to "Configuration Properties", click "Debugging",
	// then type your track file name for the "Command Arguments"
	if (argc<2)
	{  
		printf ("usage: %s <trackfile>\n", argv[0]);
		exit(0);
	}
	loadSplines(argv[1]);

	/* Matrix mult test code
	GLdouble in1[16] = {1,4,1,1,2,3,4,3,3,1,2,2,4,2,3,4};
	GLdouble in2[16] = {3,8,7,9,2,3,4,3,3,1,2,2,4,2,3,4};
	GLdouble out[16];
	matrix4mult(in1,in2,out);
	out[0];
	*/
	//{{1,2,3,4},{4,3,1,2},{1,4,2,3},{1,3,2,4}} * {{1,2,3,4},{4,3,1,2},{1,4,2,3},{1,3,2,4}}

	glutInit(&argc,(char**)argv);

	/*create a window here double buffered and using depth testing */
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowSize(640,480);
	glutInitWindowPosition(50,50);
	glutCreateWindow(argv[0]);

	/* tells glut to use a particular display function to redraw */
	glutDisplayFunc(display);

	/* allow the user to quit using the right mouse button menu */
	g_iMenuId = glutCreateMenu(menufunc);
	glutSetMenu(g_iMenuId);
	glutAddMenuEntry("Quit",0);
	glutAddMenuEntry("Capture Animation",4);
	glutAttachMenu(GLUT_RIGHT_BUTTON);

	/* replace with any animate code */
	glutIdleFunc(doIdle);

	/* callback for mouse drags */
	glutMotionFunc(mousedrag);
	/* callback for idle mouse movement */
	glutPassiveMotionFunc(mouseidle);
	/* callback for mouse button changes */
	glutMouseFunc(mousebutton);
	/* callback for reshaping window, also sets viewport and perspective */
	glutReshapeFunc(reshape);

	glutKeyboardFunc(keypress);

	/* do initialization */
	glInit();

	glutMainLoop();
	return 0;

}