private OBJGroup getOrCreateGroup(string name) { for (int i = 0; i < Groups.Count; i++) { if (Groups[i].Name == name) { return(Groups[i]); } } var group = new OBJGroup(name); Groups.Add(group); return(group); }
private MeshCollisionData.TriangleMeshData createTriangleMeshForGroup(ObjImporter importer, OBJGroup group) { var positions = new List <Vector3>(); for (int j = 0; j < group.SubObjects.Count; j++) { var subObj = group.SubObjects[j]; addPositionsFromSubObject(importer, subObj, positions); } int[] indices = createIndices(positions.Count * 3); var tm = new MeshCollisionData.TriangleMeshData(); tm.Positions = positions.ToArray(); tm.Indices = indices; return(tm); }
public void ImportObjFile(Stream fileStream) { StreamReader textReader = new StreamReader(fileStream); Vertices = new List <Vector3>(); Normals = new List <Vector3>(); TexCoords = new List <Vector3>(); Groups = new List <OBJGroup>(); Materials = new List <OBJMaterial>(); activeGroup = null; Vertices.Add(Vector3.Zero); // Indices following are 1 indexed, so add a dummy element as 0-th index Normals.Add(Vector3.Zero); TexCoords.Add(Vector3.Zero); /*List<Vector3> positions = new List<Vector3>(); * List<Vector3> normals = new List<Vector3>(); * List<Vector2> textureCoords = new List<Vector2>();*/ string line = null; while (textReader.Peek() != -1) { line = textReader.ReadLine(); //line = line.Replace('.', ','); if (line.StartsWith("#")) { continue; } string[] pieces = line.Split(' '); string cmd = pieces[0]; int dataStart = 1; while (pieces.Length > dataStart && pieces[dataStart] == "") { dataStart++; } switch (cmd) { case "v": Vector3 v; v.X = float.Parse(pieces[dataStart + 0], culture.NumberFormat); v.Y = float.Parse(pieces[dataStart + 1], culture.NumberFormat); v.Z = float.Parse(pieces[dataStart + 2], culture.NumberFormat); Vertices.Add(v); break; case "vn": Vector3 vn; vn.X = float.Parse(pieces[dataStart + 0], culture.NumberFormat); vn.Y = float.Parse(pieces[dataStart + 1], culture.NumberFormat); vn.Z = float.Parse(pieces[dataStart + 2], culture.NumberFormat); Normals.Add(vn); break; case "vt": Vector3 vt; vt.X = float.Parse(pieces[dataStart + 0], culture.NumberFormat); vt.Y = float.Parse(pieces[dataStart + 1], culture.NumberFormat); vt.Z = pieces.Length < 4 ? 0 : float.Parse(pieces[dataStart + 2], culture.NumberFormat); TexCoords.Add(vt); break; case "g": activeGroup = getOrCreateGroup(pieces[dataStart]); updateActiveSubObject(); /*if (meshPart.AdditionalData.Name != null || meshPart.AdditionalData.Name == "") * { * meshPart = new EditorMeshPart(); * meshPart.AdditionalData.Name = pieces[1]; * createMeshPart(); * } * meshPart = new EditorMeshPart(); * meshPart.AdditionalData.Name = pieces[1];*/ break; case "usemtl": activeMaterial = GetOrCreateMaterial(pieces[dataStart]); updateActiveSubObject(); break; case "f": Face face = new Face(); //TODO: check first index face.V1 = ParseFaceVertex(pieces[dataStart + 0]); face.V2 = ParseFaceVertex(pieces[dataStart + 1]); face.V3 = ParseFaceVertex(pieces[dataStart + 2]); if (activeSubObject == null) { throw new InvalidOperationException( "A face was found that does not seem to belong to any object??"); } activeSubObject.Faces.Add(face); break; case "mtllib": Stream matStream; if (materialFileStreams.TryGetValue(pieces[dataStart], out matStream)) { importMaterialFile(matStream); } else { Console.WriteLine("OBJ Material Library not found: " + pieces[dataStart]); } break; } } //createMeshPart(); //return mesh; materialFileStreams = new Dictionary <string, Stream>(); }