public MemoryStream ExportToStream(int tfc, string cachepath) { MemoryStream m = new MemoryStream(); if (tfc < 0 || tfc >= TextureTFCs.Count) { return(m); } if (TextureTFCs[tfc].InCache && cachepath != "") { TFCFile TFCf = new TFCFile(cachepath); if (TFCf.CheckTFC(TextureTFCs[tfc].offset)) { ImageF = new ImageFile(TFCf.getRawTFCComp(TextureTFCs[tfc].offset), T2D.PixelFormat, TextureTFCs[tfc].sizeX, TextureTFCs[tfc].sizeY); } else { return(m); } } else { if (ImageF != null) { m = ImageF.ExportToStream(); } return(m); } if (!TextureTFCs[tfc].InCache) { int SizeX = TextureTFCs[tfc].sizeX; int SizeY = TextureTFCs[tfc].sizeY; int Size = (int)TextureTFCs[tfc].size; int Offset = (int)TextureTFCs[tfc].offset; byte[] buff = new byte[Size]; for (int i = 0; i < Size; i++) { buff[i] = memory[Offset + i]; } ImageF = new ImageFile(buff, T2D.PixelFormat, SizeX, SizeY); } if (T2D.PixelFormat == "PF_DXT1\0" || T2D.PixelFormat == "PF_DXT5\0" || T2D.PixelFormat == "PF_A8R8G8B8\0" || T2D.PixelFormat == "PF_G8\0" || T2D.PixelFormat == "PF_V8U8\0") { m = ImageF.ExportToStream(); } return(m); }
public void ExportToFile(int tfc, string path = "", string cachepath = "") { if (tfc < 0 || tfc >= TextureTFCs.Count) { return; } if (TextureTFCs[tfc].InCache == true) { TFCFile TFCf = new TFCFile(cachepath); if (TFCf.CheckTFC(TextureTFCs[tfc].offset)) { ImageF = new ImageFile(TFCf.getRawTFCComp(TextureTFCs[tfc].offset), T2D.PixelFormat, TextureTFCs[tfc].sizeX, TextureTFCs[tfc].sizeY); } else { return; } } else { int SizeX = TextureTFCs[tfc].sizeX; int SizeY = TextureTFCs[tfc].sizeY; int Size = (int)TextureTFCs[tfc].size; int Offset = (int)TextureTFCs[tfc].offset; byte[] buff = new byte[Size]; for (int i = 0; i < Size; i++) { buff[i] = memory[Offset + i]; } ImageF = new ImageFile(buff, T2D.PixelFormat, SizeX, SizeY); } if (T2D.PixelFormat == "PF_DXT1\0" || T2D.PixelFormat == "PF_DXT5\0" || T2D.PixelFormat == "PF_A8R8G8B8\0" || T2D.PixelFormat == "PF_G8\0" || T2D.PixelFormat == "PF_V8U8\0") { ImageF.ExportToFile(path); } }
public void ImportFromFile(int tfc) { OpenFileDialog Dialog = new OpenFileDialog(); if (T2D.PixelFormat == "PF_DXT1\0" || T2D.PixelFormat == "PF_DXT5\0") Dialog.Filter = "DDS Files (*.dds)|*.dds"; if (T2D.PixelFormat == "PF_G8\0" || T2D.PixelFormat == "PF_V8U8\0" || T2D.PixelFormat == "PF_A8R8G8B8\0") Dialog.Filter = "TGA Files (*.tga)|*.tga"; int format = -1; if (T2D.PixelFormat == "PF_DXT1\0") format = 0; if (T2D.PixelFormat == "PF_DXT5\0") format = 1; if (T2D.PixelFormat == "PF_V8U8\0") format = 2; if (T2D.PixelFormat == "PF_A8R8G8B8\0") format = 3; if (T2D.PixelFormat == "PF_G8\0") format = 4; if (!TextureTFCs[tfc].InCache) { if (Dialog.ShowDialog() == DialogResult.OK) { if (format == 0 || format == 1) { ImageFile t = new ImageFile(); t.ImportFromFile(Dialog.FileName); if (t.ImageSizeX == TextureTFCs[tfc].sizeX && t.ImageSizeY == TextureTFCs[tfc].sizeY && t.ImageFormat == format && t.memsize == TextureTFCs[tfc].size) { for (int i = 0; i < t.memsize; i++) memory[TextureTFCs[tfc].offset + i] = t.memory[i]; MessageBox.Show("Done."); } } if (format > 1 && format < 5) { ImageFile t = new ImageFile(); t.ImportFromFile(Dialog.FileName); if (t.ImageSizeX == TextureTFCs[tfc].sizeX && t.ImageSizeY == TextureTFCs[tfc].sizeY) if (t.ImageBits != 32) { MessageBox.Show("Please use 32 bit Targa image!"); } else { switch (format) { case 2: for (int i = 0; i < t.memsize / 4; i++) { memory[TextureTFCs[tfc].offset + i * 2] = t.memory[i * 4]; memory[TextureTFCs[tfc].offset + i * 2 + 1] = t.memory[i * 4 + 2]; } break; case 3: for (int i = 0; i < t.memsize; i++) memory[TextureTFCs[tfc].offset + i] = t.memory[i]; break; case 4: for (int i = 0; i < t.memsize / 4; i++) memory[TextureTFCs[tfc].offset + i] = t.memory[i * 4]; break; } MessageBox.Show("Done."); } } } } else if (Dialog.ShowDialog() == DialogResult.OK) { ImageFile t = new ImageFile(); t.ImportFromFile(Dialog.FileName); if ((format == 0 || format == 1) && t.ImageFormat == format) if (t.ImageSizeX == TextureTFCs[tfc].sizeX && t.ImageSizeY == TextureTFCs[tfc].sizeY) { TFCFile TFCf = new TFCFile(T2D.Tsource); byte[] buff; if (TFCf.isTFCCompressed()) buff = ZBlock.Compress(t.memory); else buff = t.memory; byte[] buff2 = BitConverter.GetBytes(TFCf.getFileSize()); for (int i = 0; i < 4; i++) memory[TextureTFCs[tfc].HeaderOffset + 20 + i] = buff2[i]; buff2 = BitConverter.GetBytes(buff.Length); for (int i = 0; i < 4; i++) memory[TextureTFCs[tfc].HeaderOffset + 16 + i] = buff2[i]; TFCf.AppendToTFC(buff); int size = TFCf.getFileSize(); if (size != -1) { TOCeditor tc = new TOCeditor(); if (!tc.UpdateFile(T2D.Tsource + ".tfc", (uint)size)) MessageBox.Show("Didn't found Entry"); tc.Close(); } } else { System.Windows.Forms.DialogResult m = MessageBox.Show("The size doesn't match, import anyway?", "ME3 Explorer", MessageBoxButtons.YesNo); if (m == DialogResult.Yes) { TFCFile TFCf = new TFCFile(T2D.Tsource); byte[] buff; if (TFCf.isTFCCompressed()) buff = ZBlock.Compress(t.memory); else buff = t.memory; byte[] buff2 = BitConverter.GetBytes(TFCf.getFileSize()); for (int i = 0; i < 4; i++) memory[TextureTFCs[tfc].HeaderOffset + 20 + i] = buff2[i]; buff2 = BitConverter.GetBytes(buff.Length); for (int i = 0; i < 4; i++) memory[TextureTFCs[tfc].HeaderOffset + 16 + i] = buff2[i]; if (tfc == 0) { buff2 = BitConverter.GetBytes(t.ImageSizeX); for (int i = 0; i < 4; i++) memory[T2D.offSizeX + i] = buff2[i]; buff2 = BitConverter.GetBytes(t.ImageSizeY); for (int i = 0; i < 4; i++) memory[T2D.offSizeY + i] = buff2[i]; } else { buff2 = BitConverter.GetBytes(t.ImageSizeX * 2); for (int i = 0; i < 4; i++) memory[TextureTFCs[tfc].HeaderOffset + i] = buff2[i]; buff2 = BitConverter.GetBytes(t.ImageSizeY * 2); for (int i = 0; i < 4; i++) memory[TextureTFCs[tfc].HeaderOffset + 4 + i] = buff2[i]; TFCf.AppendToTFC(buff); } TFCf.AppendToTFC(buff); int size = TFCf.getFileSize(); if (size != -1) { TOCeditor tc = new TOCeditor(); if (!tc.UpdateFile(T2D.Tsource + ".tfc", (uint)size)) MessageBox.Show("Didn't found Entry"); tc.Close(); } } } if (format > 1 && format < 5) { if (t.ImageSizeX == TextureTFCs[tfc].sizeX && t.ImageSizeY == TextureTFCs[tfc].sizeY) if (t.ImageBits != 32) { MessageBox.Show("Please use 32 bit Targa image!"); } else { byte[] buf = new byte[0]; switch (format) { case 2: buf = new byte[t.memsize / 2]; for (int i = 0; i < t.memsize / 4; i++) { buf[i * 2] = t.memory[i * 4]; buf[i * 2 + 1] = t.memory[i * 4 + 2]; } break; case 3: buf = t.memory; break; case 4: buf = new byte[t.memsize / 4]; for (int i = 0; i < t.memsize / 4; i++) buf[i] = t.memory[i * 4]; break; } TFCFile TFCf = new TFCFile(T2D.Tsource); byte[] buff; if (TFCf.isTFCCompressed()) buff = ZBlock.Compress(t.memory); else buff = t.memory; byte[] buff2 = BitConverter.GetBytes(TFCf.getFileSize()); for (int i = 0; i < 4; i++) memory[TextureTFCs[tfc].HeaderOffset + 20 + i] = buff2[i]; buff2 = BitConverter.GetBytes(buff.Length); for (int i = 0; i < 4; i++) memory[TextureTFCs[tfc].HeaderOffset + 12 + i] = buff2[i]; TFCf.AppendToTFC(buff); int size = TFCf.getFileSize(); if (size != -1) { TOCeditor tc = new TOCeditor(); if (!tc.UpdateFile(T2D.Tsource + ".tfc", (uint)size)) MessageBox.Show("Didn't found Entry"); tc.Close(); } MessageBox.Show("Done."); } } } }
public MemoryStream ExportToStream(int tfc, string cachepath) { MemoryStream m = new MemoryStream(); if (tfc < 0 || tfc >= TextureTFCs.Count) return m; if (TextureTFCs[tfc].InCache && cachepath != "") { TFCFile TFCf = new TFCFile(cachepath); if (TFCf.CheckTFC(TextureTFCs[tfc].offset)) ImageF = new ImageFile(TFCf.getRawTFCComp(TextureTFCs[tfc].offset), T2D.PixelFormat, TextureTFCs[tfc].sizeX, TextureTFCs[tfc].sizeY); else return m; } else { if (ImageF != null) m = ImageF.ExportToStream(); return m; } if (!TextureTFCs[tfc].InCache) { int SizeX = TextureTFCs[tfc].sizeX; int SizeY = TextureTFCs[tfc].sizeY; int Size = (int)TextureTFCs[tfc].size; int Offset = (int)TextureTFCs[tfc].offset; byte[] buff = new byte[Size]; for (int i = 0; i < Size; i++) buff[i] = memory[Offset + i]; ImageF = new ImageFile(buff, T2D.PixelFormat, SizeX, SizeY); } if (T2D.PixelFormat == "PF_DXT1\0" || T2D.PixelFormat == "PF_DXT5\0" || T2D.PixelFormat == "PF_A8R8G8B8\0" || T2D.PixelFormat == "PF_G8\0" || T2D.PixelFormat == "PF_V8U8\0") m = ImageF.ExportToStream(); return m; }
public void ExportToFile(int tfc, string path = "", string cachepath = "") { if (tfc < 0 || tfc >= TextureTFCs.Count) return; if (TextureTFCs[tfc].InCache == true) { TFCFile TFCf = new TFCFile(cachepath); if (TFCf.CheckTFC(TextureTFCs[tfc].offset)) { ImageF = new ImageFile(TFCf.getRawTFCComp(TextureTFCs[tfc].offset), T2D.PixelFormat, TextureTFCs[tfc].sizeX, TextureTFCs[tfc].sizeY); } else return; } else { int SizeX = TextureTFCs[tfc].sizeX; int SizeY = TextureTFCs[tfc].sizeY; int Size = (int)TextureTFCs[tfc].size; int Offset = (int)TextureTFCs[tfc].offset; byte[] buff = new byte[Size]; for (int i = 0; i < Size; i++) buff[i] = memory[Offset + i]; ImageF = new ImageFile(buff, T2D.PixelFormat, SizeX, SizeY); } if (T2D.PixelFormat == "PF_DXT1\0" || T2D.PixelFormat == "PF_DXT5\0" || T2D.PixelFormat == "PF_A8R8G8B8\0" || T2D.PixelFormat == "PF_G8\0" || T2D.PixelFormat == "PF_V8U8\0") ImageF.ExportToFile(path); }
public void ImportFromFile(int tfc) { OpenFileDialog Dialog = new OpenFileDialog(); if (T2D.PixelFormat == "PF_DXT1\0" || T2D.PixelFormat == "PF_DXT5\0") { Dialog.Filter = "DDS Files (*.dds)|*.dds"; } if (T2D.PixelFormat == "PF_G8\0" || T2D.PixelFormat == "PF_V8U8\0" || T2D.PixelFormat == "PF_A8R8G8B8\0") { Dialog.Filter = "TGA Files (*.tga)|*.tga"; } int format = -1; if (T2D.PixelFormat == "PF_DXT1\0") { format = 0; } if (T2D.PixelFormat == "PF_DXT5\0") { format = 1; } if (T2D.PixelFormat == "PF_V8U8\0") { format = 2; } if (T2D.PixelFormat == "PF_A8R8G8B8\0") { format = 3; } if (T2D.PixelFormat == "PF_G8\0") { format = 4; } if (!TextureTFCs[tfc].InCache) { if (Dialog.ShowDialog() == DialogResult.OK) { if (format == 0 || format == 1) { ImageFile t = new ImageFile(); t.ImportFromFile(Dialog.FileName); if (t.ImageSizeX == TextureTFCs[tfc].sizeX && t.ImageSizeY == TextureTFCs[tfc].sizeY && t.ImageFormat == format && t.memsize == TextureTFCs[tfc].size) { for (int i = 0; i < t.memsize; i++) { memory[TextureTFCs[tfc].offset + i] = t.memory[i]; } MessageBox.Show("Done."); } } if (format > 1 && format < 5) { ImageFile t = new ImageFile(); t.ImportFromFile(Dialog.FileName); if (t.ImageSizeX == TextureTFCs[tfc].sizeX && t.ImageSizeY == TextureTFCs[tfc].sizeY) { if (t.ImageBits != 32) { MessageBox.Show("Please use 32 bit Targa image!"); } else { switch (format) { case 2: for (int i = 0; i < t.memsize / 4; i++) { memory[TextureTFCs[tfc].offset + i * 2] = t.memory[i * 4]; memory[TextureTFCs[tfc].offset + i * 2 + 1] = t.memory[i * 4 + 2]; } break; case 3: for (int i = 0; i < t.memsize; i++) { memory[TextureTFCs[tfc].offset + i] = t.memory[i]; } break; case 4: for (int i = 0; i < t.memsize / 4; i++) { memory[TextureTFCs[tfc].offset + i] = t.memory[i * 4]; } break; } MessageBox.Show("Done."); } } } } } else if (Dialog.ShowDialog() == DialogResult.OK) { ImageFile t = new ImageFile(); t.ImportFromFile(Dialog.FileName); if ((format == 0 || format == 1) && t.ImageFormat == format) { if (t.ImageSizeX == TextureTFCs[tfc].sizeX && t.ImageSizeY == TextureTFCs[tfc].sizeY) { TFCFile TFCf = new TFCFile(T2D.Tsource); byte[] buff; if (TFCf.isTFCCompressed()) { buff = ZBlock.Compress(t.memory); } else { buff = t.memory; } byte[] buff2 = BitConverter.GetBytes(TFCf.getFileSize()); for (int i = 0; i < 4; i++) { memory[TextureTFCs[tfc].HeaderOffset + 20 + i] = buff2[i]; } buff2 = BitConverter.GetBytes(buff.Length); for (int i = 0; i < 4; i++) { memory[TextureTFCs[tfc].HeaderOffset + 16 + i] = buff2[i]; } TFCf.AppendToTFC(buff); int size = TFCf.getFileSize(); if (size != -1) { TOCeditor tc = new TOCeditor(); if (!tc.UpdateFile(T2D.Tsource + ".tfc", (uint)size)) { MessageBox.Show("Didn't found Entry"); } tc.Close(); } } else { System.Windows.Forms.DialogResult m = MessageBox.Show("The size doesn't match, import anyway?", "ME3 Explorer", MessageBoxButtons.YesNo); if (m == DialogResult.Yes) { TFCFile TFCf = new TFCFile(T2D.Tsource); byte[] buff; if (TFCf.isTFCCompressed()) { buff = ZBlock.Compress(t.memory); } else { buff = t.memory; } byte[] buff2 = BitConverter.GetBytes(TFCf.getFileSize()); for (int i = 0; i < 4; i++) { memory[TextureTFCs[tfc].HeaderOffset + 20 + i] = buff2[i]; } buff2 = BitConverter.GetBytes(buff.Length); for (int i = 0; i < 4; i++) { memory[TextureTFCs[tfc].HeaderOffset + 16 + i] = buff2[i]; } if (tfc == 0) { buff2 = BitConverter.GetBytes(t.ImageSizeX); for (int i = 0; i < 4; i++) { memory[T2D.offSizeX + i] = buff2[i]; } buff2 = BitConverter.GetBytes(t.ImageSizeY); for (int i = 0; i < 4; i++) { memory[T2D.offSizeY + i] = buff2[i]; } } else { buff2 = BitConverter.GetBytes(t.ImageSizeX * 2); for (int i = 0; i < 4; i++) { memory[TextureTFCs[tfc].HeaderOffset + i] = buff2[i]; } buff2 = BitConverter.GetBytes(t.ImageSizeY * 2); for (int i = 0; i < 4; i++) { memory[TextureTFCs[tfc].HeaderOffset + 4 + i] = buff2[i]; } TFCf.AppendToTFC(buff); } TFCf.AppendToTFC(buff); int size = TFCf.getFileSize(); if (size != -1) { TOCeditor tc = new TOCeditor(); if (!tc.UpdateFile(T2D.Tsource + ".tfc", (uint)size)) { MessageBox.Show("Didn't found Entry"); } tc.Close(); } } } } if (format > 1 && format < 5) { if (t.ImageSizeX == TextureTFCs[tfc].sizeX && t.ImageSizeY == TextureTFCs[tfc].sizeY) { if (t.ImageBits != 32) { MessageBox.Show("Please use 32 bit Targa image!"); } else { byte[] buf = new byte[0]; switch (format) { case 2: buf = new byte[t.memsize / 2]; for (int i = 0; i < t.memsize / 4; i++) { buf[i * 2] = t.memory[i * 4]; buf[i * 2 + 1] = t.memory[i * 4 + 2]; } break; case 3: buf = t.memory; break; case 4: buf = new byte[t.memsize / 4]; for (int i = 0; i < t.memsize / 4; i++) { buf[i] = t.memory[i * 4]; } break; } TFCFile TFCf = new TFCFile(T2D.Tsource); byte[] buff; if (TFCf.isTFCCompressed()) { buff = ZBlock.Compress(t.memory); } else { buff = t.memory; } byte[] buff2 = BitConverter.GetBytes(TFCf.getFileSize()); for (int i = 0; i < 4; i++) { memory[TextureTFCs[tfc].HeaderOffset + 20 + i] = buff2[i]; } buff2 = BitConverter.GetBytes(buff.Length); for (int i = 0; i < 4; i++) { memory[TextureTFCs[tfc].HeaderOffset + 12 + i] = buff2[i]; } TFCf.AppendToTFC(buff); int size = TFCf.getFileSize(); if (size != -1) { TOCeditor tc = new TOCeditor(); if (!tc.UpdateFile(T2D.Tsource + ".tfc", (uint)size)) { MessageBox.Show("Didn't found Entry"); } tc.Close(); } MessageBox.Show("Done."); } } } } }