[Bf-blender-cvs] [4777a6a54aa] soc-2020-io-performance: Move object creation code from constructor.

Ankit Meel noreply at git.blender.org
Fri Aug 21 21:15:59 CEST 2020


Commit: 4777a6a54aab39eb6230e22fcb2cdb51e3ed33ae
Author: Ankit Meel
Date:   Fri Aug 21 23:06:55 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rB4777a6a54aab39eb6230e22fcb2cdb51e3ed33ae

Move object creation code from constructor.

Also add destructors with assert in case caller doesn't
own the object.

Rename `blender_object_` to `mesh_object_` to be like
`curve_object_`.

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

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_nurbs.cc
M	source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.hh
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_mesh.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.cc
index b5a08241a79..ebc788c258e 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
@@ -46,15 +46,16 @@
 #include "wavefront_obj_im_mesh.hh"
 
 namespace blender::io::obj {
-/**
- * Make a Blender Mesh Object from a Geometry of GEOM_MESH type.
- * Use the mover function to own the mesh.
- */
-MeshFromGeometry::MeshFromGeometry(Main *bmain,
-                                   const Geometry &mesh_geometry,
-                                   const GlobalVertices &global_vertices,
-                                   const Map<std::string, MTLMaterial> &materials)
-    : mesh_geometry_(mesh_geometry), global_vertices_(global_vertices)
+
+MeshFromGeometry::~MeshFromGeometry()
+{
+  if (mesh_object_) {
+    /* Move the object to own it. */
+    BLI_assert(0);
+  }
+}
+
+void MeshFromGeometry::create_mesh(Main *bmain, const Map<std::string, MTLMaterial> &materials)
 {
   std::string ob_name{mesh_geometry_.get_geometry_name()};
   if (ob_name.empty()) {
@@ -72,8 +73,8 @@ MeshFromGeometry::MeshFromGeometry(Main *bmain,
 
   blender_mesh_.reset(
       BKE_mesh_new_nomain(tot_verts_object, tot_edges, 0, tot_loops, tot_face_elems));
-  blender_object_.reset(BKE_object_add_only_object(bmain, OB_MESH, ob_name.c_str()));
-  blender_object_->data = BKE_object_obdata_add_from_type(bmain, OB_MESH, ob_name.c_str());
+  mesh_object_.reset(BKE_object_add_only_object(bmain, OB_MESH, ob_name.c_str()));
+  mesh_object_->data = BKE_object_obdata_add_from_type(bmain, OB_MESH, ob_name.c_str());
 
   create_vertices();
   new_faces.extend(mesh_geometry_.face_elements());
@@ -95,8 +96,8 @@ MeshFromGeometry::MeshFromGeometry(Main *bmain,
   dissolve_edges(fgon_edges);
 
   BKE_mesh_nomain_to_mesh(blender_mesh_.release(),
-                          static_cast<Mesh *>(blender_object_->data),
-                          blender_object_.get(),
+                          static_cast<Mesh *>(mesh_object_->data),
+                          mesh_object_.get(),
                           &CD_MASK_EVERYTHING,
                           true);
 }
@@ -293,7 +294,7 @@ void MeshFromGeometry::create_polys_loops(Span<FaceElement> all_faces)
   /* Add deform group(s) to the object's defbase. */
   for (StringRef name : group_names) {
     /* Adding groups in this order assumes that def_nr is an index into the names' list. */
-    BKE_object_defgroup_add_name(blender_object_.get(), name.data());
+    BKE_object_defgroup_add_name(mesh_object_.get(), name.data());
   }
 }
 
@@ -356,10 +357,10 @@ void MeshFromGeometry::create_materials(Main *bmain,
       continue;
     }
     const MTLMaterial &curr_mat = materials.lookup_as(material_name);
-    BKE_object_material_slot_add(bmain, blender_object_.get());
+    BKE_object_material_slot_add(bmain, mesh_object_.get());
     Material *mat = BKE_material_add(bmain, material_name.data());
     BKE_object_material_assign(
-        bmain, blender_object_.get(), mat, blender_object_.get()->totcol, BKE_MAT_ASSIGN_USERPREF);
+        bmain, mesh_object_.get(), mat, mesh_object_.get()->totcol, BKE_MAT_ASSIGN_USERPREF);
 
     ShaderNodetreeWrap mat_wrap{bmain, curr_mat};
     mat->use_nodes = true;
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 37437ba4b72..036f2e489d3 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
@@ -46,6 +46,10 @@ struct UniqueMeshDeleter {
  */
 using unique_mesh_ptr = std::unique_ptr<Mesh, UniqueMeshDeleter>;
 
+/**
+ * Make a Blender Mesh Object from a Geometry of GEOM_MESH type.
+ * Use the mover function to own the mesh after creation.
+ */
 class MeshFromGeometry : NonMovable, NonCopyable {
  private:
   /**
@@ -55,19 +59,21 @@ class MeshFromGeometry : NonMovable, NonCopyable {
   /**
    * An Object of type OB_MESH. Use the mover function to own it.
    */
-  unique_object_ptr blender_object_{nullptr};
+  unique_object_ptr mesh_object_{nullptr};
   const Geometry &mesh_geometry_;
   const GlobalVertices &global_vertices_;
 
  public:
-  MeshFromGeometry(Main *bmain,
-                   const Geometry &mesh_geometry,
-                   const GlobalVertices &global_vertices,
-                   const Map<std::string, MTLMaterial> &materials);
+  MeshFromGeometry(const Geometry &mesh_geometry, const GlobalVertices &global_vertices)
+      : mesh_geometry_(mesh_geometry), global_vertices_(global_vertices)
+  {
+  }
 
+  ~MeshFromGeometry();
+  void create_mesh(Main *bmain, const Map<std::string, MTLMaterial> &materials);
   unique_object_ptr mover()
   {
-    return std::move(blender_object_);
+    return std::move(mesh_object_);
   }
 
  private:
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.cc
index fa38d232e4e..4e4f370822e 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.cc
@@ -29,6 +29,39 @@
 #include "wavefront_obj_im_objects.hh"
 
 namespace blender::io::obj {
+
+CurveFromGeometry::~CurveFromGeometry()
+{
+  if (curve_object_) {
+    /* Move the object to own it. */
+    BLI_assert(0);
+  }
+}
+
+void CurveFromGeometry::create_curve(Main *bmain)
+{
+  std::string ob_name{curve_geometry_.get_geometry_name()};
+  if (ob_name.empty() && !curve_geometry_.group().empty()) {
+    ob_name = curve_geometry_.group();
+  }
+  else {
+    ob_name = "Untitled";
+  }
+
+  blender_curve_.reset(BKE_curve_add(bmain, ob_name.c_str(), OB_CURVE));
+  curve_object_.reset(BKE_object_add_only_object(bmain, OB_CURVE, ob_name.c_str()));
+
+  blender_curve_->flag = CU_3D;
+  blender_curve_->resolu = blender_curve_->resolv = 12;
+  /* Only one NURBS spline will be created in the curve object. */
+  blender_curve_->actnu = 0;
+
+  Nurb *nurb = static_cast<Nurb *>(MEM_callocN(sizeof(Nurb), "OBJ import NURBS curve"));
+  BLI_addtail(BKE_curve_nurbs_get(blender_curve_.get()), nurb);
+  create_nurbs();
+
+  curve_object_->data = blender_curve_.release();
+}
 /**
  * Create a NURBS spline for the Curve converted from Geometry.
  */
@@ -81,35 +114,4 @@ void CurveFromGeometry::create_nurbs()
   }
 }
 
-/**
- * Make a Blender NURBS Curve block from a Geometry of GEOM_CURVE type.
- * Use the mover function to own the curve.
- */
-CurveFromGeometry::CurveFromGeometry(Main *bmain,
-                                     const Geometry &geometry,
-                                     const GlobalVertices &global_vertices)
-    : curve_geometry_(geometry), global_vertices_(global_vertices)
-{
-  std::string ob_name{curve_geometry_.get_geometry_name()};
-  if (ob_name.empty() && !curve_geometry_.group().empty()) {
-    ob_name = curve_geometry_.group();
-  }
-  else {
-    ob_name = "Untitled";
-  }
-
-  blender_curve_.reset(BKE_curve_add(bmain, ob_name.c_str(), OB_CURVE));
-  curve_object_.reset(BKE_object_add_only_object(bmain, OB_CURVE, ob_name.c_str()));
-
-  blender_curve_->flag = CU_3D;
-  blender_curve_->resolu = blender_curve_->resolv = 12;
-  /* Only one NURBS spline will be created in the curve object. */
-  blender_curve_->actnu = 0;
-
-  Nurb *nurb = static_cast<Nurb *>(MEM_callocN(sizeof(Nurb), "OBJ import NURBS curve"));
-  BLI_addtail(BKE_curve_nurbs_get(blender_curve_.get()), nurb);
-  create_nurbs();
-
-  curve_object_->data = blender_curve_.release();
-}
 }  // namespace blender::io::obj
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.hh
index 592b4f4fb61..7e84d575261 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.hh
@@ -50,6 +50,10 @@ struct UniqueCurveDeleter {
  */
 using unique_curve_ptr = std::unique_ptr<Curve, UniqueCurveDeleter>;
 
+/**
+ * Make a Blender NURBS Curve block from a Geometry of GEOM_CURVE type.
+ * Use the mover function to own the curve.
+ */
 class CurveFromGeometry : NonMovable, NonCopyable {
  private:
   /**
@@ -64,10 +68,13 @@ class CurveFromGeometry : NonMovable, NonCopyable {
   const GlobalVertices &global_vertices_;
 
  public:
-  CurveFromGeometry(Main *bmain,
-                    const Geometry &curve_geometry,
-                    const GlobalVertices &global_vertices);
+  CurveFromGeometry(const Geometry &geometry, const GlobalVertices &global_vertices)
+      : curve_geometry_(geometry), global_vertices_(global_vertices)
+  {
+  }
+  ~CurveFromGeometry();
 
+  void create_curve(Main *bmain);
   unique_object_ptr mover()
   {
     return std::move(curve_object_);
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 ad1170a3c23..18b6776f35f 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
@@ -58,7 +58,8 @@ struct VertexIndexOffset {
   int offset_ = 0;
 
  public:
-  void set_index_offset(const int64_t total_vertices){
+  void set_index_offset(const int64_t total_vertices)
+  {
     offset_ = total_vertices;
   }
   int64_t get_index_offset() const
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 6bf733db995..80b658e59c9 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc
@@ -95,11 +95,13 @@ static void geometry_to_blender_objects(Main *bmain,
   OBJImportCollection import_collection{bmain, scene};
   for (const std::unique_ptr<Geometry> &geometry : all_geometries) {
     if (geometry->get_geom_type() == GEOM_MESH) {
-      MeshFromGeometry mesh_ob_from_geometry{bmain, *geometry, global_vertices, materials};
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list