// 三角形のメッシュを一つ作るコマンド・プラグイン
#include <stdio.h>
#include <maya/MString.h>
#include <maya/MIntArray.h>
#include <maya/MFloatPointArray.h>
#include <maya/MFnMesh.h>
#include <maya/MArgList.h>
#include <maya/MFnPlugin.h>
#include <maya/MPxCommand.h>
class simplePoly : public MPxCommand
{
public:
MStatus doIt( const MArgList& args );
static void* creator();
};
// コマンドで実行される計算・処理を実行するメソッド。
MStatus simplePoly::doIt( const MArgList& args )
{
int num_verts = 3; // 頂点の個数
int num_faces = 1; // フェースの個数
int edges_per_face = 3; // 1 フェースあたりのエッジの個数
MFloatPointArray pointArray; // 頂点の座標
MIntArray faceCounts; // 1 フェースあたりの頂点数
MIntArray faceConnects; // フェースの結線情報
MObject newTransform; // メッシュの親になるトランスフォーム・ノード
static int p_gons[3] = {0, 1, 2}; // 3 角メッシュの結線情報
MFnMesh fnPoly; // 作られるメッシュ
MDGModifier dgModifier; // MELコマンドを実行するための Modifier
MStatus stat;
// 各配列のクリア
faceCounts.clear();
faceConnects.clear();
pointArray.clear();
// 頂点座標を追加
pointArray.append( MFloatPoint(0.0, 0.0, 0.0) );
pointArray.append( MFloatPoint(0.0, 1.0, 0.0) );
pointArray.append( MFloatPoint(0.0, 0.0, 1.0) );
// 1 フェースあたりの頂点数を追加
for(int i = 0; i < num_faces; i++)
faceCounts.append( edges_per_face );
// フェースの結線情報を追加
for(int i = 0; i < (num_faces*edges_per_face); i++)
faceConnects.append( p_gons[i] );
// Mesh を作る
newTransform = fnPoly.create( num_verts, num_faces, pointArray,
faceCounts, faceConnects, MObject::kNullObj, &stat );
if(MS::kSuccess != stat)
{
displayError("Could not create a polygon");
return stat;
}
// シェーダーにコネクトする
MString cmd("sets -e -fe initialShadingGroup ");
cmd += fnPoly.name();
dgModifier.commandToExecute( cmd ); // コマンド(sets)の登録
MFnDagNode fnDagNode( newTransform, &stat );
if ( MS::kSuccess == stat )
{
// トランスフォーム・ノードをセレクトしておく
cmd = "select ";
cmd += fnDagNode.name();
dgModifier.commandToExecute( cmd ); // コマンド(select)の登録
}
dgModifier.doIt(); // 登録したコマンド(sets と select)の実行
return MS::kSuccess;
}
// コマンドが実行された時にコマンドの実体(インスタンス)を作って返す。
void* simplePoly::creator()
{
return new simplePoly;
}
// プラグインがロードされるときに実行される。
MStatus initializePlugin( MObject obj )
{
MFnPlugin plugin( obj, "Alias|Wavefront", "1.0", "Any");
plugin.registerCommand( "simplePoly", simplePoly::creator );
return MS::kSuccess;
}
// プラグインがアンロードされるときに実行される。
MStatus uninitializePlugin( MObject obj )
{
MFnPlugin plugin( obj );
plugin.deregisterCommand( "simplePoly" );
return MS::kSuccess;
}