Beispiel #1
0
        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);
        }