Пример #1
0
    public void OnButtonStreamLoadFile()
    {
        AssetStream stream = new AssetStream(TEST_FILE);

        byte[] data = new byte[stream.Length];
        stream.Read(data, 0, data.Length);
        stream.Close();
        result.text = System.Text.Encoding.ASCII.GetString(data);
    }
Пример #2
0
 public void OnButtonStreamRead5()
 {
     if (_stream == null)
     {
         _stream = new AssetStream(TEST_FILE);
     }
     byte[] data = new byte[5];
     _stream.Read(data, 0, data.Length);
     result.text += System.Text.Encoding.ASCII.GetString(data);
 }
Пример #3
0
        public override void Read(AssetStream stream)
        {
            if (IsSerialized(stream.Version))
            {
                ReadBase(stream);

                ParsedForm.Read(stream);
                Name = ParsedForm.Name;

                m_platforms = stream.ReadEnum32Array((t) => (GPUPlatform)t);
                uint[] offsets             = stream.ReadUInt32Array();
                uint[] compressedLengths   = stream.ReadUInt32Array();
                uint[] decompressedLengths = stream.ReadUInt32Array();
                byte[] compressedBlob      = stream.ReadByteArray();
                stream.AlignStream(AlignType.Align4);

                m_subProgramBlobs = new ShaderSubProgramBlob[m_platforms.Length];
                using (MemoryStream memStream = new MemoryStream(compressedBlob))
                {
                    for (int i = 0; i < m_platforms.Length; i++)
                    {
                        uint offset             = offsets[i];
                        uint compressedLength   = compressedLengths[i];
                        uint decompressedLength = decompressedLengths[i];

                        memStream.Position = offset;
                        byte[] decompressedBuffer = new byte[decompressedLength];
                        using (Lz4Stream lz4Stream = new Lz4Stream(memStream, (int)compressedLength))
                        {
                            int read = lz4Stream.Read(decompressedBuffer, 0, decompressedBuffer.Length);
                            if (read != decompressedLength)
                            {
                                throw new Exception($"Can't properly decode shader blob. Read {read} but expected {decompressedLength}");
                            }
                        }

                        using (MemoryStream blobMem = new MemoryStream(decompressedBuffer))
                        {
                            using (AssetStream blobStream = new AssetStream(blobMem, stream.Version, stream.Platform))
                            {
                                ShaderSubProgramBlob blob = new ShaderSubProgramBlob();
                                blob.Read(blobStream);
                                m_subProgramBlobs[i] = blob;
                            }
                        }
                    }
                }
            }
            else
            {
                base.Read(stream);

                if (IsEncoded(stream.Version))
                {
                    uint decompressedSize = stream.ReadUInt32();
                    int  comressedSize    = stream.ReadInt32();

                    byte[] subProgramBlob = new byte[comressedSize];
                    stream.Read(subProgramBlob, 0, comressedSize);
                    stream.AlignStream(AlignType.Align4);

                    if (comressedSize > 0 && decompressedSize > 0)
                    {
                        byte[] decompressedBuffer = new byte[decompressedSize];
                        using (MemoryStream memStream = new MemoryStream(subProgramBlob))
                        {
                            using (Lz4Stream lz4Stream = new Lz4Stream(memStream))
                            {
                                int read = lz4Stream.Read(decompressedBuffer, 0, decompressedBuffer.Length);
                                if (read != decompressedSize)
                                {
                                    throw new Exception($"Can't properly decode sub porgram blob. Read {read} but expected {decompressedSize}");
                                }
                            }
                        }

                        using (MemoryStream memStream = new MemoryStream(decompressedBuffer))
                        {
                            using (AssetStream blobStream = new AssetStream(memStream, stream.Version, stream.Platform))
                            {
                                SubProgramBlob.Read(blobStream);
                            }
                        }
                    }
                }

                if (IsReadFallback(stream.Version))
                {
                    Fallback.Read(stream);
                }
                if (IsReadDefaultProperties(stream.Version))
                {
                    DefaultProperties.Read(stream);
                }
                if (IsReadStaticProperties(stream.Version))
                {
                    StaticProperties.Read(stream);
                }
            }

            if (IsReadDependencies(stream.Version))
            {
                m_dependencies = stream.ReadArray <PPtr <Shader> >();
            }
            if (IsReadNonModifiableTextures(stream.Version))
            {
                m_nonModifiableTextures = stream.ReadArray <PPtr <Texture> >();
            }
            if (IsReadShaderIsBaked(stream.Version))
            {
                ShaderIsBaked = stream.ReadBoolean();
                stream.AlignStream(AlignType.Align4);
            }
        }