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)); }
private static void AdjustSequenceBySkeleton(FReferenceSkeleton skeleton, FTransform[] transforms, CAnimSequence anim) { if (skeleton.FinalRefBoneInfo.Length == 0 || skeleton.FinalRefBoneInfo.Length != transforms.Length) { return; } for (var trackIndex = 0; trackIndex < anim.Tracks.Count; trackIndex++) { var track = anim.Tracks[trackIndex]; var boneScale = skeleton.GetBoneScale(transforms, trackIndex); if (Math.Abs(boneScale.X - 1.0f) > 0.001f || Math.Abs(boneScale.Y - 1.0f) > 0.001f || Math.Abs(boneScale.Z - 1.0f) > 0.001f) { for (int keyIndex = 0; keyIndex < track.KeyPos.Length; keyIndex++) { // Scale translation by accumulated bone scale value track.KeyPos[keyIndex].Scale(boneScale); } } } }