ICENodes は、ICENodeDef オブジェクトで構成されています。これは、入出力ポート(ICENodeDef::AddInputPort、ICENodeDef::AddOutputPort)、グループ(ICENodeDef::AddPortGroup)の定義を含む API を提供し、スレッド モデル(ICENodeDef::PutThreadingModel、ICENodeDef::GetThreadingModel)を指定します。
各カスタム ICENode は、少なくとも 1 つの出力ポートを持ちますが、入力ポートはゼロの場合もあります。 各ポートは、読み書きする必要のある特定のデータ用に設定する必要があります。 ICENodePorts はグループで定義する必要があり、含めることのできるポートの数は無制限です。通常、同じ論理グループにポートを再グループ化しますが、グループごとに 1 つのポートを定義してもかまいません。 同じグループに入力ポートと出力ポートを混在させることはできません。
入力ポートと出力ポートは、以下の 3 つのカテゴリのタイプ セットで定義された強力なタイプ分類システムを使用します。
ポートでサポートされるデータのタイプ。 使用可能なデータ タイプのリストについては、「siICENodeDataType」を参照してください。
データが Evaluate コールバックに渡されるときの格納方法。使用可能な構造タイプのリストについては、「siICENodeStructureType」を参照してください。
データが評価される対象のエレメントを指定します。 使用可能なコンテキスト タイプのリストについては、「siICENodeContextType」を参照してください。
ポートのタイプは 3 つの値のセットで指定されます。1 つの値が各カテゴリを表します。次に、その例を示します。
// single array of vector3 elements evaluated for each mesh vertex siICENodeDataVector3 + siICENodePortStructureSingle + siICENodeEvaluationContextComponent0D: // single array of booleans evaluated per object siICENodePortDataBool + siICENodePortStructureSingle + siICENodeContextSingleton: // 2D array of long values evaluated per mesh polygons siICENodePortDataLong + siICENodePortStructureArray + siICENodeEvaluationContextComponent2D:
ユーザ定義タイプを作成して、カスタム ノード ポートを定義する他のデータ タイプと同じように使用できます。 通常、カスタム タイプは ICE でユーザ定義データ(バイナリ データなど)をグラフ内に継承させるために使用されます。 カスタム タイプは ICENodeDef オブジェクトを使用して定義できます。また、グローバル識別子(文字列名)、基本データ型(siICENodeDataCustomType)、およびポート接続ハンドル カラーを使って識別されます。
通常、同じカテゴリのポート タイプを組み合わせて、ポートのポリモーフィズムを行うことができます。 ポリモーフィズムとは、複数のタイプをサポートする ICENode ポートの機能を指します。これが役に立つのは、入力データが汎用的に使用される汎用ノードを定義する必要がある場合です(詳細については、ポリモーフィズム処理のセクションを参照)。複数のタイプをポートに割り当てるには、AddInputPort メソッドおよび AddOutputPort メソッドでビット単位の OR オペレータを使用します。
コンストレイント マップは、複数の入力ポートと出力ポートが同じデータ タイプ、構造タイプ、またはコンテキスト タイプを使用するように強制します。 たとえば、マッピングを使用して、入力ポート A および出力ポート B のコンテキストを siICENodeContextSingleton に強制することができます。状況によっては、出力ポートの場合と同様、入力ポートどうしの間で制限を課すことができます。 マッピングをセットアップするには、ポートのタイプまたは構造を整数と関連付けます。一致する必要のあるポートに同じ整数を使用するか、制限が不要な場合は ULONG_MAX を使用します。 ポート コンストレイントは、AddInputPort および AddOutputPort でポートを定義するときに指定されます。
ポートとグループは一意の識別子で定義する必要があります。 ICENodeDef でエラーが発生するのは、重複する識別子が使用された場合です。確実に一意の識別子を使用するための簡単な方法は、列挙を使用することです。一意の ID を使用することで、ICENode のポートまたはグループが削除されたり新規に追加されたりした場合に、ポートの完全な下位互換性も確実になります。特定の ICENode の前のバージョンで保存された古いシーンのロードに影響を与えることなく、ポートの追加や削除を実行できます。
下位互換性を維持するため、列挙 ID を変更することはできません。 ある識別子が使用されると、その識別子が ICENode の寿命の間そのまま保持され、別のポートやグループがその識別子を再使用することはできません。新しいポートが必要な場合は、列挙の最後にのみ新しいIDを追加できます。