Esempio n. 1
0
 public override void Deserialize(FAssetArchive Ar, long validPos)
 {
     base.Deserialize(Ar, validPos);
     PersistentLevel        = new FPackageIndex(Ar);
     ExtraReferencedObjects = Ar.ReadArray(() => new FPackageIndex(Ar));
     StreamingLevels        = Ar.ReadArray(() => new FPackageIndex(Ar));
 }
Esempio n. 2
0
        private void SerializeCompressedData(FAssetArchive Ar)
        {
            // These fields were serialized as properties in pre-UE4.12 engine version
            KeyEncodingFormat            = Ar.Read <AnimationKeyFormat>();
            TranslationCompressionFormat = Ar.Read <AnimationCompressionFormat>();
            RotationCompressionFormat    = Ar.Read <AnimationCompressionFormat>();
            ScaleCompressionFormat       = Ar.Read <AnimationCompressionFormat>();

            CompressedTrackOffsets = Ar.ReadArray <int>();
            CompressedScaleOffsets = new FCompressedOffsetData(Ar);

            if (Ar.Game >= EGame.GAME_UE4_21)
            {
                // UE4.21+ - added compressed segments; disappeared in 4.23
                CompressedSegments = Ar.ReadArray <FCompressedSegment>();
                if (CompressedSegments.Length > 0)
                {
                    Log.Information("animation has CompressedSegments!");
                }
            }

            CompressedTrackToSkeletonMapTable = Ar.ReadArray <FTrackToSkeletonMap>();

            if (Ar.Game < EGame.GAME_UE4_22)
            {
                CompressedCurveData = new FStructFallback(Ar, "RawCurveTracks");
            }
            else
            {
                var compressedCurveNames = Ar.ReadArray(() => new FSmartName(Ar));
            }

            if (Ar.Game >= EGame.GAME_UE4_17)
            {
                // UE4.17+
                var compressedRawDataSize = Ar.Read <int>();
            }

            if (Ar.Game >= EGame.GAME_UE4_22)
            {
                var compressedNumFrames = Ar.Read <int>();
            }

            // compressed data
            var numBytes = Ar.Read <int>();

            CompressedByteStream = Ar.ReadBytes(numBytes);

            if (Ar.Game >= EGame.GAME_UE4_22)
            {
                var curveCodecPath            = Ar.ReadFString();
                var compressedCurveByteStream = Ar.ReadArray <byte>();
            }

            // Fix layout of "byte swapped" data (workaround for UE4 bug)
            if (KeyEncodingFormat == AnimationKeyFormat.AKF_PerTrackCompression && CompressedScaleOffsets.OffsetData.Length > 0 && Ar.Game < EGame.GAME_UE4_23)
            {
                throw new NotImplementedException();
            }
        }
Esempio n. 3
0
        public FReferenceSkeleton(FAssetArchive Ar)
        {
            FinalRefBoneInfo = Ar.ReadArray(() => new FMeshBoneInfo(Ar));
            FinalRefBonePose = Ar.ReadArray <FTransform>();

            if (Ar.Ver >= EUnrealEngineObjectUE4Version.REFERENCE_SKELETON_REFACTOR)
            {
                var num = Ar.Read <int>();
                FinalNameToIndexMap = new Dictionary <FName, int>(num);
                for (var i = 0; i < num; ++i)
                {
                    FinalNameToIndexMap[Ar.ReadFName()] = Ar.Read <int>();
                }
            }

            if (Ar.Ver < EUnrealEngineObjectUE4Version.FIXUP_ROOTBONE_PARENT)
            {
                if (FinalRefBoneInfo.Length > 0 && FinalRefBoneInfo[0].ParentIndex != -1)
                {
                    FinalRefBoneInfo[0] = new FMeshBoneInfo(FinalRefBoneInfo[0].Name, -1);
                }
            }

            AdjustBoneScales(FinalRefBonePose);
        }
Esempio n. 4
0
 public FDistanceFieldVolumeData5(FAssetArchive Ar)
 {
     LocalSpaceMeshBounds = Ar.Read <FBox>();
     bMostlyTwoSided      = Ar.ReadBoolean();
     Mips            = Ar.ReadArray <FSparseDistanceFieldMip>(DistanceField.NumMips);
     AlwaysLoadedMip = Ar.ReadArray <byte>();
     StreamableMips  = new FByteBulkData(Ar);
 }
 public FApexClothPhysToRenderVertData(FAssetArchive Ar)
 {
     PositionBaryCoordsAndDist = Ar.Read <FVector4>();
     NormalBaryCoordsAndDist   = Ar.Read <FVector4>();
     TangentBaryCoordsAndDist  = Ar.Read <FVector4>();
     SimulMeshVertIndices      = Ar.ReadArray(4, Ar.Read <short>);
     Padding = Ar.ReadArray(2, Ar.Read <int>);
 }
Esempio n. 6
0
        // UE4.23-4.24 has changed compressed data layout for streaming, so it's worth making a separate
        // serializer function for it.
        private void SerializeCompressedData2(FAssetArchive Ar)
        {
            var compressedRawDataSize = Ar.Read <int>();

            CompressedTrackToSkeletonMapTable = Ar.ReadArray <FTrackToSkeletonMap>();
            var compressedCurveNames = Ar.ReadArray(() => new FSmartName(Ar));

            // Since 4.23, this is FUECompressedAnimData::SerializeCompressedData
            KeyEncodingFormat            = Ar.Read <AnimationKeyFormat>();
            TranslationCompressionFormat = Ar.Read <AnimationCompressionFormat>();
            RotationCompressionFormat    = Ar.Read <AnimationCompressionFormat>();
            ScaleCompressionFormat       = Ar.Read <AnimationCompressionFormat>();

            var compressedNumFrames = Ar.Read <int>();

            // SerializeView() just serializes array size
            var compressedTrackOffsetsNum = Ar.Read <int>();
            var compressedScaleOffsetsNum = Ar.Read <int>();

            CompressedScaleOffsets = new FCompressedOffsetData(Ar.Read <int>());
            var compressedByteStreamNum = Ar.Read <int>();
            // ... end of FUECompressedAnimData::SerializeCompressedData

            var numBytes            = Ar.Read <int>();
            var bUseBulkDataForLoad = Ar.ReadBoolean();

            // In UE4.23 CompressedByteStream field exists in FUECompressedAnimData (as TArrayView) and in
            // FCompressedAnimSequence (as byte array). Serialization is done in FCompressedAnimSequence,
            // either as TArray or as bulk, and then array is separated onto multiple "views" for
            // FUECompressedAnimData. We'll use a different name for "joined" serialized array here to
            // avoid confuse.
            byte[] serializedByteStream;

            if (bUseBulkDataForLoad)
            {
                throw new NotImplementedException("Anim: bUseBulkDataForLoad not implemented");
                //todo: read from bulk to serializedByteStream
            }
            else
            {
                serializedByteStream = Ar.ReadBytes(numBytes);
            }

            // Setup all array views from single array. In UE4 this is done in FUECompressedAnimData::InitViewsFromBuffer.
            // We'll simply copy array data away from SerializedByteStream, and then SerializedByteStream
            // will be released from memory as it is a local variable here.
            // Note: copying is not byte-order wise, so if there will be any problems in the future,
            // should use byte swap functions.
            using (var tempAr = new FByteArchive("SerializedByteStream", serializedByteStream, Ar.Versions))
            {
                CompressedTrackOffsets            = tempAr.ReadArray <int>(compressedTrackOffsetsNum);
                CompressedScaleOffsets.OffsetData = tempAr.ReadArray <int>(compressedScaleOffsetsNum);
                CompressedByteStream = tempAr.ReadBytes(compressedByteStreamNum);
            }

            var curveCodecPath            = Ar.ReadFString();
            var compressedCurveByteStream = Ar.ReadArray <byte>();
        }
Esempio n. 7
0
        }                                                        // UMaterialInterface[]

        public override void Deserialize(FAssetArchive Ar, long validPos)
        {
            base.Deserialize(Ar, validPos);

            var stripDataFlags = Ar.Read <FStripDataFlags>();

            bCooked   = Ar.ReadBoolean();
            BodySetup = new FPackageIndex(Ar);
            if (Ar.Ver >= EUnrealEngineObjectUE4Version.STATIC_MESH_STORE_NAV_COLLISION)
            {
                NavCollision = new FPackageIndex(Ar);
            }

            if (!stripDataFlags.IsEditorDataStripped())
            {
                Log.Warning("Static Mesh with Editor Data not implemented yet");
                Ar.Position = validPos;
                return;
                // if (Ar.Ver < UE4Version.VER_UE4_DEPRECATED_STATIC_MESH_THUMBNAIL_PROPERTIES_REMOVED)
                // {
                //     var dummyThumbnailAngle = Ar.Read<FRotator>();
                //     var dummyThumbnailDistance = Ar.Read<float>();
                // }
                // var highResSourceMeshName = Ar.ReadFString();
                // var highResSourceMeshCRC = Ar.Read<uint>();
            }

            LightingGuid = Ar.Read <FGuid>(); // LocalLightingGuid
            Sockets      = Ar.ReadArray(() => new FPackageIndex(Ar));
            RenderData   = new FStaticMeshRenderData(Ar, bCooked);

            if (bCooked && Ar.Game is >= EGame.GAME_UE4_20 and < EGame.GAME_UE5_0)
            {
                var bHasOccluderData = Ar.ReadBoolean();
                if (bHasOccluderData)
                {
                    Ar.ReadArray <FVector>(); // Vertices
                    Ar.ReadArray <ushort>();  // Indices
                }
            }

            if (Ar.Game >= EGame.GAME_UE4_14)
            {
                var bHasSpeedTreeWind = Ar.ReadBoolean();
                if (bHasSpeedTreeWind)
                {
                    Ar.Position = validPos;
                    return;
                }

                if (FEditorObjectVersion.Get(Ar) >= FEditorObjectVersion.Type.RefactorMeshEditorMaterials)
                {
                    // UE4.14+ - "Materials" are deprecated, added StaticMaterials
                    StaticMaterials = Ar.ReadArray(() => new FStaticMaterial(Ar));
                }
            }

            if (StaticMaterials is { Length : > 0 })
Esempio n. 8
0
        public override void Deserialize(FAssetArchive Ar, long validPos)
        {
            base.Deserialize(Ar, validPos);

            const int StripVertexBufferFlag = 1;
            var       stripData             = new FStripDataFlags(Ar);

            Bounds = Ar.Read <FBoxSphereBounds>();

            Vectors = Ar.ReadBulkArray <FVector>();
            Points  = Ar.ReadBulkArray <FVector>();
            Nodes   = Ar.ReadBulkArray <FBspNode>();

            if (Ar.Ver < EUnrealEngineObjectUE4Version.BSP_UNDO_FIX)
            {
                var surfsOwner = new FPackageIndex(Ar);
                Surfs = Ar.ReadArray(() => new FBspSurf(Ar));
            }
            else
            {
                Surfs = Ar.ReadArray(() => new FBspSurf(Ar));
            }
            Verts = Ar.ReadBulkArray <FVert>();

            NumSharedSides = Ar.Read <int>();
            if (Ar.Ver < EUnrealEngineObjectUE4Version.REMOVE_ZONES_FROM_MODEL)
            {
                var dummyZones = Ar.ReadArray <FZoneProperties>();
            }

            var bHasEditorOnlyData = !Ar.IsFilterEditorOnly || Ar.Ver < EUnrealEngineObjectUE4Version.REMOVE_UNUSED_UPOLYS_FROM_UMODEL;

            if (bHasEditorOnlyData)
            {
                var dummyPolys = new FPackageIndex(Ar);
                Ar.SkipBulkArrayData(); // DummyLeafHulls
                Ar.SkipBulkArrayData(); // DummyLeaves
            }

            RootOutside = Ar.ReadBoolean();
            Linked      = Ar.ReadBoolean();

            if (Ar.Ver < EUnrealEngineObjectUE4Version.REMOVE_ZONES_FROM_MODEL)
            {
                var dummyPortalNodes = Ar.ReadBulkArray <int>();
            }

            NumUniqueVertices = Ar.Read <uint>();

            if (!stripData.IsEditorDataStripped() || !stripData.IsClassDataStripped(StripVertexBufferFlag))
            {
                VertexBuffer = new FModelVertexBuffer(Ar);
            }

            LightingGuid      = Ar.Read <FGuid>();
            LightmassSettings = Ar.ReadArray(() => new FLightmassPrimitiveSettings(Ar));
        }
Esempio n. 9
0
        public override void Deserialize(FAssetArchive Ar, long validPos)
        {
            base.Deserialize(Ar, validPos);
            bHasVertexColors       = GetOrDefault <bool>(nameof(bHasVertexColors));
            NumVertexColorChannels = GetOrDefault <byte>(nameof(NumVertexColorChannels));

            var stripDataFlags = Ar.Read <FStripDataFlags>();

            ImportedBounds    = Ar.Read <FBoxSphereBounds>();
            Materials         = Ar.ReadArray(() => new FSkeletalMaterial(Ar));
            ReferenceSkeleton = new FReferenceSkeleton(Ar);

            if (FSkeletalMeshCustomVersion.Get(Ar) < FSkeletalMeshCustomVersion.Type.SplitModelAndRenderData)
            {
                LODModels = Ar.ReadArray(() => new FStaticLODModel(Ar, bHasVertexColors));
            }
            else
            {
                if (!stripDataFlags.IsEditorDataStripped())
                {
                    LODModels = Ar.ReadArray(() => new FStaticLODModel(Ar, bHasVertexColors));
                }

                var bCooked = Ar.ReadBoolean();
                if (Ar.Game >= EGame.GAME_UE4_27)
                {
                    var minMobileLODIdx = Ar.Read <int>();
                }

                if (bCooked && LODModels == null)
                {
                    LODModels = new FStaticLODModel[Ar.Read <int>()];
                    for (var i = 0; i < LODModels.Length; i++)
                    {
                        LODModels[i] = new FStaticLODModel();
                        LODModels[i].SerializeRenderItem(Ar, bHasVertexColors, NumVertexColorChannels);
                    }

                    if (Ar.Game >= EGame.GAME_UE4_24)
                    {
                        var numInlinedLODs     = Ar.Read <byte>();
                        var numNonOptionalLODs = Ar.Read <byte>();
                    }
                }
            }

            if (Ar.Ver < UE4Version.VER_UE4_REFERENCE_SKELETON_REFACTOR)
            {
                var length = Ar.Read <int>();
                Ar.Position += 12 * length; // TMap<FName, int32> DummyNameIndexMap
            }

            var dummyObjs = Ar.ReadArray(() => new FPackageIndex(Ar));
        }
Esempio n. 10
0
 public override void Deserialize(FAssetArchive Ar, long validPos)
 {
     base.Deserialize(Ar, validPos);
     Actors                         = Ar.ReadArray(() => new FPackageIndex(Ar));
     URL                            = new FURL(Ar);
     Model                          = new FPackageIndex(Ar);
     ModelComponents                = Ar.ReadArray(() => new FPackageIndex(Ar));
     LevelScriptActor               = new FPackageIndex(Ar);
     NavListStart                   = new FPackageIndex(Ar);
     NavListEnd                     = new FPackageIndex(Ar);
     PrecomputedVisibilityHandler   = new FPrecomputedVisibilityHandler(Ar);
     PrecomputedVolumeDistanceField = new FPrecomputedVolumeDistanceField(Ar);
 }
Esempio n. 11
0
 public FMovieSceneSegment(FAssetArchive Ar)
 {
     Range       = Ar.Read <TRange <FFrameNumber> >();
     ID          = Ar.Read <FMovieSceneSegmentIdentifier>();
     bAllowEmpty = Ar.ReadBoolean();
     Impls       = Ar.ReadArray <FSectionEvaluationData>();
 }
Esempio n. 12
0
        public override void Deserialize(FAssetArchive Ar, long validPos)
        {
            base.Deserialize(Ar, validPos);
            SuperStruct = new FPackageIndex(Ar);
            if (Ar.Game == EGame.GAME_SOD2)
            {
                Ar.Position += 4; //var someScriptImport = new FPackageIndex(Ar);
            }

            if (FFrameworkObjectVersion.Get(Ar) < FFrameworkObjectVersion.Type.RemoveUField_Next)
            {
                var firstChild = new FPackageIndex(Ar);
                Children = firstChild.IsNull ? Array.Empty <FPackageIndex>() : new[] { firstChild };
            }
            else
            {
                Children = Ar.ReadArray(() => new FPackageIndex(Ar));
            }

            if (FCoreObjectVersion.Get(Ar) >= FCoreObjectVersion.Type.FProperties)
            {
                DeserializeProperties(Ar);
            }

            var bytecodeBufferSize   = Ar.Read <int>();
            var serializedScriptSize = Ar.Read <int>();

            Ar.Position += serializedScriptSize; // should we read the bytecode some day?
        }
Esempio n. 13
0
        public override void Deserialize(FAssetArchive Ar, long validPos)
        {
            base.Deserialize(Ar, validPos);
            SuperStruct = new FPackageIndex(Ar);
            if (FFrameworkObjectVersion.Get(Ar) < FFrameworkObjectVersion.Type.RemoveUField_Next)
            {
                var firstChild = new FPackageIndex(Ar);
                Children = firstChild.IsNull ? Array.Empty<FPackageIndex>() : new[] { firstChild };
            }
            else
            {
                Children = Ar.ReadArray(() => new FPackageIndex(Ar));
            }

            if (FCoreObjectVersion.Get(Ar) >= FCoreObjectVersion.Type.FProperties)
            {
                DeserializeProperties(Ar);
            }

            var bytecodeBufferSize = Ar.Read<int>();
            var serializedScriptSize = Ar.Read<int>();
            if (Ar.Owner.Provider?.ReadScriptData == true)
            {
                Script = Ar.ReadBytes(serializedScriptSize);
            }
            else
            {
                Ar.Position += serializedScriptSize;
            }
        }
Esempio n. 14
0
 public FCurveMetaData(FAssetArchive Ar, FAnimPhysObjectVersion.Type FrwAniVer)
 {
     Type        = new FAnimCurveType(Ar);
     LinkedBones = Ar.ReadArray(Ar.Read <int>(), () => Ar.ReadFName());
     if (FrwAniVer >= FAnimPhysObjectVersion.Type.AddLODToCurveMetaData)
     {
         MaxLOD = Ar.Read <byte>();
     }
 }
Esempio n. 15
0
 public FPrecomputedVolumeDistanceField(FAssetArchive Ar)
 {
     VolumeMaxDistance = Ar.Read <float>();
     VolumeBox         = Ar.Read <FBox>();
     VolumeSizeX       = Ar.Read <int>();
     VolumeSizeY       = Ar.Read <int>();
     VolumeSizeZ       = Ar.Read <int>();
     Data = Ar.ReadArray <FColor>();
 }
Esempio n. 16
0
        public override void Deserialize(FAssetArchive Ar, long validPos)
        {
            base.Deserialize(Ar, validPos);
            // UObject Properties
            IsStreamed      = GetOrDefault <bool>(nameof(IsStreamed));
            UseDeviceMemory = GetOrDefault <bool>(nameof(UseDeviceMemory));

            DataChunks = Ar.ReadArray(() => new FAkMediaDataChunk(Ar));
        }
Esempio n. 17
0
 public FPrecomputedVisibilityHandler(FAssetArchive Ar)
 {
     PrecomputedVisibilityCellBucketOriginXY = Ar.Read <FVector2D>();
     PrecomputedVisibilityCellSizeXY         = Ar.Read <float>();
     PrecomputedVisibilityCellSizeZ          = Ar.Read <float>();
     PrecomputedVisibilityCellBucketSizeXY   = Ar.Read <int>();
     PrecomputedVisibilityNumCellBuckets     = Ar.Read <int>();
     PrecomputedVisibilityCellBuckets        = Ar.ReadArray(() => new FPrecomputedVisibilityBucket(Ar));
 }
Esempio n. 18
0
        public override void Deserialize(FAssetArchive Ar, long validPos)
        {
            base.Deserialize(Ar, validPos);
            var stripData = Ar.Read <FStripDataFlags>();

            if (!stripData.IsDataStrippedForServer())
            {
                MorphLODModels = Ar.ReadArray(() => new FMorphTargetLODModel(Ar));
            }
        }
Esempio n. 19
0
 protected void DeserializeProperties(FAssetArchive Ar)
 {
     ChildProperties = Ar.ReadArray(() =>
     {
         var propertyTypeName = Ar.ReadFName();
         var prop             = FField.Construct(propertyTypeName);
         prop.Deserialize(Ar);
         return(prop);
     });
 }
Esempio n. 20
0
        public override void Deserialize(FAssetArchive Ar, long validPos)
        {
            base.Deserialize(Ar, validPos);
            SuperStruct = new FPackageIndex(Ar);
            Children    = Ar.ReadArray(() => new FPackageIndex(Ar));
            DeserializeProperties(Ar);
            var bytecodeBufferSize   = Ar.Read <int>();
            var serializedScriptSize = Ar.Read <int>();

            Ar.Position += serializedScriptSize; // should we read the bytecode some day?
        }
Esempio n. 21
0
 public FRigVMRegisterOffset(FAssetArchive Ar)
 {
     Segments           = Ar.ReadArray <int>();
     Type               = Ar.Read <ERigVMRegisterType>();
     CPPType            = Ar.ReadFName();
     ScriptStruct       = new FPackageIndex(Ar);
     ElementSize        = Ar.Read <ushort>();
     ParentScriptStruct = new FPackageIndex(Ar);
     CachedSegmentPath  = Ar.ReadFString();
     ArrayIndex         = Ar.Read <int>();
 }
Esempio n. 22
0
        public FReflectionCaptureData(FAssetArchive Ar)
        {
            CubemapSize       = Ar.Read <int>();
            AverageBrightness = Ar.Read <float>();

            if (FRenderingObjectVersion.Get(Ar) >= FRenderingObjectVersion.Type.StoreReflectionCaptureBrightnessForCooking)
            {
                Brightness = Ar.Read <float>();
            }

            FullHDRCapturedData = Ar.ReadArray <byte>(); // Can also be stripped, but still a byte[]

            if (FMobileObjectVersion.Get(Ar) >= FMobileObjectVersion.Type.StoreReflectionCaptureCompressedMobile)
            {
                EncodedCaptureData = new FPackageIndex(Ar);
            }
            else
            {
                var _ = Ar.ReadArray <byte>();
            }
        }
Esempio n. 23
0
        public override void Deserialize(FAssetArchive Ar, long validPos)
        {
            base.Deserialize(Ar, validPos);
            // UObject Properties
            BoneTree        = GetOrDefault <FBoneNode[]>(nameof(BoneTree));
            VirtualBoneGuid = GetOrDefault <FGuid>(nameof(VirtualBoneGuid));

            if (Ar.Ver >= EUnrealEngineObjectUE4Version.REFERENCE_SKELETON_REFACTOR)
            {
                ReferenceSkeleton = new FReferenceSkeleton(Ar);
            }

            if (Ar.Ver >= EUnrealEngineObjectUE4Version.FIX_ANIMATIONBASEPOSE_SERIALIZATION)
            {
                var numOfRetargetSources = Ar.Read <int>();
                AnimRetargetSources = new Dictionary <FName, FReferencePose>(numOfRetargetSources);
                for (var i = 0; i < numOfRetargetSources; i++)
                {
                    var name = Ar.ReadFName();
                    var pose = new FReferencePose(Ar);
                    ReferenceSkeleton.AdjustBoneScales(pose.ReferencePose);
                    AnimRetargetSources[name] = pose;
                }
            }
            else
            {
                Log.Warning(""); // not sure what to put here
            }

            if (Ar.Ver >= EUnrealEngineObjectUE4Version.SKELETON_GUID_SERIALIZATION)
            {
                Guid = Ar.Read <FGuid>();
            }

            if (Ar.Ver >= EUnrealEngineObjectUE4Version.SKELETON_ADD_SMARTNAMES)
            {
                var mapLength = Ar.Read <int>();
                NameMappings = new Dictionary <FName, FSmartNameMapping>(mapLength);
                for (var i = 0; i < mapLength; i++)
                {
                    NameMappings[Ar.ReadFName()] = new FSmartNameMapping(Ar);
                }
            }

            if (FAnimObjectVersion.Get(Ar) >= FAnimObjectVersion.Type.StoreMarkerNamesOnSkeleton)
            {
                var stripDataFlags = Ar.Read <FStripDataFlags>();
                if (!stripDataFlags.IsEditorDataStripped())
                {
                    ExistingMarkerNames = Ar.ReadArray(Ar.ReadFName);
                }
            }
        }
Esempio n. 24
0
        public FSkelMeshChunk(FAssetArchive Ar)
        {
            var stripDataFlags = Ar.Read <FStripDataFlags>();

            if (!stripDataFlags.IsDataStrippedForServer())
            {
                BaseVertexIndex = Ar.Read <int>();
            }

            if (!stripDataFlags.IsEditorDataStripped())
            {
                RigidVertices = Ar.ReadArray(() => new FRigidVertex(Ar));
                SoftVertices  = Ar.ReadArray(() => new FSoftVertex(Ar));
            }

            BoneMap           = Ar.ReadArray <ushort>();
            NumRigidVertices  = Ar.Read <int>();
            NumSoftVertices   = Ar.Read <int>();
            MaxBoneInfluences = Ar.Read <int>();
            HasClothData      = false;

            if (Ar.Ver >= UE4Version.VER_UE4_APEX_CLOTH)
            {
                // Physics data, drop
                var clothMappingData = Ar.ReadArray(() => new FApexClothPhysToRenderVertData(Ar));
                Ar.ReadArray <FVector>(); // PhysicalMeshVertices
                Ar.ReadArray <FVector>(); // PhysicalMeshNormals
                Ar.Position += 4;         // CorrespondClothAssetIndex, ClothAssetSubmeshIndex
                HasClothData = clothMappingData.Length > 0;
            }
        }
Esempio n. 25
0
        public void SerializeRenderItem(FAssetArchive Ar)
        {
            var stripDataFlags = Ar.Read <FStripDataFlags>();

            MaterialIndex = Ar.Read <short>();
            BaseIndex     = Ar.Read <int>();
            NumTriangles  = Ar.Read <int>();

            var bRecomputeTangent = Ar.ReadBoolean();

            if (FRecomputeTangentCustomVersion.Get(Ar) >= FRecomputeTangentCustomVersion.Type.RecomputeTangentVertexColorMask)
            {
                Ar.Position += 1;
            }

            bCastShadow     = Ar.ReadBoolean();
            BaseVertexIndex = Ar.Read <uint>();

            var clothMappingData = Ar.ReadArray(() => new FApexClothPhysToRenderVertData(Ar));

            HasClothData = clothMappingData.Length > 0;

            BoneMap           = Ar.ReadArray <ushort>();
            NumVertices       = Ar.Read <int>();
            MaxBoneInfluences = Ar.Read <int>();

            var correspondClothAssetIndex = Ar.Read <short>();
            var clothingData = Ar.Read <FClothingSectionData>();

            if (Ar.Game < EGame.GAME_UE4_23 || !stripDataFlags.IsClassDataStripped(1)) // DuplicatedVertices, introduced in UE4.23
            {
                Ar.SkipFixedArray(4);
                Ar.SkipFixedArray(8);
            }
            bDisabled = Ar.ReadBoolean();
            if (Ar.Game == EGame.GAME_ROGUECOMPANY)
            {
                Ar.Position += 4;
            }
        }
        public FVirtualTextureBuiltData(FAssetArchive Ar, int firstMip)
        {
            bool bStripMips = firstMip > 0;
            var  bCooked    = Ar.ReadBoolean();

            NumLayers      = Ar.Read <uint>();
            WidthInBlocks  = Ar.Read <uint>();
            HeightInBlocks = Ar.Read <uint>();
            TileSize       = Ar.Read <uint>();
            TileBorderSize = Ar.Read <uint>();
            if (!bStripMips)
            {
                NumMips           = Ar.Read <uint>();
                Width             = Ar.Read <uint>();
                Height            = Ar.Read <uint>();
                TileIndexPerChunk = Ar.ReadArray <uint>();
                TileIndexPerMip   = Ar.ReadArray <uint>();
                TileOffsetInChunk = Ar.ReadArray <uint>();
            }

            LayerTypes = Ar.ReadArray((int)NumLayers, () => (EPixelFormat)Enum.Parse(typeof(EPixelFormat), Ar.ReadFString()));
            Chunks     = Ar.ReadArray(() => new FVirtualTextureDataChunk(Ar, NumLayers));
        }
        public override void Deserialize(FAssetArchive Ar, long validPos)
        {
            base.Deserialize(Ar, validPos);

            if (FRenderingObjectVersion.Get(Ar) < FRenderingObjectVersion.Type.MovedParticleCutoutsToRequiredModule)
            {
                return;
            }
            var bCooked = Ar.ReadBoolean();

            if (bCooked)
            {
                BoundingGeometry = Ar.ReadArray <FVector2D>();
            }
        }
Esempio n. 28
0
        public FTexturePlatformData(FAssetArchive Ar)
        {
            SizeX     = Ar.Read <int>();
            SizeY     = Ar.Read <int>();
            NumSlices = Ar.Read <int>();

            PixelFormat = Ar.ReadFString();

            FirstMip = Ar.Read <int>();       // only for cooked, but we don't read FTexturePlatformData for non-cooked textures
            Mips     = Ar.ReadArray(() => new FTexture2DMipMap(Ar));

            if (Ar.Game >= EGame.GAME_UE4_23) // bIsVirtual
            {
                bIsVirtual = Ar.ReadBoolean();
                if (bIsVirtual)
                {
                    VTData = new FVirtualTextureBuiltData(Ar, FirstMip);
                }
            }
        }
Esempio n. 29
0
        public override void Deserialize(FAssetArchive Ar, long validPos)
        {
            base.Deserialize(Ar, validPos);

            // serialize the function map
            FuncMap = new Dictionary <FName, FPackageIndex>();
            var funcMapNum = Ar.Read <int>();

            for (var i = 0; i < funcMapNum; i++)
            {
                FuncMap[Ar.ReadFName()] = new FPackageIndex(Ar);
            }

            // Class flags first.
            ClassFlags = Ar.Read <uint>();

            // Variables.
            if (Ar.Game == EGame.GAME_StarWarsJediFallenOrder)
            {
                Ar.Position += 4;
            }
            ClassWithin     = new FPackageIndex(Ar);
            ClassConfigName = Ar.ReadFName();

            ClassGeneratedBy = new FPackageIndex(Ar);

            // Load serialized interface classes
            Interfaces = Ar.ReadArray(() => new FImplementedInterface(Ar));

            var bDeprecatedForceScriptOrder = Ar.ReadBoolean();
            var dummy = Ar.ReadFName();

            if (Ar.Ver >= EUnrealEngineObjectUE4Version.ADD_COOKED_TO_UCLASS)
            {
                bCooked = Ar.ReadBoolean();
            }

            // Defaults.
            ClassDefaultObject = new FPackageIndex(Ar);
        }
Esempio n. 30
0
        public override void Deserialize(FAssetArchive Ar, long validPos)
        {
            base.Deserialize(Ar, validPos);

            // serialize the function map
            FuncMap = new Dictionary <FName, FPackageIndex>();
            var funcMapNum = Ar.Read <int>();

            for (var i = 0; i < funcMapNum; i++)
            {
                FuncMap[Ar.ReadFName()] = new FPackageIndex(Ar);
            }

            // Class flags first.
            ClassFlags = Ar.Read <uint>();

            // Variables.
            ClassWithin     = new FPackageIndex(Ar);
            ClassConfigName = Ar.ReadFName();

            ClassGeneratedBy = new FPackageIndex(Ar);

            // Load serialized interface classes
            Interfaces = Ar.ReadArray(() => new FImplementedInterface(Ar));

            var bDeprecatedScriptOrder = Ar.ReadBoolean();
            var dummy = Ar.ReadFName();

            if ((int)Ar.Ver >= 241 /*VER_UE4_ADD_COOKED_TO_UCLASS*/)
            {
                bCooked = Ar.ReadBoolean();
            }

            // Defaults.
            ClassDefaultObject = new FPackageIndex(Ar);
        }