[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