예제 #1
0
        private static string processFile(string path)
        {
            BMAP   bmap      = new BMAP();
            string extension = Path.GetExtension(path).Substring(1);
            string outputName;

            if (settings.Raw)
            {
                if (Raw.IsValid(path))
                {
                    Console.WriteLine($"Loading  : {Path.GetFileName(path)}");
                    Raw.Load(path, true);

                    return(path);
                }
            }
            else if (settings.Compress)
            {
                if (Enum.TryParse(extension, out WreckfestExtensions we))
                {
                    using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(path)))
                        using (BinaryReader br = new BinaryReader(ms))
                        {
                            if (
                                br.ReadInt32() != 4 ||
                                br.ReadByte() != extension[3] ||
                                br.ReadByte() != extension[2] ||
                                br.ReadByte() != extension[1] ||
                                br.ReadByte() != extension[0])
                            {
                                br.BaseStream.Position = 0;
                                byte[] input = br.ReadBytes((int)ms.Length);

                                File.Move(path, $"{path}.bak");

                                using (BinaryWriter bw = new BinaryWriter(new FileStream(path, FileMode.Create)))
                                {
                                    bw.Write(4);
                                    bw.Write(extension[3]);
                                    bw.Write(extension[2]);
                                    bw.Write(extension[1]);
                                    bw.Write(extension[0]);
                                    bw.Write((int)we);

                                    int[]  hashTable = new int[1 << (14 - 2)];
                                    byte[] output    = new byte[LZ4Compress.CalculateChunkSize(input.Length)];
                                    int    i         = 0;

                                    while (i < input.Length)
                                    {
                                        byte[] chunk = new byte[Math.Min(input.Length - i, output.Length)];

                                        Array.Copy(input, i, chunk, 0, chunk.Length);
                                        Array.Clear(hashTable, 0, hashTable.Length);

                                        int size = LZ4Compress.Compress(hashTable, chunk, output, chunk.Length, chunk.Length + 4);

                                        bw.Write(size);
                                        bw.Write(output, 0, size);

                                        i += chunk.Length;
                                    }
                                }
                            }
                            else
                            {
                                Console.WriteLine($"Skipping : {Path.GetFileName(path)} is already compressed");
                            }
                        }
                }
                else
                {
                    Console.WriteLine($"Error    : unsupported extension '{extension}'.");
                }
            }
            else if (extension == "bmap")
            {
                if (BMAP.IsBMAP(path))
                {
                    Console.WriteLine($"Loading  : {Path.GetFileName(path)}");
                    bmap = BMAP.Load(path, false);

                    outputName = $"{Path.GetFileNameWithoutExtension(path)}.{(bmap.Mode == 1 ? "clutter" : (bmap.DDS.Format == D3DFormat.A8R8G8B8 ? "raw" : bmap.DDS.Format.ToString().ToLower()))}.{settings.SaveAs}";

                    Console.WriteLine($"Saving   : {outputName}");
                    if (!overwrite($@"{Path.GetDirectoryName(path)}\{outputName}"))
                    {
                        return(null);
                    }
                    bmap.SaveAs(outputName, settings.SaveAs);

                    return(path);
                }
            }
            else if (extension == "dds")
            {
                string newExtension = $"{(settings.NoRename ? "" : ".x")}.bmap";

                Console.WriteLine($"Loading  : {Path.GetFileName(path)}");
                Console.WriteLine($"Saving   : {Path.GetFileNameWithoutExtension(path)}{newExtension}");

                bmap.Path = Path.GetFileName(path);
                bmap.DDS  = DDS.Load(path);
                if (!overwrite(path.Replace(".dds", newExtension)))
                {
                    return(null);
                }
                bmap.Save(path.Replace(".dds", newExtension));

                return(path);
            }
            else if (Array.IndexOf(new string[] { "png", "tga", "tif" }, extension) > -1)
            {
                Texture texture = null;
                Console.WriteLine($"Loading   : {Path.GetFileName(path)}");

                switch (extension)
                {
                case "tga":
                    texture = TGA.Load(path);
                    break;

                case "tif":
                case "png":
                    texture = Texture.Load(path);
                    break;
                }

                BreckfestSettings original = settings.Clone();

                if (Path.GetFileNameWithoutExtension(path).EndsWith(".clutter", StringComparison.OrdinalIgnoreCase))
                {
                    settings.Clutter = true;
                    path             = path.Replace(".clutter", "");
                }
                else if (Path.GetFileNameWithoutExtension(path).EndsWith(".raw", StringComparison.OrdinalIgnoreCase))
                {
                    settings.Format = D3DFormat.A8R8G8B8;
                    path            = path.Replace(".raw", "");
                }
                else if (Path.GetFileNameWithoutExtension(path).EndsWith(".dxt1", StringComparison.OrdinalIgnoreCase))
                {
                    settings.Format = D3DFormat.DXT1;
                    path            = path.Replace(".dxt1", "");
                }
                else if (Path.GetFileNameWithoutExtension(path).EndsWith(".dxt5", StringComparison.OrdinalIgnoreCase))
                {
                    settings.Format = D3DFormat.DXT5;
                    path            = path.Replace(".dxt5", "");
                }

                bmap.Path = Path.GetFileName(path);

                if (settings.Clutter)
                {
                    Console.WriteLine($"Cluttering: {texture.Bitmap.Width}x{texture.Bitmap.Height}");

                    bmap.Mode = 1;
                    bmap.Raw  = texture.Bitmap;
                }
                else
                {
                    if (settings.Format == D3DFormat.A8R8G8B8)
                    {
                        Console.WriteLine($"Formatting: {texture.Bitmap.Width}x{texture.Bitmap.Height} (this might take awhile)");
                    }
                    else
                    {
                        Console.WriteLine($"Squishing : {texture.Bitmap.Width}x{texture.Bitmap.Height} (this might take awhile)");
                    }

                    bmap.DDS = new DDS(settings.Format, texture.Bitmap);
                }

                string newExtension = $"{(settings.NoRename ? "" : ".x")}.bmap";

                Console.WriteLine($"Saving    : {Path.GetFileNameWithoutExtension(path)}{newExtension}");
                if (!overwrite(path.Replace($".{extension}", $"{newExtension}")))
                {
                    return(null);
                }
                bmap.Save(path.Replace($".{extension}", $"{newExtension}"), true);

                settings = original.Clone();

                return(path);
            }

            return(null);
        }
예제 #2
0
        private static string processFile(string path)
        {
            BMAP bmap = new BMAP();
            string extension = Path.GetExtension(path).Substring(1);
            string outputName = "";

            if (settings.Raw)
            {
                if (Raw.IsValid(path))
                {
                    Console.WriteLine("Loading  : {0}", Path.GetFileName(path));
                    Raw.Load(path, true);

                    return path;
                }
            }
            else if (settings.Compress)
            {
                WreckfestExtensions we;

                if (Enum.TryParse<WreckfestExtensions>(extension, out we))
                {
                    using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(path)))
                    using (BinaryReader br = new BinaryReader(ms))
                    {
                        if (
                            br.ReadInt32() != 4 ||
                            br.ReadByte() != extension[3] ||
                            br.ReadByte() != extension[2] ||
                            br.ReadByte() != extension[1] ||
                            br.ReadByte() != extension[0])
                        {
                            br.BaseStream.Position = 0;
                            var input = br.ReadBytes((int)ms.Length);

                            File.Move(path, path + ".bak");

                            using (BinaryWriter bw = new BinaryWriter(new FileStream(path, FileMode.Create)))
                            {
                                bw.Write(4);
                                bw.Write(extension[3]);
                                bw.Write(extension[2]);
                                bw.Write(extension[1]);
                                bw.Write(extension[0]);
                                bw.Write((int)we);

                                var hashTable = new int[1 << (14 - 2)];
                                var output = new byte[LZ4Compress.CalculateChunkSize(input.Length)];
                                int i = 0;

                                while (i < input.Length)
                                {
                                    byte[] chunk = new byte[Math.Min(input.Length - i, output.Length)];

                                    Array.Copy(input, i, chunk, 0, chunk.Length);
                                    Array.Clear(hashTable, 0, hashTable.Length);

                                    int size = LZ4Compress.Compress(hashTable, chunk, output, chunk.Length, chunk.Length + 4);

                                    bw.Write(size);
                                    bw.Write(output, 0, size);

                                    i += chunk.Length;
                                }
                            }
                        }
                        else
                        {
                            Console.WriteLine("Skipping : {0} is already compressed", Path.GetFileName(path));
                        }
                    }
                }
                else
                {
                    Console.WriteLine("Error    : unsupported extension '{0}'.", extension);
                }
            }
            else if (extension == "bmap")
            {
                if (BMAP.IsBMAP(path))
                {
                    Console.WriteLine("Loading  : {0}", Path.GetFileName(path));
                    bmap = BMAP.Load(path, false);

                    outputName = string.Format("{0}.{1}.png", Path.GetFileNameWithoutExtension(path), (bmap.Mode == 1 ? "clutter" : (bmap.DDS.Format == D3DFormat.A8R8G8B8 ? "raw" : bmap.DDS.Format.ToString().ToLower())));

                    Console.WriteLine("Saving   : {0}", outputName);
                    if (!Overwrite(Path.GetFullPath(path.Replace(Path.GetFileName(path), outputName)))) { return null; }
                    bmap.SaveAsPNG(outputName);

                    return path;
                }
            }
            else if (extension == "dds")
            {
                Console.WriteLine("Loading  : {0}", Path.GetFileName(path));
                bmap.Path = Path.GetFileName(path);
                bmap.DDS = DDS.Load(path);

                if (!settings.NoRename)
                {

                    if (!Overwrite(Path.GetFullPath(path.Replace(".dds", ".x.bmap")))) { return null; }
                    Console.WriteLine("Saving   : {0}", Path.GetFileName(path.Replace(".dds", ".x.bmap")));
                    bmap.Save(path.Replace(".dds", ".x.bmap"));
                }
                else
                {
                    if (!Overwrite(Path.GetFullPath(path.Replace(".dds", ".bmap")))) { return null; }
                    Console.WriteLine("Saving   : {0}", Path.GetFileName(path.Replace(".dds", ".bmap")));
                    bmap.Save(path.Replace(".dds", ".bmap"));
                }

                return path;
            }
            else if (Array.IndexOf(new string[] { "png", "tga", "tif" }, extension) > -1)
            {
                Texture texture = null;
                Console.WriteLine("Loading   : {0}", Path.GetFileName(path));

                switch (extension)
                {
                    case "png":
                        texture = PNG.Load(path);
                        break;

                    case "tga":
                        texture = TGA.Load(path);
                        break;

                    case "tif":
                        texture = TIF.Load(path);
                        break;
                }

                BreckfestSettings original = settings.Clone();

                if (Path.GetFileNameWithoutExtension(path).EndsWith(".clutter", StringComparison.OrdinalIgnoreCase))
                {
                    settings.Clutter = true;
                    path = path.Replace(".clutter", "");
                }
                else if (Path.GetFileNameWithoutExtension(path).EndsWith(".raw", StringComparison.OrdinalIgnoreCase))
                {
                    settings.Format = D3DFormat.A8R8G8B8;
                    path = path.Replace(".raw", "");
                }
                else if (Path.GetFileNameWithoutExtension(path).EndsWith(".dxt1", StringComparison.OrdinalIgnoreCase))
                {
                    settings.Format = D3DFormat.DXT1;
                    path = path.Replace(".dxt1", "");
                }
                else if (Path.GetFileNameWithoutExtension(path).EndsWith(".dxt5", StringComparison.OrdinalIgnoreCase))
                {
                    settings.Format = D3DFormat.DXT5;
                    path = path.Replace(".dxt5", "");
                }

                bmap.Path = Path.GetFileName(path);

                if (settings.Clutter)
                {
                    Console.WriteLine("Cluttering: {0}x{1}", texture.Bitmap.Width, texture.Bitmap.Height);

                    bmap.Mode = 1;
                    bmap.Raw = texture.Bitmap;
                }
                else
                {
                    if (settings.Format == D3DFormat.A8R8G8B8)
                    {
                        Console.WriteLine("Formatting: {0}x{1} (this might take awhile)", texture.Bitmap.Width, texture.Bitmap.Height);
                    }
                    else
                    {
                        Console.WriteLine("Squishing : {0}x{1} (this might take awhile)", texture.Bitmap.Width, texture.Bitmap.Height);
                    }

                    bmap.DDS = new DDS(settings.Format, texture.Bitmap);
                }

                if (!settings.NoRename)
                {

                    if (!Overwrite(Path.GetFullPath(path.Replace(string.Format(".{0}", extension), ".x.bmap")))) { return null; }
                    Console.WriteLine("Saving    : {0}", Path.GetFileName(path.Replace(string.Format(".{0}", extension), ".x.bmap")));

                    bmap.Save(path.Replace(string.Format(".{0}", extension), ".x.bmap"), true);
                }
                else
                {
                    if (!Overwrite(Path.GetFullPath(path.Replace(string.Format(".{0}", extension), ".bmap")))) { return null; }
                    Console.WriteLine("Saving    : {0}", Path.GetFileName(path.Replace(string.Format(".{0}", extension), ".bmap")));
                    bmap.Save(path.Replace(string.Format(".{0}", extension), ".bmap"), true);
                }
                settings = original.Clone();

                return path;
            }

            return null;
        }