public static bool ValidateTarget(VInt3 loc, VInt3 target, out VInt3 newTarget, out int nodeIndex) { newTarget = target; nodeIndex = -1; if (AstarPath.active == null) { return(false); } AstarData astarData = AstarPath.active.astarData; if (astarData.GetLocatedByRasterizer(target) == null) { int edge = -1; TriangleMeshNode node2 = astarData.IntersectByRasterizer(target, loc, out edge); if (node2 == null) { return(false); } VInt3[] numArray = _staticVerts; node2.GetPoints(out numArray[0], out numArray[1], out numArray[2]); bool intersects = false; VInt3 num2 = Polygon.IntersectionPoint(ref target, ref loc, ref numArray[edge], ref numArray[(edge + 1) % 3], out intersects); if (!intersects) { return(false); } newTarget = num2; } return(true); }
private static bool MakePointInTriangle(ref VInt3 result, TriangleMeshNode node, int minX, int maxX, int minZ, int maxZ, VInt3 offset) { VInt3 vInt; VInt3 vInt2; VInt3 vInt3; node.GetPoints(out vInt, out vInt2, out vInt3); long num = (long)(vInt2.x - vInt.x); long num2 = (long)(vInt3.x - vInt2.x); long num3 = (long)(vInt.x - vInt3.x); long num4 = (long)(vInt2.z - vInt.z); long num5 = (long)(vInt3.z - vInt2.z); long num6 = (long)(vInt.z - vInt3.z); for (int i = minX; i <= maxX; i++) { for (int j = minZ; j <= maxZ; j++) { int num7 = i + offset.x; int num8 = j + offset.z; if (num * (long)(num8 - vInt.z) - (long)(num7 - vInt.x) * num4 <= 0L && num2 * (long)(num8 - vInt2.z) - (long)(num7 - vInt2.x) * num5 <= 0L && num3 * (long)(num8 - vInt3.z) - (long)(num7 - vInt3.x) * num6 <= 0L) { result.x = num7; result.z = num8; return(true); } } } return(false); }
private static bool MakePointInTriangle(ref VInt3 result, TriangleMeshNode node, int minX, int maxX, int minZ, int maxZ, VInt3 offset) { VInt3 num; VInt3 num2; VInt3 num3; node.GetPoints(out num, out num2, out num3); long num4 = num2.x - num.x; long num5 = num3.x - num2.x; long num6 = num.x - num3.x; long num7 = num2.z - num.z; long num8 = num3.z - num2.z; long num9 = num.z - num3.z; for (int i = minX; i <= maxX; i++) { for (int j = minZ; j <= maxZ; j++) { int num12 = i + offset.x; int num13 = j + offset.z; if (((((num4 * (num13 - num.z)) - ((num12 - num.x) * num7)) <= 0L) && (((num5 * (num13 - num2.z)) - ((num12 - num2.x) * num8)) <= 0L)) && (((num6 * (num13 - num3.z)) - ((num12 - num3.x) * num9)) <= 0L)) { result.x = num12; result.z = num13; return(true); } } } return(false); }
private static bool CheckNearestNodeIntersection(TriangleMeshNode node, VInt3 srcLoc, VInt3 destLoc, ref int edge) { if (!node.ContainsPoint(destLoc)) { int num = 0; VInt3[] staticVerts = PathfindingUtility._staticVerts; node.GetPoints(out staticVerts[0], out staticVerts[1], out staticVerts[2]); float num2 = 3.40282347E+38f; int num3 = -1; Vector3 vector = (Vector3)srcLoc; Vector3 end = (Vector3)destLoc; for (int i = 0; i < 3; i++) { if (Polygon.Intersects(staticVerts[i], staticVerts[(i + 1) % 3], srcLoc, destLoc)) { num++; bool inCondition; Vector3 vector2 = Polygon.IntersectionPoint((Vector3)staticVerts[i], (Vector3)staticVerts[(i + 1) % 3], vector, end, out inCondition); DebugHelper.Assert(inCondition); float num4 = vector.XZSqrMagnitude(ref vector2); if (num4 < num2) { num2 = num4; num3 = i; } } } if (num != 2 || num3 == -1) { return(false); } edge = num3; } return(true); }
private static float CalculateY(Vector3 pf, TriangleMeshNode node) { Vector3 vector; Vector3 vector2; Vector3 vector3; node.GetPoints(out vector, out vector2, out vector3); float num = ((vector2.z - vector3.z) * (vector.x - vector3.x)) + ((vector3.x - vector2.x) * (vector.z - vector3.z)); float num2 = 1f / num; float num3 = ((vector2.z - vector3.z) * (pf.x - vector3.x)) + ((vector3.x - vector2.x) * (pf.z - vector3.z)); num3 *= num2; float num4 = ((vector3.z - vector.z) * (pf.x - vector3.x)) + ((vector.x - vector3.x) * (pf.z - vector3.z)); num4 *= num2; float num5 = (1f - num3) - num4; return(((num3 * vector.y) + (num4 * vector2.y)) + (num5 * vector3.y)); }
private static float CalculateY(Vector3 pf, TriangleMeshNode node) { Vector3 vector; Vector3 vector2; Vector3 vector3; node.GetPoints(ref vector, ref vector2, ref vector3); float num = (vector2.z - vector3.z) * (vector.x - vector3.x) + (vector3.x - vector2.x) * (vector.z - vector3.z); float num2 = 1f / num; float num3 = (vector2.z - vector3.z) * (pf.x - vector3.x) + (vector3.x - vector2.x) * (pf.z - vector3.z); num3 *= num2; float num4 = (vector3.z - vector.z) * (pf.x - vector3.x) + (vector.x - vector3.x) * (pf.z - vector3.z); num4 *= num2; float num5 = 1f - num3 - num4; return(num3 * vector.y + num4 * vector2.y + num5 * vector3.y); }
private static float CalculateY_Clamped(Vector3 pf, TriangleMeshNode node) { Vector3 vector; Vector3 vector2; Vector3 vector3; node.GetPoints(out vector, out vector2, out vector3); float num = (vector2.z - vector3.z) * (vector.x - vector3.x) + (vector3.x - vector2.x) * (vector.z - vector3.z); float num2 = 1f / num; float num3 = (vector2.z - vector3.z) * (pf.x - vector3.x) + (vector3.x - vector2.x) * (pf.z - vector3.z); num3 *= num2; num3 = Mathf.Clamp01(num3); float num4 = (vector3.z - vector.z) * (pf.x - vector3.x) + (vector.x - vector3.x) * (pf.z - vector3.z); num4 *= num2; num4 = Mathf.Clamp01(num4); float num5 = Mathf.Clamp01(1f - num3 - num4); return(num3 * vector.y + num4 * vector2.y + num5 * vector3.y); }
public static bool ValidateTarget(VInt3 loc, VInt3 target, out VInt3 newTarget, out int nodeIndex) { newTarget = target; nodeIndex = -1; if (!AstarPath.active) { return(false); } AstarData astarData = AstarPath.active.astarData; TriangleMeshNode locatedByRasterizer = astarData.GetLocatedByRasterizer(target); if (locatedByRasterizer != null) { return(true); } int num = -1; TriangleMeshNode triangleMeshNode = astarData.IntersectByRasterizer(target, loc, out num); if (triangleMeshNode == null) { return(false); } VInt3[] staticVerts = PathfindingUtility._staticVerts; triangleMeshNode.GetPoints(out staticVerts[0], out staticVerts[1], out staticVerts[2]); bool flag = false; VInt3 vInt = Polygon.IntersectionPoint(ref target, ref loc, ref staticVerts[num], ref staticVerts[(num + 1) % 3], out flag); if (!flag) { return(false); } if (!PathfindingUtility.MakePointInTriangle(ref vInt, triangleMeshNode, -4, 4, -4, 4, VInt3.zero)) { return(false); } newTarget = vInt; return(true); }
private static bool CheckNearestNodeIntersection(TriangleMeshNode node, VInt3 srcLoc, VInt3 destLoc, ref int edge) { if (!node.ContainsPoint(destLoc)) { int num = 0; VInt3[] numArray = _staticVerts; node.GetPoints(out numArray[0], out numArray[1], out numArray[2]); float maxValue = float.MaxValue; int num3 = -1; Vector3 vector = (Vector3)srcLoc; Vector3 vector2 = (Vector3)destLoc; for (int i = 0; i < 3; i++) { if (Polygon.Intersects(numArray[i], numArray[(i + 1) % 3], srcLoc, destLoc)) { bool flag; num++; Vector3 b = Polygon.IntersectionPoint((Vector3)numArray[i], (Vector3)numArray[(i + 1) % 3], vector, vector2, out flag); DebugHelper.Assert(flag); float num5 = vector.XZSqrMagnitude(ref b); if (num5 < maxValue) { maxValue = num5; num3 = i; } } } if ((num != 2) || (num3 == -1)) { object[] args = new object[] { srcLoc, destLoc, node.NodeIndex, acotrName }; string str = string.Format("Nav: Can't move, src:{0}, dest:{1}, node:{2}, actor:{3}", args); return(false); } edge = num3; } return(true); }