[Bf-blender-cvs] [242df25b288] soc-2020-io-performance: Fix same group name being duplicated.

Ankit Meel noreply at git.blender.org
Wed Jul 1 18:04:37 CEST 2020


Commit: 242df25b288ffdd77792f70242aa6e949e1b1cff
Author: Ankit Meel
Date:   Wed Jul 1 20:18:36 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rB242df25b288ffdd77792f70242aa6e949e1b1cff

Fix same group name being duplicated.

Prefix `r_` to values being modified in other functions.

Reorder arguments in vertex group and material functions for
consistency.

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

M	source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.cc
M	source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.hh
M	source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.cc
M	source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.hh

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

diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.cc
index c378bb360ad..5e0ba7a729d 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter_mesh.cc
@@ -270,7 +270,7 @@ void OBJMesh::calc_poly_normal_indices(Vector<uint> &r_normal_indices, uint poly
  * If there's a tie between two or more vertices, group name depends on the implementation
  * of max_element.
  */
-const char *OBJMesh::get_object_deform_vert(const MPoly &mpoly)
+const char *OBJMesh::get_object_deform_vert(const MPoly &mpoly, short &r_last_vertex_group)
 {
   const MLoop *mloop = &_export_mesh_eval->mloop[mpoly.loopstart];
   /* Indices index into deform groups; values are the number of vertices in one deform group. */
@@ -293,12 +293,24 @@ const char *OBJMesh::get_object_deform_vert(const MPoly &mpoly)
     }
   }
   if (!found_group) {
+    if (r_last_vertex_group == -1) {
+      /* "off" has already been written and this face also belongs to no vertex group. */
+      return nullptr;
+    }
+    r_last_vertex_group = -1;
     return "off";
   }
   /* Index to the group with maximum vertices. */
-  int max_idx = *std::max_element(deform_group_indices.begin(), deform_group_indices.end());
-  bDeformGroup *vertex_group = (bDeformGroup *)BLI_findlink(
-      (ListBase *)(&_export_object_eval->defbase), deform_group_indices[max_idx]);
+  int max_idx = std::max_element(deform_group_indices.begin(), deform_group_indices.end()) -
+                deform_group_indices.begin();
+  if (max_idx == r_last_vertex_group) {
+    /* No need to update the name, since it won't be printed. */
+    return nullptr;
+  }
+  r_last_vertex_group = max_idx;
+  const bDeformGroup *vertex_group = (bDeformGroup *)BLI_findlink(
+      (ListBase *)(&_export_object_eval->defbase), max_idx);
+
   return vertex_group->name;
 }
 
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 a7c99c846f4..c3ba1d08c36 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
@@ -94,7 +94,7 @@ class OBJMesh : NonMovable, NonCopyable {
    * If there's a tie between two or more vertices, group name depends on the implementation
    * of max_element.
    */
-  const char *get_object_deform_vert(const MPoly &mpoly);
+  const char *get_object_deform_vert(const MPoly &mpoly, short &r_last_vertex_group);
 
   /* Names as they appear in the outliner. */
   const char *get_object_name();
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 de385631944..46f3d869417 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
@@ -182,14 +182,17 @@ void OBJWriter::write_poly_normals(OBJMesh &obj_mesh_data)
  * Write material name and material group of a face in the OBJ file.
  * \note It doesn't write to the material library.
  */
-void OBJWriter::write_poly_material(short &last_face_mat_nr, OBJMesh &obj_mesh_data, short mat_nr)
+void OBJWriter::write_poly_material(OBJMesh &obj_mesh_data,
+                                    short &r_last_face_mat_nr,
+                                    const MPoly &mpoly)
 {
   if (!_export_params->export_materials || obj_mesh_data.tot_col() <= 0) {
     return;
   }
+  short mat_nr = mpoly.mat_nr;
   /* Whenever a face with a new material is encountered, write its material and group, otherwise
    * pass. */
-  if (UNLIKELY(last_face_mat_nr != mat_nr)) {
+  if (UNLIKELY(r_last_face_mat_nr != mat_nr)) {
     const char *mat_name;
     mat_name = obj_mesh_data.get_object_material_name(mat_nr + 1);
     if (_export_params->export_material_groups) {
@@ -200,19 +203,26 @@ void OBJWriter::write_poly_material(short &last_face_mat_nr, OBJMesh &obj_mesh_d
       fprintf(_outfile, "g %s_%s_%s\n", object_name, object_data_name, mat_name);
     }
     fprintf(_outfile, "usemtl %s\n", mat_name);
-    last_face_mat_nr = mat_nr;
+    r_last_face_mat_nr = mat_nr;
   }
 }
 
 /**
  * Write the deform vertex group name to which maximum number of vertices of a face belong.
  */
-void OBJWriter::write_vertex_group(OBJMesh &obj_mesh_data, const MPoly &mpoly)
+void OBJWriter::write_vertex_group(OBJMesh &obj_mesh_data,
+                                   short &last_face_vertex_group,
+                                   const MPoly &mpoly)
 {
   if (!_export_params->export_vertex_groups) {
     return;
   }
-  const char *def_group_name = obj_mesh_data.get_object_deform_vert(mpoly);
+  const char *def_group_name = obj_mesh_data.get_object_deform_vert(mpoly, last_face_vertex_group);
+  if (!def_group_name) {
+    /* Don't write the name of the group again. If set once, the group name changes only when a new
+     * one is encountered. */
+    return;
+  }
   fprintf(_outfile, "g %s\n", def_group_name);
 }
 
@@ -226,7 +236,10 @@ void OBJWriter::write_poly_indices(OBJMesh &obj_mesh_data, Span<Vector<uint>> uv
   Vector<uint> vertex_indices;
   Vector<uint> normal_indices;
 
+  /* -1 has no significant value, it could be any negative number. */
   short last_face_mat_nr = -1;
+  /* We use -1 for a face having no vertex group. */
+  short last_face_vertex_group = -2;
 
   if (_export_params->export_normals) {
     if (_export_params->export_uv && (obj_mesh_data.tot_uv_vertices() > 0)) {
@@ -236,8 +249,8 @@ void OBJWriter::write_poly_indices(OBJMesh &obj_mesh_data, Span<Vector<uint>> uv
         obj_mesh_data.calc_poly_normal_indices(normal_indices, i);
         const MPoly &poly_to_write = obj_mesh_data.get_ith_poly(i);
 
-        write_vertex_group(obj_mesh_data, poly_to_write);
-        write_poly_material(last_face_mat_nr, obj_mesh_data, poly_to_write.mat_nr);
+        write_vertex_group(obj_mesh_data, last_face_vertex_group, poly_to_write);
+        write_poly_material(obj_mesh_data, last_face_mat_nr, poly_to_write);
         write_vert_uv_normal_indices(vertex_indices, uv_indices[i], normal_indices, poly_to_write);
       }
     }
@@ -248,8 +261,8 @@ void OBJWriter::write_poly_indices(OBJMesh &obj_mesh_data, Span<Vector<uint>> uv
         obj_mesh_data.calc_poly_normal_indices(normal_indices, i);
         const MPoly &poly_to_write = obj_mesh_data.get_ith_poly(i);
 
-        write_vertex_group(obj_mesh_data, poly_to_write);
-        write_poly_material(last_face_mat_nr, obj_mesh_data, poly_to_write.mat_nr);
+        write_vertex_group(obj_mesh_data, last_face_vertex_group, poly_to_write);
+        write_poly_material(obj_mesh_data, last_face_mat_nr, poly_to_write);
         write_vert_normal_indices(vertex_indices, normal_indices, poly_to_write);
       }
     }
@@ -261,8 +274,8 @@ void OBJWriter::write_poly_indices(OBJMesh &obj_mesh_data, Span<Vector<uint>> uv
         obj_mesh_data.calc_poly_vertex_indices(vertex_indices, i);
         const MPoly &poly_to_write = obj_mesh_data.get_ith_poly(i);
 
-        write_vertex_group(obj_mesh_data, poly_to_write);
-        write_poly_material(last_face_mat_nr, obj_mesh_data, poly_to_write.mat_nr);
+        write_vertex_group(obj_mesh_data, last_face_vertex_group, poly_to_write);
+        write_poly_material(obj_mesh_data, last_face_mat_nr, poly_to_write);
         write_vert_uv_indices(vertex_indices, uv_indices[i], poly_to_write);
       }
     }
@@ -272,8 +285,8 @@ void OBJWriter::write_poly_indices(OBJMesh &obj_mesh_data, Span<Vector<uint>> uv
         obj_mesh_data.calc_poly_vertex_indices(vertex_indices, i);
         const MPoly &poly_to_write = obj_mesh_data.get_ith_poly(i);
 
-        write_vertex_group(obj_mesh_data, poly_to_write);
-        write_poly_material(last_face_mat_nr, obj_mesh_data, poly_to_write.mat_nr);
+        write_vertex_group(obj_mesh_data, last_face_vertex_group, poly_to_write);
+        write_poly_material(obj_mesh_data, last_face_mat_nr, poly_to_write);
         write_vert_indices(vertex_indices, poly_to_write);
       }
     }
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.hh
index e1978aca433..02983ca0a56 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_file_handler.hh
@@ -74,11 +74,13 @@ class OBJWriter {
   /** Write material name and material group of a face in the OBJ file.
    * \note It doesn't write to the material library, MTL file.
    */
-  void write_poly_material(short &last_face_mat_nr, OBJMesh &obj_mesh_data, short mat_nr);
+  void write_poly_material(OBJMesh &obj_mesh_data, short &r_last_face_mat_nr, const MPoly &mpoly);
   /**
    * Write the deform vertex group name to which maximum number of vertices of a face belong.
    */
-  void write_vertex_group(OBJMesh &obj_mesh_data, const MPoly &mpoly);
+  void write_vertex_group(OBJMesh &obj_mesh_data,
+                          short &r_last_face_vertex_group,
+                          const MPoly &mpoly);
   /** Define and write a face with at least vertex indices, and conditionally with UV vertex
    * indices and face normal indices. \note UV indices are stored while writing UV vertices.
    */



More information about the Bf-blender-cvs mailing list