void init( void )
{
	int i;
	//Fixes GlutMouseWarpPointer on Mac, thanks to John Huston and Chris Compton
#ifdef __APPLE__
	CGSetLocalEventsSuppressionInterval( 0.0 );
#endif

	glEnable(GL_DEPTH_TEST);

	// set up camera
	camera.setLockedXRot(true);
	camera.lockToPlane(-1.7);

	// load objects
	OBJParser::load_obj("models/subwaycar-done.obj", world);
	OBJParser::load_obj("models/stations.obj", world);
	OBJParser::load_obj("models/cardoor.obj", world);
	OBJParser::load_obj("models/cardoor.obj", world);
	OBJParser::load_obj("models/monkeyrobot-sit.obj", world);
	OBJParser::load_obj("models/monkeyrobot-stand.obj", world);
	OBJParser::load_obj("models/monkeyrobot-stand.obj", world);

	transformation = *new mat4();

	GLuint program = InitShader( "vshader.glsl", "fshader.glsl" );
	glUseProgram( program );

	for (i = 0; i < NUM_LIGHTS; i++) {
		init_lights(program);
		Light[i].bindLight(program);
	}
	 
	camMatLoc = glGetUniformLocation( program, "modelview");
	perspectiveMatLoc = glGetUniformLocation(program, "perspective");

	world.bufferActors();
	world.getActors()->at(0)->loadTexture("img/subwaycar.png");
	world.getActors()->at(1)->loadTexture("img/stations.png");
	world.getActors()->at(2)->loadTexture("img/cardoor.png");
	world.getActors()->at(3)->loadTexture("img/cardoor.png");
	world.getActors()->at(4)->loadTexture("img/monkeyrobot.png");
	world.getActors()->at(5)->loadTexture("img/monkeyrobot.png");
	world.getActors()->at(6)->loadTexture("img/monkeyrobot.png");

	world.getActors()->at(4)->setPosition(vec3(-0.75, 0.0, -0.9));
	world.getActors()->at(5)->setPosition(vec3(25.0, 9.2, 44.0));
	world.getActors()->at(5)->setScale(vec3(3.0));
	world.getActors()->at(5)->setRotation(vec3(0.0, -90.0, 0.0));
	world.getActors()->at(6)->setPosition(vec3(7.9, 1.1, 71.38));
	world.getActors()->at(6)->setRotation(vec3(0.0, 220.0, 0.0));
	world.getActors()->at(6)->setScale(vec3(0.7));

	world.getActors()->at(0)->addChild(world.getActors()->at(4));

	world.getActors()->at(0)->setRotation(vec3(0.0, 90.0, 0.0));
	world.getActors()->at(2)->setRotation(vec3(0.0, 90.0, 0.0));
	world.getActors()->at(3)->setRotation(vec3(0.0, 90.0, 0.0));
	world.getActors()->at(0)->setPosition(vec3(-0.3, 1.3, -5.5));

	train = new Train(world.getActors()->at(0), world.getActors()->at(2), world.getActors()->at(3), &camera, 0.0002, 0.1, 600, 1050, -1.3);

	world.getActors()->at(2)->setPosition(vec3(1.22, 1.3, 3.15));
	world.getActors()->at(3)->setPosition(vec3(1.22, 1.3, -14.2));

	world.getActors()->at(0)->translate(vec3(0.0, 0.0, 6.0));
			
	world.getActors()->at(1)->setScale(vec3(0.4));

	glEnable( GL_DEPTH_TEST );

	glClearColor( 0.0, 0.0, 0.0, 1.0 ); /* white background */
}