public VBIB(IKeyValueCollection data) : this() { var vertexBuffers = data.GetArray("m_vertexBuffers"); foreach (var vb in vertexBuffers) { var vertexBuffer = BufferDataFromDATA(vb); var decompressedSize = vertexBuffer.ElementCount * vertexBuffer.ElementSizeInBytes; if (vertexBuffer.Data.Length != decompressedSize) { vertexBuffer.Data = MeshOptimizerVertexDecoder.DecodeVertexBuffer((int)vertexBuffer.ElementCount, (int)vertexBuffer.ElementSizeInBytes, vertexBuffer.Data); } VertexBuffers.Add(vertexBuffer); } var indexBuffers = data.GetArray("m_indexBuffers"); foreach (var ib in indexBuffers) { var indexBuffer = BufferDataFromDATA(ib); var decompressedSize = indexBuffer.ElementCount * indexBuffer.ElementSizeInBytes; if (indexBuffer.Data.Length != decompressedSize) { indexBuffer.Data = MeshOptimizerIndexDecoder.DecodeIndexBuffer((int)indexBuffer.ElementCount, (int)indexBuffer.ElementSizeInBytes, indexBuffer.Data); } IndexBuffers.Add(indexBuffer); } }
public override void Read(BinaryReader reader, Resource resource) { reader.BaseStream.Position = Offset; var vertexBufferOffset = reader.ReadUInt32(); var vertexBufferCount = reader.ReadUInt32(); var indexBufferOffset = reader.ReadUInt32(); var indexBufferCount = reader.ReadUInt32(); reader.BaseStream.Position = Offset + vertexBufferOffset; for (var i = 0; i < vertexBufferCount; i++) { var vertexBuffer = ReadOnDiskBufferData(reader); var decompressedSize = vertexBuffer.ElementCount * vertexBuffer.ElementSizeInBytes; if (vertexBuffer.Data.Length != decompressedSize) { vertexBuffer.Data = MeshOptimizerVertexDecoder.DecodeVertexBuffer((int)vertexBuffer.ElementCount, (int)vertexBuffer.ElementSizeInBytes, vertexBuffer.Data); } VertexBuffers.Add(vertexBuffer); } reader.BaseStream.Position = Offset + 8 + indexBufferOffset; //8 to take into account vertexOffset / count for (var i = 0; i < indexBufferCount; i++) { var indexBuffer = ReadOnDiskBufferData(reader); var decompressedSize = indexBuffer.ElementCount * indexBuffer.ElementSizeInBytes; if (indexBuffer.Data.Length != decompressedSize) { indexBuffer.Data = MeshOptimizerIndexDecoder.DecodeIndexBuffer((int)indexBuffer.ElementCount, (int)indexBuffer.ElementSizeInBytes, indexBuffer.Data); } IndexBuffers.Add(indexBuffer); } }
public override void Read(BinaryReader reader, Resource resource) { reader.BaseStream.Position = Offset; var vertexBufferOffset = reader.ReadUInt32(); var vertexBufferCount = reader.ReadUInt32(); var indexBufferOffset = reader.ReadUInt32(); var indexBufferCount = reader.ReadUInt32(); reader.BaseStream.Position = Offset + vertexBufferOffset; for (var i = 0; i < vertexBufferCount; i++) { var vertexBuffer = default(VertexBuffer); vertexBuffer.Count = reader.ReadUInt32(); //0 vertexBuffer.Size = reader.ReadUInt32(); //4 var decompressedSize = vertexBuffer.Count * vertexBuffer.Size; var refA = reader.BaseStream.Position; var attributeOffset = reader.ReadUInt32(); //8 var attributeCount = reader.ReadUInt32(); //12 //TODO: Read attributes in the future var refB = reader.BaseStream.Position; var dataOffset = reader.ReadUInt32(); //16 var totalSize = reader.ReadUInt32(); //20 vertexBuffer.Attributes = new List <VertexAttribute>(); reader.BaseStream.Position = refA + attributeOffset; for (var j = 0; j < attributeCount; j++) { var previousPosition = reader.BaseStream.Position; var attribute = default(VertexAttribute); attribute.Name = reader.ReadNullTermString(Encoding.UTF8).ToUpperInvariant(); // Offset is always 40 bytes from the start reader.BaseStream.Position = previousPosition + 36; attribute.Type = (DXGI_FORMAT)reader.ReadUInt32(); attribute.Offset = reader.ReadUInt32(); // There's unusual amount of padding in attributes reader.BaseStream.Position = previousPosition + 56; vertexBuffer.Attributes.Add(attribute); } reader.BaseStream.Position = refB + dataOffset; var vertexBufferBytes = reader.ReadBytes((int)totalSize); if (totalSize == decompressedSize) { vertexBuffer.Buffer = vertexBufferBytes; } else { vertexBuffer.Buffer = MeshOptimizerVertexDecoder.DecodeVertexBuffer((int)vertexBuffer.Count, (int)vertexBuffer.Size, vertexBufferBytes); } VertexBuffers.Add(vertexBuffer); reader.BaseStream.Position = refB + 4 + 4; //Go back to the vertex array to read the next iteration } reader.BaseStream.Position = Offset + 8 + indexBufferOffset; //8 to take into account vertexOffset / count for (var i = 0; i < indexBufferCount; i++) { var indexBuffer = default(IndexBuffer); indexBuffer.Count = reader.ReadUInt32(); //0 indexBuffer.Size = reader.ReadUInt32(); //4 var decompressedSize = indexBuffer.Count * indexBuffer.Size; var unknown1 = reader.ReadUInt32(); //8 var unknown2 = reader.ReadUInt32(); //12 var refC = reader.BaseStream.Position; var dataOffset = reader.ReadUInt32(); //16 var dataSize = reader.ReadUInt32(); //20 reader.BaseStream.Position = refC + dataOffset; if (dataSize == decompressedSize) { indexBuffer.Buffer = reader.ReadBytes((int)dataSize); } else { indexBuffer.Buffer = MeshOptimizerIndexDecoder.DecodeIndexBuffer((int)indexBuffer.Count, (int)indexBuffer.Size, reader.ReadBytes((int)dataSize)); } IndexBuffers.Add(indexBuffer); reader.BaseStream.Position = refC + 4 + 4; //Go back to the index array to read the next iteration. } }