public static Vector3D NormalAvg(OBJ.Face face) => (face.VA.normal + face.VB.normal + face.VC.normal) / 3;
public static OBJ FixNitroUV(OBJ Input) { var mLT = new MLT(Input.MLTName); var oBJ = new OBJ { MLTName = Input.MLTName, Vertices = Input.Vertices, Normals = Input.Normals }; int num = 0; foreach (var face2 in Input.Faces) { Vector2[] array = new Vector2[3] { Input.TexCoords[face2.TexCoordIndieces[0]], Input.TexCoords[face2.TexCoordIndieces[1]], Input.TexCoords[face2.TexCoordIndieces[2]] }; MLT.Material materialByName = mLT.GetMaterialByName(face2.MaterialName); if (materialByName.DiffuseMap != null) { float num2 = 2047.9375f / (float)materialByName.DiffuseMap.Width; float num3 = -2048f / (float)materialByName.DiffuseMap.Width; float num4 = 2047.9375f / (float)materialByName.DiffuseMap.Height; float num5 = -2048f / (float)materialByName.DiffuseMap.Height; float num6 = array[0].X % 1f; float num7 = array[0].Y % 1f; array[1].X = array[1].X - array[0].X + num6; array[1].Y = array[1].Y - array[0].Y + num7; array[2].X = array[2].X - array[0].X + num6; array[2].Y = array[2].Y - array[0].Y + num7; array[0].X = num6; array[0].Y = num7; while (array[0].X <= num3 || array[1].X <= num3 || array[2].X <= num3) { array[0].X += 1f; array[1].X += 1f; array[2].X += 1f; } while (array[0].X >= num2 || array[1].X >= num2 || array[2].X >= num2) { array[0].X -= 1f; array[1].X -= 1f; array[2].X -= 1f; } while (array[0].Y <= num5 || array[1].Y <= num5 || array[2].Y <= num5) { array[0].Y += 1f; array[1].Y += 1f; array[2].Y += 1f; } while (array[0].Y >= num4 || array[1].Y >= num4 || array[2].Y >= num4) { array[0].Y -= 1f; array[1].Y -= 1f; array[2].Y -= 1f; } if (array[0].X <= num3 || array[1].X <= num3 || array[2].X <= num3 || array[0].X >= num2 || array[1].X >= num2 || array[2].X >= num2 || array[0].Y <= num5 || array[1].Y <= num5 || array[2].Y <= num5 || array[0].Y >= num4 || array[1].Y >= num4 || array[2].Y >= num4) { // MessageBox.Show("Your model seems to contain a face which texture is repeated too many to fix. Try splitting the face up, or less repeating the texture before trying again.\r\nMaterial Name: " + face2.MaterialName + "\r\nThere may be more though.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand); return(null); } } oBJ.TexCoords.AddRange(array); var face = new OBJ.Face(); face.MaterialName = face2.MaterialName; face.NormalIndieces = face2.NormalIndieces; face.TexCoordIndieces.AddRange(new int[3] { num, num + 1, num + 2 }); num += 3; face.VertexIndieces = face2.VertexIndieces; oBJ.Faces.Add(face); } return(oBJ); }