Пример #1
0
        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());
        }
Пример #2
0
        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);
        }
Пример #3
0
 public bool TryGetFtexsFile(int fileNumber, out FtexsFile ftexsFile)
 {
     return(_ftexsFiles.TryGetValue(fileNumber, out ftexsFile));
 }
Пример #4
0
 public void AddFtexsFile(FtexsFile ftexsFile)
 {
     _ftexsFiles.Add(ftexsFile.FileNumber, ftexsFile);
 }