C#でツールを作る その12.2 -Modelクラス-
Mesh、Material、Textureの管理が面倒になってきたのでクラス化しましょう。
サンプル
- tool12_2.zip
- VC#2008EE用
Modelクラス
- IDisposableの実装
- 描画メソッド
- Model生成メソッド
class Model : IDisposable { private Mesh mesh = null; private Material[] material = null; private Texture[] texture = null; public void Dispose() { if (texture != null) { foreach( Texture t in texture ) { if( t != null )t.Dispose(); } } if (mesh != null) { mesh.Dispose(); mesh = null; } } public void Render( Device device ) { for( int i = 0; i < material.Length; i ++ ) { device.Material = material[ i ]; device.SetTexture( 0, texture[ i ] ); mesh.DrawSubset( i ); } } public static Model FromFile( Device device, String path, String filename ) { Model model = new Model(); //カレントディレクトリを変更 String temp = Directory.GetCurrentDirectory(); Directory.SetCurrentDirectory( Application.StartupPath + path ); //Xファイルをロードし、Meshを生成 ExtendedMaterial[] mat; model.mesh = Mesh.FromFile( filename, MeshFlags.SystemMemory, device, out mat ); model.texture = new Texture[ mat.Length ]; model.material = new Material[ mat.Length ]; //Materialのコピーとテクスチャのロード for( int i = 0; i < mat.Length; i ++ ) { model.material[ i ] = mat[ i ].Material3D; model.material[ i ].Ambient = model.material[ i ].Diffuse; model.texture[ i ] = null; if( mat[ i ].TextureFilename != null ) model.texture[ i ] = TextureLoader.FromFile( device, mat[ i ].TextureFilename ); } //カレントディレクトリを元に戻す Directory.SetCurrentDirectory( temp ); return model; } }
いつも通り、最低限必要なものだけです。