|
サンプルデータ
Vector3Union
まずは、標準で用意されているサンプルデータから始めると良いです。
Softimage SDK まわりのサンプルのワークグループは、
C:\Program Files\Autodesk\ <バージョン> \XSISDK\examples\workgroup にあります。
具体的には、今回は
ファイル>プラグインマネージャー から
C:\Program Files\Autodesk\Softimage 2012 SP1\XSISDK\examples\workgroup を指定します。
色々と実験をする時は このワークグループ を設定すると色々なサンプルが読み込まれます。
必要無くなったら、ワークグループからチェックを外せば良いだけです。
今回は、ICEのカスタムノードなので、そのサンプルデータは
C:\Program Files\Autodesk\Softimage 2012 SP1\XSISDK\examples\workgroup\Addons\CustomICENodes
内にあり、
ソースは 各ツール名の中、
シーンデータは
C:\Program Files\Autodesk\Softimage 2012 SP1\XSISDK\examples\workgroup\Addons\CustomICENodes\Data\Project\Scenes
にあります。
例として vector3_union を取り上げたいと思いますので、Vector3Union.scn というシーンを開きます。
シーンを開いて再生すると、
パーティクルが発生して 2つのNullに範囲内に入って来た点に、色とサイズを設定した新たな点を追加する、
というものですが、2つNullがあるので、
vector3_union というカスタムなICEノードで 2つの3DVectorを合成している、
というものです。
|
SDK_Wizards
ICENodeWizardPPG
では、このカスタムICEノード vector3_union を SDK_Wizards を使って作成する手順を紹介します。
ファイル>プラグインマネージャー を開き、
ユーザールート > プラグイン > 新規作成 > ICEノード を選択します。
ちなみに、ユーザールート というのは
C:\users\ <ユーザー名> \Autodesk\ <バージョン> \Application\Plugins
内のことで、
今回の具体的例では、
C:\users\ritaro\Autodesk\Softimage_2012_SP1\Application\Plugins 内にプロジェクトファイルが書き出されます。(変更可)
(あれ、GnuのMakeファイルまであるよ、と思った方、ハイそうです、Linuxでのコンパイル用です。)
以下の ICENodeWizerd のもっと詳しい情報は、
Softimage SDK プログラミング ガイド > SDK によるカスタマイズ > カスタム ICENode > カスタム ICENode ウィザード
に書かれていますので参照してください。
すると、自動的に設定画面 ↓ が表示されるので、ここに各種設定を入れていきます。
まず ICENode情報 タブには
| タイプ | Vector3UnionNode |
| UI名 | Vector3Union ICETree上に持って来た時のノードの名前 |
| カテゴリー | Custom ICENode ICETreeの左側の検索項目内に入る カテゴリーの名前 |
| 処理モード | siICENodeMultiThreading (デフォルト) |
| カラー |
ICEノードの色
|
| 製作者 | (任意に) |
| コーディング言語 | [CPPしかない] |
| 出力ディレクトリー | (ユーザールート;コンパイル環境先でも良い) |
と、同時に、エクスプローラー上では SDK_Wizrds というモデルの中に [C] ICENodeWizard というノードが作成されています。
設定画面を閉じてしまっても、このノードから開けますし、シーンを保存してもノードは残っています。
入力ボート タブは 左側の入力接続部の設定を作ります。
| 入力ポートの名前 | InArray1 |
| データタイプ | siICENodeDataVector3 |
| 構造タイプ | siICENodeStructureArray |
| コンテキストタイプ |
siICENodeContextComponent0D|siICENodeContextSingleton
↑後で下の行で追記する |
| コンストレイントポートタイプ | OFF |
| グループID | 100 (デフォルト) |
などを右の三角から開いたメニューから選択するのですが、
最後の コンテキストタイプは 下の行を作ってから |siICENodeContextSingleton を追記しています。
項目は データタイプ で選んだ種類によって変化します。
例えば、siICENodeDataFloat を選択すると、下に UIの範囲指定が表示されます。
記入したら、[追加] っていうボタンを押すと 下に設定情報の行が表示されます。
ここでは、左側に同じ種類の2つのポートを作成するので、
InArray1 ポート名で [追加] のボタンを押し、
InArray2 ポート名でもう一回 [追加] ボタンを押して、2行を作成します。
PortIDは上から 0 と 1 になっています。
出力ボート タブは 右側の出力接続部の設定を作ります。
入力ポートの時と同じで メニューから選択します。
| 出力ポートの名前 | result |
| データタイプ | siICENodeDataVector3 |
| 構造タイプ | siICENodeStructureArray |
| コンテキストタイプ |
siICENodeContextComponent0D|siICENodeContextSingleton
↑後で下の行で追記する |
| コンストレイントポートタイプ | OFF |
最後の コンテキストタイプは 下の行を作ってから |siICENodeContextSingleton を追記しています。
result ポート名で [追加] のボタンを押して 1行を作成します。
コード タブは いよいよ 作った内容を CPP として書き出します。
サンプルコードの追加 にチェックを入れると、各関数の開始部分に、ブロックのコーディング方法を説明する便利なコメントが書かれます。
[コードの生成] ボタンを押すと
Vector3UnionNode.cpp と Vector3UnionNode.vcproj を ユーザールート に出力します。何度でも・・・・
|
VC++ 2008 上の作業
コンパイル
上記 SDK_Wizards で作成されたのは枠であって、プログラム部分の追記が必要です。
作った VC32XSIx86.bat のショートカットから VisualStudio2008Express を起動し、
作成された プロジェクトファイル Vector3UnionNode.vcproj を開きます。
まず、 #include の最後に
を追記します。
そして、125行からの
// Add code to set output port...
CDataArray2DVector3f::Accessor InArray1SubArray = InArray1Data[it];
for (ULONG i=0; i<InArray1SubArray.GetCount( ); i++)
{
Application().LogMessage( CString( InArray1SubArray[i] ) );
}
CDataArray2DVector3f::Accessor InArray2SubArray = InArray2Data[it];
for (ULONG i=0; i<InArray2SubArray.GetCount( ); i++)
{
Application().LogMessage( CString( InArray2SubArray[i] ) );
}
|
部分を
// Add code to set output port...
CDataArray2DVector3f::Accessor a1 = InArray1Data[it];
CDataArray2DVector3f::Accessor a2 = InArray2Data[it];
// Sort arrays in place
ULONG nCount1 = a1.GetCount();
ULONG nCount2 = a2.GetCount();
std::sort( &a1[0], &a1[0]+nCount1 );
std::sort( &a2[0], &a2[0]+nCount2 );
// Resize out to max array
CDataArray2DVector3f::Accessor out = outData.Resize( it, nCount1 + nCount2 );
// Union of a1 + a2
MATH::CVector3f* pLast = std::set_union( &a1[0], &a1[0]+nCount1, &a2[0], &a2[0]+nCount2, &out[0]);
// Resize out with number of elements in union
ULONG nOutCount = (ULONG)(pLast - &out[0]);
outData.Resize( it, nOutCount );
|
と書き換えます。

ビルド を実行して コンパイルが無事通ります。
出来上がった Vector3UnionNode.dll は 54KB ありました。もちろんこの状態で動作します。
デバッグ時にトレースできるようないろいろな情報が入った状態、ビルドがデバッグで実行されています。
下の動作確認が済んだら、ビルド > 構成マネージャ で Release に設定してコンパイルすると 20KBになりました。
|
動作確認
|