using UnityEngine; using System.Collections; using System.IO; using System.Text; namespace LunarCatsStudio.SuperCombiner { /// /// This class is responsible for saving meshes in .obj file /// public class ObjSaver { // Used for exporting to .obj public static int _StartIndex = 0; public static void SaveObjFile(GameObject obj, bool makeSubmeshes, string floderPath) { string meshName = obj.name; string fileName = floderPath + "/" + meshName + ".obj"; _StartIndex = 0; StringBuilder meshString = new StringBuilder(); meshString.Append("#" + meshName + ".obj" + "\n#" + System.DateTime.Now.ToLongDateString() + "\n#" + System.DateTime.Now.ToLongTimeString() + "\n#-------" + "\n\n"); Transform t = obj.transform; Vector3 originalPosition = t.position; t.position = Vector3.zero; if (!makeSubmeshes) { meshString.Append("g ").Append(t.name).Append("\n"); } meshString.Append(processTransform(t, makeSubmeshes)); WriteToFile(meshString.ToString(),fileName); t.position = originalPosition; _StartIndex = 0; } static void WriteToFile(string s, string filename) { using (StreamWriter sw = new StreamWriter(filename)) { sw.Write(s); } } static string processTransform(Transform t, bool makeSubmeshes) { StringBuilder meshString = new StringBuilder(); meshString.Append("#" + t.name + "\n#-------" + "\n"); if (makeSubmeshes) { meshString.Append("g ").Append(t.name).Append("\n"); } MeshFilter mf = t.GetComponent(); SkinnedMeshRenderer skinned = t.GetComponent(); if (mf) { meshString.Append(MeshToString(mf.sharedMesh, mf.GetComponent().sharedMaterials, t)); } if (skinned) { meshString.Append(MeshToString(skinned.sharedMesh, skinned.sharedMaterials , t)); } for(int i = 0; i < t.childCount; i++) { meshString.Append(processTransform(t.GetChild(i), makeSubmeshes)); } return meshString.ToString(); } public static string MeshToString(Mesh m, Material[] mats, Transform t) { /*Vector3 s = t.localScale; Vector3 p = t.localPosition;*/ Quaternion r = t.localRotation; int numVertices = 0; if (!m) { return "####Error####"; } StringBuilder sb = new StringBuilder(); foreach(Vector3 vv in m.vertices) { Vector3 v = t.TransformPoint(vv); numVertices++; // inverting x-component since we're in a different coordinate system than "everyone" is "used to". sb.Append(string.Format("v {0} {1} {2}\n",v.x,v.y,-v.z)); //sb.Append(string.Format("v {0} {1} {2}\n",v.x,v.y,v.z)); } sb.Append("\n"); foreach(Vector3 nn in m.normals) { Vector3 v = r * nn; sb.Append(string.Format("vn {0} {1} {2}\n",-v.x,-v.y,v.z)); //sb.Append(string.Format("vn {0} {1} {2}\n",v.x,v.y,v.z)); } sb.Append("\n"); foreach(Vector3 v in m.uv) { sb.Append(string.Format("vt {0} {1}\n",v.x,v.y)); } for (int material=0; material < m.subMeshCount; material ++) { sb.Append("\n"); sb.Append("usemtl ").Append(mats[material].name).Append("\n"); sb.Append("usemap ").Append(mats[material].name).Append("\n"); int[] triangles = m.GetTriangles(material); for (int i=0;i