static void Main(string[] args) { var opts = SEMapOptions.FromArguments(args); if (opts.SaveDirectory == null) { opts.SaveDirectory = Environment.CurrentDirectory; } if (opts.OutputDirectory == null) { opts.OutputDirectory = Environment.CurrentDirectory; } if (opts.ShowHelp == true || opts.ContentDirectory == null) { ShowHelp(); return; } Console.WriteLine("Creating contour maps"); var contourmaps = MapUtils.GetContourMaps(opts.ContentDirectory); DateTime filesavetime = default; while (WaitForSave(opts.SaveDirectory, ref filesavetime)) { Console.WriteLine("Getting GPS entries"); var gpsentlists = MapUtils.GetGPSEntries(opts.SaveDirectory, out var endname); var segments = GetSegmentPrefixes(gpsentlists); foreach (var segment in segments) { if (segment == "" || !opts.CropEnd) { Console.WriteLine($"Processing segment {segment}"); string segdir = opts.OutputDirectory; if (segment != "") { segdir = Path.Combine(segdir, segment); } if (!Directory.Exists(segdir)) { Directory.CreateDirectory(segdir); } MapUtils.SaveMaps(contourmaps, gpsentlists, opts, segment, segdir, endname); } } Console.WriteLine("Done"); if (!opts.OnSave) { break; } } Console.WriteLine("Exiting"); }
public static void SaveMaps(Dictionary <CubeFace, Bitmap> contourmaps, Dictionary <CubeFace, List <List <GpsEntry> > > gpsentlists, SEMapOptions opts, string segment, string outdir, string endname) { Dictionary <CubeFace, Bitmap> maps = new Dictionary <CubeFace, Bitmap>(); Bitmap tilebmp = null; try { var gpsbounds = new Dictionary <CubeFace, Bounds>(); foreach (var kvp in contourmaps) { var bmp = (Bitmap)kvp.Value.Clone(); maps[kvp.Key] = bmp; bmp.RotateFlip(opts.FaceRotations[kvp.Key]); var mapbounds = new Bounds(new RectangleF(0, 0, bmp.Width, bmp.Height)); foreach (var gpsents in gpsentlists[kvp.Key]) { var gpsboundsrect = MapUtils.DrawGPS(bmp, gpsents, opts.FaceRotations[kvp.Key], kvp.Key, segment); if (!opts.CropEnd) { mapbounds.AddRectangle(gpsboundsrect); } } if (opts.CropEnd) { var endgps = gpsentlists[kvp.Key].Select(e => e.FirstOrDefault(g => g.Name == endname)).FirstOrDefault(); if (endgps != null) { endgps = endgps.RotateFlip2D(opts.FaceRotations[kvp.Key]); var x = (float)(endgps.X + bmp.Width / 2); var y = (float)(endgps.Y + bmp.Height / 2); if (x >= 0 && x < bmp.Width && y >= 0 && y < bmp.Height) { mapbounds.AddRectangle(x - 1, y - 1, 2, 2); } } } gpsbounds[kvp.Key] = mapbounds; if (!opts.CropEnd) { SaveBitmap(bmp, Path.Combine(outdir, kvp.Key.ToString() + ".png")); } } if (opts.CropEnd) { tilebmp = MapUtils.CreateTileMap(maps, opts.TileFaces, gpsbounds, false, opts.CropTexture, opts.EndTextureSize); SaveBitmap(tilebmp, Path.Combine(outdir, "endmap.png")); } else { tilebmp = MapUtils.CreateTileMap(maps, opts.TileFaces, gpsbounds, opts.CropTileMap, opts.CropTexture, segment == "" ? opts.FullMapTextureSize : opts.EpisodeTextureSize); SaveBitmap(tilebmp, Path.Combine(outdir, "tilemap.png")); if (opts.CropTexture) { SaveTextures(tilebmp, Path.Combine(outdir, "texture"), "png", segment == "" ? opts.FullMapTextureSize : opts.EpisodeTextureSize); } } } finally { tilebmp?.Dispose(); foreach (var kvp in maps) { kvp.Value.Dispose(); } } }
public static SEMapOptions FromArguments(string[] args) { var opts = new SEMapOptions { SaveDirectory = null, ContentDirectory = null, OutputDirectory = null, ShowHelp = false, CropTileMap = false, CropTexture = false, TileFaces = new[] { new[] { CubeFace.None, CubeFace.Down, CubeFace.None, CubeFace.None }, new[] { CubeFace.Back, CubeFace.Right, CubeFace.Front, CubeFace.Left }, new[] { CubeFace.None, CubeFace.Up, CubeFace.None, CubeFace.None } }, FaceRotations = new Dictionary <CubeFace, RotateFlipType> { [CubeFace.Up] = RotateFlipType.Rotate270FlipNone, [CubeFace.Down] = RotateFlipType.Rotate270FlipNone, [CubeFace.Left] = RotateFlipType.Rotate180FlipNone, [CubeFace.Front] = RotateFlipType.Rotate180FlipNone, [CubeFace.Right] = RotateFlipType.Rotate180FlipNone, [CubeFace.Back] = RotateFlipType.Rotate180FlipNone } }; for (int i = 0; i < args.Length; i++) { if (args[i] == "--savedir" && i < args.Length - 1) { opts.SaveDirectory = args[i + 1]; i++; } else if (args[i] == "--contentdir" && i < args.Length - 1) { opts.ContentDirectory = args[i + 1]; i++; } else if (args[i] == "--outdir" && i < args.Length - 1) { opts.OutputDirectory = args[i + 1]; i++; } else if (args[i] == "--tile" && i < args.Length - 1) { opts.TileFaces = args[i + 1].Split(',').Select(p => p.Split(':').Select(f => MapUtils.GetFace(f)).ToArray()).ToArray(); i++; } else if (args[i] == "--rotate" && i < args.Length - 1) { var rot = args[i + 1].Split(':'); var face = MapUtils.GetFace(rot[0]); switch (rot[1]) { case "cw": case "90": opts.FaceRotations[face] = RotateFlipType.Rotate90FlipNone; break; case "ccw": case "270": opts.FaceRotations[face] = RotateFlipType.Rotate270FlipNone; break; case "180": opts.FaceRotations[face] = RotateFlipType.Rotate180FlipNone; break; } } else if (args[i] == "--crop") { opts.CropTileMap = true; } else if (args[i] == "--croptexture") { opts.CropTexture = true; } else if (args[i] == "--texturesize" && i < args.Length - 1) { opts.EpisodeTextureSize = Int32.Parse(args[i + 1]); i++; } else if (args[i] == "--fullmaptexturesize" && i < args.Length - 1) { opts.FullMapTextureSize = Int32.Parse(args[i + 1]); i++; } else if (args[i] == "--cropend") { opts.CropEnd = true; } else if (args[i] == "--endsize" && i < args.Length - 1) { opts.EndTextureSize = Int32.Parse(args[i + 1]); i++; } else if (args[i] == "--onsave") { opts.OnSave = true; } else if (args[i] == "--help" || args[i] == "/?") { opts.ShowHelp = true; break; } else if (Directory.Exists(args[i])) { opts.SaveDirectory = args[i]; } else if (File.Exists(args[i])) { opts.SaveDirectory = Path.GetDirectoryName(args[i]); } else { Console.WriteLine($"Unrecognised option {args[i]}"); opts.ShowHelp = true; break; } } return(opts); }