public void Deserialize(IUnrealStream stream) { if (stream.Version >= 63) { // Offset to (Width = ...) WidthOffset = stream.ReadUInt32(); long opos = stream.Position; stream.Seek(WidthOffset, System.IO.SeekOrigin.Begin); Width = stream.ReadUInt32(); Height = stream.ReadUInt32(); stream.Seek(opos, System.IO.SeekOrigin.Begin); } int mipMapSize = stream.ReadIndex(); Pixels = new int[mipMapSize]; switch (Owner._Format.Decompile().Substring(6)) { case "TEXF_RGBA8": case "5": for (int i = 0; i < mipMapSize; ++i) { Pixels[i] = stream.ReadInt32(); } break; case "TEXF_DXT1": case "3": for (int i = 0; i < mipMapSize / 2; ++i) { byte c = stream.ReadByte(); Pixels[i++] = c & 0xF0; Pixels[i] = c & 0x0F; } // PostProcess: // 4x4 4bit per pixel, 16bit per color: 5bits red; 6bits green; 5bits blue. // break; } // Width, Height. See above! stream.Skip(8); BitsWidth = stream.ReadByte(); BitsHeight = stream.ReadByte(); }
public void Deserialize( IUnrealStream stream ) { if( stream.Version >= 63 ) { // Offset to (Width = ...) WidthOffset = stream.ReadUInt32(); long opos = stream.Position; stream.Seek( WidthOffset, System.IO.SeekOrigin.Begin ); Width = stream.ReadUInt32(); Height = stream.ReadUInt32(); stream.Seek( opos, System.IO.SeekOrigin.Begin ); } int mipMapSize = stream.ReadIndex(); Pixels = new int[mipMapSize]; switch( Owner._Format.Decompile().Substring( 6 ) ) { case "TEXF_RGBA8": case "5": for( int i = 0; i < mipMapSize; ++ i ) { Pixels[i] = stream.ReadInt32(); } break; case "TEXF_DXT1": case "3": for( int i = 0; i < mipMapSize / 2; ++ i ) { byte c = stream.ReadByte(); Pixels[i ++] = c & 0xF0; Pixels[i] = c & 0x0F; } // PostProcess: // 4x4 4bit per pixel, 16bit per color: 5bits red; 6bits green; 5bits blue. // break; } // Width, Height. See above! stream.Skip( 8 ); BitsWidth = stream.ReadByte(); BitsHeight = stream.ReadByte(); }
public string GetData(int offset, int count) { if (_UnrealStream == null) { return(""); } byte[] bytes = new byte[count]; var prePosition = _UnrealStream.Position; _UnrealStream.Seek(offset, SeekOrigin.Begin); _UnrealStream.Read(bytes, 0, count); _UnrealStream.Position = prePosition; _UnrealStream.Seek(prePosition, SeekOrigin.Begin); if (_UnrealStream.BigEndianCode) { Array.Reverse(bytes); } return(BitConverter.ToString(bytes)); }
public void Deserialize(IUnrealStream stream) { if (stream.ReadUInt32() != Signature) { throw new System.IO.FileLoadException(stream + " isn't a UnrealMod file!"); } Summary = new FileSummary(); Summary.Deserialize(stream); stream.Seek(Summary.FileTableOffset, System.IO.SeekOrigin.Begin); FileTableList = new UArray <FileTable>(stream); }
public void Deserialize( IUnrealStream stream ) { if( stream.ReadUInt32() != Signature ) { throw new System.IO.FileLoadException( stream + " isn't a UnrealMod file!" ); } Summary = new FileSummary(); Summary.Deserialize( stream ); stream.Seek( Summary.FileTableOffset, System.IO.SeekOrigin.Begin ); FileTableList = new UArray<FileTable>( stream ); }
public void Serialize( IUnrealStream stream ) { // Serialize tables var namesBuffer = new UObjectStream( stream ); foreach( var name in Names ) { name.Serialize( namesBuffer ); } var importsBuffer = new UObjectStream( stream ); foreach( var import in Imports ) { import.Serialize( importsBuffer ); } var exportsBuffer = new UObjectStream( stream ); foreach( var export in Exports ) { //export.Serialize( exportsBuffer ); } stream.Seek( 0, SeekOrigin.Begin ); stream.Write( Signature ); // Serialize header var version = (int)(Version & 0x0000FFFFU) | (LicenseeVersion << 16); stream.Write( version ); var headerSizePosition = stream.Position; if( Version >= VHeaderSize ) { stream.Write( (int)HeaderSize ); if( Version >= VGroup ) { stream.WriteString( Group ); } } stream.Write( PackageFlags ); _TablesData.NamesCount = (uint)Names.Count; _TablesData.ExportsCount = (uint)Exports.Count; _TablesData.ImportsCount = (uint)Imports.Count; var tablesDataPosition = stream.Position; _TablesData.Serialize( stream ); // TODO: Serialize Heritages stream.Write( Guid.NewGuid().ToByteArray(), 0, 16 ); Generations.Serialize( stream ); if( Version >= VEngineVersion ) { stream.Write( EngineVersion ); if( Version >= VCOOKEDPACKAGES ) { stream.Write( CookerVersion ); if( Version >= VCompression ) { if( IsCooked() ) { stream.Write( CompressionFlags ); CompressedChunks.Serialize( stream ); } } } } // TODO: Unknown data stream.Write( (uint)0 ); // Serialize objects // Write tables // names Console.WriteLine( "Writing names at position " + stream.Position ); _TablesData.NamesOffset = (uint)stream.Position; var namesBytes = namesBuffer.GetBuffer(); stream.Write( namesBytes, 0, (int)namesBuffer.Length ); // imports Console.WriteLine( "Writing imports at position " + stream.Position ); _TablesData.ImportsOffset = (uint)stream.Position; var importsBytes = importsBuffer.GetBuffer(); stream.Write( importsBytes, 0, (int)importsBuffer.Length ); // exports Console.WriteLine( "Writing exports at position " + stream.Position ); // Serialize tables data again now that offsets are known. var currentPosition = stream.Position; stream.Seek( tablesDataPosition, SeekOrigin.Begin ); _TablesData.Serialize( stream ); stream.Seek( currentPosition, SeekOrigin.Begin ); }