[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