Exemplo n.º 1
0
        public override object Execute(List <string> args)
        {
            if (args.Count != 1)
            {
                return(false);
            }

            var directory = args[0];

            if (!Directory.Exists(directory))
            {
                Console.Write("Destination directory does not exist. Create it? [y/n] ");
                var answer = Console.ReadLine().ToLower();

                if (answer.Length == 0 || !(answer.StartsWith("y") || answer.StartsWith("n")))
                {
                    return(false);
                }

                if (answer.StartsWith("y"))
                {
                    Directory.CreateDirectory(directory);
                }
                else
                {
                    return(false);
                }
            }

            using (var cacheStream = CacheContext.OpenCacheRead())
            {
                var renderModel = CacheContext.Deserialize <RenderModel>(cacheStream, Definition.RenderModel);

                foreach (var shader in renderModel.Materials)
                {
                    var renderMethod = (RenderMethod)CacheContext.Deserialize(cacheStream, shader.RenderMethod);

                    foreach (var property in renderMethod.ShaderProperties)
                    {
                        var template = CacheContext.Deserialize <RenderMethodTemplate>(cacheStream, property.Template);

                        for (var i = 0; i < template.TextureParameterNames.Count; i++)
                        {
                            var mapTemplate = template.TextureParameterNames[i];

                            var bitmap    = CacheContext.Deserialize <Bitmap>(cacheStream, property.TextureConstants[i].Bitmap);
                            var ddsOutDir = directory;

                            if (bitmap.Images.Count > 1)
                            {
                                ddsOutDir = Path.Combine(directory, property.TextureConstants[i].Bitmap.Index.ToString("X8"));
                                Directory.CreateDirectory(ddsOutDir);
                            }

                            for (var j = 0; j < bitmap.Images.Count; j++)
                            {
                                var outPath = Path.Combine(ddsOutDir, CacheContext.StringTable.GetString(mapTemplate.Name) + "_" + property.TextureConstants[i].Bitmap.Index.ToString("X4")) + ".dds";

                                using (var outStream = File.Open(outPath, FileMode.Create, FileAccess.Write))
                                    using (var writer = new EndianWriter(outStream))
                                    {
                                        var ddsFile = BitmapExtractor.ExtractBitmap(CacheContext, bitmap, j);
                                        ddsFile.Write(writer);
                                    }


                                Console.WriteLine($"Bitmap {i} ({CacheContext.StringTable.GetString(mapTemplate.Name)}): {property.TextureConstants[i].Bitmap.Group.Tag} 0x{property.TextureConstants[i].Bitmap.Index:X4} extracted to '{outPath}'");
                            }
                        }
                    }
                }
            }

            return(true);
        }
Exemplo n.º 2
0
        public override object Execute(List <string> args)
        {
            if (args.Count != 1)
            {
                return(false);
            }

            var outDir = args[0];

            Directory.CreateDirectory(outDir);

            Console.WriteLine("Loading resource caches...");

            var count = 0;

            using (var tagsStream = Cache.OpenCacheRead())
            {
                foreach (var tag in Cache.TagCache.FindAllInGroup("bitm"))
                {
                    Console.Write("Extracting ");
                    TagPrinter.PrintTagShort(tag);

                #if !DEBUG
                    try
                    {
                #endif
                    var bitmap    = Cache.Deserialize <Bitmap>(tagsStream, tag);
                    var ddsOutDir = outDir;

                    if (bitmap.Images.Count > 1)
                    {
                        ddsOutDir = Path.Combine(outDir, tag.Index.ToString("X8"));
                        Directory.CreateDirectory(ddsOutDir);
                    }

                    for (var i = 0; i < bitmap.Images.Count; i++)
                    {
                        var outPath = Path.Combine(ddsOutDir, ((bitmap.Images.Count > 1) ? i.ToString() : tag.Index.ToString("X8")) + ".dds");
                        var ddsFile = BitmapExtractor.ExtractBitmap(Cache, bitmap, i);
                        if (ddsFile == null)
                        {
                            continue;
                        }
                        using (var outStream = File.Open(outPath, FileMode.Create, FileAccess.Write))
                            using (var writer = new EndianWriter(outStream, EndianFormat.LittleEndian))
                            {
                                ddsFile.Write(writer);
                            }
                    }
                    count++;
                #if !DEBUG
                }
                catch (Exception ex)
                {
                    Console.WriteLine("ERROR: Failed to extract bitmap: " + ex.Message);
                }
                #endif
                }
            }

            Console.WriteLine("Extracted {0} bitmaps.", count);

            return(true);
        }
Exemplo n.º 3
0
        public override object Execute(List <string> args)
        {
            string directory;

            if (args.Count == 1)
            {
                directory = args[0];
            }
            else if (args.Count == 0)
            {
                directory = "Bitmaps";
            }
            else
            {
                return(false);
            }

            if (!Directory.Exists(directory))
            {
                Console.Write("Destination directory does not exist. Create it? [y/n] ");
                var answer = Console.ReadLine().ToLower();

                if (answer.Length == 0 || !(answer.StartsWith("y") || answer.StartsWith("n")))
                {
                    return(false);
                }

                if (answer.StartsWith("y"))
                {
                    Directory.CreateDirectory(directory);
                }
                else
                {
                    return(false);
                }
            }

            var    ddsOutDir = directory;
            string name;

            if (Tag.Name != null)
            {
                var split = Tag.Name.Split('\\');
                name = split[split.Length - 1];
            }
            else
            {
                name = Tag.Index.ToString("X8");
            }
            if (Bitmap.Images.Count > 1)
            {
                ddsOutDir = Path.Combine(directory, name);
                Directory.CreateDirectory(ddsOutDir);
            }

            for (var i = 0; i < Bitmap.Images.Count; i++)
            {
                var bitmapName = (Bitmap.Images.Count > 1) ? i.ToString() : name;
                bitmapName += ".dds";
                var outPath = Path.Combine(ddsOutDir, bitmapName);

                var ddsFile = BitmapExtractor.ExtractBitmap(Cache, Bitmap, i);

                if (ddsFile == null)
                {
                    Console.WriteLine($"Invalid bitmap data");
                    return(true);
                }

                using (var fileStream = File.Open(outPath, FileMode.Create, FileAccess.Write))
                    using (var writer = new EndianWriter(fileStream, EndianFormat.LittleEndian))
                    {
                        ddsFile.Write(writer);
                    }
            }

            Console.WriteLine("Done!");

            return(true);
        }