C#でツールを作る その12.2 -Modelクラス-

Mesh、Material、Textureの管理が面倒になってきたのでクラス化しましょう。

サンプル

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;
        }
    }

いつも通り、最低限必要なものだけです。