/// <summary> /// IMotionProviderメンバーの実装 /// </summary> public void モーションを1フレーム進める(int fps, float elapsedTime, モーフ管理 morphManager) { // 行列の更新 foreach (var boneMotion in boneMotions) { boneMotion.ReviseBone((ulong)現在のフレーム); } foreach (var morphMotion in morphMotions) { morphManager.進捗率を設定する(morphMotion.指定したフレームにおけるモーフ値を取得する((ulong)現在のフレーム), morphMotion.モーフ名); } // 停止中はフレームを進めない if (!isPlaying) { return; } // フレームを進める 現在のフレーム += elapsedTime * fps; FrameTicked?.Invoke(this, new EventArgs()); // 最終フレームに達した時の処理 if (現在のフレーム >= このモーションにおける最終フレーム) { 現在のフレーム = (actionAfterMotion == モーション再生終了後の挙動.Replay) ? 1.0e-3f : このモーションにおける最終フレーム; モーションが終了した?.Invoke(this, actionAfterMotion); } }
public void モーションを1フレーム進める(int fps, float elapsedTime, モーフ管理 morphManager) { // 行列の更新 foreach (var boneMotion in _ボーンモーションのリスト) { boneMotion.ボーンを指定したフレームの姿勢に更新する(現在のフレーム); } foreach (var morphMotion in _モーフモーションのリスト) { morphManager.進捗率を設定する(morphMotion.指定したフレームにおけるモーフ値を取得する((ulong)現在のフレーム), morphMotion.モーフ名); } if (!_再生中である) { return; } 現在のフレーム += (float)elapsedTime * fps; if (現在のフレーム >= このモーションにおける最終フレーム) { 現在のフレーム = このモーションにおける最終フレーム; } FrameTicked?.Invoke(this, new EventArgs()); if (現在のフレーム >= このモーションにおける最終フレーム) { モーションが終了した?.Invoke(this, _モーション再生終了後の挙動); if (_モーション再生終了後の挙動 == モーション再生終了後の挙動.Replay) { 現在のフレーム = 1.0e-3f; } } }