namespace LibMMD.Motion { internal sealed class MmdGrooveFallback { private readonly MmdMotion _motion; private readonly Poser _poser; private readonly MmdMotionTranslationScaler _scaler; private readonly int _centerIndex; internal MmdGrooveFallback(MmdMotion motion, Poser poser, MmdMotionTranslationScaler scaler, int centerIndex) { _motion = motion; _poser = poser; _scaler = scaler; _centerIndex = centerIndex; } internal void ApplyFrame(int frame) { if (_centerIndex < 0) return; Apply(_motion.GetBonePose("センター", frame), _motion.GetBonePose("グルーブ", frame)); } internal void ApplyTime(double time) { if (_centerIndex < 0) return; Apply(_motion.GetBonePose("センター", time), _motion.GetBonePose("グルーブ", time)); } private void Apply(BonePose center, BonePose groove) { _poser.SetBonePose(_centerIndex, _scaler.Apply(_centerIndex, new BonePose { Translation = center.Translation + groove.Translation, Rotation = center.Rotation * groove.Rotation })); } } }