CG・コンテンツ制作
  1. CG・コンテンツ制作トップ
  2. DAIKIN CG Channel
  3. UsersNotes
  4. ICE
  5. カスタムICEノードの作成;Making ICE Custom Node
SUITE USERS NOTES
カスタムICEノードの作成; ICE SDK Wizards
Making ICE Custom Node
(プログラマー・TA向け)
ice_c_01
SUNdan_ml

プロローグ
今回、CEDEC2011にてICEプレゼンを行い、
独自のICEノードでデータをSoftimageに読み込んで来る様子を紹介しました。
で、質問は、カスタムなICEノードを作成するSDKが存在するのか?でした。
答えはハイ、なんですが、SoftimageのPlugin製作と同様に、
便利なウィザードが存在します。
ここでは、PCにC++コンパイル環境の設定ICE SDK Wizardsを使って
DLLプラグイン形式のカスタムICEノードの作成方法を紹介します。

 > 前準備環境設定
 > コンパイル環境

 > サンプルデータ
 > Vector3Union

 > SDK_Wizards
 > ICENodeWizardPPG

 > VC++ 2008 上の作業
 > コンパイル

 > 動作確認
 > 試行錯誤
ice_c_03
パソコンのスペックWindowsXP SP3、Intel Core2Duo 3G、 RAM; 3G、NVIDIA Quadro FX1700



前準備環境設定
コンパイル環境
まずは、Softimage SDK プログラミング ガイド > C++ API 開発 > C++ プラグインのビルド >
からプラグインのコンパイルを見てみると、

推奨セットアップ
Windows の場合、推奨開発環境は Visual Studio 2005 SP 1 です。
プラグイン ウィザードを使用して、Visual Studio 2005 SP 1 のプロジェクトを作成します。
ただし、現在も Visual Studio 2008 で v2011-SP プラグインをコンパイルできます。

と書かれていますので、間違ってもVisualStudio2010で挑戦しないでください。(変換がうまくいきませんですし)

で、ここでは実験で、個人プロジェクトの範囲のテストなので、VisualStudio2008Expressで行ってみます。
(商業利用の場合は、ちゃんと買ってね)

Visual Studio 2008 Express Edition with Service Pack 1 のダウンロード
http://www.microsoft.com/japan/msdn/vstudio/2008/product/express/
からVisual C++ 2008
vcp
Web インストール (ダウンロード)からインストーラーをダウンロードして、vcsetup.exeをインストールします。
そのままでは28日間の無償利用なので、30日以上無料の登録をします。
登録をすると登録キーが送られて来るので、それを[製品の登録]  > [登録を完了する] をしておきます。

Windows でプラグインをコンパイルする
バッチ ファイルを使用して Visual Studio の設定および起動を行うと、
ビルドエラーやリンクエラーを回避した、XSISDK_ROOT などの環境変数が適切に設定されます。
これは、バッチファイルが Softimage コマンドプロンプトを開いて Visual Studio を起動するシミュレートを行うからです。

と書かれているので、そのバッチファイルを作成しましょう。
PCは32bitで、Softimageのバージョンは2012SP1とします。

32 ビット環境で Softimage x86 プラグインをコンパイルする

の項目を参照します。バッチファイルの名前はVC32XSIx86.batにしたとします。

Visual Studio 2008の場合は、VC32XSIx86.batの中身はこうなります。

@echo off

call "C:\Program Files\Autodesk\Softimage 2012 SP1\Application\bin\Setenv.bat"
call "C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86

set PATH
set XSISDK_ROOT="C:\Program Files\Autodesk\Softimage 2012 SP1\XSISDK"

"C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe" /useenv

echo on

ところが、VisualStudio2008Expressでは、devenv.exeが無いんですよね。で

@echo off

call "C:\Program Files\Autodesk\Softimage 2012 SP1\Application\bin\Setenv.bat"
call "C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86

set PATH
set XSISDK_ROOT="C:\Program Files\Autodesk\Softimage 2012 SP1\XSISDK"

"C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\VCExpress.exe" /useenv

echo on

とすれば良いです。
どっちでもいいようにするには、こんな感じでしょうか。

chdir "C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE"
if exist "devenv.exe" devenv.exe /useenv
else if exist "VCExpress.exe" VCExpress.exe /useenv

用意したバッチファイルVC32XSIx86.bat
Softimageのバージョンのコマンドプロンプトのディレクトリーで実行させますので、今回は、
C:\Program Files\Autodesk\Softimage 2012 SP1\Application\bin以下に置きます。
ice_c_02
プログラム > Autodesk > AutodeskSoftimage2012SP1(32Bit)>ComandPromptで開き
VC32XSIx86を実行してVisual Studioが起動したら準備はOK♪です。
ice_c_10
起動する
ice_c_11
あとは、このバッチファイルのショートカットを作成してデスクトップにでも置いて、
アイコンも好きなものに変えておけば、いつでもここからSoftimageの環境の通ったVisual Studioが起動できます。
ice_c_12
追加情報もし、VisualStudio2008Express64BIt版をコンパイルしたい場合、なんとThe Softimage Wikiに情報がありました。
参考にしてみてください。(C++ 2010 Express:情報もあります、うまくいくのか?)
http://softimage.wiki.softimage.com/index.jsp?Cpp_64_bit_Visual_CPP_Express%28XSISDK%29



サンプルデータ
Vector3Union
まずは、標準で用意されているサンプルデータから始めると良いです。
Softimage SDKまわりのサンプルのワークグループは、
C:\Program Files\Autodesk\<バージョン>\XSISDK\examples\workgroupにあります。
具体的には、今回は
ファイル > プラグインマネージャーから
C:\Program Files\Autodesk\Softimage 2012 SP1\XSISDK\examples\workgroupを指定します。
ice_c_13
色々と実験をする時は このワークグループ を設定すると色々なサンプルが読み込まれます。
必要無くなったら、ワークグループからチェックを外せば良いだけです。

今回は、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というシーンを開きます。
ice_c_14
シーンを開いて再生すると、
パーティクルが発生して2つのNullに範囲内に入って来た点に、色とサイズを設定した新たな点を追加する、
というものですが、2つNullがあるので、
vector3_unionというカスタムなICEノードで2つの3DVectorを合成している
というものです。
ice_c_15



SDK_Wizards
ICENodeWizardPPG
では、このカスタムICEノードvector3_unionSDK_Wizardsを使って作成する手順を紹介します。
ice_c_16
ファイル > プラグインマネージャーを開き、
ユーザールート > プラグイン > 新規作成 > 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情報タブには
ice_c_17
タイプ Vector3UnionNode
UI名 Vector3UnionICETree上に持って来た時のノードの名前
カテゴリー Custom ICENodeICETreeの左側の検索項目内に入るカテゴリーの名前
処理モード siICENodeMultiThreading(デフォルト)
カラー ICEノードの色
製作者 (任意に)
コーディング言語 [CPPしかない]
出力ディレクトリー (ユーザールート;コンパイル環境先でも良い)

と、同時に、エクスプローラー上ではSDK_Wizrdsというモデルの中に[C]ICENodeWizardというノードが作成されています。
設定画面を閉じてしまっても、このノードから開けますし、シーンを保存してもノードは残っています。



入力ボートタブは左側の入力接続部の設定を作ります。
ice_c_18
入力ポートの名前 InArray1
データタイプ siICENodeDataVector3
構造タイプ siICENodeStructureArray
コンテキストタイプ siICENodeContextComponent0D|siICENodeContextSingleton
↑後で下の行で追記する
コンストレイントポートタイプ OFF
グループID 100(デフォルト)

などを右の三角から開いたメニューから選択するのですが、
最後のコンテキストタイプは下の行を作ってから|siICENodeContextSingletonを追記しています。

項目はデータタイプで選んだ種類によって変化します。
例えば、siICENodeDataFloat を選択すると、下にUIの範囲指定が表示されます。

記入したら、[追加]っていうボタンを押すと下に設定情報の行が表示されます。
ここでは、左側に同じ種類の2つのポートを作成するので、
InArray1ポート名で[追加]のボタンを押し、
InArray2ポート名でもう一回[追加]ボタンを押して、2行を作成します。
PortIDは上から0になっています。



出力ボートタブは右側の出力接続部の設定を作ります。
入力ポートの時と同じでメニューから選択します。
ice_c_19
出力ポートの名前 result
データタイプ siICENodeDataVector3
構造タイプ siICENodeStructureArray
コンテキストタイプ siICENodeContextComponent0D|siICENodeContextSingleton
↑後で下の行で追記する
コンストレイントポートタイプ OFF

最後のコンテキストタイプは下の行を作ってから|siICENodeContextSingletonを追記しています。

resultポート名で[追加]のボタンを押して1行を作成します。



コードタブはいよいよ作った内容をCPPとして書き出します。
ice_c_20
サンプルコードの追加 ON

サンプルコードの追加にチェックを入れると、各関数の開始部分に、ブロックのコーディング方法を説明する便利なコメントが書かれます。

[コードの生成]ボタンを押すと
Vector3UnionNode.cppVector3UnionNode.vcprojユーザールートに出力します。何度でも・・・・



VC++ 2008 上の作業
コンパイル
上記SDK_Wizardsで作成されたのは枠であって、プログラム部分の追記が必要です。
作ったVC32XSIx86.batのショートカットからVisualStudio2008Expressを起動し、
作成されたプロジェクトファイルVector3UnionNode.vcprojを開きます。

まず、#include の最後に

#include<algorithm>

を追記します。
そして、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 );

と書き換えます。
ice_c_31
ビルドを実行してコンパイルが無事通ります。

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



動作確認
試行錯誤
今、SDKのサンプルプログラムを作り直していて、重複すると混乱するので、
ファイル > プラグインマネージャーから設定した
C:\Program Files\Autodesk\Softimage 2012 SP1\XSISDK\examples\workgroup
のチェックを外して、ワークグループ設定を解除しておきます。
作成したプラグインを読み込みます。
ice_c_32

ファイル > プラグインマネージャー[すべて更新]ボタンを押すと、プラグインの下に現れます。
何度か試したりする場合、ここからアンロードとすれば登録から消えます。
リコンパイルはアンロードしてから行わないと上書きが禁止になってしまいます。
ice_c_33
[すべて更新]ボタンを押した時にICETree 内もリフレッシュされ、
SDK_Wizardsで指定したカテゴリー名Custom ICENodeに、コンパイルしたICEノードVector3Unionが置かれています。
左アイコンにUと書かれているのは、このノードが ユーザールート の中にあることを示しています。(Wはワークグループ)
正常動作するか確認します。

何度かやる場合は、ここら辺の繰り返しになります。

という訳で、まだまだICEが続きます。
乞う、ご期待!!
戻る次へ

お気軽にお問い合わせください

Daikin CG News お申し込み

CGクリエイター向けのセミナー・イベントやキャンペーン、製品情報をメールマガジンでお届けします。(登録無料)

Twitter

ページの先頭へ