///<summary> /// Return a single character that describes the polygon /// contained in a cell in the list, or else the result of /// DumpGridCell ///</summary> protected string DumpGridPolygon(List<GridCell> cells, GridDumpKind kind) { int indexSub = (kind == GridDumpKind.CVPolygons ? 1 : firstTerrainIndex); foreach(GridCell cell in cells) { if (cell.polygon == null || (kind == GridDumpKind.CVPolygons && cell.status != CellStatus.OverCV) || (kind == GridDumpKind.TerrainPolygons && cell.status != CellStatus.OverTerrain)) continue; if (cell.polygon.index < polygonID.Length) return polygonID.Substring(cell.polygon.index - indexSub, 1); else return "#"; } return DumpGridCell(cells); }
protected void DumpGrid(string title, GridDumpKind kind, bool append) { DumpGrid(title, kind, append, 0, 0); }
protected void DumpGrid(string title, GridDumpKind kind, bool append, int count) { DumpGrid(title, kind, append, count, 0); }
///<summary> /// Dump the grid, with the given title, putting the file /// PathGeneratorLog.txt in the ../ directory. If append /// is false, create a new file; if true, append to the /// existing file. ///</summary> protected void DumpGrid(string title, GridDumpKind kind, bool append, int count, int subCount) { if (!dumpGrid) return; // Dump the header rows string hundreds = ""; string tens = ""; string ones = ""; for (int i=0; i<xCount; i++) { hundreds += digits.Substring(i / 100, 1); tens += digits.Substring((int)Decimal.Remainder(i, 100) / 10, 1); ones += digits.Substring((int)Decimal.Remainder(i, 10), 1); } string p = "../PathGeneratorLog.txt"; FileStream f = new FileStream(p, (appendGridDump || append) ? (File.Exists(p) ? FileMode.Append : FileMode.Create) : FileMode.Create, FileAccess.Write); StreamWriter writer = new StreamWriter(f); long elapsedMilliseconds = stopwatch.ElapsedMilliseconds; writer.Write(string.Format("{0} Started writing '{1}' for model '{2}' to {3}\n{4} milliseconds since creation of the PathGenerator instance\n\n", DateTime.Now.ToString("F"), title, modelName, p, elapsedMilliseconds)); switch (kind) { case GridDumpKind.CVPolygons: writer.Write("{0} Collision Volume Polygons\n\n", count); break; case GridDumpKind.TerrainPolygons: writer.Write("{0} Terrain Polygons\n\n", count); break; case GridDumpKind.Portals: writer.Write("{0} Terrain Portals\n\n", count); break; case GridDumpKind.EdgeCells: writer.Write("{0} Edge Cells; {1} Vertices\n\n", count, subCount); break; } writer.Write(" {0}\n" + " {1}\n" + " {2}\n" + "\n", hundreds, tens, ones); for (int i=0; i<zCount; i++) { string line = string.Format("{0:D4} ", i); for (int j=0; j<xCount; j++) { List<GridCell> cells = grid[j,i]; switch (kind) { case GridDumpKind.Cells: line += DumpGridCell(cells); break; case GridDumpKind.Portals: line += DumpGridPortalCell(cells); break; case GridDumpKind.EdgeCells: line += DumpGridEdgeCell(cells); break; case GridDumpKind.CVPolygons: line += DumpGridPolygon(cells, kind); break; case GridDumpKind.TerrainPolygons: line += DumpGridPolygon(cells, kind); break; } } writer.Write(line + "\n"); } writer.Write(string.Format("\nGenerating dump took {0} milliseconds\n\n", stopwatch.ElapsedMilliseconds - elapsedMilliseconds)); writer.Close(); }