Example #1
0
    /// <summary>
    /// Builds a Single polygon out of the NavMesh, called by BuildNavMeshGeometry
    /// </summary>
    /// <param name="refId"></param>
    /// <param name="color"></param>
    /// <param name="verts"></param>
    /// <param name="colors"></param>
    /// <param name="uvs"></param>
    /// <param name="tris"></param>
    private void BuildNavMeshPoly(long refId, Color color, List<Vector3> verts, List<Color> colors, List<Vector2> uvs, List<int> tris, RecastNavTile navTile)
    {
        MeshTile tile = null;
        Poly poly = null;
        if ((NavMesh.GetTileAndPolyByRef(refId, ref tile, ref poly) & Status.Failure) != 0)
            return;

        long ip = 0;
        for (int i = 0; i < tile.Polys.Length; i++)
        {
            if (poly == tile.Polys[i])
                ip = i;
        }
        if (poly.Type == Detour.AtavismNavTile.PolyTypeOffMeshConnection)
        {
        }
        else
        {
            PolyDetail pd = tile.DetailMeshes[ip];
            for (int i = 0; i < pd.TriCount; i++)
            {
                int t = ((int)pd.TriBase + i) * 4;
                for (int j = 0; j < 3; j++)
                {
                    if (tile.DetailTris[t + j] < poly.VertCount)
                    {
                        Vector3 newVerts = new Vector3(tile.Verts[poly.Verts[tile.DetailTris[t + j]] * 3 + 0], tile.Verts[poly.Verts[tile.DetailTris[t + j]] * 3 + 1], tile.Verts[poly.Verts[tile.DetailTris[t + j]] * 3 + 2]);
                        verts.Add(newVerts);
                        navTile.NavMeshVerts.Add(newVerts);
                    }
                    else
                    {
                        Vector3 newVerts = new Vector3(tile.DetailVerts[(pd.VertBase + tile.DetailTris[t + j] - poly.VertCount) * 3 + 0],
                                                      tile.DetailVerts[(pd.VertBase + tile.DetailTris[t + j] - poly.VertCount) * 3 + 1],
                                                      tile.DetailVerts[(pd.VertBase + tile.DetailTris[t + j] - poly.VertCount) * 3 + 2]);
                        verts.Add(newVerts);
                        navTile.NavMeshVerts.Add(newVerts);
                    }
                    uvs.Add(new Vector2());
                    navTile.NavMeshUVs.Add(new Vector2());
                    colors.Add(color);//duIntToCol((int)ip, 192));
                    navTile.NavMeshColors.Add(color);
                    tris.Add(tris.Count);
                    navTile.NavMeshTriangles.Add(navTile.NavMeshTriangles.Count);
                }
            }
        }
    }
Example #2
0
 /// <summary>
 /// Builds the NavMesh geometry into a Unity3d Mesh to display for debug
 /// </summary>
 public void BuildNavMeshGeometry()
 {
     foreach(RecastNavTile navTile in recastNavTiles) {
         DestroyImmediate(navTile.MeshObject);
     }
     recastNavTiles.Clear();
     if (NavMesh != null)
     {
         NavMeshTriangles = new List<int>();
         NavMeshVerts = new List<Vector3>();
         NavMeshUVs = new List<Vector2>();
         NavMeshColors = new List<Color>();
         for (int i = 0; i < NavMesh.GetMaxTiles(); i++)
         {
             MeshTile tile = NavMesh.GetTile(i);
             if (tile.Header == null)
                 continue;
             RecastNavTile navTile = new RecastNavTile();
             long baseId = NavMesh.GetPolyRefBase(tile);
             for (int j = 0; j < tile.Header.PolyCount; j++)
             {
                 BuildNavMeshPoly(baseId | (uint)j, duRGBA(0, 0, 64, 128), NavMeshVerts, NavMeshColors, NavMeshUVs, NavMeshTriangles, navTile);
             }
             navTile.x = tile.Header.X;
             navTile.y = tile.Header.Y;
             navTile.builder = tile.Data;
             recastNavTiles.Add(navTile);
         }
     }
 }