このページでは、ディペンデンシー グラフ ノード プラグインの少し複雑な例を紹介しています。
このページのコード フラグメントは、simpleLoftNode/simpleLoftNode.cpp の例から取ったもので、カーブを入力として取ってサーフェスを作成します。
このサンプルのアトリビュートは、入力カーブと出力サーフェスの 2 つだけです。
MStatus simpleLoft::initialize() { MStatus stat; MFnTypedAttribute typedAttr;
前のサンプルでは、アトリビュートが単純な浮動小数点数だったので、MFnNumericAttribute を使用しました。このサンプルでは複雑なデータを使用するので、MFnTypedAttribute を使用します。
inputCurve = typedAttr.create( "inputCurve", "in", MFnData::kNurbsCurve, &stat ); if( !stat ) return stat;
カーブ オブジェクトが持つアトリビュートが作成されます。MFnData の Type 列挙では、型付きアトリビュートを使用して作成できるデータ型がリストされます。このリストには、カーブ、サーフェス、メッシュ、文字列、ユーザ定義データなどが含まれます。
outputSurface = typedAttr.create( "outputSurface", "out", MFnData::kNurbsSurface, &stat ); if( !stat ) return stat;
作成したサーフェス オブジェクトが持つアトリビュートが作成されます。
typedAttr.setStorable( false );
サーフェスは生成されるオブジェクトなので、ノードをファイルに保存するときに保存する必要はありません。
addAttribute( inputCurve ); addAttribute( outputSurface ); attributeAffects( inputCurve, outputSurface );
最後に 2 つのアトリビュートをノードに追加し、attributeAffects() を使用して、入力カーブが修正されたらサーフェスを再作成する必要があることを示します。
return MS::kSuccess; } MStatus simpleLoft::compute( const MPlug& plug, MDataBlock& data ) { MStatus stat; if ( plug == outputSurface ) {
ノードの計算が適切なアトリビュートのみで実行されることが保証されます。
MDataHandle inputData = data.inputValue( inputCurve, &stat ); if( !stat ) return stat;
前に説明したように、データ ブロックには、ノードのすべてのデータが能率的な方法で含まれます。このデータにアクセスするには、データ ハンドルが必要です。
else { MObject curve = inputData.asNurbsCurve(); MFnNurbsCurve curveFn( curve, &stat ); if( !stat ) return stat;
ここでデータ ハンドルを使用して入力カーブを取得し、MFnNurbsCurve 関数セットに渡して操作することができます。
else { MDataHandle surfHandle = data.outputValue( outputSurface, &stat ); if( !stat ) return stat;
2 つ目のデータ ハンドルは、データ ブロックのサーフェス部分にアクセスするために使用します。
MFnNurbsSurfaceData dataCreator; MObject newSurfData = dataCreator.create( &stat ); if ( !stat ) return stat;
このサンプルでは、MFnNurbsSurface を使用せずに MFnNurbsSurfaceData を使用することに注意してください。DAG オブジェクトではなく、ディペンデンシー グラフで渡すデータ オブジェクトを作成するので、必要になります。ディペンデンシー グラフ ノード内でオブジェクトを作成する場合は、常にこのようになります。サーフェス データを DAG に接続する特殊なノードがあるので、ジオメトリを作成するノードで DAG ノードを作成する必要はなく、データのみを作成します。
MObject newSurf = loft( curve, newSurfData, stat ); if( !stat ) return stat;
カーブからロフトされたサーフェスを作成するユーザ定義コードをコールします。このメソッドは、MFnNurbsSurface を使用してサーフェス データ オブジェクト上で動作します。MFnNurbsSurface は、DAG 内のサーフェス上で動作しているかどうかを判断します。DAG 内のサーフェス上で動作していない場合、一部のメソッドはエラーになります。たとえばサーフェス データ オブジェクトは DAG 内にないため、ワールド空間の位置を判断することには意味をなさず、そのメソッドはエラーになります。
surfHandle.set( newSurfData );
新しいサーフェスをデータ ブロックに追加し、出力を変更します。
stat = data.setClean( plug ); if( !stat ) return stat;
プラグが問題なく再計算されクリーンになったことがシステムに通知されます。
} } } else { cerr << "unknown plug\n"; return MS::kUnknownParameter; }
プラグが認識されない場合や、特定のキー設定可のプラグで計算が行われない場合は、MS::kUnknownParameter を返す必要があります。これによりベース クラスの compute() メソッドがコールされ、既定のデータ処理を行い次の結果を返します。
return MS::kSuccess; }