/// <summary> /// Draws the polygon boundary lines based on the height detail. /// </summary> private static void DrawPolyBoundaries(NavmeshTileHeader header , NavmeshPoly[] polys , Vector3[] verts , NavmeshDetailMesh[] meshes , byte[] detailTris , Vector3[] detailVerts , NavmeshLink[] links , Color color , bool inner) { const float thr = 0.01f * 0.01f; for (int i = 0; i < header.polyCount; i++) { NavmeshPoly poly = polys[i]; if (poly.Type == NavmeshPolyType.OffMeshConnection) { continue; } NavmeshDetailMesh mesh = meshes[i]; Vector3[] tv = new Vector3[3]; for (int j = 0, nj = (int)poly.vertCount; j < nj; j++) { Color c = color; // Color may change. if (inner) { if (poly.neighborPolyRefs[j] == 0) { continue; } if ((poly.neighborPolyRefs[j] & Navmesh.ExternalLink) != 0) { bool con = false; for (uint k = poly.firstLink ; k != Navmesh.NullLink ; k = links[k].next) { if (links[k].edge == j) { con = true; break; } } if (con) { c = new Color(1, 1, 1, 0.2f); } else { c = new Color(0, 0, 0, 0.2f); } } else { c = new Color(0, 0.2f, 0.25f, 0.13f); } } else { if (poly.neighborPolyRefs[j] != 0) { continue; } } GL.Color(c); int pVertA = poly.indices[j]; int pVertB = poly.indices[(j + 1) % nj]; for (int k = 0; k < mesh.triCount; k++) { int pTri = (int)((mesh.triBase + k) * 4); for (int m = 0; m < 3; m++) { int iVert = detailTris[pTri + m]; if (iVert < poly.vertCount) { int pv = poly.indices[iVert]; tv[m] = verts[pv]; } else { int pv = (int)(mesh.vertBase + (iVert - poly.vertCount)); tv[m] = detailVerts[pv]; } } for (int m = 0, n = 2; m < 3; n = m++) { if (((detailTris[pTri + 3] >> (n * 2)) & 0x3) == 0) { // Skip inner detail edges. continue; } float distN = Line2.GetPointLineDistanceSq( new Vector2(tv[n].x, tv[n].z) , new Vector2(verts[pVertA].x, verts[pVertA].z) , new Vector2(verts[pVertB].x, verts[pVertB].z)); float distM = Line2.GetPointLineDistanceSq( new Vector2(tv[m].x, tv[m].z) , new Vector2(verts[pVertA].x, verts[pVertA].z) , new Vector2(verts[pVertB].x, verts[pVertB].z)); if (distN < thr && distM < thr) { GL.Vertex(tv[n]); GL.Vertex(tv[m]); } } } } } }