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); }
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) { }
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); }