// プリミティブに含まれる最初のハーフエッジを見つける
int f_hedge = primhedge(0, @primnum);
vector N = normalize(vertex(0, "N", vertexindex(0,@primnum,0)) + vertex(0, "N", vertexindex(0,@primnum,0)) + vertex(0, "N", vertexindex(0,@primnum,0)));
int hedge = f_hedge;
int i = 0;
while(hedge != -1 && i < 3)
{
if(i != 0 && hedge == f_hedge)
{
break;
}
// ハーフエッジかどうか
if(hedge_isvalid(0, hedge) == 0)
{
hedge = hedge_next(0,hedge);
++i;
continue;
}
// プライマリハーフエッジかどうか
if(hedge_isprimary(0, hedge) == 0)
{
hedge = hedge_next(0,hedge);
++i;
continue;
}
int hedgeNum = hedge_equivcount(0, hedge);
int other_hedge = hedge_nextequiv(0,hedge); // プライマリハーフエッジに対して同等なもう一方のハーフエッジを取得する
for(int k = 0; k < hedgeNum-1; ++k)
{
// 共有する辺からBinormalを計算する
vector binormal = normalize(point(0,"P", hedge_srcpoint(0,other_hedge)) - point(0,"P", hedge_dstpoint(0,other_hedge)));
// もう一方の面の法線を求める。
int other_prim = hedge_prim(0, other_hedge);
int other_vertex = vertexindex(0,other_prim,0);
int other_vertex2 = vertexindex(0,other_prim,1);
int other_vertex3 = vertexindex(0,other_prim,2);
vector otherN = normalize(vertex(0, "N", other_vertex) + vertex(0, "N", other_vertex2) + vertex(0, "N", other_vertex3));
// normal x binromal の順番で外積
vector otherT = cross(otherN, binormal);
// プライマリのNormalとセカンダリのTangentを内積
float angle = dot(N, otherT);
if(angle > ch("threshold"))
{
setedgegroup(0, chs("name"), hedge_srcpoint(0,hedge), hedge_dstpoint(0,hedge),1);
}
other_hedge = hedge_nextequiv(0, other_hedge);
}
hedge = hedge_next(0,hedge);
++i;
}