Esempio n. 1
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. 2
0
        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);
                    }
                }
            }
        }