Example #1
0
/*
	Initial function, called before display
*/
void init(GLWrapper *glw)
{
	printInstructions();
	angle_x = 0.0f;
	angle_x_inc = 0.0f;
	angle_y = 0.0f;
	angle_y_inc = 0.0f;
	angle_z = 0.0f;
	angle_z_inc = 0.1f;
	scale_val = 1.0;
	move_model_x = 0;
	move_model_y = 0;
	move_model_z = 0;
	look_x = 0;
	look_y = 0;
	look_z = 0;

	aspect_ratio = 1.3333f;

	// Generate index (name) for one vertex array object
	glGenVertexArrays(1, &vao);

	// Create the vertex array object and make it current
	glBindVertexArray(vao);


	/* Define an array of colours */
	float vertexColours[] = {
		0.627f, 0.627f, 0.627f, 1.0f
	};
	
	/* Create vec4 arrays for each object and vec3 arrays to contain normals*/
	Gear gear;
	glm::vec4 * gearTest = gear.createGear(radius, sides, teeth, 0.195f, 0.0f);
	glm::vec3 * gearOneNormal = gear.calculateNormals(gearTest, sides, teeth);
	glm::vec4 * gearTwo = gear.createGear(0.3, 10, 5, 0.180f, 35.0f);
	glm::vec3 * gearTwoNormal = gear.calculateNormals(gearTwo, 10, 5);
	glm::vec4 * gearThree = gear.createGear(radius, sides, teeth, 0.195f, 24.0f);
	glm::vec3 * gearThreeNormal = gear.calculateNormals(gearThree, sides, teeth);
	glm::vec4 * gearFour = gear.createGear(1.0, 26, 16, 0.195f, 10.0f);
	glm::vec3 * gearFourNormal = gear.calculateNormals(gearFour, 26, 20);
	Crank crankClass;
	glm::vec4 * crank = crankClass.buildCrank();
	glm::vec3 * crankNormal = crankClass.calculateNormals(crank);
	
	/* Create a vertex buffer object to store vertices */
	glGenBuffers(1, &positionBufferGearOne);
	glBindBuffer(GL_ARRAY_BUFFER, positionBufferGearOne);
	glBufferData(GL_ARRAY_BUFFER, (368 * sizeof(glm::vec4)), gearTest, GL_STATIC_DRAW);
	glBindBuffer(GL_ARRAY_BUFFER, 0);
	/* Create a vertex buffer object to store normals */
	glGenBuffers(1, &gearOneNormals);
	glBindBuffer(GL_ARRAY_BUFFER, gearOneNormals);
	glBufferData(GL_ARRAY_BUFFER, (368 * sizeof(glm::vec3)), gearOneNormal, GL_STATIC_DRAW);
	glBindBuffer(GL_ARRAY_BUFFER, 0);

	/* Create a vertex buffer object to store vertices */
	glGenBuffers(1, &positionBufferGearTwo);
	glBindBuffer(GL_ARRAY_BUFFER, positionBufferGearTwo);
	glBufferData(GL_ARRAY_BUFFER, (368 * sizeof(glm::vec4)), gearTwo, GL_STATIC_DRAW);
	glBindBuffer(GL_ARRAY_BUFFER, 0);
	/* Create a vertex buffer object to store normals */
	glGenBuffers(1, &gearTwoNormals);
	glBindBuffer(GL_ARRAY_BUFFER, gearTwoNormals);
	glBufferData(GL_ARRAY_BUFFER, (368 * sizeof(glm::vec3)), gearTwoNormal, GL_STATIC_DRAW);
	glBindBuffer(GL_ARRAY_BUFFER, 0);

	/* Create a vertex buffer object to store vertices */
	glGenBuffers(1, &positionBufferGearThree);
	glBindBuffer(GL_ARRAY_BUFFER, positionBufferGearThree);
	glBufferData(GL_ARRAY_BUFFER, (368 * sizeof(glm::vec4)), gearThree, GL_STATIC_DRAW);
	glBindBuffer(GL_ARRAY_BUFFER, 0);
	/* Create a vertex buffer object to store normals */
	glGenBuffers(1, &gearThreeNormals);
	glBindBuffer(GL_ARRAY_BUFFER, gearThreeNormals);
	glBufferData(GL_ARRAY_BUFFER, (368 * sizeof(glm::vec3)), gearThreeNormal, GL_STATIC_DRAW);
	glBindBuffer(GL_ARRAY_BUFFER, 0);

	/* Create a vertex buffer object to store vertices */
	glGenBuffers(1, &positionBufferGearFour);
	glBindBuffer(GL_ARRAY_BUFFER, positionBufferGearFour);
	glBufferData(GL_ARRAY_BUFFER, (700 * sizeof(glm::vec4)), gearFour, GL_STATIC_DRAW);
	glBindBuffer(GL_ARRAY_BUFFER, 0);
	/* Create a vertex buffer object to store normals */
	glGenBuffers(1, &gearFourNormals);
	glBindBuffer(GL_ARRAY_BUFFER, gearFourNormals);
	glBufferData(GL_ARRAY_BUFFER, (700 * sizeof(glm::vec3)), gearFourNormal, GL_STATIC_DRAW);
	glBindBuffer(GL_ARRAY_BUFFER, 0);

	/* Create a vertex buffer object to store vertices */
	glGenBuffers(1, &positionBufferCrank);
	glBindBuffer(GL_ARRAY_BUFFER, positionBufferCrank);
	glBufferData(GL_ARRAY_BUFFER, (72 * sizeof(glm::vec4)), crank, GL_STATIC_DRAW);
	glBindBuffer(GL_ARRAY_BUFFER, 0);
	/* Create a vertex buffer object to store normals */
	glGenBuffers(1, &crankNormals);
	glBindBuffer(GL_ARRAY_BUFFER, crankNormals);
	glBufferData(GL_ARRAY_BUFFER, (72 * sizeof(glm::vec3)), crankNormal, GL_STATIC_DRAW);
	glBindBuffer(GL_ARRAY_BUFFER, 0);


	/* Create a vertex buffer object to store vertex colours */
	glGenBuffers(1, &colourObject);
	glBindBuffer(GL_ARRAY_BUFFER, colourObject);
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertexColours), vertexColours, GL_STATIC_DRAW);
	glBindBuffer(GL_ARRAY_BUFFER, 0);

	try
	{
		program = glw->LoadShader("lab2.vert", "lab2.frag");
	}
	catch (std::exception &e)
	{
		std::cout << "Caught exception: " << e.what() << std::endl;
		std::cin.ignore();
		exit(0);
	}

	/* Define uniforms to send to vertex shader */
	modelID = glGetUniformLocation(program, "model");
	viewID = glGetUniformLocation(program, "view");
	projectionID = glGetUniformLocation(program, "projection");
}