Houdini 20.0 VEX

VEXコンパイラ(vcc)

VEX言語コンパイラvccとそのプリプロセッサとプラグマステートメントの使い方の概要。

On this page

vccコンパイラはVEXソースコードをHoudiniで実行可能な形式にコンパイルします。 VEXコンパイラ(vcc)ではVEXコードのコンパイル、VEX関数用ダイアログスクリプトの生成が可能です。 さらに、指定したコンテキストで利用可能なグローバル変数と関数の一覧を作ることでクィックヘルプを追加することもできます。

コマンドラインオプション

Note

ほとんどのオプションには、ショートとロングの形式があります。ロング形式は、ショート形式の後に大括弧([)内に表示されます。

-h [--help]

コンパイラのヘルプメッセージを表示します。

コンパイラオプション

-o [--vex-output] [file|-]

VEXコード出力が必要な時に指定します。ファイル名が’stdout'なら、出力がコンソールに表示されます。 --hda-output--otl-output--ds-outputのどれも指定しなかった場合は、このオプションが暗黙に定義されます。 デフォルトでは、出力のファイル名はコンテキスト関数から構築されます。 コンテキスト関数が定義されていない場合、入力のファイル名はベースとして使われます。 複数の入力ファイルを指定すると、ファイル名の引数が無視され、出力ファイル名は前述の規則から構築されます。

-d [--compile-all]

コンテキスト関数で直接的または間接的に使われていなくても、すべての関数をVEXコードにコンパイルします。このオプションはincludeファイルの構文をチェックするのに役に立ちます。

-z [--no-optimize]

最適化せずにVEXコードを生成します。

-V [--no-version-id]

VEXコードにHoudiniのバージョン識別子を埋め込みません。

プリプロセッサオプション

-E [--parse-only]

入力ファイルを構文解析して標準出力に結果を出力するだけです。コンパイルは行ないません。

-D [--define] name[=value]

プリプロセッサ用のマクロを定義します。nameに値を指定しなかった場合は、名前が1に定義されます。

-I [--include-dir] path

指定したpathをインクルードパスに追加します(プリプロセッサへ指示する#includeが参照するファイルのディレクトリ検索のリスト)。標準のHoudiniインクルードパスはvex/includeです。

診断オプション

-w id[,id...]

特定の警告と情報のメッセージの表示を抑制します。 wlistは抑制する警告番号をカンマで区切ったリストです。

-F [--Werror]

抑制していない警告すべてをエラーとして扱います。

-e [--Werror-output] file

診断出力すべてを標準エラー出力ではなく、指定したファイル名にリダイレクトします。

-q [--Wno-info]

情報メッセージを抑制します。

-Q [--Werror-only]

情報と警告のメッセージを抑制します。--Wno-infoを上書きします。

--fmessage-limit <N>

停止する前に表示するメッセージの最大数を設定します。制限しない場合は0(デフォルト)に設定します。

VEXコンテキストオプション

-c [--context] name

コンテキスト関数を定義していない場合、これはソースをコンパイルする時に使用するVEXコンテキストを指定するために使うことができます。

-X [--list-context] context

指定したVEXコンテキストで定義されているグローバル変数と関数の型や引数の数を表示します。contextの引数の値は、利用可能なVEXコンテキストをリストするために使うことができます。

アセットオプション

-L [--hda-append] [file|-]

VEXソースから生成したデジタルアセットを、指定したHDAファイルに追加します。そのHDAファイルが存在しなかった場合は、そのHDAファイルが作成されます。

-l [--hda-output] [file|-]

コンテキスト関数用のデジタルアセットを、指定したHDAファイルに書き出します。そのHDAファイルが既に存在した場合は、そのHDAファイルが上書きされます。

-K [--hda-vex-section] name

生成されたVEXコードは、指定したVEXコンテキストの標準セクション名ではなく、HDAの指定したセクション名に格納されます。

-a [--hda-dialog-script] file

VEXソースから自動で生成されたパラメータ定義ではなく、指定したファイル内のパラメータ定義を使用します。 ダイアログスクリプトのオペレータ定義は、まだVEXソースから取り込まれます。

-U [--hda-dialog-script-only]

ダイアログスクリプトをOTLに埋め込むだけです。VEXコードは追加されません。

-n [--op-name] name

指定した名前をオペレータの名前として使用します。これは、コード内の#pragma opnameステートメントを上書きします。

-S [--op-script-name] name

指定した名前をオペレータのスクリプト名として使用します。これは、コード内の#pragma opscriptステートメントを上書きします。

-N [--op-label] name

指定した名前をオペレータのUIラベルとして使用します。これは、コード内の#pragma oplabelステートメントを上書きします。

-C [--op-icon] name

指定した名前をオペレータで使用するアイコンとして使用します。これは、コード内の#pragma opiconステートメントを上書きします。

-t [--op-min-inputs] N

オペレータの最小入力数を設定します。これは、コード内の#pragma opmininputs ステートメントを上書きします。 最小入力の値は、生成するオペレータタイプに合うように調整されます。

-T [--op-max-inputs] N

オペレータの最大入力数を設定します。これは、コード内の#pragma opmaxinputsステートメントを上書きします。 最大入力の値は、生成するオペレータタイプに合うように調整されます。

ダイアログスクリプトオプション

-u [--ds-output] [file|-]

ダイアログスクリプトを指定したファイル名に書き出します。 --vex-output--hda-outputと同様に、複数の入力ファイルを指定すると、指定したファイル名が無視されて、出力ファイル名が自動的にコンテキスト関数名から、 またはコンテキスト関数が定義されていなければ、入力ファイル名から構築されます。

プリプロセッサ

コンパイラには、コメントの除去、インクルードファイルの読み込み、マクロの展開をするプリプロセッサがあります。

プリプロセッサは通常のC言語のプリプロセッサ命令の多くをサポートしています:

#define name token-string

これ以降で使われているnametoken-stringに置換します。

#define name(arg,...,arg) token-string

これ以降のnameのインスタンスをtoken-stringに置換します。 nameへの各引数は、展開中にtoken-stringに置換されます。

#undef name

マクロを“未定義”にするので、これ以降で使われているnameは展開されません。

#include "filename"

ファイルの内容をソースコードのこの場所に挿入します。 引用符(")を使うと、標準の場所(そのパスを含む)を検索する前に、現行ファイルを含むディレクトリでfilenameを検索します。

#sinclude "filename"

includeと同様ですが、静かです(ファイルが見つからなくても警告もエラーも出しません)。

#includeall "filename"

includeと同様ですが、include検索パスを走査して、見つかったすべてのファイルをincludeします。

#ifdef name

nameがマクロで定義されていれば、この行から次の#endifまたはelseの命令までをコンパイルします。

#ifndef name

nameがマクロで定義されて いなければ 、この行から次の#endifまたはelseの命令までをコンパイルします。

#if constant-expr

constant-exprがゼロ以外に評価されれば、この行から次の#endifまたはelseの命令までをコンパイルします。

エクスプレッションは以下の演算子を使用することができます:

  • 比較 (==, !=, <=, >=, <, >)

  • 論理 AND (&&), OR (||), NOT (!)

  • ビット演算 AND (&), OR (|), XOR (^), NOT (~)

  • 算術 (+, -, *, /, %)

  • 括弧

エクスプレッションは以下の関数も使用することができます:

defined(name)

nameが定義済みマクロであれば1、そうでないなら0を返します。

#if defined(foo) && defined(fum)

environment(name)

nameが定義済み環境変数なら1を返します。

access(filename)

filenameがアプリケーションで読み込むことができれば1、そうでないなら0を返します。

#if access("/etc/passwd")
#include </etc/passwd>
#endif

strcmp(str1, str2)

C/C++と同じ名前の関数で、2つの文字列が同じ内容なら0を返します。各引数は、引用符で閉じた文字列またはその文字列に展開するマクロです。

#define VALUE "foo"
#if strcmp(VALUE, "bar") != 0
このステートメントは、"foo" != "bar"なのでfalseです。
#endif
#if !strcmp(VALUE, "foo")
このステートメントは、strcmp("foo", "bar") == 0なのでtrueです。
#endif

エクスプレッションは左から右へ評価されます( 右から左へ評価するANSI C言語の規格とは異なります )。 ANSIプリプロセッサと同様に、すべての数値が整数でなければなりません。

#else

#if命令がゼロと評価されれば、これ以降の行から#endifの命令までの行がコンパイルされます。

#endif

条件文のセクションの終わりを示します。#ifを定義すれば必ず#endifで終わらなければなりません。

#pragma ...

拡張する言語の機能を指定します。プラグマのリストを参照してください。

事前定義されたマクロ

以下のマクロは事前に定義されています:

__vex

このシンボルは常に定義されています。ifプリプロセッサ命令の中でこれを使うことで、そのプログラムがvccでコンパイルされているかチェックすることができます。

__vex_major

コンパイラ(Houdiniバージョン番号)のメジャーバージョンの番号。

__vex_minor

コンパイラ(Houdiniバージョン番号)のマイナーバージョンの番号。

__vex_build

コンパイラ(Houdiniバージョン番号)のビルドバージョンの番号。

__vex_patch

コンパイラ(Houdiniバージョン番号)のパッチバージョンの番号。

__LINE__

ソースファイルの現在の行番号。

__FILE__

コンパイルされているファイル。

__DATE__

現在の日付(引用符付きの文字列)。例えば、"Dec 31 1999"

__TIME__

現在の時間(引用符付きの文字列)。例えば、"23:59:59"

printf("Starting shader %s at %s", __FILE__, __DATE__);

VEX

言語

次のステップ

リファレンス