[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