Example #1
0
    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);
    }
Example #3
0
    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);
 }
Example #5
0
    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));
    }
Example #6
0
    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);
    }
Example #9
0
 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);
 }