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); }
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); }
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); }