[Bf-blender-cvs] [3cfcf37ceaf] soc-2020-io-performance: Refactor: Keep mesh_from_raw_object in a class

Ankit Meel noreply at git.blender.org
Tue Jul 14 09:00:32 CEST 2020


Commit: 3cfcf37ceafd833ecc1e48beb47b83cfe8794817
Author: Ankit Meel
Date:   Tue Jul 14 01:01:41 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rB3cfcf37ceafd833ecc1e48beb47b83cfe8794817

Refactor: Keep mesh_from_raw_object in a class

The function is moved to a class for a self-contained mesh operation.
BMesh operations will not be required without a mesh first, so they
should be kept in a Mesh operation class.

Remove unused variable: bmain

Keep classes ordered as per Style Guide.

Pass object_name to add_object_to_parent since only that is required.

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

M	source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.cc
M	source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.hh
M	source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.cc
M	source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.hh
M	source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.cc
M	source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.hh
M	source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc

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

diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.cc
index d45c680d9fe..c2d9245626d 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.cc
@@ -42,6 +42,10 @@ OBJImporter::OBJImporter(const OBJImportParams &import_params) : import_params_(
 void OBJImporter::parse_and_store(Vector<std::unique_ptr<OBJRawObject>> &list_of_objects)
 {
   std::string line;
+  /* Non owning raw pointer to the unique_ptr to a raw object.
+   * Needed to update object data in the same while loop.
+   * TODO ankitm Try to move the rest of the data parsing code in a conditional depending on a
+   * valid "o" object. */
   std::unique_ptr<OBJRawObject> *curr_ob;
   while (std::getline(infile_, line)) {
     std::stringstream s_line(line);
@@ -98,4 +102,4 @@ void OBJImporter::parse_and_store(Vector<std::unique_ptr<OBJRawObject>> &list_of
     }
   }
 }
-}
+}  // namespace blender::io::obj
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.hh
index 4d37385d25f..8fe4e076818 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.hh
@@ -39,7 +39,7 @@ public:
 
   void parse_and_store(Vector<std::unique_ptr<OBJRawObject>> &list_of_objects);
   void print_obj_data(Vector<std::unique_ptr<OBJRawObject>> &list_of_objects);
-  void make_objects(Main *bmain,
+  void raw_to_blender_objects(Main *bmain,
                     Scene *scene,
                     Vector<std::unique_ptr<OBJRawObject>> &list_of_objects);
 };
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.cc
index 42d28cbea5b..e4dbada7d4b 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.cc
@@ -30,7 +30,7 @@
 
 namespace blender::io::obj {
 
-OBJBmeshFromRaw::OBJBmeshFromRaw(const OBJRawObject &curr_object)
+OBJMeshFromRaw::BMesh_::BMesh_(const class OBJRawObject &curr_object)
 {
   auto creator_mesh = [&]() {
     return BKE_mesh_new_nomain(0,
@@ -54,20 +54,21 @@ OBJBmeshFromRaw::OBJBmeshFromRaw(const OBJRawObject &curr_object)
   BM_mesh_bm_from_me(bm_new_.get(), template_mesh.get(), &bm_convert_params);
 };
 
-BMVert *OBJBmeshFromRaw::add_bmvert(float3 coords)
+BMVert *OBJMeshFromRaw::BMesh_::add_bmvert(float3 coords)
 {
   return BM_vert_create(bm_new_.get(), coords, nullptr, BM_CREATE_SKIP_CD);
 }
 
-void OBJBmeshFromRaw::add_polygon_from_verts(BMVert **verts_of_face, uint tot_verts_per_poly)
+void OBJMeshFromRaw::BMesh_::add_polygon_from_verts(BMVert **verts_of_face,
+                                                    uint tot_verts_per_poly)
 {
   BM_face_create_ngon_verts(
       bm_new_.get(), verts_of_face, tot_verts_per_poly, nullptr, BM_CREATE_SKIP_CD, false, true);
 }
 
-unique_mesh_ptr mesh_from_raw_obj(Main *bmain, const OBJRawObject &curr_object)
+OBJMeshFromRaw::OBJMeshFromRaw(const class OBJRawObject &curr_object)
 {
-  OBJBmeshFromRaw bm_from_raw{curr_object};
+  BMesh_ bm_from_raw{curr_object};
 
   Array<BMVert *> all_vertices{curr_object.vertices.size()};
   for (int i = 0; i < curr_object.vertices.size(); i++) {
@@ -83,9 +84,8 @@ unique_mesh_ptr mesh_from_raw_obj(Main *bmain, const OBJRawObject &curr_object)
     bm_from_raw.add_polygon_from_verts(&verts_of_face[0], curr_face.size());
   }
 
-  unique_mesh_ptr bm_to_me{(Mesh *)BKE_id_new_nomain(ID_ME, nullptr)};
-  BM_mesh_bm_to_me_for_eval(bm_from_raw.bm_getter(), bm_to_me.get(), nullptr);
-  BKE_mesh_validate(bm_to_me.get(), false, true);
-  return bm_to_me;
+  mesh_from_bm_.reset((Mesh *)BKE_id_new_nomain(ID_ME, nullptr));
+  BM_mesh_bm_to_me_for_eval(bm_from_raw.getter(), mesh_from_bm_.get(), nullptr);
+  BKE_mesh_validate(mesh_from_bm_.get(), false, true);
 }
 }  // namespace blender::io::obj
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.hh
index 47fb1a8625b..695d4dc0335 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.hh
@@ -51,21 +51,32 @@ struct UniqueBMeshDeleter {
 using unique_mesh_ptr = std::unique_ptr<Mesh, UniqueMeshDeleter>;
 using unique_bmesh_ptr = std::unique_ptr<BMesh, UniqueBMeshDeleter>;
 
-unique_mesh_ptr mesh_from_raw_obj(Main *bmain, const class OBJRawObject &curr_object);
+class OBJMeshFromRaw : NonMovable, NonCopyable {
+ private:
+  unique_mesh_ptr mesh_from_bm_;
 
-class OBJBmeshFromRaw : NonMovable, NonCopyable {
  public:
-  OBJBmeshFromRaw(const class OBJRawObject &curr_object);
-  BMesh *bm_getter()
+  OBJMeshFromRaw(const class OBJRawObject &curr_object);
+  unique_mesh_ptr mover()
   {
-    return bm_new_.get();
+    return std::move(mesh_from_bm_);
   }
 
-  BMVert *add_bmvert(float3 coords);
-  void add_polygon_from_verts(BMVert **verts_of_face, uint tot_verts_per_poly);
-
  private:
-  unique_bmesh_ptr bm_new_;
+  struct BMesh_ {
+   private:
+    unique_bmesh_ptr bm_new_;
+
+   public:
+    BMesh_(const class OBJRawObject &curr_object);
+
+    BMesh *getter()
+    {
+      return bm_new_.get();
+    }
+    BMVert *add_bmvert(float3 coords);
+    void add_polygon_from_verts(BMVert **verts_of_face, uint tot_verts_per_poly);
+  };
 };
 
 }  // namespace blender::io::obj
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.cc
index a7fb0a5f690..56ebfcfcbd0 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.cc
@@ -42,11 +42,11 @@ OBJParentCollection::OBJParentCollection(Main *bmain, Scene *scene) : bmain_(bma
       bmain_, scene_->master_collection, "OBJ import collection");
 }
 
-void OBJParentCollection::add_object_to_parent(const OBJRawObject &ob_to_add, unique_mesh_ptr mesh)
+void OBJParentCollection::add_object_to_parent(StringRef ob_to_add_name, unique_mesh_ptr mesh)
 {
   std::unique_ptr<Object> b_object{
-      BKE_object_add_only_object(bmain_, OB_MESH, ob_to_add.object_name.c_str())};
-  b_object->data = BKE_object_obdata_add_from_type(bmain_, OB_MESH, ob_to_add.object_name.c_str());
+      BKE_object_add_only_object(bmain_, OB_MESH, ob_to_add_name.data())};
+  b_object->data = BKE_object_obdata_add_from_type(bmain_, OB_MESH, ob_to_add_name.data());
 
   BKE_mesh_nomain_to_mesh(
       mesh.release(), (Mesh *)b_object->data, b_object.get(), &CD_MASK_EVERYTHING, true);
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.hh
index c86a369526f..6cd4702909c 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.hh
@@ -53,14 +53,15 @@ class OBJRawObject {
 };
 
 class OBJParentCollection {
- public:
-  OBJParentCollection(Main *bmain, Scene *scene);
-  void add_object_to_parent(const OBJRawObject &ob_to_add, unique_mesh_ptr mesh);
-
  private:
   Main *bmain_;
   Scene *scene_;
   Collection *parent_collection_;
+
+ public:
+  OBJParentCollection(Main *bmain, Scene *scene);
+
+  void add_object_to_parent(StringRef ob_to_add_name, unique_mesh_ptr mesh);
 };
 }  // namespace blender::io::obj
 
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc
index 3d6452399fc..51d3ef88a57 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc
@@ -63,15 +63,14 @@ void OBJImporter::print_obj_data(Vector<std::unique_ptr<OBJRawObject>> &list_of_
   }
 }
 
-void OBJImporter::make_objects(Main *bmain,
+void OBJImporter::raw_to_blender_objects(Main *bmain,
                                Scene *scene,
                                Vector<std::unique_ptr<OBJRawObject>> &list_of_objects)
 {
   OBJParentCollection parent{bmain, scene};
   for (std::unique_ptr<OBJRawObject> &curr_object : list_of_objects) {
-    unique_mesh_ptr mesh{mesh_from_raw_obj(bmain, *curr_object)};
-
-    parent.add_object_to_parent(*curr_object, std::move(mesh));
+    OBJMeshFromRaw mesh_from_raw{*curr_object};
+    parent.add_object_to_parent(curr_object->object_name, mesh_from_raw.mover());
   }
 }
 
@@ -84,6 +83,6 @@ void importer_main(bContext *C, const OBJImportParams &import_params)
 
   importer.parse_and_store(list_of_objects);
   //  importer.print_obj_data(list_of_objects);
-  importer.make_objects(bmain, scene, list_of_objects);
+  importer.raw_to_blender_objects(bmain, scene, list_of_objects);
 }
 }  // namespace blender::io::obj



More information about the Bf-blender-cvs mailing list