USD: Fix varying interpolation import
This addresses issue #93052. Now converting the USD "varying" interpolation type to the "point" domain type when importing USD attributes. There have been some inconsistent opinions in the USD developer community about whether "varying" interpolation is equivalent to "corner" or "point" domains for meshes. However, DCCs such as Unity and Houdini assume that the number of entries for attributes with "varying" interpolation is the same as the number of points, and this change allows Blender to import such assets without error. Pull Request: https://projects.blender.org/blender/blender/pulls/118539
This commit is contained in:
committed by
Michael Kowalski
parent
bdc9767e09
commit
1d0bbefbb7
@@ -215,7 +215,7 @@ static const std::optional<bke::AttrDomain> convert_usd_varying_to_blender(
|
||||
blender::Map<pxr::TfToken, bke::AttrDomain> map;
|
||||
map.add_new(pxr::UsdGeomTokens->faceVarying, bke::AttrDomain::Corner);
|
||||
map.add_new(pxr::UsdGeomTokens->vertex, bke::AttrDomain::Point);
|
||||
map.add_new(pxr::UsdGeomTokens->varying, bke::AttrDomain::Corner);
|
||||
map.add_new(pxr::UsdGeomTokens->varying, bke::AttrDomain::Point);
|
||||
map.add_new(pxr::UsdGeomTokens->face, bke::AttrDomain::Face);
|
||||
/* As there's no "constant" type in Blender, for now we're
|
||||
* translating into a point Attribute. */
|
||||
@@ -402,7 +402,7 @@ void USDMeshReader::read_color_data_primvar(Mesh *mesh,
|
||||
pxr::TfToken interp = primvar.GetInterpolation();
|
||||
|
||||
if ((interp == pxr::UsdGeomTokens->faceVarying && usd_colors.size() != mesh->corners_num) ||
|
||||
(interp == pxr::UsdGeomTokens->varying && usd_colors.size() != mesh->corners_num) ||
|
||||
(interp == pxr::UsdGeomTokens->varying && usd_colors.size() != mesh->verts_num) ||
|
||||
(interp == pxr::UsdGeomTokens->vertex && usd_colors.size() != mesh->verts_num) ||
|
||||
(interp == pxr::UsdGeomTokens->constant && usd_colors.size() != 1) ||
|
||||
(interp == pxr::UsdGeomTokens->uniform && usd_colors.size() != mesh->faces_num))
|
||||
@@ -420,11 +420,7 @@ void USDMeshReader::read_color_data_primvar(Mesh *mesh,
|
||||
|
||||
bke::AttrDomain color_domain = bke::AttrDomain::Point;
|
||||
|
||||
if (ELEM(interp,
|
||||
pxr::UsdGeomTokens->varying,
|
||||
pxr::UsdGeomTokens->faceVarying,
|
||||
pxr::UsdGeomTokens->uniform))
|
||||
{
|
||||
if (ELEM(interp, pxr::UsdGeomTokens->faceVarying, pxr::UsdGeomTokens->uniform)) {
|
||||
color_domain = bke::AttrDomain::Corner;
|
||||
}
|
||||
|
||||
@@ -445,7 +441,7 @@ void USDMeshReader::read_color_data_primvar(Mesh *mesh,
|
||||
ColorGeometry4f(usd_colors[0][0], usd_colors[0][1], usd_colors[0][2], 1.0f));
|
||||
}
|
||||
/* Check for situations that allow for a straight-forward copy by index. */
|
||||
else if (interp == pxr::UsdGeomTokens->vertex ||
|
||||
else if (interp == pxr::UsdGeomTokens->vertex || interp == pxr::UsdGeomTokens->varying ||
|
||||
(interp == pxr::UsdGeomTokens->faceVarying && !is_left_handed_))
|
||||
{
|
||||
for (int i = 0; i < usd_colors.size(); i++) {
|
||||
@@ -524,7 +520,7 @@ void USDMeshReader::read_uv_data_primvar(Mesh *mesh,
|
||||
|
||||
if ((varying_type == pxr::UsdGeomTokens->faceVarying && usd_uvs.size() != mesh->corners_num) ||
|
||||
(varying_type == pxr::UsdGeomTokens->vertex && usd_uvs.size() != mesh->verts_num) ||
|
||||
(varying_type == pxr::UsdGeomTokens->varying && usd_uvs.size() != mesh->corners_num))
|
||||
(varying_type == pxr::UsdGeomTokens->varying && usd_uvs.size() != mesh->verts_num))
|
||||
{
|
||||
BKE_reportf(reports(),
|
||||
RPT_WARNING,
|
||||
@@ -545,7 +541,7 @@ void USDMeshReader::read_uv_data_primvar(Mesh *mesh,
|
||||
return;
|
||||
}
|
||||
|
||||
if (ELEM(varying_type, pxr::UsdGeomTokens->faceVarying, pxr::UsdGeomTokens->varying)) {
|
||||
if (varying_type == pxr::UsdGeomTokens->faceVarying) {
|
||||
if (is_left_handed_) {
|
||||
/* Reverse the index order. */
|
||||
const OffsetIndices faces = mesh->faces();
|
||||
|
||||
Reference in New Issue
Block a user