public void SaveCompositeTGA(DirectoryInfo destination, LayerCollection colours, string badgePath, string bannerPath) { byte[] tga = this.CreateCompositeTGABytes(colours, badgePath, bannerPath); ChunkyDataATTR attr = findFirstDataAttributes(); ChunkyDataDATAIMAG data = new ChunkyDataDATAIMAG(2, "", tga); data.Attributes = attr; CompilationEvent("Saving compiled TGA"); data.Save(destination, filename.Substring(0, filename.LastIndexOf('_'))); CompilationEvent("Compilation Complete\r\n"); }
public ChunkyFolder(string ID_in, int version_in, string name_in, byte[] innerData) : base(ChunkyChunkType.Folder, ID_in, version_in, name_in) { children = new ChunkyCollection(this); MemoryStream ms = new MemoryStream(innerData, false); BinaryReader br = new BinaryReader(ms); ChunkyChunk chunk = null; ChunkyDataATTR attr = null; ChunkyDataINFOTPAT info = null; int pos = 0; while (pos < innerData.Length) { br.BaseStream.Seek(pos, SeekOrigin.Begin); chunk = RelicChunkReader.ReadChunkyChunk(br.ReadBytes(innerData.Length - pos), ID_in); children.Add(chunk); if (chunk is ChunkyDataATTR) { attr = (ChunkyDataATTR)chunk; } else if (chunk is ChunkyDataINFOTPAT) { info = (ChunkyDataINFOTPAT)chunk; } else if (attr != null && chunk is ChunkyDataDATA) { ((ChunkyDataDATA)chunk).Attributes = attr; } else if (info != null && chunk is ChunkyDataLayer) { ((ChunkyDataLayer)chunk).Info = info; } pos += chunk.Length; } }
private ChunkyDataATTR findFirstDataAttributes() { if (attr == null) { ChunkyFolder root = (ChunkyFolder)this.ChunkyStructures[0].RootChunks[0]; for (int i = 0; i < root.Children.Count; i++) { if (root.Children[i] is ChunkyFolder) { root = (ChunkyFolder)root.Children[i]; break; } } if (root.Children[0] is ChunkyDataATTR) { attr = (ChunkyDataATTR)root.Children[0]; } } return(attr); }
private void FindAttributes(ChunkyFolder folder) { int children = folder.Children.Count; ChunkyChunk chunk = null; ChunkyDataATTR attr = null; for (int i = 0; i < children; i++) { chunk = folder.Children[i]; if (chunk is ChunkyDataATTR) { attr = (ChunkyDataATTR)chunk; width = attr.Width; height = attr.Height; break; } else if (chunk is ChunkyFolder) { FindAttributes((ChunkyFolder)chunk); } } }
public static WTPFile Create(string filepath) { string baseFileName = filepath.Substring(filepath.LastIndexOf(Path.DirectorySeparatorChar) + 1); string baseFileNameLower = baseFileName.ToLower(); string directory = ""; if (filepath.IndexOf(Path.DirectorySeparatorChar) != -1) { directory = filepath.Substring(0, filepath.LastIndexOf(Path.DirectorySeparatorChar)) + Path.DirectorySeparatorChar; } if (baseFileNameLower.EndsWith(".wtp")) { baseFileName = baseFileName.Substring(0, baseFileName.Length - 4); } else if (baseFileNameLower.EndsWith(".tga")) { if (baseFileNameLower.EndsWith("_primary.tga")) { baseFileName = baseFileName.Substring(0, baseFileName.Length - 12); } else if (baseFileNameLower.EndsWith("_secondary.tga")) { baseFileName = baseFileName.Substring(0, baseFileName.Length - 14); } else if (baseFileNameLower.EndsWith("_weapon.tga") || baseFileNameLower.EndsWith("_banner.tga")) { baseFileName = baseFileName.Substring(0, baseFileName.Length - 11); } else if (baseFileNameLower.EndsWith("_badge.tga")) { baseFileName = baseFileName.Substring(0, baseFileName.Length - 10); } else if (baseFileNameLower.EndsWith("_eyes.tga") || baseFileNameLower.EndsWith("_trim.tga") || baseFileNameLower.EndsWith("_dirt.tga")) { baseFileName = baseFileName.Substring(0, baseFileName.Length - 9); } else { baseFileName = baseFileName.Substring(0, baseFileName.Length - 4); } } else { throw new InvalidFileException("File path specified is not valid for a WTP file or one of its components"); } string skinName = baseFileName.Substring(baseFileName.LastIndexOf('_') + 1); //make it forwards compatible on the off-chance Relic introduce multiple textures ChunkyDataDATA defaultData = null; ChunkyData attr = null; FileStream fs = null; BinaryReader br = null; FileInfo file = null; byte [] data; int width = 0; int height = 0; if (File.Exists(directory + baseFileName + ".tga")) { CompilationEvent("Reading " + baseFileName + ".tga"); file = new FileInfo(directory + baseFileName + ".tga"); fs = file.OpenRead(); br = new BinaryReader(fs); br.BaseStream.Seek(12, SeekOrigin.Begin); width = br.ReadInt16(); height = br.ReadInt16(); br.BaseStream.Seek(0, SeekOrigin.Begin); data = br.ReadBytes((int)br.BaseStream.Length); defaultData = ChunkyDataDATAIMAG.CreateFromTGA(2, "", data); br.Close(); data = new byte[] { 0x0, 0x0, 0x0, 0x0, (byte)width, (byte)(width >> 8), (byte)(width >> 16), (byte)(width >> 24), (byte)(height), (byte)(height >> 8), (byte)(height >> 16), (byte)(height >> 24), 0x1, 0x0, 0x0, 0x0 }; attr = new ChunkyDataUnknown("ATTR", 2, "", data); } else { throw new RelicTools.Exceptions.FileNotFoundException("WTP files must have a 32bit layer e.g. _default.tga layer"); } string dirt_name = directory + baseFileName + "_Dirt.tga"; ChunkyFolder defaultFolder = new ChunkyFolder("IMAG", 1, "TOOL:" + dirt_name); defaultFolder.Children.Add(attr); defaultFolder.Children.Add(defaultData); ChunkyDataPTLD primary = null; ChunkyDataPTLD secondary = null; ChunkyDataPTLD trim = null; ChunkyDataPTLD weapon = null; ChunkyDataPTLD eyes = null; ChunkyDataPTLD dirt = null; ChunkyDataPTBD badge = null; ChunkyDataPTBN banner = null; string primaryname = directory + baseFileName + "_Primary.tga"; string secondaryname = directory + baseFileName + "_Secondary.tga"; string trimname = directory + baseFileName + "_Trim.tga"; string weaponname = directory + baseFileName + "_Weapon.tga"; string eyesname = directory + baseFileName + "_Eyes.tga"; string badgename = directory + baseFileName + "_Badge.tga"; string bannername = directory + baseFileName + "_Banner.tga"; //int byteRead = width*height+18;//length of TGA data plus header if (File.Exists(dirt_name)) { CompilationEvent("Reading " + baseFileName + "_Dirt.tga"); file = new FileInfo(dirt_name); fs = file.OpenRead(); br = new BinaryReader(fs); br.BaseStream.Seek(0, SeekOrigin.Begin); data = br.ReadBytes((int)br.BaseStream.Length); br.Close(); dirt = ChunkyDataPTLD.CreateFromTGA(PTLD_Layers.Dirt, 1, "", data); } else { throw new RelicTools.Exceptions.FileNotFoundException("WTP Files must contain a dirt layer"); } data = new byte[8]; data[0] = (byte)(width); data[1] = (byte)(width >> 8); data[2] = (byte)(width >> 16); data[3] = (byte)(width >> 24); data[4] = (byte)(height); data[5] = (byte)(height >> 8); data[6] = (byte)(height >> 16); data[7] = (byte)(height >> 24); ChunkyData info = new ChunkyDataUnknown("INFO", 1, "", data); if (File.Exists(primaryname)) { CompilationEvent("Reading " + baseFileName + "_Primary.tga"); file = new FileInfo(primaryname); fs = file.OpenRead(); br = new BinaryReader(fs); br.BaseStream.Seek(0, SeekOrigin.Begin); data = br.ReadBytes((int)br.BaseStream.Length); br.Close(); primary = ChunkyDataPTLD.CreateFromTGA(PTLD_Layers.Primary, 1, "", data); if (primary == null) { CompilationEvent("Skipped " + baseFileName + "_Primary.tga - no team colour data"); } } if (File.Exists(secondaryname)) { CompilationEvent("Reading " + baseFileName + "_Secondary.tga"); file = new FileInfo(secondaryname); fs = file.OpenRead(); br = new BinaryReader(fs); br.BaseStream.Seek(0, SeekOrigin.Begin); data = br.ReadBytes((int)br.BaseStream.Length); br.Close(); secondary = ChunkyDataPTLD.CreateFromTGA(PTLD_Layers.Secondary, 1, "", data); if (secondary == null) { CompilationEvent("Skipped " + baseFileName + "_Secondary.tga - no team colour data"); } } if (File.Exists(trimname)) { CompilationEvent("Reading " + baseFileName + "_Trim.tga"); file = new FileInfo(trimname); fs = file.OpenRead(); br = new BinaryReader(fs); br.BaseStream.Seek(0, SeekOrigin.Begin); data = br.ReadBytes((int)br.BaseStream.Length); br.Close(); trim = ChunkyDataPTLD.CreateFromTGA(PTLD_Layers.Trim, 1, "", data); if (trim == null) { CompilationEvent("Skipped " + baseFileName + "_Trim.tga - no team colour data"); } } if (File.Exists(weaponname)) { CompilationEvent("Reading " + baseFileName + "_Weapon.tga"); file = new FileInfo(weaponname); fs = file.OpenRead(); br = new BinaryReader(fs); br.BaseStream.Seek(0, SeekOrigin.Begin); data = br.ReadBytes((int)br.BaseStream.Length); br.Close(); weapon = ChunkyDataPTLD.CreateFromTGA(PTLD_Layers.Weapon, 1, "", data); if (weapon == null) { CompilationEvent("Skipped " + baseFileName + "_Weapon.tga - no team colour data"); } } if (File.Exists(eyesname)) { CompilationEvent("Reading " + baseFileName + "_Eyes.tga"); file = new FileInfo(eyesname); fs = file.OpenRead(); br = new BinaryReader(fs); br.BaseStream.Seek(0, SeekOrigin.Begin); data = br.ReadBytes((int)br.BaseStream.Length); br.Close(); eyes = ChunkyDataPTLD.CreateFromTGA(PTLD_Layers.Eyes, 1, "", data); if (eyes == null) { CompilationEvent("Skipped " + baseFileName + "_Eyes.tga - no team colour data"); } } if (File.Exists(badgename)) { CompilationEvent("Reading " + baseFileName + "_Badge.tga"); file = new FileInfo(badgename); fs = file.OpenRead(); br = new BinaryReader(fs); br.BaseStream.Seek(0, SeekOrigin.Begin); data = br.ReadBytes((int)br.BaseStream.Length); br.Close(); badge = ChunkyDataPTBD.CreateFromTGA(1, "", data); } if (File.Exists(bannername)) { CompilationEvent("Reading " + baseFileName + "_Banner.tga"); file = new FileInfo(bannername); fs = file.OpenRead(); br = new BinaryReader(fs); br.BaseStream.Seek(0, SeekOrigin.Begin); data = br.ReadBytes((int)br.BaseStream.Length); br.Close(); banner = ChunkyDataPTBN.CreateFromTGA(1, "", data); } if (badge != null && banner != null) { if (((badge.Pos_x <= banner.Pos_x && (badge.Pos_x + badge.Width) >= banner.Pos_x) || (badge.Pos_x <= (banner.Pos_x + banner.Width) && (badge.Pos_x + badge.Width) >= (banner.Pos_x + banner.Width))) && ((badge.Pos_y <= banner.Pos_y && (badge.Pos_y + badge.Height) >= banner.Pos_y) || (badge.Pos_y <= (banner.Pos_y + banner.Height) && (badge.Pos_y + badge.Height) >= (banner.Pos_y + banner.Height)))) { throw new InvalidFileException("Badge and banner position overlap"); } } CompilationEvent("Compiling WTP File"); ChunkyFolder tpat = new ChunkyFolder("TPAT", 3, skinName); tpat.Children.Add(info); tpat.Children.Add(primary); tpat.Children.Add(secondary); tpat.Children.Add(trim); tpat.Children.Add(weapon); tpat.Children.Add(eyes); tpat.Children.Add(dirt); tpat.Children.Add(defaultFolder); tpat.Children.Add(banner); tpat.Children.Add(badge); return(new WTPFile(baseFileName + ".wtp", tpat)); //RelicChunkyFile.SaveChunky(directory+baseFileName+".wtp", tpat.GetBytes()); }