コード例 #1
0
 private void LoadDependencies(FAssetRegistryArchive Ar)
 {
     foreach (var dependsNode in PreallocatedDependsNodeDataBuffers)
     {
         dependsNode.SerializeLoad(Ar, PreallocatedDependsNodeDataBuffers);
     }
 }
コード例 #2
0
 public FAssetPackageData(FAssetRegistryArchive Ar, bool serializeHash)
 {
     PackageName = Ar.ReadFName();
     DiskSize    = Ar.Read <long>();
     PackageGuid = Ar.Read <FGuid>();
     CookedHash  = serializeHash ? new FMD5Hash(Ar) : null;
 }
コード例 #3
0
 private void LoadDependencies_BeforeFlags(FAssetRegistryArchive Ar, FAssetRegistryVersionType version)
 {
     foreach (var dependsNode in PreallocatedDependsNodeDataBuffers)
     {
         dependsNode.SerializeLoad_BeforeFlags(Ar, version, PreallocatedDependsNodeDataBuffers);
     }
 }
コード例 #4
0
        private void Load(FAssetRegistryArchive Ar, FAssetRegistryVersionType version)
        {
            PreallocatedAssetDataBuffers = Ar.ReadArray(() => new FAssetData(Ar));

            if (version < FAssetRegistryVersionType.AddedDependencyFlags)
            {
                var localNumDependsNodes = Ar.Read <int>();
                PreallocatedDependsNodeDataBuffers = Ar.ReadArray(localNumDependsNodes, () => new FDependsNode());
                if (localNumDependsNodes > 0)
                {
                    LoadDependencies_BeforeFlags(Ar, version);
                }
            }
            else
            {
                var dependencySectionSize = Ar.Read <long>();
                var dependencySectionEnd  = Ar.Position + dependencySectionSize;
                var localNumDependsNodes  = Ar.Read <int>();
                PreallocatedDependsNodeDataBuffers = Ar.ReadArray(localNumDependsNodes, () => new FDependsNode());
                if (localNumDependsNodes > 0)
                {
                    LoadDependencies(Ar);
                }
                Ar.Seek(dependencySectionEnd, SeekOrigin.Begin);
            }

            var serializeHash = version < FAssetRegistryVersionType.AddedCookedMD5Hash;

            PreallocatedPackageDataBuffers = Ar.ReadArray(() => new FAssetPackageData(Ar, serializeHash));
        }
コード例 #5
0
        public FAssetPackageData(FAssetRegistryArchive Ar, FAssetRegistryVersionType version)
        {
            PackageName = Ar.ReadFName();
            DiskSize    = Ar.Read <long>();
            PackageGuid = Ar.Read <FGuid>();
            if (version >= FAssetRegistryVersionType.AddedCookedMD5Hash)
            {
                CookedHash = new FMD5Hash(Ar);
            }
            if (version >= FAssetRegistryVersionType.WorkspaceDomain)
            {
                if (version >= FAssetRegistryVersionType.PackageFileSummaryVersionChange)
                {
                    FileVersionUE = Ar.Read <FPackageFileVersion>();
                }
                else
                {
                    var ue4Version = Ar.Read <int>();
                    FileVersionUE = FPackageFileVersion.CreateUE4Version(ue4Version);
                }

                FileVersionLicenseeUE = Ar.Read <int>();
                Flags          = Ar.Read <uint>();
                CustomVersions = Ar.ReadArray <FCustomVersion>();
            }
            if (version >= FAssetRegistryVersionType.PackageImportedClasses)
            {
                ImportedClasses = Ar.ReadArray(Ar.ReadFName);
            }
        }
コード例 #6
0
        public FAssetData(FAssetRegistryArchive Ar)
        {
            ObjectPath  = Ar.ReadFName();
            PackagePath = Ar.ReadFName();
            AssetClass  = Ar.ReadFName();
            PackageName = Ar.ReadFName();
            AssetName   = Ar.ReadFName();

            Ar.SerializeTagsAndBundles(this);

            ChunkIDs    = Ar.ReadArray <int>();
            PackageFlag = Ar.Read <uint>();
        }
コード例 #7
0
        private void LoadDependencies(FAssetRegistryArchive Ar)
        {
            FDependsNode?GetNodeFromSerializeIndex(int index)
            {
                if (index < 0 || PreallocatedDependsNodeDataBuffers.Length <= index)
                {
                    return(null);
                }
                return(PreallocatedDependsNodeDataBuffers[index]);
            }

            foreach (var dependsNode in PreallocatedDependsNodeDataBuffers)
            {
                dependsNode.SerializeLoad(Ar, GetNodeFromSerializeIndex);
            }
        }
コード例 #8
0
        public FAssetIdentifier(FAssetRegistryArchive Ar)
        {
            var fieldBits = Ar.ReadByte();

            if ((fieldBits & (1 << 0)) != 0)
            {
                PackageName = Ar.ReadFName();
            }
            if ((fieldBits & (1 << 1)) != 0)
            {
                PrimaryAssetType = Ar.ReadFName();
            }
            if ((fieldBits & (1 << 2)) != 0)
            {
                ObjectName = Ar.ReadFName();
            }
            if ((fieldBits & (1 << 3)) != 0)
            {
                ValueName = Ar.ReadFName();
            }
        }
コード例 #9
0
ファイル: FDependsNode.cs プロジェクト: razfriman/CUE4Parse
        public void SerializeLoad_BeforeFlags(FAssetRegistryArchive Ar, FAssetRegistryVersionType version, FDependsNode[] a)
        {
            Identifier = new FAssetIdentifier(Ar);

            var numHard        = Ar.Read <int>();
            var numSoft        = Ar.Read <int>();
            var numName        = Ar.Read <int>();
            var numSoftManage  = Ar.Read <int>();
            var numHardManage  = version >= FAssetRegistryVersionType.AddedHardManage ? Ar.Read <int>() : 0;
            var numReferencers = Ar.Read <int>();

            PackageDependencies = new List <FDependsNode>(numHard + numSoft);
            NameDependencies    = new List <FDependsNode>(numName);
            ManageDependencies  = new List <FDependsNode>(numSoftManage + numHardManage);
            Referencers         = new List <FDependsNode>(numReferencers);

            void SerializeNodeArray(int num, ref List <FDependsNode> dependencies)
            {
                for (var i = 0; i < num; i++)
                {
                    var index = Ar.Read <int>();
                    if (index < 0 || index >= a.Length)
                    {
                        throw new ParserException("");
                    }
                    var dependsNodes = a[index];
                    dependencies.Add(dependsNodes);
                }
            }

            SerializeNodeArray(numHard, ref PackageDependencies);
            SerializeNodeArray(numSoft, ref PackageDependencies);
            SerializeNodeArray(numName, ref NameDependencies);
            SerializeNodeArray(numSoftManage, ref ManageDependencies);
            SerializeNodeArray(numHardManage, ref ManageDependencies);
            SerializeNodeArray(numReferencers, ref Referencers);
        }
コード例 #10
0
ファイル: FDependsNode.cs プロジェクト: FabianFG/CUE4Parse
        public void SerializeLoad_BeforeFlags(FAssetRegistryArchive Ar, FAssetRegistryVersionType version, FDependsNode[] preallocatedDependsNodeDataBuffer)
        {
            Identifier = new FAssetIdentifier(Ar);

            var numHard        = Ar.Read <int>();
            var numSoft        = Ar.Read <int>();
            var numName        = Ar.Read <int>();
            var numSoftManage  = Ar.Read <int>();
            var numHardManage  = version >= FAssetRegistryVersionType.AddedHardManage ? Ar.Read <int>() : 0;
            var numReferencers = Ar.Read <int>();

            PackageDependencies = new List <FDependsNode>(numHard + numSoft);
            NameDependencies    = new List <FDependsNode>(numName);
            ManageDependencies  = new List <FDependsNode>(numSoftManage + numHardManage);
            Referencers         = new List <FDependsNode>(numReferencers);

            void SerializeNodeArray(int num, ref List <FDependsNode> outNodes)
            {
                for (var dependencyIndex = 0; dependencyIndex < num; ++dependencyIndex)
                {
                    var index = Ar.Read <int>();
                    if (index < 0 || index >= preallocatedDependsNodeDataBuffer.Length)
                    {
                        throw new ParserException($"Index {index} doesn't exist in 'PreallocatedDependsNodeDataBuffers'");
                    }
                    var dependsNode = preallocatedDependsNodeDataBuffer[index];
                    outNodes.Add(dependsNode);
                }
            }

            SerializeNodeArray(numHard, ref PackageDependencies);
            SerializeNodeArray(numSoft, ref PackageDependencies);
            SerializeNodeArray(numName, ref NameDependencies);
            SerializeNodeArray(numSoftManage, ref ManageDependencies);
            SerializeNodeArray(numHardManage, ref ManageDependencies);
            SerializeNodeArray(numReferencers, ref Referencers);
        }
コード例 #11
0
        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));
        }
コード例 #12
0
ファイル: FDependsNode.cs プロジェクト: razfriman/CUE4Parse
        public void SerializeLoad(FAssetRegistryArchive Ar, Func <int, FDependsNode?> GetNodeFromSerializeIndex)
        {
            Identifier = new FAssetIdentifier(Ar);

            void ReadDependencies(ref List <FDependsNode> dependencies, ref BitArray outFlagBits, int flagSetWidth)
            {
                var      numFlagBits         = 0;
                BitArray inFlagBits          = null;
                var      sortIndexes         = new List <int>();
                var      pointerDependencies = new List <FDependsNode>();

                var inDependencies  = Ar.ReadArray <int>();
                var numDependencies = inDependencies.Length;

                if (outFlagBits != null)
                {
                    numFlagBits = flagSetWidth * numDependencies;
                    var numFlagWords = (numFlagBits + 32u - 1u) / 32u;
                    inFlagBits = new BitArray(Ar.ReadBytes(Convert.ToInt32(numFlagWords)));
                }

                foreach (var serializeIndex in inDependencies)
                {
                    var dependsNode = GetNodeFromSerializeIndex(serializeIndex);
                    if (dependsNode == null)
                    {
                        throw new ParserException($"Index {serializeIndex} doesn't exist in 'PreallocatedDependsNodeDataBuffers'");
                    }
                    pointerDependencies.Add(dependsNode);
                }

                for (var i = 0; i < numDependencies; i++)
                {
                    sortIndexes.Add(i);
                }

                dependencies = new List <FDependsNode>(numDependencies);
                foreach (var index in sortIndexes)
                {
                    dependencies.Add(pointerDependencies[index]);
                }

                if (outFlagBits != null)
                {
                    outFlagBits = new BitArray(numFlagBits);
                    for (var i = 0; i < numDependencies; i++)
                    {
                        var readIndex = sortIndexes[i];
                        var start     = i * flagSetWidth;
                        for (var j = 0; j < start + flagSetWidth; j++) // oof
                        {
                            outFlagBits.Set(j, inFlagBits.Get(readIndex * flagSetWidth + j));
                        }
                    }
                }
            }

            BitArray myNameIsNull = null;

            ReadDependencies(ref PackageDependencies, ref PackageFlags, _packageFlagSetWidth);
            ReadDependencies(ref NameDependencies, ref myNameIsNull, 0);
            ReadDependencies(ref ManageDependencies, ref ManageFlags, _manageFlagSetWidth);
            ReadDependencies(ref Referencers, ref myNameIsNull, 0);
        }
コード例 #13
0
 public FAssetBundleData(FAssetRegistryArchive Ar)
 {
     Bundles = Ar.ReadArray(() => new FAssetBundleEntry(Ar));
 }
コード例 #14
0
 public FAssetBundleEntry(FAssetRegistryArchive Ar)
 {
     BundleName   = Ar.ReadFName();
     BundleAssets = Ar.ReadArray(() => new FSoftObjectPath(Ar.ReadFName(), Ar.ReadFString()));
 }
コード例 #15
0
ファイル: FMD5Hash.cs プロジェクト: Pro-Swapper/ProSwapper
 public FMD5Hash(FAssetRegistryArchive Ar)
 {
     Hash = Ar.Read <uint>() != 0 ? Ar.ReadBytes(16) : null;
 }
コード例 #16
0
ファイル: FDependsNode.cs プロジェクト: FabianFG/CUE4Parse
        public void SerializeLoad(FAssetRegistryArchive Ar, FDependsNode[] preallocatedDependsNodeDataBuffer)
        {
            Identifier = new FAssetIdentifier(Ar);

            void ReadDependencies(ref List <FDependsNode> outDependencies, ref BitArray?outFlagBits, int flagSetWidth)
            {
                var sortIndexes         = new List <int>();
                var pointerDependencies = new List <FDependsNode>();

                var inDependencies  = Ar.ReadArray <int>();
                var numDependencies = inDependencies.Length;
                var numFlagBits     = flagSetWidth * numDependencies;
                var numFlagWords    = numFlagBits.DivideAndRoundUp(32);
                var inFlagBits      = numFlagWords != 0 ? new BitArray(Ar.ReadArray <int>(numFlagWords)) : new BitArray(0);

                foreach (var serializeIndex in inDependencies)
                {
                    if (serializeIndex < 0 || preallocatedDependsNodeDataBuffer.Length <= serializeIndex)
                    {
                        throw new ParserException($"Index {serializeIndex} doesn't exist in 'PreallocatedDependsNodeDataBuffers'");
                    }
                    var dependsNode = preallocatedDependsNodeDataBuffer[serializeIndex];
                    pointerDependencies.Add(dependsNode);
                }

                for (var i = 0; i < numDependencies; i++)
                {
                    sortIndexes.Add(i);
                }

                sortIndexes.Sort((a, b) => pointerDependencies[a]._index - pointerDependencies[b]._index);

                outDependencies = new List <FDependsNode>(numDependencies);
                foreach (var index in sortIndexes)
                {
                    outDependencies.Add(pointerDependencies[index]);
                }

                outFlagBits = new BitArray(numFlagBits);
                for (var writeIndex = 0; writeIndex < numDependencies; writeIndex++)
                {
                    var readIndex = sortIndexes[writeIndex];
                    outFlagBits.SetRangeFromRange(writeIndex * flagSetWidth, flagSetWidth, inFlagBits, readIndex * flagSetWidth);
                }
            }

            void ReadDependenciesNoFlags(ref List <FDependsNode> outDependencies)
            {
                var sortIndexes         = new List <int>();
                var pointerDependencies = new List <FDependsNode>();

                var inDependencies  = Ar.ReadArray <int>();
                var numDependencies = inDependencies.Length;

                foreach (var serializeIndex in inDependencies)
                {
                    if (serializeIndex < 0 || preallocatedDependsNodeDataBuffer.Length <= serializeIndex)
                    {
                        throw new ParserException($"Index {serializeIndex} doesn't exist in 'PreallocatedDependsNodeDataBuffers'");
                    }
                    var dependsNode = preallocatedDependsNodeDataBuffer[serializeIndex];
                    pointerDependencies.Add(dependsNode);
                }

                for (var i = 0; i < numDependencies; i++)
                {
                    sortIndexes.Add(i);
                }

                sortIndexes.Sort((a, b) => pointerDependencies[a]._index - pointerDependencies[b]._index);

                outDependencies = new List <FDependsNode>(numDependencies);
                foreach (var index in sortIndexes)
                {
                    outDependencies.Add(pointerDependencies[index]);
                }
            }

            ReadDependencies(ref PackageDependencies, ref PackageFlags, PackageFlagSetWidth);
            ReadDependenciesNoFlags(ref NameDependencies);
            ReadDependencies(ref ManageDependencies, ref ManageFlags, ManageFlagSetWidth);
            ReadDependenciesNoFlags(ref Referencers);
        }