Houdini 20.0 VEX

VEXコンパイラのプラグマ

On this page

VEXコンパイラ(vcc)は、自動的にUIダイアログスクリプトを構築するためのプラグマをサポートしています。 これらのプラグマは、vccコマンドラインで-uオプションを指定しない限りは通常では無視されます。 プラグマは、ヘルプ、パラメータの意味を示すためのヒント、構成、他の情報を指定することができます。

プラグマは、#pragmaプリプロセッサ命令、_PragmaVEXステートメントの2通りの方法で指定することができます。 2番目の形式では、複数のプラグマを単一のマクロにバンドルすることができます。

以下のプリプロセッサ形式:

#pragma label parm "Parameter Label"

は、機能的には、このVEXステートメントと等価です:

_Pragma("label parm \"Parameter Label\"");

Note

プラグマ引数は、元のダブルクォートのセットをエスケープさせて、ダブルクォートで閉じます。

#pragma c++rawstring

#pragma c++rawstring 0|1

VEXは、C++スタイルのRaw文字列に対応しています。c++rawstringプラグマを使用して、Raw文字列サポートを無効または再有効にすることができます。 例:

string a = R"(Hello world\n)";
string b = "Hello world\\n";
#pragma c++rawstrings 0        // C++スタイルのRaw文字列サポートを無効にします。
string b = R"(This will generate an error!)";
#pragma c++rawstrings 1        // C++スタイルのRaw文字列サポートを再有効にします。

#pragma bindhandle

#pragma bindhandle channel_name h_name h_label h_index h_settings

デフォルトでの特定のパラメータへのハンドルをバインドします(ユーザはバインドを上書きすることができます)。

channel_name

ハンドルにバインドするVEXオペレータのチャンネル名。

h_name

ハンドル名。これは、事前定義されたHoudiniハンドルの1つです(例えば、ladder)。 利用可能なハンドルの完全なリストを知るためには、omls HScriptコマンドを使います。

h_label

ハンドルの簡易説明。

h_index

多くのハンドル(例えば、xform)は、複数のパラメータと関連しています。 これは、どのハンドルパラメータをVEXパラメータにバインドさせるか選択することができます。

h_settings

ハンドルのデフォルトの挙動を設定するために使用するオプションのハンドル固有の文字列。

#pragma bindhandle offset1 xform "Translate" tx "invisible(1)"
#pragma bindhandle offset2 xform "Translate" ty
#pragma bindhandle offset3 xform "Translate" tz
sop translate(vector offset=0) { P += offset; }

#pragma bindhandlereserved

#pragma bindhandlereserved reserved_channel_name h_name h_label h_index h_settings

各スクリプト化したオペレータタイプには、そのタイプのすべてのオペレータ(ダイアログスクリプトファイルの内容に関係なく)に追加されるパラメータがあります。 ハンドルをこれらのパラメータの1つにバインドするために、bindhandlereservedプラグマを使わなければなりません。 このプラグマは、bindhandleプラグマとまったく同じ引数を受け取ります。 唯一の違いは、チャンネル名の引数は予約パラメータの名前を指定しなければならないことです。

#pragma bindselector

#pragma bindselector [parm_name] sel_type sel_name sel_prompt sel_mask allow_dragging group_type_parm asterisk_sel_all [input_index input_required]

オペレータをHoudiniでインタラクティブに作成する時、ユーザはそのデータで作業するように促されます。これらのプロンプトはセレクターでハンドルされます。 セレクターはOP単位基準またはパラメータ単位基準で定義することができます。

OP単位のセレクターでは、bindselectorプラグマは7個の引数を必要とします。 パラメータ単位のセレクターでは、10個の引数を必要とします。

parm_name

セレクターをバインドするVEXパラメータ(パラメータ単位のセレクター用)。

sel_type

選択する要素。利用可能な値のリストを知るためには、omsls HScriptコマンドを使います。

sel_name

セレクターの簡易説明。

sel_prompt

ユーザがジオメトリを選択するように促す時に表示させるプロンプト。

sel_mask

特定のプリミティブタイプを選択できるようにするパターン。 利用可能なプリミティブタイプのリストは以下の通りです:

all

すべてのプリミティブタイプ

face

ポリゴン、NURBS/Bezierのフェース

surface

メッシュ、NURBS/Bezierのサーフェス

quadric

プリミティブの円、球、円柱

poly

ポリゴン

nurbscurve

NURBSカーブ

bezcurve

Bezierカーブ

mesh

メッシュ

nurbs

NURBSサーフェス

bezier

Bezierサーフェス

circle

プリミティブの円

sphere

プリミティブの球

tube

プリミティブの円柱

meta

メタボール

particle

パーティクルシステム

プリミティブタイプは標準のHoudiniのグループ化の仕組みで結合することができます。例:

  • all,^p*: ポリゴンとパーティクルを除いたすべてのプリミティブタイプを選択します。

  • face,surface: フェースとサーフェスのプリミティブを選択します。

  • *,^quad*,^meta: 二次曲面またはメタボール以外のプリミティブを選択します。

allow_dragging

1に設定すれば、ユーザが強制的にクリックして選択を完了させることなく、選択を修正することができます。

これは、ユーザが1ステップで選択と修正をすることができます(マウスドラッグすると、選択を終了し、マウスの移動がオペレータハンドルに渡されます)。

group_type_parm

選択グループが持つジオメトリタイプを示すパラメータ名。 通常では、この値は、“Points”、“Primitives”、“Guess from group”を選択するメニュー付きのパラメータに名前を付けます。 Blast SOPのOMbindingsファイルを参照してください。

asterisk_sel_all

1に設定すれば、セレクターは、すべてのジオメトリが選択されたことを示すために選択文字列を“*”に設定する必要があります。 0に設定すれば、セレクターは空っぽのグループパラメータがすべてのジオメトリを選択したことを意味していると見なします。

input_index

パラメータ単位のセレクター用。ユーザがジオメトリを選択する時、セレクターは選択したオペレータの出力をこのオペレータの入力に接続しなければなりません。 このパラメータは、オペレータが接続される入力番号のインデックスを指定します。セレクターが複数の入力オペレータをこのオペレータに接続する必要があるなら、-1を使います。

input_required

パラメータ単位のセレクター用。ユーザがこの入力用にジオメトリを選択しなければならないなら1に設定します。

#pragma bindselector prims "Switch Geometry" \
    "Choose the geometry to switch between" \
    all 0 "" 0
#pragma bindhandle input_number 0 ladder Input parm0
sop switcher(int input_number=0) { import("P", P, input_number) }

#pragma bindselectorreserved

#pragma bindselectorreserved reserved_parm_name sel_type sel_name sel_prompt sel_mask allow_dragging group_type_parm asterisk_sel_all input_index input_required

bindhandlereservedプラグマと同様に、これはセレクターをスクリプト化したオペレータの予約パラメータにバインドします。 このプラグマへの引数は、bindselectorプラグマに渡すものと同じです。唯一の違いは、パラメータ名の引数が予約パラメータを指定しなければならないことです。

#pragma callback

#pragma callback name "script"

コールバックのHScriptスクリプトまたはPython関数をnameパラメータにバインドします。 パラメータが変わると、Houdiniはscript文字列を実行します。

Houdiniのアーキテクチャの制限が原因で、パラメータとスクリプトは、特定の条件を満たさなければなりません:

  • ダイアログスクリプトはHoudiniのノード(例えば、SHOP、SOPなど)にバインドされている必要があります。

  • パラメータは、トグルボタンか、またはそれにバウンドしたメニューを持っていなければなりません(#pragma hint#pragma choiceを参照)。

コールバックの言語(HScriptPython)を示すためには、#pragma parmtagを使用します。コールバック用の#pragma parmtagを使わないなら、デフォルトはHScriptです。しかし、プログラミングコールバックスクリプトで推奨するメソッドは、Pythonです。

#pragma callback parm1 "message $script_parm"
#pragma parmtag parm1 script_callback_language hscript

#pragma callback parm2 "import hou; hou.ui.displayMessage(kwargs)"
#pragma parmtag initialize_menu script_callback_language hscript
  • HScriptコールバックでは、scriptはHScriptのステートメントまたは$HOUDINI_PATH/scriptsパス上のスクリプトの名前のどちらかを指定します。

  • Pythonコールバックでは、scriptはPythonのソースコードを指定します。

Houdiniは、変化したパラメータを示すのに利用可能な特定の変数を持つコンテキスト内でscriptを実行します。

  • HScriptコールバックでは、Houdiniは、パラメータが変化したノードへのパスを含む$nodeなどの変数を作成します。

  • Pythonコールバックでは、Houdiniは、変化したパラメータに関する情報の辞書を含むkwargs変数を作成します。

詳細は、コールバックスクリプトを参照してください。

#pragma disablewhenと#pragma hidewhen

#pragma disablewhen parm_name conditional_expression

conditional_expressionがtrueの時にparm_nameを無効にします。

#pragma hidewhen parm_name conditional_expression

conditional_expressionがtrueの時にUIからparm_nameを隠します。

conditional_expressionの構文は、パラメータの Disable whenHide when のオプションと同じです。条件構文の詳細は、条件ルールのヘルプを参照してください。

// 'enable'パラメータのトグルがオフの時、'samples'パラメータを無効にします。
#pragma disablewhen samples { enable == 0 }

// 文字列メニュー'choice'が'off'の時、'choice_dep1'パラメータを隠します。
#pragma hidewhen choice_dep1 { choice == "off" }

#pragma export

#pragma export parm_name (none | dialog | all)

パラメータUIをオペレーションパラメータダイアログに追加し、オプションでオペレータツールバーにも追加します。

none or 0

エクスポートなし。パラメータは、オペレータの標準ダイアログにのみ表示されます。

dialog or 1

パラメータがオペレータのパラメータウィンドウに表示されます。

all or 2

パラメータがオペレータのパラメータウィンドウとオペレータツールバーに表示されます。

このプラグマと組み合わせて#pragma hint hiddenを使うことができます。

#pragma group

#pragma group group_name parameter_name1 parameter_name2 ...

名前を付けたパラメータをUIのタブにグループ化します。

// Ka, Kd, Ks, roughnessをBRDFというフォルダにグループ化します。
#pragma group BRDF Ka Kd Ks
#pragma group BRDF roughness

Note

グループ名に/を入れることでグループをネスト化することができます。以下の例では、2つのサブタブを持つGroupタブを作成しています。

#pragma group "Group/Sub Group 1" p1 p2
#pragma group "Group/Sub Group 2" p3 p4

#pragma helpと#pragma info

#pragma help "text"

textをダイアログスクリプトのヘルプに追加します。これを使ってエンドユーザ向けに関数とパラメータのドキュメントを作成することができます。

#pragma help "This is help for the VEX function."
#pragma help "It gets added automatically to the help text"

#pragma helpと同様に、#pragma infoテキストがダイアログスクリプトのヘルプに追加されます。 しかし、infoテキストはヘルプの最初の別セクションにあります。これを使って著作権、バージョン情報などを指定することができます。

#pragma info "Created by Bob Loblaw - (c) 2006"

現在のところ、SOPのみがinfoテキストを表示します。

#pragma hint

#pragma hint parameter_name hint_type

パラメータが表現する値のタイプに関する情報を追加します(例えば、VEXベクトルは空間内のポイント、カラー、方向を表現します)。 ヒントは値の編集用UIに特化するために使われます。

hint_typeには、以下のどれかを指定します:

none

ヒントなし。

toggle

スイッチのオン/オフを表現した整数または浮動小数点(1がオン、0がオフ)。

color

パラメータがカラーです。UIがカラーのスライダを用意します。

direction

パラメータが方向です。UIが方向指定用のガジェットを用意します。

vector

パラメータが空間内の3Dベクトルです。UIが3つのfloatを持つパラメータ用のデフォルトと同じUIですが、 チャンネル名は1,2,3の代わりにx,y,zで終わります。

vector

パラメータが空間内の4Dベクトルです。UIが4つのfloatを持つパラメータ用のデフォルトと同じUIですが、 チャンネル名は1,2,3,4の代わりにx,y,z,wで終わります。

uv

ベクトルパラメータがUV座標です。UIは3つのフィールドではなく2つのエントリーフィールド (VEXに渡される3番目のコンポーネントが常に0)で、チャンネル名が1,2の代わりにu,vで終わります。

uvw

ベクトルパラメータがUVW座標です。3つのエントリーフィールドで、チャンネル名が1,2,3の代わりにu,v,wで終わります。

angle

パラメータが方向ベクトルです。UIが方向ガジェットを用意します。

file

文字列パラメータがファイル名です。UIはファイルを指定するためのブラウザボタンを追加します(以下のimagegeometryも参照)。

image

文字列パラメータが画像ファイルのファイル名です。UIはファイルを指定するためのブラウザボタンを追加し、ブラウザは画像ファイルタイプのみを表示します。

geometry

文字列パラメータがジオメトリファイルのファイル名です。UIはファイルを指定するためのブラウザボタンを追加し、ブラウザはジオメトリファイルタイプのみを表示します。

hidden

パラメータリストに、このパラメータを含めません。これは、パラメータをジオメトリアトリビュートで上書きしようとする時に役に立ちます。 これは、invisibleとは違い、基本のシーンパラメータが作成されません。

invisible

作成したパラメータがオペレータ内に存在しますが、UIからは非表示になります。hiddenとは違い、実際のシーンパラメータが作成され、ただ表示されないだけです。

inputinvisible

#pragma optable vopを使用して構築されたVOPオペレータに対して、このヒントは、新しいノードを作成した時にデフォルトでVOP入力コネクタを非表示にするように指示します。 ただ、VOPの下部のmore...コネクタによって、入力にアクセスすることができます。 このヒントは、非VOPオペレータタイプを構築した時、またはExportパラメータには何の効果もありません。

oplist [opfilter]

パラメータがオブジェクトのリストです。オプションでopfilterを指定して、リストで許可するオペレータタイプを制限することができます。 #pragma parmtagを使って、オブジェクトのリスト内の任意のバンドルやグループを決めます。

以下の利用可能なオペレータフィルターのリストを参照してください。

oppath [opfilter]

パラメータがオブジェクトパスです。オプションでopfilterを指定すれば、選択可能なオペレータタイプを制限することができます。

以下の利用可能なオペレータフィルターのリストを参照してください。

joinnext

GUIの同じ列上にこのパラメータの後にパラメータを配置します。 狭いコントロールに対して、これはパラメータエディタのスペースを節約することができます。

例: #pragma hint myParm joinnext

#pragma hint __nondiffuse toggle // トグルボタンとして定義します
#pragma hint specularcolor color // これはカラーを表現します
#pragma hint rest hidden         // UIにrestパラメータを表示しません
#pragma hint mapname image       // これは画像ファイルを表現します
#pragma hint nullobject oppath "obj/null" // nullオブジェクトのみ

#pragma inputlabel

#pragma inputlabel inputnum "label"

VEXオペレータタイプでは、オペレータ入力のラベルを設定します。このラベルは、ユーザがオペレータ入力の1つの上でボタンを押した時に表示されます。 inputnumは入力のインデックスで1から始まります。

#pragma inputlabel 1 "Geometry to Modify"

#pragma label

#pragma label parameter_name "text"

パラメータの説明をしたラベルを指定します。

#pragma label amp    "Noise Amplitude"
displacement bumpy(float amp=0) {
...
}

#pragma name “text”

UIに表示するラベルを設定します。このプラグマは廃止されました。その理由は、今ではラベルはオペレータテーブル定義で定義するからです。

#pragma opicon

#pragma opicon "text"

このプラグマを使って、このオペレータタイプで使用するアイコンを設定します。外部の.iconや.biconファイルのパスまたは標準アイコンのどれかの名前を指定することができます。

vccの-C コマンドラインオプションは、このプラグマを上書きします。

#pragma opmininputsと#pragma opmaxinputs

#pragma opmininputs num

VEXオペレータタイプでは、これは、オペレータに接続しなければならない入力の 最小 の数を設定します。 この値は、入力を受け取らないSHOPでは無視されます。 接続されている入力の数がこの数よりも少ない時は、オペレータはエラーを発生します。-t コマンドラインオプションは、このプラグマを上書きします。

#pragma opmaxinputs num

VEXオペレータタイプでは、これは、オペレータに接続可能な入力の 最大 の数を設定します。 この値は、入力を受け取らないSHOPでは無視されます。 -T コマンドラインオプションは、このプラグマを上書きします。

#pragma opmininputs 1
#pragma opmaxinputs 4

#pragma opnameと#pragma oplabel

#pragma opname "text"

このオペレータタイプの内部オペレータ名を指定します。デフォルトでは、 コンパイラはソースファイルの名前を使用します。vccの-n コマンドラインオプションは、このプラグマを上書きします。

#pragma oplabel "text"

このオペレータタイプを説明した名前を指定します。デフォルトでは、 コンパイラは内部のオペレータ名を使用します。vccの-N コマンドラインオプションは、このプラグマを上書きします。

#pragma opname "myshop"
#pragma oplabel "My New Shop"

#pragma opscript

#pragma opscript "text"

このオペレータタイプがMantra以外のレンダラーで使用可能なシェーダなら、このプラグマは、レンダラーが探すシェーダファイルの名前を設定することができます。 このプラグマを使用すれば、オペレータタイプ名はシェーダファイル名に合わせる必要がありません。vccの-S コマンドラインオプションは、このプラグマを上書きします。

#pragma opscript "rman_myshader"

#pragma parmhelp parameter_name “text”

#pragma parmhelp parameter_name "text"

ユーザがparameter_nameの上にカーソルを置いた時に表示されるツールチップを設定します。

#pragma parmhelp amp "Increase this value to add more noise."
displacement bumpy(float amp=0) {
...
}

#pragma parmtag

#pragma parmtag parmName token value

オペレータで定義された各パラメータには、それに関連したトークン/値のタグのセットがあります。 このプラグマは、パラメータにトークン/値のペアを追加します。

以下のトークンが利用可能です:

autoscope

パラメータの各コンポーネントに相当する1と0の 文字列 (例えば、“1011”)。 1は、ノードを選択した時にチャンネルリストに自動追加されるパラメータを意味します。

コンポーネントの数に対して、文字列の文字数が足りなければ、最後の文字が残りのコンポーネントに割り当てられます。 これは、“1”を指定すると、すべてのコンポーネントが自動スコープし、“0”を指定するとコンポーネントが自動スコープしません。

このタグがパラメータに対して定義されていなければ、Houdiniは、パラメータをスコープするかしないか推測します。

editor

文字列パラメータでは、これは単一行入力フィールドの変わりに複数行エディタを表示するために使うことができます。有効にするには、“1”を指定します。

editorlines

複数行エディタを表示するなら、これは、表示するテキストの行数を指定するために使うことができます。デフォルト値は10です。

opfilter

オブジェクトパスを参照するパラメータでは、これは、OP選択ボタンで表示するOPのタイプをフィルタリングします。 このタグを設定するなら、oprelativeタグも設定してください。

このタグは、#pragma hint oppathでも設定しますが、別のフォーマットを使います。

利用可能な値:

!!OBJ!!

オブジェクトのみを表示します。

!!OBJ/GEOMETRY!!

ジオメトリオブジェクトのみを表示します。

!!OBJ/LIGHT!!

ライトオブジェクトのみを表示します。

!!OBJ/CAMERA!!

カメラオブジェクトのみを表示します(ライトはカメラとみなされます)。

!!OBJ/BONE!!

ボーンオブジェクトのみを表示します。

!!OBJ/FORCE!!

フォースオブジェクトのみを表示します。

!!SOP!!

SOPのみを表示します。

!!CHOP!!

CHOPのみを表示します。

!!COP2!!

COPのみを表示します。

!!VOP!!

VOPのみを表示します。

!!ROP!!

出力ドライバ(ROP)のみを表示します。

!!DOP!!

DOPのみを表示します。

!!SHOP!!

SHOPのみを表示します。

!!SHOP/ATMOSPHERE!!

AtmosphereシェーダSHOPのみを表示します。

!!SHOP/BACKGROUND!!

BackgroundシェーダSHOPのみを表示します。

!!SHOP/CONTOUR!!

ContourシェーダSHOPのみを表示します。

!!SHOP/CONTOUR_CONTRAST!!

Contour-contrastシェーダSHOPのみを表示します。

!!SHOP/CONTOUR_STORE!!

Contour-storeシェーダSHOPのみを表示します。

!!SHOP/DISPLACEMENT!!

DisplacementシェーダSHOPのみを表示します。

!!SHOP/EMITTER!!

EmitterシェーダSHOPのみを表示します。

!!SHOP/GEOMETRY!!

GeometryシェーダSHOPのみを表示します。

!!SHOP/IMAGE3D!!

Image3dシェーダSHOPのみを表示します。

!!SHOP/LENS!!

LensシェーダSHOPのみを表示します。

!!SHOP/LIGHT!!

LightシェーダSHOPのみを表示します。

!!SHOP/LIGHT_SHADOW!!

Light-shadowシェーダSHOPのみを表示します。

!!SHOP/OUTPUT!!

OutputシェーダSHOPのみを表示します。

!!SHOP/PHOTON!!

PhotonシェーダSHOPのみを表示します。

!!SHOP/PHOTON_VOLUME!!

Photon volumeシェーダSHOPのみを表示します。

!!SHOP/SURFACE!!

SurfaceシェーダSHOPのみを表示します。

!!SHOP/SURFACE_SHADOW!!

Surface-shadowシェーダSHOPのみを表示します。

oprelative

パスを決める方法。通常では、このトークンの値は“.”なので、パスが現行オペレータに対して相対パスになります。 しかし、オブジェクトを参照するときは、タグを“/obj”に設定することができます。以下のサンプルを参照してください。

opexpand

SHOPでは、“oplist”パラメータをフルパス名に展開することができます。バンドルまたはパターンを選択していれば、パターンはレンダラーに送る前に展開されます。以下のサンプルを参照してください。

opfullpath

opexpandタグと組み合わせて使う時、oprelativeタグの値に相対ではなく、オブジェクトのパス名を完全に識別します。以下のサンプルを参照してください。

rampshowcontrolsdefault

1または0の値を使って自動的にランプパラメータコントロールを隠すことができます。

script_callback

パラメータに関連したコールバックスクリプト。#pragma callbackを参照してください。

script_ritype

RIBストリームの生成とパラメータを適切なRenderManタイプの仕様にマッピングする時に使用します。 値は、有効なRenderManタイプ(例えば、“uniform color”)にしてください。

script_unquoted

VOP定義で、文字列パラメータに引用符を使わないことを示します。 これは、メニューの文字列がコードブロック内の文字通りに置き換えることができます(trig VOPを参照してください)。

sop_input

ポイント/プリミティブのグループメニューを構築する時に、内部的にSOPを使ってグループを検索する場所を決めます。

#pragma parmtag lightmask opfilter "!!OBJ/LIGHT!!"
#pragma parmtag lightmask oprelative "/obj"
#pragma parmtag lightmask opexpand 1
#pragma parmtag reflectmask opfilter "!!OBJ/GEOMETRY!!"
#pragma parmtag reflectmask opexpand 1
#pragma parmtag reflectmask opfullpath 1

#pragma ramp

ランプパラメータを作成して、それをシェーダ関数の引数に接続します。

  • #pragma ramp_rgb ramp_parm basis_parm keys_parm values_parm

  • #pragma ramp_flt ramp_parm basis_parm keys_parm values_parm

#pragma ramp_rgb color color_the_basis_strings color_the_key_positions color_the_key_values

surface
sky(
    string color_the_basis_strings[] = { "linear", "linear" };
    float color_the_key_positions[] = { 0, 1};
    vector color_the_key_values[] = { {0,0,0}, {0,0,1} };
) { ... }

シェーダで定義されたパラメータのUIをセットアップするほとんどの他のプラグマとは違って、ランプパラメータはHoudiniで新しいUIエレメントを作成します。

ramp_parm

Houdini UIのランプパラメータの名前。これはシェーダで定義されたパラメータ(もちろん他のランプも)と競合できません。

basis_parm

文字列の配列を含むパラメータ。これらの文字列(つまり、“linear”、“constant”)は各キーの基底値を決めます。 定数基底値を指定するなら、basis_parmの引数に空っぽの文字列(つまり“”)を指定します。しかし、UIは、この事項を反映する必要はありません。

keys_parm

floatの配列を含むパラメータ。スプラインが均一(つまり、キーを持たない)なら、keys_parmの引数に空っぽの文字列(つまり、“”)を指定します。 しかし、UIは、この事項を反映する必要はありません。

values_parm

floatの配列またはベクトルの配列を含むパラメータ。 基底またはキーのパラメータと違い、これは必須です。

現在では、デフォルト値はHoudiniのランプパラメータでサポートされていないので、指定した初期値はUIに渡されません。

値は渡されませんが、values_parmで指定したキーの数は、ランプの初期のキーの数を設定するために使われます。

詳細は、ランプパラメータを参照してください。

#pragma range

#pragma range parameter_name[!] min_value max_value[!]

パラメータの理想の範囲を定義します。値に!を追加すれば、パラメータの値は、その範囲に制限されます。 UIも、この情報を使ってスライダの範囲を設定します。

#pragma range seed    0 10
#pragma range roughness 0.001! 1!
#pragma range gamma     0.001! 10

#pragma rendermask

#pragma rendermask (VMantra | RIB | OGL)

このプラグマはSHOPダイアログの生成だけに役に立ちます。各SHOPには、そのSHOPを使用できるレンダラーを定義したマスクがあります。 これは、RenderManシェーディング言語とVEX(または他のシェーディング言語)で同じシェーダを記述することが可能です。 この場合では、レンダーマスクを指定することで、VMantra以上の内容を含めることができます。

レンダーマスクパラメータは、レンダラーのシーン記述を生成するコードに密接にバインドされています。そのため、レンダラーの名前は完全に限定されています。 SHOPをサポートしているレンダラーは以下の通りです。

RIB

RenderMan互換レンダラー用のRIBを生成します。

VMantra

シェーディング用にVEXを使うMantraのバージョン。

OGL

OpenGLレンダリング。これは特別なレンダラーで、自動的にそのレンダラー自体をほとんどのレンダーマスクに追加します。現在のところ、これを回避する方法はありません。

#pragma optable

#pragma optable vop

このプラグマを使用すれば、生成するオペレータタイプを指示することができます。 現在のところ、サポートされているオプションvopのみです。つまり、VOPオペレータを作成します。

このオプションを使用して生成されたVOP otlsには、非常に特有な構造を持ちます:

  • VOPの入力は、非Exportシェーダパラメータから生成されます。

  • VOPの出力は、Exportシェーダパラメータから生成されます。

  • VOPのパラメータは、SHOPオペレータと同様にUI生成を動作させて、非Exportシェーダパラメータすべてに対して作成されます。

  • 外側コードは、import命令を使用して、外部ファイルからシェーダ関数をインポートします。

  • 内側コードは、shader call構文を使用して、このシェーダを呼び出します。

シェーダの実装は、生成されたVOP内に実際には保存されないので、VOPを正しく動作させるには、外部の.vflまたは.vexファイルからアクセスしなければなりません。 シェーダ用の.vflまたはコンパイルした.vexファイルをVEX検索パスにアクセス可能な場所に配置すると、この要件を満たします。

#pragma rename

#pragma rename oldname newname

シェーダインターフェースで使用されているオペレータパラメータの名前を別の名前に指定します。 この命令は、そのパラメータを参照している他の#pragmasすべての後に実行してください。

#pragma optable vopを使用する時、これは、VOP入力または出力がVEXグローバル変数と同じ名前を使用できるので役に立ちます。 なぜなら、そのような名前の干渉は、VOPでは有効でもVEXでは無効だからです。

パラメータのメニューを作成する方法

choiceプラグマを定義することでパラメータのメニューUIを作成することができます。

以下のどれかによって、パラメータのリストを構築します:

  • パラメータに対して複数選択プラグマ(choice, choicescript, choicereplace, choicetoggle)を使用して、メニューアイテムを作成します。

  • パラメータに対して1つのchoicescriptプラグマを使用して、メニューアイテムを生成するスクリプト(choicescriptchoicereplacescriptchoicetogglescript)を作成します。

    このスクリプトはHoudiniがメニューエントリを生成する必要がある時にいつもで実行されます(つまり、生成される値はキャッシュ化されません)。そのため、このスクリプトは可能な限り効率化するべきです。 スクリプトの出力は一連の値/ラベルのペアでなければなりません。このペアはchoiceプラグマの値とラベルのフィールドと同じ意味を持ちます。

簡易的なchoiceプラグマは、ユーザがメニューから値を選択することしかできないUIを作成します。 choicereplaceプラグマは、メニューと、さらにユーザが別の値を手動で入力可能なUIを作成します。 choicetoggleプラグマは、ユーザ入力と、さらにメニューアイテムの選択、追加、削除が可能なメニューを用意します。

#pragma choice parameter_name "value" "label"

parameter_nameのメニューアイテムを追加します。 お互い排他的な選択メニューを表示します。

#pragma choicescript parameter_name language "scriptline"

parameter_nameのメニューアイテムを生成するスクリプトを定義します。languageにはpythonまたはhscriptを指定することができます。 お互い排他的な選択メニューを表示します。

#pragma choicereplace parameter_name "value" "label"

parameter_nameのメニューアイテムを追加します。 ユーザがメニューからアイテムを選択したり、自分で入力できるUIを表示します。

#pragma choicereplacescript parameter_name "scriptline"

parameter_nameのメニューアイテムを生成するスクリプトに1行を定義します。 ユーザがメニューからアイテムを選択したり、自分で入力できるUIを表示します。

#pragma choicetoggle parameter_name "value" "label"

parameter_nameのメニューアイテムを追加します。 ユーザ入力でアイテムを追加/削除できる選択メニューを表示します。

#pragma choicetogglescript parameter_name "scriptline"

parameter_nameのメニューアイテムを生成するスクリプトに1行を定義します。 ユーザ入力でアイテムを追加/削除できる選択メニューを表示します。

#pragma choice operation "over"    "Composite A Over B"
#pragma choice operation "under"    "Composite A Under B"
#pragma choice operation "add"    "Add A and B"
#pragma choice operation "sub"    "Subtract A from B"
cop texture(string operation="over")
{
if (operation == "over") ...    // texture coordinates
if (operation == "under") ...    // parametric coordinates
if (operation == "add")     ...    // orthographic
if (operation == "sub")     ...    // polar
}

これは、“operation”パラメータに対してメニューを定義しています。メニューは4つのエントリーで構成されています。 文字列パラメータの値は、“over”、“under”、“add”、“sub”のどれかです。そしてユーザにはオペレーションタイプに対してもっと意味がわかるラベルを表示します。

#pragma choice operation "0"    "Use texture coordinates"
#pragma choice operation "1"    "Use parametric coordinates"
#pragma choice operation "2"    "Orthographic Projection"
#pragma choice operation "3"    "Polar Projection"
sop texture(int operation=0)
{
if (operation == 0) ...    // texture coordinates
if (operation == 1) ...    // parametric coordinates
if (operation == 2) ...    // orthographic
if (operation == 3) ...    // polar
}

Note

choicereplaceとchoicetoggle以外のプラグマを使って、整数パラメータのメニューを作成することができますが、 メニューアイテムはラベルを無視し、単に選択項目に0から始まる番号を付けるだけです。 choicereplaceとchoicetoggleプラグマは文字列パラメータにのみ有効です。

#pragma ophidewhen 1

このプラグマをVOPの外側コードに追加することで、そのVOP入力の可視性は、hidewhen条件で定義されたパラメータの可視性に追従するようになります。 その入力は、必ずそのhidewhen条件で定義されたパラメータ名と同じパラメータを持っている必要があります。

#pragma opextraparm type name_format parm_name0 parm_name1 ...

このプラグマをVOPの外側コードに追加することで、外部パラメータバインドを定義することができます。 typeは、VEX変数タイプです。 name_formatは、スペースなしの単純な書式化文字列で、%dまたは%sの特殊文字を含めることでノードパラメータ値を参照することができます。 parm_name0以降の引数は、name_format内の%dと%sの特殊文字に値を入れるために使用されるパラメータ名です。

オペレータリストフィルター

これらは、特定のプラグマのopfilter引数に対して使用可能なパラメータです。

obj

任意のオブジェクト。

sop

任意のSOP。

chop

任意のCHOP。

cop

任意のCOP。

vop

任意のVOP。

rop

任意のROP。

obj/geo

任意のジオメトリオブジェクト。

obj/null

任意のNullオブジェクト。

obj/light

任意のライト。

obj/camera

任意のカメラ。

obj/fog

任意のFogオブジェクト。

obj/bone

任意のボーン。

shop/surface

任意のSurface SHOP。

shop/displace

任意のDisplace SHOP。

shop/interior

任意のInterior SHOP。

shop/light

任意のLight SHOP。

shop/shadow

任意のShadow SHOP。

shop/fog

任意のAtmosphere SHOP。

shop/photon

任意のPhoton SHOP。

shop/image3d

任意のImage3D SHOP。

VEX

言語

次のステップ

リファレンス