public static Tuple <List <NVRVertex>, List <int> > GetGeometryFromOBJ(OBJFile objFile) { List <NVRVertex> vertices = new List <NVRVertex>(); List <int> indices = new List <int>(); // We first add all the vertices in a list. List <NVRVertex> objVertices = new List <NVRVertex>(); foreach (Vector3 position in objFile.Vertices) { objVertices.Add(new NVRVertex8(position)); } foreach (OBJFace face in objFile.Faces) { for (int i = 0; i < 3; i++) { NVRVertex8 position = (NVRVertex8)objVertices[(int)face.VertexIndices[i]]; Vector2 UV = new Vector2(0, 0); if (objFile.UVs.Count > 0) { UV = objFile.UVs[(int)face.UVIndices[i]]; } Vector3 normal = new Vector3(0, 0, 0); if (objFile.Normals.Count > 0) { normal = objFile.Normals[(int)face.NormalIndices[i]]; } if ((position.UV != null && position.Normal != null) && (!position.UV.Equals(UV) || !position.Normal.Equals(normal))) { // Needs to replicate position = new NVRVertex8(position.Position); } position.UV = UV; position.Normal = normal; position.DiffuseColor = new Color(0, 0, 0, 255); position.EmissiveColor = new Color(0.5f, 0.5f, 0.5f, 1f); int vertexIndex = vertices.IndexOf(position); if (vertexIndex == -1) { vertexIndex = vertices.Count; vertices.Add(position); } indices.Add(vertexIndex); } } //for (int i = 0; i < indices.Count; i += 3) //{ // NVRVertex8 v1 = (NVRVertex8)vertices[indices[i]]; // NVRVertex8 v2 = (NVRVertex8)vertices[indices[i + 1]]; // NVRVertex8 v3 = (NVRVertex8)vertices[indices[i + 2]]; // Vector3 faceNormal = CalcNormal(v1.Position, v2.Position, v3.Position); // v1.Normal = v1.Normal + faceNormal; // v2.Normal = v2.Normal + faceNormal; // v3.Normal = v3.Normal + faceNormal; //} //foreach (NVRVertex8 vert in vertices) //{ // float length = (float)Math.Sqrt(Math.Pow(vert.Normal.X, 2) + Math.Pow(vert.Normal.Y, 2) + Math.Pow(vert.Normal.Z, 2)); // vert.Normal.X = vert.Normal.X / length; // vert.Normal.Y = vert.Normal.Y / length; // vert.Normal.Z = vert.Normal.Z / length; //} return(new Tuple <List <NVRVertex>, List <int> >(vertices, indices)); }