Exemplo n.º 1
0
            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();
            }
Exemplo n.º 2
0
            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();
            }
Exemplo n.º 3
0
        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));
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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 );
        }
Exemplo n.º 6
0
        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 );
        }