public override NewBlendableTransform GetBlendableTransformOnFrame(int hkxBoneIndex, float frame) { var track = HkxBoneIndexToTransformTrackMap[hkxBoneIndex]; if (track == -1) { var skeleTransform = hkaSkeleton.Transforms.GetArrayData().Elements[hkxBoneIndex]; NewBlendableTransform defaultBoneTransformation = new NewBlendableTransform(); defaultBoneTransformation.Scale.X = skeleTransform.Scale.Vector.X; defaultBoneTransformation.Scale.Y = skeleTransform.Scale.Vector.Y; defaultBoneTransformation.Scale.Z = skeleTransform.Scale.Vector.Z; defaultBoneTransformation.Rotation = new Quaternion( skeleTransform.Rotation.Vector.X, skeleTransform.Rotation.Vector.Y, skeleTransform.Rotation.Vector.Z, skeleTransform.Rotation.Vector.W); defaultBoneTransformation.Translation.X = skeleTransform.Position.Vector.X; defaultBoneTransformation.Translation.Y = skeleTransform.Position.Vector.Y; defaultBoneTransformation.Translation.Z = skeleTransform.Position.Vector.Z; return(defaultBoneTransformation); } float loopedFrame = frame % (FrameCount - 1); NewBlendableTransform currentFrame = GetTransformOnFrame((int)Math.Floor(loopedFrame), track); NewBlendableTransform nextFrame = GetTransformOnFrame((int)Math.Ceiling(loopedFrame), track); return(NewBlendableTransform.Lerp(currentFrame, nextFrame, loopedFrame % 1)); }
public override NewBlendableTransform GetTransformOnFrame(int transformTrackIndex, float frame, bool enableLooping) { float loopedFrame = (enableLooping ? frame % (FrameCount - 1) : frame); if (frame < 0) { frame += FrameCount; } if (frame > FrameCount) { frame = FrameCount; } NewBlendableTransform currentFrame = Transforms[(TransformTrackCount * (int)Math.Floor(loopedFrame)) + transformTrackIndex]; NewBlendableTransform nextFrame = Transforms[(TransformTrackCount * (int)Math.Ceiling(loopedFrame)) + transformTrackIndex]; return(NewBlendableTransform.Lerp(currentFrame, nextFrame, loopedFrame % 1)); }