Example #1
0
 private static void MoveFromNode(TriangleMeshNode node, int startEdge, VInt3 srcLoc, VInt3 destLoc, MoveDirectionState state, out VInt3 result)
 {
     result = srcLoc;
     while (node != null)
     {
         int num;
         int num10;
         int count = 2;
         if (node.IsVertex(srcLoc, out num))
         {
             int vertexIndex             = node.GetVertexIndex(num);
             List <TMNodeInfo> nodeInfos = null;
             GetAllNodesByVert(ref nodeInfos, node, vertexIndex);
             TriangleMeshNode node2 = null;
             int vi = -1;
             for (int i = 0; i < nodeInfos.Count; i++)
             {
                 TMNodeInfo info = nodeInfos[i];
                 if ((!checkedNodes.Contains(info.node) && !Polygon.LeftNotColinear(info.v0, info.v2, destLoc)) && Polygon.Left(info.v0, info.v1, destLoc))
                 {
                     node2 = info.node;
                     vi    = info.vi;
                     break;
                 }
             }
             if (node2 != null)
             {
                 node      = node2;
                 startEdge = (vi + 1) % 3;
                 count     = 1;
             }
             else
             {
                 int     num6   = -1;
                 VFactor factor = new VFactor {
                     nom = -2L,
                     den = 1L
                 };
                 for (int j = 0; j < nodeInfos.Count; j++)
                 {
                     TMNodeInfo info2 = nodeInfos[j];
                     if (!checkedNodes.Contains(info2.node))
                     {
                         int     num8;
                         VFactor factor2 = info2.GetCosineAngle(destLoc, state, out num8);
                         if (factor2 > factor)
                         {
                             factor = factor2;
                             num6   = num8;
                             node2  = info2.node;
                         }
                     }
                 }
                 if (node2 != null)
                 {
                     MoveAlongEdge(node2, num6, srcLoc, destLoc, state, out result, true);
                     break;
                 }
             }
         }
         int edge = -1;
         if (startEdge == -1)
         {
             edge = node.EdgeIntersect(srcLoc, destLoc);
         }
         else
         {
             edge = node.EdgeIntersect(srcLoc, destLoc, startEdge, count);
         }
         if (edge == -1)
         {
             if (node.ContainsPoint(destLoc))
             {
                 result = destLoc;
                 if (MoveAxisY)
                 {
                     CalculateY(ref result, node);
                 }
             }
             else
             {
                 edge = node.GetColinearEdge(srcLoc, destLoc);
                 if (edge != -1)
                 {
                     MoveAlongEdge(node, edge, srcLoc, destLoc, state, out result, true);
                 }
             }
             break;
         }
         TriangleMeshNode neighborByEdge = node.GetNeighborByEdge(edge, out num10);
         if (neighborByEdge != null)
         {
             node      = neighborByEdge;
             startEdge = num10 + 1;
             count     = 2;
         }
         else
         {
             MoveAlongEdge(node, edge, srcLoc, destLoc, state, out result, true);
             break;
         }
     }
 }
 private static void MoveFromNode(TriangleMeshNode node, int startEdge, VInt3 srcLoc, VInt3 destLoc, MoveDirectionState state, out VInt3 result)
 {
     result = srcLoc;
     while (node != null)
     {
         int count = 2;
         int i;
         if (node.IsVertex(srcLoc, out i))
         {
             int vertexIndex = node.GetVertexIndex(i);
             List <PathfindingUtility.TMNodeInfo> list = null;
             PathfindingUtility.GetAllNodesByVert(ref list, node, vertexIndex);
             TriangleMeshNode triangleMeshNode = null;
             int num = -1;
             for (int j = 0; j < list.get_Count(); j++)
             {
                 PathfindingUtility.TMNodeInfo tMNodeInfo = list.get_Item(j);
                 if (!PathfindingUtility.checkedNodes.Contains(tMNodeInfo.node) && !Polygon.LeftNotColinear(tMNodeInfo.v0, tMNodeInfo.v2, destLoc) && Polygon.Left(tMNodeInfo.v0, tMNodeInfo.v1, destLoc))
                 {
                     triangleMeshNode = tMNodeInfo.node;
                     num = tMNodeInfo.vi;
                     break;
                 }
             }
             if (triangleMeshNode != null)
             {
                 node      = triangleMeshNode;
                 startEdge = (num + 1) % 3;
                 count     = 1;
             }
             else
             {
                 int     edge = -1;
                 VFactor b    = new VFactor
                 {
                     nom = -2L,
                     den = 1L
                 };
                 for (int k = 0; k < list.get_Count(); k++)
                 {
                     PathfindingUtility.TMNodeInfo tMNodeInfo2 = list.get_Item(k);
                     if (!PathfindingUtility.checkedNodes.Contains(tMNodeInfo2.node))
                     {
                         int     num2;
                         VFactor cosineAngle = tMNodeInfo2.GetCosineAngle(destLoc, state, out num2);
                         if (cosineAngle > b)
                         {
                             b                = cosineAngle;
                             edge             = num2;
                             triangleMeshNode = tMNodeInfo2.node;
                         }
                     }
                 }
                 if (triangleMeshNode != null)
                 {
                     PathfindingUtility.MoveAlongEdge(triangleMeshNode, edge, srcLoc, destLoc, state, out result, true);
                     break;
                 }
             }
         }
         int num3;
         if (startEdge == -1)
         {
             num3 = node.EdgeIntersect(srcLoc, destLoc);
         }
         else
         {
             num3 = node.EdgeIntersect(srcLoc, destLoc, startEdge, count);
         }
         if (num3 == -1)
         {
             if (node.ContainsPoint(destLoc))
             {
                 result = destLoc;
                 if (PathfindingUtility.MoveAxisY)
                 {
                     PathfindingUtility.CalculateY(ref result, node);
                 }
             }
             else
             {
                 num3 = node.GetColinearEdge(srcLoc, destLoc);
                 if (num3 != -1)
                 {
                     PathfindingUtility.MoveAlongEdge(node, num3, srcLoc, destLoc, state, out result, true);
                 }
             }
             break;
         }
         int num4;
         TriangleMeshNode neighborByEdge = node.GetNeighborByEdge(num3, out num4);
         if (neighborByEdge == null)
         {
             PathfindingUtility.MoveAlongEdge(node, num3, srcLoc, destLoc, state, out result, true);
             break;
         }
         node      = neighborByEdge;
         startEdge = num4 + 1;
     }
 }