// 進行タスク起動。
this._進行Status = new TriStateEvent( TriStateEvent.状態種別.OFF );
- Task.Factory.StartNew( () => {
-
- Log.現在のスレッドに名前をつける( "進行" );
- Log.Info( "進行タスクを開始します。" );
-
- this._進行Status.現在の状態 = TriStateEvent.状態種別.ON;
-
- while( this._進行Status.現在の状態 == TriStateEvent.状態種別.ON )
- {
- this._進行処理を行う();
- Thread.Sleep( 1 ); // ウェイト。
- }
-
- this._進行Status.現在の状態 = TriStateEvent.状態種別.無効;
-
- Log.Info( "進行タスクを終了しました。" );
- } );
+ Task.Factory.StartNew( this._進行タスクエントリ );
// 描画タスク開始。
this._AppStatus = AppStatus.実行中;
/// <summary>
/// 進行ループの処理内容。
/// </summary>
- private void _進行処理を行う()
+ private void _進行タスクエントリ()
+ {
+ Log.現在のスレッドに名前をつける( "進行" );
+ Log.Info( "進行タスクを開始します。" );
+
+ this._進行Status.現在の状態 = TriStateEvent.状態種別.ON;
+
+ while( this._進行Status.現在の状態 == TriStateEvent.状態種別.ON )
+ {
+ lock( this._進行描画間同期 )
+ {
+ //App.入力管理.すべての入力デバイスをポーリングする();
+ // --> 入力ポーリングの挙動はステージごとに異なるので、それぞれのステージ内で行う。
+
+ App.ステージ管理.現在のステージ.進行する();
+ }
+
+ Thread.Sleep( 1 ); // ウェイト。
+ }
+
+ this._進行Status.現在の状態 = TriStateEvent.状態種別.無効;
+
+ Log.Info( "進行タスクを終了しました。" );
+ }
+
+ /// <summary>
+ /// 描画ループの処理内容。
+ /// </summary>
+ private void _描画処理を行う()
{
lock( this._進行描画間同期 )
{
- // ステージが遷移したら、ここへ goto すること。さもないと、描画が数フレーム遅れて黒画面が挟まることがある。
- retry:
+ if( this._AppStatus != AppStatus.実行中 ) // 上記lock中に終了されている場合があるのでそれをはじく。
+ return;
+
+ #region " (1) D3Dデバイスが消失していれば再構築する。"
+ //----------------
+ App.グラフィックデバイス.D3Dデバイスが消失していれば再構築する( out bool 再構築不能な異常が発生 );
+
+ if( 再構築不能な異常が発生 )
+ {
+ Log.WARNING( "再構築不能な異常が発生しました。アプリケーションを終了します。" );
+ this._アプリを終了する();
+ return;
+ }
+ //----------------
+ #endregion
+
+ var gd = App.グラフィックデバイス;
+
+ #region " (2) D3Dレンダリングの前処理を行う。"
+ //----------------
+ gd.D3DDeviceを取得する( ( d3dDevice ) => {
+
+ using( var d3dContext = d3dDevice.ImmediateContext )
+ {
+ // 既定のD3Dレンダーターゲットビューを黒でクリアする。
+ d3dContext.ClearRenderTargetView( gd.D3DRenderTargetView, Color4.Black );
+
+ // 深度バッファを 1.0f でクリアする。
+ d3dContext.ClearDepthStencilView(
+ gd.D3DDepthStencilView,
+ SharpDX.Direct3D11.DepthStencilClearFlags.Depth,
+ depth: 1.0f,
+ stencil: 0 );
+ }
+
+ } );
+ //----------------
+ #endregion
- //App.入力管理.すべての入力デバイスをポーリングする();
- // --> 入力ポーリングの挙動はステージごとに異なるので、それぞれのステージ内で行う。
+ #region " (3) 現在のステージの描画を行う。"
+ //----------------
+ App.ステージ管理.現在のステージ.描画する( gd );
+ //----------------
+ #endregion
- // (1) 現在のステージの進行を行う。
- App.ステージ管理.現在のステージ.進行する();
+ #region " (4) ステージの状態をチェックし、遷移処理を行う。(必要に応じてビュアーメッセージキューの処理も行う。)"
+ //----------------
+
+ // ステージが遷移したら、ここへ goto すること。さもないと、描画が1フレーム遅れて黒画面が挟まることがある。
+ retry:
- // (2) ステージの状態をチェックし、遷移処理を行う。(必要に応じてビュアーメッセージキューの処理も行う。)
switch( App.ステージ管理.現在のステージ )
{
case 起動ステージ stage:
//----------------
if( stage.現在のフェーズ == 起動ステージ.フェーズ.完了 )
{
- App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( タイトルステージ ) );
+ App.ステージ管理.ステージを遷移する( gd, nameof( タイトルステージ ) );
goto retry;
}
//----------------
//----------------
if( stage.現在のフェーズ == タイトルステージ.フェーズ.確定 )
{
- App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( ユーザ選択ステージ ) );
+ App.ステージ管理.ステージを遷移する( gd, nameof( ユーザ選択ステージ ) );
goto retry;
}
//----------------
//----------------
else if( stage.現在のフェーズ == タイトルステージ.フェーズ.キャンセル )
{
- App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, null );
+ App.ステージ管理.ステージを遷移する( gd, null );
this._アプリを終了する();
//goto retry; --> 終わりなので不要 つか無意味。
}
//----------------
if( stage.現在のフェーズ == ユーザ選択ステージ.フェーズ.キャンセル )
{
- App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( タイトルステージ ) );
+ App.ステージ管理.ステージを遷移する( gd, nameof( タイトルステージ ) );
goto retry;
}
//----------------
{
if( App.ビュアーモードではない )
{
- App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( 選曲ステージ ) );
+ App.ステージ管理.ステージを遷移する( gd, nameof( 選曲ステージ ) );
}
else
{
- App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( 演奏ステージ ) );
+ App.ステージ管理.ステージを遷移する( gd, nameof( 演奏ステージ ) );
}
goto retry;
}
//----------------
if( stage.現在のフェーズ == 選曲ステージ.フェーズ.キャンセル )
{
- App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( ユーザ選択ステージ ) );
+ App.ステージ管理.ステージを遷移する( gd, nameof( ユーザ選択ステージ ) );
goto retry;
}
//----------------
//----------------
else if( stage.現在のフェーズ == 選曲ステージ.フェーズ.曲決定 )
{
- App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( 曲読込ステージ ) );
+ App.ステージ管理.ステージを遷移する( gd, nameof( 曲読込ステージ ) );
goto retry;
}
//----------------
//----------------
if( stage.現在のフェーズ == 曲読込ステージ.フェーズ.完了 )
{
- App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( 演奏ステージ ) );
+ App.ステージ管理.ステージを遷移する( gd, nameof( 演奏ステージ ) );
goto retry;
}
//----------------
if( ( stage.現在のフェーズ == 演奏ステージ.フェーズ.キャンセル ) ||
( stage.現在のフェーズ == 演奏ステージ.フェーズ.Failed ) )
{
- App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( 選曲ステージ ) );
+ App.ステージ管理.ステージを遷移する( gd, nameof( 選曲ステージ ) );
goto retry;
}
//--------------------
//--------------------
else if( stage.現在のフェーズ == 演奏ステージ.フェーズ.クリア )
{
- App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( クリアステージ ) );
+ App.ステージ管理.ステージを遷移する( gd, nameof( クリアステージ ) );
goto retry;
}
//--------------------
if( stage.現在のフェーズ == 演奏ステージ.フェーズ.演奏中 ||
stage.現在のフェーズ == 演奏ステージ.フェーズ.ビュアーメッセージ待機 )
{
- stage.非活性化する( App.グラフィックデバイス );
+ stage.非活性化する( gd );
stage.BGMを停止する();
if( ( null != App.ビュアー用ノード ) && App.ビュアー用ノード.活性化している )
- App.ビュアー用ノード.非活性化する( App.グラフィックデバイス );
+ App.ビュアー用ノード.非活性化する( gd );
App.ビュアー用ノード = new MusicNode( msg.演奏対象曲のファイルパス, null );
// 曲読込ステージへ。
- App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( 曲読込ステージ ) );
+ App.ステージ管理.ステージを遷移する( gd, nameof( 曲読込ステージ ) );
goto retry;
}
break;
//----------------
if( stage.現在のフェーズ == クリアステージ.フェーズ.完了 )
{
- App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( 結果ステージ ) );
+ App.ステージ管理.ステージを遷移する( gd, nameof( 結果ステージ ) );
goto retry;
}
//----------------
//--------------------
if( stage.現在のフェーズ == 結果ステージ.フェーズ.完了 )
{
- App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( 選曲ステージ ) );
+ App.ステージ管理.ステージを遷移する( gd, nameof( 選曲ステージ ) );
goto retry;
}
//--------------------
#endregion
break;
}
- }
- }
-
- /// <summary>
- /// 描画ループの処理内容。
- /// </summary>
- private void _描画処理を行う()
- {
- lock( this._進行描画間同期 )
- {
- if( this._AppStatus != AppStatus.実行中 ) // 上記lock中に終了されている場合があるのでそれをはじく。
- return;
-
- #region " (1) D3Dデバイスが消失していれば再構築する。"
- //----------------
- App.グラフィックデバイス.D3Dデバイスが消失していれば再構築する( out bool 再構築不能な異常が発生 );
-
- if( 再構築不能な異常が発生 )
- {
- Log.WARNING( "再構築不能な異常が発生しました。アプリケーションを終了します。" );
- this._アプリを終了する();
- return;
- }
- //----------------
- #endregion
-
- #region " (2) D3Dレンダリングの前処理を行う。"
- //----------------
- App.グラフィックデバイス.D3DDeviceを取得する( ( d3dDevice ) => {
-
- using( var d3dContext = d3dDevice.ImmediateContext )
- {
- // 既定のD3Dレンダーターゲットビューを黒でクリアする。
- d3dContext.ClearRenderTargetView( App.グラフィックデバイス.D3DRenderTargetView, SharpDX.Color4.Black );
-
- // 深度バッファを 1.0f でクリアする。
- d3dContext.ClearDepthStencilView(
- App.グラフィックデバイス.D3DDepthStencilView,
- SharpDX.Direct3D11.DepthStencilClearFlags.Depth,
- depth: 1.0f,
- stencil: 0 );
- }
-
- } );
- //----------------
- #endregion
-
- #region " (3) 現在のステージの描画を行う。"
- //----------------
- App.ステージ管理.現在のステージ.描画する( App.グラフィックデバイス );
//----------------
#endregion
}
- #region " (4) スワップチェーンを表示する。"
+ #region " (5) スワップチェーンを表示する。"
//----------------
if( App.システム設定.垂直帰線待ちを行う )
{