public OBJMaterial GetOrCreateMaterial(string name) { for (int i = 0; i < Materials.Count; i++) { if (Materials[i].Name == name) { return(Materials[i]); } } var mat = new OBJMaterial { Name = name }; Materials.Add(mat); return(mat); }
/// <summary> /// When null is given, the default SubObject /// </summary> /// <param name="mat"></param> /// <returns></returns> public SubObject GetOrCreateSubObject(OBJMaterial mat) { if (mat == null) { return(DefaultSubObject); } for (int i = 0; i < SubObjects.Count; i++) { if (SubObjects[i].Material == mat) { return(SubObjects[i]); } } SubObject obj = new SubObject(); SubObjects.Add(obj); obj.Material = mat; return(obj); }
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>(); }
private void importMaterialFile(Stream fileStream) { StreamReader textReader = new StreamReader(fileStream); OBJMaterial readingMaterial = null; string line = null; while (textReader.Peek() != -1) { //TODO: remove tabs!!! //TODO: make a seperate reader for this kind of file line = textReader.ReadLine().Trim(new[] { ' ', '\t' }); //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 "newmtl": readingMaterial = GetOrCreateMaterial(pieces[dataStart]); break; case "Ns": if (readingMaterial == null) { throw new InvalidOperationException("File format invalid!"); } readingMaterial.SpecularExponent = float.Parse(pieces[dataStart], culture); break; case "Ka": if (readingMaterial == null) { throw new InvalidOperationException("File format invalid!"); } readingMaterial.AmbientColor = readColor(pieces, dataStart); break; case "Kd": if (readingMaterial == null) { throw new InvalidOperationException("File format invalid!"); } readingMaterial.DiffuseColor = readColor(pieces, dataStart); break; case "Ks": if (readingMaterial == null) { throw new InvalidOperationException("File format invalid!"); } readingMaterial.SpecularColor = readColor(pieces, dataStart); break; case "map_Ka": if (readingMaterial == null) { throw new InvalidOperationException("File format invalid!"); } string pathKa = line.Substring(line.IndexOf("map_Ka") + ("map_Ka").Length).Trim(); readingMaterial.AmbientMap = fixFileUrl(pathKa); break; case "map_Kd": if (readingMaterial == null) { throw new InvalidOperationException("File format invalid!"); } string pathKd = line.Substring(line.IndexOf("map_Kd") + ("map_Kd").Length).Trim(); readingMaterial.DiffuseMap = fixFileUrl(pathKd); break; case "map_Ks": if (readingMaterial == null) { throw new InvalidOperationException("File format invalid!"); } string pathKs = line.Substring(line.IndexOf("map_Ks") + ("map_Ks").Length).Trim(); readingMaterial.SpecularMap = fixFileUrl(pathKs); break; case "map_bump": if (readingMaterial == null) { throw new InvalidOperationException("File format invalid!"); } string pathbump = line.Substring(line.IndexOf("map_bump") + ("map_bump").Length).Trim(); readingMaterial.BumpMap = fixFileUrl(pathbump); break; } } //createMeshPart(); //return mesh; materialFileStreams = new Dictionary <string, Stream>(); }