Beispiel #1
0
        IsoCat MakeRenderer()
        {
            // create and configure the renderer
            IsoCat newRenderer = new IsoCat {
                SeeThroughLava  = p.SeeThroughLava,
                SeeThroughWater = p.SeeThroughWater,
                Mode            = p.Mode,
                Gradient        = !p.NoGradient,
                DrawShadows     = !p.NoShadows
            };

            if (p.Mode == IsoCatMode.Chunk)
            {
                newRenderer.Chunk = p.Region;
            }
            switch (p.Angle)
            {
            case 90:
                newRenderer.Rotation = 1;
                break;

            case 180:
                newRenderer.Rotation = 2;
                break;

            case 270:
            case -90:
                newRenderer.Rotation = 3;
                break;
            }
            return(newRenderer);
        }
Beispiel #2
0
        public AddWorldPopup(WorldListEntry world)
        {
            InitializeComponent();

            fileBrowser.Filter = MapLoadFilter;

            cBackup.Items.AddRange(WorldListEntry.BackupEnumNames);

            bwLoader.DoWork             += AsyncLoad;
            bwLoader.RunWorkerCompleted += AsyncLoadCompleted;

            bwGenerator.WorkerReportsProgress = true;
            bwGenerator.DoWork             += AsyncGen;
            bwGenerator.ProgressChanged    += AsyncGenProgress;
            bwGenerator.RunWorkerCompleted += AsyncGenCompleted;

            bwRenderer.WorkerReportsProgress = true;
            bwRenderer.DoWork             += AsyncDraw;
            bwRenderer.ProgressChanged    += AsyncDrawProgress;
            bwRenderer.RunWorkerCompleted += AsyncDrawCompleted;

            renderer = new IsoCat();
            // event routed through BackgroundWorker to avoid cross-thread invocation issues
            renderer.ProgressChanged +=
                (progressSender, progressArgs) =>
                bwRenderer.ReportProgress(progressArgs.ProgressPercentage, progressArgs.UserState);

            nMapWidth.Validating  += MapDimensionValidating;
            nMapHeight.Validating += MapDimensionValidating;
            nMapLength.Validating += MapDimensionValidating;

            cAccess.Items.Add("(everyone)");
            cBuild.Items.Add("(everyone)");
            foreach (Rank rank in RankManager.Ranks)
            {
                cAccess.Items.Add(MainForm.ToComboBoxOption(rank));
                cBuild.Items.Add(MainForm.ToComboBoxOption(rank));
            }

            progressBar.Visible = false;
            tStatus1.Text       = "";
            tStatus2.Text       = "";

            World = world;
            cPreviewMode.SelectedIndex = 0;

            savePreviewDialog.Filter =
                "PNG Image|*.png|TIFF Image|*.tif;*.tiff|Bitmap Image|*.bmp|JPEG Image|*.jpg;*.jpeg";
            savePreviewDialog.Title = "Saving preview image...";

            cGenerator.Items.AddRange(MapGenUtil.GeneratorList.Select(gen => gen.Name).ToArray());
            cGenerator.SelectedIndex = 0;

            tsbLoadPreset.DropDownItemClicked      += tsbLoadPreset_DropDownItemClicked;
            tsbCopyGenSettings.DropDownItemClicked += tsbImportSettings_DropDownItemClicked;
            Shown += LoadMap;
        }
Beispiel #3
0
        void RenderLoop()
        {
            renderer = MakeRenderer();
            using (MemoryStream ms = new MemoryStream()) {
                // loop terminates with the rest of the program (this is a background thread)
                while (true)
                {
                    // wait (block) until a map is available for drawing
                    RenderTask task = inQueue.WaitDequeue();
                    try {
                        // render the map
                        IsoCatResult result = renderer.Draw(task.Map);
                        task.Map = null;

                        // crop image (if needed)
                        Image image;
                        if (p.Uncropped)
                        {
                            image = result.Bitmap;
                        }
                        else
                        {
                            image = result.Bitmap.Clone(result.CropRectangle, result.Bitmap.PixelFormat);
                            result.Bitmap.Dispose();
                        }

                        // encode image
                        if (p.ExportFormat.Equals(ImageFormat.Jpeg))
                        {
                            EncoderParameters encoderParams = new EncoderParameters();
                            encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, p.JpegQuality);
                            image.Save(ms, p.ImageEncoder, encoderParams);
                        }
                        else if (p.ExportFormat.Equals(ImageFormat.Gif))
                        {
                            OctreeQuantizer q = new OctreeQuantizer(255, 8);
                            image = q.Quantize(image);
                            image.Save(ms, p.ExportFormat);
                        }
                        else
                        {
                            image.Save(ms, p.ExportFormat);
                        }
                        image.Dispose();

                        // store result as a byte[]
                        task.Result = ms.ToArray();
                    } catch (Exception ex) {
                        task.Exception = ex;
                    }

                    // send stack to the results queue
                    outQueue.Enqueue(task);
                    ms.SetLength(0);
                }
            }
        }
Beispiel #4
0
        public AddWorldPopup(WorldListEntry world) {
            InitializeComponent();

            fileBrowser.Filter = MapLoadFilter;

            cBackup.Items.AddRange(WorldListEntry.BackupEnumNames);

            bwLoader.DoWork += AsyncLoad;
            bwLoader.RunWorkerCompleted += AsyncLoadCompleted;

            bwGenerator.WorkerReportsProgress = true;
            bwGenerator.DoWork += AsyncGen;
            bwGenerator.ProgressChanged += AsyncGenProgress;
            bwGenerator.RunWorkerCompleted += AsyncGenCompleted;

            bwRenderer.WorkerReportsProgress = true;
            bwRenderer.DoWork += AsyncDraw;
            bwRenderer.ProgressChanged += AsyncDrawProgress;
            bwRenderer.RunWorkerCompleted += AsyncDrawCompleted;

            renderer = new IsoCat();
            // event routed through BackgroundWorker to avoid cross-thread invocation issues
            renderer.ProgressChanged +=
                (progressSender, progressArgs) =>
                bwRenderer.ReportProgress(progressArgs.ProgressPercentage, progressArgs.UserState);

            nMapWidth.Validating += MapDimensionValidating;
            nMapHeight.Validating += MapDimensionValidating;
            nMapLength.Validating += MapDimensionValidating;

            cAccess.Items.Add("(everyone)");
            cBuild.Items.Add("(everyone)");
            foreach (Rank rank in RankManager.Ranks) {
                cAccess.Items.Add(MainForm.ToComboBoxOption(rank));
                cBuild.Items.Add(MainForm.ToComboBoxOption(rank));
            }

            progressBar.Visible = false;
            tStatus1.Text = "";
            tStatus2.Text = "";

            World = world;
            cPreviewMode.SelectedIndex = 0;

            savePreviewDialog.Filter =
                "PNG Image|*.png|TIFF Image|*.tif;*.tiff|Bitmap Image|*.bmp|JPEG Image|*.jpg;*.jpeg";
            savePreviewDialog.Title = "Saving preview image...";

            cGenerator.Items.AddRange(MapGenUtil.GeneratorList.Select(gen => gen.Name).ToArray());
            cGenerator.SelectedIndex = 0;

            tsbLoadPreset.DropDownItemClicked += tsbLoadPreset_DropDownItemClicked;
            tsbCopyGenSettings.DropDownItemClicked += tsbImportSettings_DropDownItemClicked;
            Shown += LoadMap;
        }
Beispiel #5
0
        public AddWorldPopup(WorldListEntry world)
        {
            InitializeComponent();
            renderer           = new IsoCat();
            fileBrowser.Filter = MapLoadFilter;

            cBackup.Items.AddRange(WorldListEntry.BackupEnumNames);
            cTemplates.Items.AddRange(Enum.GetNames(typeof(MapGenTemplate)));
            cTheme.Items.AddRange(Enum.GetNames(typeof(MapGenTheme)));

            bwLoader.DoWork             += AsyncLoad;
            bwLoader.RunWorkerCompleted += AsyncLoadCompleted;

            bwGenerator.DoWork += AsyncGen;
            bwGenerator.WorkerReportsProgress = true;
            bwGenerator.ProgressChanged      += AsyncGenProgress;
            bwGenerator.RunWorkerCompleted   += AsyncGenCompleted;

            bwRenderer.WorkerReportsProgress      = true;
            bwRenderer.WorkerSupportsCancellation = true;
            bwRenderer.DoWork             += AsyncDraw;
            bwRenderer.ProgressChanged    += AsyncDrawProgress;
            bwRenderer.RunWorkerCompleted += AsyncDrawCompleted;

            nMapWidth.Validating  += MapDimensionValidating;
            nMapLength.Validating += MapDimensionValidating;
            nMapHeight.Validating += MapDimensionValidating;

            cAccess.Items.Add("(everyone)");
            cBuild.Items.Add("(everyone)");
            foreach (Rank rank in RankManager.Ranks)
            {
                cAccess.Items.Add(MainForm.ToComboBoxOption(rank));
                cBuild.Items.Add(MainForm.ToComboBoxOption(rank));
            }

            tStatus1.Text = "";
            tStatus2.Text = "";

            World = world;

            savePreviewDialog.Filter = "PNG Image|*.png|TIFF Image|*.tif;*.tiff|Bitmap Image|*.bmp|JPEG Image|*.jpg;*.jpeg";
            savePreviewDialog.Title  = "Saving preview image...";

            browseTemplateDialog.Filter = "MapGenerator Template|*.ftpl";
            browseTemplateDialog.Title  = "Opening a MapGenerator template...";

            saveTemplateDialog.Filter = browseTemplateDialog.Filter;
            saveTemplateDialog.Title  = "Saving a MapGenerator template...";

            Shown += LoadMap;
        }
Beispiel #6
0
        void AsyncDraw(object sender, DoWorkEventArgs e)
        {
            stopwatch = Stopwatch.StartNew();
            renderer  = new IsoCat(map, IsoCatMode.Normal, previewRotation);
            Rectangle cropRectangle;

            if (bwRenderer.CancellationPending)
            {
                return;
            }
            Bitmap rawImage = renderer.Draw(out cropRectangle, bwRenderer);

            if (bwRenderer.CancellationPending)
            {
                return;
            }
            if (rawImage != null)
            {
                previewImage = rawImage.Clone(cropRectangle, rawImage.PixelFormat);
            }
            renderer = null;
            GC.Collect(GC.MaxGeneration, GCCollectionMode.Optimized);
        }
Beispiel #7
0
        static int Main(string[] args)
        {
            Logger.Logged += OnLogged;
            Logger.DisableFileLogging();

            ReturnCode optionParsingResult = ParseOptions(args);

            if (optionParsingResult != ReturnCode.Success)
            {
                return((int)optionParsingResult);
            }

            // check if input path exists, and if it's a file or directory
            bool directoryMode;

            try {
                if (File.Exists(inputPath))
                {
                    directoryMode = false;
                    if (outputDirName == null)
                    {
                        outputDirName = Paths.GetDirectoryNameOrRoot(inputPath);
                    }
                }
                else if (Directory.Exists(inputPath))
                {
                    directoryMode = true;
                    if (outputDirName == null)
                    {
                        outputDirName = Paths.GetDirectoryNameOrRoot(inputPath);
                    }
                }
                else
                {
                    Console.Error.WriteLine("MapRenderer: Cannot locate \"{0}\"", inputPath);
                    return((int)ReturnCode.InputDirNotFound);
                }

                if (!Directory.Exists(outputDirName))
                {
                    Directory.CreateDirectory(outputDirName);
                }
            } catch (Exception ex) {
                Console.Error.WriteLine("MapRenderer: {0}: {1}",
                                        ex.GetType().Name,
                                        ex.Message);
                return((int)ReturnCode.PathError);
            }

            // check recursive flag
            if (recursive && !directoryMode)
            {
                Console.Error.WriteLine("MapRenderer: Recursive flag is given, but input is not a directory.");
            }

            // check input filter
            if (inputFilter != null && !directoryMode)
            {
                Console.Error.WriteLine("MapRenderer: Filter param is given, but input is not a directory.");
            }

            // initialize image encoder
            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
            imageEncoder = codecs.FirstOrDefault(codec => codec.FormatID == exportFormat.Guid);
            if (imageEncoder == null)
            {
                Console.Error.WriteLine("MapRenderer: Specified image encoder is not supported.");
                return((int)ReturnCode.UnsupportedSaveFormat);
            }

            // create and configure the renderer
            renderer = new IsoCat {
                SeeThroughLava  = seeThroughLava,
                SeeThroughWater = seeThroughWater,
                Mode            = mode,
                Gradient        = !noGradient,
                DrawShadows     = !noShadows
            };
            if (mode == IsoCatMode.Chunk)
            {
                renderer.ChunkCoords[0] = region.XMin;
                renderer.ChunkCoords[1] = region.YMin;
                renderer.ChunkCoords[2] = region.ZMin;
                renderer.ChunkCoords[3] = region.XMax;
                renderer.ChunkCoords[4] = region.YMax;
                renderer.ChunkCoords[5] = region.ZMax;
            }
            switch (angle)
            {
            case 90:
                renderer.Rotation = 1;
                break;

            case 180:
                renderer.Rotation = 2;
                break;

            case 270:
            case -90:
                renderer.Rotation = 3;
                break;
            }

            if (!recursive && mapImporter != null && mapImporter.StorageType == MapStorageType.Directory)
            {
                // single-directory map
                RenderOneMap(new DirectoryInfo(inputPath));
            }
            else if (!directoryMode)
            {
                // single-file map
                RenderOneMap(new FileInfo(inputPath));
            }
            else
            {
                // possible single-directory conversion
                if (!recursive && RenderOneMap(new DirectoryInfo(inputPath)))
                {
                    return((int)ReturnCode.Success);
                }

                // go through all files inside the given directory
                SearchOption  recursiveOption = (recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
                DirectoryInfo inputDirInfo    = new DirectoryInfo(inputPath);
                if (inputFilter == null)
                {
                    inputFilter = "*";
                }
                foreach (var dir in inputDirInfo.GetDirectories(inputFilter, recursiveOption))
                {
                    RenderOneMap(dir);
                }
                foreach (var file in inputDirInfo.GetFiles(inputFilter, recursiveOption))
                {
                    RenderOneMap(file);
                }
            }

            return((int)ReturnCode.Success);
        }
 public void MapViewerUpdateLevel()
 {
     try
     {
         Level l = Level.Find(txtMapViewerLevelName.Text);
         if (l == null)
         {
             Command.all.Find("load").Use(null, txtMapViewerLevelName.Text);
             l = Level.Find(txtMapViewerLevelName.Text);
         }
         if (l == null) { MessageBox.Show("Level could not be found.", "Map Viewer"); return; }
         txtMapViewerX.Text = l.width.ToString();
         txtMapViewerY.Text = l.depth.ToString();
         txtMapViewerZ.Text = l.height.ToString();
         int rotation = (int)txtMapViewerRotation.Value;
         if (rotation < 0 || rotation > 3) { MessageBox.Show("Invalid rotation (must be from 0-3).", "Map Viewer"); return; }
         IsoCat IsoCat = new IsoCat(l, IsoCatMode.Normal, rotation);
         Rectangle r = new Rectangle(0, 0, picMapViewer.Width, picMapViewer.Height);
         System.ComponentModel.BackgroundWorker bgw = new System.ComponentModel.BackgroundWorker();
         bgw.WorkerReportsProgress = true;
         MapViewerLastDrawn = IsoCat.Draw(out r, bgw);
         picMapViewer.Image = MapViewerLastDrawn;
     }
     catch (Exception ex) { Server.ErrorLog(ex); }
 }
Beispiel #9
0
        static int Main(string[] args)
        {
            Logger.Logged += OnLogged;
            Logger.DisableFileLogging();

            ReturnCode optionParsingResult = ParseOptions(args);

            if (optionParsingResult != ReturnCode.Success)
            {
                return((int)optionParsingResult);
            }

            // parse importer name
            if (importerName != null && !importerName.Equals("auto", StringComparison.OrdinalIgnoreCase))
            {
                MapFormat importFormat;
                if (!EnumUtil.TryParse(importerName, out importFormat, true))
                {
                    Console.Error.WriteLine("Unsupported importer \"{0}\"", importerName);
                    PrintUsage();
                    return((int)ReturnCode.UnrecognizedImporter);
                }
                mapImporter = MapUtility.GetImporter(importFormat);
                if (mapImporter == null)
                {
                    Console.Error.WriteLine("Loading from \"{0}\" is not supported", importFormat);
                    PrintUsage();
                    return((int)ReturnCode.UnsupportedLoadFormat);
                }
            }

            // check input paths
            bool hadFile = false,
                 hadDir  = false;

            foreach (string inputPath in inputPathList)
            {
                if (hadDir)
                {
                    Console.Error.WriteLine("MapRenderer: Only one directory may be specified at a time.");
                    return((int)ReturnCode.ArgumentError);
                }
                // check if input path exists, and if it's a file or directory
                try {
                    if (File.Exists(inputPath))
                    {
                        hadFile = true;
                    }
                    else if (Directory.Exists(inputPath))
                    {
                        hadDir = true;
                        if (hadFile)
                        {
                            Console.Error.WriteLine("MapRenderer: Cannot mix directories and files in input.");
                            return((int)ReturnCode.ArgumentError);
                        }
                        directoryMode = true;
                        if (!outputDirGiven)
                        {
                            outputDirName = inputPath;
                        }
                    }
                    else
                    {
                        Console.Error.WriteLine("MapRenderer: Cannot locate \"{0}\"", inputPath);
                        return((int)ReturnCode.InputPathNotFound);
                    }
                } catch (Exception ex) {
                    Console.Error.WriteLine("MapRenderer: {0}: {1}",
                                            ex.GetType().Name,
                                            ex.Message);
                    return((int)ReturnCode.PathError);
                }
            }

            // initialize image encoder
            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
            imageEncoder = codecs.FirstOrDefault(codec => codec.FormatID == exportFormat.Guid);
            if (imageEncoder == null)
            {
                Console.Error.WriteLine("MapRenderer: Specified image encoder is not supported.");
                return((int)ReturnCode.UnsupportedSaveFormat);
            }

            // create and configure the renderer
            renderer = new IsoCat {
                SeeThroughLava  = seeThroughLava,
                SeeThroughWater = seeThroughWater,
                Mode            = mode,
                Gradient        = !noGradient,
                DrawShadows     = !noShadows
            };
            if (mode == IsoCatMode.Chunk)
            {
                renderer.ChunkCoords[0] = region.XMin;
                renderer.ChunkCoords[1] = region.YMin;
                renderer.ChunkCoords[2] = region.ZMin;
                renderer.ChunkCoords[3] = region.XMax;
                renderer.ChunkCoords[4] = region.YMax;
                renderer.ChunkCoords[5] = region.ZMax;
            }
            switch (angle)
            {
            case 90:
                renderer.Rotation = 1;
                break;

            case 180:
                renderer.Rotation = 2;
                break;

            case 270:
            case -90:
                renderer.Rotation = 3;
                break;
            }

            // check recursive flag
            if (recursive && !directoryMode)
            {
                Console.Error.WriteLine("MapRenderer: Recursive flag is given, but input is not a directory.");
                return((int)ReturnCode.ArgumentError);
            }

            // check input filter
            if (inputFilter != null && !directoryMode)
            {
                Console.Error.WriteLine("MapRenderer: Filter param is given, but input is not a directory.");
                return((int)ReturnCode.ArgumentError);
            }

            // check regex filter
            if (useRegex)
            {
                try {
                    filterRegex = new Regex(inputFilter);
                } catch (ArgumentException ex) {
                    Console.Error.WriteLine("MapRenderer: Cannot parse filter regex: {0}",
                                            ex.Message);
                    return((int)ReturnCode.ArgumentError);
                }
            }

            // check if output dir exists; create it if needed
            if (outputDirName != null)
            {
                try {
                    if (!Directory.Exists(outputDirName))
                    {
                        Directory.CreateDirectory(outputDirName);
                    }
                } catch (Exception ex) {
                    Console.Error.WriteLine("MapRenderer: Error checking output directory: {0}: {1}",
                                            ex.GetType().Name, ex.Message);
                }
            }

            // process inputs, one path at a time
            foreach (string inputPath in inputPathList)
            {
                ReturnCode code = ProcessInputPath(inputPath);
                if (code != ReturnCode.Success)
                {
                    return((int)code);
                }
            }
            return((int)ReturnCode.Success);
        }