Load multiple meshes from obj file

This commit is contained in:
2017-02-27 19:15:00 -05:00
parent 7259f5daf2
commit 1c5491a2c5
5 changed files with 567 additions and 9 deletions

View File

@@ -13,6 +13,8 @@ namespace Diamond
public SubArray<T> Vertices;
public PrimitiveType Primitive;
public string Name { get; set; }
private static VertexDataInfo tVdi;
private static List<VertexPointerAttribute> attribs;
@@ -84,10 +86,11 @@ namespace Diamond
return new Mesh<T>(vertices);
}
public static Mesh<ObjVertex> FromObj(string file)
public static Mesh<ObjVertex>[] FromObj(string file)
{
var lines = File.ReadAllLines(file);
var meshes = new List<Mesh<ObjVertex>>();
var vs = new List<Vector3>();
var vts = new List<Vector2>();
var vns = new List<Vector3>();
@@ -111,7 +114,7 @@ namespace Diamond
case "vt":
var vt = new Vector2(
float.Parse(items[1]),
1-float.Parse(items[2]));
1 - float.Parse(items[2]));
vts.Add(vt);
break;
case "vn":
@@ -125,19 +128,27 @@ namespace Diamond
for (var i = 1; i < 4; i++)
{
var inds = items[i].Split('/');
var vi = vs[int.Parse(inds[0]) - 1];
var vti = vts[int.Parse(inds[1]) - 1];
var vni = vns[int.Parse(inds[2]) - 1];
var vi = inds[0] == "" ? Vector3.Zero : vs[int.Parse(inds[0]) - 1];
var vti = inds[1] == "" ? Vector2.Zero : vts[int.Parse(inds[1]) - 1];
var vni = inds[2] == "" ? Vector3.Zero : vns[int.Parse(inds[2]) - 1];
var f = new ObjVertex(vi, vti, vni);
faces.Add(f);
}
break;
case "o":
if (faces.Count > 0)
{
meshes.Add(new Mesh<ObjVertex>(faces.ToArray()));
faces.Clear();
}
break;
}
}
var vertices = faces.ToArray();
if (faces.Count > 0)
meshes.Add(new Mesh<ObjVertex>(faces.ToArray()));
return new Mesh<ObjVertex>(vertices);
return meshes.ToArray();
}
public static T[] Join<T>(params Mesh<T>[] meshes) where T : struct => Join((IEnumerable<Mesh<T>>) meshes);