static void ArgumentHandlerStexToPngJson(string[] args) { if (args.Length != 3) { throw new Exception($"Invalid number of arguments for {args[0]}"); } var sourceRoot = new DirectoryInfo(args[1]); var targetRoot = new DirectoryInfo(args[2]); // Special cases: exclude known leftovers, etc. (mainly "effect" stuff) var stexFiles = sourceRoot.EnumerateFiles("*.stex", SearchOption.AllDirectories) .Where(x => !x.DirectoryName.Contains("effect\\tex") && !x.DirectoryName.Contains("effect_editor")); foreach (var stexFile in stexFiles) { var relativePath = GetRelativePath(stexFile, sourceRoot); var outputFileJsonInfo = new FileInfo(Path.Combine(targetRoot.FullName, relativePath, $"{Path.GetFileNameWithoutExtension(stexFile.FullName)}.json")); var outputFilePngOriginalInfo = new FileInfo(Path.Combine(targetRoot.FullName, relativePath, $"{Path.GetFileNameWithoutExtension(stexFile.FullName)} (Original).png")); var outputFilePngTranslationInfo = new FileInfo(Path.Combine(targetRoot.FullName, relativePath, $"{Path.GetFileNameWithoutExtension(stexFile.FullName)} (Translation).png")); if (CheckOkayToContinue(outputFileJsonInfo) && CheckOkayToContinue(outputFilePngOriginalInfo) && CheckOkayToContinue(outputFilePngTranslationInfo)) { Console.WriteLine($"[*] Converting STEX {stexFile.Name} to PNG+JSON..."); outputFileJsonInfo.Directory.Create(); (Bitmap bitmap, ImageMetadata metadata) = STEXHandler.ImportBinary(stexFile.FullName, relativePath); bitmap.Save(outputFilePngOriginalInfo.FullName, ImageFormat.Png); bitmap.Save(outputFilePngTranslationInfo.FullName, ImageFormat.Png); metadata.SerializeToFile(outputFileJsonInfo.FullName); } } }
static void ArgumentHandlerPngJsonToStex(string[] args) { if (args.Length != 3) { throw new Exception($"Invalid number of arguments for {args[0]}"); } var sourceRoot = new DirectoryInfo(args[1]); var targetRoot = new DirectoryInfo(args[2]); var jsonFiles = sourceRoot.EnumerateFiles("*.json", SearchOption.AllDirectories); foreach (var jsonFile in jsonFiles) { var metadataFile = jsonFile.FullName.DeserializeFromFile <ImageMetadata>(); var inputFilePngOriginalInfo = new FileInfo(Path.Combine(sourceRoot.FullName, Path.GetDirectoryName(metadataFile.RelativePath), $"{Path.GetFileNameWithoutExtension(metadataFile.RelativePath)} (Original).png")); var inputFilePngTranslationInfo = new FileInfo(Path.Combine(sourceRoot.FullName, Path.GetDirectoryName(metadataFile.RelativePath), $"{Path.GetFileNameWithoutExtension(metadataFile.RelativePath)} (Translation).png")); if (ignoreUntranslatedFiles && ((inputFilePngOriginalInfo.Length == inputFilePngTranslationInfo.Length) && (File.ReadAllBytes(inputFilePngOriginalInfo.FullName).SequenceEqual(File.ReadAllBytes(inputFilePngTranslationInfo.FullName))))) { Console.WriteLine($"[-] File {jsonFile.Name} has no translation, skipping..."); continue; } var relativePath = GetRelativePath(jsonFile, sourceRoot); var outputFileInfo = new FileInfo(Path.Combine(targetRoot.FullName, metadataFile.RelativePath)); if (CheckOkayToContinue(outputFileInfo)) { Console.WriteLine($"[*] Converting PNG+JSON {jsonFile.Name} to STEX..."); if (metadataFile.DataType == ImageHandler.PicaDataType.UnsignedByte && (metadataFile.PixelFormat == ImageHandler.PicaPixelFormat.ETC1RGB8NativeDMP || metadataFile.PixelFormat == ImageHandler.PicaPixelFormat.ETC1AlphaRGB8A4NativeDMP)) { Console.WriteLine($"[+] Original STEX was ETC1, encoding to RGBA8 instead..."); metadataFile.DataType = ImageHandler.PicaDataType.UnsignedByte; metadataFile.PixelFormat = ImageHandler.PicaPixelFormat.RGBANativeDMP; } outputFileInfo.Directory.Create(); using (var bitmap = Image.FromFile(inputFilePngTranslationInfo.FullName)) { STEXHandler.ExportBinary((Bitmap)bitmap, metadataFile, outputFileInfo.FullName); } } } }