Mercurial > repos > RelicTools > RelicTools
diff RSHFile.cs @ 0:82db9430c2e4 default tip
Initial commit under GPLv3
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sat, 06 Oct 2018 19:49:25 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RSHFile.cs Sat Oct 06 19:49:25 2018 +0100 @@ -0,0 +1,491 @@ +// This file is a part of the Relic Tools and is copyright 2006-2018 IBBoard. +// +// The file and the library/program it is in are licensed under the GNU GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license. +using System; +using System.IO; +using IBBoard.Relic.RelicTools.Exceptions; +using IBBoard.Relic.RelicTools.Collections; + +namespace IBBoard.Relic.RelicTools +{ + /// <summary> + /// Summary description for WTPFile. + /// </summary> + public class RSHFile:RelicChunkyFile + { + public enum ShaderLayers {None=1, SpecMap=2, SelfIllum=4, Opacity = 8} + + public RSHFile(string filename, ChunkyStructureCollection col): base(filename, col){} + + public RSHFile(string filename, ChunkyFolder folder): base(filename, folder){} + + public RSHFile(string filename, ChunkyCollection col): base(filename, col){} + + public ChunkyFolder GetBaseImageFolder() + { + return (ChunkyFolder)((ChunkyFolder)this.ChunkyStructures[0].RootChunks[0]).Children[0]; + } + + public ChunkyDataCHAN GetBaseImageDataCHAN() + { + return (ChunkyDataCHAN)GetSHDRFolder().Children[1]; + } + + public ChunkyFolder GetSHDRFolder() + { + ChunkyCollection col = ((ChunkyFolder)this.ChunkyStructures[0].RootChunks[0]).Children; + return (ChunkyFolder)col[col.Count-1]; + } + + public void SaveParts(DirectoryInfo destination) + { + string filenamebase = filename.Substring(0, filename.LastIndexOf('.')); + + saveFolder((ChunkyFolder)this.ChunkyStructures[0].RootChunks[0], destination, filenamebase); + } + + private void saveFolder(ChunkyFolder folder, DirectoryInfo destination, string filenamebase) + { + int children = folder.Children.Count; + ChunkyChunk chunk = null; + + for (int i = 0; i<children; i++) + { + chunk = folder.Children[i]; + + if (chunk is ChunkyFolder) + { + this.saveFolder((ChunkyFolder)chunk, destination, filenamebase); + } + else if (chunk is ChunkyDataDATAIMAG) + { + ((ChunkyDataDATAIMAG)chunk).Save(destination, folder.Parent.Name.Substring(folder.Parent.Name.LastIndexOf('/')+1)); + } + } + } + + public static RSHFile Create(string filepath) + { + return Create(new string[]{filepath, "", "", "", "", ""}, filepath); + } + + public static RSHFile Create(string[] filepaths, string mainfilepath) + { + if (filepaths.Length!=6) + { + throw new InvalidOperationException("RSH file must contain six file path entries"); + } + + string baseFileName = mainfilepath.Substring(mainfilepath.LastIndexOf(Path.DirectorySeparatorChar)+1); + string baseFileNameLower = baseFileName.ToLower(); + + string directory = ""; + + if (mainfilepath.IndexOf(Path.DirectorySeparatorChar)!=-1) + { + directory = mainfilepath.Substring(0, mainfilepath.LastIndexOf(Path.DirectorySeparatorChar))+Path.DirectorySeparatorChar; + } + + if(baseFileNameLower.EndsWith(".dds")) + { + baseFileName = baseFileName.Substring(0, baseFileName.Length-4); + } + else + { + throw new InvalidFileException("File specified cannot be converted to a RSH file"); + } + + string texturePath = ""; + + DirectoryInfo dir = new DirectoryInfo(directory); + + while(dir.Parent!=null) + { + texturePath = dir.Name+"/"+texturePath; + + if (dir.Name.ToLower()!="art") + { + dir = dir.Parent; + } + else + { + break; + } + } + + if (dir.Parent==null) + { + throw new InvalidFileException("RSH Files must be built within the 'data\\art' path to ensure correct WTP loading"); + } + + ChunkyDataDATA defaultData = null; + ChunkyData attr = null; + byte [] data; + + int width = 0; + int height = 0; + int mipmaps = 0; + int size = 0; + byte type; + byte byte1; + FileInfo file; + BinaryReader br; + ChunkyFolder defaultFolder; + ChunkyData head; + ChunkyFolder txtr; + string filename; + string mainTexturePath = texturePath+baseFileName; + string[] texturePaths = new string[filepaths.Length]; + + int layers = 0; + + if (filepaths[1]!="" && filepaths[1]!=null && filepaths[2]!="" && filepaths[2]!=null) + { + layers = (int)ShaderLayers.SpecMap; + } + + if (filepaths[3]!="" && filepaths[3]!=null) + { + layers+= (int)ShaderLayers.SelfIllum; + } + + if (filepaths[4]!="" && filepaths[4]!=null) + { + layers+= (int)ShaderLayers.Opacity; + } + + ChunkyFolder shrf = new ChunkyFolder("SHRF", 1, mainTexturePath); + + CompilationEvent("Compiling RSH Texture..."); + + for (int i = 0; i<filepaths.Length; i++) + { + if (filepaths[i]=="" || filepaths[i]==null) + { + continue; + } + + filename = filepaths[i].Substring(filepaths[i].LastIndexOf(Path.DirectorySeparatorChar)+1); + filename = filename.Substring(0, filename.Length-4); + + if (File.Exists(filepaths[i])) + { + CompilationEvent("Reading "+filename+".dds"); + file = new FileInfo(directory+filename+".dds"); + br = new BinaryReader(file.OpenRead()); + br.BaseStream.Seek(0, SeekOrigin.Begin); + data = br.ReadBytes((int)file.Length); + + defaultData = ChunkyDataDATAIMAG.CreateFromDDS(2, "", data); + + br.BaseStream.Seek(12,SeekOrigin.Begin); + height = br.ReadInt32(); + width = br.ReadInt32(); + size = br.ReadInt32(); + br.BaseStream.Seek(4, SeekOrigin.Current); + mipmaps = br.ReadInt32(); + br.BaseStream.Seek(87, SeekOrigin.Begin); + type = br.ReadByte(); + br.Close(); + + if ((char)type=='1') + { + type = 0x8; + byte1 = 0x5; + } + else if ((char)type == '3') + { + type = 0xA; + byte1 = 0x6; + } + else if ((char)type == '5') + { + type = 0xB; + byte1 = 0x7; + } + else + { + throw new RelicTools.Exceptions.FileNotFoundException("RSH files must be made from DXT1, DXT3 or DXT5 DDS files"); + } + + data = new byte[]{type, 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), (byte)mipmaps, (byte)(mipmaps>>8), (byte)(mipmaps>>16), (byte)(mipmaps>>24)}; + attr = new ChunkyDataUnknown("ATTR", 2, "", data); + } + else + { + throw new RelicTools.Exceptions.FileNotFoundException("RSH files must be made from a DDS file"); + } + + defaultFolder = new ChunkyFolder("IMAG", 1, ""); + + defaultFolder.Children.Add(attr); + defaultFolder.Children.Add(defaultData); + + head = new ChunkyDataUnknown("HEAD", 1, "", new byte[]{byte1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00}); + + texturePaths[i] = texturePath+filename; + txtr = new ChunkyFolder("TXTR", 1, texturePath+filename); + txtr.Children.Add(head); + txtr.Children.Add(defaultFolder); + shrf.Children.Add(txtr); + } + + CompilationEvent("Compiling Texture Shaders"); + + ChunkyDataINFO info = new ChunkyDataINFOGeneric(1, "", new byte[]{0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, (byte)((layers<=1)?0xcc:0xcd), 0xcc, 0xcc, 0x3d, 0x01, 0x00, 0x00, 0x00, 0x00 }); + + data = new byte[156+mainTexturePath.Length]; + data[0] = 0x00; + data[1] = 0x00; + data[2] = 0x00; + data[3] = 0x00; + data[4] = 0x01; + data[5] = 0x00; + data[6] = 0x00; + data[7] = 0x00; + + if (layers<=1) + { + data[8] = 0x96; + data[9] = 0x96; + data[10] = 0x96; + data[11] = 0xff; + } + else + { + data[8] = 0x0; + data[9] = 0x0; + data[10] = 0x0; + data[11] = 0xff; + } + + data[12] = (byte)mainTexturePath.Length; + data[13] = (byte)(mainTexturePath.Length>>8); + data[14] = (byte)(mainTexturePath.Length>>16); + data[15] = (byte)(mainTexturePath.Length>>24); + + System.Text.ASCIIEncoding.ASCII.GetBytes(mainTexturePath).CopyTo(data, 16); + byte[] temp = new byte[]{0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f}; + temp.CopyTo(data, 16+mainTexturePath.Length); + + ChunkyData chan0 = new ChunkyDataUnknown("CHAN", 3, "", data); + + ChunkyData chan1, chan2, chan3, chan4, chan5; + + //fill out the defaults + if ((layers & (int)ShaderLayers.SpecMap)!=(int)ShaderLayers.SpecMap) + { + //they're not using a spec map + data = new byte[]{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte)((layers<=1)?0xe5:0x00), (byte)((layers<=1)?0xe5:0x00), (byte)((layers<=1)?0xe5:0x00), 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f}; + chan1 = new ChunkyDataUnknown("CHAN", 3, "", data); + + data = new byte[]{0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f}; + chan2 = new ChunkyDataUnknown("CHAN", 3, "", data); + } + else + { + //they are using a spec map + data = new byte[156+texturePaths[1].Length]; + data[0] = 0x01;//ID + data[1] = 0x00; + data[2] = 0x00; + data[3] = 0x00; + data[4] = 0x01;//format - 1 = Texture, 2 = Add, 3 = Blend, 4+ = blank + data[5] = 0x00; + data[6] = 0x00; + data[7] = 0x00; + data[8] = 0x00; + data[9] = 0x00; + data[10] = 0x00; + data[11] = 0xff; + data[12] = (byte)texturePaths[1].Length; + data[13] = (byte)(texturePaths[1].Length>>8); + data[14] = (byte)(texturePaths[1].Length>>16); + data[15] = (byte)(texturePaths[1].Length>>24); + + System.Text.ASCIIEncoding.ASCII.GetBytes(texturePaths[1]).CopyTo(data, 16); + temp = new byte[]{0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f}; + temp.CopyTo(data, 16+texturePaths[1].Length); + chan1 = new ChunkyDataUnknown("CHAN", 3, "", data); + + data = new byte[156+texturePaths[2].Length]; + data[0] = 0x02; + data[1] = 0x00; + data[2] = 0x00; + data[3] = 0x00; + data[4] = 0x01; + data[5] = 0x00; + data[6] = 0x00; + data[7] = 0x00; + data[8] = 0x00; + data[9] = 0x00; + data[10] = 0x00; + data[11] = 0xff; + data[12] = (byte)texturePaths[2].Length; + data[13] = (byte)(texturePaths[2].Length>>8); + data[14] = (byte)(texturePaths[2].Length>>16); + data[15] = (byte)(texturePaths[2].Length>>24); + + System.Text.ASCIIEncoding.ASCII.GetBytes(texturePaths[2]).CopyTo(data, 16); + temp = new byte[]{0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f}; + temp.CopyTo(data, 16+texturePaths[2].Length); + chan2 = new ChunkyDataUnknown("CHAN", 3, "", data); + } + + + if ((layers & (int)ShaderLayers.SelfIllum)!=(int)ShaderLayers.SelfIllum) + { + data = new byte[]{0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f}; + } + else + { + data = new byte[156+texturePaths[3].Length]; + data[0] = 0x03; + data[1] = 0x00; + data[2] = 0x00; + data[3] = 0x00; + data[4] = 0x01; + data[5] = 0x00; + data[6] = 0x00; + data[7] = 0x00; + data[8] = 0x00; + data[9] = 0x00; + data[10] = 0x00; + data[11] = 0xff; + data[12] = (byte)texturePaths[3].Length; + data[13] = (byte)(texturePaths[3].Length>>8); + data[14] = (byte)(texturePaths[3].Length>>16); + data[15] = (byte)(texturePaths[3].Length>>24); + + System.Text.ASCIIEncoding.ASCII.GetBytes(texturePaths[3]).CopyTo(data, 16); + temp = new byte[]{0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f}; + temp.CopyTo(data, 16+texturePaths[3].Length); + } + chan3 = new ChunkyDataUnknown("CHAN", 3, "", data); + + if ((layers & (int)ShaderLayers.Opacity)!=(int)ShaderLayers.Opacity) + { + data = new byte[]{0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f}; + } + else + { + data = new byte[156+texturePaths[4].Length]; + data[0] = 0x04; + data[1] = 0x00; + data[2] = 0x00; + data[3] = 0x00; + data[4] = 0x01; + data[5] = 0x00; + data[6] = 0x00; + data[7] = 0x00; + data[8] = 0x00;//0x00; + data[9] = 0x00;//0x00; + data[10] = 0x00;//0x00; + data[11] = 0xff; + data[12] = (byte)texturePaths[4].Length; + data[13] = (byte)(texturePaths[4].Length>>8); + data[14] = (byte)(texturePaths[4].Length>>16); + data[15] = (byte)(texturePaths[4].Length>>24); + + System.Text.ASCIIEncoding.ASCII.GetBytes(texturePaths[4]).CopyTo(data, 16); + temp = new byte[]{0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f}; + temp.CopyTo(data, 16+texturePaths[4].Length); + } + chan4 = new ChunkyDataUnknown("CHAN", 3, "", data); + + //if (filepaths.Length<6) + //{ + data = new byte[]{0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f}; + /*} + else + { + data = new byte[156+texturePaths[1].Length]; + data[0] = 0x05; + data[1] = 0x00; + data[2] = 0x00; + data[3] = 0x00; + data[4] = 0x01; + data[5] = 0x00; + data[6] = 0x00; + data[7] = 0x00; + data[8] = 0x00; + data[9] = 0x00; + data[10] = 0x00; + data[11] = 0xff; + data[12] = (byte)texturePaths[1].Length; + data[13] = (byte)(texturePaths[1].Length>>8); + data[14] = (byte)(texturePaths[1].Length>>16); + data[15] = (byte)(texturePaths[1].Length>>24); + + System.Text.ASCIIEncoding.ASCII.GetBytes(texturePaths[1]).CopyTo(data, 16); + temp = new byte[]{0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f}; + temp.CopyTo(data, 16+texturePaths[1].Length); + }*/ + chan5 = new ChunkyDataUnknown("CHAN", 3, "", data); + + + ChunkyFolder shdr = new ChunkyFolder("SHDR", 1, mainTexturePath); + shdr.Children.Add(info); + shdr.Children.Add(chan0); + shdr.Children.Add(chan1); + shdr.Children.Add(chan2); + shdr.Children.Add(chan3); + shdr.Children.Add(chan4); + shdr.Children.Add(chan5); + + + CompilationEvent("Compiling RSH File"); + + shrf.Children.Add(shdr); + + return new RSHFile(baseFileName+".rsh", shrf);//new ChunkyStructureCollection(new RelicChunkyStructure( + + //RelicChunkyFile.SaveChunky(directory+baseFileName+".rsh", shrf.GetBytes()); + } + } +} \ No newline at end of file