[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