2025-04-05

VEX no include

2025-04-19: 追記: #ifndef 等を(偽) math.h で使う方法 (#include guard) は他に悪影響を与えることが判明、削除しました。

例えば、VEX 用の foo.h というファイルを作り、この中に

float thrice (float a) {return a * 3;} /* 入力の3倍を返す */
という関数を作ったとする。この関数を Attribute Wrangle で使うには
  1. foo.h を ~/houdini20.5/vex/include/ に格納し、
  2. Attribute Wrangle では、
    #include "foo.h"
      
    @val = thrice (100.0);
    などとするが、
ここでは、自分で書いた関数をあたかもビルトイン関数のように、#include 無しで使う方法を紹介する。


使用したビルド: Houdini 20.5.550 だが過去バージョンでも同じ



hconfig -ap

コマンドラインで、 hconfig -ap を実行すると、Houdini が見に行く各種ディレクトリが表示される。このうち、下の方に HOUDINI_VEX_PATH に関する記述があり、簡単にまとめると、HOUDINI_PATH で参照されている各ディレクトリに vex/ ディレクトリを作成すれば、そこが参照される。

.h ファイルは、上記のどこかに vex/include というディレクトリを作り、その中に格納する(例: ~/houdini20.5/vex/include/ または $HSITE/houdini20.5/vex/include/。 $HIP は動的に変わるので望ましくない)。

1. math.h

vex/include の中に下記の要領で math.h を作ると、その中で定義された関数と、そこから参照される .h ファイル、またその .h ファイルで定義された関数は Wrangle ノードの中で宣言が不要になる。

  1. 自分の vex/include に空の math.h を作成、そこで #include "$HFS/houdini/vex/include/math.h" とする。
  2. 上記の方法で作成した math.h に直接関数を定義していく。

2. 空の math.h を作り、$HFS 以下を逆参照する

#include "$HFS/houdini/vex/include/math.h"
#include "foo.h"

この時、${HFS} とはしない。

3. math.h に直接関数を定義

上記の要領で作った math.h に関数を追記することも勿論可能。

#include "$HFS/houdini/vex/include/math.h"
float thrice (float a) {return a * 3;} /* 入力の3倍を返す */

上記のいずれかの方法で thrice() を定義すれば、Attribute Wrangle で #include "foo.h" の宣言は不要。

拡張子 .h, .vfl, .vex

ヘッダファイルには .h を使い、VEX コード、スニペットには .vfl を使う。 .vex はアセンブリ出力に使われる。


最終更新: 2025-04-19

0 件のコメント:

コメントを投稿