copy stamp material vex

このページで紹介されている 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;
    }
}

以下一行ごとの説明く

  1. string path, mat;
    string は文字列型変数のための(ローカル)宣言、path と mat はそれぞれ変数。
    つまり文字列型のローカル変数 path と mat を作った。
  2. splitpath(s@shop_materialpath, path, mat);
    splitpath はVEX関数。文字列(パス)からパス部分とファイル名部分を分ける。入力となるパス、パス部分を格納する変数、ファイル名部分を格納する変数の3つの引数が必要。
      s@shop_materialpath は、「s@」という宣言方法で、この Attribute Wrangle ノードに渡されるデータ群に対し、それぞれのデータ要素に "s" (string の s = 文字列)のアトリビュートを用意し値を格納している。
    つまり shop_materialpath アトリビュートにあるマテリアルまでのパス文字列をパス部分(path)とマテリアル名(mat)に分け、それぞれ格納している。
  3. string materials[] = { "red", "green", "blue" };
    これは文字列型配列の宣言。red=0, green=1, blue=2 となる。後ほど比較のために使用。
  4. i@switch = 0;
    「i@」という宣言方法で"i" (integer の i = 整数)型のアトリビュート switch を定義、このノードに渡されるデータ群に対し、すべて 0 に初期化。
  5. 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; ... とする方が良いかもしれない。
  6. if (materials[i] == mat){
    各 primitive データの mat (アサインされたマテリアル)が materials 配列にある "red", "green", "blue" のいずれかを判別。見つかれば if 構文中の次の行に進む。
  7. i@switch = i;
    if 条件で見つかったマテリアルの値 (i) を整数型アトリビュートとして宣言した switch に格納(更新)。
  8. break;
    if が実行され、switch に値を更新した時点でループから抜ける。

0 件のコメント:

コメントを投稿