[Bf-blender-cvs] [fc585225984] soc-2020-io-performance: Use custom creators and deleters for Mesh and BMesh

Ankit Meel noreply at git.blender.org
Sun Jul 12 15:41:05 CEST 2020


Commit: fc585225984f51d2412c5a162933767bdfbeca14
Author: Ankit Meel
Date:   Sun Jul 12 18:54:06 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rBfc585225984f51d2412c5a162933767bdfbeca14

Use custom creators and deleters for Mesh and BMesh

Avoid freeing meshes allocated by Guarded allocated by unique_ptr

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

M	source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc
M	source/blender/io/wavefront_obj/intern/wavefront_obj_importer.hh

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

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 82358bdddbc..7af54175912 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc
@@ -136,29 +136,25 @@ void OBJImporter::print_obj_data(Vector<std::unique_ptr<OBJRawObject>> &list_of_
 
 OBJBmeshFromRaw::OBJBmeshFromRaw(const OBJRawObject &curr_object)
 {
-  template_mesh_ = std::unique_ptr<Mesh>(
-      BKE_mesh_new_nomain(0, 0, 0, curr_object.tot_loop, curr_object.face_elements.size()));
-
+  auto creator_mesh = [&]() {
+    return BKE_mesh_new_nomain(0, 0, 0, curr_object.tot_loop, curr_object.face_elements.size());
+  };
+  auto deleter_mesh = [](Mesh *mesh_to_delete) { BKE_id_free(NULL, mesh_to_delete); };
+  std::unique_ptr<Mesh, decltype(deleter_mesh)> template_mesh(creator_mesh(), deleter_mesh);
+
+  auto creator_bmesh = [&]() {
+    BMAllocTemplate bat = {0,
+                           0,
+                           static_cast<int>(curr_object.tot_loop),
+                           static_cast<int>(curr_object.face_elements.size())};
+    BMeshCreateParams bcp = {1};
+    return BM_mesh_create(&bat, &bcp);
+  };
+  bm_new_.reset(creator_bmesh());
   struct BMeshFromMeshParams bm_convert_params = {true, 0, 0, 0};
-  BMAllocTemplate bat = {0,
-                         0,
-                         static_cast<int>(curr_object.tot_loop),
-                         static_cast<int>(curr_object.face_elements.size())};
-  BMeshCreateParams bcp = {1};
-  bm_new_ = std::unique_ptr<BMesh>(BM_mesh_create(&bat, &bcp));
-  BM_mesh_bm_from_me(bm_new_.get(), template_mesh_.get(), &bm_convert_params);
+  BM_mesh_bm_from_me(bm_new_.get(), template_mesh.get(), &bm_convert_params);
 };
 
-OBJBmeshFromRaw::~OBJBmeshFromRaw()
-{
-  if (bm_new_.get()) {
-    BM_mesh_free(bm_new_.release());
-  }
-  if (template_mesh_.get()) {
-    BKE_id_free(NULL, template_mesh_.release());
-  }
-}
-
 BMVert *OBJBmeshFromRaw::add_bmvert(float3 coords)
 {
   return BM_vert_create(bm_new_.get(), coords, NULL, BM_CREATE_SKIP_CD);
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.hh
index 89d5c39896b..fae75e8c510 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.hh
@@ -75,7 +75,6 @@ class OBJParentCollection {
 class OBJBmeshFromRaw : NonMovable, NonCopyable {
  public:
   OBJBmeshFromRaw(const OBJRawObject &curr_object);
-  ~OBJBmeshFromRaw();
   BMesh *getter_bmesh()
   {
     return bm_new_.get();
@@ -85,8 +84,14 @@ class OBJBmeshFromRaw : NonMovable, NonCopyable {
   void add_polygon_from_verts(BMVert **verts_of_face, uint tot_verts_per_poly);
 
  private:
-  std::unique_ptr<Mesh> template_mesh_;
-  std::unique_ptr<BMesh> bm_new_;
+  struct deleter_bmesh {
+    void operator()(BMesh *t)
+    {
+      BM_mesh_free(t);
+    }
+  };
+
+  std::unique_ptr<BMesh, deleter_bmesh()> bm_new_;
 };
 
 class OBJImporter {



More information about the Bf-blender-cvs mailing list