/// <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); } } } }
/// <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); } } }