C#でツールを作る その12 -XファイルからMeshを生成-
前回、頂点バッファ、インデックスバッファ、属性バッファから直接Meshを構築しましたが、毎回このようにMeshを作ると面倒なので、Xファイルからロードしてみます。
Xファイルには以下の内容が含まれます。(メタセコから生成されるXファイル)
- 頂点配列
- インデックス配列
- 属性配列
- マテリアル配列
- テクスチャ座標配列
- など
TextureLoader.FromFile()を使用することで、頂点バッファの生成などの面倒な部分が自動的に処理されます。
- はちゅねミクは三次元CG@七葉からお借りしました。ありがとうございます。
XファイルからMeshを生成
//カレントディレクトリを変更 String temp = Directory.GetCurrentDirectory(); Directory.SetCurrentDirectory( Application.StartupPath + @"\..\..\miku\" ); //Xファイルをロードし、Meshを生成 ExtendedMaterial[] mat; mesh = Mesh.FromFile( "miku01.x", MeshFlags.SystemMemory, device, out mat ); texture = new Texture[ mat.Length ]; material = new Material[ mat.Length ]; //Materialのコピーとテクスチャのロード for( int i = 0; i < mat.Length; i ++ ) { material[ i ] = mat[ i ].Material3D; material[ i ].Ambient = material[ i ].Diffuse; texture[ i ] = null; if( mat[ i ].TextureFilename != null ) texture[ i ] = TextureLoader.FromFile( device, mat[ i ].TextureFilename ); } //カレントディレクトリを元に戻す Directory.SetCurrentDirectory( temp );
破棄
- テクスチャ配列とMeshを破棄
if (texture != null) { foreach( Texture t in texture ) { if( t != null )t.Dispose(); } } if (mesh != null) { mesh.Dispose(); mesh = null; }
描画
-テクスチャの設定を追加 for( int i = 0; i < material.Length; i ++ ) { device.Material = material[ i ]; device.SetTexture( 0, texture[ i ] ); mesh.DrawSubset( i ); }