Example #1
0
 public Triangle(Vector3 u, Vector3 v, Vector3 w)
 {
     this.u = u;
     this.v = v;
     this.w = w;
     this.n = Helpers.unit(Vector3.Cross(v - u, w - u));
 }
Example #2
0
        private static void write_zcb(
            string filename,
            List <Triangle> triangles,
            Vector3 bb_min,
            Vector3 bb_max,
            int start_width,
            string[] names,
            int[] materialu)
        {
            zcbType zcbType = new zcbType(names);

            zcbType.DialogResult = DialogResult.None;
            int num1 = (int)zcbType.ShowDialog();

            do
            {
                ;
            }while (zcbType.DialogResult != DialogResult.OK);
            Dictionary <string, uint> mapping            = zcbType.Mapping;
            Dictionary <string, bool> colli              = zcbType.Colli;
            EndianBinaryWriter        endianBinaryWriter = new EndianBinaryWriter((Stream)File.Create(filename), Endianness.LittleEndian);

            endianBinaryWriter.Write("BLCM1BCZ", Encoding.ASCII, false);
            endianBinaryWriter.Write(0U);
            endianBinaryWriter.Write(5U);
            endianBinaryWriter.Write(new byte[16]
            {
                (byte)4,
                (byte)3,
                (byte)2,
                (byte)1,
                (byte)4,
                (byte)3,
                (byte)2,
                (byte)1,
                (byte)4,
                (byte)3,
                (byte)2,
                (byte)1,
                (byte)4,
                (byte)3,
                (byte)2,
                (byte)1
            }, 0, 16);
            endianBinaryWriter.Write("BXTV", Encoding.ASCII, false);
            endianBinaryWriter.Write((uint)(triangles.Count * 12 * 3 + 12));
            endianBinaryWriter.Write((ushort)(triangles.Count * 3));
            endianBinaryWriter.Write(new byte[2]
            {
                (byte)2,
                (byte)1
            }, 0, 2);
            foreach (Triangle triangle in triangles)
            {
                endianBinaryWriter.Write((int)((double)triangle.u.X * 4096.0));
                endianBinaryWriter.Write((int)((double)triangle.u.Y * 4096.0));
                endianBinaryWriter.Write((int)((double)triangle.u.Z * 4096.0));
                endianBinaryWriter.Write((int)((double)triangle.v.X * 4096.0));
                endianBinaryWriter.Write((int)((double)triangle.v.Y * 4096.0));
                endianBinaryWriter.Write((int)((double)triangle.v.Z * 4096.0));
                endianBinaryWriter.Write((int)((double)triangle.w.X * 4096.0));
                endianBinaryWriter.Write((int)((double)triangle.w.Y * 4096.0));
                endianBinaryWriter.Write((int)((double)triangle.w.Z * 4096.0));
            }
            endianBinaryWriter.Write("BLCP", Encoding.ASCII, false);
            endianBinaryWriter.Write((uint)(4 * names.Length + 12));
            endianBinaryWriter.Write((ushort)names.Length);
            endianBinaryWriter.Write(new byte[2]
            {
                (byte)2,
                (byte)1
            }, 0, 2);
            for (int index = 0; index < names.Length; ++index)
            {
                endianBinaryWriter.Write(Bytes.StringToByte(string.Format("{0:X8}", (object)mapping[names[index]])), 0, 4);
            }
            endianBinaryWriter.Write("BMRN", Encoding.ASCII, false);
            endianBinaryWriter.Write((uint)(triangles.Count * 6 * 4 + 12));
            endianBinaryWriter.Write((ushort)(triangles.Count * 4));
            endianBinaryWriter.Write(new byte[2]
            {
                (byte)2,
                (byte)1
            }, 0, 2);
            foreach (Triangle triangle in triangles)
            {
                endianBinaryWriter.Write((short)((double)triangle.n.X * 4096.0));
                endianBinaryWriter.Write((short)((double)triangle.n.Y * 4096.0));
                endianBinaryWriter.Write((short)((double)triangle.n.Z * 4096.0));
                Vector3 vector3_1 = -Helpers.unit(Vector3.Cross(triangle.w - triangle.u, triangle.n));
                Vector3 vector3_2 = Helpers.unit(Vector3.Cross(triangle.v - triangle.u, triangle.n));
                Vector3 vector3_3 = Helpers.unit(Vector3.Cross(triangle.w - triangle.v, triangle.n));
                endianBinaryWriter.Write((short)((double)vector3_1.X * 4096.0));
                endianBinaryWriter.Write((short)((double)vector3_1.Y * 4096.0));
                endianBinaryWriter.Write((short)((double)vector3_1.Z * 4096.0));
                endianBinaryWriter.Write((short)((double)vector3_2.X * 4096.0));
                endianBinaryWriter.Write((short)((double)vector3_2.Y * 4096.0));
                endianBinaryWriter.Write((short)((double)vector3_2.Z * 4096.0));
                endianBinaryWriter.Write((short)((double)vector3_3.X * 4096.0));
                endianBinaryWriter.Write((short)((double)vector3_3.Y * 4096.0));
                endianBinaryWriter.Write((short)((double)vector3_3.Z * 4096.0));
            }
            endianBinaryWriter.Write("BIRT", Encoding.ASCII, false);
            endianBinaryWriter.Write((uint)(triangles.Count * 16 + 12));
            endianBinaryWriter.Write((ushort)triangles.Count);
            endianBinaryWriter.Write(new byte[2]
            {
                (byte)2,
                (byte)1
            }, 0, 2);
            int      num2 = 0;
            int      num3 = 0;
            Triangle triangle1;

            foreach (Triangle triangle2 in triangles)
            {
                triangle1 = triangle2;
                endianBinaryWriter.Write((short)num2);
                int num4 = num2 + 1;
                endianBinaryWriter.Write((short)num4);
                int num5 = num4 + 1;
                endianBinaryWriter.Write((short)num5);
                num2 = num5 + 1;
                endianBinaryWriter.Write((short)materialu[num2 / 3 - 1]);
                endianBinaryWriter.Write((short)num3);
                int num6 = num3 + 1;
                endianBinaryWriter.Write((short)num6);
                int num7 = num6 + 1;
                endianBinaryWriter.Write((short)num7);
                int num8 = num7 + 1;
                endianBinaryWriter.Write((short)num8);
                num3 = num8 + 1;
            }
            List <OctreeNode> octreeNodeList = new List <OctreeNode>();
            List <int>        intList        = new List <int>();
            int num9 = 0;

            foreach (Triangle triangle2 in triangles)
            {
                triangle1 = triangle2;
                intList.Add(num9);
                ++num9;
            }
            long position = endianBinaryWriter.BaseStream.Position;

            endianBinaryWriter.Write("BDRG", Encoding.ASCII, false);
            endianBinaryWriter.Write(0U);
            endianBinaryWriter.Write((ushort)1);
            endianBinaryWriter.Write((ushort)1);
            for (int index1 = 0; index1 < 1; ++index1)
            {
                for (int index2 = 0; index2 < 1; ++index2)
                {
                    endianBinaryWriter.Write((short)triangles.Count);
                    for (int index3 = 0; index3 < triangles.Count; ++index3)
                    {
                        endianBinaryWriter.Write((short)index3);
                    }
                    endianBinaryWriter.Write((short)0);
                }
            }
            endianBinaryWriter.BaseStream.Position = position + 4L;
            endianBinaryWriter.Write((uint)(endianBinaryWriter.BaseStream.Length - position));
            endianBinaryWriter.BaseStream.Position = 8L;
            endianBinaryWriter.Write((uint)endianBinaryWriter.BaseStream.Length);
            endianBinaryWriter.Close();
        }
Example #3
0
 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();
 }