private static List <FtexsFile> GetFtexsFiles(List <FtexFileMipMapInfo> mipMapInfos, List <byte[]> mipMapDatas) { Dictionary <byte, FtexsFile> ftexsFiles = new Dictionary <byte, FtexsFile>(); foreach (var mipMapInfo in mipMapInfos) { if (ftexsFiles.ContainsKey(mipMapInfo.FtexsFileNumber) == false) { FtexsFile ftexsFile = new FtexsFile { FileNumber = mipMapInfo.FtexsFileNumber }; ftexsFiles.Add(mipMapInfo.FtexsFileNumber, ftexsFile); } } for (int i = 0; i < mipMapInfos.Count; i++) { FtexFileMipMapInfo mipMapInfo = mipMapInfos[i]; FtexsFile ftexsFile = ftexsFiles[mipMapInfo.FtexsFileNumber]; byte[] mipMapData = mipMapDatas[i]; FtexsFileMipMap ftexsFileMipMap = new FtexsFileMipMap(); List <FtexsFileChunk> chunks = GetFtexsChunks(mipMapData); ftexsFileMipMap.AddChunks(chunks); ftexsFile.AddMipMap(ftexsFileMipMap); } return(ftexsFiles.Values.ToList()); }
private static FtexFile GetFtexFile(string filePath) { string fileDirectory = Path.GetDirectoryName(filePath) ?? string.Empty; string fileName = Path.GetFileNameWithoutExtension(filePath); FtexFile ftexFile; using (FileStream ftexStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { ftexFile = FtexFile.ReadFtexFile(ftexStream); } for (byte fileNumber = 0; fileNumber <= ftexFile.FtexsFileCount; fileNumber++) { FtexsFile ftexsFile = new FtexsFile { FileNumber = fileNumber }; ftexFile.AddFtexsFile(ftexsFile); } foreach (var mipMapInfo in ftexFile.MipMapInfos) { string ftexsName; ftexsName = mipMapInfo.FtexsFileNumber == 0 ? Path.GetFileName(filePath) : $"{fileName}.{mipMapInfo.FtexsFileNumber}.ftexs"; string ftexsFilePath = Path.Combine(fileDirectory, ftexsName); FtexsFile ftexsFile; if (ftexFile.TryGetFtexsFile(mipMapInfo.FtexsFileNumber, out ftexsFile) && File.Exists(ftexsFilePath)) { using (FileStream ftexsStream = new FileStream(ftexsFilePath, FileMode.Open, FileAccess.Read)) { ftexsStream.Position = mipMapInfo.Offset; ftexsFile.Read( ftexsStream, mipMapInfo.ChunkCount, mipMapInfo.Offset, mipMapInfo.DecompressedFileSize); } } else { throw new MissingFtexsFileException($"{ftexsName} not found"); } } return(ftexFile); }
public bool TryGetFtexsFile(int fileNumber, out FtexsFile ftexsFile) { return(_ftexsFiles.TryGetValue(fileNumber, out ftexsFile)); }
public void AddFtexsFile(FtexsFile ftexsFile) { _ftexsFiles.Add(ftexsFile.FileNumber, ftexsFile); }