[Bf-blender-cvs] [9279377f4b2] soc-2020-io-performance: Use unique_ptr to avoid early destruction of new meshes.

Ankit Meel noreply at git.blender.org
Tue Jun 30 13:20:12 CEST 2020


Commit: 9279377f4b29ab75b2fa50c9d5e3e721b429d6f5
Author: Ankit Meel
Date:   Tue Jun 30 16:03:15 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rB9279377f4b29ab75b2fa50c9d5e3e721b429d6f5

Use unique_ptr to avoid early destruction of new meshes.

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

M	source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
M	source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.hh
M	source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_nurbs.hh

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

diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
index 3cf3ef9e0ed..bedcdf61bd1 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
@@ -49,8 +49,8 @@ namespace obj {
  */
 static void export_frame(bContext *C, const OBJExportParams *export_params, const char *filepath)
 {
-  Vector<OBJMesh> exportable_meshes;
-  Vector<OBJNurbs> exportable_nurbs;
+  Vector<std::unique_ptr<OBJMesh>> exportable_meshes;
+  Vector<std::unique_ptr<OBJNurbs>> exportable_nurbs;
   ViewLayer *view_layer = CTX_data_view_layer(C);
   LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
     Object *object_in_layer = base->object;
@@ -60,7 +60,8 @@ static void export_frame(bContext *C, const OBJExportParams *export_params, cons
     switch (object_in_layer->type) {
       case OB_SURF:
       case OB_MESH: {
-        exportable_meshes.append(OBJMesh(C, export_params, object_in_layer));
+        OBJMesh *objmesh = new OBJMesh(C, export_params, object_in_layer);
+        exportable_meshes.append(std::unique_ptr<OBJMesh>(objmesh));
         break;
       }
       case OB_CURVE: {
@@ -68,14 +69,17 @@ static void export_frame(bContext *C, const OBJExportParams *export_params, cons
         Nurb *nurb = (Nurb *)curve->nurb.first;
         if (nurb->type == CU_NURBS) {
           if (export_params->export_curves_as_nurbs) {
-            exportable_nurbs.append(OBJNurbs(C, object_in_layer));
+            OBJNurbs *objnurb = new OBJNurbs(C, object_in_layer);
+            exportable_nurbs.append(std::unique_ptr<OBJNurbs>(objnurb));
           }
           else {
-            exportable_meshes.append(OBJMesh(C, export_params, object_in_layer));
+            OBJMesh *objmesh = new OBJMesh(C, export_params, object_in_layer);
+            exportable_meshes.append(std::unique_ptr<OBJMesh>(objmesh));
           }
         }
         if (nurb->type == CU_BEZIER) {
-          exportable_meshes.append(OBJMesh(C, export_params, object_in_layer));
+          OBJMesh *objmesh = new OBJMesh(C, export_params, object_in_layer);
+          exportable_meshes.append(std::unique_ptr<OBJMesh>(objmesh));
         }
         /* Other types of curves are not supported.  */
         break;
@@ -96,36 +100,34 @@ static void export_frame(bContext *C, const OBJExportParams *export_params, cons
      * OBJ. */
     frame_writer.write_mtllib(filepath);
   }
-  for (uint ob_iter = 0; ob_iter < exportable_meshes.size(); ob_iter++) {
-    OBJMesh &mesh_to_export = exportable_meshes[ob_iter];
+  for (std::unique_ptr<OBJMesh> &mesh_to_export : exportable_meshes) {
 
-    frame_writer.write_object_name(mesh_to_export);
-    frame_writer.write_vertex_coords(mesh_to_export);
+    frame_writer.write_object_name(*mesh_to_export);
+    frame_writer.write_vertex_coords(*mesh_to_export);
 
     /* For curves converted to mesh and primitive circle. */
-    if (mesh_to_export.tot_poly_normals() == 0) {
-      frame_writer.write_curve_edges(mesh_to_export);
+    if (mesh_to_export->tot_poly_normals() == 0) {
+      frame_writer.write_curve_edges(*mesh_to_export);
     }
     else {
       Vector<Vector<uint>> uv_indices;
       if (export_params->export_normals) {
-        frame_writer.write_poly_normals(mesh_to_export);
+        frame_writer.write_poly_normals(*mesh_to_export);
       }
       if (export_params->export_uv) {
-        frame_writer.write_uv_coords(mesh_to_export, uv_indices);
+        frame_writer.write_uv_coords(*mesh_to_export, uv_indices);
       }
       if (export_params->export_materials) {
         MTLWriter mtl_writer(filepath);
-        mtl_writer.append_materials(mesh_to_export);
+        mtl_writer.append_materials(*mesh_to_export);
       }
-      frame_writer.write_poly_indices(mesh_to_export, uv_indices);
+      frame_writer.write_poly_indices(*mesh_to_export, uv_indices);
     }
-    frame_writer.update_index_offsets(mesh_to_export);
+    frame_writer.update_index_offsets(*mesh_to_export);
   }
   /* Export nurbs in parm form, not as vertices and edges. */
-  for (uint ob_iter = 0; ob_iter < exportable_nurbs.size(); ob_iter++) {
-    OBJNurbs &nurbs_to_export = exportable_nurbs[ob_iter];
-    frame_writer.write_nurbs_curve(nurbs_to_export);
+  for (std::unique_ptr<OBJNurbs> &nurbs_to_export : exportable_nurbs) {
+    frame_writer.write_nurbs_curve(*nurbs_to_export);
   }
 }
 
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.hh
index 811c058889d..48d9c4c96ba 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.hh
@@ -26,6 +26,7 @@
 #include "BKE_material.h"
 #include "BKE_mesh.h"
 
+#include "BLI_utility_mixins.hh"
 #include "BLI_vector.hh"
 
 #include "DNA_mesh_types.h"
@@ -37,7 +38,7 @@
 namespace blender {
 namespace io {
 namespace obj {
-class OBJMesh {
+class OBJMesh : NonMovable, NonCopyable {
  public:
   OBJMesh(bContext *C, const OBJExportParams *export_params, Object *export_object)
       : _C(C), _export_params(export_params), _export_object_eval(export_object)
@@ -48,10 +49,7 @@ class OBJMesh {
   /** Free new meshes we allocate for triangulated meshes, and curves converted to meshes. */
   ~OBJMesh()
   {
-    fprintf(stderr, "Called destructor.\n");
-    /** TODO ankitm remove this debug fprintf. */
     if (_me_eval_needs_free) {
-      fprintf(stderr, "Freed a curve converted to mesh.\n");
       BKE_id_free(NULL, _export_mesh_eval);
     }
   }
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_nurbs.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_nurbs.hh
index c1b5336d4b2..2c1f32a84f1 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_nurbs.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_nurbs.hh
@@ -27,13 +27,15 @@
 #include "BKE_context.h"
 #include "BKE_curve.h"
 
+#include "BLI_utility_mixins.hh"
+
 #include "DNA_curve_types.h"
 
 namespace blender {
 namespace io {
 namespace obj {
 
-class OBJNurbs {
+class OBJNurbs : NonMovable, NonCopyable {
  public:
   OBJNurbs(bContext *C, Object *export_object) : _C(C), _export_object_eval(export_object)
   {



More information about the Bf-blender-cvs mailing list