Exemplo n.º 1
0
        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());
        }
Exemplo n.º 2
0
        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];
        }