[Bf-blender-cvs] [dff24cf649d] usd-importer-T81257-merge: USD import: uniform interpolation normals.
makowalski
noreply at git.blender.org
Tue Feb 16 23:43:45 CET 2021
Commit: dff24cf649db0380290ee3b50057b625f1f44299
Author: makowalski
Date: Tue Feb 16 17:37:38 2021 -0500
Branches: usd-importer-T81257-merge
https://developer.blender.org/rBdff24cf649db0380290ee3b50057b625f1f44299
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/intern/usd_reader_mesh.cc
M source/blender/io/usd/intern/usd_reader_mesh.h
===================================================================
diff --git a/source/blender/io/usd/intern/usd_reader_mesh.cc b/source/blender/io/usd/intern/usd_reader_mesh.cc
index 9c735e930f0..b57959ce6b2 100644
--- a/source/blender/io/usd/intern/usd_reader_mesh.cc
+++ b/source/blender/io/usd/intern/usd_reader_mesh.cc
@@ -553,6 +553,43 @@ void USDMeshReader::process_normals_face_varying(Mesh *mesh)
MEM_freeN(lnors);
}
+// Set USD uniform (per-face) normals as Blender loop normals.
+void USDMeshReader::process_normals_uniform(Mesh *mesh)
+{
+ if (m_normals.empty()) {
+ BKE_mesh_calc_normals(mesh);
+ return;
+ }
+
+ // Check for normals count mismatches to prevent crashes.
+ if (m_normals.size() != mesh->totpoly) {
+ std::cerr << "WARNING: uniform normal count mismatch for mesh " << mesh->id.name << std::endl;
+ BKE_mesh_calc_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 i = 0, e = mesh->totpoly; i < e; ++i, ++mpoly) {
+
+ for (int j = 0; j < mpoly->totloop; j++) {
+ int loop_index = mpoly->loopstart + j;
+ lnors[loop_index][0] = m_normals[i][0];
+ lnors[loop_index][1] = m_normals[i][1];
+ lnors[loop_index][2] = m_normals[i][2];
+ }
+ }
+
+ mesh->flag |= ME_AUTOSMOOTH;
+ BKE_mesh_set_custom_normals(mesh, lnors);
+
+ MEM_freeN(lnors);
+}
+
+
void USDMeshReader::read_mesh_sample(const std::string &iobject_full_name,
ImportSettings *settings,
Mesh *mesh,
@@ -599,8 +636,16 @@ void USDMeshReader::read_mesh_sample(const std::string &iobject_full_name,
if ((settings->read_flag & MOD_MESHSEQ_READ_POLY) != 0) {
read_mpolys(mesh, mesh_prim, motionSampleTime);
- if (m_normalInterpolation == pxr::UsdGeomTokens->faceVarying)
+ if (m_normalInterpolation == pxr::UsdGeomTokens->faceVarying) {
process_normals_face_varying(mesh);
+ }
+ else if (m_normalInterpolation == pxr::UsdGeomTokens->uniform) {
+ process_normals_uniform(mesh);
+ }
+ else {
+ // Default
+ BKE_mesh_calc_normals(mesh);
+ }
}
// Process point normals after reading polys. This
diff --git a/source/blender/io/usd/intern/usd_reader_mesh.h b/source/blender/io/usd/intern/usd_reader_mesh.h
index e4933c018ad..3a392c54998 100644
--- a/source/blender/io/usd/intern/usd_reader_mesh.h
+++ b/source/blender/io/usd/intern/usd_reader_mesh.h
@@ -50,6 +50,7 @@ class USDMeshReader : public USDGeomReader {
private:
void process_normals_vertex_varying(Mesh *mesh);
void process_normals_face_varying(Mesh *mesh);
+ void process_normals_uniform(Mesh *mesh);
void readFaceSetsSample(Main *bmain, Mesh *mesh, double motionSampleTime);
void assign_facesets_to_mpoly(double motionSampleTime,
struct MPoly *mpoly,
More information about the Bf-blender-cvs
mailing list