public bool tricube_overlap(Triangle t, Cube c) { Vector3 right = t.u - c.c; Vector3 vector3_1 = t.v - c.c; Vector3 vector3_2 = t.w - c.c; int num1; if ((double) Helpers.min(right.X, vector3_1.X, vector3_2.X) <= (double) c.hw) num1 = (double) Helpers.max(right.X, vector3_1.X, vector3_2.X) >= -((double) c.hw + (double) c.hw / 4.0) ? 1 : 0; else num1 = 0; if (num1 == 0) return false; int num2; if ((double) Helpers.min(right.Y, vector3_1.Y, vector3_2.Y) <= (double) c.hw) num2 = (double) Helpers.max(right.Y, vector3_1.Y, vector3_2.Y) >= -((double) c.hw + (double) c.hw / 4.0) ? 1 : 0; else num2 = 0; if (num2 == 0) return false; int num3; if ((double) Helpers.min(right.Z, vector3_1.Z, vector3_2.Z) <= (double) c.hw) num3 = (double) Helpers.max(right.Z, vector3_1.Z, vector3_2.Z) >= -((double) c.hw + (double) c.hw / 4.0) ? 1 : 0; else num3 = 0; if (num3 == 0) return false; float num4 = Vector3.Dot(t.n, right); float num5 = (float) (((double) c.hw + (double) c.hw / 4.0) * ((double) Math.Abs(t.n.X) + (double) Math.Abs(t.n.Y) + (double) Math.Abs(t.n.Z))); if ((double) num4 > (double) num5 || (double) num4 < -(double) num5) return false; Vector3 vector3_3 = vector3_1 - right; if (this.axis_test(vector3_3.Z, -vector3_3.Y, right.Y, right.Z, vector3_2.Y, vector3_2.Z, c) || this.axis_test(-vector3_3.Z, vector3_3.X, right.X, right.Z, vector3_2.X, vector3_2.Z, c) || this.axis_test(vector3_3.Y, -vector3_3.X, vector3_1.X, vector3_1.Y, vector3_2.X, vector3_2.Y, c)) return false; Vector3 vector3_4 = vector3_2 - vector3_1; if (this.axis_test(vector3_4.Z, -vector3_4.Y, right.Y, right.Z, vector3_2.Y, vector3_2.Z, c) || this.axis_test(-vector3_4.Z, vector3_4.X, right.X, right.Z, vector3_2.X, vector3_2.Z, c) || this.axis_test(vector3_4.Y, -vector3_4.X, right.X, right.Y, vector3_1.X, vector3_1.Y, c)) return false; Vector3 vector3_5 = right - vector3_2; return !this.axis_test(vector3_5.Z, -vector3_5.Y, right.Y, right.Z, vector3_1.Y, vector3_1.Z, c) && !this.axis_test(-vector3_5.Z, vector3_5.X, right.X, right.Z, vector3_1.X, vector3_1.Z, c) && !this.axis_test(vector3_5.Y, -vector3_5.X, vector3_1.X, vector3_1.Y, vector3_2.X, vector3_2.Y, c); }
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(); }