このページで紹介されている VEX コードの詳細説明。コードは以下の通り。
string path, mat; splitpath(s@shop_materialpath, path, mat); string materials[] = { "red", "green", "blue" }; i@switch = 0; for (int i = 0; i < len(materials); ++i) { if (materials[i] == mat){ i@switch = i; break; } }
以下一行ごとの説明く
- string path, mat;
string は文字列型変数のための(ローカル)宣言、path と mat はそれぞれ変数。
つまり文字列型のローカル変数 path と mat を作った。 - splitpath(s@shop_materialpath, path, mat);
splitpath はVEX関数。文字列(パス)からパス部分とファイル名部分を分ける。入力となるパス、パス部分を格納する変数、ファイル名部分を格納する変数の3つの引数が必要。-
s@shop_materialpath は、「s@」という宣言方法で、この Attribute Wrangle ノードに渡されるデータ群に対し、それぞれのデータ要素に "s" (string の s = 文字列)のアトリビュートを用意し値を格納している。
- string materials[] = { "red", "green", "blue" };
これは文字列型配列の宣言。red=0, green=1, blue=2 となる。後ほど比較のために使用。 - i@switch = 0;
「i@」という宣言方法で"i" (integer の i = 整数)型のアトリビュート switch を定義、このノードに渡されるデータ群に対し、すべて 0 に初期化。 - for (int i = 0; i < len(materials); ++i) {
典型的な for ループ文で C言語の構文と同じ。最初のint i = 0 でループ用のローカル変数 i を宣言。この i は 「i@」 の i とは異なる。
len(materials) は配列 materialsの大きさ (3) を求め、変数 i と比較している。
つまり渡される面に対し3回ループするように定義している。混同しそうであれば int j=0; ... とする方が良いかもしれない。 - if (materials[i] == mat){
各 primitive データの mat (アサインされたマテリアル)が materials 配列にある "red", "green", "blue" のいずれかを判別。見つかれば if 構文中の次の行に進む。 - i@switch = i;
if 条件で見つかったマテリアルの値 (i) を整数型アトリビュートとして宣言した switch に格納(更新)。 - break;
if が実行され、switch に値を更新した時点でループから抜ける。
0 件のコメント:
コメントを投稿