public override byte[] ToRaw() { if (SaveTextureType != PsuTextureType.Raster) { throw new InvalidOperationException("Can't save DXT textures yet"); } int width = mips[0].Width; int height = mips[0].Height; XvrImageParameters parameters = new XvrImageParameters(width, height, SaveTextureType, mips.Length > 1, SavePixelFormat); //Let's try just leaving the file start blank? I don't think this actually works... byte[] imageData = XvrRasterEncoders.GetEncoder(parameters).EncodeImage(mips, parameters); MemoryStream headerStream = new MemoryStream(); BinaryWriter headerWriter = new BinaryWriter(headerStream); headerWriter.Write(Encoding.ASCII.GetBytes(superFormat)); headerWriter.Write(globalIndex); headerWriter.Write(unknown1); headerWriter.Write((int)0); headerWriter.Write(Encoding.ASCII.GetBytes(subFormat)); headerWriter.Write((int)imageData.Length + 8); headerWriter.Write(parameters.pixelFormat); headerWriter.Write(parameters.pixelFlags); headerWriter.Write((short)0); headerWriter.Write((short)width); headerWriter.Write((short)height); header = headerStream.ToArray(); MemoryStream outStream = new MemoryStream(); BinaryWriter outWriter = new BinaryWriter(outStream); outWriter.Write((short)1); outWriter.Write((short)0x84); outWriter.Write((int)0); outWriter.Write((int)0); outWriter.Write((short)0x2A); //I don't know what this is! short dimensionsMips = 0; dimensionsMips |= (short)mips.Length; byte widthPower = logTwo(width); //Make sure make sure MAKE SURE dimensions are a power of 2! byte heightPower = logTwo(height); dimensionsMips |= (short)(widthPower << 8); dimensionsMips |= (short)(heightPower << 4); outWriter.Write(dimensionsMips); outWriter.Write((int)0); outWriter.Write(1); outWriter.Write((int)0); outWriter.Write((int)imageData.Length); outWriter.Write(imageData); return(outStream.ToArray()); }
void parseData() { MemoryStream imageStream = new MemoryStream(rawData); BinaryReader imageReader = new BinaryReader(imageStream); string superFormat = new string(ASCIIEncoding.ASCII.GetChars(header, 0, 4)); int globalIndex = BitConverter.ToInt32(header, 4); unknown1 = BitConverter.ToInt32(header, 8); subFormat = new string(ASCIIEncoding.ASCII.GetChars(header, 0x10, 4)); if (subFormat != "PVRT") { throw new Exception("Invalid format"); } //ignoring "filesize" value; if it's not accurate, TOO BAD XvrImageParameters imageParams = new XvrImageParameters(header, rawData); textureFormat = imageParams.getFormatString(); OriginalPixelFormat = imageParams.PixelFormat; OriginalTextureType = imageParams.TextureType; SavePixelFormat = imageParams.PixelFormat; SaveTextureType = imageParams.TextureType; mips = XvrRasterDecoders.GetDecoder(imageParams).DecodeImage(rawData, imageParams, imageParams.HasMips); mipDirty = new bool[mips.Length]; }