using System; using System.Collections.Generic; using System.Linq; using System.Linq; using System.Threading.Tasks; using Toolbox.Library; using FirstPlugin; using System.Windows.Forms; namespace LayoutBXLYT { public class TextureManager : IDisposable { public BxlytHeader LayoutFile; public Dictionary BinaryContainers = new Dictionary(); //The archive to put textures in if necessary public Dictionary ArchiveFile = new Dictionary(); public IArchiveFile ArchiveParent { get { return LayoutFile.FileInfo.IFileInfo.ArchiveParent; } } public PlatformType Platform = PlatformType.WiiU; public enum PlatformType { WiiU, //bflim ThreeDS, //bclim and bflim DS, // Gamecube, //bti Switch, //bntx Wii, //TPL } public STGenericTexture EditTexture(string name) { STGenericTexture texture = null; switch (Platform) { case PlatformType.Switch: { foreach (var bntx in BinaryContainers.Values) { Console.WriteLine("bntx " + name + " " + bntx.Textures.ContainsKey(name)); if (bntx.Textures.ContainsKey(name)) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = bntx.Textures[name].ReplaceFilter; if (ofd.ShowDialog() == DialogResult.OK) { bntx.Textures[name].Replace(ofd.FileName); return bntx.Textures[name]; } } } } break; case PlatformType.WiiU: { if (ArchiveParent == null) return null; foreach (var file in ArchiveParent.Files) { if (file.FileName == name) { var fileFormat = file.FileFormat; if (fileFormat == null) fileFormat = file.OpenFile(); if (fileFormat is BFLIM) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = ((BFLIM)fileFormat).ReplaceFilter; ofd.FileName = name; if (ofd.ShowDialog() == DialogResult.OK) { ((BFLIM)fileFormat).Replace(ofd.FileName); ((BFLIM)fileFormat).Text = name; return (BFLIM)fileFormat; } } } } } break; } return texture; } public void RemoveTextures(List textures) { foreach (var tex in textures) RemoveTexture(tex); } public void RemoveTexture(STGenericTexture texture) { switch (Platform) { case PlatformType.WiiU: { var archive = ArchiveParent; if (archive == null) return; ArchiveFileInfo fileInfoDelete = null; foreach (var file in archive.Files) { if (file.FileName.Contains(texture.Text)) fileInfoDelete = file; } if (fileInfoDelete != null) archive.DeleteFile(fileInfoDelete); } break; case PlatformType.Switch: { foreach (var bntx in BinaryContainers.Values) { if (bntx.Textures.ContainsKey(texture.Text)) bntx.RemoveTexture(bntx.Textures[texture.Text]); } } break; } } public List AddTextures() { List textures = new List(); switch (Platform) { case PlatformType.WiiU: { var archive = ArchiveParent; if (archive == null) return null; var matches = archive.Files.Where(p => p.FileName.Contains("bflim")).ToList(); string textureFolder = "timg"; if (matches.Count > 0) textureFolder = System.IO.Path.GetDirectoryName(matches[0].FileName); var bflim = BFLIM.CreateNewFromImage(); if (bflim == null) return textures; textures.Add(bflim); var mem = new System.IO.MemoryStream(); bflim.Save(mem); archive.AddFile(new ArchiveFileInfo() { FileData = mem.ToArray(), FileName = System.IO.Path.Combine(textureFolder, bflim.Text).Replace('\\','/'), }); } break; case PlatformType.Switch: { BNTX bntx = null; if (BinaryContainers.Count == 0) { //Create a new one if none exist //Method for saving these will come in the save dialog bntx = new BNTX(); bntx.IFileInfo = new IFileInfo(); bntx.FileName = "textures"; bntx.Load(new System.IO.MemoryStream(BNTX.CreateNewBNTX("textures"))); BinaryContainers.Add("textures", bntx); } else { //Use first container for now as archives only use one bntx = BinaryContainers.Values.FirstOrDefault(); } int startIndex = bntx.Textures.Count; bntx.ImportTexture(); //Load all the additional textues for (int i = 0; i < bntx.Textures.Count; i++) { if (i > startIndex - 1) textures.Add(bntx.Textures.Values.ElementAt(i)); } } break; } return textures; } public void Dispose() { BinaryContainers.Clear(); ArchiveFile.Clear(); } } }