[Bf-blender-cvs] [4b1c960c979] usd-importer-T81257: USD import: uniform interpolation normals.

makowalski noreply at git.blender.org
Tue Feb 16 22:32:31 CET 2021


Commit: 4b1c960c979f7d5eb1aaae2d5d00d54ce377885f
Author: makowalski
Date:   Tue Feb 16 16:26:17 2021 -0500
Branches: usd-importer-T81257
https://developer.blender.org/rB4b1c960c979f7d5eb1aaae2d5d00d54ce377885f

USD import: uniform interpolation normals.

Added logic to import USD normals with uniform interpolation
(i.e., per-face normals) as Blender loop normals.

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

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

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

diff --git a/source/blender/io/usd/import/usd_reader_mesh.cc b/source/blender/io/usd/import/usd_reader_mesh.cc
index 5b1a52f88d2..9a9b121c617 100644
--- a/source/blender/io/usd/import/usd_reader_mesh.cc
+++ b/source/blender/io/usd/import/usd_reader_mesh.cc
@@ -270,6 +270,52 @@ void process_loop_normals(Mesh *mesh, const MeshSampleData &mesh_data)
   MEM_freeN(lnors);
 }
 
+// Set USD uniform (per-face) normals as Blender loop normals.
+void process_uniform_normals(Mesh *mesh, const MeshSampleData &mesh_data)
+{
+  if (!mesh) {
+    return;
+  }
+
+  size_t norm_count = mesh_data.normals.size();
+
+  if (norm_count == 0) {
+    process_no_normals(mesh);
+    return;
+  }
+
+  if (norm_count != mesh->totpoly) {
+    std::cerr << "WARNING: uniform normal count mismatch for mesh " << mesh->id.name << std::endl;
+    process_no_normals(mesh);
+    return;
+  }
+
+  float(*lnors)[3] = static_cast<float(*)[3]>(
+      MEM_malloc_arrayN(mesh->totloop, sizeof(float[3]), "USD::FaceNormals"));
+
+  MPoly *mpoly = mesh->mpoly;
+
+  for (int p = 0; p < mesh->totpoly; ++p, ++mpoly) {
+
+    for (int l = 0; l < mpoly->totloop; ++l) {
+      int loop_index = mpoly->loopstart + l;
+      if (mesh_data.y_up) {
+        copy_zup_from_yup(lnors[loop_index], mesh_data.normals[p].data());
+      }
+      else {
+        lnors[loop_index][0] = mesh_data.normals[p].data()[0];
+        lnors[loop_index][1] = mesh_data.normals[p].data()[1];
+        lnors[loop_index][2] = mesh_data.normals[p].data()[2];
+      }
+    }
+  }
+
+  mesh->flag |= ME_AUTOSMOOTH;
+  BKE_mesh_set_custom_normals(mesh, lnors);
+
+  MEM_freeN(lnors);
+}
+
 void process_vertex_normals(Mesh *mesh, const MeshSampleData &mesh_data)
 {
   if (!mesh) {
@@ -321,6 +367,9 @@ void process_normals(Mesh *mesh, const MeshSampleData &mesh_data)
   else if (mesh_data.normals_interpolation == pxr::UsdGeomTokens->vertex) {
     process_vertex_normals(mesh, mesh_data); /* 'point normals' in Houdini. */
   }
+  else if (mesh_data.normals_interpolation == pxr::UsdGeomTokens->uniform) {
+    process_uniform_normals(mesh, mesh_data); /* per-face normals. */
+  }
   else {
     process_no_normals(mesh);
   }



More information about the Bf-blender-cvs mailing list