static int Main(string[] args) { bool help = false; bool version = false; List<string> files = new List<string>(); var set = new OptionSet() .Add("verbosity=|v=", "Changes verbosity level. Valid options:\ns[ilent]\nm[inimal]\nn[ormal]\nv[erbose]\nd[ebug]", opt => { Log.Verbosity = Verbosity.Parse(opt); }) .Add("version", "Displays version information", opt => version = (opt != null)) .Add("help|h", "Displays usage information", opt => help = (opt != null)); try { files = set.Parse(args); } catch (OptionException) { Log.Error("Invalid option."); Log.WriteLine("usage: sharpnav <OPTIONS> [FILES]"); Log.WriteLine("Avaliable Options:"); set.WriteOptionDescriptions(Console.Out); return 1; } if (help) { Log.WriteLine("usage: sharpnav <OPTIONS> [FILES]"); Log.WriteLine("Available Options:"); set.WriteOptionDescriptions(Console.Out); return 0; } if (version) { Log.WriteLine("SharpNav " + SharpNavVersion); Log.WriteLine("SharpNav.CLI " + ThisVersion); return 0; } if (files.Count == 0) { Log.Error("No configuration files to process."); return 1; } Log.Info("Number of files to parse: " + files.Count); foreach (var f in files) { StreamReader input = null; Log.Info("Parsing file \"" + f + "\""); try { input = new StreamReader(f); } catch (Exception e) { Log.Error("Error opening file \"" + f + "\"."); Log.Debug(e.GetType().ToString() + " thrown:"); Log.Debug(e.StackTrace, 1); return 1; } var deserializer = new Deserializer(namingConvention: new HyphenatedNamingConvention()); var setting = deserializer.Deserialize<Settings>(input); Log.Debug("Parsed configuration:"); Log.Debug("Cell Size: " + setting.Config.CellSize, 1); Log.Debug("Cell Height: " + setting.Config.CellHeight, 1); Log.Debug("Max Climb: " + setting.Config.MaxClimb, 1); Log.Debug("Agent Height: " + setting.Config.AgentHeight, 1); Log.Debug("Agent Radius: " + setting.Config.AgentRadius, 1); Log.Debug("Min Region Size: " + setting.Config.MinRegionSize, 1); Log.Debug("Merged Region Size: " + setting.Config.MergedRegionSize, 1); Log.Debug("Max Edge Length: " + setting.Config.MaxEdgeLength, 1); Log.Debug("Max Edge Error: " + setting.Config.MaxEdgeError, 1); Log.Debug("Verts Per Poly: " + setting.Config.VertsPerPoly, 1); Log.Debug("Sample Distance: " + setting.Config.SampleDistance, 1); Log.Debug("Max Sample Error: " + setting.Config.MaxSampleError, 1); Log.Debug(""); Log.Debug("Output File: " + setting.Export, 1); Log.Debug(""); Log.Debug("Meshes"); List<string> meshes = new List<string>(); List<ObjModel> models = new List<ObjModel>(); foreach (var mesh in setting.Meshes) { Log.Debug("Path: " + mesh.Path, 2); Log.Debug("Scale: " + mesh.Scale, 2); meshes.Add(mesh.Path); //Log.Debug("array: " + mesh.Position[0] + " " + mesh.Position[1] + " " + mesh.Position[2]); mesh.vector = new Vector3(mesh.Position[0], mesh.Position[1], mesh.Position[2]); //Log.Debug("vector: " + mesh.vector.X + " " + mesh.vector.Y + " " + mesh.vector.Z); if (File.Exists(mesh.Path)) { ObjModel obj = new ObjModel(mesh.Path); float scale = mesh.Scale; //TODO SCALE THE OBJ FILE models.Add(obj); Log.Debug("Position vector: " + mesh.vector.X + ", " + mesh.vector.Y + ", " + mesh.vector.Z); } else { Log.Error("Mesh file does not exist."); return 1; } } var tris = Enumerable.Empty<Triangle3>(); foreach (var model in models) tris = tris.Concat(model.GetTriangles()); TiledNavMesh navmesh = NavMesh.Generate(tris, setting.Config); new NavMeshJsonSerializer().Serialize(setting.Export, navmesh); } Log.WriteLine("Done. " + files.Count + " files processed."); #if DEBUG Console.ReadLine(); #endif return 0; }
static int Main(string[] args) { bool help = false; bool version = false; List <string> files = new List <string>(); var set = new OptionSet() .Add("verbosity=|v=", "Changes verbosity level. Valid options:\ns[ilent]\nm[inimal]\nn[ormal]\nv[erbose]\nd[ebug]", opt => { Log.Verbosity = Verbosity.Parse(opt); }) .Add("version", "Displays version information", opt => version = (opt != null)) .Add("help|h", "Displays usage information", opt => help = (opt != null)); try { files = set.Parse(args); } catch (OptionException) { Log.Error("Invalid option."); Log.WriteLine("usage: sharpnav <OPTIONS> [FILES]"); Log.WriteLine("Avaliable Options:"); set.WriteOptionDescriptions(Console.Out); return(1); } if (help) { Log.WriteLine("usage: sharpnav <OPTIONS> [FILES]"); Log.WriteLine("Available Options:"); set.WriteOptionDescriptions(Console.Out); return(0); } if (version) { Log.WriteLine("SharpNav " + SharpNavVersion); Log.WriteLine("SharpNav.CLI " + ThisVersion); return(0); } if (files.Count == 0) { Log.Error("No configuration files to process."); return(1); } Log.Info("Number of files to parse: " + files.Count); foreach (var f in files) { StreamReader input = null; Log.Info("Parsing file \"" + f + "\""); try { input = new StreamReader(f); } catch (Exception e) { Log.Error("Error opening file \"" + f + "\"."); Log.Debug(e.GetType().ToString() + " thrown:"); Log.Debug(e.StackTrace, 1); return(1); } NavMeshConfigurationFile file = new NavMeshConfigurationFile(input); Log.Debug("Parsed configuration:"); Log.Debug("Cell Size: " + file.GenerationSettings.CellSize, 1); Log.Debug("Cell Height: " + file.GenerationSettings.CellHeight, 1); Log.Debug("Max Climb: " + file.GenerationSettings.MaxClimb, 1); Log.Debug("Agent Height: " + file.GenerationSettings.AgentHeight, 1); Log.Debug("Agent Radius: " + file.GenerationSettings.AgentRadius, 1); Log.Debug("Min Region Size: " + file.GenerationSettings.MinRegionSize, 1); Log.Debug("Merged Region Size: " + file.GenerationSettings.MergedRegionSize, 1); Log.Debug("Max Edge Length: " + file.GenerationSettings.MaxEdgeLength, 1); Log.Debug("Max Edge Error: " + file.GenerationSettings.MaxEdgeError, 1); Log.Debug("Verts Per Poly: " + file.GenerationSettings.VertsPerPoly, 1); Log.Debug("Sample Distance: " + file.GenerationSettings.SampleDistance, 1); Log.Debug("Max Sample Error: " + file.GenerationSettings.MaxSampleError, 1); Log.Debug(""); Log.Debug("Output File: " + file.ExportPath, 1); Log.Debug(""); Log.Debug("Meshes"); List <string> meshes = new List <string>(); List <ObjModel> models = new List <ObjModel>(); foreach (var mesh in file.InputMeshes) { Log.Debug("Path: " + mesh.Path, 2); Log.Debug("Scale: " + mesh.Scale, 2); Log.Debug("Position: " + mesh.Position.ToString(), 2); meshes.Add(mesh.Path); Vector3 position = new Vector3(mesh.Position[0], mesh.Position[1], mesh.Position[2]); if (File.Exists(mesh.Path)) { ObjModel obj = new ObjModel(mesh.Path); float scale = mesh.Scale; //TODO SCALE THE OBJ FILE models.Add(obj); } else { Log.Error("Mesh file does not exist."); return(1); } } var tris = Enumerable.Empty <Triangle3>(); foreach (var model in models) { tris = tris.Concat(model.GetTriangles()); } TiledNavMesh navmesh = NavMesh.Generate(tris, file.GenerationSettings); new NavMeshJsonSerializer().Serialize(file.ExportPath, navmesh); } Log.WriteLine("Done. " + files.Count + " files processed."); #if DEBUG Console.ReadLine(); #endif return(0); }