private static object[] read_obj(string filename)
 {
   Vector3 vector3_1 = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue);
   Vector3 vector3_2 = new Vector3(float.MinValue, float.MinValue, float.MinValue);
   List<Vector3> vector3List1 = new List<Vector3>();
   List<Triangle> triangleList = new List<Triangle>();
   List<Vector3> vector3List2 = new List<Vector3>();
   List<int> intList = new List<int>();
   List<string> stringList = new List<string>();
   StreamReader streamReader = new StreamReader((Stream) File.OpenRead(filename));
   string str1 = "";
   CultureInfo cultureInfo = new CultureInfo("en-US");
   string str2;
   while ((str2 = streamReader.ReadLine()) != null)
   {
     string str3 = str2.Trim();
     if (str3.Length >= 1 && str3[0] != '#')
     {
       string[] strArray = str3.Split(new char[1]{ ' ' }, StringSplitOptions.RemoveEmptyEntries);
       if (strArray.Length >= 1)
       {
         switch (strArray[0])
         {
           case "usemtl":
             if (strArray.Length >= 2)
             {
               str1 = strArray[1];
               if (!stringList.Contains(str1))
               {
                 stringList.Add(str1);
                 break;
               }
               break;
             }
             continue;
           case "v":
             if (strArray.Length >= 4)
             {
               float x = float.Parse(strArray[1], (IFormatProvider) cultureInfo);
               float y = float.Parse(strArray[2], (IFormatProvider) cultureInfo);
               float z = float.Parse(strArray[3], (IFormatProvider) cultureInfo);
               if ((double) x < (double) vector3_1.X)
                 vector3_1.X = x;
               if ((double) y < (double) vector3_1.Y)
                 vector3_1.Y = y;
               if ((double) z < (double) vector3_1.Z)
                 vector3_1.Z = z;
               if ((double) x > (double) vector3_2.X)
                 vector3_2.X = x;
               if ((double) y > (double) vector3_2.Y)
                 vector3_2.Y = y;
               if ((double) z > (double) vector3_2.Z)
                 vector3_2.Z = z;
               vector3List1.Add(new Vector3(x, y, z));
               break;
             }
             continue;
           case "vn":
             if (strArray.Length >= 4)
             {
               float x = float.Parse(strArray[1], (IFormatProvider) cultureInfo);
               float y = float.Parse(strArray[2], (IFormatProvider) cultureInfo);
               float z = float.Parse(strArray[3], (IFormatProvider) cultureInfo);
               vector3List2.Add(new Vector3(x, y, z));
               break;
             }
             continue;
           case "f":
             if (strArray.Length >= 4)
             {
               Vector3 u = vector3List1[int.Parse(strArray[1].Split('/')[0]) - 1];
               Vector3 v = vector3List1[int.Parse(strArray[2].Split('/')[0]) - 1];
               Vector3 w = vector3List1[int.Parse(strArray[3].Split('/')[0]) - 1];
               if (strArray[1].Split('/').Length == 2)
               {
                 Vector3 n = vector3List2[int.Parse(strArray[1].Split('/')[2]) - 1];
                 if ((double) Helpers.norm_sq(Vector3.Cross(v - u, w - u)) >= 0.01)
                 {
                   triangleList.Add(new Triangle(u, v, w, n));
                   intList.Add(stringList.IndexOf(str1));
                   break;
                 }
                 continue;
               }
               if ((double) Helpers.norm_sq(Vector3.Cross(v - u, w - u)) >= 0.01)
               {
                 triangleList.Add(new Triangle(u, v, w));
                 intList.Add(stringList.IndexOf(str1));
                 break;
               }
               continue;
             }
             continue;
         }
       }
     }
   }
   streamReader.Close();
   return new object[5]
   {
     (object) triangleList,
     (object) vector3_1,
     (object) vector3_2,
     (object) stringList.ToArray(),
     (object) intList.ToArray()
   };
 }
 private static void write_kcl(
   string filename,
   List<Triangle> triangles,
   Vector3 bb_min,
   Vector3 bb_max,
   int max_triangles,
   int min_width,
   string[] names,
   int[] materialu)
 {
   bb_min -= new Vector3(25f, 25f, 25f);
   bb_max += new Vector3(25f, 25f, 25f);
   kclType kclType = new kclType(names);
   kclType.DialogResult = DialogResult.None;
   int num1 = (int) kclType.ShowDialog();
   do
     ;
   while (kclType.DialogResult != DialogResult.OK);
   Dictionary<string, ushort> mapping = kclType.Mapping;
   Dictionary<string, bool> colli = kclType.Colli;
   int val2 = Helpers.next_exponent((float) min_width, 2);
   int num2 = Math.Max(Helpers.next_exponent(bb_max.X - bb_min.X, 2), val2);
   int num3 = Math.Max(Helpers.next_exponent(bb_max.Y - bb_min.Y, 2), val2);
   int num4 = Math.Max(Helpers.next_exponent(bb_max.Z - bb_min.Z, 2), val2);
   int num5 = (int) Helpers.max((float) num2, (float) num4);
   int num6 = num5;
   int num7 = Math.Max((int) Helpers.min((float) num5, (float) num3, (float) num6), val2);
   float num8 = (float) Math.Pow(2.0, (double) (num5 - num7));
   float num9 = (float) Math.Pow(2.0, (double) (num3 - num7));
   float num10 = (float) Math.Pow(2.0, (double) (num6 - num7));
   float width = (float) Math.Pow(2.0, (double) num7);
   Obj2Kcl.maxcubesize = width;
   List<OctreeNode> octreeNodeList = new List<OctreeNode>();
   List<int> indices = new List<int>();
   int index1 = 0;
   foreach (Triangle triangle in triangles)
   {
     if (colli[names[materialu[index1]]])
       indices.Add(index1);
     ++index1;
   }
   for (int index2 = 0; (double) index2 < (double) num10; ++index2)
   {
     for (int index3 = 0; (double) index3 < (double) num9; ++index3)
     {
       for (int index4 = 0; (double) index4 < (double) num8; ++index4)
         octreeNodeList.Add(new OctreeNode(bb_min + width * new Vector3((float) index4, (float) index3, (float) index2), width, triangles, indices, max_triangles, min_width));
     }
   }
   EndianBinaryWriter endianBinaryWriter = new EndianBinaryWriter((Stream) File.Create(filename), Endianness.LittleEndian);
   endianBinaryWriter.Write(0U);
   endianBinaryWriter.Write(0U);
   endianBinaryWriter.Write(0U);
   endianBinaryWriter.Write(0U);
   endianBinaryWriter.Write(122880U);
   endianBinaryWriter.Write((int) ((double) bb_min.X * 4096.0));
   endianBinaryWriter.Write((int) ((double) bb_min.Y * 4096.0));
   endianBinaryWriter.Write((int) ((double) bb_min.Z * 4096.0));
   endianBinaryWriter.Write((uint) (-1 << num5 & -1));
   endianBinaryWriter.Write((uint) (-1 << num3 & -1));
   endianBinaryWriter.Write((uint) (-1 << num6 & -1));
   endianBinaryWriter.Write((uint) num7);
   endianBinaryWriter.Write((uint) (num5 - num7));
   endianBinaryWriter.Write((uint) (num5 - num7 + num3 - num7));
   endianBinaryWriter.Write(102400U);
   int position1 = (int) endianBinaryWriter.BaseStream.Position;
   endianBinaryWriter.BaseStream.Position = 0L;
   endianBinaryWriter.Write(position1);
   endianBinaryWriter.BaseStream.Position = (long) position1;
   List<Vector3> b1 = new List<Vector3>();
   List<int> intList1 = new List<int>();
   int index5 = 0;
   foreach (Triangle triangle in triangles)
   {
     if (colli[names[materialu[index5]]])
     {
       int num11 = Helpers.containsVector3(triangle.u, b1);
       if (num11 == -1)
       {
         b1.Add(triangle.u);
         intList1.Add(b1.Count - 1);
       }
       else
         intList1.Add(num11);
     }
     ++index5;
   }
   foreach (Vector3 vector3 in b1)
   {
     endianBinaryWriter.Write((int) ((double) vector3.X * 4096.0));
     endianBinaryWriter.Write((int) ((double) vector3.Y * 4096.0));
     endianBinaryWriter.Write((int) ((double) vector3.Z * 4096.0));
   }
   int position2 = (int) endianBinaryWriter.BaseStream.Position;
   endianBinaryWriter.BaseStream.Position = 4L;
   endianBinaryWriter.Write(position2);
   endianBinaryWriter.BaseStream.Position = (long) position2;
   List<Vector3> b2 = new List<Vector3>();
   List<int> intList2 = new List<int>();
   int index6 = 0;
   foreach (Triangle triangle in triangles)
   {
     if (colli[names[materialu[index6]]])
     {
       Vector3 a1 = -Helpers.unit(Vector3.Cross(triangle.w - triangle.u, triangle.n));
       Vector3 a2 = Helpers.unit(Vector3.Cross(triangle.v - triangle.u, triangle.n));
       Vector3 a3 = Helpers.unit(Vector3.Cross(triangle.w - triangle.v, triangle.n));
       int num11 = Helpers.containsVector3(triangle.n, b2);
       if (num11 == -1)
       {
         b2.Add(triangle.n);
         intList2.Add(b2.Count - 1);
       }
       else
         intList2.Add(num11);
       int num12 = Helpers.containsVector3(a1, b2);
       if (num12 == -1)
       {
         b2.Add(a1);
         intList2.Add(b2.Count - 1);
       }
       else
         intList2.Add(num12);
       int num13 = Helpers.containsVector3(a2, b2);
       if (num13 == -1)
       {
         b2.Add(a2);
         intList2.Add(b2.Count - 1);
       }
       else
         intList2.Add(num13);
       int num14 = Helpers.containsVector3(a3, b2);
       if (num14 == -1)
       {
         b2.Add(a3);
         intList2.Add(b2.Count - 1);
       }
       else
         intList2.Add(num14);
     }
     ++index6;
   }
   foreach (Vector3 vector3 in b2)
   {
     endianBinaryWriter.Write((short) ((double) vector3.X * 4096.0));
     endianBinaryWriter.Write((short) ((double) vector3.Y * 4096.0));
     endianBinaryWriter.Write((short) ((double) vector3.Z * 4096.0));
   }
   while (endianBinaryWriter.BaseStream.Position % 4L != 0L)
     endianBinaryWriter.Write((byte) 0);
   int position3 = (int) endianBinaryWriter.BaseStream.Position;
   endianBinaryWriter.BaseStream.Position = 8L;
   endianBinaryWriter.Write(position3 - 16);
   endianBinaryWriter.BaseStream.Position = (long) position3;
   int index7 = 0;
   int index8 = 0;
   foreach (Triangle triangle in triangles)
   {
     if (colli[names[materialu[index8]]])
     {
       Vector3 right = Helpers.unit(Vector3.Cross(triangle.w - triangle.v, triangle.n));
       endianBinaryWriter.Write((int) ((double) Vector3.Dot(triangle.w - triangle.u, right) * 4096.0));
       endianBinaryWriter.Write((ushort) intList1[index7]);
       endianBinaryWriter.Write((ushort) intList2[4 * index7]);
       endianBinaryWriter.Write((ushort) intList2[4 * index7 + 1]);
       endianBinaryWriter.Write((ushort) intList2[4 * index7 + 2]);
       endianBinaryWriter.Write((ushort) intList2[4 * index7 + 3]);
       endianBinaryWriter.Write(Bytes.StringToByte(string.Format("{0:X4}", (object) mapping[names[materialu[index8]]])), 0, 2);
       ++index7;
     }
     ++index8;
   }
   int position4 = (int) endianBinaryWriter.BaseStream.Position;
   endianBinaryWriter.BaseStream.Position = 12L;
   endianBinaryWriter.Write(position4);
   endianBinaryWriter.BaseStream.Position = (long) position4;
   long position5 = endianBinaryWriter.BaseStream.Position;
   long position6;
   long offset = position6 = endianBinaryWriter.BaseStream.Position;
   Queue<OctreeNode> octreeNodeQueue = new Queue<OctreeNode>();
   Collection<ushort> collection = new Collection<ushort>();
   Queue<long> longQueue = new Queue<long>();
   for (int index2 = 0; index2 < octreeNodeList.Count; ++index2)
   {
     longQueue.Enqueue(position6);
     octreeNodeQueue.Enqueue(octreeNodeList[index2]);
   }
   long num15 = position6 + (long) (octreeNodeList.Count * 4);
   int num16 = 0;
   int count = octreeNodeList.Count;
   while (octreeNodeQueue.Count > 0)
   {
     OctreeNode octreeNode = octreeNodeQueue.Dequeue();
     if (octreeNode.is_leaf)
     {
       endianBinaryWriter.Write(0);
       longQueue.Dequeue();
     }
     else
     {
       endianBinaryWriter.Write((int) (num15 - longQueue.Dequeue()));
       for (int index2 = 0; index2 < octreeNode.branches.Count; ++index2)
       {
         octreeNodeQueue.Enqueue(octreeNode.branches[index2]);
         longQueue.Enqueue(num15);
         ++count;
       }
       num15 += 32L;
     }
     ++num16;
   }
   long position7 = endianBinaryWriter.BaseStream.Position;
   long num17 = offset;
   endianBinaryWriter.BaseStream.Seek(offset, SeekOrigin.Begin);
   for (int index2 = 0; index2 < octreeNodeList.Count; ++index2)
   {
     longQueue.Enqueue(num17);
     octreeNodeQueue.Enqueue(octreeNodeList[index2]);
   }
   long num18 = num17 + (long) (octreeNodeList.Count * 4);
   int num19 = 0;
   while (octreeNodeQueue.Count > 0)
   {
     long position8 = endianBinaryWriter.BaseStream.Position;
     OctreeNode octreeNode = octreeNodeQueue.Dequeue();
     if (octreeNode.is_leaf)
     {
       endianBinaryWriter.Write((int) ((long) int.MinValue | endianBinaryWriter.BaseStream.Length - longQueue.Dequeue() - 2L));
       endianBinaryWriter.BaseStream.Seek(0L, SeekOrigin.End);
       for (int index2 = 0; index2 < octreeNode.indices.Count; ++index2)
         endianBinaryWriter.Write((ushort) (octreeNode.indices[index2] + 1));
       endianBinaryWriter.Write((ushort) 0);
       for (int index2 = 0; index2 < octreeNode.indices.Count; ++index2)
         collection.Add((ushort) (octreeNode.indices[index2] + 1));
       collection.Add((ushort) 0);
       endianBinaryWriter.BaseStream.Seek(position8 + 4L, SeekOrigin.Begin);
     }
     else
     {
       longQueue.Dequeue();
       endianBinaryWriter.BaseStream.Seek(4L, SeekOrigin.Current);
       for (int index2 = 0; index2 < octreeNode.branches.Count; ++index2)
       {
         octreeNodeQueue.Enqueue(octreeNode.branches[index2]);
         longQueue.Enqueue(num18);
       }
       num18 += 32L;
     }
     ++num19;
   }
   endianBinaryWriter.Close();
 }