public override void Deserialize(FAssetArchive Ar, long validPos) { base.Deserialize(Ar, validPos); var bCooked = false; if (FFortniteMainBranchObjectVersion.Get(Ar) >= FFortniteMainBranchObjectVersion.Type.SerializeInstancedStaticMeshRenderData || FEditorObjectVersion.Get(Ar) >= FEditorObjectVersion.Type.SerializeInstancedStaticMeshRenderData) { bCooked = Ar.ReadBoolean(); } PerInstanceSMData = Ar.ReadBulkArray(() => new FInstancedStaticMeshInstanceData(Ar)); if (FRenderingObjectVersion.Get(Ar) >= FRenderingObjectVersion.Type.PerInstanceCustomData) { PerInstanceSMCustomData = Ar.ReadBulkArray(Ar.Read <float>); } if (bCooked && (FFortniteMainBranchObjectVersion.Get(Ar) >= FFortniteMainBranchObjectVersion.Type.SerializeInstancedStaticMeshRenderData || FEditorObjectVersion.Get(Ar) >= FEditorObjectVersion.Type.SerializeInstancedStaticMeshRenderData)) { var renderDataSizeBytes = Ar.Read <long>(); if (renderDataSizeBytes > 0) { // idk what to do here... But it fixes the warnings ЪциРђЇ Ar.Position = validPos; } } }
public FSkeletalMaterial(FAssetArchive Ar) { Material = new FPackageIndex(Ar).ResolvedObject; if (FEditorObjectVersion.Get(Ar) >= FEditorObjectVersion.Type.RefactorMeshEditorMaterials) { MaterialSlotName = Ar.ReadFName(); var bSerializeImportedMaterialSlotName = !Ar.Owner.HasFlags(EPackageFlags.PKG_FilterEditorOnly); if (FCoreObjectVersion.Get(Ar) >= FCoreObjectVersion.Type.SkeletalMaterialEditorDataStripping) { bSerializeImportedMaterialSlotName = Ar.ReadBoolean(); } if (bSerializeImportedMaterialSlotName) { ImportedMaterialSlotName = Ar.ReadFName(); } } else { if (Ar.Ver >= EUnrealEngineObjectUE4Version.MOVE_SKELETALMESH_SHADOWCASTING) { Ar.Position += 4; } if (FRecomputeTangentCustomVersion.Get(Ar) >= FRecomputeTangentCustomVersion.Type.RuntimeRecomputeTangent) { var bRecomputeTangent = Ar.ReadBoolean(); } } if (FRenderingObjectVersion.Get(Ar) >= FRenderingObjectVersion.Type.TextureStreamingMeshUVChannelData) { UVChannelData = new FMeshUVChannelInfo(Ar); } }
public FSkeletalMaterial(FAssetArchive Ar) { Material = Ar.ReadObject <UMaterialInterface>(); if (FEditorObjectVersion.Get(Ar) >= FEditorObjectVersion.Type.RefactorMeshEditorMaterials) { MaterialSlotName = Ar.ReadFName(); var bSerializeImportedMaterialSlotName = false; if (FCoreObjectVersion.Get(Ar) >= FCoreObjectVersion.Type.SkeletalMaterialEditorDataStripping) { bSerializeImportedMaterialSlotName = Ar.ReadBoolean(); } if (bSerializeImportedMaterialSlotName) { ImportedMaterialSlotName = Ar.ReadFName(); } } else { if (Ar.Ver >= UE4Version.VER_UE4_MOVE_SKELETALMESH_SHADOWCASTING) { Ar.Position += 4; } if (FRecomputeTangentCustomVersion.Get(Ar) >= FRecomputeTangentCustomVersion.Type.RuntimeRecomputeTangent) { Ar.Position += 4; } } if (FRenderingObjectVersion.Get(Ar) >= FRenderingObjectVersion.Type.TextureStreamingMeshUVChannelData) { UVChannelData = new FMeshUVChannelInfo(Ar); } }
} // 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 None(FAssetArchive Ar) { if (FEditorObjectVersion.Get(Ar) >= FEditorObjectVersion.Type.CultureInvariantTextSerializationKeyStability) { var bHasCultureInvariantString = Ar.ReadBoolean(); if (bHasCultureInvariantString) { CultureInvariantString = Ar.ReadFString(); } } }
public FFontData(FAssetArchive Ar) { if (FEditorObjectVersion.Get(Ar) < FEditorObjectVersion.Type.AddedFontFaceAssets) { return; } var bIsCooked = Ar.ReadBoolean(); if (bIsCooked) { LocalFontFaceAsset = new FPackageIndex(Ar); if (LocalFontFaceAsset == null) { FontFilename = Ar.ReadFString(); Hinting = Ar.Read <EFontHinting>(); LoadingPolicy = Ar.Read <EFontLoadingPolicy>(); } SubFaceIndex = Ar.Read <int>(); } }
public FSkelMeshSection(FAssetArchive Ar) : this() { var stripDataFlags = Ar.Read <FStripDataFlags>(); var skelMeshVer = FSkeletalMeshCustomVersion.Get(Ar); MaterialIndex = Ar.Read <short>(); if (skelMeshVer < FSkeletalMeshCustomVersion.Type.CombineSectionWithChunk) { Ar.Position += 2; // ChunkIndex } if (!stripDataFlags.IsDataStrippedForServer()) { BaseIndex = Ar.Read <int>(); NumTriangles = Ar.Read <int>(); } if (skelMeshVer < FSkeletalMeshCustomVersion.Type.RemoveTriangleSorting) { Ar.Position += 1; // TEnumAsByte<ETriangleSortOption> } if (Ar.Ver >= UE4Version.VER_UE4_APEX_CLOTH) { if (skelMeshVer < FSkeletalMeshCustomVersion.Type.DeprecateSectionDisabledFlag) { bDisabled = Ar.ReadBoolean(); } if (skelMeshVer < FSkeletalMeshCustomVersion.Type.RemoveDuplicatedClothingSections) { CorrespondClothSectionIndex = Ar.Read <short>(); } } if (Ar.Ver >= UE4Version.VER_UE4_APEX_CLOTH_LOD) { Ar.Position += 1; // bEnableClothLOD_DEPRECATED } if (FRecomputeTangentCustomVersion.Get(Ar) >= FRecomputeTangentCustomVersion.Type.RuntimeRecomputeTangent) { Ar.Position += 4; // bRecomputeTangent } if (FRecomputeTangentCustomVersion.Get(Ar) >= FRecomputeTangentCustomVersion.Type.RecomputeTangentVertexColorMask) { Ar.Position += 1; // RecomputeTangentsVertexMaskChannel } if (FEditorObjectVersion.Get(Ar) >= FEditorObjectVersion.Type.RefactorMeshEditorMaterials) { bCastShadow = Ar.ReadBoolean(); } HasClothData = false; if (skelMeshVer >= FSkeletalMeshCustomVersion.Type.CombineSectionWithChunk) { if (!stripDataFlags.IsDataStrippedForServer()) { BaseVertexIndex = Ar.Read <uint>(); } if (!stripDataFlags.IsEditorDataStripped()) { if (skelMeshVer < FSkeletalMeshCustomVersion.Type.CombineSoftAndRigidVerts) { Ar.ReadArray(() => new FRigidVertex(Ar)); // RigidVertices } SoftVertices = Ar.ReadArray(() => new FSoftVertex(Ar)); } BoneMap = Ar.ReadArray <ushort>(); if (skelMeshVer >= FSkeletalMeshCustomVersion.Type.SaveNumVertices) { NumVertices = Ar.Read <int>(); } if (skelMeshVer < FSkeletalMeshCustomVersion.Type.CombineSoftAndRigidVerts) { Ar.Position += 8; // NumRigidVerts, NumSoftVerts } MaxBoneInfluences = Ar.Read <int>(); FVector[] physicalMeshVertices, physicalMeshNormals; var clothMappingData = Ar.ReadArray(() => new FApexClothPhysToRenderVertData(Ar)); if (skelMeshVer < FSkeletalMeshCustomVersion.Type.RemoveDuplicatedClothingSections) { physicalMeshVertices = Ar.ReadArray <FVector>(); physicalMeshNormals = Ar.ReadArray <FVector>(); } short clothAssetSubmeshIndex; var correspondClothAssetIndex = Ar.Read <short>(); if (skelMeshVer < FSkeletalMeshCustomVersion.Type.NewClothingSystemAdded) { clothAssetSubmeshIndex = Ar.Read <short>(); } else { // UE4.16+ Ar.Read <FClothingSectionData>(); } HasClothData = clothMappingData.Length > 0; if (FOverlappingVerticesCustomVersion.Get(Ar) >= FOverlappingVerticesCustomVersion.Type.DetectOVerlappingVertices) { var size = Ar.Read <int>(); var overlappingVertices = new Dictionary <int, int[]>(); for (var i = 0; i < size; i++) { overlappingVertices[i] = Ar.ReadArray <int>(); } } if (FReleaseObjectVersion.Get(Ar) >= FReleaseObjectVersion.Type.AddSkeletalMeshSectionDisable) { bDisabled = Ar.ReadBoolean(); } if (FSkeletalMeshCustomVersion.Get(Ar) >= FSkeletalMeshCustomVersion.Type.SectionIgnoreByReduceAdded) { GenerateUpToLodIndex = Ar.Read <int>(); } } }
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 >= UE4Version.VER_UE4_STATIC_MESH_STORE_NAV_COLLISION) { NavCollision = new FPackageIndex(Ar); } if (!stripDataFlags.IsEditorDataStripped()) { throw new NotImplementedException("Static Mesh with Editor Data not implemented yet"); // 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 >= EGame.GAME_UE4_20) { var hasOccluderData = Ar.ReadBoolean(); if (hasOccluderData) { Ar.ReadArray <FVector>(); // Vertices Ar.ReadArray <ushort>(); // Indics } } if (Ar.Game >= EGame.GAME_UE4_14) { var hasSpeedTreeWind = Ar.ReadBoolean(); if (hasSpeedTreeWind) { Ar.Seek(validPos, SeekOrigin.Begin); return; } if (FEditorObjectVersion.Get(Ar) >= FEditorObjectVersion.Type.RefactorMeshEditorMaterials) { // UE4.14+ - "Materials" are deprecated, added StaticMaterials StaticMaterials = Ar.ReadArray(() => new FStaticMaterial(Ar)); } } if (StaticMaterials != null && StaticMaterials.Length != 0) { Materials = new Lazy <UMaterialInterface?> [StaticMaterials.Length]; for (var i = 0; i < Materials.Length; i++) { Materials[i] = StaticMaterials[i].MaterialInterface; } } }