private string FindTextures(List <FoundTexture> textures, string packagePath, CachePackageMgr cachePackageMgr, ref string log) { string errors = ""; Package package = null; try { if (cachePackageMgr != null) { package = cachePackageMgr.OpenPackage(packagePath); } else { package = new Package(packagePath); } } catch (Exception e) { string err = ""; err += "---- Start --------------------------------------------" + Environment.NewLine; err += "Issue with open package file: " + packagePath + Environment.NewLine; err += e.Message + Environment.NewLine + Environment.NewLine; err += e.StackTrace + Environment.NewLine + Environment.NewLine; err += "---- End ----------------------------------------------" + Environment.NewLine + Environment.NewLine; errors += err; log += err; return(errors); } for (int i = 0; i < package.exportsTable.Count; i++) { int id = package.getClassNameId(package.exportsTable[i].classId); if (id == package.nameIdTexture2D || id == package.nameIdLightMapTexture2D || id == package.nameIdShadowMapTexture2D || id == package.nameIdTextureFlipBook) { Texture texture = new Texture(package, i, package.getExportData(i)); if (!texture.hasImageData()) { continue; } Texture.MipMap mipmap = texture.getTopMipmap(); string name = package.exportsTable[i].objectName; MatchedTexture matchTexture = new MatchedTexture(); bool slave = false; matchTexture.exportID = i; matchTexture.path = GameData.RelativeGameData(packagePath); if (GameData.gameType != MeType.ME1_TYPE) { slave = true; } else if (texture.packageName.ToLowerInvariant() != Path.GetFileNameWithoutExtension(package.packageFile.Name).ToLowerInvariant()) { slave = true; } uint crc = texture.getCrcTopMipmap(); if (crc == 0) { errors += "Error: Texture " + package.exportsTable[i].objectName + " is broken in package: " + packagePath + ", skipping..." + Environment.NewLine; log += "Error: Texture " + package.exportsTable[i].objectName + " is broken in package: " + packagePath + ", skipping..." + Environment.NewLine; continue; } FoundTexture foundTexName = textures.Find(s => s.crc == crc); if (foundTexName.crc != 0) { if (slave) { foundTexName.list.Add(matchTexture); } else { foundTexName.list.Insert(0, matchTexture); } } else { FoundTexture foundTex = new FoundTexture(); foundTex.list = new List <MatchedTexture>(); foundTex.list.Add(matchTexture); foundTex.name = name; foundTex.crc = crc; foundTex.packageName = texture.packageName; textures.Add(foundTex); } } } if (cachePackageMgr == null) { package.Dispose(); } else { package.DisposeCache(); } return(errors); }
private void FindTextures(MeType gameId, List <FoundTexture> textures, string packagePath, bool modified, bool ipc) { Package package = null; try { package = new Package(GameData.GamePath + packagePath); } catch (Exception e) { if (e.Message.Contains("Problem with PCC file header:")) { return; } if (ipc) { Console.WriteLine("[IPC]ERROR Issue opening package file: " + packagePath); Console.Out.Flush(); } else { string err = ""; err += "---- Start --------------------------------------------" + Environment.NewLine; err += "Issue opening package file: " + packagePath + Environment.NewLine; err += e.Message + Environment.NewLine + Environment.NewLine; err += e.StackTrace + Environment.NewLine + Environment.NewLine; err += "---- End ----------------------------------------------" + Environment.NewLine + Environment.NewLine; Console.WriteLine(err); } return; } for (int i = 0; i < package.exportsTable.Count; i++) { int id = package.getClassNameId(package.exportsTable[i].classId); if (id == package.nameIdTexture2D || id == package.nameIdLightMapTexture2D || id == package.nameIdShadowMapTexture2D || id == package.nameIdTextureFlipBook) { Texture texture = new Texture(package, i, package.getExportData(i)); if (!texture.hasImageData()) { continue; } Texture.MipMap mipmap = texture.getTopMipmap(); string name = package.exportsTable[i].objectName; MatchedTexture matchTexture = new MatchedTexture(); matchTexture.exportID = i; matchTexture.path = packagePath; matchTexture.packageName = texture.packageName; matchTexture.removeEmptyMips = texture.mipMapsList.Exists(s => s.storageType == Texture.StorageTypes.empty); matchTexture.numMips = texture.mipMapsList.FindAll(s => s.storageType != Texture.StorageTypes.empty).Count; if (gameId == MeType.ME1_TYPE) { matchTexture.basePackageName = texture.basePackageName; matchTexture.slave = texture.slave; matchTexture.weakSlave = texture.weakSlave; matchTexture.linkToMaster = -1; if (matchTexture.slave) { matchTexture.mipmapOffset = mipmap.dataOffset; } else { matchTexture.mipmapOffset = package.exportsTable[i].dataOffset + (uint)texture.properties.propertyEndOffset + mipmap.internalOffset; } } uint crc = 0; try { crc = texture.getCrcTopMipmap(); } catch (Exception e) { if (ipc) { Console.WriteLine("[IPC]ERROR Texture " + package.exportsTable[i].objectName + " is broken in package: " + packagePath + ", skipping..."); Console.Out.Flush(); } else { Console.WriteLine(">>>>>>>>>"); Console.WriteLine("Error: Texture " + package.exportsTable[i].objectName + " is broken in package: " + Environment.NewLine + packagePath); Console.WriteLine(e.Message); Console.WriteLine("Export Id: " + (i + 1)); Console.WriteLine("skipping..."); Console.WriteLine("<<<<<<<<<" + Environment.NewLine); } continue; } FoundTexture foundTexName = textures.Find(s => s.crc == crc); if (foundTexName.crc != 0) { if (modified && foundTexName.list.Exists(s => (s.exportID == i && s.path.ToLowerInvariant() == packagePath.ToLowerInvariant()))) { continue; } if (matchTexture.slave || gameId != MeType.ME1_TYPE) { foundTexName.list.Add(matchTexture); } else { foundTexName.list.Insert(0, matchTexture); } } else { if (modified) { for (int k = 0; k < textures.Count; k++) { bool found = false; for (int t = 0; t < textures[k].list.Count; t++) { if (textures[k].list[t].exportID == i && textures[k].list[t].path.ToLowerInvariant() == packagePath.ToLowerInvariant()) { MatchedTexture f = textures[k].list[t]; f.path = ""; textures[k].list[t] = f; found = true; break; } } if (found) { break; } } } FoundTexture foundTex = new FoundTexture(); foundTex.list = new List <MatchedTexture>(); foundTex.list.Add(matchTexture); foundTex.name = name; foundTex.crc = crc; if (generateBuiltinMapFiles) { foundTex.width = texture.getTopMipmap().width; foundTex.height = texture.getTopMipmap().height; foundTex.pixfmt = Image.getPixelFormatType(texture.properties.getProperty("Format").valueName); if (texture.properties.exists("CompressionSettings")) { string cmp = texture.properties.getProperty("CompressionSettings").valueName; if (cmp == "TC_OneBitAlpha") { foundTex.flags = TexProperty.TextureTypes.OneBitAlpha; } else if (cmp == "TC_Displacementmap") { foundTex.flags = TexProperty.TextureTypes.Displacementmap; } else if (cmp == "TC_Grayscale") { foundTex.flags = TexProperty.TextureTypes.GreyScale; } else if (cmp == "TC_Normalmap" || cmp == "TC_NormalmapHQ" || cmp == "TC_NormalmapAlpha" || cmp == "TC_NormalmapUncompressed") { foundTex.flags = TexProperty.TextureTypes.Normalmap; } else { throw new Exception(); } } else { foundTex.flags = TexProperty.TextureTypes.Normal; } } textures.Add(foundTex); } } } package.Dispose(); }
public string removeMipMapsME2ME3(List <FoundTexture> textures, CachePackageMgr cachePackageMgr, MainWindow mainWindow, Installer installer, bool forceZlib = false) { string errors = ""; for (int i = 0; i < GameData.packageFiles.Count; i++) { bool modified = false; if (mainWindow != null) { mainWindow.updateStatusLabel("Removing empty mipmaps - package " + (i + 1) + " of " + GameData.packageFiles.Count + " - " + GameData.packageFiles[i]); mainWindow.updateStatusLabel2(""); } if (installer != null) { installer.updateStatusMipMaps("Removing empty mipmaps " + (i * 100 / GameData.packageFiles.Count) + "%"); } Package package = null; try { if (cachePackageMgr != null) { package = cachePackageMgr.OpenPackage(GameData.packageFiles[i]); } else { package = new Package(GameData.packageFiles[i], true); } } catch (Exception e) { string err = ""; err += "---- Start --------------------------------------------" + Environment.NewLine; err += "Issue with open package file: " + GameData.packageFiles[i] + Environment.NewLine; err += e.Message + Environment.NewLine + Environment.NewLine; err += e.StackTrace + Environment.NewLine + Environment.NewLine; err += "---- End ----------------------------------------------" + Environment.NewLine + Environment.NewLine; errors += err; continue; } for (int l = 0; l < package.exportsTable.Count; l++) { int id = package.getClassNameId(package.exportsTable[l].classId); if (id == package.nameIdTexture2D || id == package.nameIdTextureFlipBook) { using (Texture texture = new Texture(package, l, package.getExportData(l), false)) { if (!texture.hasImageData() || !texture.mipMapsList.Exists(s => s.storageType == Texture.StorageTypes.empty)) { continue; } do { texture.mipMapsList.Remove(texture.mipMapsList.First(s => s.storageType == Texture.StorageTypes.empty)); } while (texture.mipMapsList.Exists(s => s.storageType == Texture.StorageTypes.empty)); texture.properties.setIntValue("SizeX", texture.mipMapsList.First().width); texture.properties.setIntValue("SizeY", texture.mipMapsList.First().height); texture.properties.setIntValue("MipTailBaseIdx", texture.mipMapsList.Count() - 1); using (MemoryStream newData = new MemoryStream()) { newData.WriteFromBuffer(texture.properties.toArray()); newData.WriteFromBuffer(texture.toArray(package.exportsTable[l].dataOffset + (uint)newData.Position)); package.setExportData(l, newData.ToArray()); } modified = true; } } } if (cachePackageMgr == null) { if (modified) { if (package.compressed && package.compressionType != Package.CompressionType.Zlib) { package.SaveToFile(forceZlib); } else { package.SaveToFile(); } } package.Dispose(); } else { package.DisposeCache(); } } if (GameData.gameType == MeType.ME3_TYPE) { TOCBinFile.UpdateAllTOCBinFiles(); } return(errors); }
public string removeMipMapsME1(int phase, List <FoundTexture> textures, CachePackageMgr cachePackageMgr, MainWindow mainWindow, Installer installer, bool forceZlib = false) { string errors = ""; for (int i = 0; i < GameData.packageFiles.Count; i++) { bool modified = false; if (mainWindow != null) { mainWindow.updateStatusLabel("Removing empty mipmaps (" + phase + ") - package " + (i + 1) + " of " + GameData.packageFiles.Count + " - " + GameData.packageFiles[i]); mainWindow.updateStatusLabel2(""); } if (installer != null) { installer.updateStatusMipMaps("Removing empty mipmaps " + ((GameData.packageFiles.Count * (phase - 1) + i + 1) * 100 / (GameData.packageFiles.Count * 2)) + "% "); } Package package = null; try { if (cachePackageMgr != null) { package = cachePackageMgr.OpenPackage(GameData.packageFiles[i]); } else { package = new Package(GameData.packageFiles[i], true); } } catch (Exception e) { string err = ""; err += "---- Start --------------------------------------------" + Environment.NewLine; err += "Issue with open package file: " + GameData.packageFiles[i] + Environment.NewLine; err += e.Message + Environment.NewLine + Environment.NewLine; err += e.StackTrace + Environment.NewLine + Environment.NewLine; err += "---- End ----------------------------------------------" + Environment.NewLine + Environment.NewLine; errors += err; continue; } for (int l = 0; l < package.exportsTable.Count; l++) { int id = package.getClassNameId(package.exportsTable[l].classId); if (id == package.nameIdTexture2D || id == package.nameIdTextureFlipBook) { using (Texture texture = new Texture(package, l, package.getExportData(l), false)) { if (!texture.hasImageData() || !texture.mipMapsList.Exists(s => s.storageType == Texture.StorageTypes.empty)) { continue; } do { texture.mipMapsList.Remove(texture.mipMapsList.First(s => s.storageType == Texture.StorageTypes.empty)); } while (texture.mipMapsList.Exists(s => s.storageType == Texture.StorageTypes.empty)); texture.properties.setIntValue("SizeX", texture.mipMapsList.First().width); texture.properties.setIntValue("SizeY", texture.mipMapsList.First().height); texture.properties.setIntValue("MipTailBaseIdx", texture.mipMapsList.Count() - 1); FoundTexture foundTexture = new FoundTexture(); int foundListEntry = -1; string pkgName = GameData.RelativeGameData(package.packagePath).ToLowerInvariant(); for (int k = 0; k < textures.Count; k++) { for (int t = 0; t < textures[k].list.Count; t++) { if (textures[k].list[t].exportID == l && textures[k].list[t].path.ToLowerInvariant() == pkgName) { foundTexture = textures[k]; foundListEntry = t; break; } } } if (foundListEntry == -1) { errors += "Error: Texture " + package.exportsTable[l].objectName + " not found in package: " + GameData.packageFiles[i] + ", skipping..." + Environment.NewLine; goto skip; } if (foundTexture.list[foundListEntry].linkToMaster != -1) { if (phase == 1) { continue; } MatchedTexture foundMasterTex = foundTexture.list[foundTexture.list[foundListEntry].linkToMaster]; Package masterPkg = null; if (cachePackageMgr != null) { masterPkg = cachePackageMgr.OpenPackage(GameData.GamePath + foundMasterTex.path); } else { masterPkg = new Package(GameData.GamePath + foundMasterTex.path); } int masterExportId = foundMasterTex.exportID; byte[] masterData = masterPkg.getExportData(masterExportId); masterPkg.DisposeCache(); using (Texture masterTexture = new Texture(masterPkg, masterExportId, masterData, false)) { if (texture.mipMapsList.Count != masterTexture.mipMapsList.Count) { errors += "Error: Texture " + package.exportsTable[l].objectName + " in package: " + GameData.packageFiles[i] + " has wrong reference, skipping..." + Environment.NewLine; goto skip; } for (int t = 0; t < texture.mipMapsList.Count; t++) { Texture.MipMap mipmap = texture.mipMapsList[t]; if (mipmap.storageType == Texture.StorageTypes.extLZO || mipmap.storageType == Texture.StorageTypes.extZlib || mipmap.storageType == Texture.StorageTypes.extUnc) { mipmap.dataOffset = masterPkg.exportsTable[masterExportId].dataOffset + (uint)masterTexture.properties.propertyEndOffset + masterTexture.mipMapsList[t].internalOffset; texture.mipMapsList[t] = mipmap; } } } if (cachePackageMgr == null) { masterPkg.Dispose(); } } skip: using (MemoryStream newData = new MemoryStream()) { newData.WriteFromBuffer(texture.properties.toArray()); newData.WriteFromBuffer(texture.toArray(package.exportsTable[l].dataOffset + (uint)newData.Position)); package.setExportData(l, newData.ToArray()); } modified = true; } } } if (cachePackageMgr == null) { if (modified) { if (package.compressed && package.compressionType != Package.CompressionType.Zlib) { package.SaveToFile(forceZlib); } else { package.SaveToFile(); } } package.Dispose(); } else { package.DisposeCache(); } } return(errors); }
private string FindTextures(List <FoundTexture> textures, string packagePath, CachePackageMgr cachePackageMgr, ref string log) { string errors = ""; Package package = null; try { if (cachePackageMgr != null) { package = cachePackageMgr.OpenPackage(packagePath); } else { package = new Package(packagePath); } } catch (Exception e) { string err = ""; err += "---- Start --------------------------------------------" + Environment.NewLine; err += "Issue with open package file: " + packagePath + Environment.NewLine; err += e.Message + Environment.NewLine + Environment.NewLine; err += e.StackTrace + Environment.NewLine + Environment.NewLine; err += "---- End ----------------------------------------------" + Environment.NewLine + Environment.NewLine; errors += err; log += err; return(errors); } for (int i = 0; i < package.exportsTable.Count; i++) { int id = package.getClassNameId(package.exportsTable[i].classId); if (id == package.nameIdTexture2D || id == package.nameIdLightMapTexture2D || id == package.nameIdShadowMapTexture2D || id == package.nameIdTextureFlipBook) { Texture texture = new Texture(package, i, package.getExportData(i)); if (!texture.hasImageData()) { continue; } Texture.MipMap mipmap = texture.getTopMipmap(); string name = package.exportsTable[i].objectName; MatchedTexture matchTexture = new MatchedTexture(); matchTexture.exportID = i; matchTexture.path = GameData.RelativeGameData(packagePath); matchTexture.packageName = texture.packageName; if (GameData.gameType == MeType.ME1_TYPE) { matchTexture.basePackageName = texture.basePackageName; matchTexture.slave = texture.slave; matchTexture.weakSlave = texture.weakSlave; matchTexture.linkToMaster = -1; if (matchTexture.slave) { matchTexture.mipmapOffset = mipmap.dataOffset; } else { matchTexture.mipmapOffset = package.exportsTable[i].dataOffset + (uint)texture.properties.propertyEndOffset + mipmap.internalOffset; } } uint crc = 0; try { crc = texture.getCrcTopMipmap(); } catch { } if (crc == 0) { errors += "Error: Texture " + package.exportsTable[i].objectName + " is broken in package: " + packagePath + ", skipping..." + Environment.NewLine; log += "Error: Texture " + package.exportsTable[i].objectName + " is broken in package: " + packagePath + ", skipping..." + Environment.NewLine; continue; } FoundTexture foundTexName = textures.Find(s => s.crc == crc); if (foundTexName.crc != 0) { if (matchTexture.slave || GameData.gameType != MeType.ME1_TYPE) { foundTexName.list.Add(matchTexture); } else { foundTexName.list.Insert(0, matchTexture); } } else { FoundTexture foundTex = new FoundTexture(); foundTex.list = new List <MatchedTexture>(); foundTex.list.Add(matchTexture); foundTex.name = name; foundTex.crc = crc; if (generateBuiltinMapFiles) { foundTex.width = texture.getTopMipmap().width; foundTex.height = texture.getTopMipmap().height; foundTex.pixfmt = Image.getEngineFormatType(texture.properties.getProperty("Format").valueName); if (foundTex.pixfmt == PixelFormat.DXT1 && texture.properties.exists("CompressionSettings") && texture.properties.getProperty("CompressionSettings").valueName == "TC_OneBitAlpha") { foundTex.alphadxt1 = true; } } textures.Add(foundTex); } } } if (cachePackageMgr == null) { package.Dispose(); } else { package.DisposeCache(); } return(errors); }