[Bf-blender-cvs] [1ef924700c8] sybren-usd: USD: use a struct USDMeshData to group mesh data for USD export

Sybren A. Stüvel noreply at git.blender.org
Thu Jul 11 17:09:18 CEST 2019


Commit: 1ef924700c802896a556f687af6c5f4d01289a4b
Author: Sybren A. Stüvel
Date:   Thu Jul 11 17:09:07 2019 +0200
Branches: sybren-usd
https://developer.blender.org/rB1ef924700c802896a556f687af6c5f4d01289a4b

USD: use a struct USDMeshData to group mesh data for USD export

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

M	source/blender/usd/intern/usd_writer_mesh.cc
M	source/blender/usd/intern/usd_writer_mesh.h

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

diff --git a/source/blender/usd/intern/usd_writer_mesh.cc b/source/blender/usd/intern/usd_writer_mesh.cc
index 2ca8dd064d8..c6c7f51c7c9 100644
--- a/source/blender/usd/intern/usd_writer_mesh.cc
+++ b/source/blender/usd/intern/usd_writer_mesh.cc
@@ -51,6 +51,13 @@ void USDGenericMeshWriter::free_export_mesh(Mesh *mesh)
   BKE_id_free(NULL, mesh);
 }
 
+struct USDMeshData {
+  pxr::VtArray<pxr::GfVec3f> points;
+  pxr::VtIntArray face_vertex_counts;
+  pxr::VtIntArray face_indices;
+  std::map<short, pxr::VtIntArray> face_groups;
+};
+
 void USDGenericMeshWriter::write_mesh(HierarchyContext &context, Mesh *mesh)
 {
   pxr::UsdTimeCode timecode = get_export_time_code();
@@ -61,58 +68,50 @@ void USDGenericMeshWriter::write_mesh(HierarchyContext &context, Mesh *mesh)
 
   pxr::UsdGeomMesh usd_mesh = pxr::UsdGeomMesh::Define(stage, usd_path_);
 
-  // USD structures for mesh data.
-  pxr::VtArray<pxr::GfVec3f> usd_points;
-  pxr::VtIntArray usd_face_vertex_counts, usd_face_indices;
-  std::map<short, pxr::VtIntArray> usd_face_groups;
-
-  get_geometry_data(mesh, usd_points, usd_face_vertex_counts, usd_face_indices, usd_face_groups);
+  USDMeshData usd_mesh_data;
+  get_geometry_data(mesh, usd_mesh_data);
 
-  usd_mesh.CreatePointsAttr().Set(usd_points, timecode);
-  usd_mesh.CreateFaceVertexCountsAttr().Set(usd_face_vertex_counts, timecode);
-  usd_mesh.CreateFaceVertexIndicesAttr().Set(usd_face_indices, timecode);
+  usd_mesh.CreatePointsAttr().Set(usd_mesh_data.points, timecode);
+  usd_mesh.CreateFaceVertexCountsAttr().Set(usd_mesh_data.face_vertex_counts, timecode);
+  usd_mesh.CreateFaceVertexIndicesAttr().Set(usd_mesh_data.face_indices, timecode);
 
   // TODO(Sybren): figure out what happens when the face groups change.
   if (frame_has_been_written_) {
     return;
   }
 
-  assign_materials(context, usd_mesh, usd_face_groups);
+  assign_materials(context, usd_mesh, usd_mesh_data.face_groups);
 }
 
-void USDGenericMeshWriter::get_geometry_data(const Mesh *mesh,
-                                             pxr::VtArray<pxr::GfVec3f> &usd_points,
-                                             pxr::VtIntArray &usd_face_vertex_counts,
-                                             pxr::VtIntArray &usd_face_indices,
-                                             std::map<short, pxr::VtIntArray> &usd_face_groups)
+void USDGenericMeshWriter::get_geometry_data(const Mesh *mesh, struct USDMeshData &usd_mesh_data)
 {
   /* Only construct face groups (a.k.a. geometry subsets) when we need them for material
    * assignments. */
   bool construct_face_groups = mesh->totcol > 1;
 
-  usd_points.reserve(mesh->totvert);
-  usd_face_vertex_counts.reserve(mesh->totpoly);
-  usd_face_indices.reserve(mesh->totloop);
+  usd_mesh_data.points.reserve(mesh->totvert);
+  usd_mesh_data.face_vertex_counts.reserve(mesh->totpoly);
+  usd_mesh_data.face_indices.reserve(mesh->totloop);
 
   // TODO(Sybren): there is probably a more C++-y way to do this, which avoids copying the entire
   // mesh to a different structure. I haven't seen the approach below in the USD exporters for
   // Maya/Houdini, but it's simple and it works for now.
   const MVert *verts = mesh->mvert;
   for (int i = 0; i < mesh->totvert; ++i) {
-    usd_points.push_back(pxr::GfVec3f(verts[i].co));
+    usd_mesh_data.points.push_back(pxr::GfVec3f(verts[i].co));
   }
 
   MLoop *mloop = mesh->mloop;
   MPoly *mpoly = mesh->mpoly;
   for (int i = 0; i < mesh->totpoly; ++i, ++mpoly) {
     MLoop *loop = mloop + mpoly->loopstart;
-    usd_face_vertex_counts.push_back(mpoly->totloop);
+    usd_mesh_data.face_vertex_counts.push_back(mpoly->totloop);
     for (int j = 0; j < mpoly->totloop; ++j, ++loop) {
-      usd_face_indices.push_back(loop->v);
+      usd_mesh_data.face_indices.push_back(loop->v);
     }
 
     if (construct_face_groups) {
-      usd_face_groups[mpoly->mat_nr].push_back(i);
+      usd_mesh_data.face_groups[mpoly->mat_nr].push_back(i);
     }
   }
 }
diff --git a/source/blender/usd/intern/usd_writer_mesh.h b/source/blender/usd/intern/usd_writer_mesh.h
index ee3a392ff51..b137b16a843 100644
--- a/source/blender/usd/intern/usd_writer_mesh.h
+++ b/source/blender/usd/intern/usd_writer_mesh.h
@@ -5,6 +5,8 @@
 
 #include <pxr/usd/usdGeom/mesh.h>
 
+struct USDMeshData;
+
 /* Writer for USD geometry. Does not assume the object is a mesh object. */
 class USDGenericMeshWriter : public USDAbstractWriter {
  public:
@@ -18,11 +20,7 @@ class USDGenericMeshWriter : public USDAbstractWriter {
 
  private:
   void write_mesh(HierarchyContext &context, Mesh *mesh);
-  void get_geometry_data(const Mesh *mesh,
-                         pxr::VtArray<pxr::GfVec3f> &usd_points,
-                         pxr::VtIntArray &usd_face_vertex_counts,
-                         pxr::VtIntArray &usd_face_indices,
-                         std::map<short, pxr::VtIntArray> &usd_face_groups);
+  void get_geometry_data(const Mesh *mesh, struct USDMeshData &usd_mesh_data);
   void assign_materials(const HierarchyContext &context,
                         pxr::UsdGeomMesh usd_mesh,
                         const std::map<short, pxr::VtIntArray> &usd_face_groups);



More information about the Bf-blender-cvs mailing list