using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using UnityEngine; namespace Parabox.STL { // Token: 0x02000003 RID: 3 public static class pb_Stl { // Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250 public static bool WriteFile(string path, Mesh mesh, FileType type = FileType.Ascii, bool convertToRightHandedCoordinates = true) { return pb_Stl.WriteFile(path, new Mesh[] { mesh }, type, convertToRightHandedCoordinates); } // Token: 0x06000002 RID: 2 RVA: 0x00002064 File Offset: 0x00000264 public static bool WriteFile(string path, IList meshes, FileType type = FileType.Ascii, bool convertToRightHandedCoordinates = true) { try { if (type == FileType.Binary) { using (BinaryWriter binaryWriter = new BinaryWriter(File.Open(path, FileMode.Create), new ASCIIEncoding())) { binaryWriter.Write(new byte[80]); uint num = (uint)(meshes.Sum((Mesh x) => x.triangles.Length) / 3); binaryWriter.Write(num); foreach (Mesh mesh in meshes) { Vector3[] array = (convertToRightHandedCoordinates ? pb_Stl.Left2Right(mesh.vertices) : mesh.vertices); Vector3[] array2 = (convertToRightHandedCoordinates ? pb_Stl.Left2Right(mesh.normals) : mesh.normals); int[] triangles = mesh.triangles; int num2 = triangles.Length; if (convertToRightHandedCoordinates) { Array.Reverse(triangles); } for (int i = 0; i < num2; i += 3) { int num3 = triangles[i]; int num4 = triangles[i + 1]; int num5 = triangles[i + 2]; Vector3 vector = pb_Stl.AvgNrm(array2[num3], array2[num4], array2[num5]); binaryWriter.Write(vector.x); binaryWriter.Write(vector.y); binaryWriter.Write(vector.z); binaryWriter.Write(array[num3].x); binaryWriter.Write(array[num3].y); binaryWriter.Write(array[num3].z); binaryWriter.Write(array[num4].x); binaryWriter.Write(array[num4].y); binaryWriter.Write(array[num4].z); binaryWriter.Write(array[num5].x); binaryWriter.Write(array[num5].y); binaryWriter.Write(array[num5].z); binaryWriter.Write(0); } } goto IL_21C; } } string text = pb_Stl.WriteString(meshes, true); File.WriteAllText(path, text); IL_21C:; } catch (Exception ex) { Debug.LogError(ex.ToString()); return false; } return true; } // Token: 0x06000003 RID: 3 RVA: 0x000022F0 File Offset: 0x000004F0 public static string WriteString(Mesh mesh, bool convertToRightHandedCoordinates = true) { return pb_Stl.WriteString(new Mesh[] { mesh }, convertToRightHandedCoordinates); } // Token: 0x06000004 RID: 4 RVA: 0x00002304 File Offset: 0x00000504 public static string WriteString(IList meshes, bool convertToRightHandedCoordinates = true) { StringBuilder stringBuilder = new StringBuilder(); string text = ((meshes.Count == 1) ? meshes[0].name : "Composite Mesh"); stringBuilder.AppendLine(string.Format("solid {0}", text)); foreach (Mesh mesh in meshes) { Vector3[] array = (convertToRightHandedCoordinates ? pb_Stl.Left2Right(mesh.vertices) : mesh.vertices); Vector3[] array2 = (convertToRightHandedCoordinates ? pb_Stl.Left2Right(mesh.normals) : mesh.normals); int[] triangles = mesh.triangles; if (convertToRightHandedCoordinates) { Array.Reverse(triangles); } int num = triangles.Length; for (int i = 0; i < num; i += 3) { int num2 = triangles[i]; int num3 = triangles[i + 1]; int num4 = triangles[i + 2]; Vector3 vector = pb_Stl.AvgNrm(array2[num2], array2[num3], array2[num4]); stringBuilder.AppendLine(string.Format("facet normal {0} {1} {2}", vector.x, vector.y, vector.z)); stringBuilder.AppendLine("outer loop"); stringBuilder.AppendLine(string.Format("\tvertex {0} {1} {2}", array[num2].x, array[num2].y, array[num2].z)); stringBuilder.AppendLine(string.Format("\tvertex {0} {1} {2}", array[num3].x, array[num3].y, array[num3].z)); stringBuilder.AppendLine(string.Format("\tvertex {0} {1} {2}", array[num4].x, array[num4].y, array[num4].z)); stringBuilder.AppendLine("endloop"); stringBuilder.AppendLine("endfacet"); } } stringBuilder.AppendLine(string.Format("endsolid {0}", text)); return stringBuilder.ToString(); } // Token: 0x06000005 RID: 5 RVA: 0x00002578 File Offset: 0x00000778 private static Vector3[] Left2Right(Vector3[] v) { Matrix4x4 matrix4x = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3(1f, 1f, -1f)); Vector3[] array = new Vector3[v.Length]; for (int i = 0; i < v.Length; i++) { array[i] = matrix4x.MultiplyPoint3x4(v[i]); } return array; } // Token: 0x06000006 RID: 6 RVA: 0x000025D8 File Offset: 0x000007D8 private static Vector3 AvgNrm(Vector3 a, Vector3 b, Vector3 c) { return new Vector3((a.x + b.x + c.x) / 3f, (a.y + b.y + c.y) / 3f, (a.z + b.z + c.z) / 3f); } } }