예제 #1
0
        public NewHavokAnimation(NewAnimSkeleton skeleton, HKX.HKADefaultAnimatedReferenceFrame refFrame, HKX.HKAAnimationBinding binding)
        {
            Skeleton = skeleton;
            if (refFrame != null)
            {
                RootMotionFrames = new Vector4[refFrame.ReferenceFrameSamples.Size];
                for (int i = 0; i < refFrame.ReferenceFrameSamples.Size; i++)
                {
                    RootMotionFrames[i] = new Vector4(
                        refFrame.ReferenceFrameSamples[i].Vector.X,
                        refFrame.ReferenceFrameSamples[i].Vector.Y,
                        refFrame.ReferenceFrameSamples[i].Vector.Z,
                        refFrame.ReferenceFrameSamples[i].Vector.W);
                }
            }

            lock (_lock_boneMatrixStuff)
            {
                blendableTransforms = new List <NewBlendableTransform>();
                for (int i = 0; i < skeleton.HkxSkeleton.Count; i++)
                {
                    blendableTransforms.Add(NewBlendableTransform.Identity);
                }
            }

            BlendHint = binding.BlendHint;
        }
        public NewHavokAnimation_SplineCompressed(NewAnimSkeleton skeleton, HKX.HKADefaultAnimatedReferenceFrame refFrame, HKX.HKAAnimationBinding binding, HKX.HKASplineCompressedAnimation anim)
            : base(skeleton, refFrame, binding)
        {
            Duration   = anim.Duration;// Math.Max(anim.Duration, anim.FrameDuration * anim.FrameCount);
            FrameCount = anim.FrameCount;

            FrameDuration = anim.FrameDuration;

            BlockCount        = anim.BlockCount;
            NumFramesPerBlock = anim.FramesPerBlock - 1;

            HkxBoneIndexToTransformTrackMap = new int[skeleton.HkxSkeleton.Count];
            TransformTrackIndexToHkxBoneMap = new int[binding.TransformTrackToBoneIndices.Size];

            for (int i = 0; i < binding.TransformTrackToBoneIndices.Size; i++)
            {
                TransformTrackIndexToHkxBoneMap[i] = -1;
            }

            for (int i = 0; i < skeleton.HkxSkeleton.Count; i++)
            {
                HkxBoneIndexToTransformTrackMap[i] = -1;
            }

            for (int i = 0; i < binding.TransformTrackToBoneIndices.Size; i++)
            {
                short boneIndex = binding.TransformTrackToBoneIndices[i].data;
                if (boneIndex >= 0)
                {
                    HkxBoneIndexToTransformTrackMap[boneIndex] = i;
                }
                TransformTrackIndexToHkxBoneMap[i] = boneIndex;
            }

            Tracks = Havok.SplineCompressedAnimation.ReadSplineCompressedAnimByteBlock(
                isBigEndian: false, anim.GetData(), anim.TransformTrackCount, anim.BlockCount);
        }
예제 #3
0
 public RootMotionData(HKX.HKADefaultAnimatedReferenceFrame refFrame) : this(refFrame.Up, refFrame.Forward, refFrame.Duration, refFrame.ReferenceFrameSamples.GetArrayData().Elements.Select(hkxVector => hkxVector.Vector).ToArray())
 {
 }
 public NewHavokAnimation_InterleavedUncompressed(string name, NewAnimSkeleton skeleton,
                                                  HKX.HKADefaultAnimatedReferenceFrame refFrame, HKX.HKAAnimationBinding binding, HKX.HKAInterleavedUncompressedAnimation anim, NewAnimationContainer container)
     : base(new HavokAnimationData_InterleavedUncompressed(name, skeleton.OriginalHavokSkeleton, refFrame, binding, anim), skeleton, container)
 {
 }
예제 #5
0
        private byte[] ImportAnimToHKX()
        {
            var importedAnim = ImportAnim();

            byte[] finalHkxDataToImport = null;

            var compressed2010Hkx = importedAnim.WriteToSplineCompressedHKX2010Bytes(ImportConfig.RotationQuantizationType, ImportConfig.RotationTolerance);

            if (GameDataManager.GameType == SoulsAssetPipeline.SoulsGames.DS1R)
            {
                finalHkxDataToImport = HavokDowngrade.UpgradeHkx2010to2015(compressed2010Hkx);
            }
            else if (GameDataManager.GameType == SoulsAssetPipeline.SoulsGames.DS1)
            {
                finalHkxDataToImport = compressed2010Hkx;
            }
            else if (GameDataManager.GameType == SoulsAssetPipeline.SoulsGames.DS3)
            {
                HKX.HKAAnimationBinding          hk_binding = null;
                HKX.HKASplineCompressedAnimation hk_anim    = null;
                HKX.HKASkeleton hk_skeleton = null;
                HKX.HKADefaultAnimatedReferenceFrame hk_refFrame = null;

                var hkx = HKX.Read(compressed2010Hkx);

                foreach (var o in hkx.DataSection.Objects)
                {
                    if (o is HKX.HKASkeleton asSkeleton)
                    {
                        hk_skeleton = asSkeleton;
                    }
                    else if (o is HKX.HKAAnimationBinding asBinding)
                    {
                        hk_binding = asBinding;
                    }
                    else if (o is HKX.HKASplineCompressedAnimation asAnim)
                    {
                        hk_anim = asAnim;
                    }
                    else if (o is HKX.HKADefaultAnimatedReferenceFrame asRefFrame)
                    {
                        hk_refFrame = asRefFrame;
                    }
                }

                var root = new HKX2.hkRootLevelContainer();

                var animBinding = new HKX2.hkaAnimationBinding();

                var anim = new HKX2.hkaSplineCompressedAnimation();

                animBinding.m_animation                    = anim;
                animBinding.m_originalSkeletonName         = hk_binding.OriginalSkeletonName;
                animBinding.m_transformTrackToBoneIndices  = hk_binding.TransformTrackToBoneIndices.GetArrayData().Elements.Select(x => x.data).ToList();
                animBinding.m_floatTrackToFloatSlotIndices = new List <short>();
                animBinding.m_partitionIndices             = new List <short>();
                animBinding.m_blendHint                    = (HKX2.BlendHint)(int) hk_binding.BlendHint;

                anim.m_blockDuration        = hk_anim.BlockDuration;
                anim.m_blockInverseDuration = hk_anim.InverseBlockDuration;
                anim.m_data     = hk_anim.Data.GetArrayData().Elements.Select(x => x.data).ToList();
                anim.m_duration = hk_anim.Duration;
                anim.m_endian   = hk_anim.Endian;

                if (hk_refFrame != null)
                {
                    var rootMotion = new HKX2.hkaDefaultAnimatedReferenceFrame();

                    rootMotion.m_duration = hk_refFrame.Duration;
                    rootMotion.m_forward  = hk_refFrame.Forward;
                    rootMotion.m_referenceFrameSamples = new List <System.Numerics.Vector4>();
                    foreach (var rf in hk_refFrame.ReferenceFrameSamples.GetArrayData().Elements)
                    {
                        rootMotion.m_referenceFrameSamples.Add(rf.Vector);
                    }
                    rootMotion.m_up = hk_refFrame.Up;

                    anim.m_extractedMotion = rootMotion;
                }

                anim.m_frameDuration           = hk_anim.FrameDuration;
                anim.m_maskAndQuantizationSize = (int)hk_anim.MaskAndQuantization;
                anim.m_maxFramesPerBlock       = hk_anim.FramesPerBlock;
                anim.m_numberOfFloatTracks     = hk_anim.FloatTrackCount;
                anim.m_numberOfTransformTracks = hk_anim.TransformTrackCount;
                anim.m_numBlocks         = hk_anim.BlockCount;
                anim.m_numFrames         = hk_anim.FrameCount;
                anim.m_floatBlockOffsets = hk_anim.FloatBlockOffsets.GetArrayData().Elements.Select(b => b.data).ToList();
                anim.m_type             = HKX2.AnimationType.HK_SPLINE_COMPRESSED_ANIMATION;
                anim.m_blockOffsets     = hk_anim.BlockOffsets.GetArrayData().Elements.Select(b => b.data).ToList();
                anim.m_floatOffsets     = new List <uint>();
                anim.m_transformOffsets = new List <uint>();

                //TODO: IMPLEMENT ANNOTATION TRACK READ IN LEGACY HKX TO TRANSFER IT TO HKX2

                //anim.m_annotationTracks = new List<HKX2.hkaAnnotationTrack>();
                //for (int i = 0; i < hk_anim.TransformTrackCount; i++)
                //{
                //    var boneIndex = animBinding.m_transformTrackToBoneIndices[i];
                //    string boneName = boneNames[boneIndex];

                //    anim.m_annotationTracks.Add(new HKX2.hkaAnnotationTrack()
                //    {
                //        m_trackName = boneName,
                //        m_annotations = new List<HKX2.hkaAnnotationTrackAnnotation>(),
                //    });
                //}



                var animContainer = new HKX2.hkaAnimationContainer();

                animContainer.m_attachments = new List <HKX2.hkaBoneAttachment>();
                animContainer.m_skins       = new List <HKX2.hkaMeshBinding>();
                animContainer.m_skeletons   = new List <HKX2.hkaSkeleton>();

                animContainer.m_animations = new List <HKX2.hkaAnimation>();
                animContainer.m_animations.Add(anim);

                animContainer.m_bindings = new List <HKX2.hkaAnimationBinding>();
                animContainer.m_bindings.Add(animBinding);

                root.m_namedVariants = new List <HKX2.hkRootLevelContainerNamedVariant>();
                root.m_namedVariants.Add(new HKX2.hkRootLevelContainerNamedVariant()
                {
                    m_className = "hkaAnimationContainer",
                    m_name      = "Merged Animation Container",
                    m_variant   = animContainer
                });

                using (MemoryStream s2 = new MemoryStream())
                {
                    BinaryWriterEx bw = new BinaryWriterEx(false, s2);
                    var            s  = new HKX2.PackFileSerializer();
                    s.Serialize(root, bw);

                    finalHkxDataToImport = s2.ToArray();
                }
            }

            return(finalHkxDataToImport);
        }