public void Save(System.IO.Stream stream) { using (FileWriter writer = new FileWriter(stream, true)) { writer.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian; header.Write(writer); uint surfBlockType; uint dataBlockType; uint mipBlockType; if (header.MajorVersion == 6 && header.MinorVersion == 0) { surfBlockType = 0x0A; dataBlockType = 0x0B; mipBlockType = 0x0C; } else if (header.MajorVersion == 6 || header.MajorVersion == 7) { surfBlockType = 0x0B; dataBlockType = 0x0C; mipBlockType = 0x0D; } else { throw new Exception($"Unsupported GTX version {header.MajorVersion}"); } int imageInfoIndex = -1; int imageBlockIndex = -1; int imageMipBlockIndex = -1; writer.Seek(header.HeaderSize, System.IO.SeekOrigin.Begin); foreach (var block in blocks) { if ((uint)block.BlockType == surfBlockType) { imageInfoIndex++; imageBlockIndex++; imageMipBlockIndex++; block.data = textures[imageInfoIndex].surface.Write(); block.Write(writer); } else if ((uint)block.BlockType == dataBlockType) { var tex = textures[imageBlockIndex]; var pos = writer.Position; uint Alignment = tex.surface.alignment; //Create alignment block first uint dataAlignment = GetAlignBlockSize((uint)pos + 32, Alignment); GTXDataBlock dataAlignBlock = new GTXDataBlock(BlockType.AlignData, dataAlignment, 0, 0); dataAlignBlock.Write(writer); block.data = tex.surface.data; block.Write(writer); } else if ((uint)block.BlockType == mipBlockType) { var tex = textures[imageMipBlockIndex]; var pos = writer.Position; uint Alignment = tex.surface.alignment; //Create alignment block first uint dataAlignment = GetAlignBlockSize((uint)pos + 32, Alignment); GTXDataBlock dataAlignBlock = new GTXDataBlock(BlockType.AlignData, dataAlignment, 0, 0); dataAlignBlock.Write(writer); if (tex.surface.mipData == null || tex.surface.mipData.Length <= 0) { throw new Exception("Invalid mip data!"); } block.data = tex.surface.mipData; block.Write(writer); } else if (block.BlockType != BlockType.AlignData) { block.Write(writer); } } } }
public byte[] Save() { //Get each block type for saving except alignment // var TextureInfoBlocks = blocks.Where(i => i.BlockType == BlockType.ImageInfo); // var TextureDataBlocks = blocks.Where(i => i.BlockType == BlockType.ImageData); // var TextureMipDataBlocks = blocks.Where(i => i.BlockType == BlockType.MipData); System.IO.MemoryStream mem = new System.IO.MemoryStream(); using (FileWriter writer = new FileWriter(mem)) { writer.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian; header.Write(writer); uint surfBlockType; uint dataBlockType; uint mipBlockType; if (header.MajorVersion == 6 && header.MinorVersion == 0) { surfBlockType = 0x0A; dataBlockType = 0x0B; mipBlockType = 0x0C; } else if (header.MajorVersion == 6 || header.MajorVersion == 7) { surfBlockType = 0x0B; dataBlockType = 0x0C; mipBlockType = 0x0D; } else { throw new Exception($"Unsupported GTX version {header.MajorVersion}"); } int imageInfoIndex = -1; int imageBlockIndex = -1; int imageMipBlockIndex = -1; writer.Seek(header.HeaderSize, System.IO.SeekOrigin.Begin); foreach (var block in blocks) { if ((uint)block.BlockType == surfBlockType) { imageInfoIndex++; imageBlockIndex++; imageMipBlockIndex++; block.data = textures[imageInfoIndex].surface.Write(); block.Write(writer); } else if ((uint)block.BlockType == dataBlockType) { var tex = textures[imageBlockIndex]; var pos = writer.Position; uint Alignment = tex.surface.alignment; //Create alignment block first uint dataAlignment = GetAlignBlockSize((uint)pos + 32, Alignment); GTXDataBlock dataAlignBlock = new GTXDataBlock(BlockType.AlignData, dataAlignment, 0, 0); dataAlignBlock.Write(writer); block.data = tex.surface.data; block.Write(writer); } else if ((uint)block.BlockType == mipBlockType) { var tex = textures[imageMipBlockIndex]; var pos = writer.Position; uint Alignment = tex.surface.alignment; //Create alignment block first uint dataAlignment = GetAlignBlockSize((uint)pos + 32, Alignment); GTXDataBlock dataAlignBlock = new GTXDataBlock(BlockType.AlignData, dataAlignment, 0, 0); dataAlignBlock.Write(writer); if (tex.surface.mipData == null || tex.surface.mipData.Length <= 0) { throw new Exception("Invalid mip data!"); } block.data = tex.surface.mipData; block.Write(writer); } else if (block.BlockType != BlockType.AlignData) { block.Write(writer); } } } return(mem.ToArray()); }