static void MakeMeshNoUVCol(MegaCacheOBJMesh newMesh, Mesh mesh, bool adjust, bool recalcnormals, bool tangents) { int v1 = 0; int v2 = 1; int v3 = 2; int v4 = 3; Vector3 n1 = Vector3.forward; Vector3 n2 = Vector3.forward; Vector3 n3 = Vector3.forward; Vector3 n4 = Vector3.forward; Vector2 uv = Vector2.zero; for (int t = 0; t < newMesh.faces.Count; t++) { MegaCacheOBJFace f = newMesh.faces[t]; if (newMesh.normals.Count > 0) { n1 = newMesh.normals[f.n[v1]]; n2 = newMesh.normals[f.n[v2]]; n3 = newMesh.normals[f.n[v3]]; if (f.quad) { n4 = newMesh.normals[f.n[v4]]; } } if (adjust) { faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v3]], newMesh.vertices[f.v[v2]], n1, n3, n2, uv, uv, uv, newMesh.cols[f.v[v1]], newMesh.cols[f.v[v3]], newMesh.cols[f.v[v2]], 1, f.mtl)); } else { faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v2]], newMesh.vertices[f.v[v3]], n1, n2, n3, uv, uv, uv, newMesh.cols[f.v[v1]], newMesh.cols[f.v[v2]], newMesh.cols[f.v[v3]], 1, f.mtl)); } if (f.quad) { if (adjust) { faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v4]], newMesh.vertices[f.v[v3]], n1, n4, n3, uv, uv, uv, newMesh.cols[f.v[v1]], newMesh.cols[f.v[v4]], newMesh.cols[f.v[v3]], 1, f.mtl)); } else { faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v3]], newMesh.vertices[f.v[v4]], n1, n3, n4, uv, uv, uv, newMesh.cols[f.v[v1]], newMesh.cols[f.v[v3]], newMesh.cols[f.v[v4]], 1, f.mtl)); } } } MegaCacheMeshConstructorOBJNoUVCol.Construct(faces, mesh, newMesh.vertices.ToArray(), false, recalcnormals, tangents); }
static public Mesh ImportFile(string filePath, float scale, bool adjust, bool tangents, bool loadmtls, bool optimize, bool recalcnormals) { faces.Clear(); importpath = Path.GetDirectoryName(filePath); StreamReader stream = File.OpenText(filePath); string entireText = stream.ReadToEnd(); stream.Close(); MegaCacheOBJMesh newMesh = new MegaCacheOBJMesh(); populateMeshStructNew(entireText, ref newMesh, loadmtls); Mesh mesh = new Mesh(); int v1 = 0; int v2 = 1; int v3 = 2; int v4 = 3; currentmtl = 0; smthgrp = 0; for (int i = 0; i < newMesh.vertices.Count; i++) { newMesh.vertices[i] *= scale; if (adjust) { Vector3 p = newMesh.vertices[i]; p.x = -p.x; newMesh.vertices[i] = p; } } for (int i = 0; i < newMesh.normals.Count; i++) { Vector3 p = newMesh.normals[i]; p.x = -p.x; newMesh.normals[i] = p; } Vector3 n1 = Vector3.forward; Vector3 n2 = Vector3.forward; Vector3 n3 = Vector3.forward; Vector3 n4 = Vector3.forward; if (newMesh.normals.Count == 0) { recalcnormals = true; } if (newMesh.uv.Count == 0) { for (int t = 0; t < newMesh.faces.Count; t++) { MegaCacheOBJFace f = newMesh.faces[t]; if (newMesh.normals.Count > 0) { n1 = newMesh.normals[f.n[v1]]; n2 = newMesh.normals[f.n[v2]]; n3 = newMesh.normals[f.n[v3]]; if (f.quad) { n4 = newMesh.normals[f.n[v4]]; } } if (adjust) { faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v3]], newMesh.vertices[f.v[v2]], n1, n3, n2, Vector3.zero, Vector3.zero, Vector3.zero, 1, f.mtl)); } else { faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v2]], newMesh.vertices[f.v[v3]], n1, n2, n3, Vector3.zero, Vector3.zero, Vector3.zero, 1, f.mtl)); } if (f.quad) { if (adjust) { faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v4]], newMesh.vertices[f.v[v3]], n1, n4, n3, Vector3.zero, Vector3.zero, Vector3.zero, 1, f.mtl)); } else { faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v3]], newMesh.vertices[f.v[v4]], n1, n3, n4, Vector3.zero, Vector3.zero, Vector3.zero, 1, f.mtl)); } } } MegaCacheMeshConstructorOBJNoUV.Construct(faces, mesh, newMesh.vertices.ToArray(), false, recalcnormals, tangents); } else { for (int t = 0; t < newMesh.faces.Count; t++) { MegaCacheOBJFace f = newMesh.faces[t]; if (newMesh.normals.Count > 0) { n1 = newMesh.normals[f.n[v1]]; n2 = newMesh.normals[f.n[v2]]; n3 = newMesh.normals[f.n[v3]]; if (f.quad) { n4 = newMesh.normals[f.n[v4]]; } } if (adjust) { faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v3]], newMesh.vertices[f.v[v2]], n1, n3, n2, newMesh.uv[f.uv[v1]], newMesh.uv[f.uv[v3]], newMesh.uv[f.uv[v2]], 1, f.mtl)); } else { faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v2]], newMesh.vertices[f.v[v3]], n1, n2, n3, newMesh.uv[f.uv[v1]], newMesh.uv[f.uv[v2]], newMesh.uv[f.uv[v3]], 1, f.mtl)); } if (f.quad) { if (adjust) { faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v4]], newMesh.vertices[f.v[v3]], n1, n4, n3, newMesh.uv[f.uv[v1]], newMesh.uv[f.uv[v4]], newMesh.uv[f.uv[v3]], 1, f.mtl)); } else { faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v3]], newMesh.vertices[f.v[v4]], n1, n3, n4, newMesh.uv[f.uv[v1]], newMesh.uv[f.uv[v3]], newMesh.uv[f.uv[v4]], 1, f.mtl)); } } } MegaCacheMeshConstructorOBJ.Construct(faces, mesh, newMesh.vertices.ToArray(), false, recalcnormals, tangents); } return(mesh); }
static void populateMeshStructNew(string entireText, ref MegaCacheOBJMesh mesh, bool loadmtls) { offset = 0; string currentText = ReadLine(entireText); char[] splitIdentifier = { ' ' }; char[] splitIdentifier2 = { '/' }; string[] brokenString; string[] brokenBrokenString; //int smthgrp = -1; while (currentText != null) { currentText = currentText.Trim(); brokenString = currentText.Split(splitIdentifier, 50); switch (brokenString[0]) { case "g": break; case "usemtl": brokenString[1] = brokenString[1].Replace(':', '_'); if (loadmtls) { currentmtl = GetMtlID(brokenString[1]); } else { currentmtl = 0; } break; case "usemap": break; case "mtllib": if (loadmtls) { string p = importpath + "/" + brokenString[1]; LoadMtlLib(p); } break; case "v": mesh.vertices.Add(new Vector3(float.Parse(brokenString[1]), float.Parse(brokenString[2]), float.Parse(brokenString[3]))); break; case "vt": mesh.uv.Add(new Vector2(float.Parse(brokenString[1]), float.Parse(brokenString[2]))); break; case "vt1": mesh.uv1.Add(new Vector2(float.Parse(brokenString[1]), float.Parse(brokenString[2]))); break; case "vt2": mesh.uv2.Add(new Vector2(float.Parse(brokenString[1]), float.Parse(brokenString[2]))); break; case "vn": mesh.normals.Add(new Vector3(float.Parse(brokenString[1]), float.Parse(brokenString[2]), float.Parse(brokenString[3]))); break; case "vc": break; case "f": int j = 1; MegaCacheOBJFace oface = new MegaCacheOBJFace(); oface.mtl = currentmtl; oface.smthgrp = smthgrp; while (j < brokenString.Length && ("" + brokenString[j]).Length > 0) { brokenBrokenString = brokenString[j].Split(splitIdentifier2, 3); if (j == 4) { oface.quad = true; } oface.v[j - 1] = int.Parse(brokenBrokenString[0]) - 1; if (brokenBrokenString.Length > 1) { if (brokenBrokenString[1] != "") { oface.uv[j - 1] = int.Parse(brokenBrokenString[1]) - 1; } if (brokenBrokenString.Length > 2) { oface.n[j - 1] = int.Parse(brokenBrokenString[2]) - 1; } } j++; } mesh.faces.Add(oface); break; case "s": //if ( brokenString[1] == "off" ) //smthgrp = -1; //else //smthgrp = int.Parse(brokenString[1]); break; } currentText = ReadLine(entireText); if (currentText != null) { currentText = currentText.Replace(" ", " "); } } }
static void populateMeshStructNew(string entireText, ref MegaCacheOBJMesh mesh, bool loadmtls) { offset = 0; string currentText = ReadLine(entireText); char[] splitIdentifier = { ' ' }; char[] splitIdentifier2 = { '/' }; string[] brokenString; string[] brokenBrokenString; while ( currentText != null ) { currentText = currentText.Trim(); brokenString = currentText.Split(splitIdentifier, 50); switch ( brokenString[0] ) { case "g": break; case "usemtl": currentmtl = GetMtlID(brokenString[1]); break; case "usemap": break; case "mtllib": break; case "v": mesh.vertices.Add(new Vector3(float.Parse(brokenString[1]), float.Parse(brokenString[2]), float.Parse(brokenString[3]))); break; case "vt": mesh.uv.Add(new Vector2(float.Parse(brokenString[1]), float.Parse(brokenString[2]))); break; case "vt1": mesh.uv1.Add(new Vector2(float.Parse(brokenString[1]), float.Parse(brokenString[2]))); break; case "vt2": mesh.uv2.Add(new Vector2(float.Parse(brokenString[1]), float.Parse(brokenString[2]))); break; case "vn": mesh.normals.Add(new Vector3(float.Parse(brokenString[1]), float.Parse(brokenString[2]), float.Parse(brokenString[3]))); break; case "vc": break; case "f": int j = 1; MegaCacheOBJFace oface = new MegaCacheOBJFace(); oface.mtl = currentmtl; oface.smthgrp = smthgrp; while ( j < brokenString.Length && ("" + brokenString[j]).Length > 0 ) { brokenBrokenString = brokenString[j].Split(splitIdentifier2, 3); if ( j == 4 ) oface.quad = true; oface.v[j - 1] = int.Parse(brokenBrokenString[0]) - 1; if ( brokenBrokenString.Length > 1 ) { if ( brokenBrokenString[1] != "" ) oface.uv[j - 1] = int.Parse(brokenBrokenString[1]) - 1; if ( brokenBrokenString.Length > 2 ) oface.n[j - 1] = int.Parse(brokenBrokenString[2]) - 1; } j++; } mesh.faces.Add(oface); break; case "s": break; } currentText = ReadLine(entireText); if ( currentText != null ) currentText = currentText.Replace(" ", " "); } }
public static Mesh ImportFile(string filePath, float scale, bool adjust, bool tangents, bool loadmtls) { faces.Clear(); StreamReader stream = File.OpenText(filePath); string entireText = stream.ReadToEnd(); stream.Close(); MegaCacheOBJMesh newMesh = new MegaCacheOBJMesh(); populateMeshStructNew(entireText, ref newMesh, loadmtls); Mesh mesh = new Mesh(); int v1 = 0; int v2 = 1; int v3 = 2; int v4 = 3; currentmtl = 0; smthgrp = 0; for ( int i = 0; i < newMesh.vertices.Count; i++ ) { newMesh.vertices[i] *= scale; if ( adjust ) { Vector3 p = newMesh.vertices[i]; p.x = -p.x; newMesh.vertices[i] = p; } } for ( int i = 0; i < newMesh.normals.Count; i++ ) { Vector3 p = newMesh.normals[i]; p.x = -p.x; newMesh.normals[i] = p; } Vector3 n1 = Vector3.forward; Vector3 n2 = Vector3.forward; Vector3 n3 = Vector3.forward; Vector3 n4 = Vector3.forward; if ( newMesh.uv.Count == 0 ) { for ( int t = 0; t < newMesh.faces.Count; t++ ) { MegaCacheOBJFace f = newMesh.faces[t]; if ( newMesh.normals.Count > 0 ) { n1 = newMesh.normals[f.n[v1]]; n2 = newMesh.normals[f.n[v2]]; n3 = newMesh.normals[f.n[v3]]; if ( f.quad ) n4 = newMesh.normals[f.n[v4]]; } if ( adjust ) faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v3]], newMesh.vertices[f.v[v2]], n1, n3, n2, Vector3.zero, Vector3.zero, Vector3.zero, 1, f.mtl)); else faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v2]], newMesh.vertices[f.v[v3]], n1, n2, n3, Vector3.zero, Vector3.zero, Vector3.zero, 1, f.mtl)); if ( f.quad ) { if ( adjust ) faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v4]], newMesh.vertices[f.v[v3]], n1, n4, n3, Vector3.zero, Vector3.zero, Vector3.zero, 1, f.mtl)); else faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v3]], newMesh.vertices[f.v[v4]], n1, n3, n4, Vector3.zero, Vector3.zero, Vector3.zero, 1, f.mtl)); } } MegaCacheMeshConstructorOBJNoUV.Construct(faces, mesh, newMesh.vertices.ToArray(), true, false, tangents); } else { for ( int t = 0; t < newMesh.faces.Count; t++ ) { MegaCacheOBJFace f = newMesh.faces[t]; if ( newMesh.normals.Count > 0 ) { n1 = newMesh.normals[f.n[v1]]; n2 = newMesh.normals[f.n[v2]]; n3 = newMesh.normals[f.n[v3]]; if ( f.quad ) n4 = newMesh.normals[f.n[v4]]; } if ( adjust ) faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v3]], newMesh.vertices[f.v[v2]], n1, n3, n2, newMesh.uv[f.uv[v1]], newMesh.uv[f.uv[v3]], newMesh.uv[f.uv[v2]], 1, f.mtl)); else faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v2]], newMesh.vertices[f.v[v3]], n1, n2, n3, newMesh.uv[f.uv[v1]], newMesh.uv[f.uv[v2]], newMesh.uv[f.uv[v3]], 1, f.mtl)); if ( f.quad ) { if ( adjust ) faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v4]], newMesh.vertices[f.v[v3]], n1, n4, n3, newMesh.uv[f.uv[v1]], newMesh.uv[f.uv[v4]], newMesh.uv[f.uv[v3]], 1, f.mtl)); else faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v3]], newMesh.vertices[f.v[v4]], n1, n3, n4, newMesh.uv[f.uv[v1]], newMesh.uv[f.uv[v3]], newMesh.uv[f.uv[v4]], 1, f.mtl)); } } MegaCacheMeshConstructorOBJ.Construct(faces, mesh, newMesh.vertices.ToArray(), false, false, tangents); } return mesh; }