リダクションや曲線化などの処理を行ってポイント配置が変わりアトリビュートが消えた場合などに、元のポリラインからポイントアトリビュートを転写する。
ポイントのアトリビュートを転写する
アトリビュート全種類を調べてコピーしていく。値はパラメトリックUV座標から、文字列は一番近いポイントから取得している。
//
// 同じ形状のポリラインからポイントアトリビュートを転写する
// RunOver: Points
//
int sourceInput = 1; // 参照するインプット
// UV座標を取得する
int index;
vector uv;
xyzdist(sourceInput, @P, index, uv);
string pointAttribs[] = detailintrinsic(1, 'pointattributes');
for(int i = 0; i < len(pointAttribs); i++)
{
int type = pointattribtype(sourceInput, pointAttribs[i]);
int size = pointattribsize(sourceInput, pointAttribs[i]);
// int
if(type == 0)
{
int value = primuv(sourceInput, pointAttribs[i], index, uv);
setpointattrib(0, pointAttribs[i], @ptnum, value);
}
// float
else if(type == 1 && size == 1)
{
float value = primuv(sourceInput, pointAttribs[i], index, uv);
setpointattrib(0, pointAttribs[i], @ptnum, value);
}
// 2-float vector
else if(type == 1 && size == 2)
{
vector2 value = primuv(sourceInput, pointAttribs[i], index, uv);
setpointattrib(0, pointAttribs[i], @ptnum, value);
}
// 3-float vector
else if(type == 1 && size == 3)
{
vector value = primuv(sourceInput, pointAttribs[i], index, uv);
setpointattrib(0, pointAttribs[i], @ptnum, value);
}
// 4-float vector
else if(type == 1 && size == 4)
{
vector4 value = primuv(sourceInput, pointAttribs[i], index, uv);
setpointattrib(0, pointAttribs[i], @ptnum, value);
}
// 3x3 matrix
else if(type == 1 && size == 9)
{
matrix3 value = primuv(sourceInput, pointAttribs[i], index, uv);
setpointattrib(0, pointAttribs[i], @ptnum, value);
}
// 4x4 matrix
else if(type == 1 && size == 16)
{
matrix value = primuv(sourceInput, pointAttribs[i], index, uv);
setpointattrib(0, pointAttribs[i], @ptnum, value);
}
// string
else if(type == 2)
{
int npt = nearpoint(sourceInput, @P);
string value = point(sourceInput, pointAttribs[i], npt);
setpointattrib(0, pointAttribs[i], @ptnum, value);
}
// int array
else if(type == 3)
{
int value[] = primuv(sourceInput, pointAttribs[i], index, uv);
setpointattrib(0, pointAttribs[i], @ptnum, value);
}
// float array
else if(type == 4)
{
float value[] = primuv(sourceInput, pointAttribs[i], index, uv);
setpointattrib(0, pointAttribs[i], @ptnum, value);
}
// string array
else if(type == 5)
{
int npt = nearpoint(sourceInput, @P);
string value[] = point(sourceInput, pointAttribs[i], npt);
setpointattrib(0, pointAttribs[i], @ptnum, value);
}
}
ポイントのグループを転写する
一番近いポイントからグループの値をコピーしている。
//
// グループの値を転写
// RunOver:Points
//
int sourceInput = 1; // 参照するインプット
// グループ名を配列で取得する
string pointgrps[] = detailintrinsic(sourceInput, "pointgroups");
for(int i = 0; i < len(pointgrps); i++)
{
int npt = nearpoint(sourceInput, @P);
// グループの値を取得
int ingroup = inpointgroup(sourceInput, pointgrps[i], npt);
// グループに値を割り当てる
setpointgroup(0, pointgrps[i], @ptnum, ingroup);
}