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)); }
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(); } }
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); }
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>); }
// 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>(); }
} // 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 })
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)); }
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)); }
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); }
public FMovieSceneSegment(FAssetArchive Ar) { Range = Ar.Read <TRange <FFrameNumber> >(); ID = Ar.Read <FMovieSceneSegmentIdentifier>(); bAllowEmpty = Ar.ReadBoolean(); Impls = Ar.ReadArray <FSectionEvaluationData>(); }
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? }
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; } }
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>(); } }
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>(); }
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)); }
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)); }
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)); } }
protected void DeserializeProperties(FAssetArchive Ar) { ChildProperties = Ar.ReadArray(() => { var propertyTypeName = Ar.ReadFName(); var prop = FField.Construct(propertyTypeName); prop.Deserialize(Ar); return(prop); }); }
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? }
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>(); }
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>(); } }
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); } } }
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; } }
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>(); } }
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); } } }
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); }
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); }