[Bf-blender-cvs] [17cd9adbde9] usd-importer-T81257-merge: USD import: Handle empty vertex-varying normals.

makowalski noreply at git.blender.org
Mon Feb 8 22:21:43 CET 2021


Commit: 17cd9adbde9df63d2fa700a303d7ea1fef4ff332
Author: makowalski
Date:   Mon Feb 8 11:58:14 2021 -0500
Branches: usd-importer-T81257-merge
https://developer.blender.org/rB17cd9adbde9df63d2fa700a303d7ea1fef4ff332

USD import: Handle empty vertex-varying normals.

If point normals are empty, now invoking BKE_mesh_calc_normals()
to avoid black renders.  Since BKE_mesh_calc_normals() requires
edges to be defined, moving point normal calculation to follow
reading polys.

===================================================================

M	source/blender/io/usd/intern/usd_reader_mesh.cc

===================================================================

diff --git a/source/blender/io/usd/intern/usd_reader_mesh.cc b/source/blender/io/usd/intern/usd_reader_mesh.cc
index 75f666db1d1..8afd8378386 100644
--- a/source/blender/io/usd/intern/usd_reader_mesh.cc
+++ b/source/blender/io/usd/intern/usd_reader_mesh.cc
@@ -486,6 +486,11 @@ void USDMeshReader::read_vels(Mesh *mesh,
 
 void USDMeshReader::process_normals_vertex_varying(Mesh *mesh)
 {
+  if (m_normals.empty()) {
+    BKE_mesh_calc_normals(mesh);
+    return;
+  }
+
   for (int i = 0; i < m_normals.size(); i++) {
     MVert &mvert = mesh->mvert[i];
     normal_float_to_short_v3(mvert.no, m_normals[i].data());
@@ -565,9 +570,6 @@ void USDMeshReader::read_mesh_sample(const std::string &iobject_full_name,
       mvert.co[1] = m_positions[i][1];
       mvert.co[2] = m_positions[i][2];
     }
-
-    if (m_normalInterpolation == pxr::UsdGeomTokens->vertex)
-      process_normals_vertex_varying(mesh);
   }
 
   if ((settings->read_flag & MOD_MESHSEQ_READ_POLY) != 0) {
@@ -576,6 +578,15 @@ void USDMeshReader::read_mesh_sample(const std::string &iobject_full_name,
       process_normals_face_varying(mesh);
   }
 
+  // Process point normals after reading polys.  This
+  // is important in the case where the normals are empty
+  // and we invoke BKE_mesh_calc_normals(mesh), which requires
+  // edges to be defined.
+  if ((settings->read_flag & MOD_MESHSEQ_READ_VERT) != 0 &&
+      m_normalInterpolation == pxr::UsdGeomTokens->vertex) {
+    process_normals_vertex_varying(mesh);
+  }
+
   if ((settings->read_flag & MOD_MESHSEQ_READ_UV) != 0) {
     read_uvs(mesh, mesh_prim, motionSampleTime, new_mesh);
   }



More information about the Bf-blender-cvs mailing list