| 11 |
using System.Runtime.Serialization.Formatters.Binary; |
using System.Runtime.Serialization.Formatters.Binary; |
| 12 |
using SlimDX; |
using SlimDX; |
| 13 |
using SlimDX.Direct3D9; |
using SlimDX.Direct3D9; |
| 14 |
|
using SlimDX.Windows; |
| 15 |
using FDK; |
using FDK; |
| 16 |
using SampleFramework; |
using SampleFramework; |
| 17 |
using DTXMania.Properties; |
using DTXMania.Properties; |
| 20 |
|
|
| 21 |
namespace DTXMania |
namespace DTXMania |
| 22 |
{ |
{ |
| 23 |
internal class CDTXMania : Game |
internal class CDTXMania : Game |
| 24 |
{ |
{ |
| 25 |
// プロパティ |
// プロパティ |
| 26 |
|
|
| 43 |
public static CApp App |
public static CApp App |
| 44 |
{ |
{ |
| 45 |
get; |
get; |
| 46 |
protected set; |
private set; |
| 47 |
} |
} |
| 48 |
public static C文字コンソール act文字コンソール |
public static C文字コンソール act文字コンソール |
| 49 |
{ |
{ |
| 321 |
|
|
| 322 |
public static void t初期化(CApp app) |
public static void t初期化(CApp app) |
| 323 |
{ |
{ |
| 324 |
CDTXMania.App = app; |
//CDTXMania.App = app; |
| 325 |
//CDTXMania.SoundDevice = null; // ユーザ依存 |
//CDTXMania.SoundDevice = null; // ユーザ依存 |
| 326 |
//CDTXMania.rc演奏用タイマ = null; // Global.Bass 依存(つまりユーザ依存) |
//CDTXMania.rc演奏用タイマ = null; // Global.Bass 依存(つまりユーザ依存) |
| 327 |
} |
} |
| 438 |
return true; |
return true; |
| 439 |
} |
} |
| 440 |
#endregion |
#endregion |
| 441 |
|
/// <summary> |
| 442 |
|
/// <para>Direct3Dデバイスの生成、変更、リセットを行う。</para> |
| 443 |
|
/// <para>新しい設定と現在の設定とを比較し、生成、変更、リセットのいずれかを実行する。</para> |
| 444 |
|
/// <para>ウィンドウのクライアントサイズはバックバッファに等しく設定される。</para> |
| 445 |
|
/// <para>処理に成功すれば true を返す。処理に失敗すれば、準正常系は false を返し、異常系は例外を発出する。</para> |
| 446 |
|
/// </summary> |
| 447 |
|
public bool tDirect3Dデバイスを生成・変更・リセットする(CD3DSettings newD3DSettings, Size sz論理画面, uint wsウィンドウモード時のウィンドウスタイル, uint ws全画面モード時のウィンドウスタイル, bool bマウスカーソルの表示を制御する) |
| 448 |
|
{ |
| 449 |
|
if (this.Window == null) |
| 450 |
|
throw new InvalidOperationException("ウィンドウが未生成のままDirect3D9デバイスを生成しようとしました。"); |
| 451 |
|
|
| 452 |
// Game 実装 |
//bool b初めての生成 = (this.currentD3DSettings == null); |
| 453 |
|
//var oldD3DSettings = (b初めての生成) ? null : this.currentD3DSettings.Clone(); |
| 454 |
|
bool bウィンドウモードにする = (newD3DSettings.PresentParameters.Windowed); |
| 455 |
|
bool b全画面モードにする = !bウィンドウモードにする; |
| 456 |
|
//bool b全画面からウィンドウへの切替えである = !b初めての生成 && !oldD3DSettings.PresentParameters.Windowed && bウィンドウモードにする; |
| 457 |
|
//bool bウィンドウから全画面への切替えである = (b初めての生成 || oldD3DSettings.PresentParameters.Windowed) && b全画面モードにする; |
| 458 |
|
#region [ ウィンドウのクライアントサイズをバックバッファに合わせる。] |
| 459 |
|
//----------------- |
| 460 |
|
if (this.Window.ClientSize.Width != newD3DSettings.PresentParameters.BackBufferWidth || |
| 461 |
|
this.Window.ClientSize.Height != newD3DSettings.PresentParameters.BackBufferHeight) |
| 462 |
|
{ |
| 463 |
|
this.Window.ClientSize = new Size(newD3DSettings.PresentParameters.BackBufferWidth, newD3DSettings.PresentParameters.BackBufferHeight); |
| 464 |
|
} |
| 465 |
|
//----------------- |
| 466 |
|
#endregion |
| 467 |
|
#region [ Win32メッセージをあるだけ処理。] |
| 468 |
|
//----------------- |
| 469 |
|
CWin32.WindowMessage msg; |
| 470 |
|
|
| 471 |
|
while (CWin32.PeekMessage(out msg, IntPtr.Zero, 0, 0, CWin32.PM_REMOVE)) |
| 472 |
|
{ |
| 473 |
|
CWin32.TranslateMessage(ref msg); |
| 474 |
|
CWin32.DispatchMessage(ref msg); |
| 475 |
|
} |
| 476 |
|
|
| 477 |
|
//----------------- |
| 478 |
|
#endregion |
| 479 |
|
|
| 480 |
|
#region [ Direct3D9デバイスをリセットまたは新規生成し、リソースを復元する。] |
| 481 |
|
//----------------- |
| 482 |
|
//bool bリセットだけでOK = (!b初めての生成 && oldD3DSettings.bデバイスの再生成が不要でリセットだけで済む(newD3DSettings)); |
| 483 |
|
|
| 484 |
|
//if (bリセットだけでOK) |
| 485 |
|
{ |
| 486 |
|
#region [ デバイスのリセット ] |
| 487 |
|
//----------------- |
| 488 |
|
//this.OnUnmanageリソースを解放する(); |
| 489 |
|
|
| 490 |
|
//if (this.D3D9Device.Reset(newD3DSettings.PresentParameters) != ResultCode.DeviceLost) |
| 491 |
|
{ |
| 492 |
|
Trace.TraceInformation("Direct3D9 デバイスをリセットしました。"); |
| 493 |
|
//this.OnUnmanageリソースを生成する(); |
| 494 |
|
//bリセットだけでOK = true; |
| 495 |
|
} |
| 496 |
|
//else |
| 497 |
|
{ |
| 498 |
|
//Trace.TraceWarning("Direct3D9 デバイスのリセットに失敗しました。続けて、デバイスの新規生成を行います。"); |
| 499 |
|
//bリセットだけでOK = false; // 後段で新規生成する |
| 500 |
|
} |
| 501 |
|
//----------------- |
| 502 |
|
#endregion |
| 503 |
|
} |
| 504 |
|
|
| 505 |
|
//if (!bリセットだけでOK) // ← "else" にしないこと。前段でリセットに失敗した場合、bリセットでOK = false に変えてここに来るため。 |
| 506 |
|
{ |
| 507 |
|
#region [ デバイスの新規生成 ] |
| 508 |
|
//----------------- |
| 509 |
|
//this.OnManageリソースを解放する(); |
| 510 |
|
//this.OnUnmanageリソースを解放する(); |
| 511 |
|
/* |
| 512 |
|
C共通.tDisposeする(this.D3D9Device); |
| 513 |
|
this.D3D9Device = new Device( // 失敗したら異常系とみなし、そのまま例外をthrow。 |
| 514 |
|
this.Direct3D, |
| 515 |
|
newD3DSettings.nAdaptor, |
| 516 |
|
newD3DSettings.DeviceType, |
| 517 |
|
newD3DSettings.PresentParameters.DeviceWindowHandle, |
| 518 |
|
newD3DSettings.CreateFlags, |
| 519 |
|
newD3DSettings.PresentParameters); |
| 520 |
|
|
| 521 |
|
*/ |
| 522 |
|
Trace.TraceInformation("Direct3D9 デバイスを生成しました。"); |
| 523 |
|
//this.D3D9Device.SetDialogBoxMode(true); |
| 524 |
|
|
| 525 |
|
//this.OnManageリソースを生成する(); |
| 526 |
|
//this.OnUnmanageリソースを生成する(); |
| 527 |
|
//----------------- |
| 528 |
|
#endregion |
| 529 |
|
} |
| 530 |
|
//----------------- |
| 531 |
|
#endregion |
| 532 |
|
|
| 533 |
|
//this.currentD3DSettings = newD3DSettings.Clone(); // 成功したので設定を正式に保存する。 |
| 534 |
|
|
| 535 |
|
//this.OnD3Dデバイスステータスの初期化(); |
| 536 |
|
|
| 537 |
|
return true; |
| 538 |
|
} |
| 539 |
|
public bool tDirect3Dデバイスを生成・変更・リセットする(CD3DSettings newD3DSettings, Size sz論理画面, uint wsウィンドウモード時のウィンドウスタイル, uint ws全画面モード時のウィンドウスタイル) |
| 540 |
|
{ |
| 541 |
|
return this.tDirect3Dデバイスを生成・変更・リセットする(newD3DSettings, sz論理画面, wsウィンドウモード時のウィンドウスタイル, ws全画面モード時のウィンドウスタイル, true); |
| 542 |
|
} |
| 543 |
|
public bool tDirect3Dデバイスを生成・変更・リセットする(CD3DSettings newD3DSettings, Size sz論理画面) |
| 544 |
|
{ |
| 545 |
|
return this.tDirect3Dデバイスを生成・変更・リセットする(newD3DSettings, sz論理画面, uint.MaxValue, uint.MaxValue, true); |
| 546 |
|
} |
| 547 |
|
public bool tDirect3Dデバイスを生成・変更・リセットする(CD3DSettings newD3DSettings) |
| 548 |
|
{ |
| 549 |
|
return this.tDirect3Dデバイスを生成・変更・リセットする(newD3DSettings, Size.Empty, uint.MaxValue, uint.MaxValue, true); |
| 550 |
|
} |
| 551 |
|
|
| 552 |
|
public void tDirect3Dデバイスをクリアする() |
| 553 |
|
{ |
| 554 |
|
//this.D3D9Device.Clear(ClearFlags.Target, this.colorデバイスクリア色, 0.0f, 0); |
| 555 |
|
} |
| 556 |
|
// Game 実装 |
| 557 |
protected override void Initialize() |
protected override void Initialize() |
| 558 |
{ |
{ |
| 559 |
// new GCBeep(); |
// new GCBeep(); |
| 1156 |
CDTXMania.Pad.st検知したデバイス.Clear(); // 入力デバイスフラグクリア(2010.9.11) |
CDTXMania.Pad.st検知したデバイス.Clear(); // 入力デバイスフラグクリア(2010.9.11) |
| 1157 |
|
|
| 1158 |
r現在のステージ.On非活性化(); |
r現在のステージ.On非活性化(); |
| 1159 |
#if dshow |
//#if dshow |
| 1160 |
stage演奏ドラム画面.actFOStageClear.On活性化(this.Device); |
stage演奏ドラム画面.actFOStageClear.On活性化(CDTXMania.app.Device); |
| 1161 |
#endif |
//#endif |
| 1162 |
if( !ConfigIni.bギタレボモード ) |
if( !ConfigIni.bギタレボモード ) |
| 1163 |
{ |
{ |
| 1164 |
Trace.TraceInformation( "----------------------" ); |
Trace.TraceInformation( "----------------------" ); |
| 1545 |
} |
} |
| 1546 |
#endregion |
#endregion |
| 1547 |
} |
} |
| 1548 |
|
/// <summary> |
| 1549 |
|
/// <para>ここには、対応するイベントハンドラのないイベントをハンドルするコードを書く。</para> |
| 1550 |
|
/// </summary> |
| 1551 |
|
protected void WndProc( ref Message m ) |
| 1552 |
|
{ |
| 1553 |
|
#region [ WM_COPYDATA: 二重起動された StrokeStyleT.exe からコマンドライン行が送られてきたら、それを取得してアクション実行予約を行う。] |
| 1554 |
|
//----------------- |
| 1555 |
|
if( m.Msg == CWin32.WM_COPYDATA ) |
| 1556 |
|
{ |
| 1557 |
|
// コマンドライン行を取得。 |
| 1558 |
|
var copyData = (CWin32.COPYDATA) m.GetLParam( (new CWin32.COPYDATA()).GetType() ); |
| 1559 |
|
|
| 1560 |
|
// コマンドライン登録(アクション実行予約) |
| 1561 |
|
//Global.PlayerMode.arrayコマンドライン = null; |
| 1562 |
|
//if( copyData.cbData > 0 ) |
| 1563 |
|
// Global.PlayerMode.arrayコマンドライン = copyData.lpData.Split( new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries ); |
| 1564 |
|
} |
| 1565 |
|
//----------------- |
| 1566 |
|
#endregion |
| 1567 |
|
#region [ WM_DSGRAPHNOTIFY: DirectShow グラフからのイベントを受信し、処理を行う。] |
| 1568 |
|
//----------------- |
| 1569 |
|
else if( m.Msg == CDirectShow.WM_DSGRAPHNOTIFY ) |
| 1570 |
|
{ |
| 1571 |
|
int nインスタンスID = m.LParam.ToInt32(); |
| 1572 |
|
CDirectShow dsイベント発信者 = null; |
| 1573 |
|
bool b発信者が背景動画である = false; |
| 1574 |
|
|
| 1575 |
|
#region [ イベント発信者(CDirectShow) を特定する。] |
| 1576 |
|
//----------------- |
| 1577 |
|
// このインスタンスID は、今のところ以下のいずれかである。 |
| 1578 |
|
// ・背景動画 |
| 1579 |
|
// ・仮想ドラムキット |
| 1580 |
|
// なので、これらを順に見ていって、イベント発信者を特定する。 |
| 1581 |
|
dsイベント発信者 = CDirectShow.tインスタンスを返す( nインスタンスID ); |
| 1582 |
|
b発信者が背景動画である = false; |
| 1583 |
|
//----------------- |
| 1584 |
|
#endregion |
| 1585 |
|
|
| 1586 |
|
if( dsイベント発信者 == null ) |
| 1587 |
|
return; // 特定に失敗したら無視。 |
| 1588 |
|
|
| 1589 |
|
#region [ イベント発信者からすべてのイベントを受け取り、処理する。] |
| 1590 |
|
//----------------- |
| 1591 |
|
IMediaEventEx mediaEventEx = dsイベント発信者.MediaEventEx; |
| 1592 |
|
|
| 1593 |
|
if( mediaEventEx == null ) |
| 1594 |
|
return; // 既に DirectShow の終了処理が始まっている場合は何もしない。 |
| 1595 |
|
|
| 1596 |
|
// この辺りの処理の参考URL: |
| 1597 |
|
// http://msdn.microsoft.com/ja-jp/library/cc370589.aspx |
| 1598 |
|
|
| 1599 |
|
EventCode eventCode; |
| 1600 |
|
IntPtr param1, param2; |
| 1601 |
|
while( mediaEventEx.GetEvent( out eventCode, out param1, out param2, 0 ) == CWin32.S_OK ) // イベントがなくなるまで |
| 1602 |
|
{ |
| 1603 |
|
// イベント処理。 |
| 1604 |
|
|
| 1605 |
|
if( eventCode == EventCode.Complete ) |
| 1606 |
|
{ |
| 1607 |
|
#region [ 再生完了 ] |
| 1608 |
|
//----------------- |
| 1609 |
|
if( dsイベント発信者.bループ再生 ) |
| 1610 |
|
{ |
| 1611 |
|
if( dsイベント発信者.bループ再生 ) // ループ指定ありなら |
| 1612 |
|
dsイベント発信者.t再生位置を変更( 0.0 ); // すぐ再生開始。 |
| 1613 |
|
} |
| 1614 |
|
else |
| 1615 |
|
{ |
| 1616 |
|
if( b発信者が背景動画である ) |
| 1617 |
|
{ |
| 1618 |
|
dsイベント発信者.b再生中 = false; |
| 1619 |
|
dsイベント発信者.t再生停止(); // 背景動画は終了しても巻き戻さない。 |
| 1620 |
|
} |
| 1621 |
|
else |
| 1622 |
|
{ |
| 1623 |
|
dsイベント発信者.b再生中 = false; |
| 1624 |
|
dsイベント発信者.t再生停止(); |
| 1625 |
|
dsイベント発信者.t再生位置を変更( 0.0 ); // 再生完了しても再生は続くので、先頭に戻して |
| 1626 |
|
dsイベント発信者.t再生準備開始(); // 次の再生に備えて準備しておく。 |
| 1627 |
|
} |
| 1628 |
|
} |
| 1629 |
|
//----------------- |
| 1630 |
|
#endregion |
| 1631 |
|
} |
| 1632 |
|
|
| 1633 |
|
// イベントを解放。 |
| 1634 |
|
|
| 1635 |
|
mediaEventEx.FreeEventParams( eventCode, param1, param2 ); |
| 1636 |
|
} |
| 1637 |
|
//----------------- |
| 1638 |
|
#endregion |
| 1639 |
|
} |
| 1640 |
|
//----------------- |
| 1641 |
|
#endregion |
| 1642 |
|
#region [ WM_CLOSE: 終了指示フラグを立てる。立てるだけ。] |
| 1643 |
|
//----------------- |
| 1644 |
|
if( m.Msg == CWin32.WM_CLOSE ) |
| 1645 |
|
{ |
| 1646 |
|
CDTXMania.App.bWM_CLOSEを受け取った = true; |
| 1647 |
|
return; |
| 1648 |
|
} |
| 1649 |
|
//----------------- |
| 1650 |
|
#endregion |
| 1651 |
|
|
| 1652 |
|
WndProc( ref m ); |
| 1653 |
|
} |
| 1654 |
|
|
| 1655 |
|
|
| 1656 |
// その他 |
// その他 |