KL Function エディタ¶
Canvas 内に独自のKL関数ノードを作成できます。これらのノードは LLVMを使用した、グラフに対する just-in-time (JIT)コンパイルと同じ処理過程を経て実行されます。
カスタムKL関数の作成には、グラフビューの背景を右クリックし、 New empty function を選びます。すると関数ノードがつくられ、KL関数エディタが開きます。既存の関数ノードをKL関数エディタで開くには、シフトキーを押下しながらダブルクリックするか、そのノードを右クリックしコンテキストメニューより Edit を選びます。
KL function エディタは2つの基礎要素 ―portリストと、codeウィンド から成ります。
KL関数ポート¶
ポートの名前、ポートの型、データの型を埋め、 “Add Port” をクリックすることでポートの追加ができます。既定ではポートの型は多態ですが、固定の型を選ぶこともできます。KL関数の多態性については 多態性を持つノード(Polymorphic nodes) を参照してください。
ポートの削除には、ポート左の赤いマイナスアイコンをクリックします。シフトクリックやコントロールクリック(macOSであればコマンドクリック)をすることで複数のポートを選択し、右クリックから “Remove Selected” することもできます。
ポートの詳細を編集することもできます。たとえばUIメタデータです。ポート左の鉛筆アイコンをクリックします。
ドラッグ・アンド・ドロップによりポートを再配置することができます。シフト/コントロールクリックによる範囲選択に対しても機能します。
ポートはKLコード内より、そのポート名で参照できます。
注釈
KLエクステンションに実装された型を使用するポートを追加する際は、そのエクステンションをエディタウィンド左上 Required Extensions 欄に記入します。Requirementsフィールド¶
KL関数ノードがディスク上のなんらかのエクステンションに依存する場合、エクステンションの requirement定義を requirements テキストフィールドに記述します。詳細は 必要エクステンションの定義 参照。
KL code ウィンド¶
KL関数ノードのエントリポイントは dfgEntry ブロックになります。Canvasコンパイラは dfgEntry を適切な関数宣言 ―つまり必要なポートや機能の定義― に置き換えます。以下の例では3つの Float32 ポートがあり、エントリポイントの定義はこのようになります。
dfgEntry {
result = cos(a) * b;
}
もちろん、KL関数エディタ内ではオペレータを直接定義できます。例えば2つの Float32[] ポートをもつ、PEX(並列実行)オペレータ使用例は:
operator task<<<index>>>(Float32 values[], io Float32 result[]) {
result[index] = cos(values[index]);
}
dfgEntry {
result.resize(values.size());
task<<<values.size()>>>(values, result);
}
ウィンド左上の Save を押しKL関数をコンパイルします。 Reload ボタンを押すと、KL関数で使用する外部プリセットファイル中のKLコードを読み込み直します。KL関数エディタから抜ける際、未保存の変更がある場合には警告UIが表示されます。
このコードウィンドではオブジェクト、メソッドの基本的なコード補完を提供しています。Ctrl-スペース をタイプすると、コード補完メニューが表示されます。(例:新規行で『V』と書き始めると、『V』で始まるオブジェクト、Vec2, Vec3,などがリストアップされます)オブジェクトのメソッドやシグネチャもコード補完対象となります。
より詳しい KL の機能については KL プログラミングガイド を参照してください。
注釈
KL関数ノード内であらたにデータ型を定義することも可能です。ただしデータ型の実装はKLエクステンション内で行うことを強くお薦めします。Canvasコンパイラより変更を追跡させやすくするためです。エディタウィンド左上の Required extensions 欄に使用するKLエクステンションを追記し、KL関数がそのエクステンションを確実に読み込むようにします。Canvas KLコード内の特別な構成物¶
Canvas内で使われる、特定の KLコード構成物がいくつかあります。以下:
dfgEntry
- Canvasノードのエントリポイントです。上述のとおりです。
dfgExecute(portName)
- 明示的なexecuteポートの実行を強制します。詳細は 明示的な Executeポート を参照してください。
dfgNodePath
- 文字列定数で、ノードが実行されるパスを表します。
dfgPullBlockPort
- Pull a block port. For more information, see the blocks section of the Canvas Programming Guide