private static void MoveAlongEdge(TriangleMeshNode node, int edge, VInt3 srcLoc, VInt3 destLoc, out VInt3 result) { bool flag; DebugHelper.Assert((edge >= 0) && (edge <= 2)); VInt3 vertex = node.GetVertex(edge); VInt3 num2 = node.GetVertex((edge + 1) % 3); VInt3 num3 = destLoc - srcLoc; num3.y = 0; VInt3 a = num2 - vertex; a.y = 0; a.NormalizeTo(0x3e8); int num5 = (a.x * num3.x) + (a.z * num3.z); VInt3 rhs = Polygon.IntersectionPoint(ref vertex, ref num2, ref srcLoc, ref destLoc, out flag); if (!flag) { if (!Polygon.IsColinear(vertex, num2, srcLoc) || !Polygon.IsColinear(vertex, num2, destLoc)) { result = srcLoc; return; } if (num5 >= 0) { int num7 = (a.x * (num2.x - vertex.x)) + (a.z * (num2.z - vertex.z)); int num8 = (a.x * (destLoc.x - vertex.x)) + (a.z * (destLoc.z - vertex.z)); rhs = (num7 <= num8) ? num2 : destLoc; DebugHelper.Assert((num7 >= 0) && (num8 >= 0)); } else { int num9 = (-a.x * (vertex.x - num2.x)) - (a.z * (vertex.z - num2.z)); int num10 = (-a.x * (destLoc.x - num2.x)) - (a.z * (destLoc.z - num2.z)); rhs = (Mathf.Abs(num9) <= Mathf.Abs(num10)) ? vertex : destLoc; DebugHelper.Assert((num9 >= 0) && (num10 >= 0)); } } int num11 = -IntMath.Sqrt(vertex.XZSqrMagnitude(rhs) * 0xf4240L); int num12 = IntMath.Sqrt(num2.XZSqrMagnitude(rhs) * 0xf4240L); if ((num5 >= num11) && (num5 <= num12)) { result = IntMath.Divide(a, (long)num5, 0xf4240L) + srcLoc; if (!node.ContainsPoint(result)) { int num15; int num16; int num17; int num18; Vector3 vector = (Vector3)(num2 - vertex); vector.y = 0f; vector.Normalize(); VInt3 num13 = num2 - vertex; num13.y = 0; num13 *= 0x2710; long magnitude = num13.magnitude; VFactor factor = new VFactor { nom = num5, den = magnitude * 0x3e8L }; getMinMax(out num15, out num17, (long)num13.x, ref factor); getMinMax(out num16, out num18, (long)num13.z, ref factor); if (!MakePointInTriangle(ref result, node, num15, num17, num16, num18, srcLoc) && !MakePointInTriangle(ref result, node, num15 - 4, num17 + 4, num16 - 4, num18 + 4, srcLoc)) { result = srcLoc; } } if (MoveAxisY) { CalculateY(ref result, node); } } else { int num19; int num20; VInt3 num21; int num22; if (num5 < num11) { num19 = num5 - num11; num20 = (edge + 2) % 3; num21 = vertex; } else { num19 = num5 - num12; num20 = (edge + 1) % 3; num21 = num2; } TriangleMeshNode neighborByEdge = node.GetNeighborByEdge(num20, out num22); if (neighborByEdge != null) { VInt3 num23 = ((VInt3)((a * num19) / 1000000f)) + num21; checkedNodes.Add(node); MoveFromNode(neighborByEdge, num22, num21, num23, out result); } else { result = num21; } } }
private static void MoveAlongEdge(TriangleMeshNode node, int edge, VInt3 srcLoc, VInt3 destLoc, MoveDirectionState state, out VInt3 result, bool checkAnotherEdge = true) { bool flag; DebugHelper.Assert((edge >= 0) && (edge <= 2)); VInt3 vertex = node.GetVertex(edge); VInt3 num2 = node.GetVertex((edge + 1) % 3); VInt3 a = destLoc - srcLoc; a.y = 0; VInt3 lhs = num2 - vertex; lhs.y = 0; lhs.NormalizeTo(0x3e8); int num5 = 0; if (state != null) { num5 = a.magnitude2D * 0x3e8; VInt3 num6 = !state.enabled ? a : state.firstAdjDir; if (VInt3.Dot(ref lhs, ref num6) < 0) { num5 = -num5; num6 = -lhs; } else { num6 = lhs; } if (!state.enabled) { state.enabled = true; state.firstAdjDir = VInt3.Lerp(a, num6, 1, 3); state.firstDir = state.curDir; state.adjDir = num6; } else if (VInt3.Dot(ref state.adjDir, ref num6) >= 0) { state.adjDir = num6; } else { num5 = 0; } state.applied = true; } else { num5 = (lhs.x * a.x) + (lhs.z * a.z); } VInt3 rhs = Polygon.IntersectionPoint(ref vertex, ref num2, ref srcLoc, ref destLoc, out flag); if (!flag) { if (!Polygon.IsColinear(vertex, num2, srcLoc) || !Polygon.IsColinear(vertex, num2, destLoc)) { result = srcLoc; return; } if (num5 >= 0) { int num8 = (lhs.x * (num2.x - vertex.x)) + (lhs.z * (num2.z - vertex.z)); int num9 = (lhs.x * (destLoc.x - vertex.x)) + (lhs.z * (destLoc.z - vertex.z)); rhs = (num8 <= num9) ? num2 : destLoc; DebugHelper.Assert((num8 >= 0) && (num9 >= 0)); } else { int num10 = (-lhs.x * (vertex.x - num2.x)) - (lhs.z * (vertex.z - num2.z)); int num11 = (-lhs.x * (destLoc.x - num2.x)) - (lhs.z * (destLoc.z - num2.z)); rhs = (Mathf.Abs(num10) <= Mathf.Abs(num11)) ? vertex : destLoc; DebugHelper.Assert((num10 >= 0) && (num11 >= 0)); } } int num12 = -IntMath.Sqrt(vertex.XZSqrMagnitude(rhs) * 0xf4240L); int num13 = IntMath.Sqrt(num2.XZSqrMagnitude(rhs) * 0xf4240L); if ((num5 >= num12) && (num5 <= num13)) { result = IntMath.Divide(lhs, (long)num5, 0xf4240L) + rhs; if (!node.ContainsPoint(result)) { int num16; int num17; int num18; int num19; Vector3 vector = (Vector3)(num2 - vertex); vector.y = 0f; vector.Normalize(); VInt3 num14 = num2 - vertex; num14.y = 0; num14 *= 0x2710; long magnitude = num14.magnitude; VFactor factor = new VFactor { nom = num5, den = magnitude * 0x3e8L }; getMinMax(out num16, out num18, (long)num14.x, ref factor); getMinMax(out num17, out num19, (long)num14.z, ref factor); if (!MakePointInTriangle(ref result, node, num16, num18, num17, num19, srcLoc) && !MakePointInTriangle(ref result, node, num16 - 4, num18 + 4, num17 - 4, num19 + 4, srcLoc)) { result = srcLoc; } } if (MoveAxisY) { CalculateY(ref result, node); } } else { int num20; int num21; VInt3 num22; int num24; if (num5 < num12) { num20 = num5 - num12; num21 = (edge + 2) % 3; num22 = vertex; } else { num20 = num5 - num13; num21 = (edge + 1) % 3; num22 = num2; } VInt3 num23 = (VInt3)((lhs * num20) / 1000000f); TriangleMeshNode neighborByEdge = node.GetNeighborByEdge(num21, out num24); if (neighborByEdge != null) { checkedNodes.Add(node); MoveFromNode(neighborByEdge, num24, num22, num23 + num22, state, out result); } else { if (checkAnotherEdge) { VInt3 num27 = node.GetVertex((edge + 2) % 3) - num22; if (VInt3.Dot(num27.NormalizeTo(0x3e8), num23) > 0) { checkedNodes.Add(node); MoveAlongEdge(node, num21, num22, num23 + num22, state, out result, false); return; } } result = num22; } } }
private static void MoveAlongEdge(TriangleMeshNode node, int edge, VInt3 srcLoc, VInt3 destLoc, MoveDirectionState state, out VInt3 result, bool checkAnotherEdge = true) { DebugHelper.Assert(edge >= 0 && edge <= 2); VInt3 vertex = node.GetVertex(edge); VInt3 vertex2 = node.GetVertex((edge + 1) % 3); VInt3 vInt = destLoc - srcLoc; vInt.y = 0; VInt3 vInt2 = vertex2 - vertex; vInt2.y = 0; vInt2.NormalizeTo(1000); int num; if (state != null) { num = vInt.magnitude2D * 1000; VInt3 vInt3 = state.enabled ? state.firstAdjDir : vInt; if (VInt3.Dot(ref vInt2, ref vInt3) < 0) { num = -num; vInt3 = -vInt2; } else { vInt3 = vInt2; } if (!state.enabled) { state.enabled = true; state.firstAdjDir = VInt3.Lerp(vInt, vInt3, 1, 3); state.firstDir = state.curDir; state.adjDir = vInt3; } else if (VInt3.Dot(ref state.adjDir, ref vInt3) >= 0) { state.adjDir = vInt3; } else { num = 0; } state.applied = true; } else { num = vInt2.x * vInt.x + vInt2.z * vInt.z; } bool flag; VInt3 rhs = Polygon.IntersectionPoint(ref vertex, ref vertex2, ref srcLoc, ref destLoc, out flag); if (!flag) { if (!Polygon.IsColinear(vertex, vertex2, srcLoc) || !Polygon.IsColinear(vertex, vertex2, destLoc)) { result = srcLoc; return; } if (num >= 0) { int num2 = vInt2.x * (vertex2.x - vertex.x) + vInt2.z * (vertex2.z - vertex.z); int num3 = vInt2.x * (destLoc.x - vertex.x) + vInt2.z * (destLoc.z - vertex.z); rhs = ((num2 > num3) ? destLoc : vertex2); DebugHelper.Assert(num2 >= 0 && num3 >= 0); } else { int num4 = -vInt2.x * (vertex.x - vertex2.x) - vInt2.z * (vertex.z - vertex2.z); int num5 = -vInt2.x * (destLoc.x - vertex2.x) - vInt2.z * (destLoc.z - vertex2.z); rhs = ((Mathf.Abs(num4) > Mathf.Abs(num5)) ? destLoc : vertex); DebugHelper.Assert(num4 >= 0 && num5 >= 0); } } int num6 = -IntMath.Sqrt(vertex.XZSqrMagnitude(rhs) * 1000000L); int num7 = IntMath.Sqrt(vertex2.XZSqrMagnitude(rhs) * 1000000L); if (num >= num6 && num <= num7) { result = IntMath.Divide(vInt2, (long)num, 1000000L) + rhs; if (!node.ContainsPoint(result)) { Vector3 vector = (Vector3)(vertex2 - vertex); vector.y = 0f; vector.Normalize(); VInt3 lhs = vertex2 - vertex; lhs.y = 0; lhs *= 10000; long num8 = (long)lhs.magnitude; VFactor vFactor = default(VFactor); vFactor.nom = (long)num; vFactor.den = num8 * 1000L; int num9; int num10; PathfindingUtility.getMinMax(out num9, out num10, (long)lhs.x, ref vFactor); int num11; int num12; PathfindingUtility.getMinMax(out num11, out num12, (long)lhs.z, ref vFactor); if (!PathfindingUtility.MakePointInTriangle(ref result, node, num9, num10, num11, num12, srcLoc) && !PathfindingUtility.MakePointInTriangle(ref result, node, num9 - 4, num10 + 4, num11 - 4, num12 + 4, srcLoc)) { result = srcLoc; } } if (PathfindingUtility.MoveAxisY) { PathfindingUtility.CalculateY(ref result, node); } } else { int rhs2; int edge2; VInt3 vInt4; if (num < num6) { rhs2 = num - num6; edge2 = (edge + 2) % 3; vInt4 = vertex; } else { rhs2 = num - num7; edge2 = (edge + 1) % 3; vInt4 = vertex2; } VInt3 vInt5 = vInt2 * rhs2 / 1000000f; int startEdge; TriangleMeshNode neighborByEdge = node.GetNeighborByEdge(edge2, out startEdge); if (neighborByEdge != null) { PathfindingUtility.checkedNodes.Add(node); PathfindingUtility.MoveFromNode(neighborByEdge, startEdge, vInt4, vInt5 + vInt4, state, out result); } else { if (checkAnotherEdge) { VInt3 vertex3 = node.GetVertex((edge + 2) % 3); VInt3 lhs2 = (vertex3 - vInt4).NormalizeTo(1000); if (VInt3.Dot(lhs2, vInt5) > 0) { PathfindingUtility.checkedNodes.Add(node); PathfindingUtility.MoveAlongEdge(node, edge2, vInt4, vInt5 + vInt4, state, out result, false); return; } } result = vInt4; } } }