public List <Vector3> SmoothOffsetSimple(List <Vector3> path) { if (path.Count <= 2 || iterations <= 0) { return(path); } if (iterations > 12) { Debug.LogWarning("A very high iteration count was passed, won't let this one through"); return(path); } int maxLength = (path.Count - 2) * (int)Mathf.Pow(2, iterations) + 2; List <Vector3> subdivided = ListPool <Vector3> .Claim(maxLength); List <Vector3> subdivided2 = ListPool <Vector3> .Claim(maxLength); for (int i = 0; i < maxLength; i++) { subdivided.Add(Vector3.zero); subdivided2.Add(Vector3.zero); } for (int i = 0; i < path.Count; i++) { subdivided[i] = path[i]; } for (int iteration = 0; iteration < iterations; iteration++) { int currentPathLength = (path.Count - 2) * (int)Mathf.Pow(2, iteration) + 2; //Switch the arrays List <Vector3> tmp = subdivided; subdivided = subdivided2; subdivided2 = tmp; const float nextMultiplier = 1F; for (int i = 0; i < currentPathLength - 1; i++) { Vector3 current = subdivided2[i]; Vector3 next = subdivided2[i + 1]; Vector3 normal = Vector3.Cross(next - current, Vector3.up); normal = normal.normalized; bool firstRight = false; bool secondRight = false; bool setFirst = false; bool setSecond = false; if (i != 0 && !VectorMath.IsColinearXZ(current, next, subdivided2[i - 1])) { setFirst = true; firstRight = VectorMath.RightOrColinearXZ(current, next, subdivided2[i - 1]); } if (i < currentPathLength - 1 && !VectorMath.IsColinearXZ(current, next, subdivided2[i + 2])) { setSecond = true; secondRight = VectorMath.RightOrColinearXZ(current, next, subdivided2[i + 2]); } if (setFirst) { subdivided[i * 2] = current + (firstRight ? normal * offset * nextMultiplier : -normal * offset * nextMultiplier); } else { subdivided[i * 2] = current; } if (setSecond) { subdivided[i * 2 + 1] = next + (secondRight ? normal * offset * nextMultiplier : -normal * offset * nextMultiplier); } else { subdivided[i * 2 + 1] = next; } } subdivided[(path.Count - 2) * (int)Mathf.Pow(2, iteration + 1) + 2 - 1] = subdivided2[currentPathLength - 1]; } ListPool <Vector3> .Release(ref subdivided2); return(subdivided); }
/** Calculate a funnel path from the \a left and \a right portal lists. * The result will be appended to \a funnelPath */ public static bool RunFunnel(List <Vector3> left, List <Vector3> right, List <Vector3> funnelPath) { if (left == null) { throw new System.ArgumentNullException("left"); } if (right == null) { throw new System.ArgumentNullException("right"); } if (funnelPath == null) { throw new System.ArgumentNullException("funnelPath"); } if (left.Count != right.Count) { throw new System.ArgumentException("left and right lists must have equal length"); } if (left.Count <= 3) { return(false); } //Remove identical vertices while (left[1] == left[2] && right[1] == right[2]) { //System.Console.WriteLine ("Removing identical left and right"); left.RemoveAt(1); right.RemoveAt(1); if (left.Count <= 3) { return(false); } } Vector3 swPoint = left[2]; if (swPoint == left[1]) { swPoint = right[2]; } //Test while (VectorMath.IsColinearXZ(left[0], left[1], right[1]) || VectorMath.RightOrColinearXZ(left[1], right[1], swPoint) == VectorMath.RightOrColinearXZ(left[1], right[1], left[0])) { left.RemoveAt(1); right.RemoveAt(1); if (left.Count <= 3) { return(false); } swPoint = left[2]; if (swPoint == left[1]) { swPoint = right[2]; } } //Switch left and right to really be on the "left" and "right" sides /** \todo The colinear check should not be needed */ if (!VectorMath.IsClockwiseXZ(left[0], left[1], right[1]) && !VectorMath.IsColinearXZ(left[0], left[1], right[1])) { //System.Console.WriteLine ("Wrong Side 2"); List <Vector3> tmp = left; left = right; right = tmp; } funnelPath.Add(left[0]); Vector3 portalApex = left[0]; Vector3 portalLeft = left[1]; Vector3 portalRight = right[1]; int apexIndex = 0; int rightIndex = 1; int leftIndex = 1; for (int i = 2; i < left.Count; i++) { if (funnelPath.Count > 2000) { Debug.LogWarning("Avoiding infinite loop. Remove this check if you have this long paths."); break; } Vector3 pLeft = left[i]; Vector3 pRight = right[i]; /*Debug.DrawLine (portalApex,portalLeft,Color.red); * Debug.DrawLine (portalApex,portalRight,Color.yellow); * Debug.DrawLine (portalApex,left,Color.cyan); * Debug.DrawLine (portalApex,right,Color.cyan);*/ if (VectorMath.SignedTriangleAreaTimes2XZ(portalApex, portalRight, pRight) >= 0) { if (portalApex == portalRight || VectorMath.SignedTriangleAreaTimes2XZ(portalApex, portalLeft, pRight) <= 0) { portalRight = pRight; rightIndex = i; } else { funnelPath.Add(portalLeft); portalApex = portalLeft; apexIndex = leftIndex; portalLeft = portalApex; portalRight = portalApex; leftIndex = apexIndex; rightIndex = apexIndex; i = apexIndex; continue; } } if (VectorMath.SignedTriangleAreaTimes2XZ(portalApex, portalLeft, pLeft) <= 0) { if (portalApex == portalLeft || VectorMath.SignedTriangleAreaTimes2XZ(portalApex, portalRight, pLeft) >= 0) { portalLeft = pLeft; leftIndex = i; } else { funnelPath.Add(portalRight); portalApex = portalRight; apexIndex = rightIndex; portalLeft = portalApex; portalRight = portalApex; leftIndex = apexIndex; rightIndex = apexIndex; i = apexIndex; continue; } } } funnelPath.Add(left[left.Count - 1]); return(true); }
bool FindNextCorners(Vector3 origin, int startIndex, List <Vector3> funnelPath, int numCorners, out bool lastCorner) { lastCorner = false; if (left == null) { throw new System.Exception("left list is null"); } if (right == null) { throw new System.Exception("right list is null"); } if (funnelPath == null) { throw new System.ArgumentNullException("funnelPath"); } if (left.Count != right.Count) { throw new System.ArgumentException("left and right lists must have equal length"); } int diagonalCount = left.Count; if (diagonalCount == 0) { throw new System.ArgumentException("no diagonals"); } if (diagonalCount - startIndex < 3) { //Direct path funnelPath.Add(left[diagonalCount - 1]); lastCorner = true; return(true); } #if ASTARDEBUG for (int i = startIndex; i < left.Count - 1; i++) { Debug.DrawLine(left[i], left[i + 1], Color.red); Debug.DrawLine(right[i], right[i + 1], Color.magenta); Debug.DrawRay(right[i], Vector3.up, Color.magenta); } for (int i = 0; i < left.Count; i++) { Debug.DrawLine(right[i], left[i], Color.cyan); } #endif //Remove identical vertices while (left[startIndex + 1] == left[startIndex + 2] && right[startIndex + 1] == right[startIndex + 2]) { //System.Console.WriteLine ("Removing identical left and right"); //left.RemoveAt (1); //right.RemoveAt (1); startIndex++; if (diagonalCount - startIndex <= 3) { return(false); } } Vector3 swPoint = left[startIndex + 2]; if (swPoint == left[startIndex + 1]) { swPoint = right[startIndex + 2]; } //Test while (VectorMath.IsColinearXZ(origin, left[startIndex + 1], right[startIndex + 1]) || VectorMath.RightOrColinearXZ(left[startIndex + 1], right[startIndex + 1], swPoint) == VectorMath.RightOrColinearXZ(left[startIndex + 1], right[startIndex + 1], origin)) { #if ASTARDEBUG Debug.DrawLine(left[startIndex + 1], right[startIndex + 1], new Color(0, 0, 0, 0.5F)); Debug.DrawLine(origin, swPoint, new Color(0, 0, 0, 0.5F)); #endif //left.RemoveAt (1); //right.RemoveAt (1); startIndex++; if (diagonalCount - startIndex < 3) { //Debug.Log ("#2 " + left.Count + " - " + startIndex + " = " + (left.Count-startIndex)); //Direct path funnelPath.Add(left[diagonalCount - 1]); lastCorner = true; return(true); } swPoint = left[startIndex + 2]; if (swPoint == left[startIndex + 1]) { swPoint = right[startIndex + 2]; } } //funnelPath.Add (origin); Vector3 portalApex = origin; Vector3 portalLeft = left[startIndex + 1]; Vector3 portalRight = right[startIndex + 1]; int apexIndex = startIndex + 0; int rightIndex = startIndex + 1; int leftIndex = startIndex + 1; for (int i = startIndex + 2; i < diagonalCount; i++) { if (funnelPath.Count >= numCorners) { return(true); } if (funnelPath.Count > 2000) { Debug.LogWarning("Avoiding infinite loop. Remove this check if you have this long paths."); break; } Vector3 pLeft = left[i]; Vector3 pRight = right[i]; /*Debug.DrawLine (portalApex,portalLeft,Color.red); * Debug.DrawLine (portalApex,portalRight,Color.yellow); * Debug.DrawLine (portalApex,left,Color.cyan); * Debug.DrawLine (portalApex,right,Color.cyan);*/ if (VectorMath.SignedTriangleAreaTimes2XZ(portalApex, portalRight, pRight) >= 0) { if (portalApex == portalRight || VectorMath.SignedTriangleAreaTimes2XZ(portalApex, portalLeft, pRight) <= 0) { portalRight = pRight; rightIndex = i; } else { funnelPath.Add(portalLeft); portalApex = portalLeft; apexIndex = leftIndex; portalLeft = portalApex; portalRight = portalApex; leftIndex = apexIndex; rightIndex = apexIndex; i = apexIndex; continue; } } if (VectorMath.SignedTriangleAreaTimes2XZ(portalApex, portalLeft, pLeft) <= 0) { if (portalApex == portalLeft || VectorMath.SignedTriangleAreaTimes2XZ(portalApex, portalRight, pLeft) >= 0) { portalLeft = pLeft; leftIndex = i; } else { funnelPath.Add(portalRight); portalApex = portalRight; apexIndex = rightIndex; portalLeft = portalApex; portalRight = portalApex; leftIndex = apexIndex; rightIndex = apexIndex; i = apexIndex; continue; } } } lastCorner = true; funnelPath.Add(left[diagonalCount - 1]); return(true); }
public List <Vector3> SmoothOffsetSimple(List <Vector3> path) { if (path.Count <= 2 || this.iterations <= 0) { return(path); } if (this.iterations > 12) { Debug.LogWarning("A very high iteration count was passed, won't let this one through"); return(path); } int num = (path.Count - 2) * (int)Mathf.Pow(2f, (float)this.iterations) + 2; List <Vector3> list = ListPool <Vector3> .Claim(num); List <Vector3> list2 = ListPool <Vector3> .Claim(num); for (int i = 0; i < num; i++) { list.Add(Vector3.zero); list2.Add(Vector3.zero); } for (int j = 0; j < path.Count; j++) { list[j] = path[j]; } for (int k = 0; k < this.iterations; k++) { int num2 = (path.Count - 2) * (int)Mathf.Pow(2f, (float)k) + 2; List <Vector3> list3 = list; list = list2; list2 = list3; for (int l = 0; l < num2 - 1; l++) { Vector3 vector = list2[l]; Vector3 vector2 = list2[l + 1]; Vector3 normalized = Vector3.Cross(vector2 - vector, Vector3.up).normalized; bool flag = false; bool flag2 = false; bool flag3 = false; bool flag4 = false; if (l != 0 && !VectorMath.IsColinearXZ(vector, vector2, list2[l - 1])) { flag3 = true; flag = VectorMath.RightOrColinearXZ(vector, vector2, list2[l - 1]); } if (l < num2 - 1 && !VectorMath.IsColinearXZ(vector, vector2, list2[l + 2])) { flag4 = true; flag2 = VectorMath.RightOrColinearXZ(vector, vector2, list2[l + 2]); } if (flag3) { list[l * 2] = vector + ((!flag) ? (-normalized * this.offset * 1f) : (normalized * this.offset * 1f)); } else { list[l * 2] = vector; } if (flag4) { list[l * 2 + 1] = vector2 + ((!flag2) ? (-normalized * this.offset * 1f) : (normalized * this.offset * 1f)); } else { list[l * 2 + 1] = vector2; } } list[(path.Count - 2) * (int)Mathf.Pow(2f, (float)(k + 1)) + 2 - 1] = list2[num2 - 1]; } ListPool <Vector3> .Release(list2); return(list); }
private bool FindNextCorners(Vector3 origin, int startIndex, List <Vector3> funnelPath, int numCorners, out bool lastCorner) { lastCorner = false; if (this.left == null) { throw new Exception("left list is null"); } if (this.right == null) { throw new Exception("right list is null"); } if (funnelPath == null) { throw new ArgumentNullException("funnelPath"); } if (this.left.Count != this.right.Count) { throw new ArgumentException("left and right lists must have equal length"); } int count = this.left.Count; if (count == 0) { throw new ArgumentException("no diagonals"); } if (count - startIndex < 3) { funnelPath.Add(this.left[count - 1]); lastCorner = true; return(true); } while (this.left[startIndex + 1] == this.left[startIndex + 2] && this.right[startIndex + 1] == this.right[startIndex + 2]) { startIndex++; if (count - startIndex <= 3) { return(false); } } Vector3 vector = this.left[startIndex + 2]; if (vector == this.left[startIndex + 1]) { vector = this.right[startIndex + 2]; } while (VectorMath.IsColinearXZ(origin, this.left[startIndex + 1], this.right[startIndex + 1]) || VectorMath.RightOrColinearXZ(this.left[startIndex + 1], this.right[startIndex + 1], vector) == VectorMath.RightOrColinearXZ(this.left[startIndex + 1], this.right[startIndex + 1], origin)) { startIndex++; if (count - startIndex < 3) { funnelPath.Add(this.left[count - 1]); lastCorner = true; return(true); } vector = this.left[startIndex + 2]; if (vector == this.left[startIndex + 1]) { vector = this.right[startIndex + 2]; } } Vector3 vector2 = origin; Vector3 vector3 = this.left[startIndex + 1]; Vector3 vector4 = this.right[startIndex + 1]; int num = startIndex + 1; int num2 = startIndex + 1; int i = startIndex + 2; while (i < count) { if (funnelPath.Count >= numCorners) { return(true); } if (funnelPath.Count > 2000) { Debug.LogWarning("Avoiding infinite loop. Remove this check if you have this long paths."); break; } Vector3 vector5 = this.left[i]; Vector3 vector6 = this.right[i]; if (VectorMath.SignedTriangleAreaTimes2XZ(vector2, vector4, vector6) < 0f) { goto IL_2FB; } if (vector2 == vector4 || VectorMath.SignedTriangleAreaTimes2XZ(vector2, vector3, vector6) <= 0f) { vector4 = vector6; num = i; goto IL_2FB; } funnelPath.Add(vector3); vector2 = vector3; int num3 = num2; vector3 = vector2; vector4 = vector2; num2 = num3; num = num3; i = num3; IL_35F: i++; continue; IL_2FB: if (VectorMath.SignedTriangleAreaTimes2XZ(vector2, vector3, vector5) > 0f) { goto IL_35F; } if (vector2 == vector3 || VectorMath.SignedTriangleAreaTimes2XZ(vector2, vector4, vector5) >= 0f) { vector3 = vector5; num2 = i; goto IL_35F; } funnelPath.Add(vector4); vector2 = vector4; num3 = num; vector3 = vector2; vector4 = vector2; num2 = num3; num = num3; i = num3; goto IL_35F; } lastCorner = true; funnelPath.Add(this.left[count - 1]); return(true); }
public static bool IntersectsUnclamped(Vector3 a, Vector3 b, Vector3 a2, Vector3 b2) { return(VectorMath.RightOrColinearXZ(a, b, a2) != VectorMath.RightOrColinearXZ(a, b, b2)); }
public bool RunFunnel(List <VInt3> left, List <VInt3> right, List <VInt3> funnelPath) { if (left == null) { throw new ArgumentNullException("left"); } if (right == null) { throw new ArgumentNullException("right"); } if (funnelPath == null) { throw new ArgumentNullException("funnelPath"); } if (left.Count != right.Count) { throw new ArgumentException("left and right lists must have equal length"); } if (left.Count <= 3) { return(false); } while ((left[1] == left[2]) && (right[1] == right[2])) { left.RemoveAt(1); right.RemoveAt(1); if (left.Count <= 3) { return(false); } } VInt3 c = left[2]; if (c == left[1]) { c = right[2]; } while (VectorMath.IsColinearXZ(left[0], left[1], right[1]) || (VectorMath.RightOrColinearXZ(left[1], right[1], c) == VectorMath.RightOrColinearXZ(left[1], right[1], left[0]))) { left.RemoveAt(1); right.RemoveAt(1); if (left.Count <= 3) { return(false); } c = left[2]; if (c == left[1]) { c = right[2]; } } if (!VectorMath.IsClockwiseXZ(left[0], left[1], right[1]) && !VectorMath.IsColinearXZ(left[0], left[1], right[1])) { List <VInt3> list = left; left = right; right = list; } funnelPath.Add(left[0]); VInt3 a = left[0]; VInt3 b = left[1]; VInt3 num4 = right[1]; int num5 = 0; int num6 = 1; int num7 = 1; for (int i = 2; i < left.Count; i++) { if (funnelPath.Count > 0x7d0) { Debug.LogWarning("Avoiding infinite loop. Remove this check if you have this long paths."); break; } VInt3 num9 = left[i]; VInt3 num10 = right[i]; if (VectorMath.SignedTriangleAreaTimes2XZ(a, num4, num10) >= 0L) { if ((a == num4) || (VectorMath.SignedTriangleAreaTimes2XZ(a, b, num10) <= 0L)) { num4 = num10; num6 = i; } else { funnelPath.Add(b); a = b; num5 = num7; b = a; num4 = a; num7 = num5; num6 = num5; i = num5; continue; } } if (VectorMath.SignedTriangleAreaTimes2XZ(a, b, num9) <= 0L) { if ((a == b) || (VectorMath.SignedTriangleAreaTimes2XZ(a, num4, num9) >= 0L)) { b = num9; num7 = i; } else { funnelPath.Add(num4); a = num4; num5 = num6; b = a; num4 = a; num7 = num5; num6 = num5; i = num5; } } } funnelPath.Add(left[left.Count - 1]); return(true); }
public static bool Left(Vector3 a, Vector3 b, Vector3 p) { return(VectorMath.RightOrColinearXZ(a, b, p)); }
public static bool Left(Int3 a, Int3 b, Int3 p) { return(VectorMath.RightOrColinearXZ(a, b, p)); }
// Token: 0x060021CD RID: 8653 RVA: 0x0018C184 File Offset: 0x0018A384 public static bool SegmentsIntersectXZ(Int3 start1, Int3 end1, Int3 start2, Int3 end2) { return(VectorMath.RightOrColinearXZ(start1, end1, start2) != VectorMath.RightOrColinearXZ(start1, end1, end2) && VectorMath.RightOrColinearXZ(start2, end2, start1) != VectorMath.RightOrColinearXZ(start2, end2, end1)); }
public List <Vector3> SmoothOffsetSimple(List <Vector3> path) { if ((path.Count <= 2) || (this.iterations <= 0)) { return(path); } if (this.iterations > 12) { Debug.LogWarning("A very high iteration count was passed, won't let this one through"); return(path); } int capacity = ((path.Count - 2) * ((int)Mathf.Pow(2f, (float)this.iterations))) + 2; List <Vector3> list = ListPool <Vector3> .Claim(capacity); List <Vector3> list2 = ListPool <Vector3> .Claim(capacity); for (int i = 0; i < capacity; i++) { list.Add(Vector3.zero); list2.Add(Vector3.zero); } for (int j = 0; j < path.Count; j++) { list[j] = path[j]; } for (int k = 0; k < this.iterations; k++) { int num5 = ((path.Count - 2) * ((int)Mathf.Pow(2f, (float)k))) + 2; List <Vector3> list3 = list; list = list2; list2 = list3; for (int m = 0; m < (num5 - 1); m++) { Vector3 a = list2[m]; Vector3 b = list2[m + 1]; Vector3 normalized = Vector3.Cross(b - a, Vector3.up).normalized; bool flag = false; bool flag2 = false; bool flag3 = false; bool flag4 = false; if ((m != 0) && !VectorMath.IsColinearXZ(a, b, list2[m - 1])) { flag3 = true; flag = VectorMath.RightOrColinearXZ(a, b, list2[m - 1]); } if ((m < (num5 - 1)) && !VectorMath.IsColinearXZ(a, b, list2[m + 2])) { flag4 = true; flag2 = VectorMath.RightOrColinearXZ(a, b, list2[m + 2]); } if (flag3) { list[m * 2] = a + (!flag ? ((Vector3)((-normalized * this.offset) * 1f)) : ((Vector3)((normalized * this.offset) * 1f))); } else { list[m * 2] = a; } if (flag4) { list[(m * 2) + 1] = b + (!flag2 ? ((Vector3)((-normalized * this.offset) * 1f)) : ((Vector3)((normalized * this.offset) * 1f))); } else { list[(m * 2) + 1] = b; } } list[(((path.Count - 2) * ((int)Mathf.Pow(2f, (float)(k + 1)))) + 2) - 1] = list2[num5 - 1]; } ListPool <Vector3> .Release(list2); return(list); }
// Token: 0x060021C5 RID: 8645 RVA: 0x0018BF68 File Offset: 0x0018A168 public static bool IsClockwiseOrColinearXZ(Int3 a, Int3 b, Int3 c) { return(VectorMath.RightOrColinearXZ(a, b, c)); }
public static bool RunFunnel(List<Vector3> left, List<Vector3> right, List<Vector3> funnelPath) { if (left == null) { throw new ArgumentNullException("left"); } if (right == null) { throw new ArgumentNullException("right"); } if (funnelPath == null) { throw new ArgumentNullException("funnelPath"); } if (left.Count != right.Count) { throw new ArgumentException("left and right lists must have equal length"); } if (left.Count < 3) { return false; } while (left[1] == left[2] && right[1] == right[2]) { left.RemoveAt(1); right.RemoveAt(1); if (left.Count <= 3) { return false; } } Vector3 vector = left[2]; if (vector == left[1]) { vector = right[2]; } while (VectorMath.IsColinearXZ(left[0], left[1], right[1]) || VectorMath.RightOrColinearXZ(left[1], right[1], vector) == VectorMath.RightOrColinearXZ(left[1], right[1], left[0])) { left.RemoveAt(1); right.RemoveAt(1); if (left.Count <= 3) { return false; } vector = left[2]; if (vector == left[1]) { vector = right[2]; } } if (!VectorMath.IsClockwiseXZ(left[0], left[1], right[1]) && !VectorMath.IsColinearXZ(left[0], left[1], right[1])) { List<Vector3> list = left; left = right; right = list; } funnelPath.Add(left[0]); Vector3 vector2 = left[0]; Vector3 vector3 = left[1]; Vector3 vector4 = right[1]; int num = 1; int num2 = 1; int i = 2; while (i < left.Count) { if (funnelPath.Count > 2000) { Debug.LogWarning("Avoiding infinite loop. Remove this check if you have this long paths."); break; } Vector3 vector5 = left[i]; Vector3 vector6 = right[i]; if (VectorMath.SignedTriangleAreaTimes2XZ(vector2, vector4, vector6) < 0f) { goto IL_279; } if (vector2 == vector4 || VectorMath.SignedTriangleAreaTimes2XZ(vector2, vector3, vector6) <= 0f) { vector4 = vector6; num = i; goto IL_279; } funnelPath.Add(vector3); vector2 = vector3; int num3 = num2; vector3 = vector2; vector4 = vector2; num2 = num3; num = num3; i = num3; IL_2DD: i++; continue; IL_279: if (VectorMath.SignedTriangleAreaTimes2XZ(vector2, vector3, vector5) > 0f) { goto IL_2DD; } if (vector2 == vector3 || VectorMath.SignedTriangleAreaTimes2XZ(vector2, vector4, vector5) >= 0f) { vector3 = vector5; num2 = i; goto IL_2DD; } funnelPath.Add(vector4); vector2 = vector4; num3 = num; vector3 = vector2; vector4 = vector2; num2 = num3; num = num3; i = num3; goto IL_2DD; } funnelPath.Add(left[left.Count - 1]); return true; }
public bool FindNextCorners(Vector3 origin, int startIndex, List <Vector3> funnelPath, int numCorners, out bool lastCorner) { lastCorner = false; if (this.left == null) { throw new Exception("left list is null"); } if (this.right == null) { throw new Exception("right list is null"); } if (funnelPath == null) { throw new ArgumentNullException("funnelPath"); } if (this.left.Count != this.right.Count) { throw new ArgumentException("left and right lists must have equal length"); } int count = this.left.Count; if (count == 0) { throw new ArgumentException("no diagonals"); } if ((count - startIndex) < 3) { funnelPath.Add(this.left[count - 1]); lastCorner = true; return(true); } while ((this.left[startIndex + 1] == this.left[startIndex + 2]) && (this.right[startIndex + 1] == this.right[startIndex + 2])) { startIndex++; if ((count - startIndex) <= 3) { return(false); } } Vector3 p = this.left[startIndex + 2]; if (p == this.left[startIndex + 1]) { p = this.right[startIndex + 2]; } while (VectorMath.IsColinearXZ(origin, this.left[startIndex + 1], this.right[startIndex + 1]) || (VectorMath.RightOrColinearXZ(this.left[startIndex + 1], this.right[startIndex + 1], p) == VectorMath.RightOrColinearXZ(this.left[startIndex + 1], this.right[startIndex + 1], origin))) { startIndex++; if ((count - startIndex) < 3) { funnelPath.Add(this.left[count - 1]); lastCorner = true; return(true); } p = this.left[startIndex + 2]; if (p == this.left[startIndex + 1]) { p = this.right[startIndex + 2]; } } Vector3 a = origin; Vector3 b = this.left[startIndex + 1]; Vector3 vector4 = this.right[startIndex + 1]; int num2 = startIndex; int num3 = startIndex + 1; int num4 = startIndex + 1; for (int i = startIndex + 2; i < count; i++) { if (funnelPath.Count >= numCorners) { return(true); } if (funnelPath.Count > 0x7d0) { Debug.LogWarning("Avoiding infinite loop. Remove this check if you have this long paths."); break; } Vector3 c = this.left[i]; Vector3 vector6 = this.right[i]; if (VectorMath.SignedTriangleAreaTimes2XZ(a, vector4, vector6) >= 0f) { if ((a == vector4) || (VectorMath.SignedTriangleAreaTimes2XZ(a, b, vector6) <= 0f)) { vector4 = vector6; num3 = i; } else { funnelPath.Add(b); a = b; num2 = num4; b = a; vector4 = a; num4 = num2; num3 = num2; i = num2; continue; } } if (VectorMath.SignedTriangleAreaTimes2XZ(a, b, c) <= 0f) { if ((a == b) || (VectorMath.SignedTriangleAreaTimes2XZ(a, vector4, c) >= 0f)) { b = c; num4 = i; } else { funnelPath.Add(vector4); a = vector4; num2 = num3; b = a; vector4 = a; num4 = num2; num3 = num2; i = num2; } } } lastCorner = true; funnelPath.Add(this.left[count - 1]); return(true); }
public static bool RunFunnel(List <Vector3> left, List <Vector3> right, List <Vector3> funnelPath) { if (left == null) { throw new ArgumentNullException("left"); } if (right == null) { throw new ArgumentNullException("right"); } if (funnelPath == null) { throw new ArgumentNullException("funnelPath"); } if (left.Count != right.Count) { throw new ArgumentException("left and right lists must have equal length"); } if (left.Count <= 3) { return(false); } while ((left[1] == left[2]) && (right[1] == right[2])) { left.RemoveAt(1); right.RemoveAt(1); if (left.Count <= 3) { return(false); } } Vector3 p = left[2]; if (p == left[1]) { p = right[2]; } while (VectorMath.IsColinearXZ(left[0], left[1], right[1]) || (VectorMath.RightOrColinearXZ(left[1], right[1], p) == VectorMath.RightOrColinearXZ(left[1], right[1], left[0]))) { left.RemoveAt(1); right.RemoveAt(1); if (left.Count <= 3) { return(false); } p = left[2]; if (p == left[1]) { p = right[2]; } } if (!VectorMath.IsClockwiseXZ(left[0], left[1], right[1]) && !VectorMath.IsColinearXZ(left[0], left[1], right[1])) { List <Vector3> list = left; left = right; right = list; } funnelPath.Add(left[0]); Vector3 a = left[0]; Vector3 b = left[1]; Vector3 vector4 = right[1]; int num = 0; int num2 = 1; int num3 = 1; for (int i = 2; i < left.Count; i++) { if (funnelPath.Count > 0x7d0) { Debug.LogWarning("Avoiding infinite loop. Remove this check if you have this long paths."); break; } Vector3 c = left[i]; Vector3 vector6 = right[i]; if (VectorMath.SignedTriangleAreaTimes2XZ(a, vector4, vector6) >= 0f) { if ((a == vector4) || (VectorMath.SignedTriangleAreaTimes2XZ(a, b, vector6) <= 0f)) { vector4 = vector6; num2 = i; } else { funnelPath.Add(b); a = b; num = num3; b = a; vector4 = a; num3 = num; num2 = num; i = num; continue; } } if (VectorMath.SignedTriangleAreaTimes2XZ(a, b, c) <= 0f) { if ((a == b) || (VectorMath.SignedTriangleAreaTimes2XZ(a, vector4, c) >= 0f)) { b = c; num3 = i; } else { funnelPath.Add(vector4); a = vector4; num = num2; b = a; vector4 = a; num3 = num; num2 = num; i = num; } } } funnelPath.Add(left[left.Count - 1]); return(true); }
private RadiusModifier.TangentType CalculateTangentTypeSimple(Vector3 p1, Vector3 p2, Vector3 p3) { bool flag = VectorMath.RightOrColinearXZ(p1, p2, p3); bool flag2 = flag; return (RadiusModifier.TangentType)(1 << (((!flag2) ? 0 : 2) + ((!flag) ? 0 : 1) & 31)); }