From 1d0bbefbb78648b1a98c6557417ce69464a199f4 Mon Sep 17 00:00:00 2001 From: Michael Kowalski Date: Wed, 21 Feb 2024 16:07:17 +0100 Subject: [PATCH] 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 --- source/blender/io/usd/intern/usd_reader_mesh.cc | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/source/blender/io/usd/intern/usd_reader_mesh.cc b/source/blender/io/usd/intern/usd_reader_mesh.cc index 08f8ce93d7e..651a7dc2a8e 100644 --- a/source/blender/io/usd/intern/usd_reader_mesh.cc +++ b/source/blender/io/usd/intern/usd_reader_mesh.cc @@ -215,7 +215,7 @@ static const std::optional convert_usd_varying_to_blender( blender::Map 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();