KL Function エディタ

Canvas 内に独自のKL関数ノードを作成できます。これらのノードは LLVMを使用した、グラフに対する just-in-time (JIT)コンパイルと同じ処理過程を経て実行されます。

カスタムKL関数の作成には、グラフビューの背景を右クリックし、 New empty function を選びます。すると関数ノードがつくられ、KL関数エディタが開きます。既存の関数ノードをKL関数エディタで開くには、シフトキーを押下しながらダブルクリックするか、そのノードを右クリックしコンテキストメニューより Edit を選びます。

../_images/cpg-function-editor.png

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