[Bf-blender-cvs] [083e110c49f] soc-2020-io-performance: Review: Better comments, shorter functions.

Ankit Meel noreply at git.blender.org
Sat Jun 6 14:54:19 CEST 2020


Commit: 083e110c49f02388e57eeaa26c0b1b0ec3e16ddb
Author: Ankit Meel
Date:   Thu Jun 4 21:31:06 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rB083e110c49f02388e57eeaa26c0b1b0ec3e16ddb

Review: Better comments, shorter functions.

Changes here:

- Removed unused ex(im)port_params members.
- Made ex(im)port_params consistent.
- Moved `filepath` to OBJEx(Im)port_Params.
- Edited comments as per comments.
- Use <BLI_vector.hh> instead of <vector>.
- Move functions to namespace IO::OBJ.

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

M	source/blender/editors/io/io_obj.c
M	source/blender/io/wavefront_obj/intern/wavefront_obj.cc
M	source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
M	source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.cc
M	source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc

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

diff --git a/source/blender/editors/io/io_obj.c b/source/blender/editors/io/io_obj.c
index 138b783c498..1989913f9e0 100644
--- a/source/blender/editors/io/io_obj.c
+++ b/source/blender/editors/io/io_obj.c
@@ -78,14 +78,11 @@ static int wm_obj_export_exec(bContext *C, wmOperator *op)
     BKE_report(op->reports, RPT_ERROR, "No filename given");
     return OPERATOR_CANCELLED;
   }
-  struct OBJExportParams a;
-  char filepath[FILE_MAX];
-  RNA_string_get(op->ptr, "filepath", filepath);
-  a.print_name = RNA_boolean_get(op->ptr, "print_name");
-  a.number = RNA_float_get(op->ptr, "print_the_float");
-  a.filepath = filepath;
-  bool ok = OBJ_export(C, &a);
-  return ok ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
+  struct OBJExportParams export_params;
+  RNA_string_get(op->ptr, "filepath", export_params.filepath);
+  OBJ_export(C, &export_params);
+
+  return OPERATOR_FINISHED;
 }
 
 static void ui_obj_export_settings(uiLayout *layout, PointerRNA *imfptr)
@@ -154,14 +151,12 @@ static int wm_obj_import_exec(bContext *C, wmOperator *op)
     BKE_report(op->reports, RPT_ERROR, "No filename given");
     return OPERATOR_CANCELLED;
   }
-  char filepath[FILE_MAX];
-  RNA_string_get(op->ptr, "filepath", filepath);
-  struct OBJImportParams a;
-  a.number = 3.0f;
-  a.print_name = 1;
-  bool ok = OBJ_import(C, filepath, &a);
-
-  return ok ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
+  /* Import functions and structs are incomplete now. Only dummy functions are written. */
+  struct OBJImportParams import_params;
+  RNA_string_get(op->ptr, "filepath", import_params.filepath);
+  OBJ_import(C, &import_params);
+
+  return OPERATOR_FINISHED;
 }
 static void wm_obj_import_draw(bContext *UNUSED(C), wmOperator *UNUSED(op))
 {
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj.cc
index c360b9ca9a8..c291a4d5777 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj.cc
@@ -21,22 +21,22 @@
  * \ingroup obj
  */
 
+#include "IO_wavefront_obj.h"
+
 #include "wavefront_obj.hh"
 #include "wavefront_obj_exporter.hh"
 
-bool OBJ_export(bContext *C, OBJExportParams *export_params)
+/**
+ * Called from io_obj.c. Calls internal functions in IO:OBJ.
+ * When more preferences are there, will be used to set appropriate flags.
+ */
+void OBJ_export(bContext *C, const OBJExportParams *export_params)
 {
-  if (export_params->print_name) {
-    printf("\n OP");
-  }
-  if (export_params->number) {
-    printf("\n%f\n", export_params->number);
-  }
-  exporter_main(C, export_params);
-  return true;
+  IO::OBJ::exporter_main(C, export_params);
 }
-
-bool OBJ_import(bContext *C, const char *filepath, OBJImportParams *import_params)
+/**
+ * Called from io_obj.c. Currently not implemented.
+ */
+void OBJ_import(bContext *C, const OBJImportParams *import_params)
 {
-  return true;
 }
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 5b7d3b71ef9..1485592fd34 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
@@ -21,24 +21,20 @@
  * \ingroup obj
  */
 
-#include "wavefront_obj_exporter.hh"
-#include "wavefront_obj_file_handler.hh"
+#include "MEM_guardedalloc.h"
 
-#include <array>
-#include <fstream>
-#include <iostream>
 #include <stdio.h>
-#include <vector>
 
-#include "BKE_DerivedMesh.h"
 #include "BKE_context.h"
 #include "BKE_mesh.h"
 #include "BKE_mesh_runtime.h"
 #include "BKE_object.h"
 #include "BKE_scene.h"
 
+#include "BLI_iterator.h"
 #include "BLI_linklist.h"
 #include "BLI_math.h"
+#include "BLI_vector.hh"
 
 #include "DEG_depsgraph.h"
 #include "DEG_depsgraph_query.h"
@@ -46,67 +42,102 @@
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
 
-void prepare_vertices(OBJExportParams *export_params, OBJ_data_to_export *data_to_export)
-{
+#include "IO_wavefront_obj.h"
 
-  Depsgraph *depsgraph = export_params->depsgraph;
-  Object *ob = CTX_data_active_object(export_params->C);
-  Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
-  //  Scene *scene = export_params->scene;
-  //  Mesh *me_eval = mesh_create_eval_final_view(depsgraph, scene, ob_eval, &CD_MASK_BAREMESH);
-  //  causing memory leak in lite & assert in full.
-  Mesh *me_eval = BKE_object_get_evaluated_mesh(ob_eval);
+#include "wavefront_obj.hh"
+#include "wavefront_obj_exporter.hh"
+#include "wavefront_obj_file_handler.hh"
+
+namespace IO {
+namespace OBJ {
 
-  int num_verts = data_to_export->tot_vertices = me_eval->totvert;
-  MVert empty_mvert;
+/**
+ * Store the mesh vertex coordinates in data_to_export, in world coordinates.
+ */
+static void get_transformed_mesh_vertices(Mesh *me_eval,
+                                          Object *ob_eval,
+                                          OBJ_data_to_export *data_to_export)
+{
+  uint num_verts = data_to_export->tot_vertices = me_eval->totvert;
   float transformed_co[3];
+  data_to_export->mvert = (MVert *)MEM_callocN(num_verts * sizeof(MVert),
+                                               "OBJ vertex coordinates & normals");
 
-  for (int i = 0; i < num_verts; i++) {
-    data_to_export->vertices.push_back(empty_mvert);
+  for (uint i = 0; i < num_verts; i++) {
     copy_v3_v3(transformed_co, me_eval->mvert[i].co);
     mul_m4_v3(ob_eval->obmat, transformed_co);
-    for (int j = 0; j < 3; j++) {
-      data_to_export->vertices[i].co[j] = transformed_co[j];
-      me_eval->mvert[i].co[j] = transformed_co[j];
-    }
+    copy_v3_v3(data_to_export->mvert[i].co, transformed_co);
   }
-  float transformed_normals[3];
-  const MLoop *ml;
-  const MPoly *mp = me_eval->mpoly;
+}
+
+/**
+ * Store the mesh vertex normals in data_to_export, in world coordinates.
+ */
+static void get_transformed_vertex_normals(Mesh *me_eval, OBJ_data_to_export *data_to_export)
+{
+  float transformed_normal[3];
+  const MLoop *mloop;
+  const MPoly *mpoly = me_eval->mpoly;
   const MVert *mvert = me_eval->mvert;
-  struct faces empty_face;
 
-  data_to_export->tot_faces = me_eval->totpoly;
-  for (int i = 0; i < me_eval->totpoly; i++, mp++) {
-    data_to_export->normals.push_back(std::array<float, 3>());
-    data_to_export->faces_list.push_back(empty_face);
+  for (uint i = 0; i < me_eval->totpoly; i++, mpoly++) {
+    mloop = &me_eval->mloop[mpoly->loopstart];
+    BKE_mesh_calc_poly_normal(mpoly, mloop, mvert, transformed_normal);
+    normal_float_to_short_v3(data_to_export->mvert[i].no, transformed_normal);
+  }
+}
+
+/**
+ * Store a polygon's vertex indices and normal indices, indexing into the pre-defined
+ * vertex coordinates and vertex normals list.
+ */
+static void get_polygon_vert_indices(Mesh *me_eval, OBJ_data_to_export *data_to_export)
+{
+  const MLoop *mloop;
+  const MPoly *mpoly = me_eval->mpoly;
 
-    ml = &me_eval->mloop[mp->loopstart];
-    BKE_mesh_calc_poly_normal(mp, ml, mvert, transformed_normals);
+  data_to_export->tot_faces = me_eval->totpoly;
+  data_to_export->polygon_list.increase_size_unchecked(me_eval->totpoly);
 
-    for (int j = 0; j < 3; j++) {
-      data_to_export->normals[i][j] = transformed_normals[j];
-    }
+  for (uint i = 0; i < me_eval->totpoly; i++, mpoly++) {
+    mloop = &me_eval->mloop[mpoly->loopstart];
+    data_to_export->polygon_list[i].total_vertices_per_poly = mpoly->totloop;
 
-    data_to_export->faces_list[i].total_vertices_per_face = mp->totloop;
-    for (int j = 0; j < mp->totloop; j++) {
-      data_to_export->faces_list[i].vertex_references.push_back((ml + j)->v + 1);
-      data_to_export->faces_list[i].vertex_normal_references.push_back(i + 1);
+    for (int j = 0; j < mpoly->totloop; j++) {
+      data_to_export->polygon_list[i].vertex_index.append((mloop + j)->v + 1);
+      data_to_export->polygon_list[i].face_normal_index.append(i + 1);
     }
   }
 }
 
-bool exporter_main(bContext *C, OBJExportParams *export_params)
+static void get_geometry_per_object(const OBJExportParams *export_params,
+                                    OBJ_data_to_export *data_to_export)
 {
+  Depsgraph *depsgraph = data_to_export->depsgraph;
+  Object *ob = CTX_data_active_object(data_to_export->C);
+  Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
+  Mesh *me_eval = BKE_object_get_evaluated_mesh(ob_eval);
 
-  const char *filepath = export_params->filepath;
+  get_transformed_mesh_vertices(me_eval, ob_eval, data_to_export);
+  get_transformed_vertex_normals(me_eval, data_to_export);
+  get_polygon_vert_indices(me_eval, data_to_export);
+}
 
-  export_params->C = C;
-  export_params->depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
-  export_params->scene = CTX_data_scene(C);
+/**
+ * Central internal function to call data preparation & writer functions.
+ * Recieves export_settings from obj.cc.
+ */
+void exporter_main(bContext *C, const OBJExportParams *export_params)
+{
+  const char *filepath = export_params->filepath;
   struct OBJ_data_to_export data_to_export;
+  data_to_export.C = C;
+  data_to_export.depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
+
+  get_geometry_per_object(export_params, &data_to_export);
 
-  prepare_vertices(export_params, &data_to_export);
-  write_prepared_data(filepath, &data_to_export);
-  return true;
+  IO::OBJ::write_obj_data(filepath, &data_to_export);
+  MEM_freeN(data_to_export.mvert);
 }
+}  // namespace OBJ
+}  // namespace IO
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.cc
index 72c67d8eb7b..50e11c3bd9a 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.cc
@@ -21,36 +21,47 @@
  * \ingroup obj
  */
 
-#include <array>
 #include <fstream>
 #include <iostream>
-#include <stdio.h>
-#include <vector>
 
+#include "wavefront_obj.hh"
 #include "wavefront_obj_file_handler.hh"
 
-#include "DNA_meshdata_types.h"
-
-void write_prepared_data(const char *filepath, OBJ_data_to_export *data_to_export)
+namespace IO {
+namespac

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list