Skip to content

Commit

Permalink
namespacing for ObjExporter
Browse files Browse the repository at this point in the history
  • Loading branch information
i-saint committed Jan 15, 2018
1 parent d0de740 commit 9f17e6f
Showing 1 changed file with 151 additions and 148 deletions.
299 changes: 151 additions & 148 deletions NormalPainter/Assets/UTJ/NormalPainter/Editor/ObjExporter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,200 +4,203 @@
using System.IO;
using System.Text;

public class ObjExporter
namespace UTJ.NormalPainter
{
public class Settings
public class ObjExporter
{
public bool includeChildren = true;
public bool makeSubmeshes = true;
public bool applyTransform = true;
public bool flipHandedness = true;
public bool flipFaces = false;

public bool normals = true;
public bool uv = true;
}
public class Settings
{
public bool includeChildren = true;
public bool makeSubmeshes = true;
public bool applyTransform = true;
public bool flipHandedness = true;
public bool flipFaces = false;

public bool normals = true;
public bool uv = true;
}

public static bool Export(GameObject go, string path, Settings settings)
{
if (path == null || path.Length == 0 || go == null)
return false;
public static bool Export(GameObject go, string path, Settings settings)
{
if (path == null || path.Length == 0 || go == null)
return false;

var inst = new ObjExporter();
inst.DoExport(go, path, settings);
return true;
}
var inst = new ObjExporter();
inst.DoExport(go, path, settings);
return true;
}


Settings m_settings;
int m_startIndex;
Settings m_settings;
int m_startIndex;

void DoExport(GameObject go, string path, Settings settings)
{
m_settings = settings;
void DoExport(GameObject go, string path, Settings settings)
{
m_settings = settings;

StringBuilder meshString = new StringBuilder();
meshString.Append("#" + go.name + ".obj"
+ "\n#" + System.DateTime.Now.ToLongDateString()
+ "\n#" + System.DateTime.Now.ToLongTimeString()
+ "\n#-------"
+ "\n\n");
StringBuilder meshString = new StringBuilder();
meshString.Append("#" + go.name + ".obj"
+ "\n#" + System.DateTime.Now.ToLongDateString()
+ "\n#" + System.DateTime.Now.ToLongTimeString()
+ "\n#-------"
+ "\n\n");

Transform t = go.transform;
Vector3 originalPosition = t.position;
t.position = Vector3.zero;
Transform t = go.transform;
Vector3 originalPosition = t.position;
t.position = Vector3.zero;

if (!m_settings.makeSubmeshes)
meshString.Append("g ").Append(t.name).Append("\n");
meshString.Append(ProcessTransform(t, m_settings.makeSubmeshes));
if (!m_settings.makeSubmeshes)
meshString.Append("g ").Append(t.name).Append("\n");
meshString.Append(ProcessTransform(t, m_settings.makeSubmeshes));

WriteToFile(meshString.ToString(), path);
WriteToFile(meshString.ToString(), path);

t.position = originalPosition;
t.position = originalPosition;

Debug.Log("Exported Mesh: " + path);
}
Debug.Log("Exported Mesh: " + path);
}


string ProcessTransform(Transform t, bool makeSubmeshes)
{
StringBuilder meshString = new StringBuilder();
string ProcessTransform(Transform t, bool makeSubmeshes)
{
StringBuilder meshString = new StringBuilder();

meshString.Append("#" + t.name
+ "\n#-------"
+ "\n");
meshString.Append("#" + t.name
+ "\n#-------"
+ "\n");

if (makeSubmeshes)
meshString.Append("g ").Append(t.name).Append("\n");
if (makeSubmeshes)
meshString.Append("g ").Append(t.name).Append("\n");

Mesh mesh = null;
Material[] materials = null;
{
var mf = t.GetComponent<MeshFilter>();
if (mf != null)
mesh = mf.sharedMesh;
else
Mesh mesh = null;
Material[] materials = null;
{
var smi = t.GetComponent<SkinnedMeshRenderer>();
if (smi != null)
mesh = smi.sharedMesh;
var mf = t.GetComponent<MeshFilter>();
if (mf != null)
mesh = mf.sharedMesh;
else
{
var smi = t.GetComponent<SkinnedMeshRenderer>();
if (smi != null)
mesh = smi.sharedMesh;
}

var renderer = t.GetComponent<Renderer>();
if (renderer != null)
materials = renderer.sharedMaterials;
}

var renderer = t.GetComponent<Renderer>();
if (renderer != null)
materials = renderer.sharedMaterials;
}
if (mesh != null)
meshString.Append(MeshToString(mesh, materials, t));

if (mesh != null)
meshString.Append(MeshToString(mesh, materials, t));
if (m_settings.includeChildren)
{
for (int i = 0; i < t.childCount; i++)
meshString.Append(ProcessTransform(t.GetChild(i), makeSubmeshes));
}

if (m_settings.includeChildren)
{
for (int i = 0; i < t.childCount; i++)
meshString.Append(ProcessTransform(t.GetChild(i), makeSubmeshes));
return meshString.ToString();
}

return meshString.ToString();
}

string MeshToString(Mesh mesh, Material[] mats, Transform t)
{
if (!mesh)
return "####Error####";
string MeshToString(Mesh mesh, Material[] mats, Transform t)
{
if (!mesh)
return "####Error####";

Vector3[] points = mesh.vertices;
Vector3[] normals = m_settings.normals ? mesh.normals : null;
Vector2[] uv = m_settings.uv ? mesh.uv : null;
Vector3[] points = mesh.vertices;
Vector3[] normals = m_settings.normals ? mesh.normals : null;
Vector2[] uv = m_settings.uv ? mesh.uv : null;

if (m_settings.applyTransform && t != null)
{
if (points != null)
if (m_settings.applyTransform && t != null)
{
for (int i = 0; i < points.Length; ++i)
points[i] = t.TransformPoint(points[i]);
if (points != null)
{
for (int i = 0; i < points.Length; ++i)
points[i] = t.TransformPoint(points[i]);
}
if (normals != null)
{
for (int i = 0; i < normals.Length; ++i)
normals[i] = t.TransformVector(normals[i]);
}

}
if (normals != null)
if (m_settings.flipHandedness)
{
for (int i = 0; i < normals.Length; ++i)
normals[i] = t.TransformVector(normals[i]);
if (points != null)
{
for (int i = 0; i < points.Length; ++i)
points[i].x *= -1.0f;
}
if (normals != null)
{
for (int i = 0; i < normals.Length; ++i)
normals[i].x *= -1.0f;
}
}

}
if(m_settings.flipHandedness)
{
StringBuilder sb = new StringBuilder();

if (points != null)
{
for (int i = 0; i < points.Length; ++i)
points[i].x *= -1.0f;
foreach (Vector3 v in points)
sb.Append(string.Format("v {0} {1} {2}\n", v.x, v.y, v.z));
sb.Append("\n");
}
if (normals != null)
{
for (int i = 0; i < normals.Length; ++i)
normals[i].x *= -1.0f;
foreach (Vector3 n in normals)
sb.Append(string.Format("vn {0} {1} {2}\n", n.x, n.y, n.z));
sb.Append("\n");
}
}

StringBuilder sb = new StringBuilder();

if (points != null)
{
foreach (Vector3 v in points)
sb.Append(string.Format("v {0} {1} {2}\n", v.x, v.y, v.z));
sb.Append("\n");
}
if (normals != null)
{
foreach (Vector3 n in normals)
sb.Append(string.Format("vn {0} {1} {2}\n", n.x, n.y, n.z));
sb.Append("\n");
}
if (uv != null)
{
foreach (Vector3 u in uv)
sb.Append(string.Format("vt {0} {1}\n", u.x, u.y));
}

int i1 = m_settings.flipFaces ? 2 : 1;
int i2 = m_settings.flipFaces ? 1 : 2;
string format = "";
{
int numComponents = 0;
if (points != null && points.Length > 0) ++numComponents;
if (normals != null && normals.Length > 0) ++numComponents;
if (uv != null && uv.Length > 0) ++numComponents;

switch (numComponents)
if (uv != null)
{
case 1: format = "f {0} {1} {2}\n"; break;
case 2: format = "f {0}/{0} {1}/{1} {2}/{2}\n"; break;
case 3: format = "f {0}/{0}/{0} {1}/{1}/{1} {2}/{2}/{2}\n"; break;
foreach (Vector3 u in uv)
sb.Append(string.Format("vt {0} {1}\n", u.x, u.y));
}
}

for (int sm = 0; sm < mesh.subMeshCount; sm++)
{
sb.Append("\n");
if (mats != null && sm < mats.Length)
int i1 = m_settings.flipFaces ? 2 : 1;
int i2 = m_settings.flipFaces ? 1 : 2;
string format = "";
{
sb.Append("usemtl ").Append(mats[sm].name).Append("\n");
sb.Append("usemap ").Append(mats[sm].name).Append("\n");
int numComponents = 0;
if (points != null && points.Length > 0) ++numComponents;
if (normals != null && normals.Length > 0) ++numComponents;
if (uv != null && uv.Length > 0) ++numComponents;

switch (numComponents)
{
case 1: format = "f {0} {1} {2}\n"; break;
case 2: format = "f {0}/{0} {1}/{1} {2}/{2}\n"; break;
case 3: format = "f {0}/{0}/{0} {1}/{1}/{1} {2}/{2}/{2}\n"; break;
}
}

int[] triangles = mesh.GetTriangles(sm);
for (int i = 0; i < triangles.Length; i += 3)
for (int sm = 0; sm < mesh.subMeshCount; sm++)
{
sb.Append(string.Format(format,
triangles[i] + 1 + m_startIndex, triangles[i + i1] + 1 + m_startIndex, triangles[i + i2] + 1 + m_startIndex));
sb.Append("\n");
if (mats != null && sm < mats.Length)
{
sb.Append("usemtl ").Append(mats[sm].name).Append("\n");
sb.Append("usemap ").Append(mats[sm].name).Append("\n");
}

int[] triangles = mesh.GetTriangles(sm);
for (int i = 0; i < triangles.Length; i += 3)
{
sb.Append(string.Format(format,
triangles[i] + 1 + m_startIndex, triangles[i + i1] + 1 + m_startIndex, triangles[i + i2] + 1 + m_startIndex));
}
}
}

m_startIndex += points.Length;
return sb.ToString();
}
m_startIndex += points.Length;
return sb.ToString();
}

void WriteToFile(string s, string filename)
{
using (StreamWriter sw = new StreamWriter(filename))
sw.Write(s);
void WriteToFile(string s, string filename)
{
using (StreamWriter sw = new StreamWriter(filename))
sw.Write(s);
}
}
}
}

0 comments on commit 9f17e6f

Please sign in to comment.