C#でツールを作る その12 -XファイルからMeshを生成-

前回、頂点バッファ、インデックスバッファ、属性バッファから直接Meshを構築しましたが、毎回このようにMeshを作ると面倒なので、Xファイルからロードしてみます。

Xファイルには以下の内容が含まれます。(メタセコから生成されるXファイル

  • 頂点配列
  • インデックス配列
  • 属性配列
  • マテリアル配列
  • テクスチャ座標配列
  • など

TextureLoader.FromFile()を使用することで、頂点バッファの生成などの面倒な部分が自動的に処理されます。



  • はちゅねミクは三次元CG@七葉からお借りしました。ありがとうございます。

XファイルからMeshを生成

  • TextureLoader.FromFile
  • Material配列の作成
  • テクスチャ配列の作成
  • とりあえずテクスチャはXファイルと同じディレクトリに。
//カレントディレクトリを変更
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 );
}