[Bf-blender-cvs] [6ec51df3c81] usd-importer-T81257: USD mesh import winding order bug fix.

Michael A. Kowalski noreply at git.blender.org
Mon Oct 12 20:52:59 CEST 2020


Commit: 6ec51df3c81d3be7015d5405a8db4a3cda8f5c16
Author: Michael A. Kowalski
Date:   Mon Oct 12 14:50:36 2020 -0400
Branches: usd-importer-T81257
https://developer.blender.org/rB6ec51df3c81d3be7015d5405a8db4a3cda8f5c16

USD mesh import winding order bug fix.

Fixed vert and normal indexing errors for left-handed orientation.

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

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 a90b2514838..1e20e1f3f92 100644
--- a/source/blender/io/usd/intern/usd_reader_mesh.cc
+++ b/source/blender/io/usd/intern/usd_reader_mesh.cc
@@ -159,23 +159,27 @@ static void read_mpolys(Mesh *mesh, const MeshSampleData &mesh_data)
 
     for (int f = 0; f < face_size; ++f) {
 
-      int loop_index = loop_start;
+      int loop_index = loop_start + f;
+
+      /* Index into the USD data, corresponding to the loop index,
+       * but taking reversed winding order into account. */
+      int usd_index = loop_start;
 
       if (mesh_data.reverse_vert_order) {
-        loop_index += face_size - 1 - f;
+        usd_index += face_size - 1 - f;
       }
       else {
-        loop_index += f;
+        usd_index += f;
       }
 
       MLoop &loop = mloops[loop_index];
-      loop.v = mesh_data.vertex_indices[loop_index];
+      loop.v = mesh_data.vertex_indices[usd_index];
 
       if (mloopuvs) {
         MLoopUV &loopuv = mloopuvs[loop_index];
 
         int uv_index = mesh_data.uv_interpolation == pxr::UsdGeomTokens->vertex ? loop.v :
-                                                                                  loop_index;
+                                                                                  usd_index;
 
         uv_index = mesh_data.uv_indices.empty() ? uv_index : mesh_data.uv_indices[uv_index];
 
@@ -226,15 +230,30 @@ static void process_loop_normals(Mesh *mesh, const MeshSampleData &mesh_data)
   float(*lnors)[3] = static_cast<float(*)[3]>(
       MEM_malloc_arrayN(loop_count, sizeof(float[3]), "USD::FaceNormals"));
 
-  for (int i = 0; i < loop_count; ++i) {
+  MPoly *mpoly = mesh->mpoly;
 
-    if (mesh_data.y_up) {
-      blender::io::usd::copy_zup_from_yup(lnors[i], mesh_data.normals[i].data());
-    }
-    else {
-      lnors[i][0] = mesh_data.normals[i].data()[0];
-      lnors[i][1] = mesh_data.normals[i].data()[1];
-      lnors[i][2] = mesh_data.normals[i].data()[2];
+  for (int p = 0; p < mesh->totpoly; ++p, ++mpoly) {
+
+    for (int l = 0; l < mpoly->totloop; ++l) {
+      int blender_index = mpoly->loopstart + l;
+      int usd_index = mpoly->loopstart;
+
+      if (mesh_data.reverse_vert_order) {
+        usd_index += mpoly->totloop - 1 - l;
+      }
+      else {
+        usd_index += l;
+      }
+
+      if (mesh_data.y_up) {
+        blender::io::usd::copy_zup_from_yup(lnors[blender_index],
+                                            mesh_data.normals[usd_index].data());
+      }
+      else {
+        lnors[blender_index][0] = mesh_data.normals[usd_index].data()[0];
+        lnors[blender_index][1] = mesh_data.normals[usd_index].data()[1];
+        lnors[blender_index][2] = mesh_data.normals[usd_index].data()[2];
+      }
     }
   }



More information about the Bf-blender-cvs mailing list