private static Keyframe <float>[][] ReadKeyframes_( bool isDck, IDcxAnimationData animationData, IDcxAxes axes, float[] values) { var frames = new Keyframe <float> [3][]; for (var i = 0; i < 3; ++i) { var axis = axes.Axes[i]; var frameCount = axis.FrameCount; var frameOffset = axis.FrameOffset; var sparse = isDck && frameCount != 1 && frameCount != animationData.FrameCount; frames[i] = !sparse ? DcxHelpers.ReadDenseFrames( values, frameOffset, frameCount) : DcxHelpers.ReadSparseFrames( values, frameOffset, frameCount); } return(frames); }
public static IAnimation AddAnimation( IBone[] bones, IAnimationManager animationManager, IDcx dcx) { var isDck = dcx is Dck; var dcxAnimationData = dcx.AnimationData; var animation = animationManager.AddAnimation(); animation.Name = dcx.Name; animation.FrameCount = (int)dcxAnimationData.FrameCount; animation.FrameRate = 30; foreach (var jointData in dcxAnimationData.JointDataList) { var jointIndex = jointData.JointIndex; var jointKeyframes = animation.AddBoneTracks(bones[jointIndex]); Keyframe <float>[][] frames; frames = DcxHelpers.ReadKeyframes_( isDck, dcxAnimationData, jointData.ScaleAxes, dcxAnimationData.ScaleValues); DcxHelpers.MergeKeyframesToScaleTrack( frames, jointKeyframes.Scales); frames = DcxHelpers.ReadKeyframes_( isDck, dcxAnimationData, jointData.RotationAxes, dcxAnimationData.RotationValues); DcxHelpers.MergeKeyframesToRotationTrack( frames, jointKeyframes.Rotations); frames = DcxHelpers.ReadKeyframes_( isDck, dcxAnimationData, jointData.PositionAxes, dcxAnimationData.PositionValues); DcxHelpers.MergeKeyframesToPositionTrack( frames, jointKeyframes.Positions); animation.AddBoneTracks(bones[jointIndex]).Set(jointKeyframes); } return(animation); }