public static Type GetImageFileTypeFromSignature(byte[] buffer) { if (TEXN.IsValid(buffer)) { return(typeof(TEXN)); } if (PVRT.IsValid(buffer)) { return(typeof(PVRT)); } if (DDS.IsValid(buffer)) { return(typeof(DDS)); } if (BMP.IsValid(buffer)) { return(typeof(BMP)); } if (JPEG.IsValid(buffer)) { return(typeof(JPEG)); } if (PNG.IsValid(buffer)) { return(typeof(PNG)); } return(null); }
protected override void _Read(BinaryReader reader) { uint identifier = reader.ReadUInt32(); reader.BaseStream.Seek(-4, SeekOrigin.Current); if (!TEXN.IsValid(identifier)) { return; } while (reader.BaseStream.CanRead) { if (reader.BaseStream.Position >= reader.BaseStream.Length - 16) { break; } uint token = reader.ReadUInt32(); if (token == 0) { continue; } reader.BaseStream.Seek(-4, SeekOrigin.Current); TEXN texture = new TEXN(reader); if (TextureDatabase.Automatic) { TextureDatabase.AddTexture(texture); } Textures.Add(texture); } }
/// <summary> /// Searches the given directory for TEXN files and adds them to the database. /// </summary> public static void SearchDirectory(string folder) { if (!Directory.Exists(folder)) { return; } List <string> filepaths = FileHelper.DirSearch(folder); foreach (string filepath in filepaths) { if (FileHelper.IsFileLocked(filepath)) { continue; } if (Path.GetExtension(filepath).ToUpper() != ".TEXN") { continue; } using (FileStream stream = new FileStream(filepath, FileMode.Open)) { byte[] buffer = new byte[4]; stream.Read(buffer, 0, 4); if (TEXN.IsValid(buffer)) { stream.Seek(-4, SeekOrigin.Current); TEXN texture = new TEXN(stream); texture.FilePath = filepath; AddTexture(texture); } } } }
/// <summary> /// Packs the given files into the SPR object. /// </summary> public void Pack(List <string> filepaths) { Textures.Clear(); foreach (string filepath in filepaths) { TEXN entry = new TEXN(filepath); Textures.Add(entry); } }
private void textBox_TextureName_TextChanged(object sender, EventArgs e) { if (listBox_ArchiveFiles.SelectedIndex >= listBox_ArchiveFiles.Items.Count || listBox_ArchiveFiles.SelectedIndex < 0) { return; } TEXN entry = (TEXN)listBox_ArchiveFiles.Items[listBox_ArchiveFiles.SelectedIndex]; entry.TextureID.Name = textBox_TextureName.Name; }
private void numericUpDown_TextureID_ValueChanged(object sender, EventArgs e) { if (listBox_ArchiveFiles.SelectedIndex >= listBox_ArchiveFiles.Items.Count || listBox_ArchiveFiles.SelectedIndex < 0) { return; } TEXN entry = (TEXN)listBox_ArchiveFiles.Items[listBox_ArchiveFiles.SelectedIndex]; entry.TextureID.Data = (UInt64)numericUpDown_TextureID.Value; }
private void listBox_ArchiveFiles_SelectedIndexChanged(object sender, EventArgs e) { if (listBox_ArchiveFiles.SelectedIndex >= listBox_ArchiveFiles.Items.Count || listBox_ArchiveFiles.SelectedIndex < 0) { return; } TEXN entry = (TEXN)listBox_ArchiveFiles.Items[listBox_ArchiveFiles.SelectedIndex]; numericUpDown_TextureID.Value = entry.TextureID.Data; textBox_TextureName.Text = entry.TextureID.Name; }
/// <summary> /// Adds the given TEXN entry to the database. /// Duplicates will not be added. /// </summary> public static void AddTexture(TEXN texture) { //Check for duplicate foreach (TEXN tex in m_textures) { if (tex.TextureID == texture.TextureID) { return; } } m_textures.Add(texture); }
private void listBox_ArchiveFiles_DragDrop(object sender, DragEventArgs e) { bool TexDBState = TextureDatabase.Automatic; bool PVRTState = PVRT.EnableBuffering; TextureDatabase.Automatic = false; PVRT.EnableBuffering = true; string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); for (int i = 0; i < files.Length; i++) { string file = files[i]; if (Path.GetExtension(file).ToUpper() != ".TEXN") { continue; } TEXN entry = new TEXN(file); listBox_ArchiveFiles.Items.Add(entry); } TextureDatabase.Automatic = TexDBState; PVRT.EnableBuffering = PVRTState; }
private void listBox_Images_DragDrop(object sender, DragEventArgs e) { string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); for (int i = 0; i < files.Length; i++) { string file = files[i]; string extension = Path.GetExtension(file).Replace(".", ""); byte[] buffer = new byte[32]; using (FileStream stream = new FileStream(file, FileMode.Open)) { stream.Read(buffer, 0, 32); } Type imageType = FileHelper.GetImageFileTypeFromSignature(buffer); if (imageType == null) { continue; } BaseImage entry = null; object image = Activator.CreateInstance(imageType, new object[] { file }); if (typeof(BaseImage).IsAssignableFrom(imageType)) { entry = (BaseImage)image; } else { TEXN texn = (TEXN)image; entry = texn.Texture; } listBox_Images.Items.Add(entry); } }
public void Read(BinaryReader reader) { Offset = (uint)reader.BaseStream.Position; Identifier = reader.ReadUInt32(); HeaderSize = reader.ReadUInt32(); TextureCount = reader.ReadUInt32(); reader.BaseStream.Seek(Offset + HeaderSize, SeekOrigin.Begin); for (int i = 0; i < TextureCount; i++) { uint nodeOffset = (uint)reader.BaseStream.Position; uint NodeIdentifier = reader.ReadUInt32(); uint NodeSize = reader.ReadUInt32(); if (NodeIdentifier == 0x4E584554) //TEXN { Texture tex = new Texture(); tex.TextureID = new TextureID(reader); tex.Image = new PVRT(reader); Textures.Add(tex); } else if (NodeIdentifier == 0x454D414E) //NAME { for (i = 0; i < ((NodeSize - 8) / 8); i++) { Texture tex = new Texture(); tex.TextureID = new TextureID(reader); reader.BaseStream.Seek(-8, SeekOrigin.Current); UInt64 idName = reader.ReadUInt64(); if (MT5.SearchTexturesOneDirUp) { FileStream fileStream = (FileStream)reader.BaseStream; string dir = Path.GetDirectoryName(Path.GetDirectoryName(fileStream.Name)); TextureDatabase.SearchDirectory(dir); } if (MT5.UseTextureDatabase) { TEXN texture = TextureDatabase.FindTexture(idName); if (texture != null) { tex.Image = texture.Texture; Textures.Add(tex); } else { Textures.Add(tex); } } } } reader.BaseStream.Seek(nodeOffset + NodeSize, SeekOrigin.Begin); } while (reader.BaseStream.Position < reader.BaseStream.Length) { uint identifier = reader.ReadUInt32(); if (TEXL.IsValid(identifier)) { reader.BaseStream.Seek(-4, SeekOrigin.Current); TEXL = new TEXL(reader); } if (PTRL.IsValid(identifier)) { reader.BaseStream.Seek(-4, SeekOrigin.Current); PTRL = new PTRL(reader); } } }
protected override void _Read(BinaryReader reader) { Offset = (uint)reader.BaseStream.Position; Identifier = reader.ReadUInt32(); if (!IsValid(Identifier)) { return; } Size = reader.ReadUInt32(); FirstNodeOffset = reader.ReadUInt32(); TextureCount = reader.ReadUInt32(); //Read texture entries if there are any for (uint i = 0; i < TextureCount; i++) { TextureEntries.Add(new TextureEntry(reader)); } foreach (TextureEntry entry in TextureEntries) { entry.ReadTextureID(reader); } //If we are not at the first node yet, we still have an node offset table to read if (reader.BaseStream.Position != FirstNodeOffset) { NodeOffsetTableSize = reader.ReadUInt32(); for (int i = 0; i < NodeOffsetTableSize; i++) { NodeOffsetTable.Add(reader.ReadUInt32()); } } //Read first node and as an result create the whole node tree structure reader.BaseStream.Seek(Offset + FirstNodeOffset, SeekOrigin.Begin); RootNode = new MT7Node(reader, null); //Search for optional extra sections until EOF while (reader.BaseStream.Position < reader.BaseStream.Length - 4) { uint identifier = reader.ReadUInt32(); if (FACE.IsValid(identifier)) { reader.BaseStream.Seek(-4, SeekOrigin.Current); FACE = new FACE(reader); } else if (CLSG.IsValid(identifier)) { reader.BaseStream.Seek(-4, SeekOrigin.Current); CLSG = new CLSG(reader); } else if (TXT7.IsValid(identifier)) { reader.BaseStream.Seek(-4, SeekOrigin.Current); TXT7 = new TXT7(reader); } } //Filling the texture entries with the actual textures if (TXT7 != null) { foreach (TextureEntry entry in TextureEntries) { entry.Texture = TXT7.GetTexture(entry.TextureID); } } if (SearchTexturesOneDirUp) { FileStream fileStream = (FileStream)reader.BaseStream; string dir = Path.GetDirectoryName(Path.GetDirectoryName(fileStream.Name)); TextureDatabase.SearchDirectory(dir); } if (MT7.UseTextureDatabase) { foreach (TextureEntry entry in TextureEntries) { if (entry.Texture != null) { continue; } TEXN texture = TextureDatabase.FindTexture(entry.TextureID.Data); if (texture == null) { Console.WriteLine("Couldn't find texture: {0}", entry.TextureID.Name); continue; } entry.Texture = new Texture(); entry.Texture.TextureID = new TextureID(texture.TextureID); entry.Texture.Image = texture.Texture; } } //Populate base class textures foreach (TextureEntry entry in TextureEntries) { if (entry.Texture == null) { entry.Texture = new Texture(); entry.Texture.TextureID = entry.TextureID; } Textures.Add(entry.Texture); } //Resolve the textures in the faces RootNode.ResolveFaceTextures(Textures); }
private void ReadFileRecursive(byte[] data) { if (GZ.IsValid(data)) { using (MemoryStream memstream = new MemoryStream(data)) { GZ gz = new GZ(memstream); ReadFileRecursive(gz.ContentBuffer); } } if (AFS.IsValid(data)) { using (MemoryStream memstream = new MemoryStream(data)) { AFS afs = new AFS(memstream); foreach (var entry in afs.Entries) { ReadFileRecursive(entry.Buffer); } } } if (PKF.IsValid(data)) { using (MemoryStream memstream = new MemoryStream(data)) { PKF pkf = new PKF(memstream); foreach (var entry in pkf.Entries) { ReadFileRecursive(entry.Buffer); } } } if (PKS.IsValid(data)) { using (MemoryStream memstream = new MemoryStream(data)) { PKS pks = new PKS(memstream); foreach (var entry in pks.IPAC.Entries) { ReadFileRecursive(entry.Buffer); } } } if (TEXN.IsValid(data)) { using (MemoryStream memstream = new MemoryStream(data)) { TEXN tex = new TEXN(memstream); TexEntry entry = new TexEntry(); entry.texID = tex.TextureID; entry.image = tex.Texture; textures.Add(entry); } } if (MT5.IsValid(data)) { using (MemoryStream memstream = new MemoryStream(data)) { MT5 mt5 = new MT5(memstream); foreach (var tex in mt5.Textures) { if (tex.Image != null) { TexEntry entry = new TexEntry(); entry.texID = tex.TextureID; entry.image = tex.Image; textures.Add(entry); } } } } if (MT7.IsValid(data)) { using (MemoryStream memstream = new MemoryStream(data)) { MT7 mt7 = new MT7(memstream); foreach (var tex in mt7.Textures) { if (tex.Image != null) { TexEntry entry = new TexEntry(); entry.texID = tex.TextureID; entry.image = tex.Image; textures.Add(entry); } } } } }
private void button_Convert_Click(object sender, EventArgs e) { string outputFolder = textBox_OutputFolder.Text; if (String.IsNullOrEmpty(outputFolder)) { return; } if (!Directory.Exists(outputFolder)) { Directory.CreateDirectory(outputFolder); } List <BaseImage> images = new List <BaseImage>(); if (checkBox_ConvertSelected.Checked) { foreach (BaseImage img in listBox_Images.SelectedItems) { images.Add(img); } } else { foreach (BaseImage img in listBox_Images.Items) { images.Add(img); } } if ((Type)comboBox_ImageFormat.SelectedItem == typeof(PVRT)) { PVRTSettings settings = pvrtControl.Settings; foreach (BaseImage image in images) { PVRT pvrt = new PVRT(image); pvrt.PixelFormat = settings.PixelFormat; pvrt.DataFormat = settings.DataFormat; if (settings.CreateTEXN) { string srcFilename = Path.GetFileName(image.FilePath); string[] splitted = srcFilename.Split('.'); string texIDString = splitted[0]; UInt64 texID = Convert.ToUInt64(texIDString, 16); TEXN texn = new TEXN(); texn.TextureID.Data = texID; string filename = String.Format("{0}.{1}.TEXN", Helper.ByteArrayToString(BitConverter.GetBytes(texn.TextureID.Data)), texn.TextureID.Name.Replace("\0", "_")); string filepath = outputFolder + "\\" + filename; using (FileStream fileStream = new FileStream(filepath, FileMode.Create)) { using (BinaryWriter writer = new BinaryWriter(fileStream)) { long offset = fileStream.Position; texn.WriteHeader(writer); if (settings.InsertDDS && typeof(DDS).IsAssignableFrom(image.GetType())) { pvrt.WriteDDSRaw(writer, (DDS)image); } else { pvrt.Write(writer); } texn.EntrySize = (uint)(fileStream.Position - offset); fileStream.Seek(offset, SeekOrigin.Begin); texn.WriteHeader(writer); } } } else { string filepath = outputFolder + "\\" + Path.ChangeExtension(Path.GetFileName(image.FilePath), ".PVR"); using (FileStream fileStream = new FileStream(filepath, FileMode.Create)) { using (BinaryWriter writer = new BinaryWriter(fileStream)) { if (settings.InsertDDS && typeof(DDS).IsAssignableFrom(image.GetType())) { pvrt.WriteDDSRaw(writer, (DDS)image); } else { pvrt.Write(writer); } } } } } } else if ((Type)comboBox_ImageFormat.SelectedItem == typeof(DDS)) { DDSSettings settings = ddsControl.Settings; foreach (BaseImage image in images) { string filepath = outputFolder + "\\" + Path.ChangeExtension(Path.GetFileName(image.FilePath), ".dds"); DDS dds = new DDS(image); dds.AlphaSettings = settings.AlphaSettings; dds.MipHandling = settings.MipHandling; dds.FormatDetails = new DDSFormats.DDSFormatDetails(settings.DDSFormat, settings.DXGIFormat); dds.Write(filepath); } } else if ((Type)comboBox_ImageFormat.SelectedItem == typeof(PNG)) { foreach (BaseImage image in images) { string filepath = outputFolder + "\\" + Path.ChangeExtension(Path.GetFileName(image.FilePath), ".png"); PNG png = new PNG(image); png.Write(filepath); } } else if ((Type)comboBox_ImageFormat.SelectedItem == typeof(BMP)) { foreach (BaseImage image in images) { string filepath = outputFolder + "\\" + Path.ChangeExtension(Path.GetFileName(image.FilePath), ".bmp"); BMP bmp = new BMP(image); bmp.Write(filepath); } } else if ((Type)comboBox_ImageFormat.SelectedItem == typeof(JPEG)) { foreach (BaseImage image in images) { string filepath = outputFolder + "\\" + Path.ChangeExtension(Path.GetFileName(image.FilePath), ".jpg"); JPEG jpg = new JPEG(image); jpg.Write(filepath); } } }
public static string GetExtensionFromBuffer(byte[] buffer) { //Archives if (AFS.IsValid(buffer)) { return("AFS"); } if (GZ.IsValid(buffer)) { return("GZ"); } if (IDX.IsValid(buffer)) { return("IDX"); } if (IPAC.IsValid(buffer)) { return("IPAC"); } if (PKF.IsValid(buffer)) { return("PKF"); } if (PKS.IsValid(buffer)) { return("PKS"); } //if (SPR.IsValid(buffer)) return typeof(SPR); //same as TEXN skip and base identification on extension if (TAD.IsValid(buffer)) { return("TAD"); } //Textures/Images if (TEXN.IsValid(buffer)) { return("TEXN"); } if (PVRT.IsValid(buffer)) { return("PVRT"); } if (DDS.IsValid(buffer)) { return("DDS"); } //Models if (MT5.IsValid(buffer)) { return("MT5"); } if (MT7.IsValid(buffer)) { return("MT7"); } //Subtitles if (SUB.IsValid(buffer)) { return("SUB"); } return("UNKNOWN"); }
/// <summary> /// Trys to find the fitting file type for the given file with the file signature. /// </summary> public static Type GetFileTypeFromSignature(Stream stream) { byte[] buffer = new byte[8]; stream.Read(buffer, 0, buffer.Length); //Archives if (AFS.IsValid(buffer)) { return(typeof(AFS)); } if (GZ.IsValid(buffer)) { return(typeof(GZ)); } if (IDX.IsValid(buffer)) { return(typeof(IDX)); } if (IPAC.IsValid(buffer)) { return(typeof(IPAC)); } if (PKF.IsValid(buffer)) { return(typeof(PKF)); } if (PKS.IsValid(buffer)) { return(typeof(PKS)); } //if (SPR.IsValid(buffer)) return typeof(SPR); //same as TEXN skip and base identification on extension if (TAD.IsValid(buffer)) { return(typeof(TAD)); } //Textures/Images if (TEXN.IsValid(buffer)) { return(typeof(TEXN)); } if (PVRT.IsValid(buffer)) { return(typeof(PVRT)); } if (DDS.IsValid(buffer)) { return(typeof(DDS)); } //Models if (MT5.IsValid(buffer)) { return(typeof(MT5)); } if (MT7.IsValid(buffer)) { return(typeof(MT7)); } //Subtitles if (SUB.IsValid(buffer)) { return(typeof(SUB)); } return(null); }