[Bf-blender-cvs] [9df5b84b1b3] soc-2020-io-performance: Cleanup: exporter: use range-based for loops.

Ankit Meel noreply at git.blender.org
Wed Nov 11 15:37:26 CET 2020


Commit: 9df5b84b1b3ba5d170dc7d31c3d2a2b59cf70787
Author: Ankit Meel
Date:   Sun Nov 8 18:39:40 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rB9df5b84b1b3ba5d170dc7d31c3d2a2b59cf70787

Cleanup: exporter: use range-based for loops.

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

M	source/blender/io/wavefront_obj/exporter/obj_export_file_writer.cc
M	source/blender/io/wavefront_obj/exporter/obj_exporter.cc
M	source/blender/io/wavefront_obj/exporter/obj_exporter.hh

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

diff --git a/source/blender/io/wavefront_obj/exporter/obj_export_file_writer.cc b/source/blender/io/wavefront_obj/exporter/obj_export_file_writer.cc
index b2700634319..72b1d502e86 100644
--- a/source/blender/io/wavefront_obj/exporter/obj_export_file_writer.cc
+++ b/source/blender/io/wavefront_obj/exporter/obj_export_file_writer.cc
@@ -116,8 +116,8 @@ void OBJWriter::write_vert_indices(Span<int> vert_indices,
                                    Span<int> /*normal_indices*/) const
 {
   fputs("f", outfile_);
-  for (int j = 0; j < vert_indices.size(); j++) {
-    fprintf(outfile_, " %u", vert_indices[j] + index_offsets_.vertex_offset + 1);
+  for (const int vert_index : vert_indices) {
+    fprintf(outfile_, " %u", vert_index + index_offsets_.vertex_offset + 1);
   }
   fputs("\n", outfile_);
 }
diff --git a/source/blender/io/wavefront_obj/exporter/obj_exporter.cc b/source/blender/io/wavefront_obj/exporter/obj_exporter.cc
index 6d66309516b..f122c0f6911 100644
--- a/source/blender/io/wavefront_obj/exporter/obj_exporter.cc
+++ b/source/blender/io/wavefront_obj/exporter/obj_exporter.cc
@@ -23,6 +23,8 @@
 
 #include <stdio.h>
 
+#include <memory>
+
 #include "BKE_scene.h"
 
 #include "BLI_path_util.h"
@@ -140,42 +142,42 @@ find_exportable_objects(Depsgraph *depsgraph, const OBJExportParams &export_para
 }
 
 static void write_mesh_objects(Vector<std::unique_ptr<OBJMesh>> exportable_as_mesh,
-                               OBJWriter &frame_writer,
+                               OBJWriter &obj_writer,
                                const OBJExportParams &export_params)
 {
   std::unique_ptr<MTLWriter> mtl_writer = nullptr;
   if (export_params.export_materials) {
     mtl_writer.reset(new MTLWriter(export_params.filepath));
     if (mtl_writer->good()) {
-      frame_writer.write_mtllib_name(mtl_writer->mtl_file_path());
+      obj_writer.write_mtllib_name(mtl_writer->mtl_file_path());
     }
   }
 
-  for (int i = 0; i < exportable_as_mesh.size(); i++) {
-    /* Smooth groups and UV vertex indices can take massive memory, so they should be freed
-     * right after they're written, instead of waiting for #blender::Vector to clean them up. */
-    const std::unique_ptr<OBJMesh> mesh_to_export = std::move(exportable_as_mesh[i]);
-    frame_writer.write_object_name(*mesh_to_export);
-    frame_writer.write_vertex_coords(*mesh_to_export);
+  /* Smooth groups and UV vertex indices may make huge memory allocations, so they should be freed
+   * right after they're written, instead of waiting for #blender::Vector to clean them up after
+   * all the objects are exported. */
+  for (Steal<OBJMesh> obj_mesh : exportable_as_mesh) {
+    obj_writer.write_object_name(*obj_mesh);
+    obj_writer.write_vertex_coords(*obj_mesh);
 
-    if (mesh_to_export->tot_polygons() > 0) {
+    if (obj_mesh->tot_polygons() > 0) {
       if (export_params.export_smooth_groups) {
-        mesh_to_export->calc_smooth_groups(export_params.smooth_groups_bitflags);
+        obj_mesh->calc_smooth_groups(export_params.smooth_groups_bitflags);
       }
       if (export_params.export_normals) {
-        frame_writer.write_poly_normals(*mesh_to_export);
+        obj_writer.write_poly_normals(*obj_mesh);
       }
       if (export_params.export_uv) {
-        frame_writer.write_uv_coords(*mesh_to_export);
+        obj_writer.write_uv_coords(*obj_mesh);
       }
       if (mtl_writer->good()) {
-        mtl_writer->append_materials(*mesh_to_export);
+        mtl_writer->append_materials(*obj_mesh);
       }
-      frame_writer.write_poly_elements(*mesh_to_export);
+      obj_writer.write_poly_elements(*obj_mesh);
     }
-    frame_writer.write_edges_indices(*mesh_to_export);
+    obj_writer.write_edges_indices(*obj_mesh);
 
-    frame_writer.update_index_offsets(*mesh_to_export);
+    obj_writer.update_index_offsets(*obj_mesh);
   }
 }
 
@@ -183,12 +185,12 @@ static void write_mesh_objects(Vector<std::unique_ptr<OBJMesh>> exportable_as_me
  * Export NURBS Curves in parameter form, not as vertices and edges.
  */
 static void write_nurbs_curve_objects(const Vector<std::unique_ptr<OBJCurve>> &exportable_as_nurbs,
-                                      const OBJWriter &frame_writer)
+                                      const OBJWriter &obj_writer)
 {
-  for (const std::unique_ptr<OBJCurve> &nurbs_to_export : exportable_as_nurbs) {
-    /* #OBJCurve don't have any dynamically allocated memory, so it's fine
-     * to wait for #blender::Vector to clean the objects up. */
-    frame_writer.write_nurbs_curve(*nurbs_to_export);
+  /* #OBJCurve doesn't have any dynamically allocated memory, so it's fine
+   * to wait for #blender::Vector to clean the objects up. */
+  for (const std::unique_ptr<OBJCurve> &obj_curve : exportable_as_nurbs) {
+    obj_writer.write_nurbs_curve(*obj_curve);
   }
 }
 
diff --git a/source/blender/io/wavefront_obj/exporter/obj_exporter.hh b/source/blender/io/wavefront_obj/exporter/obj_exporter.hh
index 72b9caa8f0d..b1bcfdf3b69 100644
--- a/source/blender/io/wavefront_obj/exporter/obj_exporter.hh
+++ b/source/blender/io/wavefront_obj/exporter/obj_exporter.hh
@@ -28,6 +28,25 @@
 #include "IO_wavefront_obj.h"
 
 namespace blender::io::obj {
+
+/**
+ * Steal elements' ownership in a range-based for-loop.
+ */
+template<typename T> struct Steal {
+  std::unique_ptr<T> owning;
+  Steal(std::unique_ptr<T> &owning) : owning(std::move(owning))
+  {
+  }
+  T *operator->()
+  {
+    return owning.operator->();
+  }
+  T &operator*()
+  {
+    return owning.operator*();
+  }
+};
+
 /**
  * Behaves like `std::unique_ptr<Depsgraph, custom_deleter>`.
  * Needed to free a new Depsgraph created for #DAG_EVAL_RENDER.



More information about the Bf-blender-cvs mailing list