/// <summary> /// get parsed obj model /// </summary> /// <returns></returns> public ObjModel GetModel() { if (_model == null) { var modelName = "Untitled"; if (!String.IsNullOrEmpty(_objFile)) { modelName = Path.GetFileNameWithoutExtension(_objFile); } _model = new ObjModel { Name = modelName }; while (!_reader.EndOfStream) { var line = _reader.ReadLine().Trim(); if (String.IsNullOrEmpty(line)) { continue; } if (line.StartsWith("#")) { continue; } if (StartWith(line, "mtllib")) { _model.MatFilename = line.Substring(6).Trim(); } else if (StartWith(line, "v")) { var vStr = line.Substring(1).Trim(); var strs = SplitLine(vStr); var v = new Vec3(double.Parse(strs[0]), double.Parse(strs[1]), double.Parse(strs[2])); _model.Vertices.Add(v); } else if (StartWith(line, "vn")) { var vnStr = line.Substring(2).Trim(); var strs = SplitLine(vnStr); var vn = new Vec3(double.Parse(strs[0]), double.Parse(strs[1]), double.Parse(strs[2])); _model.Normals.Add(vn); } else if (StartWith(line, "vt")) { var vtStr = line.Substring(2).Trim(); var strs = SplitLine(vtStr); var vt = new Vec2(double.Parse(strs[0]), double.Parse(strs[1])); _model.Uvs.Add(vt); } else if (StartWith(line, "g")) { var gStr = line.Substring(1).Trim(); var g = new Geometry { Id = gStr }; _model.Geometries.Add(g); } else if (StartWith(line, "usemtl")) { var umtl = line.Substring(6).Trim(); var g = GetGeometry(); var face = new Face { MatName = umtl }; g.Faces.Add(face); } else if (StartWith(line, "f")) { var fStr = line.Substring(1).Trim(); var g = GetGeometry(); Face face = GetFace(g); var strs = SplitLine(fStr); if (strs.Length < 3) { continue; // ignore face that has less than 3 vertices } if (strs.Length == 3) { var v1 = GetVertex(strs[0]); var v2 = GetVertex(strs[1]); var v3 = GetVertex(strs[2]); var f = new FaceTriangle(v1, v2, v3); face.Triangles.Add(f); } else if (strs.Length == 4) { var v1 = GetVertex(strs[0]); var v2 = GetVertex(strs[1]); var v3 = GetVertex(strs[2]); var f = new FaceTriangle(v1, v2, v3); face.Triangles.Add(f); var v4 = GetVertex(strs[3]); var ff = new FaceTriangle(v1, v3, v4); face.Triangles.Add(ff); } else //if (strs.Length > 4) { var points = new List <Vec3>(); for (var i = 0; i < strs.Length; i++) { var vv = GetVertex(strs[i]); var p = _model.Vertices[vv.V - 1]; points.Add(p); } var planeAxis = GeomUtil.ComputeProjectTo2DArguments(points); if (planeAxis != null) { var points2D = GeomUtil.CreateProjectPointsTo2DFunction(planeAxis, points); var indices = PolygonPipeline.Triangulate(points2D, null); if (indices.Length == 0) { // TODO: } for (var i = 0; i < indices.Length - 2; i += 3) { var vv1 = GetVertex(strs[indices[i]]); var vv2 = GetVertex(strs[indices[i + 1]]); var vv3 = GetVertex(strs[indices[i + 2]]); var ff = new FaceTriangle(vv1, vv2, vv3); face.Triangles.Add(ff); } } else { // TODO: } } } else { //var strs = SplitLine(line); } } if (!String.IsNullOrEmpty(_model.MatFilename)) { var dir = Path.GetDirectoryName(_objFile); var matFile = Path.Combine(dir, _model.MatFilename); using (var mtlParser = new MtlParser(matFile, _encoding)) { var mats = mtlParser.GetMats(); _model.Materials.AddRange(mats); } } } return(_model); }
private Geometry AddGeo(Geometry g, GeomBox box, List <int> pnts, List <int> normals, List <int> uvs) { var gg = new Geometry { Id = g.Id }; var pntList = box.Pnts; // new List<int>(); // var normList = box.Norms; // new List<int>(); // var uvList = box.Uvs; // new List<int>(); // //if (pntList.Count == 0) //{ // foreach (var f in g.Faces) // { // foreach (var t in f.Triangles) // { // var v1 = t.V1; // if (!pntList.Contains(v1.V)) // { // pntList.Add(v1.V); // } // if (v1.N > 0 && !normList.Contains(v1.N)) // { // normList.Add(v1.N); // } // if (v1.T > 0 && !uvList.Contains(v1.T)) // { // uvList.Add(v1.T); // } // var v2 = t.V2; // if (!pntList.Contains(v2.V)) // { // pntList.Add(v2.V); // } // if (v2.N > 0 && !normList.Contains(v2.N)) // { // normList.Add(v2.N); // } // if (v2.T > 0 && !uvList.Contains(v2.T)) // { // uvList.Add(v2.T); // } // var v3 = t.V3; // if (!pntList.Contains(v3.V)) // { // pntList.Add(v3.V); // } // if (v3.N > 0 && !normList.Contains(v3.N)) // { // normList.Add(v3.N); // } // if (v3.T > 0 && !uvList.Contains(v3.T)) // { // uvList.Add(v3.T); // } // } // } //} var pntDict = new Dictionary <int, int>(); var normDict = new Dictionary <int, int>(); var uvDict = new Dictionary <int, int>(); foreach (var p in pntList) { var index = pnts.IndexOf(p); if (index == -1) { index = pnts.Count; pnts.Add(p); } pntDict.Add(p, index + 1); } foreach (var n in normList) { var index = normals.IndexOf(n); if (index == -1) { index = normals.Count; normals.Add(n); } normDict.Add(n, index + 1); } foreach (var t in uvList) { var index = uvs.IndexOf(t); if (index == -1) { index = uvs.Count; uvs.Add(t); } uvDict.Add(t, index + 1); } foreach (var f in g.Faces) { var ff = new Face { MatName = f.MatName }; foreach (var t in f.Triangles) { var v1 = GetVertex(t.V1, pntDict, normDict, uvDict); var v2 = GetVertex(t.V2, pntDict, normDict, uvDict); var v3 = GetVertex(t.V3, pntDict, normDict, uvDict); var fv = new FaceTriangle(v1, v2, v3); ff.Triangles.Add(fv); } gg.Faces.Add(ff); } return(gg); }