[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