カスタム ICENode は、自己インストール可能なプラグインとして C++ API で実装された標準的な ICENodes です。組み込みの ICENode と同様、カスタム ICENode はデータを読み込んで処理してから、書き出します。
ICENode を他のカスタム ICENode や組み込みの ICENode と併用して、コンパウンド ノードを作成することができます。 入出力データはグラフ内の他の ICENode との間でやり取りされます。データは、1D または 2D の配列にカプセル化された各 ICENode を移動していきます。 データのカプセル化のタイプは、Softimage で新しい ICENode が登録されるときに指定されます。 たとえば、浮動小数の入力接続と浮動小数ベクトルの出力接続を持つ ICENode を定義できます。
XSIPLUGINCALLBACK CStatus XSILoadPlugin( PluginRegistrar& in_reg ) { in_reg.PutAuthor(L"SoftimageUser"); in_reg.PutName(L"MySimpleICENode Plugin"); enum IDs { ID_InPort = 0, ID_OutPort = 1, ID_InGroup = 100, ID_TMAP = 400, ID_SMAP, ID_CMAP, ID_UNDEF = UINT_MAX }; ICENodeDef nodeOpDef; nodeOpDef = Application().GetFactory().CreateICENodeDef(L"MySimpleICENode"); // Add input port and group. CStatus st; st = nodeOpDef.AddPortGroup( ID_InGroup ); st.AssertSucceeded( ) ; st = nodeOpDef.AddInputPort( ID_InPort, // port index (defined in IDs enum) ID_InGroup, // index of group to add port to siICENodePortDataFloat, // data type siICENodePortStructureSingle, // structure type siICENodeEvaluationContextAny, // context type L"InFloats", // port name L"InFloats "// port scripting name ); st.AssertSucceeded( ) ; // Add output port. st = nodeOpDef.AddOutputPort( ID_OutPort, // port index (defined in IDs enum) siICENodePortDataFloat, // data type siICENodePortStructureSingle, // structure type siICENodeEvaluationContextAny, // context type L"Out2DVectors", // port name L"Out2DVectors "// port scripting name ); st.AssertSucceeded( ) ; // Register a new ICENode definition PluginItem nodeItem = in_reg.RegisterICENode( nodeOpDef ); // Set the new ICENode category nodeItem.PutCategories(L"ICENode Category Sample"); return CStatus::OK; }
Evaluate コールバックは通常、Softimage が管理するマルチスレッド コンテキストで呼び出されるため、カスタム ICENode に渡されるデータの読み書き時にスレッド ロックについて心配する必要はありません。評価スレッドは Softimage によって作成され、プロセッサごとに割り当てられるので、コンピュータのプロセッサごとに 1 つのスレッドが作成されます。 データは複数のパスで処理され、各パスは 1 つのスレッドに割り当てられます。
また、カスタム ICENode をシングルスレッド プロセスまたはマルチフェーズ プロセスで処理するように指定することもできます。シングルスレッド プロセスは、1 つのパスですべての入力データにアクセスしなければならない場合に必要になることがよくあります たとえば、1 つのパスでポイント位置セット全体にアクセスする必要があるジオメトリのバウンディングボックスを計算するためのノードを作成できます。 詳細については、「シングルスレッド カスタム ICENode」を参照してください。 マルチフェーズ プロセスは、評価するポートと処理するコンテキスト データの種類をより細かく制御できます。 詳細については、「マルチフェーズ カスタム ICENode」を参照してください。