OSDN Git Service

スワップチェーンのリサイズコードを、ApplicationFormBase から デバイスリソース へ移動。
authorくまかみ工房 <kumakamikoubou@gmail.com>
Sat, 17 Sep 2016 11:14:51 +0000 (20:14 +0900)
committerくまかみ工房 <kumakamikoubou@gmail.com>
Sat, 17 Sep 2016 11:14:51 +0000 (20:14 +0900)
FDK24/ApplicationFormBase.cs
FDK24/メディア/デバイスリソース.cs

index 0f07698..40a2bd8 100644 (file)
@@ -165,7 +165,8 @@ namespace FDK
 
                protected override void OnSizeChanged( EventArgs e )
                {
-                       // 実行時条件チェック。
+                       #region " 実行時チェック。"
+                       //----------------
                        if( null == this.デバイスリソース )
                        {
                                return; // まだ初期化されてない(ので何もしない)。
@@ -180,25 +181,12 @@ namespace FDK
                                Trace.WriteLine( "最小化されました。" );
                                return; // 何もしない
                        }
-
-                       // 描画ターゲットを解除する。
-                       this.デバイスリソース.D3DDevice.ImmediateContext.OutputMerger.ResetTargets();    // 描画ターゲットの解除
-
-                       // サイズに依存するリソースを解放する。
-                       this.デバイスリソース.サイズに依存するリソースを解放する();
-
-                       // バックバッファのサイズを変更する。
-                       this.デバイスリソース.SwapChain.ResizeBuffers(
-                               bufferCount: 3,
-                               width: this.ClientSize.Width,
-                               height: this.ClientSize.Height,
-                               newFormat: SharpDX.DXGI.Format.R8G8B8A8_UNorm,
-                               swapChainFlags: SharpDX.DXGI.SwapChainFlags.AllowModeSwitch );
+                       //----------------
+                       #endregion
 
                        // サイズに依存するリソースを再作成する。
+                       this.デバイスリソース.サイズに依存するリソースを解放する();
                        this.デバイスリソース.サイズに依存するリソースを作成する();
-
-                       base.OnSizeChanged( e );
                }
 
                [System.Runtime.InteropServices.DllImport( "winmm.dll" )]
index be1b5a2..397c74d 100644 (file)
@@ -8,9 +8,14 @@ namespace FDK.メディア
        public class デバイスリソース
        {
                public SharpDX.Size2F 設計画面サイズdpx = new SharpDX.Size2F( 640f, 480f );
-               public SharpDX.Size2F 物理画面サイズpx;
+               public SharpDX.Size2F 物理画面サイズpx = new SharpDX.Size2F( 0, 0 );     // (0, 0) は、サイズ依存リソース無効の印。
                public IntPtr ウィンドウハンドル = IntPtr.Zero;
+
+               public SharpDX.Vector3 カメラの位置;
+               public SharpDX.Vector3 カメラの注視点;
+               public SharpDX.Vector3 カメラの上方向;
                public float 視野角 = 45f;
+
                public float 不透明度 = 0.5f;    // 0:透明~1:不透明
                public struct ST定数バッファの転送元データ
                {
@@ -265,7 +270,19 @@ namespace FDK.メディア
                }
                public void サイズに依存するリソースを作成する()
                {
-                       // バックバッファを取得
+                       #region " スワップチェーンのサイズを変更する。"
+                       //----------------
+                       Debug.Assert( null != this.SwapChain ); // スワップチェーンは、デバイスとともに、すでに生成される。
+                       this.SwapChain.ResizeBuffers(
+                               bufferCount: 2,
+                               width: (int) this.物理画面サイズpx.Width,
+                               height: (int) this.物理画面サイズpx.Height,
+                               newFormat: SharpDX.DXGI.Format.R8G8B8A8_UNorm,
+                               swapChainFlags: SharpDX.DXGI.SwapChainFlags.AllowModeSwitch );
+                       //----------------
+                       #endregion
+
+                       // 新しいサイズになったバックバッファを取得して、リソースを作成する。
                        using( var backBuffer = SharpDX.Direct3D11.Texture2D.FromSwapChain<SharpDX.Direct3D11.Texture2D>( this.bs_SwapChain, 0 ) )
                        {
                                #region " RenderTargetView の作成 "
@@ -324,10 +341,17 @@ namespace FDK.メディア
                }
                public void サイズに依存するリソースを解放する()
                {
+                       // 描画ターゲットを解除する。
+                       this.D3DDevice.ImmediateContext.OutputMerger.ResetTargets();
+
                        FDK.メディア.テクスチャ.共有リソースを解放する();
                        this.bs_DepthStencilView?.Dispose();
                        this.bs_DepthStencil?.Dispose();
                        this.bs_RenderTargetView?.Dispose();
+                       //this.bs_SwapChain?.Dispose(); → スワップチェーンは解放しない(生成・解放はデバイスとセット)。
+
+                       // (0,0)は、サイズ依存リソース無効の印。
+                       this.物理画面サイズpx = new SharpDX.Size2F( 0, 0 );
                }
                public void D3Dデバイスが消失していれば再構築する( out bool 異常状態なのでアプリを終了せよ )
                {
@@ -360,10 +384,12 @@ namespace FDK.メディア
 
                private SharpDX.Direct3D11.Device bs_D3DDevice = null;
                private SharpDX.DXGI.SwapChain bs_SwapChain = null;
+
                private SharpDX.Direct3D11.RenderTargetView bs_RenderTargetView = null;
-               private SharpDX.Mathematics.Interop.RawViewportF[] bs_ViewPort = new SharpDX.Mathematics.Interop.RawViewportF[ 1 ];
                private SharpDX.Direct3D11.Texture2D bs_DepthStencil = null;
                private SharpDX.Direct3D11.DepthStencilView bs_DepthStencilView = null;
+
+               private SharpDX.Mathematics.Interop.RawViewportF[] bs_ViewPort = new SharpDX.Mathematics.Interop.RawViewportF[ 1 ];
                private SharpDX.Direct3D11.DepthStencilState bs_DepthStencilState = null;
                private SharpDX.Direct3D11.VertexShader bs_VertexShader = null;
                private SharpDX.Direct3D11.PixelShader bs_PixelShader = null;