バージョン 2.3.0 で追加.

Blocks

Blocksとは、ユーザの用意したコードを、入れる器です。Blocksを使うことで、複雑なノードの実行様態をカスタマイズすることが可能です。さらには一歩踏み込み、自前のblockを組み込み動作するあたらしいプリセットを作成することもできます。

Blocks を伝統的なプログラミング言語でのループと同様な操作に使用することができます。とはいえBlocksにはより強力な点があります。Blocksでは条件判定に使用したり、複数のblockを状態に応じて異なる振舞をさせることができます。

参考として Fabric.Compounds.Blocks.Geometry.PolygonMesh.Deform プリセット(タブメニューから PolygonMesh.Deform としてアクセス)では、 mesh ポートと deform block の2つをとります。 deform ブロックは deformation そのものです:

../_images/cug_blocks_deform_preset.png

ノードをシフト+ダブルクリックし、blockの定義に入ります。より詳しくは以下を参照 block instance:

../_images/cug_blocks_deform_preset_block_inst.png

中を見ると blockインスタンスには、既定の定義があることがわかります。この場合、単に newPosition のポート値を originalPosition ポートへと設定しています。実際には何もデフォーム行いません。しかしここから定義に変更を加えていき、望みのデフォーム効果を形作っていくことができます。

blockインスタンスの定義とは、それぞれのデフォームノードに固有のものになります。つまり各デフォームノードに異なる変型を指定することができます。

「固定」Blockポート

blockインスタンスの中のポートで鍵アイコン付きのものを fixed block ports と呼びます。これらのポートはプリセットにより定義され(例の場合では Deforme プリセット)ています。インスタンスで定義するものではありません。つまり名前の変更や追加、削除をインスタンスで行うことはできません。インスタンスが実行される時、プリセットから 固定inputポート, 固定IOポートが提供されそれらのポート値を受け取り、インスタンスの仕事を続行します。 Deform プリセットの例では、 originalPositionoriginalNormal の値がblockインスタンスに提供され、インスタンスは実行結果である newPositionDeform プリセットに提供します。

公開Blockポート

Blockインスタン中において、グラフを機能させるため blockの外部へとポートを外部公開することができます。たとえば、デフォメーションを amount ポート一個で単純な押出変型を定義します:

../_images/cug_blocks_deform_push.png

固定ポートで「ない」 amount ポートに注目してください。これが公開blockポートです。公開Blockポートは通常のblockポート同様動作します。つまり同じ多態性についての規則 (see Polymorphic (多態性)ノード)に従います。ただしblockでは inputポートのみを外部公開とすることができます。 IOポートやoutputポートではできません。

“Back” ボタンを押し直前のグラフへと戻ると先ほど公開したポートを確認できます。

../_images/cug_blocks_deform_preset_exposed_port.png

amount が接続可能になっていることに着目ください。あたらしいblockインスタンスのヘッダーメニューからそのポートを作ることもできます。通常のノードのポートと一緒ですね。

Blockのあるノードの見方

素の状態では、blockインスタンスを一つ以上もつプリセットであれば、シフトを押しながらダブルクリックすることで blockインスタンスを編集できます。複数ある場合はマウス直下のインスタンスの編集になり、ノードの上方であれば、はじめのインスタンスを編集します。この挙動は、通常blockを用いたプリセットを使用している場合blockを編集したいであろうからです。ただし、ノード自身を見る(編集)ことも可能で、右クリックからコンテキストメニューを開き “Edit Node” を選びます。

Blocksのサンプル

Fabric は blocksの使用法に主眼おいた多数の用例を揃えています。 $FABRIC_DIR/Samples/Canvas/Blocks を御覧ください。blockがどのようなものであるかの理解するにはこれらのサンプルシーンがどのようにして機能するかを調べることをお薦めします。

Blockプリセット

Fabric に同梱したプリセットには blockの利用に特化したものが多数あります。多くは Fabric.Compounds.Blocks 以下にあります。さらに、例に使用した PolygonMesh.Deform プリセットなど、幾つかは以下の場所にあります:

Fabric.Core.Control.ForLoop
単純な直列(serial)ループです。各ループの繰り返し処理に exec ポートを引いてきます。
Fabric.Compounds.Blocks.Array.Filter
ある配列の要素を条件に応じて除去します。条件は block として公開されます。
Fabric.Compounds.Blocks.Array.Modify
既存の配列から1対1対応したあたらしい配列を作成します。他のプログラミングシステムではこの種の操作を “Map” と呼ぶことがあります。
Fabric.Compounds.Blocks.Math.Accumulate
与えた繰り返し番号に基づき、値を新しい値に置き換えます。これは配列の作成や値の集計によく用いる操作です。他のプログラミングシステムではこの種の操作を “Fold” と呼ぶことがあります。
Fabric.Compounds.Blocks.Math.AccumulateWhile
Fabric.Compounds.Blocks.Math.Accumulate とほぼ同じす。特定の条件(blockに公開)が真の間でのみ動作する点が違います。
Fabric.Compounds.Blocks.Array.AnyElementMatches
配列要素の中に、blockのテストにマッチするものがあるかどうかをテストします。

Blockのカスタムグラフ・関数での使用

Blockはインラインもしくは公開プリセットであろうと、ユーザ独自のカスタムグラフ・関数において使用できます。詳しくは Canvasプログラミングガイドの Block についての章 を参照してください。