2025-04-05

VEX no include

例えば、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 は動的に変わるので望ましくない)。

math.h

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

  1. $HFS/houdini/include/vex/math.h を自分の vex/include にコピーし、そのファイルで #include foo.h を宣言。
  2. 上記のコピーした math.h から重複部分を削除、#include foo.h だけ残す。
  3. 自分の vex/include に空の math.h を作成、そこで #include "$HFS/houdini/vex/include/math.h" とする。
  4. これらいずれかの方法で作成した math.h に直接関数を定義していく。

1. math.h から重複部分を削除した場合

#ifndef __math_h__
#define __math_h__

#include "foo.h"
#endif

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

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

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

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

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

#ifndef __math_h__
#define __math_h__
float thrice (float a) {return a * 3;} /* 入力の3倍を返す */
#endif

または

#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 はアセンブリ出力に使われる。

0 件のコメント:

コメントを投稿