#include "GEIcosahedron.h"

#include "GEVertex.h"

//
// FUNCIÓN: GEIcosahedron::GEIcosahedron(float r)
//
// PROPÓSITO: Crea la figura
//
GEIcosahedron::GEIcosahedron(float r)
{
	int numFaces = 20;         // Number of faces
	int numVertices = 60;  // Number of vertices
	vertices.resize(numVertices);
	indices.resize(numFaces * 3);

	float phi = (float)((1 + sqrt(5.0)) / 2.0);
	float mod = (float)sqrt(6 + 9 * phi);
	float p0M = (float)phi / mod;
	float p1M = (float)(phi + 1) / mod;
	float p2M = (float)(2 * phi + 1) / mod;

	glm::vec3 N1 = { -p0M, p2M, 0.0f };
	glm::vec3 N2 = { -p1M, p1M, p1M };
	glm::vec3 N3 = { 0.0f, p0M, p2M };
	glm::vec3 N4 = { p1M, p1M, p1M };
	glm::vec3 N5 = { p0M, p2M, 0.0f };
	glm::vec3 N6 = { p2M, 0.0f, -p0M };
	glm::vec3 N7 = { p2M, 0.0f, p0M };
	glm::vec3 N8 = { p1M, -p1M, p1M };
	glm::vec3 N9 = { p0M, -p2M, 0.0f };
	glm::vec3 N10 = { p1M, -p1M, -p1M };
	glm::vec3 N11 = { p1M, p1M, -p1M };
	glm::vec3 N12 = { 0.0f, -p0M, p2M };
	glm::vec3 N13 = { 0.0f, p0M, -p2M };
	glm::vec3 N14 = { -p1M, p1M, -p1M };
	glm::vec3 N15 = { -p2M, 0.0f, p0M };
	glm::vec3 N16 = { -p1M, -p1M, p1M };
	glm::vec3 N17 = { -p2M, 0.0f, -p0M };
	glm::vec3 N18 = { 0.0f, -p0M, -p2M };
	glm::vec3 N19 = { -p1M, -p1M, -p1M };
	glm::vec3 N20 = { -p0M, -p2M, 0.0f };

	glm::vec3 A0 = { 0.0f, r * phi, r };
	glm::vec3 A1 = { 0.0f, r * phi, -r };
	glm::vec3 A2 = { 0.0f, -r * phi, -r };
	glm::vec3 A3 = { 0.0f, -r * phi, r };
	glm::vec3 B0 = { r * phi, r, 0.0f };
	glm::vec3 B1 = { r * phi, -r, 0.0f };
	glm::vec3 B2 = { -r * phi, -r, 0.0f };
	glm::vec3 B3 = { -r * phi, r, 0.0f };
	glm::vec3 C0 = { r, 0.0f, r * phi };
	glm::vec3 C1 = { r, 0.0f, -r * phi };
	glm::vec3 C2 = { -r, 0.0f, -r * phi };
	glm::vec3 C3 = { -r, 0.0f, r * phi };

	// face 1
	vertices[0] = { A0, N1 };
	vertices[1] = { A1, N1 };
	vertices[2] = { B3, N1 };

	// face 2
	vertices[3] = { A0, N2 };
	vertices[4] = { B3, N2 };
	vertices[5] = { C3, N2 };

	// face 3
	vertices[6] = { A0, N3 };
	vertices[7] = { C3, N3 };
	vertices[8] = { C0, N3 };

	// face 4
	vertices[9] = { A0, N4 };
	vertices[10] = { C0, N4 };
	vertices[11] = { B0, N4 };

	// face 5
	vertices[12] = { A0, N5 };
	vertices[13] = { B0, N5 };
	vertices[14] = { A1, N5 };

	// face 6
	vertices[15] = { B1, N6 };
	vertices[16] = { C1, N6 };
	vertices[17] = { B0, N6 };

	// face 7
	vertices[18] = { B1, N7 };
	vertices[19] = { B0, N7 };
	vertices[20] = { C0, N7 };

	// face 8
	vertices[21] = { B1, N8 };
	vertices[22] = { C0, N8 };
	vertices[23] = { A3, N8 };

	// face 9
	vertices[24] = { B1, N9 };
	vertices[25] = { A3, N9 };
	vertices[26] = { A2, N9 };

	// face 10
	vertices[27] = { B1, N10 };
	vertices[28] = { A2, N10 };
	vertices[29] = { C1, N10 };

	// face 11
	vertices[30] = { B0, N11 };
	vertices[31] = { C1, N11 };
	vertices[32] = { A1, N11 };

	// face 12
	vertices[33] = { C0, N12 };
	vertices[34] = { C3, N12 };
	vertices[35] = { A3, N12 };

	// face 13
	vertices[36] = { A1, N13 };
	vertices[37] = { C1, N13 };
	vertices[38] = { C2, N13 };

	// face 14
	vertices[39] = { A1, N14 };
	vertices[40] = { C2, N14 };
	vertices[41] = { B3, N14 };

	// face 15
	vertices[42] = { C3, N15 };
	vertices[43] = { B3, N15 };
	vertices[44] = { B2, N15 };

	// face 16
	vertices[45] = { C3, N16 };
	vertices[46] = { B2, N16 };
	vertices[47] = { A3, N16 };

	// face 17
	vertices[48] = { B3, N17 };
	vertices[49] = { C2, N17 };
	vertices[50] = { B2, N17 };

	// face 18
	vertices[51] = { C2, N18 };
	vertices[52] = { C1, N18 };
	vertices[53] = { A2, N18 };

	// face 19
	vertices[54] = { C2, N19 };
	vertices[55] = { A2, N19 };
	vertices[56] = { B2, N19 };

	// face 20
	vertices[57] = { A2, N20 };
	vertices[58] = { A3, N20 };
	vertices[59] = { B2, N20 };

	for (int i = 0; i < numVertices; i++) indices[i] = i;
}
