アトリビュートと入力ウィジェット
MFGではアットマーク @ で始まるものをアトリビュートと呼んでいます。 入出力のダイアログに関わるものや @bouds などがそれです。
この章ではアトリビュートについて見ていきます。
アトリビュートは通常のスクリプトの型システムとは異なるルールでパースが行われるため、 シンタックスが他とは異なる所があります。
アトリビュートの一覧
MFGには以下のアトリビュートがあります。
@title@bounds@print_expr- param系
@param_i32,@param_f32@param_f32v2,@param_f32v4- (かつて
@param_posというのもあったが現在では非推奨、param_f32v2を使ってください)
- (かつて
param系は入力ウィジェットが関わるので後半でまとまて扱う事にし、それ以外を順番に見ていきます。
アトリビュートは @ マークで始まり、他の式の中などには使われず、@bounds以外はグローバルブロックでしか使う事は出来ません。(defの中などでは使えない)
グローバルブロックについてはテンソルを参照ください。
@title
そのフィルタのタイトルを指定します。
@title "ネガポジ反転フィルタ"
@titleのあとはスペースをあけてダブルクオートでくくった文字列を書きます。
MFGには型としては文字列型は存在せず、文字列の変数というのは作れません。 文字列はこのアトリビュートでのみ登場します。
@title で指定されたタイトルは、フィルタ一覧のメニューで使われたり、 実行時にダイアログのタイトルで使われたりします。
@bounds
テンソルの定義の前につき、テンソルの幅と高さを指定します。
@bounds(50, 50)
def gridNoise |x, y| {
[2.0*rand()-1.0, 2.0*rand()-1.0]
}
@boundsの中の引数の個数で、そのあとに続くテンソルの次元が決まります。
@boundsに指定するのは整数です。 ローカルテンソルはさらにリテラルでないといけない、という制約がつきます。
@print_expr
これはデバッグ用の機能です。 グローバルなブロックでのみ使う事が出来ます。(テンソル定義の中のブロックでは使えません)。
中に入れた値が出力ウィンドウに出力されます。
@print_expr(sin(3.2)/2.0)
簡単なデバッグの為の調査に使います。
より本格的なデバッグが必要な時は、 結果の色に情報を入れてスポイトで調べる方がより詳しく調べる事が出来ます。
param系のアトリビュートと入力ウィジェット
param系のアトリビュートは、アトリビュートでありながら、変数の定義でもある、 という所でそれ以外のアトリビュートと大きく異なります。
典型的には以下のようなものがparam系のアトリビュートになります。
@param_f32 radius(SLIDER, label="半径", min=0.5, max=300.0, init=3.0)
作られるウィジェットの種類と作られる変数、という2つの角度から考えるとparam系アトリビュートの理解はしやすいと思います。
作られる変数
param系アトリビュートは変数が作られます。そしてユーザーの入力の結果がこの変数に入ります。
先程の例を見てみましょう。
@param_f32 radius(SLIDER, label="半径", min=0.5, max=300.0, init=3.0)
この場合、radiusという変数がf32の型で作られます。
アトリビュート名は、作られる変数の型に対応しています。
| アトリビュート名 | 作られる変数の型 |
|---|---|
@param_i32 | i32 |
@param_f32 | f32 |
@param_f32v2 | [f32, f32] の2次元ベクトル |
@param_f32v4 | [f32, f32, f32, f32] の4次元ベクトル |
MFGのIRとしてはなんの変数が作られるか、が重要で、 それをどのようなウィジェットでどのように受け取っているかは関係ありません。 そこでこのアトリビュート名と次に続く識別子だけが意味を持ちます。
その先のカッコの引数は、MFGの外部の世界がUIの表示に使う情報となります。
paramの引数とウィジェット
paramの最初の引数はウィジェットの種類を表します。 ウィジェットの種類は以下があります。
- SLIDER
- DIRECTION
- CHECKBOX
- POINTER
- COLOR_PICKER
このどれが来るかで、そのあとに来る名前付き引数が変わります。
名前付き引数の順番は任意ですが、この先頭のウィジェットの種類だけは最初に来る必要があります。
以下、それぞれのウィジェットを見ていきましょう。
SLIDERウィジェット
数値を選ぶスライダー。
@param_i32と@param_f32で使えるウィジェット。
例:
@param_f32 radius(SLIDER, label="半径", min=0.5, max=300.0, init=3.0)
引数*
- label: スライダーの横に表示されるラベル。文字列。
- min: スライダーの最小値。
@param_i32のときはi32で、@param_f32のときはf32で指定する(以下同様) - max: スライダーの最大値。
- init: スライダーの初期値。
DIRECTION
向きを選ぶウィジェット。 @param_f32で使える。
結果は0.0〜3.1415... のf32のラジアン。
例:
@param_f32 angle(DIRECTION, init=1.0)
引数*
- init: ウィジェットの向きの初期値。ラジアンで指定。
CHECKBOX
チェックボックスのウィジェット。 @param_i32で使える。
結果は0か1のi32。
例:
@param_i32 show_edge(CHECKBOX, label="エッジの表示", init=0)
引数*
- label: チェックボックスに表示されるラベル
- init: チェックボックスの初期値。0で非チェック、1でチェック状態から始まる
POINTER
キャンバス内の位置を指定する。結果はf32の2次元ベクトルで、0.0〜1.0で返る。
@param_f32v2で使える。
例:
@param_f32v2 ORIGIN(POINTER, label="中心")
引数:
- label: 位置を選ぶウィジェットの上に表示されるラベル。文字列。
COLOR_PICKER
色を選ぶ。結果はf32の4次元ベクトルで0.0〜1.0のBGRAの順番。
@param_f32v4で使える。
例:
@param_f32v4 fgcolor(COLOR_PICKER, label="色", init=[0.0, 0.0, 1.0, 1.0])
引数:
- label: カラーピッカーに表示されるラベル。文字列。
- init: カラーピッカーの初期値。