Пример #1
0
        public void Read(AssetReader reader)
        {
            long startPosition  = reader.BaseStream.Position;
            int  count          = reader.ReadInt32();
            long headerPosition = reader.BaseStream.Position;
            int  entrySize      = HasUnknown(reader.Version) ? 12 : 8;

            SubPrograms = new ShaderSubProgram[count];
            for (int i = 0; i < count; i++)
            {
                reader.BaseStream.Position = headerPosition + i * entrySize;
                int offset  = reader.ReadInt32();
                int length  = reader.ReadInt32();
                int unknown = 0;
                if (HasUnknown(reader.Version))
                {
                    unknown = reader.ReadInt32();
                }

                long dataPosition = startPosition + offset;
                reader.BaseStream.Position = dataPosition;
                ShaderSubProgram subProgram = new ShaderSubProgram();
                subProgram.Read(reader);
                if (reader.BaseStream.Position != dataPosition + length)
                {
                    throw new Exception($"Read less {reader.BaseStream.Position - dataPosition} than expected {length}");
                }
                SubPrograms[i] = subProgram;
            }
        }
Пример #2
0
        public void Export(ShaderWriter writer, string header)
        {
            int j = 0;

            while (true)
            {
                int index = header.IndexOf(GpuProgramIndexName, j);
                if (index == -1)
                {
                    break;
                }

                int length = index - j;
                writer.WriteString(header, j, length);
                j += length + GpuProgramIndexName.Length + 1;

                int subIndex = -1;
                for (int startIndex = j; j < header.Length; j++)
                {
                    if (!char.IsDigit(header[j]))
                    {
                        string numberStr = header.Substring(startIndex, j - startIndex);
                        subIndex = int.Parse(numberStr);
                        break;
                    }
                }

                ref ShaderSubProgram subProgram = ref SubPrograms[subIndex];
                // we don't know shader type so pass vertex
                subProgram.Export(writer, ShaderType.Vertex);
            }
Пример #3
0
        private void ReadBlob(AssetLayout layout, MemoryStream memStream, uint compressedLength, uint decompressedLength, int segment)
        {
            byte[] decompressedBuffer = new byte[decompressedLength];
            using (Lz4DecodeStream lz4Stream = new Lz4DecodeStream(memStream, compressedLength))
            {
                lz4Stream.ReadBuffer(decompressedBuffer, 0, decompressedBuffer.Length);
            }

            using (MemoryStream blobMem = new MemoryStream(decompressedBuffer))
            {
                using (AssetReader blobReader = new AssetReader(blobMem, EndianType.LittleEndian, layout))
                {
                    if (segment == 0)
                    {
                        Entries     = blobReader.ReadAssetArray <ShaderSubProgramEntry>();
                        SubPrograms = new ShaderSubProgram[Entries.Length];
                    }
                    ReadSegment(blobReader, segment);
                }
            }
        }
        public void Read(AssetReader reader)
        {
            long startPosition  = reader.BaseStream.Position;
            int  count          = reader.ReadInt32();
            long headerPosition = reader.BaseStream.Position;

            m_subPrograms = new ShaderSubProgram[count];
            for (int i = 0; i < count; i++)
            {
                reader.BaseStream.Position = headerPosition + i * 8;
                int offset = reader.ReadInt32();
                int length = reader.ReadInt32();

                long dataPosition = startPosition + offset;
                reader.BaseStream.Position = dataPosition;
                ShaderSubProgram subProgram = new ShaderSubProgram();
                subProgram.Read(reader);
                if (reader.BaseStream.Position != dataPosition + length)
                {
                    throw new Exception($"Read less {reader.BaseStream.Position - dataPosition} than expected {length}");
                }
                m_subPrograms[i] = subProgram;
            }
        }