private void Load(FAssetRegistryArchive Ar, FAssetRegistryVersionType version)
        {
            PreallocatedAssetDataBuffers = Ar.ReadArray(() => new FAssetData(Ar));

            if (version < FAssetRegistryVersionType.AddedDependencyFlags)
            {
                var localNumDependsNodes = Ar.Read <int>();
                PreallocatedDependsNodeDataBuffers = new FDependsNode[localNumDependsNodes];
                for (int i = 0; i < localNumDependsNodes; i++)
                {
                    PreallocatedDependsNodeDataBuffers[i] = new FDependsNode(i);
                }
                if (localNumDependsNodes > 0)
                {
                    LoadDependencies_BeforeFlags(Ar, version);
                }
            }
            else
            {
                var dependencySectionSize = Ar.Read <long>();
                var dependencySectionEnd  = Ar.Position + dependencySectionSize;
                var localNumDependsNodes  = Ar.Read <int>();
                PreallocatedDependsNodeDataBuffers = new FDependsNode[localNumDependsNodes];
                for (int i = 0; i < localNumDependsNodes; i++)
                {
                    PreallocatedDependsNodeDataBuffers[i] = new FDependsNode(i);
                }
                if (localNumDependsNodes > 0)
                {
                    LoadDependencies(Ar);
                }
                Ar.Position = dependencySectionEnd;
            }

            PreallocatedPackageDataBuffers = Ar.ReadArray(() => new FAssetPackageData(Ar, version));
        }
Example #2
0
        public AssetRegistryFile(BinaryReader reader)
        {
            var Version = FAssetRegistryVersion.DeserializeVersion(reader);

            if (Version < FAssetRegistryVersion.Type.AddedCookedMD5Hash)
            {
                throw new FileLoadException("Cannot read states before this version");
            }

            var nameReader = new FNameTableArchiveReader(reader);

            var LocalNumAssets = reader.ReadInt32();

            PreallocatedAssetDataBuffer = new FAssetData[LocalNumAssets];

            for (int i = 0; i < LocalNumAssets; i++)
            {
                PreallocatedAssetDataBuffer[i] = new FAssetData(nameReader);
            }

            var LocalNumDependsNodes = reader.ReadInt32();

            PreallocatedDependsNodeDataBuffer = new FDependsNode[LocalNumDependsNodes];
            for (int i = 0; i < LocalNumDependsNodes; i++)
            {
                PreallocatedDependsNodeDataBuffer[i] = new FDependsNode();
            }

            SortedList <EAssetRegistryDependencyType, int> DepCounts = new SortedList <EAssetRegistryDependencyType, int>();

            for (int i = 0; i < LocalNumDependsNodes; i++)
            {
                FAssetIdentifier AssetIdentifier = new FAssetIdentifier(nameReader);

                DepCounts[EAssetRegistryDependencyType.Hard]           = reader.ReadInt32();
                DepCounts[EAssetRegistryDependencyType.Soft]           = reader.ReadInt32();
                DepCounts[EAssetRegistryDependencyType.SearchableName] = reader.ReadInt32();
                DepCounts[EAssetRegistryDependencyType.SoftManage]     = reader.ReadInt32();
                DepCounts[EAssetRegistryDependencyType.HardManage]     = Version < FAssetRegistryVersion.Type.AddedHardManage ? 0 : reader.ReadInt32();
                DepCounts[0] = reader.ReadInt32();

                PreallocatedDependsNodeDataBuffer[i].Identifier = AssetIdentifier;
                PreallocatedDependsNodeDataBuffer[i].Reserve(DepCounts);

                SerializeDependencyType(EAssetRegistryDependencyType.Hard, i);
                SerializeDependencyType(EAssetRegistryDependencyType.Soft, i);
                SerializeDependencyType(EAssetRegistryDependencyType.SearchableName, i);
                SerializeDependencyType(EAssetRegistryDependencyType.SoftManage, i);
                SerializeDependencyType(EAssetRegistryDependencyType.HardManage, i);
                SerializeDependencyType(0, i);
            }

            void SerializeDependencyType(EAssetRegistryDependencyType InDependencyType, int AssetIndex)
            {
                for (int i = 0; i < DepCounts[InDependencyType]; ++i)
                {
                    int index = reader.ReadInt32();

                    if (index < 0 || index >= LocalNumDependsNodes)
                    {
                        throw new FileLoadException("could you please serialize your assetregistry correctly");
                    }
                    PreallocatedDependsNodeDataBuffer[AssetIndex].Add(index, InDependencyType);
                }
            }

            int LocalNumPackageData = reader.ReadInt32();

            PreallocatedPackageDataBuffer = new FAssetPackageData[LocalNumPackageData];

            var bSerializeHash = Version < FAssetRegistryVersion.Type.AddedCookedMD5Hash;

            for (int i = 0; i < LocalNumPackageData; i++)
            {
                PreallocatedPackageDataBuffer[i] = new FAssetPackageData(nameReader, bSerializeHash);
            }
        }