/// <summary> /// Devuelve el menor valor de los 3 componentes del vector /// </summary> /// <param name="v">Vector</param> /// <returns>Menor valor de los tres</returns> public static float min(Vector3 v) { return FastMath.Min(FastMath.Min(v.X, v.Y), v.Z); }
/// <summary> /// Duplica los vertices que deben tener coordenadas de textura diferentes para diferentes triangulos /// </summary> /// <param name="vertices"></param> /// <param name="indices"></param> /// <param name="iverticesU1"></param> /// <param name="polos"></param> protected virtual void fixTexcoords(List <Vertex.PositionColoredTexturedNormal> vertices, List <int> indices, List <int> iverticesU1, int[] polos) { Dictionary <int, int> duplicados = new Dictionary <int, int>(); float U0p5 = 0.5f * UVTiling.X + UVOffset.X; float U1 = UVTiling.X + UVOffset.X; //Fix compartidos foreach (int idx in iverticesU1) { for (int i = 0; i < indices.Count; i += 3) { //Triangulo que tiene ese vertice. if (indices[i] == idx || indices[i + 1] == idx || indices[i + 2] == idx) { int i1 = indices[i]; int i2 = indices[i + 1]; int i3 = indices[i + 2]; //Solo me importan los que tienen un vertice con u=1(fin de la textura) y otro menor a 0.5 (comienzo de la textura) if ((!esPolo(vertices[i1]) && vertices[i1].Tu < U0p5) || (!esPolo(vertices[i2]) && vertices[i2].Tu < U0p5) || (!esPolo(vertices[i3]) && vertices[i3].Tu < U0p5)) { List <int> u1 = new List <int>(); List <int> um = new List <int>(); //Clasifico cada vertice segun su Tu1 for (int j = 0; j < 3; j++) { if (vertices[indices[i + j]].Tu == U1 || esPolo(vertices[indices[i + j]])) { u1.Add(i + j); } else if (vertices[indices[i + j]].Tu < U0p5) { um.Add(i + j); } } if (um.Count == 1 && !(esPolo(vertices[indices[u1[0]]]) && vertices[indices[um[0]]].X >= 0)) { //Casos: //2 vertices con u=1 o uno con u=1 y otro con u>0.5 //1 vertice es el polo, y uno de los vertices esta al final de la textura y otro al principio //La coordenada textura del de u >0.5 pasa a ser 1+u indices[um[0]] = dupWithU(vertices, indices, duplicados, um[0], vertices[indices[um[0]]].Tu + UVTiling.X); } else if (!esPolo(vertices[indices[u1[0]]])) { // Caso: // 1 vertice con u=1 y dos con u<0.5 // El u del vertice con u=1 pasa a ser 0 indices[u1[0]] = dupWithU(vertices, indices, duplicados, u1[0], UVOffset.X); } } } } } //Fix polos for (int p = 0; p < 2; p++) { bool first = true; for (int i = 0; i < indices.Count; i += 3)//Por cada triangulo { int iipolo = i; for (; iipolo < i + 3 && indices[iipolo] != polos[p]; iipolo++) { ; } //Si un vertice es el polo if (iipolo < i + 3) { Vertex.PositionColoredTexturedNormal[] u = new Vertex.PositionColoredTexturedNormal[2]; int n = 0; //Guardo los vertices que no son polos. for (int j = 0; j < 3; j++) { if (i + j != iipolo) { u[n++] = vertices[indices[i + j]]; } } float minU = FastMath.Min(u[0].Tu, u[1].Tu); Vertex.PositionColoredTexturedNormal pole = vertices[polos[p]]; //Chequea que no sea un triangulo rectangulo Vertex.PositionColoredTexturedNormal zeroXZ = u[0]; bool noRectangulo = false; if (u[0].X != 0 && u[0].Z != 0) { zeroXZ = u[0]; } else if (u[1].X != 0 && u[1].Z != 0) { zeroXZ = u[1]; } else { noRectangulo = true; } //Interpolo Tu1 if (basePoly.Equals(eBasePoly.ICOSAHEDRON) || noRectangulo) { pole.Tu = minU + FastMath.Abs(u[0].Tu - u[1].Tu) / 2; } else { pole.Tu = zeroXZ.Tu; } if (first) //Si es la primera vez que lo hago, modifico el vertice. { vertices[polos[p]] = pole; first = false; } else //Sino lo duplico. { indices[iipolo] = vertices.Count; vertices.Add(pole); } } } } }