9.おまけ

HairBladeはカスタムシェイプの形状データ以外のすべての情報をポリゴンタグとVMAPに保持しているため、LScriptやプラグイン等から自由に参照、編集することが可能です。
実際にVMAPがどのように設定されているかは、HairBladeの頂点を選択して情報パネルを表示するとよくわかるでしょう。


以下にHairBladeで使用しているポリゴンタグ、VMAPのIDと値を説明します。



  a.ポリゴンタグ
  • コントロールポイント設定

  • ID : HBCP
    設定文字列 : "00", "01", "10", "11" のいずれか
    モデラーカーブの開始、終了コントロールポイントと同様の意味を持ちます。
    設定文字列は2バイトの0と1の組み合わせで、1バイト目が開始コントロールポイントの有無(0:無, 1:有)、
    2バイト目が終了コントロールポイントの有無となります。

  • UVテクスチャマップ名

  • ID : HBUV
    設定文字列 : マップ名(最大250バイト)
    BladeFreezeなどでUVを生成するときのマップ名となります。



  b.VMAP
  • コントロールカーブ設定

  • ID : BLDC
    要素数 : 6
    設定値
    val[0] 未使用
    未使用項目については将来において使用される可能性があるので使用しないでください。
    val[1] 分割レベル(BladeEditの"Divide Level"に該当)
    整数値が設定されます。(VMAPの仕様で内部では浮動小数で保持されます。)
    val[2] フリーズ時の分割レート(BladeEditの"Freeze Rate"に該当)
    浮動小数値。1.0が100%となります。
    val[3] uvタイプ(BladeEditの"UV Type"に該当)
    整数値。現在は"0"(None)と"1"(Type A)のみが有効です。
    val[4] サブパッチウェイト転送有無(BladeEditの"SubPatch Weight"に該当)
    整数値。"0"(なし)と"1"(あり)のどちらかです。
    val[5] 未使用
     
  • シェイプ設定

  • ID : BLDG
    要素数 : 4
    設定値
    val[0] シェイプタイプ(BladeEditの"Shape Type"に該当)
    整数値。"0"はプロシージャルとなり、以降の要素[1]〜[3]の設定を使用した板状のシェイプを自動生成します。
    "1"以上の値はHairBlade Managerに登録されているカスタムシェイプとなりますが、存在しない番号をセットした場合は無視されてプロシージャルになります。
    val[1] シェイプ幅(BladeEditの"Width"に該当)
    浮動小数値。1.0が1メートルとなります。
    val[2] シェイプ高さ(BladeEditの"Height"に該当)
    浮動小数値。1.0が1メートルとなります。
    val[3] W分割数(BladeEditの"W Divide"に該当)
    整数値。1以上の値を設定します。
  • グローバル変形設定

  • ID : BLDA
    要素数 : 4
    設定値
    val[0] Wスケール(BladeEditの"W Scale"に該当)
    浮動小数値。1.0が100%となります。
    val[1] Hスケール(BladeEditの"H Scale"に該当)
    浮動小数値。1.0が100%となります。
    val[2] バンク角(BladeEditの"Rotate"に該当)
    浮動小数値。ラジアンで設定します。
    val[3] ツイスト角(BladeEditの"Twist"に該当)
    浮動小数値。ラジアンで設定します。
  • ポイント変形設定

  • ID : BLDM
    要素数 : 10
    設定値
    val[0] -Xスケール(BladeEditの"-X Scale"に該当)
    浮動小数値。1.0が100%となります。
    val[1] +Xスケール(BladeEditの"+X Scale"に該当)
    浮動小数値。1.0が100%となります。
    val[2] -Yスケール(BladeEditの"-Y Scale"に該当)
    浮動小数値。1.0が100%となります。
    val[3] +Yスケール(BladeEditの"+Y Scale"に該当)
    浮動小数値。1.0が100%となります。
    val[4] バンク角(BladeEditのPointタブの"Rotate"に該当)
    浮動小数値。ラジアンで設定します。
    val[5] カスタム分割数(BladeEditの"Custom Divide"に該当)
    整数値。
    val[6] シェイプのXシフト(BladeEditの"Shape X"に該当)
    浮動小数値。1.0が1メートルとなります。
    val[7] シェイプのYシフト(BladeEditの"Shape Y"に該当)
    浮動小数値。1.0が1メートルとなります。
    val[8] 未使用
     
    val[9] 未使用
     
これらVMAPの内、BLDC、BLDG、BLDAについてはコントロールカーブの先頭ポイントのみに設定するだけで構いません。
BLDMについては、先頭ポイントを含むすべてのポイントに設定する必要があります。
また、VMAPの名称はすべて"HairBlade.Params"を使用してください。
これらのIDを実際に使用する場合は以下のようなヘッダファイルに定義します。
/*
 * hairblade.h
 */

#ifndef HAIRBLADE_H
#define HAIRBLADE_H

// ポリゴンタグ ---------------------------------------------------------------
// HairBladeポリゴンタイプ
#define PTYP_BLADE LWID_('H','B','L','D')

// コントロールポイントタグ
#define PTAG_BLADE_CP LWID_('H','B','C','P')

// UVマップ名タグ
#define PTAG_BLADE_UV LWID_('H','B','U','V')

// VMAP関連 --------------------------------------------------------------------
// HairBlade内部パラメータVMAP名
#define VMAP_BLADE "HairBlade.Params"

// 開始点用コントロール定義
#define MTYP_BLADE_CTRL LWID_('B','L','D','C')

// 開始点用シェイプ定義
#define MTYP_BLADE_GEOM LWID_('B','L','D','G')

// 開始点用グローバル変形定義
#define MTYP_BLADE_GLB_MOD LWID_('B','L','D','A')

// ポイント用変形定義
#define MTYP_BLADE_MOD LWID_('B','L','D','M')

// 各VMAPのサイズ
#define VSIZE_BLADE_CTRL 6
#define VSIZE_BLADE_GEOM 4
#define VSIZE_BLADE_GLB_MOD 4
#define VSIZE_BLADE_MOD 10

// 最大VMAPサイズ
#define VSIZE_MAX 10

#endif

実際に使用して選択したHairBladeのバンク角をリセットするMeshDataEditプラグインは以下のようになります。
(アクティベーション関数やチェック処理は省略、polyScanコールバックの一部分です。)

XCALL_(static EDError) polscan(MeshEditOp *edit, const EDPolygonInfo *pi )
{
	float vmapVal[VSIZE_MAX];
	int   i;

	// 先頭ポイントからグローバル変形情報取得
	if(edit->pointVSet(edit->state, NULL , MTYP_BLADE_GLB_MOD, VMAP_BLADE))
	{
		if(edit->pointVGet(edit->state, pi->points[0], vmapVal))
		{
			// バンク角、ツイスト角を0.0にセットしてVMAPに書き戻す
			vmapVal[2] = vmapVal[3] = 0.0;
			edit->pntVMap(edit->state, pi->points[0], MTYP_BLADE_GLB_MOD, VMAP_BLADE, VSIZE_BLADE_GLB_MOD, vmapVal);
		}
	}

	// 各ポイントの変形情報のリセット
	for(i = 0; i < pi->numPnts; i++)
	{
		if(edit->pointVSet(edit->state, NULL , MTYP_BLADE_MOD, VMAP_BLADE))
		{
			if(edit->pointVGet(edit->state, pi->points[i], vmapVal))
			{
				vmapVal[4] = 0.0;
				edit->pntVMap(edit->state, pi->points[i], MTYP_BLADE_MOD, VMAP_BLADE, VSIZE_BLADE_MOD, vmapVal);
			}
		}
	}
}

もし、まったく新規にHairBladeを作成したい場合、つまりはCurveToBladeの代替機能を作成したい場合は、ポリゴンタイプIDとして"HBLD"を指定してください。
このIDを使用し、適切にVMAPを設定すれば後は通常のポリゴン作成となんら変わらず、MeshDataEdit等で各頂点にVMAPを設定した後、
polID = edit->addPoly(edit->state, PTYP_BLADE, pi->pol, NULL, pi->numPnts, pi->points);
とすれば作成することができます。