private ObjVNFFace ParseFace(string[] parts) { ObjVNFFace result = null; if (parts.Length == 4)// f 1 2 3 { uint v0, v1, v2, n0, n1, n2, t0, t1, t2; ParseFaceUnit(parts[1], out v0, out n0, out t0); ParseFaceUnit(parts[2], out v1, out n1, out t1); ParseFaceUnit(parts[3], out v2, out n2, out t2); // index in obj files starts with 1. result = new ObjVNFTriangle(v0 - 1, v1 - 1, v2 - 1, n0 - 1, n1 - 1, n2 - 1, t0 - 1, t1 - 1, t2 - 1); } else if (parts.Length == 5)// f 1 2 3 4 { uint v0, v1, v2, v3, n0, n1, n2, n3, t0, t1, t2, t3; ParseFaceUnit(parts[1], out v0, out n0, out t0); ParseFaceUnit(parts[2], out v1, out n1, out t1); ParseFaceUnit(parts[3], out v2, out n2, out t2); ParseFaceUnit(parts[4], out v3, out n3, out t3); // index in obj files starts with 1. result = new ObjVNFQuad(v0 - 1, v1 - 1, v2 - 1, v3 - 1, n0 - 1, n1 - 1, n2 - 1, n3 - 1, t0 - 1, t1 - 1, t2 - 1, t3 - 1); } else { throw new Exception(string.Format("unexpected line parts[{0}]", parts.Length)); } return(result); }
/// <summary> /// Reads mesh's vertex count, normal count and face count. /// </summary> /// <param name="context"></param> public override void Parse(ObjVNFContext context) { int triangleFaceCount = 0; ObjVNFMesh mesh = context.Mesh; for (int i = 0; i < context.faceCount; i++) { ObjVNFFace face = mesh.faces[i]; uint[] normalIndexes = (from item in face.NormalIndexes() select item).ToArray(); uint[] vertexIndexes = (from item in face.VertexIndexes() select item).ToArray(); if (normalIndexes.Length != vertexIndexes.Length) { throw new Exception(string.Format( "normalIndexes.Length [{0}] != vertexIndexes.Length [{0}]!", normalIndexes.Length, vertexIndexes.Length)); } if (face is ObjVNFTriangle) { triangleFaceCount++; } else if (face is ObjVNFQuad) { triangleFaceCount += 2; } } if (triangleFaceCount != context.faceCount) { var faces = new ObjVNFTriangle[triangleFaceCount]; for (int i = 0, j = 0; i < context.faceCount; i++) { ObjVNFFace face = mesh.faces[i]; if (face is ObjVNFTriangle) { faces[j++] = face as ObjVNFTriangle; } else if (face is ObjVNFQuad) { var quad = face as ObjVNFQuad; faces[j++] = new ObjVNFTriangle( quad.vertexIndexes[0], quad.vertexIndexes[1], quad.vertexIndexes[2], quad.normalIndexes[0], quad.normalIndexes[1], quad.normalIndexes[2], quad.texCoordIndexes[0], quad.texCoordIndexes[1], quad.texCoordIndexes[2]); faces[j++] = new ObjVNFTriangle( quad.vertexIndexes[0], quad.vertexIndexes[2], quad.vertexIndexes[3], quad.normalIndexes[0], quad.normalIndexes[2], quad.normalIndexes[3], quad.texCoordIndexes[0], quad.texCoordIndexes[2], quad.texCoordIndexes[3]); } } mesh.faces = faces; context.faceCount = triangleFaceCount; } }
/// <summary> /// Reads mesh's vertex count, normal count and face count. /// </summary> /// <param name="context"></param> public override void Parse(ObjVNFContext context) { int triangleFaceCount = 0; ObjVNFMesh mesh = context.Mesh; for (int i = 0; i < context.faceCount; i++) { ObjVNFFace face = mesh.faces[i]; uint[] vertexIndexes = face.VertexIndexes(); if (face is ObjVNFTriangle) { triangleFaceCount++; } else if (face is ObjVNFQuad) { triangleFaceCount += 2; } } if (triangleFaceCount != context.faceCount) { var faces = new ObjVNFTriangle[triangleFaceCount]; for (int i = 0, j = 0; i < context.faceCount; i++) { ObjVNFFace face = mesh.faces[i]; if (face is ObjVNFTriangle) { faces[j++] = face as ObjVNFTriangle; } else if (face is ObjVNFQuad) { var quad = face as ObjVNFQuad; faces[j++] = new ObjVNFTriangle( quad.vertexIndexes[0], quad.vertexIndexes[1], quad.vertexIndexes[2], quad.normalIndexes[0], quad.normalIndexes[1], quad.normalIndexes[2], quad.texCoordIndexes[0], quad.texCoordIndexes[1], quad.texCoordIndexes[2]); faces[j++] = new ObjVNFTriangle( quad.vertexIndexes[0], quad.vertexIndexes[2], quad.vertexIndexes[3], quad.normalIndexes[0], quad.normalIndexes[2], quad.normalIndexes[3], quad.texCoordIndexes[0], quad.texCoordIndexes[2], quad.texCoordIndexes[3]); } } mesh.faces = faces; context.faceCount = triangleFaceCount; } }