2 using System.Collections.Generic;
3 using System.Diagnostics;
8 public static class Utilities
11 /// Dispose して、null を代入する。
13 /// <param name="obj">IDisposable を実装するオブジェクト。</param>
14 public static void 解放する<T>( ref T obj ) where T : IDisposable
16 ( obj as IDisposable )?.Dispose();
21 /// ターゲットに対して描画処理を実行する。
24 /// 描画処理は、ターゲットの BeginDraw() と EndDraw() の間で行われることを保証する。
25 /// 描画処理中に例外が発生しても EndDraw() の呼び出しは保証する。
27 /// <param name="target">レンダーターゲット。</param>
28 /// <param name="描画処理">BeginDraw() と EndDraw() の間で行う処理。</param>
29 public static void D2DBatchDraw( SharpDX.Direct2D1.RenderTarget target, Action 描画処理 )
38 // SharpDX の EndDraw() では HRESULT を捨ててしまうので、デバイスロストのチェックは、ここではできない。
43 /// 深度から射影行列(定数)を計算して返す。
46 /// <param name="depth">深度。</param>
47 /// <returns>深度から計算された射影行列。</returns>
48 public static SharpDX.Matrix D2DPerspectiveProjection( float depth )
50 var mat = SharpDX.Matrix.Identity;
51 mat.M34 = ( 0 != depth ) ? -( 1.0f / depth ) : 0.0f;
55 public static int 最大公約数を返す( int m, int n )
57 if( ( 0 >= m ) || ( 0 >= n ) )
58 throw new FDKException( "引数に0以下の数は指定できません。" );
62 while( ( r = m % n ) != 0 )
70 public static int 最小公倍数を返す( int m, int n )
72 if( ( 0 >= m ) || ( 0 >= n ) )
73 throw new FDKException( "引数に0以下の数は指定できません。" );
75 return ( m * n / Utilities.最大公約数を返す( m, n ) );
79 /// このメソッドの 呼び出し元のメソッド名 を返す。デバッグログ用。
81 public static string 現在のメソッド名
86 var prevFrame = new System.Diagnostics.StackFrame( skipFrames: 1, fNeedFileInfo: false );
88 var クラス名 = prevFrame.GetMethod().ReflectedType.ToString();
89 var メソッド名 = prevFrame.GetMethod().Name;
91 return $"{クラス名}.{メソッド名}()";
96 /// 画像ファイルからシェーダリソースビューを作成して返す。
99 /// (参考: http://qiita.com/oguna/items/c516e09ee57d931892b6 )
101 public static SharpDX.Direct3D11.ShaderResourceView CreateShaderResourceViewFromFile(
102 SharpDX.Direct3D11.Device d3dDevice, SharpDX.Direct3D11.BindFlags bindFlags, string 画像ファイルパス, out SharpDX.Size2F ビューのサイズ, out SharpDX.Direct3D11.Texture2D テクスチャ )
104 ビューのサイズ = new SharpDX.Size2F( 0, 0 );
105 var srv = (SharpDX.Direct3D11.ShaderResourceView) null;
106 using( var image = new System.Drawing.Bitmap( 画像ファイルパス ) )
108 var 画像の矩形 = new System.Drawing.Rectangle( 0, 0, image.Width, image.Height );
109 using( var bitmap = image.Clone( 画像の矩形, System.Drawing.Imaging.PixelFormat.Format32bppArgb ) )
111 var ロック領域 = bitmap.LockBits( 画像の矩形, System.Drawing.Imaging.ImageLockMode.ReadOnly, bitmap.PixelFormat );
112 var dataBox = new[] { new SharpDX.DataBox( ロック領域.Scan0, bitmap.Width * 4, bitmap.Height ) };
113 var textureDesc = new SharpDX.Direct3D11.Texture2DDescription() {
115 BindFlags = bindFlags,
116 CpuAccessFlags = SharpDX.Direct3D11.CpuAccessFlags.None,
117 Format = SharpDX.DXGI.Format.B8G8R8A8_UNorm,
118 Height = bitmap.Height,
119 Width = bitmap.Width,
121 OptionFlags = SharpDX.Direct3D11.ResourceOptionFlags.None,
122 SampleDescription = new SharpDX.DXGI.SampleDescription( 1, 0 ),
123 Usage = SharpDX.Direct3D11.ResourceUsage.Default
125 var texture = new SharpDX.Direct3D11.Texture2D( d3dDevice, textureDesc, dataBox );
126 bitmap.UnlockBits( ロック領域 );
127 srv = new SharpDX.Direct3D11.ShaderResourceView( d3dDevice, texture );
133 ビューのサイズ = new SharpDX.Size2F( 画像の矩形.Width, 画像の矩形.Height );
140 /// 空のテクスチャとそのシェーダーリソースビューを作成し、返す。
142 public static SharpDX.Direct3D11.ShaderResourceView CreateShaderResourceView(
143 SharpDX.Direct3D11.Device d3dDevice, SharpDX.Direct3D11.BindFlags bindFlags, SharpDX.Size2 サイズdpx, out SharpDX.Direct3D11.Texture2D テクスチャ )
145 var textureDesc = new SharpDX.Direct3D11.Texture2DDescription() {
147 BindFlags = bindFlags,
148 CpuAccessFlags = SharpDX.Direct3D11.CpuAccessFlags.None,
149 Format = SharpDX.DXGI.Format.B8G8R8A8_UNorm,
150 Height = サイズdpx.Height,
151 Width = サイズdpx.Width,
153 OptionFlags = SharpDX.Direct3D11.ResourceOptionFlags.None,
154 SampleDescription = new SharpDX.DXGI.SampleDescription( 1, 0 ),
155 Usage = SharpDX.Direct3D11.ResourceUsage.Default
157 var texture = new SharpDX.Direct3D11.Texture2D( d3dDevice, textureDesc );
163 return new SharpDX.Direct3D11.ShaderResourceView( d3dDevice, texture );