// Token: 0x0600045A RID: 1114 RVA: 0x00013D00 File Offset: 0x00011F00 public bool Find() { this.Quantity = 3; for (int i = 0; i < 3; i++) { this.Points[i] = this.triangle[i]; } for (int j = -1; j <= 1; j += 2) { Vector3 normal = (double)j * this.box.Axis0; double constant = normal.Dot(this.box.Center) - this.box.Extent0; int quantity = this.Quantity; Vector3[] points = this.Points; IntersectionUtility3.ClipConvexPolygonAgainstPlane(normal, constant, ref quantity, ref points); this.Quantity = quantity; this.Points = points; normal = (double)j * this.box.Axis1; constant = normal.Dot(this.box.Center) - this.box.Extent1; quantity = this.Quantity; points = this.Points; IntersectionUtility3.ClipConvexPolygonAgainstPlane(normal, constant, ref quantity, ref points); this.Quantity = quantity; this.Points = points; normal = (double)j * this.box.Axis2; constant = normal.Dot(this.box.Center) - this.box.Extent2; quantity = this.Quantity; points = this.Points; IntersectionUtility3.ClipConvexPolygonAgainstPlane(normal, constant, ref quantity, ref points); this.Quantity = quantity; this.Points = points; } return(this.Quantity > 0); }
// Token: 0x06000252 RID: 594 RVA: 0x00009AC4 File Offset: 0x00007CC4 private void CalcSquared(ref Vector3 vector, ref Triangle3 triangle) { Vector3 vector2 = triangle.V0 - vector; Vector3 vector3 = triangle.V1 - triangle.V0; Vector3 vector4 = triangle.V2 - triangle.V0; double squaredLength = vector3.SquaredLength; double num = vector3.Dot(vector4); double squaredLength2 = vector4.SquaredLength; double num2 = vector2.Dot(vector3); double num3 = vector2.Dot(vector4); double squaredLength3 = vector2.SquaredLength; double num4 = squaredLength * squaredLength2; double num5 = num; double num6 = Math.Abs(num4 - num5 * num5); double num7 = num * num3 - squaredLength2 * num2; double num8 = num * num2 - squaredLength * num3; double num9; if (num7 + num8 <= num6) { if (num7 < 0.0) { if (num8 < 0.0) { if (num2 < 0.0) { num8 = 0.0; if (-num2 >= squaredLength) { num7 = 1.0; num9 = squaredLength + 2.0 * num2 + squaredLength3; } else { num7 = -num2 / squaredLength; num9 = num2 * num7 + squaredLength3; } } else { num7 = 0.0; if (num3 >= 0.0) { num8 = 0.0; num9 = squaredLength3; } else if (-num3 >= squaredLength2) { num8 = 1.0; num9 = squaredLength2 + 2.0 * num3 + squaredLength3; } else { num8 = -num3 / squaredLength2; num9 = num3 * num8 + squaredLength3; } } } else { num7 = 0.0; if (num3 >= 0.0) { num8 = 0.0; num9 = squaredLength3; } else if (-num3 >= squaredLength2) { num8 = 1.0; num9 = squaredLength2 + 2.0 * num3 + squaredLength3; } else { num8 = -num3 / squaredLength2; num9 = num3 * num8 + squaredLength3; } } } else if (num8 < 0.0) { num8 = 0.0; if (num2 >= 0.0) { num7 = 0.0; num9 = squaredLength3; } else if (-num2 >= squaredLength) { num7 = 1.0; num9 = squaredLength + 2.0 * num2 + squaredLength3; } else { num7 = -num2 / squaredLength; num9 = num2 * num7 + squaredLength3; } } else { if (num6 == 0.0) { Vector3[] array = new Vector3[] { triangle.V1 - triangle.V0, triangle.V2 - triangle.V1, triangle.V0 - triangle.V2 }; int num10 = IntersectionUtility3.MaxIndex(array[0].SquaredLength, array[1].SquaredLength, array[2].SquaredLength); Segment3 segment = new Segment3(triangle[num10], triangle[(num10 + 1) % 3]); DistanceVector3Segment3 distanceVector3Segment = new DistanceVector3Segment3(vector, segment); this.ClosestPointOnVector = vector; this.ClosestPointOnTriangle = distanceVector3Segment.ClosestPointOnSegment; this.SquaredDistance = distanceVector3Segment.SquaredDistance; return; } double num11 = 1.0 / num6; num7 *= num11; num8 *= num11; num9 = num7 * (squaredLength * num7 + num * num8 + 2.0 * num2) + num8 * (num * num7 + squaredLength2 * num8 + 2.0 * num3) + squaredLength3; } } else if (num7 < 0.0) { double num12 = num + num2; double num13 = squaredLength2 + num3; if (num13 > num12) { double num14 = num13 - num12; double num15 = squaredLength - 2.0 * num + squaredLength2; if (num14 >= num15) { num7 = 1.0; num8 = 0.0; num9 = squaredLength + 2.0 * num2 + squaredLength3; } else { num7 = num14 / num15; num8 = 1.0 - num7; num9 = num7 * (squaredLength * num7 + num * num8 + 2.0 * num2) + num8 * (num * num7 + squaredLength2 * num8 + 2.0 * num3) + squaredLength3; } } else { num7 = 0.0; if (num13 <= 0.0) { num8 = 1.0; num9 = squaredLength2 + 2.0 * num3 + squaredLength3; } else if (num3 >= 0.0) { num8 = 0.0; num9 = squaredLength3; } else { num8 = -num3 / squaredLength2; num9 = num3 * num8 + squaredLength3; } } } else if (num8 < 0.0) { double num16 = num + num3; double num17 = squaredLength + num2; if (num17 > num16) { double num14 = num17 - num16; double num15 = squaredLength - 2.0 * num + squaredLength2; if (num14 >= num15) { num8 = 1.0; num7 = 0.0; num9 = squaredLength2 + 2.0 * num3 + squaredLength3; } else { num8 = num14 / num15; num7 = 1.0 - num8; num9 = num7 * (squaredLength * num7 + num * num8 + 2.0 * num2) + num8 * (num * num7 + squaredLength2 * num8 + 2.0 * num3) + squaredLength3; } } else { num8 = 0.0; if (num17 <= 0.0) { num7 = 1.0; num9 = squaredLength + 2.0 * num2 + squaredLength3; } else if (num2 >= 0.0) { num7 = 0.0; num9 = squaredLength3; } else { num7 = -num2 / squaredLength; num9 = num2 * num7 + squaredLength3; } } } else { double num14 = squaredLength2 + num3 - num - num2; if (num14 <= 0.0) { num7 = 0.0; num8 = 1.0; num9 = squaredLength2 + 2.0 * num3 + squaredLength3; } else { double num15 = squaredLength - 2.0 * num + squaredLength2; if (num14 >= num15) { num7 = 1.0; num8 = 0.0; num9 = squaredLength + 2.0 * num2 + squaredLength3; } else { num7 = num14 / num15; num8 = 1.0 - num7; num9 = num7 * (squaredLength * num7 + num * num8 + 2.0 * num2) + num8 * (num * num7 + squaredLength2 * num8 + 2.0 * num3) + squaredLength3; } } } if (num9 < 0.0) { num9 = 0.0; } this.ClosestPointOnVector = vector; this.ClosestPointOnTriangle = triangle.V0 + num7 * vector3 + num8 * vector4; this.TriangleBary1 = num7; this.TriangleBary2 = num8; this.TriangleBary0 = 1.0 - num7 - num8; this.SquaredDistance = num9; }
// Token: 0x06000464 RID: 1124 RVA: 0x00013F08 File Offset: 0x00012108 public bool Test() { Vector3[] array = new Vector3[] { this.triangle0.V1 - this.triangle0.V0, this.triangle0.V2 - this.triangle0.V1, this.triangle0.V0 - this.triangle0.V2 }; UnitVector3 axis; if (!array[0].TryGetUnitCross(array[1], out axis)) { int num = IntersectionUtility3.MaxIndex(array[0].SquaredLength, array[1].SquaredLength, array[2].SquaredLength); Segment3 segment = new Segment3(this.triangle0[num], this.triangle0[(num + 1) % 3]); IntersectionSegment3Triangle3 intersectionSegment3Triangle = new IntersectionSegment3Triangle3(segment, this.triangle1); return(intersectionSegment3Triangle.Test()); } double num2 = axis.Dot(this.triangle0.V0); double num3; double num4; IntersectionTriangle3Triangle3.ProjectOntoAxis(this.triangle1, axis, out num3, out num4); if (num2 < num3 || num2 > num4) { return(false); } Vector3[] array2 = new Vector3[] { this.triangle1.V1 - this.triangle1.V0, this.triangle1.V2 - this.triangle1.V1, this.triangle1.V0 - this.triangle1.V2 }; UnitVector3 unitVector; if (!array2[0].TryGetUnitCross(array2[1], out unitVector)) { int num5 = IntersectionUtility3.MaxIndex(array2[0].SquaredLength, array2[1].SquaredLength, array2[2].SquaredLength); Segment3 segment2 = new Segment3(this.triangle1[num5], this.triangle1[(num5 + 1) % 3]); IntersectionSegment3Triangle3 intersectionSegment3Triangle2 = new IntersectionSegment3Triangle3(segment2, this.triangle0); return(intersectionSegment3Triangle2.Test()); } Vector3 vector = new Vector3(); if (axis.Cross(unitVector).Dot(vector) >= 1E-08) { double num6 = unitVector.Dot(this.triangle1.V0); double num7; double num8; IntersectionTriangle3Triangle3.ProjectOntoAxis(this.triangle0, unitVector, out num7, out num8); if (num6 < num7 || num6 > num8) { return(false); } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { UnitVector3 axis2; if (array[j].TryGetUnitCross(array2[i], out axis2)) { IntersectionTriangle3Triangle3.ProjectOntoAxis(this.triangle0, axis2, out num7, out num8); IntersectionTriangle3Triangle3.ProjectOntoAxis(this.triangle1, axis2, out num3, out num4); if (num8 < num3 || num4 < num7) { return(false); } } } } } else { for (int j = 0; j < 3; j++) { UnitVector3 axis3; if (axis.TryGetUnitCross(array[j], out axis3)) { double num7; double num8; IntersectionTriangle3Triangle3.ProjectOntoAxis(this.triangle0, axis3, out num7, out num8); IntersectionTriangle3Triangle3.ProjectOntoAxis(this.triangle1, axis3, out num3, out num4); if (num8 < num3 || num4 < num7) { return(false); } } } for (int i = 0; i < 3; i++) { UnitVector3 axis4; if (unitVector.TryGetUnitCross(array2[i], out axis4)) { double num7; double num8; IntersectionTriangle3Triangle3.ProjectOntoAxis(this.triangle0, axis4, out num7, out num8); IntersectionTriangle3Triangle3.ProjectOntoAxis(this.triangle1, axis4, out num3, out num4); if (num8 < num3 || num4 < num7) { return(false); } } } } return(true); }
// Token: 0x06000465 RID: 1125 RVA: 0x000142D4 File Offset: 0x000124D4 public bool Find() { Vector3[] array = new Vector3[] { this.triangle0.V1 - this.triangle0.V0, this.triangle0.V2 - this.triangle0.V1, this.triangle0.V0 - this.triangle0.V2 }; UnitVector3 unitVector; if (!array[0].TryGetUnitCross(array[1], out unitVector)) { int num = IntersectionUtility3.MaxIndex(array[0].SquaredLength, array[1].SquaredLength, array[2].SquaredLength); Segment3 segment = new Segment3(this.triangle0[num], this.triangle0[(num + 1) % 3]); IntersectionSegment3Triangle3 intersectionSegment3Triangle = new IntersectionSegment3Triangle3(segment, this.triangle1); bool result = intersectionSegment3Triangle.Find(); if (intersectionSegment3Triangle.IntersectionType == Intersection.Type.IT_POINT) { this.Points[0] = segment.Origin + intersectionSegment3Triangle.SegmentParameter * segment.Direction; this.Quantity = 1; this.IntersectionType = Intersection.Type.IT_POINT; } return(result); } Plane3 plane = new Plane3(this.triangle0.V0, this.triangle0.V1, this.triangle0.V2); int[] array2 = new int[3]; double[] array3 = new double[3]; int num2; int num3; int num4; IntersectionTriangle3Triangle3.TrianglePlaneRelations(this.triangle1, plane, ref array3, ref array2, out num2, out num3, out num4); if (num2 == 3 || num3 == 3) { return(false); } if (num4 == 3) { return(this.ReportCoplanarIntersections && this.GetCoplanarIntersection(plane, this.triangle0, this.triangle1)); } if (num2 == 0 || num3 == 0) { if (num4 == 2) { for (int i = 0; i < 3; i++) { if (array2[i] != 0) { int num5 = (i + 2) % 3; int num6 = (i + 1) % 3; return(this.IntersectsSegment(plane, this.triangle0, this.triangle1[num5], this.triangle1[num6])); } } } else { for (int i = 0; i < 3; i++) { if (array2[i] == 0) { return(this.ContainsPoint(this.triangle0, plane, this.triangle1[i])); } } } } if (num4 == 0) { int num7 = (num2 == 1) ? 1 : -1; for (int i = 0; i < 3; i++) { if (array2[i] == num7) { int num5 = (i + 2) % 3; int num6 = (i + 1) % 3; double scalar = array3[i] / (array3[i] - array3[num5]); Vector3 vector = this.triangle1[i] + scalar * (this.triangle1[num5] - this.triangle1[i]); scalar = array3[i] / (array3[i] - array3[num6]); Vector3 end = this.triangle1[i] + scalar * (this.triangle1[num6] - this.triangle1[i]); return(this.IntersectsSegment(plane, this.triangle0, vector, end)); } } } for (int i = 0; i < 3; i++) { if (array2[i] == 0) { int num5 = (i + 2) % 3; int num6 = (i + 1) % 3; double scalar = array3[num5] / (array3[num5] - array3[num6]); Vector3 vector = this.triangle1[num5] + scalar * (this.triangle1[num6] - this.triangle1[num5]); return(this.IntersectsSegment(plane, this.triangle0, this.triangle1[i], vector)); } } MathBase.Assert(false, "Triangle3Triangle3.Find(): should not be here"); return(false); }
// Token: 0x06000459 RID: 1113 RVA: 0x00013A04 File Offset: 0x00011C04 public bool Test() { Vector3[] array = new Vector3[3]; array[0] = this.triangle.V1 - this.triangle.V0; array[1] = this.triangle.V2 - this.triangle.V0; Vector3 axis = array[0].Cross(array[1]); double num = axis.Dot(this.triangle.V0); double num2 = num; double num3; double num4; IntersectionUtility3.GetProjection(axis, this.box, out num3, out num4); if (num4 < num || num2 < num3) { return(false); } UnitVector3 unitVector = this.box.Axis0; IntersectionUtility3.GetProjection((Vector3)unitVector, this.triangle, out num, out num2); double num5 = unitVector.Dot(this.box.Center); num3 = num5 - this.box.Extent0; num4 = num5 + this.box.Extent0; if (num4 < num || num2 < num3) { return(false); } unitVector = this.box.Axis1; IntersectionUtility3.GetProjection((Vector3)unitVector, this.triangle, out num, out num2); double num6 = unitVector.Dot(this.box.Center); num3 = num6 - this.box.Extent1; num4 = num6 + this.box.Extent1; if (num4 < num || num2 < num3) { return(false); } unitVector = this.box.Axis2; IntersectionUtility3.GetProjection((Vector3)unitVector, this.triangle, out num, out num2); double num7 = unitVector.Dot(this.box.Center); num3 = num7 - this.box.Extent2; num4 = num7 + this.box.Extent2; if (num4 < num || num2 < num3) { return(false); } array[2] = array[1] - array[0]; for (int i = 0; i < 3; i++) { Vector3 axis2 = array[i].Cross(this.box.Axis0); IntersectionUtility3.GetProjection(axis2, this.triangle, out num, out num2); IntersectionUtility3.GetProjection(axis2, this.box, out num3, out num4); if (num4 < num || num2 < num3) { return(false); } Vector3 axis3 = array[i].Cross(this.box.Axis1); IntersectionUtility3.GetProjection(axis3, this.triangle, out num, out num2); IntersectionUtility3.GetProjection(axis3, this.box, out num3, out num4); if (num4 < num || num2 < num3) { return(false); } Vector3 axis4 = array[i].Cross(this.box.Axis2); IntersectionUtility3.GetProjection(axis4, this.triangle, out num, out num2); IntersectionUtility3.GetProjection(axis4, this.box, out num3, out num4); if (num4 < num || num2 < num3) { return(false); } } return(true); }