public void SetGraph ( RecastGraph graph ) { this.graph = graph; if (graph == null) return; dirtyTiles = new bool[graph.tileXCount*graph.tileZCount]; anyDirtyTiles = false; }
/** Exports the INavmesh graph to a .obj file */ public static void ExportToFile (RecastGraph target) { //INavmesh graph = (INavmesh)target; if (target == null) return; RecastGraph.NavmeshTile[] tiles = target.GetTiles(); if (tiles == null) { if (EditorUtility.DisplayDialog ("Scan graph before exporting?","The graph does not contain any mesh data. Do you want to scan it?","Ok","Cancel")) { AstarPathEditor.MenuScan (); tiles = target.GetTiles(); if (tiles == null) return; } else { return; } } string path = EditorUtility.SaveFilePanel ("Export .obj","","navmesh.obj","obj"); if (path == "") return; //Generate .obj var sb = new System.Text.StringBuilder(); string name = System.IO.Path.GetFileNameWithoutExtension (path); sb.Append ("g ").Append(name).AppendLine(); //Vertices start from 1 int vCount = 1; //Define single texture coordinate to zero sb.Append ("vt 0 0\n"); for (int t=0;t<tiles.Length;t++) { RecastGraph.NavmeshTile tile = tiles[t]; if (tile == null) continue; Int3[] vertices = tile.verts; //Write vertices for (int i=0;i<vertices.Length;i++) { var v = (Vector3)vertices[i]; sb.Append(string.Format("v {0} {1} {2}\n",-v.x,v.y,v.z)); } //Write triangles TriangleMeshNode[] nodes = tile.nodes; for (int i=0;i<nodes.Length;i++) { TriangleMeshNode node = nodes[i]; if (node == null) { Debug.LogError ("Node was null or no TriangleMeshNode. Critical error. Graph type " + target.GetType().Name); return; } if (node.GetVertexArrayIndex(0) < 0 || node.GetVertexArrayIndex(0) >= vertices.Length) throw new System.Exception ("ERR"); sb.Append(string.Format("f {0}/1 {1}/1 {2}/1\n", (node.GetVertexArrayIndex(0) + vCount),(node.GetVertexArrayIndex(1) + vCount),(node.GetVertexArrayIndex(2) + vCount))); } vCount += vertices.Length; } string obj = sb.ToString(); using (var sw = new System.IO.StreamWriter(path)) { sw.Write(obj); } }