[Bf-blender-cvs] [ec04edfe5c3] soc-2020-io-performance: Directly create Mesh without using intermediate BMesh
Ankit Meel
noreply at git.blender.org
Tue Jul 14 15:53:58 CEST 2020
Commit: ec04edfe5c357649f2510c79261517d02a83d0a2
Author: Ankit Meel
Date: Tue Jul 14 19:23:54 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rBec04edfe5c357649f2510c79261517d02a83d0a2
Directly create Mesh without using intermediate BMesh
===================================================================
M source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.cc
M source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.hh
===================================================================
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 e4dbada7d4b..1221fc2d0a4 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
@@ -23,69 +23,36 @@
#include "BLI_array.hh"
+#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "wavefront_obj_im_mesh.hh"
#include "wavefront_obj_im_objects.hh"
namespace blender::io::obj {
-
-OBJMeshFromRaw::BMesh_::BMesh_(const class OBJRawObject &curr_object)
-{
- auto creator_mesh = [&]() {
- return BKE_mesh_new_nomain(0,
- 0,
- 0,
- static_cast<int>(curr_object.tot_loop),
- static_cast<int>(curr_object.face_elements.size()));
- };
- 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());
- unique_mesh_ptr template_mesh{creator_mesh()};
- BMeshFromMeshParams bm_convert_params{true, 0, 0, 0};
- BM_mesh_bm_from_me(bm_new_.get(), template_mesh.get(), &bm_convert_params);
-};
-
-BMVert *OBJMeshFromRaw::BMesh_::add_bmvert(float3 coords)
-{
- return BM_vert_create(bm_new_.get(), coords, nullptr, BM_CREATE_SKIP_CD);
-}
-
-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);
-}
-
OBJMeshFromRaw::OBJMeshFromRaw(const class OBJRawObject &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++) {
- all_vertices[i] = bm_from_raw.add_bmvert(curr_object.vertices[i].co);
+ uint tot_verts_object = curr_object.vertices.size();
+ mesh_from_bm_.reset(BKE_mesh_new_nomain(
+ tot_verts_object, 0, 0, curr_object.tot_loop, curr_object.face_elements.size()));
+ for (int i = 0; i < tot_verts_object; ++i) {
+ copy_v3_v3(mesh_from_bm_->mvert[i].co, curr_object.vertices[i].co);
}
- for (const Vector<OBJFaceCorner> &curr_face : curr_object.face_elements) {
- /* Collect vertices of one face from a pool of BMesh vertices. */
- Array<BMVert *> verts_of_face{curr_face.size()};
- for (int i = 0; i < curr_face.size(); i++) {
- verts_of_face[i] = all_vertices[curr_face[i].vert_index];
+ int curr_loop_idx = 0;
+ for (int i = 0; i < curr_object.face_elements.size(); ++i) {
+ const Vector<OBJFaceCorner> &curr_face = curr_object.face_elements[i];
+ MPoly &mpoly = mesh_from_bm_->mpoly[i];
+ mpoly.totloop = curr_face.size();
+ mpoly.loopstart = curr_loop_idx;
+
+ for (int j = 0; j < curr_face.size(); ++j) {
+ MLoop *mloop = &mesh_from_bm_->mloop[curr_loop_idx];
+ mloop->v = curr_face[j].vert_index;
+ curr_loop_idx++;
}
- bm_from_raw.add_polygon_from_verts(&verts_of_face[0], curr_face.size());
}
-
- 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_calc_edges(mesh_from_bm_.get(), false, false);
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 695d4dc0335..81347b7fe31 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
@@ -57,26 +57,11 @@ class OBJMeshFromRaw : NonMovable, NonCopyable {
public:
OBJMeshFromRaw(const class OBJRawObject &curr_object);
+
unique_mesh_ptr mover()
{
return std::move(mesh_from_bm_);
}
-
- private:
- 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
More information about the Bf-blender-cvs
mailing list