UVTexIntegra 310.0.0.3

- メインページ
- 関連ページ
- モジュール
- ネームスペース
- クラス
- ファイル

全て クラス ネームスペース 関数 変数 列挙型 プロパティ イベント グループ ページ
実際のUV処理をカスタマイズする

いよいよ OnUVOperation() メソッドをオーバーライドします。

プレビューや保存処理の前に OnUVOperation() メソッドが呼び出されるので、 パラメータに渡された ScriptMain.Face[] を参照し、 Face.Normal などの面情報をもとに Face.Points[].Coordinate または Face.Points[].Color を書き換えていきます。

// 頂点を全て白にするサンプル
public class Test : UVTexIntegra.Scripting.ScriptMain
{
// 〜 <略> 〜 //
public override void OnUVOperation(ScriptMain.Face[] faces)
{
// すべての面を総当り
foreach (ScriptMain.Face face in faces)
{
foreach (ScriptMain.Face.Point point in face.Points)
{
// 真っ白に
point.Color = System.Drawing.Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
}
}
}
// 〜 <略> 〜 //
}

もし、面ごとの処理だけでなく、頂点ごとの処理を行うには OnUVOperation() の処理中に独自に解析バッファを作るか ScriptMain.Face.ShareRelation.GetRelationsSnap() メソッドを使います。 このメソッドは現在UV座標がどのように複数の面に共有されているかリストにします。

// 同じUVを共有する頂点同士で頂点色を平均化するサンプル
public override void OnUVOperation(ScriptMain.Face[] faces)
{
// ScriptMain.Face.ShareRelation.GetRelationsSnap()メソッドを使うと、
// その時点で、ほとんど同じ座標（座標の差がきわめて小さい）のUV頂点を並べたデータを返します。
// (*1) ここでは同じ座標とみなす許容誤差にfloat.Epsilon * 4.0fをとりあえず設定しています。とくに論拠はありません。
// (*2) UV頂点はひとつのShareRelationにしか属さないので、重複登録されたりはしません。
System.Collections.ObjectModel.ReadOnlyCollection<ScriptMain.Face.ShareRelation> shareSnap =
ScriptMain.Face.ShareRelation.GetRelationsSnap(faces, float.Epsilon * 4.0f);
// まとめられたUV情報(ScriptMain.Face.ShareRelation)を総当り
foreach (ScriptMain.Face.ShareRelation rel in shareSnap)
{
if (1 < rel.Owners.Count)
{
int[] sum = new int[4] { 0, 0, 0, 0 };
// このShareRelationでUVを共有する全てのオーナーの色を合計
foreach (Face.ShareRelation.IReference reference in rel.Owners)
{
sum[0] += reference.Point.Color.A;
sum[1] += reference.Point.Color.R;
sum[2] += reference.Point.Color.G;
sum[3] += reference.Point.Color.B;
}
// 要素数で割って平均値。一応オーバーフローしないようにしてるけどいらないかも
sum[0] = System.Math.Min(sum[0] / rel.Owners.Count, 0xFF);
sum[1] = System.Math.Min(sum[1] / rel.Owners.Count, 0xFF);
sum[2] = System.Math.Min(sum[2] / rel.Owners.Count, 0xFF);
sum[3] = System.Math.Min(sum[3] / rel.Owners.Count, 0xFF);
// このShareRelationでUVを共有する全てのオーナーのカラーを平均値で更新
System.Drawing.Color color = System.Drawing.Color.FromArgb(sum[0], sum[1], sum[2], sum[3]);
foreach (Face.ShareRelation.IReference reference in rel.Owners) reference.Point.Color = color;
}
}
}

覚え書き
  GetRelationsSnap() はその瞬間のUV座標で静的な共有リストを作ります。 GetRelationsSnap() で共有リストを作ったあと、UV座標の位置を書き換えると、共有リストは正しい共有関係を維持しなくなるので注意してください。