in unity/Assets/Scripts/pb_Stl/pb_Stl.cs [41:113]
public static bool WriteFile(string path, IList<Mesh> meshes, FileType type = FileType.Ascii, bool convertToRightHandedCoordinates = true)
{
try
{
switch(type)
{
case FileType.Binary:
{
// http://paulbourke.net/dataformats/stl/
// http://www.fabbers.com/tech/STL_Format
using (BinaryWriter writer = new BinaryWriter(File.Open(path, FileMode.Create), new ASCIIEncoding()))
{
// 80 byte header
writer.Write(new byte[80]);
uint totalTriangleCount = (uint) (meshes.Sum(x => x.triangles.Length) / 3);
// unsigned long facet count (4 bytes)
writer.Write( totalTriangleCount );
foreach(Mesh mesh in meshes)
{
Vector3[] v = convertToRightHandedCoordinates ? Left2Right(mesh.vertices) : mesh.vertices;
Vector3[] n = convertToRightHandedCoordinates ? Left2Right(mesh.normals) : mesh.normals;
int[] t = mesh.triangles;
int triangleCount = t.Length;
if(convertToRightHandedCoordinates)
System.Array.Reverse(t);
for(int i = 0; i < triangleCount; i += 3)
{
int a = t[i], b = t[i+1], c = t[i+2];
Vector3 avg = AvgNrm(n[a], n[b], n[c]);
writer.Write(avg.x);
writer.Write(avg.y);
writer.Write(avg.z);
writer.Write(v[a].x);
writer.Write(v[a].y);
writer.Write(v[a].z);
writer.Write(v[b].x);
writer.Write(v[b].y);
writer.Write(v[b].z);
writer.Write(v[c].x);
writer.Write(v[c].y);
writer.Write(v[c].z);
// specification says attribute byte count should be set to 0.
writer.Write( (ushort)0 );
}
}
}
}
break;
default:
string model = WriteString(meshes);
File.WriteAllText(path, model);
break;
}
}
catch(System.Exception e)
{
UnityEngine.Debug.LogError(e.ToString());
return false;
}
return true;
}